From bdf69b0d0c7aafb021c64140bc619d276a5f83d4 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 19 Dec 2013 11:38:05 -0800 Subject: [PATCH 0001/1838] Initial commit --- .gitignore | 17 + AspNetAbstractions.sln | 52 +++ Sakefile.shade | 66 +++ build.cmd | 12 + build.sh | 6 + .../HttpContextBase.cs | 10 + .../HttpRequestBase.cs | 18 + .../HttpResponseBase.cs | 13 + src/Microsoft.AspNet.Abstractions/IBuilder.cs | 15 + .../Microsoft.AspNet.Abstractions.csproj | 57 +++ .../Microsoft.AspNet.Abstractions.nuspec | 22 + .../PathString.cs | 232 +++++++++++ .../Properties/AssemblyInfo.cs | 36 ++ .../QueryString.cs | 142 +++++++ .../RequestDelegate.cs | 6 + .../FeatureContainer.cs | 86 ++++ .../IFeatureContainer.cs | 13 + .../Implementation/Converter.cs | 384 ++++++++++++++++++ .../Microsoft.AspNet.FeatureModel.csproj | 54 +++ .../Microsoft.AspNet.FeatureModel.nuspec | 22 + .../ObjectFeatureContainer.cs | 50 +++ .../Properties/AssemblyInfo.cs | 36 ++ .../HttpEnvironmentBase.cs | 8 + .../HttpEnvironmentExtensions.cs | 10 + .../IHttpEnvironment.cs | 8 + .../Microsoft.AspNet.HttpEnvironment.csproj | 59 +++ .../Microsoft.AspNet.HttpEnvironment.nuspec | 22 + .../Properties/AssemblyInfo.cs | 36 ++ .../IHttpApplicationInformation.cs | 14 + .../IHttpBuffering.cs | 8 + .../IHttpConnection.cs | 13 + .../IHttpRequest.cs | 19 + .../IHttpResponse.cs | 15 + .../IHttpSendFile.cs | 10 + .../IHttpTransportLayerSecurity.cs | 11 + .../IHttpWebSocketAccept.cs | 11 + .../Microsoft.AspNet.HttpFeature.csproj | 64 +++ .../Microsoft.AspNet.HttpFeature.nuspec | 22 + .../Properties/AssemblyInfo.cs | 36 ++ .../Security/IAuthenticationChallenge.cs | 10 + .../Security/IAuthenticationDescription.cs | 9 + .../Security/IAuthenticationResult.cs | 12 + .../Security/IAuthenticationSignIn.cs | 11 + .../Security/IAuthenticationSignOut.cs | 9 + .../Security/IHttpAuthentication.cs | 18 + .../BuilderTests.cs | 24 ++ ...Microsoft.AspNet.PipelineCore.Tests.csproj | 79 ++++ .../Properties/AssemblyInfo.cs | 36 ++ .../packages.config | 6 + src/Microsoft.AspNet.PipelineCore/Builder.cs | 93 +++++ .../HttpContext.cs | 44 ++ .../HttpRequest.cs | 74 ++++ .../HttpResponse.cs | 43 ++ .../Microsoft.AspNet.PipelineCore.csproj | 75 ++++ .../Microsoft.AspNet.PipelineCore.nuspec | 22 + .../Owin/OwinConstants.cs | 174 ++++++++ .../Owin/OwinHttpEnvironment.cs | 167 ++++++++ .../Properties/AssemblyInfo.cs | 36 ++ 58 files changed, 2657 insertions(+) create mode 100644 .gitignore create mode 100644 AspNetAbstractions.sln create mode 100644 Sakefile.shade create mode 100644 build.cmd create mode 100644 build.sh create mode 100644 src/Microsoft.AspNet.Abstractions/HttpContextBase.cs create mode 100644 src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs create mode 100644 src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IBuilder.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec create mode 100644 src/Microsoft.AspNet.Abstractions/PathString.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Abstractions/QueryString.cs create mode 100644 src/Microsoft.AspNet.Abstractions/RequestDelegate.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec create mode 100644 src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec create mode 100644 src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.PipelineCore.Tests/packages.config create mode 100644 src/Microsoft.AspNet.PipelineCore/Builder.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/HttpContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/HttpRequest.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/HttpResponse.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec create mode 100644 src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..5dc98f5c69 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +bin +obj +*.suo +*.user +_ReSharper.* +*.DS_Store +*.userprefs +*.pidb +*.vspx +*.psess +packages +target +artifacts +StyleCop.Cache +node_modules +*.snk +.nuget/NuGet.exe diff --git a/AspNetAbstractions.sln b/AspNetAbstractions.sln new file mode 100644 index 0000000000..2e07b4f2cb --- /dev/null +++ b/AspNetAbstractions.sln @@ -0,0 +1,52 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.csproj", "{4E1520B1-01F4-481B-96A2-24067EAA52FA}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.csproj", "{A780873E-09F9-4E44-AE06-AF00C4E88E1E}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpEnvironment", "src\Microsoft.AspNet.HttpEnvironment\Microsoft.AspNet.HttpEnvironment.csproj", "{46D69EC9-7096-49D8-A184-A9BB5B2419A1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.csproj", "{42309978-0661-41D8-8654-39453265C5F9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.csproj", "{A4D3E280-8838-4614-9B99-4874C3CBDF82}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "src\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.Build.0 = Release|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.Build.0 = Release|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.Build.0 = Release|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.Build.0 = Release|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.Build.0 = Release|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Sakefile.shade b/Sakefile.shade new file mode 100644 index 0000000000..56c6a45839 --- /dev/null +++ b/Sakefile.shade @@ -0,0 +1,66 @@ + +var PROJECT='AspNetAbstractions' +var VERSION='0.1.0' +var FULL_VERSION='${VERSION}' +var AUTHORS='${PROJECT} contributors' + +var BASE_DIR='${Directory.GetCurrentDirectory()}' +var TARGET_DIR='${Path.Combine(BASE_DIR, "target")}' +var BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' +var TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' + +default SRC='.' +default BUILD_PROJECTS='${Files.Include(SRC+"/**/*.csproj")}' +default TEST_PROJECTS='${Files.Include(SRC+"/**/*.Tests.csproj")}' + +use namespace='System.Xml.Linq' + +-// include range of standard general targets. run "sake targets" to display +use-standard-lifecycle + +-// include sets of standard work targets. features include 'nuget,xunit,nunit' +use-standard-goals features='nuget,xunit' + +-// additional work targets are defined below + +#nuget-prepare target='package-prepare' description='Compile primary project' + for each='var projectFile in BUILD_PROJECTS.Except(TEST_PROJECTS)' + var outputDirName='${Path.GetFileNameWithoutExtension(projectFile)}' + + var outputDir='${Path.Combine(BUILD_DIR, outputDirName)}' + + copy sourceDir='${Path.GetDirectoryName(projectFile)}' include='*.nuspec' overwrite='${true}' + + var doc='${XDocument.Load(projectFile)}' + var ns='http://schemas.microsoft.com/developer/msbuild/2003' + var itemGroups='${doc.Elements(XName.Get("Project", ns)).Elements(XName.Get("ItemGroup", ns))}' + var compileItems='${itemGroups.Elements(XName.Get("Compile", ns))}' + var contentItems='${itemGroups.Elements(XName.Get("Content", ns))}' + var noneItems='${itemGroups.Elements(XName.Get("None", ns))}' + var razorItems='${contentItems.Union(noneItems).Where(x=>x.Attribute("Include").Value.EndsWith(".cshtml"))}' + + for each='var compileElt in compileItems.Union(razorItems)' + var linkElt='${compileElt.Elements(XName.Get("Link", ns)).SingleOrDefault()}' + + var sourceFile='${compileElt.Attribute("Include").Value}' + var targetFile='${linkElt == null ? sourceFile : linkElt.Value}' + + var sourceFull='${Path.Combine(Path.GetDirectoryName(projectFile), sourceFile)}' + var targetFull='${Path.Combine(outputDir, "src", targetFile)}' + directory create='${Path.GetDirectoryName(targetFull)}' + -File.Copy(sourceFull, targetFull, true); + +#nuget-package target='package' description='Create NuGet packages' + for each='var file in Files.Include(BUILD_DIR + "/**/*.nuspec")' + var baseName='${Path.GetFileNameWithoutExtension(file)}' + var nugetProperties='${new Dictionary { + {"id", baseName}, + {"authors", AUTHORS}, + {"title", baseName}, + {"description", baseName}, + {"licenseUrl", "about:blank"}, + {"projectUrl", "about:blank"}, + {"tags", "Katana"}, + }}' + var props='${string.Join(";", nugetProperties.Select(kv=>kv.Key+"="+kv.Value).ToArray())}' + nuget-pack nuspecFile='${file}' packageVersion='${FULL_VERSION}' outputDir='${TARGET_DIR}' extra='-NoPackageAnalysis -Properties "${props}"' diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000000..65dfe408fd --- /dev/null +++ b/build.cmd @@ -0,0 +1,12 @@ +@echo off +cd %~dp0 + +IF EXIST .nuget\NuGet.exe goto part2 +echo Downloading latest version of NuGet.exe... +mkdir .nuget +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "((new-object net.webclient).DownloadFile('https://nuget.org/nuget.exe', '.nuget\NuGet.exe'))" + +:part2 +set EnableNuGetPackageRestore=true +.nuget\NuGet.exe install Sake -version 0.2 -o packages +packages\Sake.0.2\tools\Sake.exe -I build -f Sakefile.shade %* diff --git a/build.sh b/build.sh new file mode 100644 index 0000000000..8a58a5e2a9 --- /dev/null +++ b/build.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +export EnableNuGetPackageRestore=true +mono --runtime=v4.0 ".nuget/NuGet.exe" install Sake -pre -o packages +mono $(find packages/Sake.*/tools/Sake.exe|sort -r|head -n1) -f Sakefile.shade -I src/build "$@" + diff --git a/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs b/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs new file mode 100644 index 0000000000..e1ceb30048 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpContextBase + { + // TODO - review IOwinContext for properties + + public abstract HttpRequestBase Request { get; } + public abstract HttpResponseBase Response { get; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs b/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs new file mode 100644 index 0000000000..face559bdb --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs @@ -0,0 +1,18 @@ +using System; +using System.IO; + +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpRequestBase + { + // TODO - review IOwinRequest for properties + + public abstract HttpContextBase HttpContext { get; } + + public abstract Uri Uri { get; } + public abstract PathString PathBase { get; set; } + public abstract PathString Path { get; set; } + public abstract QueryString QueryString { get; set; } + public abstract Stream Body { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs b/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs new file mode 100644 index 0000000000..518ea0355c --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs @@ -0,0 +1,13 @@ +using System.IO; + +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpResponseBase + { + // TODO - review IOwinResponse for completeness + + public abstract HttpContextBase HttpContext { get; } + public abstract int StatusCode { get; set; } + public abstract Stream Body { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs new file mode 100644 index 0000000000..9016434cc3 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -0,0 +1,15 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + public interface IBuilder + { + IBuilder Use(object middleware, params object[] args); + + IBuilder New(); + RequestDelegate Build(); + + object GetFeature(Type type); + void SetFeature(Type type, object feature); + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj new file mode 100644 index 0000000000..4f5b7f0b33 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj @@ -0,0 +1,57 @@ + + + + + Debug + AnyCPU + {4E1520B1-01F4-481B-96A2-24067EAA52FA} + Library + Properties + Microsoft.AspNet.Abstractions + Microsoft.AspNet.Abstractions + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.Abstractions.XML + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs new file mode 100644 index 0000000000..8cfab5912d --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -0,0 +1,232 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Linq; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string + /// + public struct PathString : IEquatable + { + /// + /// Represents the empty path. This field is read-only. + /// + public static readonly PathString Empty = new PathString(String.Empty); + + private readonly string _value; + + /// + /// Initalize the path string with a given value. This value must be in unescaped format. Use + /// PathString.FromUriComponent(value) if you have a path value which is in an escaped format. + /// + /// The unescaped path to be assigned to the Value property. + public PathString(string value) + { + if (!String.IsNullOrEmpty(value) && value[0] != '/') + { + throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, "value"); + } + _value = value; + } + + /// + /// The unescaped path value + /// + public string Value + { + get { return _value; } + } + + /// + /// True if the path is not empty + /// + public bool HasValue + { + get { return !String.IsNullOrEmpty(_value); } + } + + /// + /// Provides the path string escaped in a way which is correct for combining into the URI representation. + /// + /// The escaped path value + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Provides the path string escaped in a way which is correct for combining into the URI representation. + /// + /// The escaped path value + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] + public string ToUriComponent() + { + // TODO: Measure the cost of this escaping and consider optimizing. + return HasValue ? String.Join("/", _value.Split('/').Select(Uri.EscapeDataString)) : String.Empty; + } + + /// + /// Returns an PathString given the path as it is escaped in the URI format. The string MUST NOT contain any + /// value that is not a path. + /// + /// The escaped path as it appears in the URI format. + /// The resulting PathString + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with Uri processing")] + public static PathString FromUriComponent(string uriComponent) + { + // REVIEW: what is the exactly correct thing to do? + return new PathString(Uri.UnescapeDataString(uriComponent)); + } + + /// + /// Returns an PathString given the path as from a Uri object. Relative Uri objects are not supported. + /// + /// The Uri object + /// The resulting PathString + public static PathString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + // REVIEW: what is the exactly correct thing to do? + return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); + } + + public bool StartsWithSegments(PathString other) + { + string value1 = Value ?? String.Empty; + string value2 = other.Value ?? String.Empty; + if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + { + return value1.Length == value2.Length || value1[value2.Length] == '/'; + } + return false; + } + + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] + public bool StartsWithSegments(PathString other, out PathString remaining) + { + string value1 = Value ?? String.Empty; + string value2 = other.Value ?? String.Empty; + if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + { + if (value1.Length == value2.Length || value1[value2.Length] == '/') + { + remaining = new PathString(value1.Substring(value2.Length)); + return true; + } + } + remaining = Empty; + return false; + } + + /// + /// Adds two PathString instances into a combined PathString value. + /// + /// The combined PathString value + public PathString Add(PathString other) + { + return new PathString(Value + other.Value); + } + + /// + /// Combines a PathString and QueryString into the joined URI formatted string value. + /// + /// The joined URI formatted string value + public string Add(QueryString other) + { + return ToUriComponent() + other.ToUriComponent(); + } + + /// + /// Compares this PathString value to another value. The default comparison is StringComparison.OrdinalIgnoreCase. + /// + /// The second PathString for comparison. + /// True if both PathString values are equal + public bool Equals(PathString other) + { + return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Compares this PathString value to another value using a specific StringComparison type + /// + /// The second PathString for comparison + /// The StringComparison type to use + /// True if both PathString values are equal + public bool Equals(PathString other, StringComparison comparisonType) + { + return string.Equals(_value, other._value, comparisonType); + } + + /// + /// Compares this PathString value to another value. The default comparison is StringComparison.OrdinalIgnoreCase. + /// + /// The second PathString for comparison. + /// True if both PathString values are equal + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is PathString && Equals((PathString)obj, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Returns the hash code for the PathString value. The hash code is provided by the OrdinalIgnoreCase implementation. + /// + /// The hash code + public override int GetHashCode() + { + return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + } + + /// + /// Operator call through to Equals + /// + /// The left parameter + /// The right parameter + /// True if both PathString values are equal + public static bool operator ==(PathString left, PathString right) + { + return left.Equals(right, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Operator call through to Equals + /// + /// The left parameter + /// The right parameter + /// True if both PathString values are not equal + public static bool operator !=(PathString left, PathString right) + { + return !left.Equals(right, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Operator call through to Add + /// + /// The left parameter + /// The right parameter + /// The PathString combination of both values + public static PathString operator +(PathString left, PathString right) + { + return left.Add(right); + } + + /// + /// Operator call through to Add + /// + /// The left parameter + /// The right parameter + /// The PathString combination of both values + public static string operator +(PathString left, QueryString right) + { + return left.Add(right); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..906de25b7f --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.Abstractions")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("f67dab3e-89ef-4d28-a57e-230af874bbe8")] + +// 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("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs new file mode 100644 index 0000000000..e80f5eedcf --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string + /// + public struct QueryString : IEquatable + { + /// + /// Represents the empty query string. This field is read-only. + /// + public static readonly QueryString Empty = new QueryString(String.Empty); + + private readonly string _value; + + /// + /// Initalize the query string with a given value. This value must be in escaped and delimited format without + /// a leading '?' character. + /// + /// The query string to be assigned to the Value property. + public QueryString(string value) + { + _value = value; + } + + /// + /// Initialize a query string with a single given parameter name and value. The value is + /// + /// The unencoded parameter name + /// The unencoded parameter value + public QueryString(string name, string value) + { + _value = Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); + } + + /// + /// The unescaped query string without the leading '?' character + /// + public string Value + { + get { return _value; } + } + + /// + /// True if the query string is not empty + /// + public bool HasValue + { + get { return !String.IsNullOrWhiteSpace(_value); } + } + + /// + /// Provides the query string escaped in a way which is correct for combining into the URI representation. + /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentally + /// dangerous are escaped. + /// + /// The query string value + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Provides the query string escaped in a way which is correct for combining into the URI representation. + /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentially + /// dangerous are escaped. + /// + /// The query string value + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] + public string ToUriComponent() + { + // Escape things properly so System.Uri doesn't mis-interpret the data. + return HasValue ? "?" + _value.Replace("#", "%23") : String.Empty; + } + + /// + /// Returns an QueryString given the query as it is escaped in the URI format. The string MUST NOT contain any + /// value that is not a query. + /// + /// The escaped query as it appears in the URI format. + /// The resulting QueryString + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Delimiter characters ? and # must be escaped by this method instead of truncating the value")] + public static QueryString FromUriComponent(string uriComponent) + { + if (String.IsNullOrEmpty(uriComponent)) + { + return new QueryString(string.Empty); + } + if (uriComponent[0] != '?') + { + throw new ArgumentException(""/*Resources.Exception_QueryStringMustStartWithDelimiter*/, "uriComponent"); + } + return new QueryString(uriComponent.Substring(1)); + } + + /// + /// Returns an QueryString given the query as from a Uri object. Relative Uri objects are not supported. + /// + /// The Uri object + /// The resulting QueryString + public static QueryString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + return new QueryString(uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped)); + } + + public bool Equals(QueryString other) + { + return string.Equals(_value, other._value); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is QueryString && Equals((QueryString)obj); + } + + public override int GetHashCode() + { + return (_value != null ? _value.GetHashCode() : 0); + } + + public static bool operator ==(QueryString left, QueryString right) + { + return left.Equals(right); + } + + public static bool operator !=(QueryString left, QueryString right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs new file mode 100644 index 0000000000..98b48bcf94 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs @@ -0,0 +1,6 @@ +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions +{ + public delegate Task RequestDelegate(HttpContextBase context); +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs new file mode 100644 index 0000000000..1b7949658a --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs @@ -0,0 +1,86 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class FeatureContainer : IFeatureContainer + { + private readonly IFeatureContainer _defaultFeatures; + private readonly IDictionary _featureByFeatureType = new Dictionary(); + private readonly IDictionary _featureTypeByName = new Dictionary(); + private readonly object _containerSync = new Object(); + private int _containerRevision; + + public FeatureContainer() + { + } + + public FeatureContainer(IFeatureContainer defaultFeatures) + { + _defaultFeatures = defaultFeatures; + } + + public virtual object GetFeature(Type type) + { + object feature; + if (_featureByFeatureType.TryGetValue(type, out feature)) + { + return feature; + } + + Type actualType; + if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) + { + if (_featureByFeatureType.TryGetValue(actualType, out feature)) + { + return Converter.Convert(type, actualType, feature); + } + } + + return _defaultFeatures != null ? _defaultFeatures.GetFeature(type) : null; + } + + public virtual object GetDefaultFeature(Type type) + { + return null; + } + + public virtual void SetFeature(Type type, object feature) + { + lock (_containerSync) + { + Type priorFeatureType; + if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) + { + if (priorFeatureType == type) + { + _featureByFeatureType[type] = feature; + } + else + { + _featureTypeByName[type.FullName] = type; + _featureByFeatureType.Remove(priorFeatureType); + _featureByFeatureType.Add(type, feature); + } + } + else + { + _featureTypeByName.Add(type.FullName, type); + _featureByFeatureType.Add(type, feature); + } + Interlocked.Increment(ref _containerRevision); + } + } + + public virtual int Revision + { + get { return _containerRevision; } + } + + public void Dispose() + { + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs new file mode 100644 index 0000000000..52529983d0 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.FeatureModel +{ + public interface IFeatureContainer : IDisposable + { + object GetFeature(Type type); + void SetFeature(Type type, object feature); + //IEnumerable GetFeatureTypes(); + int Revision { get; } + } +} diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs new file mode 100644 index 0000000000..7f080ab884 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -0,0 +1,384 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using System.Reflection.Emit; +using System.Runtime.CompilerServices; + +namespace Microsoft.AspNet.FeatureModel.Implementation +{ + public abstract class NonGenericProxyBase + { + public readonly Type WrappedType; + protected NonGenericProxyBase(Type wrappedType) + { + this.WrappedType = wrappedType; + } + public abstract object UnderlyingInstanceAsObject + { + get; + } + } + + public class BaseType : NonGenericProxyBase where T : class + { + protected T instance; + public BaseType(T inst) + : base(typeof(T)) + { + if (inst == null) throw new InvalidOperationException("should never construct proxy over null"); + this.instance = inst; + } + public T UnderlyingInstance + { + get + { + return instance; + } + } + public override object UnderlyingInstanceAsObject + { + get + { + return instance; + } + } + } + + public class Converter + { + public static object Convert(Type outputType, Type inputType, object input) + { + if (inputType == outputType) return input; + + if (!inputType.IsInterface || !outputType.IsInterface) throw new InvalidOperationException("Both types must be interfaces"); + + if (inputType.GetInterfaces().Contains(outputType)) return input; + + if (input == null) return null; + + Type t = EnsureConverter(outputType, inputType); + + return Activator.CreateInstance(t, input); + } + + public static TOut Convert(Type inputType, object input) + where TOut : class + { + return (TOut)Convert(typeof (TOut), inputType, input); + } + + public static TOut Convert(TIn input) + where TIn : class + where TOut : class + { + return Convert(typeof(TIn), input); + } + + public static TOut Convert(object input) + where TOut : class + { + if (input == null) return null; + var interfaceName = typeof(TOut).FullName; + foreach (var inputType in input.GetType().GetInterfaces()) + { + if (inputType.FullName == interfaceName) + { + return Convert(inputType, input); + } + } + return null; + } + + + public static Type EnsureConverter(Type tout, Type tin) + { + CacheResult result; + if (!ConverterTypeCache.TryGetValue(new Tuple(tin, tout), out result)) + { + EnsureCastPossible(tout, tin); + return EnsureConverter(tout, tin); + } + else + { + if (result is ErrorResult) + { + throw new InvalidCastException((result as ErrorResult).error); + } + else if (result is CurrentlyVerifyingResult) + { + throw new InvalidOperationException("Type cannot be obtained in verification phase"); + } + else if (result is TypeBuilderResult) + { + return (result as TypeBuilderResult).result; + } + else if (result is VerificationSucceededResult) + { + return CreateWrapperType(tout, tin, result as VerificationSucceededResult); + } + else + { + throw new InvalidOperationException("Invalid cache state"); + } + } + } + + class CacheResult + { + } + + class TypeBuilderResult : CacheResult + { + internal TypeBuilderResult(Type result) + { + this.result = result; + } + internal readonly Type result; + } + class ErrorResult : CacheResult + { + internal ErrorResult(string error) + { + this.error = error; + } + internal readonly string error; + } + class CurrentlyVerifyingResult : CacheResult + { + } + enum SuccessKind + { + Identity, + SubInterface, + Wrapper, + } + class VerificationSucceededResult : CacheResult + { + internal VerificationSucceededResult(SuccessKind kind) + { + this.kind = kind; + } + internal VerificationSucceededResult(Dictionary mappings) + { + this.kind = SuccessKind.Wrapper; + this.methodMappings = mappings; + } + internal readonly SuccessKind kind; + internal readonly Dictionary methodMappings; + } + + static Dictionary, CacheResult> ConverterTypeCache = new Dictionary, CacheResult>(); + static ConditionalWeakTable ConverterInstanceCache = new ConditionalWeakTable(); + static AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("ProxyHolderAssembly"), AssemblyBuilderAccess.Run); + static ModuleBuilder modb = ab.DefineDynamicModule("Main Module"); + + class EqComparer : IEqualityComparer + { + + bool IEqualityComparer.Equals(ParameterInfo x, ParameterInfo y) + { + return EqualTypes(x.ParameterType, y.ParameterType); + } + + int IEqualityComparer.GetHashCode(ParameterInfo obj) + { + return obj.GetHashCode(); + } + } + + static bool EqualTypes(Type sourceType, Type targetType) + { + return EnsureCastPossible(targetType, sourceType); + } + + + + static MethodInfo FindCorrespondingMethod(Type targetType, Type sourceType, MethodInfo miTarget) + { + MethodInfo[] sms = sourceType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where((MethodInfo mi) => mi.Name == miTarget.Name).ToArray(); + if (sms != null && sms.Length != 0) + { + MethodInfo[] sm = null; + try + { + sm = sms.Where((mi) => (mi.GetParameters().SequenceEqual(miTarget.GetParameters(), new EqComparer()))).ToArray(); + } + catch + { + } + if (sm != null && sm.Length != 0) + { + if (sm.Length > 1) return null; + if (EqualTypes(sm[0].ReturnType, miTarget.ReturnType)) + { + return sm[0]; + } + } + } + MethodInfo[] rval = sourceType.GetInterfaces().Select((inheritedItf) => FindCorrespondingMethod(targetType, inheritedItf, miTarget)).ToArray(); + if (rval == null || rval.Length == 0) return null; + if (rval.Length > 1) return null; + return rval[0]; + + } + + + static void AddMethod(Type targetType, Type sourceType, TypeBuilder tb, MethodInfo miTarget, MethodInfo miSource) + { + ParameterInfo[] pisTarget = miTarget.GetParameters(); + ParameterInfo[] pisSource = miSource.GetParameters(); + MethodBuilder metb; + Type[] typesTarget; + if (pisTarget == null || pisTarget.Length == 0) + { + metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null); + pisTarget = new ParameterInfo[0]; + typesTarget = new Type[0]; + } + else + { + typesTarget = pisTarget.Select((pi) => pi.ParameterType).ToArray(); + Type[][] requiredCustomMods = pisTarget.Select((pi) => pi.GetRequiredCustomModifiers()).ToArray(); + Type[][] optionalCustomMods = pisTarget.Select((pi) => pi.GetOptionalCustomModifiers()).ToArray(); + + metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null, null, typesTarget, requiredCustomMods, optionalCustomMods); + } + + ILGenerator il = metb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldfld, tb.BaseType.GetField("instance", BindingFlags.NonPublic | BindingFlags.Instance)); + for (int pi = 0; pi < pisTarget.Length; pi++) + { + il.Emit(OpCodes.Ldarg, pi + 1); + EmitParamConversion(il, typesTarget[pi], pisSource[pi].ParameterType); + } + il.EmitCall(OpCodes.Callvirt, miSource, null); + + EmitParamConversion(il, miSource.ReturnType, miTarget.ReturnType); + il.Emit(OpCodes.Ret); + + tb.DefineMethodOverride(metb, miTarget); + } + + static void EmitParamConversion(ILGenerator il, Type typeOnStack, Type typeRequiredInSignature) + { + if (typeOnStack != typeRequiredInSignature) + { + if (typeOnStack.GetInterfaces().Contains(typeRequiredInSignature)) + { + il.Emit(OpCodes.Castclass, typeRequiredInSignature); + } + else + { + Label lEnd = il.DefineLabel(); + Label lCreateProxy = il.DefineLabel(); + il.Emit(OpCodes.Dup); // o o + il.Emit(OpCodes.Brfalse_S, lEnd); // o + il.Emit(OpCodes.Dup); // o o + il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // o [p/n] + il.Emit(OpCodes.Brfalse_S, lCreateProxy); // o + il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // p + il.EmitCall(OpCodes.Callvirt, typeof(NonGenericProxyBase).GetMethod("get_UnderlyingInstanceAsObject"), null); // uo + il.Emit(OpCodes.Dup); // uo uo + il.Emit(OpCodes.Isinst, typeRequiredInSignature); // uo [ro/n] + il.Emit(OpCodes.Brtrue_S, lEnd); // uo + il.MarkLabel(lCreateProxy); // uo + Type paramProxyType = EnsureConverter(typeRequiredInSignature, typeOnStack); + il.Emit(OpCodes.Newobj, paramProxyType.GetConstructors()[0]); + il.MarkLabel(lEnd); // ro + } + } + } + + + + static bool EnsureCastPossible(Type targetType, Type sourceType) + { + var key = new Tuple(sourceType, targetType); + CacheResult cr = null; + if (ConverterTypeCache.TryGetValue(key, out cr)) + { + if (cr is CurrentlyVerifyingResult || cr is VerificationSucceededResult || cr is TypeBuilderResult) return true; + if (cr is ErrorResult) return false; + } + if (targetType == sourceType) + { + ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.Identity); + return true; + } + if (targetType.GetInterfaces().Contains(sourceType)) + { + ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.SubInterface); + return true; + } + if (!targetType.IsInterface || !sourceType.IsInterface) + { + ConverterTypeCache[key] = new ErrorResult("Cannot cast " + sourceType + " to " + targetType); + return false; + } + bool success = false; + ConverterTypeCache[key] = new CurrentlyVerifyingResult(); + try + { + Dictionary mappings = new Dictionary(); + foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) + { + MethodInfo mapping = FindCorrespondingMethod(targetType, sourceType, mi); + if (mapping == null) + { + ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType + " because of missing method: " + mi.Name); + return false; + } + mappings[mi] = mapping; + } + ConverterTypeCache[key] = new VerificationSucceededResult(mappings); + success = true; + return true; + } + finally + { + if (!success) + { + if (!(ConverterTypeCache[key] is ErrorResult)) + { + ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType); + } + } + } + } + + static int counter = 0; + static Type CreateWrapperType(Type targetType, Type sourceType, VerificationSucceededResult result) + { + Dictionary mappings = result.methodMappings; + Type baseType = Assembly.GetExecutingAssembly().GetType("InterfaceMapper.BaseType`1").MakeGenericType(sourceType); + TypeBuilder tb = modb.DefineType("ProxyType" + counter++ + " wrapping:" + sourceType.Name + " to look like:" + targetType.Name, TypeAttributes.Class, baseType, new Type[] { targetType }); + ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { sourceType }); + ILGenerator il = cb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Castclass, sourceType); + il.Emit(OpCodes.Call, baseType.GetConstructor(new Type[] { sourceType })); + il.Emit(OpCodes.Ret); + var tuple = new Tuple(sourceType, targetType); + try + { + ConverterTypeCache[tuple] = new TypeBuilderResult(tb); + foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) + { + AddMethod(targetType, sourceType, tb, mi, mappings[mi]); + } + Type t = tb.CreateType(); + ConverterTypeCache[tuple] = new TypeBuilderResult(t); + return t; + } + catch (Exception e) + { + ConverterTypeCache[tuple] = new ErrorResult(e.Message); + throw; + } + } + + } +} diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj new file mode 100644 index 0000000000..a3db9ed3d3 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Library + Properties + Microsoft.AspNet.FeatureModel + Microsoft.AspNet.FeatureModel + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.FeatureModel.XML + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs new file mode 100644 index 0000000000..48bcb98b75 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class ObjectFeatureContainer : IFeatureContainer + { + private readonly object _instance; + + public ObjectFeatureContainer(object instance) + { + _instance = instance; + } + + public void Dispose() + { + var disposable = _instance as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + + public object GetFeature(Type type) + { + if (type.IsInstanceOfType(_instance)) + { + return _instance; + } + foreach (var interfaceType in _instance.GetType().GetInterfaces()) + { + if (interfaceType.FullName == type.FullName) + { + return Converter.Convert(interfaceType, type, _instance); + } + } + return null; + } + + public void SetFeature(Type type, object feature) + { + throw new NotImplementedException(); + } + + public int Revision + { + get { return 0; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..264c8db996 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.FeatureModel")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("cf678d83-e6f7-4433-9bf2-c0efa68e399b")] + +// 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("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs new file mode 100644 index 0000000000..4d1036d835 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.HttpEnvironment +{ + public abstract class HttpEnvironmentBase : FeatureContainer, IHttpEnvironment + { + } +} diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs new file mode 100644 index 0000000000..ab296451d5 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.HttpEnvironment +{ + public static class HttpEnvironmentExtensions + { + public static TFeature GetFeature(this IHttpEnvironment environment) where TFeature : class + { + return (TFeature)environment.GetFeature(typeof(TFeature)); + } + } +} diff --git a/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs new file mode 100644 index 0000000000..ab0bb92bc9 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs @@ -0,0 +1,8 @@ +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.HttpEnvironment +{ + public interface IHttpEnvironment : IFeatureContainer + { + } +} diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj new file mode 100644 index 0000000000..b1db630e6e --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj @@ -0,0 +1,59 @@ + + + + + Debug + AnyCPU + {46D69EC9-7096-49D8-A184-A9BB5B2419A1} + Library + Properties + Microsoft.AspNet.HttpEnvironment + Microsoft.AspNet.HttpEnvironment + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.HttpEnvironment.XML + + + + + + + + + + + + + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Microsoft.AspNet.FeatureModel + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..d68b8666f2 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.Environments")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Environments")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("1b326e9f-7c7a-42cd-9861-cdbef8353aed")] + +// 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("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs new file mode 100644 index 0000000000..497bff550b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -0,0 +1,14 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpApplicationInformation + { + string AppName { get; set; } + string AppMode { get; set; } + CancellationToken OnAppDisposing { get; set; } + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs new file mode 100644 index 0000000000..2936208463 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -0,0 +1,8 @@ +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpBuffering + { + void DisableRequestBuffering(); + void DisableResponseBuffering(); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs new file mode 100644 index 0000000000..a375e3358b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -0,0 +1,13 @@ +using System.Net; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpConnection + { + IPAddress RemoteIpAddress { get; set; } + int RemotePort { get; set; } + IPAddress LocalIpAddress { get; set; } + int LocalPort { get; set; } + bool IsLocal { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs new file mode 100644 index 0000000000..f125863ee2 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpRequest + { + string Protocol { get; set; } + string Scheme { get; set; } + string Method { get; set; } + string PathBase { get; set; } + string Path { get; set; } + string QueryString { get; set; } + IDictionary Headers { get; set; } + Stream Body { get; set; } + Uri Uri { get; } + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs new file mode 100644 index 0000000000..85921559eb --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpResponse + { + int StatusCode { get; set; } + string ReasonPhrase { get; set; } + IDictionary Headers { get; set; } + Stream Body { get; set; } + void OnSendingHeaders(Action callback, object state); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs new file mode 100644 index 0000000000..5d10d36c32 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -0,0 +1,10 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpSendFile + { + Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs new file mode 100644 index 0000000000..0d4555284e --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -0,0 +1,11 @@ +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpTransportLayerSecurity + { + X509Certificate ClientCertificate { get; set; } + Task LoadAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs new file mode 100644 index 0000000000..f5dbfb8c21 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -0,0 +1,11 @@ +using System.Net.WebSockets; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IHttpWebSocketAccept + { + bool IsWebSocketRequest { get; set; } + Task AcceptAsync(); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj new file mode 100644 index 0000000000..f881a5f0c9 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {42309978-0661-41D8-8654-39453265C5F9} + Library + Properties + Microsoft.AspNet.HttpFeature + Microsoft.AspNet.HttpFeature + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.HttpFeature.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..80a1326d0b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.Interfaces")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Interfaces")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("fbcea83c-9fdd-445d-a2d4-93e9062754f3")] + +// 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("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs new file mode 100644 index 0000000000..cb336ef6c6 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Interfaces +{ + public interface IAuthenticationChallenge + { + IEnumerable AuthenticationTypes { get; } + IDictionary Properties { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs new file mode 100644 index 0000000000..590addffc4 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationDescription + { + IDictionary Properties { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs new file mode 100644 index 0000000000..93c9e9a08d --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using System.Security.Claims; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationResult + { + ClaimsIdentity Identity { get; } + IDictionary Properties { get; } + IAuthenticationDescription Description { get; } + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs new file mode 100644 index 0000000000..663f19a9a3 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; +using System.Security.Claims; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationSignIn + { + ClaimsPrincipal User { get; } + IDictionary Properties { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs new file mode 100644 index 0000000000..763bcaed7f --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IAuthenticationSignOut + { + IEnumerable AuthenticationTypes { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs new file mode 100644 index 0000000000..ed955970ac --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using System.Security.Principal; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Interfaces.Security +{ + public interface IHttpAuthentication + { + IPrincipal User { get; set; } + + IEnumerable Authenticate(string[] authenticationTypes); + Task> AuthenticateAsync(string[] authenticationTypes); + + IAuthenticationChallenge ChallengeDetails { get; set; } + IAuthenticationSignIn SignInDetails { get; set; } + IAuthenticationSignOut SignOutDetails { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs new file mode 100644 index 0000000000..d4f89b64c4 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNet.Abstractions; +using Shouldly; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class BuilderTests + { + [Fact] + public void BuildReturnsCallableDelegate() + { + var builder = new Builder(); + var app = builder.Build(); + + var mockHttpContext = new Moq.Mock(); + var mockHttpResponse = new Moq.Mock(); + mockHttpContext.SetupGet(x => x.Response).Returns(mockHttpResponse.Object); + mockHttpResponse.SetupProperty(x => x.StatusCode); + + app.Invoke(mockHttpContext.Object); + mockHttpContext.Object.Response.StatusCode.ShouldBe(404); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj b/src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj new file mode 100644 index 0000000000..143f0ac203 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj @@ -0,0 +1,79 @@ + + + + + Debug + AnyCPU + {86942914-0334-4352-87ED-B971281C74E2} + Library + Properties + Microsoft.AspNet.PipelineCore.Tests + Microsoft.AspNet.PipelineCore.Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.PipelineCore.Tests.XML + + + + False + ..\..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll + + + False + ..\..\packages\Shouldly.1.1.1.1\lib\35\Shouldly.dll + + + + + + + + + + False + ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll + + + + + + + + + + + + {A4D3E280-8838-4614-9B99-4874C3CBDF82} + Microsoft.AspNet.PipelineCore + + + {4E1520B1-01F4-481B-96A2-24067EAA52FA} + Microsoft.AspNet.Abstractions + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..ca7eab6695 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.PipelineCore.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.PipelineCore.Tests")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("7c564547-b037-4054-a1ec-18e62717be47")] + +// 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("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/packages.config b/src/Microsoft.AspNet.PipelineCore.Tests/packages.config new file mode 100644 index 0000000000..2190a4eebc --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore.Tests/packages.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs new file mode 100644 index 0000000000..1e350b305d --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -0,0 +1,93 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; +using Microsoft.AspNet.PipelineCore.Owin; + +namespace Microsoft.AspNet.PipelineCore +{ + public class Builder : IBuilder + { + private readonly IFeatureContainer _features; + private readonly IList _components = new List(); + + public Builder() + { + _features = new FeatureModel.FeatureContainer(); + } + + public Builder(IFeatureContainer features) + { + _features = features; + } + + public void Dispose() + { + _features.Dispose(); + } + + public virtual object GetFeature(Type type) + { + return _features.GetFeature(type); + } + + public virtual void SetFeature(Type type, object feature) + { + _features.SetFeature(type, feature); + } + + public virtual int Revision + { + get { return _features.Revision; } + } + + public IBuilder Use(object middleware, params object[] args) + { + _components.Add(new Entry(middleware, args)); + return this; + } + + class Entry + { + private readonly object _middleware; + private readonly object[] _args; + + public Entry(object middleware, object[] args) + { + _middleware = middleware; + _args = args; + } + } + + public IBuilder New() + { + return new Builder(_features); + } + + public RequestDelegate Build() + { + RequestDelegate app = async context => context.Response.StatusCode = 404; + + foreach (var component in _components.Reverse()) + { + app = Activate(component, app); + } + + return app; + } + + private RequestDelegate Activate(Entry component, RequestDelegate app) + { + return app; + } + + public Func Adapt(object app) + { + return null; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/HttpContext.cs b/src/Microsoft.AspNet.PipelineCore/HttpContext.cs new file mode 100644 index 0000000000..a75c522b56 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/HttpContext.cs @@ -0,0 +1,44 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpEnvironment; + +namespace Microsoft.AspNet.PipelineCore +{ + public class HttpContext : HttpContextBase, IHttpEnvironment + { + private readonly IFeatureContainer _features; + private readonly HttpRequestBase _request; + private readonly HttpResponseBase _response; + + public HttpContext(IHttpEnvironment environment) + { + _features = environment; + _request = new HttpRequest(this); + _response = new HttpResponse(this); + } + + public override HttpRequestBase Request { get { return _request; } } + public override HttpResponseBase Response { get { return _response; } } + + public void Dispose() + { + _features.Dispose(); + } + + public object GetFeature(Type type) + { + return _features.GetFeature(type); + } + + public void SetFeature(Type type, object feature) + { + _features.SetFeature(type, feature); + } + + public int Revision + { + get { return _features.Revision; } + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs new file mode 100644 index 0000000000..2a7385d81a --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs @@ -0,0 +1,74 @@ +using System; +using System.IO; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; + +namespace Microsoft.AspNet.PipelineCore +{ + public class HttpRequest : HttpRequestBase + { + private readonly HttpContext _context; + private int _revision; + private IHttpRequest _request; + private IHttpConnection _connection; + + public HttpRequest(HttpContext context) + { + _context = context; + } + + private IHttpRequest IHttpRequest + { + get { return EnsureCurrent(_request) ?? (_request = _context.GetFeature()); } + } + + private IHttpConnection IHttpConnection + { + get { return EnsureCurrent(_connection) ?? (_connection = _context.GetFeature()); } + } + + private T EnsureCurrent(T feature) where T : class + { + if (_revision == _context.Revision) return feature; + + _request = null; + _connection = null; + _revision = _context.Revision; + return null; + } + + public override HttpContextBase HttpContext { get { return _context; } } + + public override Uri Uri + { + get { return IHttpRequest.Uri; } + } + + //public override Uri Uri { get { _request} } + + public override PathString PathBase + { + get { return new PathString(IHttpRequest.PathBase); } + set { IHttpRequest.PathBase = value.Value; } + } + + public override PathString Path + { + get { return new PathString(IHttpRequest.Path); } + set { IHttpRequest.Path = value.Value; } + } + + public override QueryString QueryString + { + get { return new QueryString(IHttpRequest.QueryString); } + set { IHttpRequest.QueryString = value.Value; } + } + + public override Stream Body + { + get { return IHttpRequest.Body; } + set { IHttpRequest.Body = value; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs new file mode 100644 index 0000000000..bb467e8691 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs @@ -0,0 +1,43 @@ +using System.IO; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; + +namespace Microsoft.AspNet.PipelineCore +{ + public class HttpResponse : HttpResponseBase + { + private readonly HttpContext _context; + private IHttpResponse _response; + private int _revision; + + public HttpResponse(HttpContext context) + { + _context = context; + } + + private IHttpResponse IHttpResponse + { + get { return EnsureCurrent(_response) ?? (_response = _context.GetFeature()); } + } + + private T EnsureCurrent(T feature) where T : class + { + if (_revision == _context.Revision) return feature; + + _response = null; + _revision = _context.Revision; + return null; + } + + public override HttpContextBase HttpContext { get { return _context; } } + + public override int StatusCode + { + get { return IHttpResponse.StatusCode; } + set { IHttpResponse.StatusCode = value; } + } + + public override Stream Body { get { return _response.Body; } set { _response.Body = value; } } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj new file mode 100644 index 0000000000..1cd72c4c66 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj @@ -0,0 +1,75 @@ + + + + + Debug + AnyCPU + {A4D3E280-8838-4614-9B99-4874C3CBDF82} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Microsoft.AspNet.PipelineCore.XML + + + + + + + + + + + + + + + + + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Microsoft.AspNet.FeatureModel + + + {4e1520b1-01f4-481b-96a2-24067eaa52fa} + Microsoft.AspNet.Abstractions + + + {46D69EC9-7096-49D8-A184-A9BB5B2419A1} + Microsoft.AspNet.HttpEnvironment + + + {42309978-0661-41d8-8654-39453265c5f9} + Microsoft.AspNet.HttpFeature + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec new file mode 100644 index 0000000000..1b6a2894c7 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec @@ -0,0 +1,22 @@ + + + $id$ + $version$ + $authors$ + $authors$ + $licenseUrl$ + $projectUrl$ + true + $title$ + $title$ + $tags$ + + + + + + + + + + diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs new file mode 100644 index 0000000000..c7eafe6019 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinConstants.cs @@ -0,0 +1,174 @@ +namespace Microsoft.AspNet.PipelineCore.Owin +{ + internal static class OwinConstants + { + #region OWIN v1.0.0 - 3.2.1. Request Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string RequestScheme = "owin.RequestScheme"; + public const string RequestMethod = "owin.RequestMethod"; + public const string RequestPathBase = "owin.RequestPathBase"; + public const string RequestPath = "owin.RequestPath"; + public const string RequestQueryString = "owin.RequestQueryString"; + public const string RequestProtocol = "owin.RequestProtocol"; + public const string RequestHeaders = "owin.RequestHeaders"; + public const string RequestBody = "owin.RequestBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.2. Response Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string ResponseStatusCode = "owin.ResponseStatusCode"; + public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; + public const string ResponseProtocol = "owin.ResponseProtocol"; + public const string ResponseHeaders = "owin.ResponseHeaders"; + public const string ResponseBody = "owin.ResponseBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.3. Other Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string CallCancelled = "owin.CallCancelled"; + + public const string OwinVersion = "owin.Version"; + + #endregion + + #region OWIN Keys for IAppBuilder.Properties + + internal static class Builder + { + public const string AddSignatureConversion = "builder.AddSignatureConversion"; + public const string DefaultApp = "builder.DefaultApp"; + } + + #endregion + + #region OWIN Key Guidelines and Common Keys - 6. Common keys + + // http://owin.org/spec/CommonKeys.html + + internal static class CommonKeys + { + public const string ClientCertificate = "ssl.ClientCertificate"; + public const string RemoteIpAddress = "server.RemoteIpAddress"; + public const string RemotePort = "server.RemotePort"; + public const string LocalIpAddress = "server.LocalIpAddress"; + public const string LocalPort = "server.LocalPort"; + public const string IsLocal = "server.IsLocal"; + public const string TraceOutput = "host.TraceOutput"; + public const string Addresses = "host.Addresses"; + public const string AppName = "host.AppName"; + public const string Capabilities = "server.Capabilities"; + public const string OnSendingHeaders = "server.OnSendingHeaders"; + public const string OnAppDisposing = "host.OnAppDisposing"; + public const string Scheme = "scheme"; + public const string Host = "host"; + public const string Port = "port"; + public const string Path = "path"; + } + + #endregion + + #region SendFiles v0.3.0 + + // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm + + internal static class SendFiles + { + // 3.1. Startup + + public const string Version = "sendfile.Version"; + public const string Support = "sendfile.Support"; + public const string Concurrency = "sendfile.Concurrency"; + + // 3.2. Per Request + + public const string SendAsync = "sendfile.SendAsync"; + } + + #endregion + + #region Opaque v0.3.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class OpaqueConstants + { + // 3.1. Startup + + public const string Version = "opaque.Version"; + + // 3.2. Per Request + + public const string Upgrade = "opaque.Upgrade"; + + // 5. Consumption + + public const string Stream = "opaque.Stream"; + // public const string Version = "opaque.Version"; // redundant, declared above + public const string CallCancelled = "opaque.CallCancelled"; + } + + #endregion + + #region WebSocket v0.4.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class WebSocket + { + // 3.1. Startup + + public const string Version = "websocket.Version"; + + // 3.2. Per Request + + public const string Accept = "websocket.Accept"; + + // 4. Accept + + public const string SubProtocol = "websocket.SubProtocol"; + + // 5. Consumption + + public const string SendAsync = "websocket.SendAsync"; + public const string ReceiveAsync = "websocket.ReceiveAsync"; + public const string CloseAsync = "websocket.CloseAsync"; + // public const string Version = "websocket.Version"; // redundant, declared above + public const string CallCancelled = "websocket.CallCancelled"; + public const string ClientCloseStatus = "websocket.ClientCloseStatus"; + public const string ClientCloseDescription = "websocket.ClientCloseDescription"; + } + + #endregion + + #region Security v0.1.0 + + // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm + + internal static class Security + { + // 3.2. Per Request + + public const string User = "server.User"; + + public const string Authenticate = "security.Authenticate"; + + // 3.3. Response + + public const string SignIn = "security.SignIn"; + + public const string SignOut = "security.SignOut"; + + public const string Challenge = "security.Challenge"; + } + + #endregion + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs new file mode 100644 index 0000000000..8f8a948434 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs @@ -0,0 +1,167 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.Interfaces; + +namespace Microsoft.AspNet.PipelineCore.Owin +{ + public class OwinHttpEnvironment : + IHttpRequest, IHttpResponse, IHttpConnection, IHttpSendFile, IHttpTransportLayerSecurity + { + public IDictionary Environment { get; set; } + + public OwinHttpEnvironment(IDictionary environment) + { + Environment = environment; + } + + T Prop(string key) + { + object value; + if (Environment.TryGetValue(key, out value) && value is T) + { + return (T)value; + } + return default(T); + } + + void Prop(string key, object value) + { + Environment[key] = value; + } + + string IHttpRequest.Protocol + { + get { return Prop("owin.RequestProtocol"); } + set { Prop("owin.RequestProtocol", value); } + } + + Uri IHttpRequest.Uri + { + get { throw new NotImplementedException(); } + } + + string IHttpRequest.Scheme + { + get { return Prop("owin.RequestScheme"); } + set { Prop("owin.RequestScheme", value); } + } + + string IHttpRequest.Method + { + get { return Prop("owin.RequestMethod"); } + set { Prop("owin.RequestMethod", value); } + } + + string IHttpRequest.PathBase + { + get { return Prop("owin.RequestPathBase"); } + set { Prop("owin.RequestPathBase", value); } + } + + string IHttpRequest.Path + { + get { return Prop("owin.RequestPath"); } + set { Prop("owin.RequestPath", value); } + } + + string IHttpRequest.QueryString + { + get { return Prop("owin.RequestQueryString"); } + set { Prop("owin.RequestQueryString", value); } + } + + IDictionary IHttpRequest.Headers + { + get { return Prop>("owin.RequestHeaders"); } + set { Prop("owin.RequestHeaders", value); } + } + + Stream IHttpRequest.Body + { + get { return Prop("owin.RequestBody"); } + set { Prop("owin.RequestBody", value); } + } + + int IHttpResponse.StatusCode + { + get { return Prop("owin.ResponseStatusCode"); } + set { Prop("owin.ResponseStatusCode", value); } + } + + string IHttpResponse.ReasonPhrase + { + get { return Prop("owin.ResponseReasonPhrase"); } + set { Prop("owin.ResponseReasonPhrase", value); } + } + + IDictionary IHttpResponse.Headers + { + get { return Prop>("owin.ResponseHeaders"); } + set { Prop("owin.ResponseHeaders", value); } + } + + Stream IHttpResponse.Body + { + get { return Prop("owin.ResponseBody"); } + set { Prop("owin.ResponseBody", value); } + } + + void IHttpResponse.OnSendingHeaders(Action callback, object state) + { + // TODO: + } + + IPAddress IHttpConnection.RemoteIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } + set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } + } + + int IHttpConnection.RemotePort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } + set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } + } + + IPAddress IHttpConnection.LocalIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } + set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } + } + + int IHttpConnection.LocalPort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } + } + + bool IHttpConnection.IsLocal + { + get { return Prop(OwinConstants.CommonKeys.IsLocal); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value); } + } + + Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + { + throw new NotImplementedException(); + } + + X509Certificate IHttpTransportLayerSecurity.ClientCertificate + { + get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } + set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } + } + + Task IHttpTransportLayerSecurity.LoadAsync() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..05cb3146e3 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.Abstractions.Implementation")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions.Implementation")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5886f89f-de4d-4e44-81c2-7a32b2c89cfd")] + +// 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("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] From 27ff7762e917c1e98b8e4df50d94b947af656f64 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 23 Jan 2014 14:53:22 -0800 Subject: [PATCH 0002/1838] Updating with work in progress --- AspNetAbstractions.sln | 12 +- .../HttpContext.cs | 28 +++ .../HttpContextBase.cs | 10 - .../{HttpRequestBase.cs => HttpRequest.cs} | 4 +- .../{HttpResponseBase.cs => HttpResponse.cs} | 4 +- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 4 +- .../Microsoft.AspNet.Abstractions.csproj | 6 +- .../RequestDelegate.cs | 2 +- .../FeatureContainer.cs | 86 -------- .../IFeatureContainer.cs | 13 -- .../IInterfaceDictionary.cs | 10 + .../Implementation/Converter.cs | 2 +- .../InterfaceDictionary.cs | 188 ++++++++++++++++++ .../InterfaceObject.cs | 133 +++++++++++++ .../Microsoft.AspNet.FeatureModel.csproj | 6 +- .../ObjectFeatureContainer.cs | 50 ----- ...pEnvironmentBase.cs => HttpEnvironment.cs} | 2 +- .../HttpEnvironmentExtensions.cs | 10 - .../IHttpEnvironment.cs | 2 +- .../Microsoft.AspNet.HttpEnvironment.csproj | 3 +- .../IHttpApplicationInformation.cs | 5 +- .../IHttpBuffering.cs | 2 +- .../IHttpConnection.cs | 2 +- ...pRequest.cs => IHttpRequestInformation.cs} | 4 +- ...esponse.cs => IHttpResponseInformation.cs} | 4 +- .../IHttpSendFile.cs | 2 +- .../IHttpTransportLayerSecurity.cs | 2 +- .../IHttpWebSocketAccept.cs | 2 +- .../Microsoft.AspNet.HttpFeature.csproj | 4 +- .../Security/IAuthenticationChallenge.cs | 2 +- .../Security/IAuthenticationDescription.cs | 2 +- .../Security/IAuthenticationResult.cs | 2 + .../Security/IAuthenticationSignIn.cs | 2 +- .../Security/IAuthenticationSignOut.cs | 2 +- .../Security/IHttpAuthentication.cs | 3 +- .../BuilderTests.cs | 4 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 37 ++-- .../DefaultHttpContext.cs | 42 ++++ .../{HttpRequest.cs => DefaultHttpRequest.cs} | 18 +- ...HttpResponse.cs => DefaultHttpResponse.cs} | 18 +- .../HttpContext.cs | 44 ---- .../Microsoft.AspNet.PipelineCore.csproj | 10 +- .../Owin/OwinHttpEnvironment.cs | 32 +-- .../Class1.cs | 63 ++++++ ...Microsoft.AspNet.FeatureModel.Tests.csproj | 63 ++++++ .../Properties/AssemblyInfo.cs | 36 ++++ .../packages.config | 5 + 47 files changed, 672 insertions(+), 315 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/HttpContext.cs delete mode 100644 src/Microsoft.AspNet.Abstractions/HttpContextBase.cs rename src/Microsoft.AspNet.Abstractions/{HttpRequestBase.cs => HttpRequest.cs} (80%) rename src/Microsoft.AspNet.Abstractions/{HttpResponseBase.cs => HttpResponse.cs} (69%) delete mode 100644 src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs create mode 100644 src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs rename src/Microsoft.AspNet.HttpEnvironment/{HttpEnvironmentBase.cs => HttpEnvironment.cs} (54%) delete mode 100644 src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs rename src/Microsoft.AspNet.HttpFeature/{IHttpRequest.cs => IHttpRequestInformation.cs} (83%) rename src/Microsoft.AspNet.HttpFeature/{IHttpResponse.cs => IHttpResponseInformation.cs} (79%) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs rename src/Microsoft.AspNet.PipelineCore/{HttpRequest.cs => DefaultHttpRequest.cs} (77%) rename src/Microsoft.AspNet.PipelineCore/{HttpResponse.cs => DefaultHttpResponse.cs} (61%) delete mode 100644 src/Microsoft.AspNet.PipelineCore/HttpContext.cs create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/packages.config diff --git a/AspNetAbstractions.sln b/AspNetAbstractions.sln index 2e07b4f2cb..82b860829b 100644 --- a/AspNetAbstractions.sln +++ b/AspNetAbstractions.sln @@ -7,14 +7,14 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractio EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.csproj", "{A780873E-09F9-4E44-AE06-AF00C4E88E1E}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpEnvironment", "src\Microsoft.AspNet.HttpEnvironment\Microsoft.AspNet.HttpEnvironment.csproj", "{46D69EC9-7096-49D8-A184-A9BB5B2419A1}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.csproj", "{42309978-0661-41D8-8654-39453265C5F9}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.csproj", "{A4D3E280-8838-4614-9B99-4874C3CBDF82}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "src\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -29,10 +29,6 @@ Global {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.Build.0 = Release|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1}.Release|Any CPU.Build.0 = Release|Any CPU {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -45,6 +41,10 @@ Global {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs new file mode 100644 index 0000000000..241c1d17e2 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -0,0 +1,28 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + public abstract class HttpContext : IDisposable + { + // TODO - review IOwinContext for properties + + public abstract HttpRequest Request { get; } + public abstract HttpResponse Response { get; } + + public abstract void Dispose(); + + public abstract object GetInterface(Type type); + + public abstract void SetInterface(Type type, object instance); + + public virtual T GetInterface() + { + return (T)GetInterface(typeof(T)); + } + + public virtual void SetInterface(T instance) + { + SetInterface(typeof(T), instance); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs b/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs deleted file mode 100644 index e1ceb30048..0000000000 --- a/src/Microsoft.AspNet.Abstractions/HttpContextBase.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Microsoft.AspNet.Abstractions -{ - public abstract class HttpContextBase - { - // TODO - review IOwinContext for properties - - public abstract HttpRequestBase Request { get; } - public abstract HttpResponseBase Response { get; } - } -} diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs similarity index 80% rename from src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs rename to src/Microsoft.AspNet.Abstractions/HttpRequest.cs index face559bdb..7277195cc7 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequestBase.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -3,11 +3,11 @@ using System.IO; namespace Microsoft.AspNet.Abstractions { - public abstract class HttpRequestBase + public abstract class HttpRequest { // TODO - review IOwinRequest for properties - public abstract HttpContextBase HttpContext { get; } + public abstract HttpContext HttpContext { get; } public abstract Uri Uri { get; } public abstract PathString PathBase { get; set; } diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs similarity index 69% rename from src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs rename to src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 518ea0355c..caf5dcb09e 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponseBase.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -2,11 +2,11 @@ namespace Microsoft.AspNet.Abstractions { - public abstract class HttpResponseBase + public abstract class HttpResponse { // TODO - review IOwinResponse for completeness - public abstract HttpContextBase HttpContext { get; } + public abstract HttpContext HttpContext { get; } public abstract int StatusCode { get; set; } public abstract Stream Body { get; set; } } diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 9016434cc3..c82f759739 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.Abstractions IBuilder New(); RequestDelegate Build(); - object GetFeature(Type type); - void SetFeature(Type type, object feature); + object GetItem(Type type); + void SetItem(Type type, object feature); } } diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj index 4f5b7f0b33..56b8af40c3 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.csproj @@ -36,9 +36,9 @@ - - - + + + diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs index 98b48bcf94..235b430713 100644 --- a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs @@ -2,5 +2,5 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions { - public delegate Task RequestDelegate(HttpContextBase context); + public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs deleted file mode 100644 index 1b7949658a..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/FeatureContainer.cs +++ /dev/null @@ -1,86 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using Microsoft.AspNet.FeatureModel.Implementation; - -namespace Microsoft.AspNet.FeatureModel -{ - public class FeatureContainer : IFeatureContainer - { - private readonly IFeatureContainer _defaultFeatures; - private readonly IDictionary _featureByFeatureType = new Dictionary(); - private readonly IDictionary _featureTypeByName = new Dictionary(); - private readonly object _containerSync = new Object(); - private int _containerRevision; - - public FeatureContainer() - { - } - - public FeatureContainer(IFeatureContainer defaultFeatures) - { - _defaultFeatures = defaultFeatures; - } - - public virtual object GetFeature(Type type) - { - object feature; - if (_featureByFeatureType.TryGetValue(type, out feature)) - { - return feature; - } - - Type actualType; - if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) - { - if (_featureByFeatureType.TryGetValue(actualType, out feature)) - { - return Converter.Convert(type, actualType, feature); - } - } - - return _defaultFeatures != null ? _defaultFeatures.GetFeature(type) : null; - } - - public virtual object GetDefaultFeature(Type type) - { - return null; - } - - public virtual void SetFeature(Type type, object feature) - { - lock (_containerSync) - { - Type priorFeatureType; - if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) - { - if (priorFeatureType == type) - { - _featureByFeatureType[type] = feature; - } - else - { - _featureTypeByName[type.FullName] = type; - _featureByFeatureType.Remove(priorFeatureType); - _featureByFeatureType.Add(type, feature); - } - } - else - { - _featureTypeByName.Add(type.FullName, type); - _featureByFeatureType.Add(type, feature); - } - Interlocked.Increment(ref _containerRevision); - } - } - - public virtual int Revision - { - get { return _containerRevision; } - } - - public void Dispose() - { - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs deleted file mode 100644 index 52529983d0..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureContainer.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNet.FeatureModel -{ - public interface IFeatureContainer : IDisposable - { - object GetFeature(Type type); - void SetFeature(Type type, object feature); - //IEnumerable GetFeatureTypes(); - int Revision { get; } - } -} diff --git a/src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs b/src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs new file mode 100644 index 0000000000..18d07e7937 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/IInterfaceDictionary.cs @@ -0,0 +1,10 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.FeatureModel +{ + public interface IInterfaceDictionary : IDictionary, IDisposable + { + int Revision { get; } + } +} diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs index 7f080ab884..918d9f2b8f 100644 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -352,7 +352,7 @@ namespace Microsoft.AspNet.FeatureModel.Implementation static Type CreateWrapperType(Type targetType, Type sourceType, VerificationSucceededResult result) { Dictionary mappings = result.methodMappings; - Type baseType = Assembly.GetExecutingAssembly().GetType("InterfaceMapper.BaseType`1").MakeGenericType(sourceType); + Type baseType = typeof(BaseType<>).MakeGenericType(sourceType); TypeBuilder tb = modb.DefineType("ProxyType" + counter++ + " wrapping:" + sourceType.Name + " to look like:" + targetType.Name, TypeAttributes.Class, baseType, new Type[] { targetType }); ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { sourceType }); ILGenerator il = cb.GetILGenerator(); diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs new file mode 100644 index 0000000000..2181f686f8 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs @@ -0,0 +1,188 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Threading; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class InterfaceDictionary : IInterfaceDictionary + { + private readonly IInterfaceDictionary _defaults; + private readonly IDictionary _featureByFeatureType = new Dictionary(); + private readonly IDictionary _featureTypeByName = new Dictionary(); + private readonly object _containerSync = new Object(); + private int _containerRevision; + + public InterfaceDictionary() + { + } + + public InterfaceDictionary(IInterfaceDictionary defaults) + { + _defaults = defaults; + } + + public object GetInterface() + { + return GetInterface(null); + } + + public object GetInterface(Type type) + { + if (type == null) throw new ArgumentNullException("type"); + object feature; + if (_featureByFeatureType.TryGetValue(type, out feature)) + { + return feature; + } + + Type actualType; + if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) + { + if (_featureByFeatureType.TryGetValue(actualType, out feature)) + { + if (type.IsInstanceOfType(feature)) + { + return feature; + } + return Converter.Convert(type, actualType, feature); + } + } + + if (_defaults != null && _defaults.TryGetValue(type, out feature)) + { + return feature; + } + return null; + } + + void SetInterface(Type type, object feature) + { + if (type == null) throw new ArgumentNullException("type"); + if (feature == null) throw new ArgumentNullException("feature"); + + lock (_containerSync) + { + Type priorFeatureType; + if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) + { + if (priorFeatureType == type) + { + _featureByFeatureType[type] = feature; + } + else + { + _featureTypeByName[type.FullName] = type; + _featureByFeatureType.Remove(priorFeatureType); + _featureByFeatureType.Add(type, feature); + } + } + else + { + _featureTypeByName.Add(type.FullName, type); + _featureByFeatureType.Add(type, feature); + } + Interlocked.Increment(ref _containerRevision); + } + } + + public virtual int Revision + { + get { return _containerRevision; } + } + + public void Dispose() + { + } + + public IEnumerator> GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(KeyValuePair item) + { + SetInterface(item.Key, item.Value); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + object value; + return TryGetValue(item.Key, out value) && Equals(item.Value, value); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public bool Remove(KeyValuePair item) + { + return Contains(item) && Remove(item.Key); + } + + public int Count + { + get { throw new NotImplementedException(); } + } + + public bool IsReadOnly + { + get { return false; } + } + + public bool ContainsKey(Type key) + { + if (key == null) throw new ArgumentNullException("key"); + return GetInterface(key) != null; + } + + public void Add(Type key, object value) + { + if (key == null) throw new ArgumentNullException("key"); + if (value == null) throw new ArgumentNullException("value"); + if (ContainsKey(key)) + { + throw new ArgumentException(); + } + SetInterface(key, value); + } + + public bool Remove(Type key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(Type key, out object value) + { + throw new NotImplementedException(); + } + + public object this[Type key] + { + get { return GetInterface(key); } + set { SetInterface(key, value); } + } + + public ICollection Keys + { + get { throw new NotImplementedException(); } + } + + public ICollection Values + { + get { throw new NotImplementedException(); } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs new file mode 100644 index 0000000000..6f81904e03 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs @@ -0,0 +1,133 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.FeatureModel.Implementation; + +namespace Microsoft.AspNet.FeatureModel +{ + public class InterfaceObject : IInterfaceDictionary + { + private readonly object _instance; + + public InterfaceObject(object instance) + { + _instance = instance; + } + + public void Dispose() + { + var disposable = _instance as IDisposable; + if (disposable != null) + { + disposable.Dispose(); + } + } + + public object GetInterface(Type type) + { + if (type.IsInstanceOfType(_instance)) + { + return _instance; + } + foreach (var interfaceType in _instance.GetType().GetInterfaces()) + { + if (interfaceType.FullName == type.FullName) + { + return Converter.Convert(interfaceType, type, _instance); + } + } + return null; + } + + public void SetInterface(Type type, object feature) + { + throw new NotImplementedException(); + } + + public int Revision + { + get { return 0; } + } + + public IEnumerator> GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void Clear() + { + throw new NotImplementedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public bool Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public int Count + { + get { throw new NotImplementedException(); } + } + + public bool IsReadOnly + { + get { throw new NotImplementedException(); } + } + + public bool ContainsKey(Type key) + { + throw new NotImplementedException(); + } + + public void Add(Type key, object value) + { + throw new NotImplementedException(); + } + + public bool Remove(Type key) + { + throw new NotImplementedException(); + } + + public bool TryGetValue(Type key, out object value) + { + throw new NotImplementedException(); + } + + public object this[Type key] + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public ICollection Keys + { + get { throw new NotImplementedException(); } + } + + public ICollection Values + { + get { throw new NotImplementedException(); } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj index a3db9ed3d3..5109def60a 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj @@ -34,10 +34,10 @@ - - + + - + diff --git a/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs b/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs deleted file mode 100644 index 48bcb98b75..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/ObjectFeatureContainer.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using Microsoft.AspNet.FeatureModel.Implementation; - -namespace Microsoft.AspNet.FeatureModel -{ - public class ObjectFeatureContainer : IFeatureContainer - { - private readonly object _instance; - - public ObjectFeatureContainer(object instance) - { - _instance = instance; - } - - public void Dispose() - { - var disposable = _instance as IDisposable; - if (disposable != null) - { - disposable.Dispose(); - } - } - - public object GetFeature(Type type) - { - if (type.IsInstanceOfType(_instance)) - { - return _instance; - } - foreach (var interfaceType in _instance.GetType().GetInterfaces()) - { - if (interfaceType.FullName == type.FullName) - { - return Converter.Convert(interfaceType, type, _instance); - } - } - return null; - } - - public void SetFeature(Type type, object feature) - { - throw new NotImplementedException(); - } - - public int Revision - { - get { return 0; } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironment.cs similarity index 54% rename from src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs rename to src/Microsoft.AspNet.HttpEnvironment/HttpEnvironment.cs index 4d1036d835..5836b621e9 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentBase.cs +++ b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironment.cs @@ -2,7 +2,7 @@ namespace Microsoft.AspNet.HttpEnvironment { - public abstract class HttpEnvironmentBase : FeatureContainer, IHttpEnvironment + public abstract class HttpEnvironment : InterfaceDictionary, IHttpEnvironment { } } diff --git a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs b/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs deleted file mode 100644 index ab296451d5..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/HttpEnvironmentExtensions.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Microsoft.AspNet.HttpEnvironment -{ - public static class HttpEnvironmentExtensions - { - public static TFeature GetFeature(this IHttpEnvironment environment) where TFeature : class - { - return (TFeature)environment.GetFeature(typeof(TFeature)); - } - } -} diff --git a/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs index ab0bb92bc9..8c4b99eda5 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs +++ b/src/Microsoft.AspNet.HttpEnvironment/IHttpEnvironment.cs @@ -2,7 +2,7 @@ namespace Microsoft.AspNet.HttpEnvironment { - public interface IHttpEnvironment : IFeatureContainer + public interface IHttpEnvironment : IInterfaceDictionary { } } diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj index b1db630e6e..048afaa76f 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj @@ -34,8 +34,7 @@ - - + diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs index 497bff550b..37dea109ab 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -1,9 +1,6 @@ -using System; -using System.Collections.Generic; -using System.Security.Claims; using System.Threading; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpApplicationInformation { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs index 2936208463..e13fde6988 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -1,4 +1,4 @@ -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpBuffering { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index a375e3358b..d659efd69c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,6 +1,6 @@ using System.Net; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpConnection { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs similarity index 83% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs index f125863ee2..424c06f940 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequest.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { - public interface IHttpRequest + public interface IHttpRequestInformation { string Protocol { get; set; } string Scheme { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs similarity index 79% rename from src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs index 85921559eb..ce0185c88e 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponse.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs @@ -2,9 +2,9 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { - public interface IHttpResponse + public interface IHttpResponseInformation { int StatusCode { get; set; } string ReasonPhrase { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs index 5d10d36c32..f64ea29264 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpSendFile { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index 0d4555284e..596462e28c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,7 +1,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpTransportLayerSecurity { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index f5dbfb8c21..ad0374c7f9 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,7 +1,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature { public interface IHttpWebSocketAccept { diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj index f881a5f0c9..7b6ab541d0 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj @@ -46,8 +46,8 @@ - - + + diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs index cb336ef6c6..4f8324d45e 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Interfaces +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationChallenge { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs index 590addffc4..f7cca258f5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationDescription { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs index 93c9e9a08d..b047bae8bd 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs @@ -1,6 +1,8 @@ using System.Collections.Generic; using System.Security.Claims; +using Microsoft.AspNet.HttpFeature.Security; +// ReSharper disable once CheckNamespace namespace Microsoft.AspNet.Interfaces.Security { public interface IAuthenticationResult diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs index 663f19a9a3..6033b173c5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs @@ -1,7 +1,7 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationSignIn { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs index 763bcaed7f..bab55a23e1 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs @@ -1,6 +1,6 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationSignOut { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index ed955970ac..477df94a12 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,8 +1,9 @@ using System.Collections.Generic; using System.Security.Principal; using System.Threading.Tasks; +using Microsoft.AspNet.Interfaces.Security; -namespace Microsoft.AspNet.Interfaces.Security +namespace Microsoft.AspNet.HttpFeature.Security { public interface IHttpAuthentication { diff --git a/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index d4f89b64c4..c38e8bbd9a 100644 --- a/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/src/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -12,8 +12,8 @@ namespace Microsoft.AspNet.PipelineCore.Tests var builder = new Builder(); var app = builder.Build(); - var mockHttpContext = new Moq.Mock(); - var mockHttpResponse = new Moq.Mock(); + var mockHttpContext = new Moq.Mock(); + var mockHttpResponse = new Moq.Mock(); mockHttpContext.SetupGet(x => x.Response).Returns(mockHttpResponse.Object); mockHttpResponse.SetupProperty(x => x.StatusCode); diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 1e350b305d..26068cf03e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -4,45 +4,52 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpEnvironment; -using Microsoft.AspNet.Interfaces; -using Microsoft.AspNet.PipelineCore.Owin; namespace Microsoft.AspNet.PipelineCore { public class Builder : IBuilder { - private readonly IFeatureContainer _features; + private readonly IInterfaceDictionary _interfaces; + private readonly IDictionary _properties; private readonly IList _components = new List(); public Builder() { - _features = new FeatureModel.FeatureContainer(); + _interfaces = new InterfaceDictionary(); + _properties = new Dictionary(); } - public Builder(IFeatureContainer features) + public Builder(IInterfaceDictionary interfaces, IDictionary properties) { - _features = features; + _interfaces = interfaces; + _properties = properties; } public void Dispose() { - _features.Dispose(); + _interfaces.Dispose(); } - public virtual object GetFeature(Type type) + public virtual object GetItem(Type key) { - return _features.GetFeature(type); + object value; + return _interfaces.TryGetValue(key, out value); } - public virtual void SetFeature(Type type, object feature) + public virtual void SetItem(Type key, object value) { - _features.SetFeature(type, feature); + _interfaces[key] = value; } - public virtual int Revision + public virtual object GetItem(string key) { - get { return _features.Revision; } + object value; + return _properties.TryGetValue(key, out value); + } + + public virtual void SetItem(string key, object value) + { + _properties[key] = value; } public IBuilder Use(object middleware, params object[] args) @@ -65,7 +72,7 @@ namespace Microsoft.AspNet.PipelineCore public IBuilder New() { - return new Builder(_features); + return new Builder(_interfaces, _properties); } public RequestDelegate Build() diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs new file mode 100644 index 0000000000..bbd69ef0f8 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -0,0 +1,42 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultHttpContext : HttpContext + { + private readonly IInterfaceDictionary _environment; + private readonly HttpRequest _request; + private readonly HttpResponse _response; + + public DefaultHttpContext(IInterfaceDictionary environment) + { + _environment = environment; + _request = new DefaultHttpRequest(this); + _response = new DefaultHttpResponse(this); + } + + public override HttpRequest Request { get { return _request; } } + public override HttpResponse Response { get { return _response; } } + + public int Revision { get { return _environment.Revision; } } + + public override void Dispose() + { + // REVIEW: is this necessary? is the environment "owned" by the context? + _environment.Dispose(); + } + + public override object GetInterface(Type type) + { + object value; + return _environment.TryGetValue(type, out value) ? value : null; + } + + public override void SetInterface(Type type, object instance) + { + _environment[type] = instance; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs similarity index 77% rename from src/Microsoft.AspNet.PipelineCore/HttpRequest.cs rename to src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 2a7385d81a..73860a9f32 100644 --- a/src/Microsoft.AspNet.PipelineCore/HttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,31 +1,31 @@ using System; using System.IO; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.Interfaces; namespace Microsoft.AspNet.PipelineCore { - public class HttpRequest : HttpRequestBase + public class DefaultHttpRequest : HttpRequest { - private readonly HttpContext _context; + private readonly DefaultHttpContext _context; private int _revision; - private IHttpRequest _request; + private IHttpRequestInformation _request; private IHttpConnection _connection; - public HttpRequest(HttpContext context) + public DefaultHttpRequest(DefaultHttpContext context) { _context = context; } - private IHttpRequest IHttpRequest + private IHttpRequestInformation IHttpRequest { - get { return EnsureCurrent(_request) ?? (_request = _context.GetFeature()); } + get { return EnsureCurrent(_request) ?? (_request = _context.GetInterface()); } } private IHttpConnection IHttpConnection { - get { return EnsureCurrent(_connection) ?? (_connection = _context.GetFeature()); } + get { return EnsureCurrent(_connection) ?? (_connection = _context.GetInterface()); } } private T EnsureCurrent(T feature) where T : class @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.PipelineCore return null; } - public override HttpContextBase HttpContext { get { return _context; } } + public override HttpContext HttpContext { get { return _context; } } public override Uri Uri { diff --git a/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs similarity index 61% rename from src/Microsoft.AspNet.PipelineCore/HttpResponse.cs rename to src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index bb467e8691..27ed56f4e5 100644 --- a/src/Microsoft.AspNet.PipelineCore/HttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,24 +1,24 @@ using System.IO; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.HttpEnvironment; -using Microsoft.AspNet.Interfaces; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore { - public class HttpResponse : HttpResponseBase + public class DefaultHttpResponse : HttpResponse { - private readonly HttpContext _context; - private IHttpResponse _response; + private readonly DefaultHttpContext _context; + private IHttpResponseInformation _response; private int _revision; - public HttpResponse(HttpContext context) + public DefaultHttpResponse(DefaultHttpContext context) { _context = context; } - private IHttpResponse IHttpResponse + private IHttpResponseInformation IHttpResponse { - get { return EnsureCurrent(_response) ?? (_response = _context.GetFeature()); } + get { return EnsureCurrent(_response) ?? (_response = _context.GetInterface()); } } private T EnsureCurrent(T feature) where T : class @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.PipelineCore return null; } - public override HttpContextBase HttpContext { get { return _context; } } + public override HttpContext HttpContext { get { return _context; } } public override int StatusCode { diff --git a/src/Microsoft.AspNet.PipelineCore/HttpContext.cs b/src/Microsoft.AspNet.PipelineCore/HttpContext.cs deleted file mode 100644 index a75c522b56..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/HttpContext.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpEnvironment; - -namespace Microsoft.AspNet.PipelineCore -{ - public class HttpContext : HttpContextBase, IHttpEnvironment - { - private readonly IFeatureContainer _features; - private readonly HttpRequestBase _request; - private readonly HttpResponseBase _response; - - public HttpContext(IHttpEnvironment environment) - { - _features = environment; - _request = new HttpRequest(this); - _response = new HttpResponse(this); - } - - public override HttpRequestBase Request { get { return _request; } } - public override HttpResponseBase Response { get { return _response; } } - - public void Dispose() - { - _features.Dispose(); - } - - public object GetFeature(Type type) - { - return _features.GetFeature(type); - } - - public void SetFeature(Type type, object feature) - { - _features.SetFeature(type, feature); - } - - public int Revision - { - get { return _features.Revision; } - } - } -} diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj index 1cd72c4c66..27cd7e01f4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj @@ -36,9 +36,9 @@ - - - + + + @@ -52,10 +52,6 @@ {4e1520b1-01f4-481b-96a2-24067eaa52fa} Microsoft.AspNet.Abstractions - - {46D69EC9-7096-49D8-A184-A9BB5B2419A1} - Microsoft.AspNet.HttpEnvironment - {42309978-0661-41d8-8654-39453265c5f9} Microsoft.AspNet.HttpFeature diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs index 8f8a948434..124f49e471 100644 --- a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs @@ -6,13 +6,13 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.HttpEnvironment; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.Interfaces; namespace Microsoft.AspNet.PipelineCore.Owin { public class OwinHttpEnvironment : - IHttpRequest, IHttpResponse, IHttpConnection, IHttpSendFile, IHttpTransportLayerSecurity + IHttpRequestInformation, IHttpResponseInformation, IHttpConnection, IHttpSendFile, IHttpTransportLayerSecurity { public IDictionary Environment { get; set; } @@ -36,84 +36,84 @@ namespace Microsoft.AspNet.PipelineCore.Owin Environment[key] = value; } - string IHttpRequest.Protocol + string IHttpRequestInformation.Protocol { get { return Prop("owin.RequestProtocol"); } set { Prop("owin.RequestProtocol", value); } } - Uri IHttpRequest.Uri + Uri IHttpRequestInformation.Uri { get { throw new NotImplementedException(); } } - string IHttpRequest.Scheme + string IHttpRequestInformation.Scheme { get { return Prop("owin.RequestScheme"); } set { Prop("owin.RequestScheme", value); } } - string IHttpRequest.Method + string IHttpRequestInformation.Method { get { return Prop("owin.RequestMethod"); } set { Prop("owin.RequestMethod", value); } } - string IHttpRequest.PathBase + string IHttpRequestInformation.PathBase { get { return Prop("owin.RequestPathBase"); } set { Prop("owin.RequestPathBase", value); } } - string IHttpRequest.Path + string IHttpRequestInformation.Path { get { return Prop("owin.RequestPath"); } set { Prop("owin.RequestPath", value); } } - string IHttpRequest.QueryString + string IHttpRequestInformation.QueryString { get { return Prop("owin.RequestQueryString"); } set { Prop("owin.RequestQueryString", value); } } - IDictionary IHttpRequest.Headers + IDictionary IHttpRequestInformation.Headers { get { return Prop>("owin.RequestHeaders"); } set { Prop("owin.RequestHeaders", value); } } - Stream IHttpRequest.Body + Stream IHttpRequestInformation.Body { get { return Prop("owin.RequestBody"); } set { Prop("owin.RequestBody", value); } } - int IHttpResponse.StatusCode + int IHttpResponseInformation.StatusCode { get { return Prop("owin.ResponseStatusCode"); } set { Prop("owin.ResponseStatusCode", value); } } - string IHttpResponse.ReasonPhrase + string IHttpResponseInformation.ReasonPhrase { get { return Prop("owin.ResponseReasonPhrase"); } set { Prop("owin.ResponseReasonPhrase", value); } } - IDictionary IHttpResponse.Headers + IDictionary IHttpResponseInformation.Headers { get { return Prop>("owin.ResponseHeaders"); } set { Prop("owin.ResponseHeaders", value); } } - Stream IHttpResponse.Body + Stream IHttpResponseInformation.Body { get { return Prop("owin.ResponseBody"); } set { Prop("owin.ResponseBody", value); } } - void IHttpResponse.OnSendingHeaders(Action callback, object state) + void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) { // TODO: } diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs new file mode 100644 index 0000000000..7527e07ffc --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Class1.cs @@ -0,0 +1,63 @@ +using System; +using Shouldly; +using Xunit; + +namespace Microsoft.AspNet.FeatureModel.Tests +{ + public interface IThing + { + string Hello(); + } + + public class Thing : IThing + { + public string Hello() + { + return "World"; + } + } + + public class InterfaceDictionaryTests + { + [Fact] + public void AddedInterfaceIsReturned() + { + var interfaces = new InterfaceDictionary(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + + interfaces[typeof(IThing)].ShouldBe(thing); + + object thing2; + interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); + thing2.ShouldBe(thing); + } + + [Fact] + public void IndexerAlsoAddsItems() + { + var interfaces = new InterfaceDictionary(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + + interfaces[typeof(IThing)].ShouldBe(thing); + + object thing2; + interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); + thing2.ShouldBe(thing); + } + + [Fact] + public void SecondCallToAddThrowsException() + { + var interfaces = new InterfaceDictionary(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + + Should.Throw(() => interfaces.Add(typeof(IThing), thing)); + } + } +} diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj new file mode 100644 index 0000000000..98d1189ee4 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj @@ -0,0 +1,63 @@ + + + + + Debug + AnyCPU + {8C671AE3-1188-499F-A2A2-3A0B117B33CE} + Library + Properties + Microsoft.AspNet.FeatureModel.Tests + Microsoft.AspNet.FeatureModel.Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + ..\..\packages\Shouldly.1.1.1.1\lib\35\Shouldly.dll + + + + + ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll + + + + + + + + + + + + {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + Microsoft.AspNet.FeatureModel + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..da65ff9698 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a780740b-8831-40e0-a084-489d738dfef5")] + +// 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")] diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/packages.config b/test/Microsoft.AspNet.FeatureModel.Tests/packages.config new file mode 100644 index 0000000000..5500407987 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/packages.config @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file From 3ef8197d181e07c1f9e777cdc848baba3b6fd5d6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 23 Jan 2014 23:52:20 -0800 Subject: [PATCH 0003/1838] Updated projects and the build. - Things compile with ifdefs for coreclr now. --- AspNetAbstractions.sln | 88 +++-- Sakefile.shade | 66 ---- build.cmd | 2 +- build.sh | 6 - build/_git-clone.shade | 9 + build/_git-pull.shade | 8 + build/_git.shade | 5 + build/_k-build.shade | 17 + build/_k-clean.shade | 13 + build/_k-generate-projects.shade | 330 ++++++++++++++++++ build/_k-restore.shade | 7 + build/_k-standard-goals.shade | 47 +++ build/_k.shade | 31 ++ build/k10.txt | 50 +++ .../net45.txt | 31 +- makefile.shade | 7 + ... Microsoft.AspNet.Abstractions.k10.csproj} | 40 +-- ...Microsoft.AspNet.Abstractions.net45.csproj | 64 ++++ .../Microsoft.AspNet.Abstractions.nuspec | 22 -- .../project.json | 7 + .../Implementation/Converter.cs | 4 +- .../InterfaceDictionary.cs | 10 +- .../InterfaceObject.cs | 4 + .../Microsoft.AspNet.FeatureModel.k10.csproj | 54 +++ ...Microsoft.AspNet.FeatureModel.net45.csproj | 61 ++++ .../Microsoft.AspNet.FeatureModel.nuspec | 22 -- .../project.json | 7 + ...crosoft.AspNet.HttpEnvironment.k10.csproj} | 39 +-- ...rosoft.AspNet.HttpEnvironment.net45.csproj | 62 ++++ .../Microsoft.AspNet.HttpEnvironment.nuspec | 22 -- .../project.json | 9 + .../IHttpConnection.cs | 4 +- .../IHttpTransportLayerSecurity.cs | 4 + .../IHttpWebSocketAccept.cs | 2 + .../Microsoft.AspNet.HttpFeature.k10.csproj | 64 ++++ ...Microsoft.AspNet.HttpFeature.net45.csproj} | 57 +-- .../Microsoft.AspNet.HttpFeature.nuspec | 22 -- .../Security/IAuthenticationResult.cs | 6 + .../Security/IAuthenticationSignIn.cs | 4 + src/Microsoft.AspNet.HttpFeature/project.json | 6 + .../BuilderTests.cs | 2 +- ...Microsoft.AspNet.PipelineCore.Tests.csproj | 15 +- .../Microsoft.AspNet.PipelineCore.csproj | 71 ---- .../Microsoft.AspNet.PipelineCore.k10.csproj | 65 ++++ ...Microsoft.AspNet.PipelineCore.net45.csproj | 72 ++++ .../Microsoft.AspNet.PipelineCore.nuspec | 22 -- .../Owin/OwinHttpEnvironment.cs | 20 +- .../project.json | 11 + ...Microsoft.AspNet.FeatureModel.Tests.csproj | 9 +- 49 files changed, 1220 insertions(+), 380 deletions(-) delete mode 100644 Sakefile.shade delete mode 100644 build.sh create mode 100644 build/_git-clone.shade create mode 100644 build/_git-pull.shade create mode 100644 build/_git.shade create mode 100644 build/_k-build.shade create mode 100644 build/_k-clean.shade create mode 100644 build/_k-generate-projects.shade create mode 100644 build/_k-restore.shade create mode 100644 build/_k-standard-goals.shade create mode 100644 build/_k.shade create mode 100644 build/k10.txt rename src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj => build/net45.txt (68%) create mode 100644 makefile.shade rename src/Microsoft.AspNet.Abstractions/{Microsoft.AspNet.Abstractions.csproj => Microsoft.AspNet.Abstractions.k10.csproj} (63%) create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj delete mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec create mode 100644 src/Microsoft.AspNet.Abstractions/project.json create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj delete mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec create mode 100644 src/Microsoft.AspNet.FeatureModel/project.json rename src/Microsoft.AspNet.HttpEnvironment/{Microsoft.AspNet.HttpEnvironment.csproj => Microsoft.AspNet.HttpEnvironment.k10.csproj} (61%) create mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj delete mode 100644 src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec create mode 100644 src/Microsoft.AspNet.HttpEnvironment/project.json create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj rename src/Microsoft.AspNet.HttpFeature/{Microsoft.AspNet.HttpFeature.csproj => Microsoft.AspNet.HttpFeature.net45.csproj} (54%) delete mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.nuspec create mode 100644 src/Microsoft.AspNet.HttpFeature/project.json delete mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj delete mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec create mode 100644 src/Microsoft.AspNet.PipelineCore/project.json diff --git a/AspNetAbstractions.sln b/AspNetAbstractions.sln index 82b860829b..b3df2a2bfa 100644 --- a/AspNetAbstractions.sln +++ b/AspNetAbstractions.sln @@ -3,40 +3,36 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.csproj", "{4E1520B1-01F4-481B-96A2-24067EAA52FA}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.csproj", "{A780873E-09F9-4E44-AE06-AF00C4E88E1E}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.csproj", "{42309978-0661-41D8-8654-39453265C5F9}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.csproj", "{A4D3E280-8838-4614-9B99-4874C3CBDF82}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "src\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{D36288AF-8A0E-48DD-8AF8-15B72F91C70A}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{95AEE59D-BF51-47CB-A957-C03D909CC148}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{E9AF7046-E24C-4071-B7AF-7981F2D1A613}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{A6DEB0D3-982E-4A07-8EE7-39269F192AF7}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{9295515C-6603-46BB-92EB-1C5F6B0E84C9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{68A538BA-D542-49CB-9615-B4F5A4E78C87}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D38DDB2B-1138-4F45-8A6A-9499E880F620}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F2F1-40B6-AE95-A3D878612E91}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E1520B1-01F4-481B-96A2-24067EAA52FA}.Release|Any CPU.Build.0 = Release|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E}.Release|Any CPU.Build.0 = Release|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42309978-0661-41D8-8654-39453265C5F9}.Release|Any CPU.Build.0 = Release|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A4D3E280-8838-4614-9B99-4874C3CBDF82}.Release|Any CPU.Build.0 = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -45,8 +41,52 @@ Global {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.Build.0 = Release|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.Build.0 = Release|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.Build.0 = Release|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.Build.0 = Release|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.Build.0 = Release|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.Build.0 = Release|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.Build.0 = Release|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.Build.0 = Release|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {95AEE59D-BF51-47CB-A957-C03D909CC148} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {9295515C-6603-46BB-92EB-1C5F6B0E84C9} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {68A538BA-D542-49CB-9615-B4F5A4E78C87} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {86942914-0334-4352-87ED-B971281C74E2} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} + {8C671AE3-1188-499F-A2A2-3A0B117B33CE} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} + EndGlobalSection EndGlobal diff --git a/Sakefile.shade b/Sakefile.shade deleted file mode 100644 index 56c6a45839..0000000000 --- a/Sakefile.shade +++ /dev/null @@ -1,66 +0,0 @@ - -var PROJECT='AspNetAbstractions' -var VERSION='0.1.0' -var FULL_VERSION='${VERSION}' -var AUTHORS='${PROJECT} contributors' - -var BASE_DIR='${Directory.GetCurrentDirectory()}' -var TARGET_DIR='${Path.Combine(BASE_DIR, "target")}' -var BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' -var TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' - -default SRC='.' -default BUILD_PROJECTS='${Files.Include(SRC+"/**/*.csproj")}' -default TEST_PROJECTS='${Files.Include(SRC+"/**/*.Tests.csproj")}' - -use namespace='System.Xml.Linq' - --// include range of standard general targets. run "sake targets" to display -use-standard-lifecycle - --// include sets of standard work targets. features include 'nuget,xunit,nunit' -use-standard-goals features='nuget,xunit' - --// additional work targets are defined below - -#nuget-prepare target='package-prepare' description='Compile primary project' - for each='var projectFile in BUILD_PROJECTS.Except(TEST_PROJECTS)' - var outputDirName='${Path.GetFileNameWithoutExtension(projectFile)}' - - var outputDir='${Path.Combine(BUILD_DIR, outputDirName)}' - - copy sourceDir='${Path.GetDirectoryName(projectFile)}' include='*.nuspec' overwrite='${true}' - - var doc='${XDocument.Load(projectFile)}' - var ns='http://schemas.microsoft.com/developer/msbuild/2003' - var itemGroups='${doc.Elements(XName.Get("Project", ns)).Elements(XName.Get("ItemGroup", ns))}' - var compileItems='${itemGroups.Elements(XName.Get("Compile", ns))}' - var contentItems='${itemGroups.Elements(XName.Get("Content", ns))}' - var noneItems='${itemGroups.Elements(XName.Get("None", ns))}' - var razorItems='${contentItems.Union(noneItems).Where(x=>x.Attribute("Include").Value.EndsWith(".cshtml"))}' - - for each='var compileElt in compileItems.Union(razorItems)' - var linkElt='${compileElt.Elements(XName.Get("Link", ns)).SingleOrDefault()}' - - var sourceFile='${compileElt.Attribute("Include").Value}' - var targetFile='${linkElt == null ? sourceFile : linkElt.Value}' - - var sourceFull='${Path.Combine(Path.GetDirectoryName(projectFile), sourceFile)}' - var targetFull='${Path.Combine(outputDir, "src", targetFile)}' - directory create='${Path.GetDirectoryName(targetFull)}' - -File.Copy(sourceFull, targetFull, true); - -#nuget-package target='package' description='Create NuGet packages' - for each='var file in Files.Include(BUILD_DIR + "/**/*.nuspec")' - var baseName='${Path.GetFileNameWithoutExtension(file)}' - var nugetProperties='${new Dictionary { - {"id", baseName}, - {"authors", AUTHORS}, - {"title", baseName}, - {"description", baseName}, - {"licenseUrl", "about:blank"}, - {"projectUrl", "about:blank"}, - {"tags", "Katana"}, - }}' - var props='${string.Join(";", nugetProperties.Select(kv=>kv.Key+"="+kv.Value).ToArray())}' - nuget-pack nuspecFile='${file}' packageVersion='${FULL_VERSION}' outputDir='${TARGET_DIR}' extra='-NoPackageAnalysis -Properties "${props}"' diff --git a/build.cmd b/build.cmd index 65dfe408fd..e2ce3f1317 100644 --- a/build.cmd +++ b/build.cmd @@ -9,4 +9,4 @@ mkdir .nuget :part2 set EnableNuGetPackageRestore=true .nuget\NuGet.exe install Sake -version 0.2 -o packages -packages\Sake.0.2\tools\Sake.exe -I build -f Sakefile.shade %* +packages\Sake.0.2\tools\Sake.exe -I build -f makefile.shade %* diff --git a/build.sh b/build.sh deleted file mode 100644 index 8a58a5e2a9..0000000000 --- a/build.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/sh - -export EnableNuGetPackageRestore=true -mono --runtime=v4.0 ".nuget/NuGet.exe" install Sake -pre -o packages -mono $(find packages/Sake.*/tools/Sake.exe|sort -r|head -n1) -f Sakefile.shade -I src/build "$@" - diff --git a/build/_git-clone.shade b/build/_git-clone.shade new file mode 100644 index 0000000000..32355ab5a3 --- /dev/null +++ b/build/_git-clone.shade @@ -0,0 +1,9 @@ + + + +default gitBranch='' + +var gitCommand='clone ${gitUri}' +set gitCommand='${gitCommand} --branch ${gitBranch}' if='!string.IsNullOrEmpty(gitBranch)' + +git diff --git a/build/_git-pull.shade b/build/_git-pull.shade new file mode 100644 index 0000000000..1e7971020f --- /dev/null +++ b/build/_git-pull.shade @@ -0,0 +1,8 @@ + + +default gitBranch='' + +var gitCommand='pull ${gitUri}' +set gitCommand='${gitCommand} ${gitBranch}' if='!string.IsNullOrEmpty(gitBranch)' + +git diff --git a/build/_git.shade b/build/_git.shade new file mode 100644 index 0000000000..7495a598bb --- /dev/null +++ b/build/_git.shade @@ -0,0 +1,5 @@ + +default gitFolder='' + +exec program='git' commandline='${gitCommand}' workingdir='${gitFolder}' + diff --git a/build/_k-build.shade b/build/_k-build.shade new file mode 100644 index 0000000000..435bdca74a --- /dev/null +++ b/build/_k-build.shade @@ -0,0 +1,17 @@ +@{/* + +k-build + Builds project. Downloads and executes k sdk tools. + +projectFile='' + Required. Path to the project.json to build. + +*/} + +var projectFolder='${Path.GetDirectoryName(projectFile)}' +var projectName='${Path.GetFileName(projectFolder)}' +var projectBin='${Path.Combine(projectFolder, "bin")}' + +directory delete="${projectBin}" +k command='build ${projectFolder}' +copy sourceDir='${projectBin}' outputDir='${Path.Combine(BUILD_DIR, projectName)}' diff --git a/build/_k-clean.shade b/build/_k-clean.shade new file mode 100644 index 0000000000..7f8b643682 --- /dev/null +++ b/build/_k-clean.shade @@ -0,0 +1,13 @@ +@{/* + +k-clean + Cleans project. Downloads and executes k sdk tools. + +projectFile='' + Required. Path to the project.json to build. + +*/} + +var projectFolder='${Path.GetDirectoryName(projectFile)}' + +k command='clean ${projectFolder}' diff --git a/build/_k-generate-projects.shade b/build/_k-generate-projects.shade new file mode 100644 index 0000000000..01af0cd018 --- /dev/null +++ b/build/_k-generate-projects.shade @@ -0,0 +1,330 @@ +use namespace="System" +use namespace="System.Collections.Generic" +use namespace="System.IO" +use namespace="System.Linq" +use namespace="System.Reflection" +use namespace="System.Text" +use namespace="System.Web.Script.Serialization" +use namespace="System.Xml.Linq" + +use assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" + +@{/* + +k-generate-projects + Generate csproj files from project.json + +solutionPath='' + Required. Path to the solution directory + +*/} + +content var='net45' include href='net45.txt' +content var='k10' include href='k10.txt' + +@{ + ProjectGenerator.Logger = Log; + + var templates = new Dictionary { + { "net45", net45 }, + { "k10", k10 } + }; + + ProjectGenerator.MakeProjects(solutionPath, templates); +} + +functions + @{ + class ProjectGenerator + { + public static Sake.Engine.Logging.ILog Logger { get; set; } + + static void Log(string message, params object[] args) + { + Logger.Info(String.Format(message, args)); + } + + static void Warn(string message, params object[] args) + { + Logger.Warn(String.Format(message, args)); + } + + public static void MakeProjects(string solutionPath, IDictionary templates) + { + var jsonFiles = GetJsonFiles(solutionPath); + var projectMapping = GetProjectMapping(solutionPath, jsonFiles); + + Log("Found {0} projects", jsonFiles.Length); + + foreach (var p in jsonFiles) + { + Log(p); + } + + foreach (var path in jsonFiles) + { + ProduceProjectFilesForProject(path, projectMapping, templates); + } + } + + private static string[] GetJsonFiles(string solutionPath) + { + Func getFiles = dir => + { + string path = Path.Combine(solutionPath, dir); + + if (!Directory.Exists(path)) + { + return new string[0]; + } + + return Directory.GetFiles(path, "project.json", SearchOption.AllDirectories); + }; + + return getFiles("src").Concat(getFiles("samples")) + .Concat(getFiles("test")) + .ToArray(); + } + + private static IDictionary GetProjectMapping(string solutionPath, string[] jsonFiles) + { + var dict = new Dictionary(); + + foreach (var path in jsonFiles) + { + string projectDir = Path.GetDirectoryName(path); + string projectName = projectDir.Substring(Path.GetDirectoryName(projectDir).Length).Trim(Path.DirectorySeparatorChar); + + // { + // "p1" : { "net45" : "id", "k10" : "pid1", path: "src\p1" }, + // "p2" : { "net45" : "id", "k10" : "pid2", path: "src\p2" } + // } + // + + string net45Project = Path.Combine(projectDir, GetProjectFileName(projectName, "net45")); + string k10Project = Path.Combine(projectDir, GetProjectFileName(projectName, "k10")); + + var configs = new Dictionary(); + configs["net45"] = GetProjectGuidFromFileOrCreateNew(net45Project); + configs["k10"] = GetProjectGuidFromFileOrCreateNew(k10Project); + configs["path"] = Path.GetDirectoryName(path.Substring(solutionPath.Length).TrimStart(Path.DirectorySeparatorChar)); + + dict[projectName] = configs; + } + + return dict; + } + + private static string GetProjectGuidFromFileOrCreateNew(string projectPath) + { + if (!File.Exists(projectPath)) + { + return Guid.NewGuid().ToString().ToUpper(); + } + + var projectGuid = XDocument.Parse(File.ReadAllText(projectPath)) + .Descendants() + .FirstOrDefault(e => e.Name.LocalName.Equals("ProjectGuid")); + + if (projectGuid == null) + { + return Guid.NewGuid().ToString(); + } + + return projectGuid.Value.Trim((char)'{', (char)'}'); + } + + private static void ProduceProjectFilesForProject(string jsonPath, + IDictionary projectMapping, + IDictionary templates) + { + var serializer = new JavaScriptSerializer(); + + string projectDir = Path.GetDirectoryName(jsonPath); + string projectName = projectDir.Substring(Path.GetDirectoryName(projectDir).Length).Trim(Path.DirectorySeparatorChar); + + Log("Generated projects for {0}", projectName); + + var jsonText = File.ReadAllText(jsonPath); + + var d = serializer.DeserializeObject(jsonText) as IDictionary; + var configs = GetObject(d, "configurations"); + var references = GetObject(d, "dependencies") ?? new Dictionary(); + + // Get the list of files + var filesString = String.Join(Environment.NewLine, + Directory.GetFiles(projectDir, "*.cs", SearchOption.AllDirectories) + .Select(p => p.Substring(projectDir.Length).Trim(Path.DirectorySeparatorChar)) + .Where(p => !p.StartsWith("obj")) + .Select(p => String.Format( + @"", p))); + + // Add the config file if it's there + if (File.Exists(Path.Combine(projectDir, "packages.config"))) + { + filesString += ""; + } + + var packageReferences = references.Where(r => !String.IsNullOrEmpty((string)r.Value)) + .ToDictionary(k => k.Key, k => (string)k.Value); + + var projectReferences = references.Where(r => String.IsNullOrEmpty((string)r.Value)) + .Select(r => r.Key) + .ToArray(); + + + // HACK: Assume the packages folder is 2 up from the projectDir + string packagesDir = Path.GetFullPath(Path.Combine(projectDir, "..", "..", "packages")); + + foreach (var targetFramework in configs.Keys) + { + string id = (string)GetObject(projectMapping, projectName)[targetFramework]; + + var template = templates[targetFramework] + .Replace("{ProjectGuid}", id) + .Replace("{Name}", projectName) + .Replace("{Files}", filesString) + .Replace("{ProjectReferences}", BuildProjectReferences(projectReferences, targetFramework, projectMapping)) + .Replace("{References}", BuildReferences(packageReferences, packagesDir, targetFramework, GetCandidates(targetFramework))); + + if (targetFramework.StartsWith("k")) + { + template = template.Replace("{CSharpTargetsPath}", GetProjectKTargets(packagesDir)); + } + + string output = Path.Combine(projectDir, GetProjectFileName(projectName, targetFramework)); + + Log("Generated {0}", output); + + File.WriteAllText(output, template); + } + } + + private static string GetProjectKTargets(string packagesDir) + { + var projectK = Directory.GetDirectories(packagesDir, "ProjectK*") + .Select(p => new { Path = p, Build = Int32.Parse(p.Substring(p.LastIndexOf('-') + 1)) }) + .OrderByDescending(p => p.Build) + .FirstOrDefault(); + + if (projectK == null) + { + Warn("Project K targets aren't installed"); + return ""; + } + + return Path.Combine("..", "..", projectK.Path.Substring(projectK.Path.IndexOf("packages")), "Framework\\K\\v1.0\\ProjectK.CSharp.targets"); + } + + private static string GetProjectFileName(string projectName, string config) + { + return projectName + "." + config + ".csproj"; + } + + private static string BuildProjectReferences(string[] projectReferences, string config, IDictionary projectMapping) + { + if (projectReferences.Length == 0) + { + return ""; + } + + var sb = new StringBuilder(); + + foreach (var reference in projectReferences) + { + var info = GetObject(projectMapping, reference); + + if (info == null) + { + Warn("No project reference found for {0}", reference); + continue; + } + + string projectFileName = GetProjectFileName(reference, config); + string path = Path.Combine((string)info["path"], projectFileName); + + sb.AppendFormat(@" + {{{1}}} + {2} + ", path, info[config], reference); + } + + return sb.ToString(); + } + + private static string[] GetCandidates(string config) + { + if (config == "net45") + { + return new[] { "net45", "net40", "net35", "net20" }; + } + + return new[] { config }; + } + + private static string BuildReferences(IDictionary references, string packagesDir, string configName, string[] candidates) + { + if (references.Count == 0) + { + return ""; + } + + Log("Building package references for {0}", configName); + + var sb = new StringBuilder(); + + foreach (var reference in references) + { + var version = (string)reference.Value; + + string pattern = version.IndexOf("*") != -1 ? reference.Key + "*" : reference.Key + "." + reference.Value; + + var packageDir = Directory.GetDirectories(packagesDir, pattern).FirstOrDefault(); + + if (packageDir == null) + { + Warn(reference.Key + " = " + version + " ==> UNRESOLVED"); + continue; + } + + Log(reference.Key + " = " + version + " ==> " + packageDir); + + var candidate = candidates.Select(c => Path.Combine(packageDir, "lib", c)) + .FirstOrDefault(Directory.Exists); + + if (candidate == null) + { + Warn("Unable to find package reference for {0}, target framework = {1}", reference.Key, configName); + continue; + } + + var dlls = Directory.EnumerateFiles(candidate, "*.dll") + .Distinct() + .Where(File.Exists) + .ToList(); + + foreach (var dllPath in dlls) + { + sb.AppendFormat(@" + + False + ..\..\{1} + ", AssemblyName.GetAssemblyName(dllPath).FullName, dllPath.Substring(dllPath.IndexOf("packages"))); + } + } + + return sb.ToString(); + } + + private static IDictionary GetObject(IDictionary obj, string key) + { + object value; + if (obj.TryGetValue(key, out value)) + { + return value as IDictionary; + } + + return null; + } + } + } diff --git a/build/_k-restore.shade b/build/_k-restore.shade new file mode 100644 index 0000000000..0f20db0fc0 --- /dev/null +++ b/build/_k-restore.shade @@ -0,0 +1,7 @@ +@{/* + +k-restore + Restores nuget packages required for k projects. Downloads and executes k sdk tools. +*/} + +k command='restore' diff --git a/build/_k-standard-goals.shade b/build/_k-standard-goals.shade new file mode 100644 index 0000000000..b6a38ff7dd --- /dev/null +++ b/build/_k-standard-goals.shade @@ -0,0 +1,47 @@ +use namespace="System" +use namespace="System.IO" +use import="Files" + +default BASE_DIR='${Directory.GetCurrentDirectory()}' +default TARGET_DIR='${Path.Combine(BASE_DIR, "artifacts")}' +default BUILD_DIR='${Path.Combine(TARGET_DIR, "build")}' +default TEST_DIR='${Path.Combine(TARGET_DIR, "test")}' + +@{ + E("K_BUILD_VERSION", "t" + DateTime.UtcNow.ToString("yyMMddHHmmss")); +} + +#target-default target='default' + k-restore + k-generate-projects solutionPath='${BASE_DIR}' + +#target-dir-clean target='clean' + directory delete="${TARGET_DIR}" + +#build-clean target='clean' + k-clean each='var projectFile in Files.Include("src/**/project.json")' + +#build-compile target='compile' + k-build each='var projectFile in Files.Include("src/**/project.json")' + @{ + foreach (var nupkg in Files.Include(Path.Combine(BUILD_DIR, "*/*.nupkg"))) + { + File.Copy(nupkg, Path.Combine(BUILD_DIR, Path.GetFileName(nupkg)), true); + } + } + +#nuget-install target='install' description='Copy NuGet packages to local repo' + @{ + var HOME_DIR = E("HOME"); + if (string.IsNullOrEmpty(HOME_DIR)) + { + HOME_DIR = E("HOMEDRIVE") + E("HOMEPATH"); + } + } + copy sourceDir='${BUILD_DIR}' include='*.nupkg' outputDir='${Path.Combine(HOME_DIR, ".nuget")}' overwrite='${true}' + + +functions @{ + string E(string key) { return Environment.GetEnvironmentVariable(key); } + void E(string key, string value) { Environment.SetEnvironmentVariable(key, value); } +} diff --git a/build/_k.shade b/build/_k.shade new file mode 100644 index 0000000000..c0e216dcae --- /dev/null +++ b/build/_k.shade @@ -0,0 +1,31 @@ +@{/* + +k + Run klr commands in your project. Downloads and executes k sdk. + +kVersion='0.0.1-pre-30109-087' + May be passed to override the nuget package version holding xunit console runner. + +kProgram='...' + May be passed to override the path to the xunit program that will be executed + +command='' + +*/} + +default kLatestSuccessful='\\wsr-teamcity\Drops\ProjectK.Main\latest-successful\sdk' +default kVersion='' + +test if='string.IsNullOrEmpty(kVersion)' + for each='var file in System.IO.Directory.EnumerateFiles(kLatestSuccessful).Select(System.IO.Path.GetFileName)' + test if='file.StartsWith("ProjectK.") && file.EndsWith(".nupkg")' + - kVersion = file.Substring("ProjectK.".Length, file.Length - "ProjectK.".Length - ".nupkg".Length); + +default kProgram='packages/ProjectK.${kVersion}/tools/k.cmd' + +-// Download xunit from nuget sources if not already present +test if='!File.Exists(kProgram)' + log info='Installing ProjectK ${kVersion} from ${kLatestSuccessful}' + nuget-install package='ProjectK' packageVersion='${kVersion}' outputDir='packages' extra='-Source ${kLatestSuccessful}' + +exec program='${Path.GetFullPath(kProgram)}' commandline='${command}' diff --git a/build/k10.txt b/build/k10.txt new file mode 100644 index 0000000000..60c669f855 --- /dev/null +++ b/build/k10.txt @@ -0,0 +1,50 @@ + + + + + Debug + AnyCPU + {{ProjectGuid}} + Library + Properties + {Name} + {Name} + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + {Files} + + + + {ProjectReferences} + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj b/build/net45.txt similarity index 68% rename from src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj rename to build/net45.txt index 5109def60a..8d2e271f7b 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.csproj +++ b/build/net45.txt @@ -4,44 +4,47 @@ Debug AnyCPU - {A780873E-09F9-4E44-AE06-AF00C4E88E1E} + {{ProjectGuid}} Library Properties - Microsoft.AspNet.FeatureModel - Microsoft.AspNet.FeatureModel + {Name} + {Name} v4.5 512 + obj/net45 + AnyCPU true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug\net45 + DEBUG;TRACE;NET45 prompt 4 + AnyCPU pdbonly true - bin\Release\ - TRACE + bin\Release\net45 + TRACE;NET45 prompt 4 - bin\Release\Microsoft.AspNet.FeatureModel.XML + + + + {References} - - - - - + {Files} + - + {ProjectReferences} + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json new file mode 100644 index 0000000000..d2bb6fd770 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -0,0 +1,7 @@ +{ + "dependencies": {}, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs index 918d9f2b8f..32f3943634 100644 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -7,6 +7,7 @@ using System.Runtime.CompilerServices; namespace Microsoft.AspNet.FeatureModel.Implementation { + #if NET45 public abstract class NonGenericProxyBase { public readonly Type WrappedType; @@ -381,4 +382,5 @@ namespace Microsoft.AspNet.FeatureModel.Implementation } } -} + #endif +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs index 2181f686f8..a0f31a2306 100644 --- a/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceDictionary.cs @@ -42,11 +42,19 @@ namespace Microsoft.AspNet.FeatureModel { if (_featureByFeatureType.TryGetValue(actualType, out feature)) { - if (type.IsInstanceOfType(feature)) +#if NET45 + var isInstanceOfType = type.IsInstanceOfType(feature); +#else + var isInstanceOfType = feature != null && type == feature.GetType(); +#endif + + if (isInstanceOfType) { return feature; } +#if NET45 return Converter.Convert(type, actualType, feature); +#endif } } diff --git a/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs index 6f81904e03..4673cd9c44 100644 --- a/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/InterfaceObject.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.FeatureModel.Implementation; @@ -25,10 +26,12 @@ namespace Microsoft.AspNet.FeatureModel public object GetInterface(Type type) { +#if NET45 if (type.IsInstanceOfType(_instance)) { return _instance; } + foreach (var interfaceType in _instance.GetType().GetInterfaces()) { if (interfaceType.FullName == type.FullName) @@ -36,6 +39,7 @@ namespace Microsoft.AspNet.FeatureModel return Converter.Convert(interfaceType, type, _instance); } } +#endif return null; } diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj new file mode 100644 index 0000000000..776ade7f7e --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj @@ -0,0 +1,54 @@ + + + + + Debug + AnyCPU + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} + Library + Properties + Microsoft.AspNet.FeatureModel + Microsoft.AspNet.FeatureModel + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj new file mode 100644 index 0000000000..a9c22f4ba0 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {95AEE59D-BF51-47CB-A957-C03D909CC148} + Library + Properties + Microsoft.AspNet.FeatureModel + Microsoft.AspNet.FeatureModel + v4.5 + 512 + obj/net45 + + + AnyCPU + true + full + false + bin\Debug\net45 + DEBUG;TRACE;NET45 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\net45 + TRACE;NET45 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json new file mode 100644 index 0000000000..d2bb6fd770 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -0,0 +1,7 @@ +{ + "dependencies": {}, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj similarity index 61% rename from src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj rename to src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj index 048afaa76f..91f02062eb 100644 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.csproj +++ b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj @@ -1,53 +1,50 @@ - + - + Debug AnyCPU - {46D69EC9-7096-49D8-A184-A9BB5B2419A1} + {F677AA06-54DB-43E0-B193-CC04D1095A2B} Library Properties Microsoft.AspNet.HttpEnvironment Microsoft.AspNet.HttpEnvironment v4.5 512 + obj/K + AnyCPU true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug\K + DEBUG;TRACE;K10 prompt 4 + AnyCPU pdbonly true - bin\Release\ - TRACE + bin\Release\K + TRACE;K10 prompt 4 - bin\Release\Microsoft.AspNet.HttpEnvironment.XML - - - - - + + + - - {A780873E-09F9-4E44-AE06-AF00C4E88E1E} - Microsoft.AspNet.FeatureModel - + + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} + Microsoft.AspNet.FeatureModel + - - - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.HttpEnvironment/project.json b/src/Microsoft.AspNet.HttpEnvironment/project.json new file mode 100644 index 0000000000..bea3db51c3 --- /dev/null +++ b/src/Microsoft.AspNet.HttpEnvironment/project.json @@ -0,0 +1,9 @@ +{ + "dependencies": { + "Microsoft.AspNet.FeatureModel" : "" + }, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index d659efd69c..fcb2318f3d 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -4,9 +4,11 @@ namespace Microsoft.AspNet.HttpFeature { public interface IHttpConnection { +#if NET45 IPAddress RemoteIpAddress { get; set; } - int RemotePort { get; set; } IPAddress LocalIpAddress { get; set; } +#endif + int RemotePort { get; set; } int LocalPort { get; set; } bool IsLocal { get; set; } } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index 596462e28c..a08136b6aa 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,11 +1,15 @@ +#if NET45 using System.Security.Cryptography.X509Certificates; +#endif using System.Threading.Tasks; namespace Microsoft.AspNet.HttpFeature { public interface IHttpTransportLayerSecurity { +#if NET45 X509Certificate ClientCertificate { get; set; } +#endif Task LoadAsync(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index ad0374c7f9..d7b230df24 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,3 +1,4 @@ +#if NET45 using System.Net.WebSockets; using System.Threading.Tasks; @@ -9,3 +10,4 @@ namespace Microsoft.AspNet.HttpFeature Task AcceptAsync(); } } +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj new file mode 100644 index 0000000000..5bbb67dd94 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {9295515C-6603-46BB-92EB-1C5F6B0E84C9} + Library + Properties + Microsoft.AspNet.HttpFeature + Microsoft.AspNet.HttpFeature + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj similarity index 54% rename from src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj rename to src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj index 7b6ab541d0..dea0824cd3 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.csproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj @@ -1,59 +1,66 @@ - + - + Debug AnyCPU - {42309978-0661-41D8-8654-39453265C5F9} + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} Library Properties Microsoft.AspNet.HttpFeature Microsoft.AspNet.HttpFeature v4.5 512 + obj/net45 + AnyCPU true full false - bin\Debug\ - DEBUG;TRACE + bin\Debug\net45 + DEBUG;TRACE;NET45 prompt 4 + AnyCPU pdbonly true - bin\Release\ - TRACE + bin\Release\net45 + TRACE;NET45 prompt 4 - bin\Release\Microsoft.AspNet.HttpFeature.xml - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + + - + - + - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj new file mode 100644 index 0000000000..969ff37c3e --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj @@ -0,0 +1,65 @@ + + + + + Debug + AnyCPU + {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + obj/K + + + AnyCPU + true + full + false + bin\Debug\K + DEBUG;TRACE;K10 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\K + TRACE;K10 + prompt + 4 + + + + + + + + + + + + + + {E9AF7046-E24C-4071-B7AF-7981F2D1A613} + Microsoft.AspNet.FeatureModel + + {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} + Microsoft.AspNet.Abstractions + + {9295515C-6603-46BB-92EB-1C5F6B0E84C9} + Microsoft.AspNet.HttpFeature + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj new file mode 100644 index 0000000000..ff38272dce --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + obj/net45 + + + AnyCPU + true + full + false + bin\Debug\net45 + DEBUG;TRACE;NET45 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\net45 + TRACE;NET45 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + {95AEE59D-BF51-47CB-A957-C03D909CC148} + Microsoft.AspNet.FeatureModel + + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} + Microsoft.AspNet.Abstractions + + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} + Microsoft.AspNet.HttpFeature + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec deleted file mode 100644 index 1b6a2894c7..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.nuspec +++ /dev/null @@ -1,22 +0,0 @@ - - - $id$ - $version$ - $authors$ - $authors$ - $licenseUrl$ - $projectUrl$ - true - $title$ - $title$ - $tags$ - - - - - - - - - - diff --git a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs index 124f49e471..c8013ed522 100644 --- a/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.PipelineCore/Owin/OwinHttpEnvironment.cs @@ -3,7 +3,9 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using System.Net; +#if NET45 using System.Security.Cryptography.X509Certificates; +#endif using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature; @@ -117,24 +119,24 @@ namespace Microsoft.AspNet.PipelineCore.Owin { // TODO: } - +#if NET45 IPAddress IHttpConnection.RemoteIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } } - int IHttpConnection.RemotePort - { - get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } - set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } - } - IPAddress IHttpConnection.LocalIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } } +#endif + int IHttpConnection.RemotePort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } + set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } + } int IHttpConnection.LocalPort { @@ -152,13 +154,13 @@ namespace Microsoft.AspNet.PipelineCore.Owin { throw new NotImplementedException(); } - +#if NET45 X509Certificate IHttpTransportLayerSecurity.ClientCertificate { get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - +#endif Task IHttpTransportLayerSecurity.LoadAsync() { throw new NotImplementedException(); diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json new file mode 100644 index 0000000000..062ab51708 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -0,0 +1,11 @@ +{ + "dependencies": { + "Microsoft.AspNet.FeatureModel" : "", + "Microsoft.AspNet.Abstractions" : "", + "Microsoft.AspNet.HttpFeature" : "" + }, + "configurations": { + "net45": { }, + "k10" : { } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj index 98d1189ee4..5f11f27e55 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.csproj @@ -47,11 +47,14 @@ - - {A780873E-09F9-4E44-AE06-AF00C4E88E1E} - Microsoft.AspNet.FeatureModel + + {95aee59d-bf51-47cb-a957-c03d909cc148} + Microsoft.AspNet.FeatureModel.net45 + + + - \ No newline at end of file diff --git a/build/net45.txt b/build/net45.txt deleted file mode 100644 index 8d2e271f7b..0000000000 --- a/build/net45.txt +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Debug - AnyCPU - {{ProjectGuid}} - Library - Properties - {Name} - {Name} - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - {References} - - - {Files} - - - - {ProjectReferences} - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj index 3b3c436ff8..3c2308ba77 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj @@ -46,7 +46,10 @@ - + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs new file mode 100644 index 0000000000..885b7952d1 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs @@ -0,0 +1,19 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions.Owin; + +namespace Owin +{ + public static class OwinExtensions + { + public static void RunHttpContext(this IAppBuilder app, Func handler) + { + app.Run(context => + { + var httpContext = new OwinHttpContext(context); + + return handler(httpContext); + }); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs new file mode 100644 index 0000000000..2762319fcd --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs @@ -0,0 +1,175 @@ +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.Owin; + +namespace Microsoft.AspNet.Abstractions.Owin +{ + public class OwinHttpContext : HttpContext + { + private readonly IOwinContext _context; + private readonly HttpRequest _request; + private readonly HttpResponse _response; + + public OwinHttpContext(IOwinContext context) + { + _context = context; + _request = new OwinHttpRequest(this, context.Request); + _response = new OwinHttpResponse(this, context.Response); + } + + public override void Dispose() + { + + } + + public override object GetInterface(Type type) + { + return null; + } + + public override HttpRequest Request + { + get { return _request; } + } + + public override HttpResponse Response + { + get { return _response; } + } + + public override void SetInterface(Type type, object instance) + { + + } + + private class OwinHttpRequest : HttpRequest + { + private HttpContext _context; + private IOwinRequest _request; + + public OwinHttpRequest(HttpContext context, IOwinRequest request) + { + _context = context; + _request = request; + } + + public override Stream Body + { + get + { + return _request.Body; + } + set + { + _request.Body = value; + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override Microsoft.AspNet.Abstractions.PathString Path + { + get + { + return new Microsoft.AspNet.Abstractions.PathString(_request.Path.Value); + } + set + { + _request.Path = new Microsoft.Owin.PathString(value.Value); + } + } + + public override Microsoft.AspNet.Abstractions.PathString PathBase + { + get + { + return new Microsoft.AspNet.Abstractions.PathString(_request.PathBase.Value); + } + set + { + _request.PathBase = new Microsoft.Owin.PathString(value.Value); + } + } + + public override Microsoft.AspNet.Abstractions.QueryString QueryString + { + get + { + return new Microsoft.AspNet.Abstractions.QueryString(_request.QueryString.Value); + } + set + { + _request.QueryString = new Microsoft.Owin.QueryString(value.Value); + } + } + + public override Uri Uri + { + get { return _request.Uri; } + } + } + + private class OwinHttpResponse : HttpResponse + { + private readonly HttpContext _context; + private readonly IOwinResponse _response; + + public OwinHttpResponse(HttpContext context, IOwinResponse response) + { + _context = context; + _response = response; + } + + public override Stream Body + { + get + { + return _response.Body; + } + set + { + _response.Body = value; + } + } + + public override string ContentType + { + get + { + return _response.ContentType; + } + set + { + _response.ContentType = value; + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override int StatusCode + { + get + { + return _response.StatusCode; + } + set + { + _response.StatusCode = value; + } + } + + public override Task WriteAsync(string data) + { + return _response.WriteAsync(data); + } + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions.Owin/project.json b/src/Microsoft.AspNet.Abstractions.Owin/project.json new file mode 100644 index 0000000000..b2b9a4babd --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/project.json @@ -0,0 +1,11 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.AspNet.Abstractions": "" + }, + "configurations": { + "net45": { } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj index 3c2308ba77..1b1196a9e7 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj @@ -49,7 +49,7 @@ - + - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj deleted file mode 100644 index 1b1196a9e7..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.k10.csproj +++ /dev/null @@ -1,60 +0,0 @@ - - - - - Debug - AnyCPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} - Library - Properties - Microsoft.AspNet.Abstractions - Microsoft.AspNet.Abstractions - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj deleted file mode 100644 index d33c822788..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.net45.csproj +++ /dev/null @@ -1,64 +0,0 @@ - - - - - Debug - AnyCPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} - Library - Properties - Microsoft.AspNet.Abstractions - Microsoft.AspNet.Abstractions - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj deleted file mode 100644 index db4da7a2e6..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.k10.csproj +++ /dev/null @@ -1,57 +0,0 @@ - - - - - Debug - AnyCPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} - Library - Properties - Microsoft.AspNet.FeatureModel - Microsoft.AspNet.FeatureModel - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj deleted file mode 100644 index a9c22f4ba0..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.net45.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Library - Properties - Microsoft.AspNet.FeatureModel - Microsoft.AspNet.FeatureModel - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj deleted file mode 100644 index 89b30af727..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.k10.csproj +++ /dev/null @@ -1,58 +0,0 @@ - - - - - Debug - AnyCPU - {F677AA06-54DB-43E0-B193-CC04D1095A2B} - Library - Properties - Microsoft.AspNet.HttpEnvironment - Microsoft.AspNet.HttpEnvironment - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} - Microsoft.AspNet.FeatureModel - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj b/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj deleted file mode 100644 index 67cf5e091b..0000000000 --- a/src/Microsoft.AspNet.HttpEnvironment/Microsoft.AspNet.HttpEnvironment.net45.csproj +++ /dev/null @@ -1,62 +0,0 @@ - - - - - Debug - AnyCPU - {619C3A71-2D70-4387-8026-F414CAC8022B} - Library - Properties - Microsoft.AspNet.HttpEnvironment - Microsoft.AspNet.HttpEnvironment - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Microsoft.AspNet.FeatureModel - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj deleted file mode 100644 index f77d44a98f..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.k10.csproj +++ /dev/null @@ -1,67 +0,0 @@ - - - - - Debug - AnyCPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9} - Library - Properties - Microsoft.AspNet.HttpFeature - Microsoft.AspNet.HttpFeature - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj deleted file mode 100644 index dea0824cd3..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.net45.csproj +++ /dev/null @@ -1,71 +0,0 @@ - - - - - Debug - AnyCPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} - Library - Properties - Microsoft.AspNet.HttpFeature - Microsoft.AspNet.HttpFeature - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj deleted file mode 100644 index 3759126b6a..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.k10.csproj +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Debug - AnyCPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} - Library - Properties - Microsoft.AspNet.PipelineCore - Microsoft.AspNet.PipelineCore - v4.5 - 512 - obj/K - - - AnyCPU - true - full - false - bin\Debug\K - DEBUG;TRACE;K10 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\K - TRACE;K10 - prompt - 4 - - - - - - - - - - - - - - - - - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} - Microsoft.AspNet.FeatureModel - - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} - Microsoft.AspNet.Abstractions - - {9295515C-6603-46BB-92EB-1C5F6B0E84C9} - Microsoft.AspNet.HttpFeature - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj deleted file mode 100644 index ff38272dce..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ /dev/null @@ -1,72 +0,0 @@ - - - - - Debug - AnyCPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87} - Library - Properties - Microsoft.AspNet.PipelineCore - Microsoft.AspNet.PipelineCore - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45 - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45 - prompt - 4 - - - - - - - - - - - - - - - - - - - - - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Microsoft.AspNet.FeatureModel - - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} - Microsoft.AspNet.Abstractions - - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} - Microsoft.AspNet.HttpFeature - - - - - \ No newline at end of file From 6b3cd344398df1712553638be9e960eda9d7d2fa Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 26 Jan 2014 01:29:01 -0800 Subject: [PATCH 0014/1838] Skip the cache for KoreBuild --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index c38178cce8..683a09d87c 100644 --- a/build.cmd +++ b/build.cmd @@ -8,7 +8,7 @@ md .nuget :restore IF EXIST build goto run -.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages +.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache xcopy packages\KoreBuild\build build\ /Y .nuget\NuGet.exe install Sake -version 0.2 -o packages From 44de53593087795bd4cb609033d0fafdd3065b06 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 26 Jan 2014 01:30:58 -0800 Subject: [PATCH 0015/1838] Updated solution file. --- HttpAbstractions.sln | 108 +++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 9db8314362..d5bb318867 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -5,21 +5,21 @@ VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{D36288AF-8A0E-48DD-8AF8-15B72F91C70A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{659F2FD7-D44F-4953-A69D-94AF3D41BA21}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7A5C31E4-97FD-479F-8938-D818436ADFDD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{95AEE59D-BF51-47CB-A957-C03D909CC148}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{70095525-BD99-45F9-8A6A-3BD3503FC3EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{E9AF7046-E24C-4071-B7AF-7981F2D1A613}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{D3242B56-EA73-4F41-86A4-DF6C70271592}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{A6DEB0D3-982E-4A07-8EE7-39269F192AF7}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{9295515C-6603-46BB-92EB-1C5F6B0E84C9}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{3A586BF4-08D4-46E3-B74D-5D514A3B84CC}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{68A538BA-D542-49CB-9615-B4F5A4E78C87}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{A195DDE4-CFB0-4A6C-9798-10658236C97B}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D38DDB2B-1138-4F45-8A6A-9499E880F620}" EndProject @@ -27,7 +27,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -39,46 +39,46 @@ Global {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Debug|Any CPU.Build.0 = Debug|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C671AE3-1188-499F-A2A2-3A0B117B33CE}.Release|Any CPU.Build.0 = Release|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A}.Release|Any CPU.Build.0 = Release|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1}.Release|Any CPU.Build.0 = Release|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Debug|Any CPU.Build.0 = Debug|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.ActiveCfg = Release|Any CPU - {95AEE59D-BF51-47CB-A957-C03D909CC148}.Release|Any CPU.Build.0 = Release|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9AF7046-E24C-4071-B7AF-7981F2D1A613}.Release|Any CPU.Build.0 = Release|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7}.Release|Any CPU.Build.0 = Release|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9295515C-6603-46BB-92EB-1C5F6B0E84C9}.Release|Any CPU.Build.0 = Release|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87}.Release|Any CPU.Build.0 = Release|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B}.Release|Any CPU.Build.0 = Release|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.Build.0 = Debug|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.ActiveCfg = Release|Any CPU + {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.Build.0 = Release|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.Build.0 = Release|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.Build.0 = Release|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.Build.0 = Release|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.Build.0 = Release|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.Build.0 = Release|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.Build.0 = Release|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.Build.0 = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A}.Release|Any CPU.Build.0 = Release|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -86,14 +86,14 @@ Global GlobalSection(NestedProjects) = preSolution {8C671AE3-1188-499F-A2A2-3A0B117B33CE} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} {86942914-0334-4352-87ED-B971281C74E2} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} - {7D19BA93-ABFD-4D49-9AA9-DB55AF6BD6F1} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {95AEE59D-BF51-47CB-A957-C03D909CC148} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E9AF7046-E24C-4071-B7AF-7981F2D1A613} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {9295515C-6603-46BB-92EB-1C5F6B0E84C9} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {68A538BA-D542-49CB-9615-B4F5A4E78C87} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E31D45AC-70F3-47D4-9625-A4D8C6AA1B6B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {3D838D54-3F3B-4E5C-81DF-68875FDD2B7A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {D3242B56-EA73-4F41-86A4-DF6C70271592} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} EndGlobalSection EndGlobal From 724897d0ebd5bbf81886b2f47034adfe5c94ee9a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 26 Jan 2014 03:44:21 -0800 Subject: [PATCH 0016/1838] Added super hacky RawOwinHttpContext for K profile. --- HttpAbstractions.sln | 7 + ...Context.cs => MicrosoftOwinHttpContext.cs} | 8 +- .../OwinExtensions.cs | 6 +- .../RawOwinHttpContext.cs | 199 ++++++++++++++++++ .../project.json | 10 +- 5 files changed, 222 insertions(+), 8 deletions(-) rename src/Microsoft.AspNet.Abstractions.Owin/{OwinHttpContext.cs => MicrosoftOwinHttpContext.cs} (96%) create mode 100644 src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index d5bb318867..a2737cba10 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -29,6 +29,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.k10", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.k10.csproj", "{C5C104A4-EE38-4D77-AC77-DF599FD5443A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -79,6 +81,10 @@ Global {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.Build.0 = Debug|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.Build.0 = Release|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5C104A4-EE38-4D77-AC77-DF599FD5443A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -95,5 +101,6 @@ Global {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {C5C104A4-EE38-4D77-AC77-DF599FD5443A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/MicrosoftOwinHttpContext.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs rename to src/Microsoft.AspNet.Abstractions.Owin/MicrosoftOwinHttpContext.cs index 2762319fcd..c648b66a55 100644 --- a/src/Microsoft.AspNet.Abstractions.Owin/OwinHttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions.Owin/MicrosoftOwinHttpContext.cs @@ -1,4 +1,5 @@ -using System; +#if NET45 +using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; @@ -6,13 +7,13 @@ using Microsoft.Owin; namespace Microsoft.AspNet.Abstractions.Owin { - public class OwinHttpContext : HttpContext + public class MicrosoftOwinHttpContext : HttpContext { private readonly IOwinContext _context; private readonly HttpRequest _request; private readonly HttpResponse _response; - public OwinHttpContext(IOwinContext context) + public MicrosoftOwinHttpContext(IOwinContext context) { _context = context; _request = new OwinHttpRequest(this, context.Request); @@ -173,3 +174,4 @@ namespace Microsoft.AspNet.Abstractions.Owin } } } +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs index e203fdd00e..87788e5f93 100644 --- a/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions.Owin/OwinExtensions.cs @@ -1,4 +1,5 @@ -using System; +#if NET45 +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Owin; @@ -11,10 +12,11 @@ namespace Owin { app.Run(context => { - var httpContext = new OwinHttpContext(context); + var httpContext = new MicrosoftOwinHttpContext(context); return handler(httpContext); }); } } } +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs b/src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs new file mode 100644 index 0000000000..69ea2e695b --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions.Owin/RawOwinHttpContext.cs @@ -0,0 +1,199 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Owin +{ + public class RawOwinHttpContext : HttpContext + { + private readonly HttpRequest _request; + private readonly HttpResponse _response; + + public RawOwinHttpContext(IDictionary env) + { + _request = new RawOwinHttpRequest(this, env); + _response = new RawOwinHttpResponse(this, env); + } + + public override void Dispose() + { + + } + + public override object GetInterface(Type type) + { + return null; + } + + public override HttpRequest Request + { + get { return _request; } + } + + public override HttpResponse Response + { + get { return _response; } + } + + public override void SetInterface(Type type, object instance) + { + + } + + private class RawOwinHttpRequest : HttpRequest + { + private HttpContext _context; + private readonly IDictionary _env; + + public RawOwinHttpRequest(HttpContext context, IDictionary env) + { + _context = context; + _env = env; + } + + public override Stream Body + { + get + { + return (Stream)_env["owin.ResponseBody"]; + } + set + { + _env["owin.ResponseBody"] = value; + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override PathString Path + { + get + { + return new PathString((string)_env["owin.RequestPath"]); + } + set + { + _env["owin.RequestPath"] = value.Value; + } + } + + public override PathString PathBase + { + get + { + return new PathString((string)_env["owin.RequestPathBase"]); + } + set + { + _env["owin.RequestPathBase"] = value.Value; + } + } + + public override QueryString QueryString + { + get + { + return new QueryString((string)_env["owin.RequestQueryString"]); + } + set + { + _env["owin.RequestQueryString"] = value.Value; + } + } + + public override Uri Uri + { + get + { + // TODO: Implement this sometime + throw new NotImplementedException(); + } + } + } + + private class RawOwinHttpResponse : HttpResponse + { + private readonly HttpContext _context; + private readonly IDictionary _env; + + public RawOwinHttpResponse(HttpContext context, IDictionary env) + { + _context = context; + _env = env; + } + + public override Stream Body + { + get + { + return (Stream)_env["owin.ResponseBody"]; + } + set + { + _env["owin.ResponseBody"] = value; + } + } + + public override string ContentType + { + get + { + return GetHeader("Content-Type"); + } + set + { + SetHeader("Content-Type", value); + } + } + + public override HttpContext HttpContext + { + get { return _context; } + } + + public override int StatusCode + { + get + { + return (int)_env["owin.ResponseStatusCode"]; + } + set + { + _env["owin.ResponseStatusCode"] = value; + } + } + + public override Task WriteAsync(string data) + { + var bytes = Encoding.UTF8.GetBytes(data); + + return Body.WriteAsync(bytes, 0, bytes.Length); + } + + private void SetHeader(string name, string value) + { + var headers = (IDictionary)_env["owin.ResponseHeaders"]; + + headers[name] = new[] { value }; + } + + private string GetHeader(string name) + { + var headers = (IDictionary)_env["owin.ResponseHeaders"]; + + string[] values; + if (headers.TryGetValue(name, out values) && values.Length > 0) + { + return values[0]; + } + + return null; + } + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions.Owin/project.json b/src/Microsoft.AspNet.Abstractions.Owin/project.json index b2b9a4babd..991e11d3d8 100644 --- a/src/Microsoft.AspNet.Abstractions.Owin/project.json +++ b/src/Microsoft.AspNet.Abstractions.Owin/project.json @@ -1,11 +1,15 @@ { "version": "0.1-alpha-*", "dependencies": { - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", "Microsoft.AspNet.Abstractions": "" }, "configurations": { - "net45": { } + "net45": { + "dependencies": { + "Owin": "1.0", + "Microsoft.Owin": "2.1.0" + } + }, + "k10": {} } } \ No newline at end of file From f7a4db4ae10f3bc888fbd1bbf34ad082df4fa4ab Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 24 Jan 2014 12:37:47 -0800 Subject: [PATCH 0017/1838] Roughing out more abstractions --- HttpAbstractions.sln | 6 +- .../CookieOptions.cs | 48 + .../HostString.cs | 197 ++++ .../HttpRequest.cs | 106 ++- .../IFormCollection.cs | 9 + .../IHeaderDictionary.cs | 69 ++ .../IReadableStringCollection.cs | 42 + .../PathString.cs | 4 +- .../QueryString.cs | 4 +- .../Collections/FormCollection.cs | 20 + .../Collections/HeaderDictionary.cs | 287 ++++++ .../Collections/ReadableStringCollection.cs | 84 ++ .../Collections/RequestCookieCollection.cs | 60 ++ .../Collections/ResponseCookieCollection.cs | 140 +++ .../DefaultHttpRequest.cs | 80 ++ .../Infrastructure/Constants.cs | 25 + .../Infrastructure/ParsingHelpers.cs | 862 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 8 +- ...Microsoft.AspNet.PipelineCore.Tests.csproj | 13 + 19 files changed, 2048 insertions(+), 16 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/CookieOptions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/HostString.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IFormCollection.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs create mode 100644 src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index a2737cba10..d0bb133101 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -21,11 +21,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{D38DDB2B-1138-4F45-8A6A-9499E880F620}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{1D737C82-F2F1-40B6-AE95-A3D878612E91}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.csproj", "{86942914-0334-4352-87ED-B971281C74E2}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject diff --git a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs new file mode 100644 index 0000000000..c8505cae1b --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs @@ -0,0 +1,48 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Options used to create a new cookie. + /// + public class CookieOptions + { + /// + /// Creates a default cookie with a path of '/'. + /// + public CookieOptions() + { + Path = "/"; + } + + /// + /// Gets or sets the domain to associate the cookie with. + /// + /// The domain to associate the cookie with. + public string Domain { get; set; } + + /// + /// Gets or sets the cookie path. + /// + /// The cookie path. + public string Path { get; set; } + + /// + /// Gets or sets the expiration date and time for the cookie. + /// + /// The expiration date and time for the cookie. + public DateTime? Expires { get; set; } + + /// + /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)that is, over HTTPS only. + /// + /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. + public bool Secure { get; set; } + + /// + /// Gets or sets a value that indicates whether a cookie is accessible by client-side script. + /// + /// true if a cookie is accessible by client-side script; otherwise, false. + public bool HttpOnly { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Abstractions/HostString.cs new file mode 100644 index 0000000000..0847c7421e --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/HostString.cs @@ -0,0 +1,197 @@ +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in + /// HTTP headers. + /// + public struct HostString : IEquatable + { + private readonly string _value; + + /// + /// Creates a new HostString without modification. The value should be Unicode rather than punycode, and may have a port. + /// IPv4 and IPv6 addresses are also allowed, and also may have ports. + /// + /// + public HostString(string value) + { + _value = value; + } + + /// + /// Returns the original value from the constructor. + /// + public string Value + { + get { return _value; } + } + + /// + /// Returns the value as normalized by ToUriComponent(). + /// + /// + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Returns the value properly formatted and encoded for use in a URI in a HTTP header. + /// Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. + /// + /// + [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a uri is returned.")] + public string ToUriComponent() + { + int index; + if (string.IsNullOrEmpty(_value)) + { + return string.Empty; + } + else if (_value.IndexOf('[') >= 0) + { + // IPv6 in brackets [::1], maybe with port + return _value; + } + else if ((index = _value.IndexOf(':')) >= 0 + && index < _value.Length - 1 + && _value.IndexOf(':', index + 1) >= 0) + { + // IPv6 without brackets ::1 is the only type of host with 2 or more colons + return "[" + _value + "]"; + } + else if (index >= 0) + { + // Has a port + string port = _value.Substring(index); + IdnMapping mapping = new IdnMapping(); + return mapping.GetAscii(_value, 0, index) + port; + } + else + { + IdnMapping mapping = new IdnMapping(); + return mapping.GetAscii(_value); + } + } + + /// + /// Creates a new HostString from the given uri component. + /// Any punycode will be converted to Unicode. + /// + /// + /// + [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a uri is provided.")] + public static HostString FromUriComponent(string uriComponent) + { + if (!string.IsNullOrEmpty(uriComponent)) + { + int index; + if (uriComponent.IndexOf('[') >= 0) + { + // IPv6 in brackets [::1], maybe with port + } + else if ((index = uriComponent.IndexOf(':')) >= 0 + && index < uriComponent.Length - 1 + && uriComponent.IndexOf(':', index + 1) >= 0) + { + // IPv6 without brackets ::1 is the only type of host with 2 or more colons + } + else if (uriComponent.IndexOf("xn--", StringComparison.Ordinal) >= 0) + { + // Contains punycode + if (index >= 0) + { + // Has a port + string port = uriComponent.Substring(index); + IdnMapping mapping = new IdnMapping(); + uriComponent = mapping.GetUnicode(uriComponent, 0, index) + port; + } + else + { + IdnMapping mapping = new IdnMapping(); + uriComponent = mapping.GetUnicode(uriComponent); + } + } + } + return new HostString(uriComponent); + } + + /// + /// Creates a new HostString from the host and port of the give Uri instance. + /// Punycode will be converted to Unicode. + /// + /// + /// + public static HostString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + return new HostString(uri.GetComponents( +#if !NET40 + UriComponents.NormalizedHost | // Always convert punycode to Unicode. +#endif + UriComponents.HostAndPort, UriFormat.Unescaped)); + } + + /// + /// Compares the equality of the Value property, ignoring case. + /// + /// + /// + public bool Equals(HostString other) + { + return string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Compares against the given object only if it is a HostString. + /// + /// + /// + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is HostString && Equals((HostString)obj); + } + + /// + /// Gets a hash code for the value. + /// + /// + public override int GetHashCode() + { + return (_value != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(_value) : 0); + } + + /// + /// Compares the two instances for equality. + /// + /// + /// + /// + public static bool operator ==(HostString left, HostString right) + { + return left.Equals(right); + } + + /// + /// Compares the two instances for inequality. + /// + /// + /// + /// + public static bool operator !=(HostString left, HostString right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index 7277195cc7..40a7860af5 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Threading; namespace Microsoft.AspNet.Abstractions { @@ -9,10 +10,113 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpContext HttpContext { get; } - public abstract Uri Uri { get; } + /// + /// Gets or set the HTTP method. + /// + /// The HTTP method. + public abstract string Method { get; set; } + + /// + /// Gets or set the HTTP request scheme from owin.RequestScheme. + /// + /// The HTTP request scheme from owin.RequestScheme. + public abstract string Scheme { get; set; } + + /// + /// Returns true if the owin.RequestScheme is https. + /// + /// true if this request is using https; otherwise, false. + public abstract bool IsSecure { get; } + + /// + /// Gets or set the Host header. May include the port. + /// + /// The Host header. + public abstract HostString Host { get; set; } + + /// + /// Gets or set the owin.RequestPathBase. + /// + /// The owin.RequestPathBase. public abstract PathString PathBase { get; set; } + + /// + /// Gets or set the request path from owin.RequestPath. + /// + /// The request path from owin.RequestPath. public abstract PathString Path { get; set; } + + /// + /// Gets or set the query string from owin.RequestQueryString. + /// + /// The query string from owin.RequestQueryString. public abstract QueryString QueryString { get; set; } + + /// + /// Gets the query value collection parsed from owin.RequestQueryString. + /// + /// The query value collection parsed from owin.RequestQueryString. + public abstract IReadableStringCollection Query { get; } + + /// + /// Gets the uniform resource identifier (URI) associated with the request. + /// + /// The uniform resource identifier (URI) associated with the request. + public abstract Uri Uri { get; } + + /// + /// Gets or set the owin.RequestProtocol. + /// + /// The owin.RequestProtocol. + public abstract string Protocol { get; set; } + + /// + /// Gets the request headers. + /// + /// The request headers. + public abstract IHeaderDictionary Headers { get; } + + /// + /// Gets the collection of Cookies for this request. + /// + /// The collection of Cookies for this request. + public abstract IReadableStringCollection Cookies { get; } + + /// + /// Gets or sets the Content-Type header. + /// + /// The Content-Type header. + // (TODO header conventions?) public abstract string ContentType { get; set; } + + /// + /// Gets or sets the Cache-Control header. + /// + /// The Cache-Control header. + // (TODO header conventions?) public abstract string CacheControl { get; set; } + + /// + /// Gets or sets the Media-Type header. + /// + /// The Media-Type header. + // (TODO header conventions?) public abstract string MediaType { get; set; } + + /// + /// Gets or set the Accept header. + /// + /// The Accept header. + // (TODO header conventions?) public abstract string Accept { get; set; } + + /// + /// Gets or set the owin.RequestBody Stream. + /// + /// The owin.RequestBody Stream. public abstract Stream Body { get; set; } + + /// + /// Gets or sets the cancellation token for the request. + /// + /// The cancellation token for the request. + public abstract CancellationToken CallCanceled { get; set; } + } } diff --git a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs new file mode 100644 index 0000000000..56862e6be6 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs @@ -0,0 +1,9 @@ +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Contains the parsed form values. + /// + public interface IFormCollection : IReadableStringCollection + { + } +} diff --git a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs new file mode 100644 index 0000000000..7039b8b87e --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs @@ -0,0 +1,69 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Represents request and response headers + /// + public interface IHeaderDictionary : IReadableStringCollection, IDictionary + { + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a single string or null if the key is not present. + new string this[string key] { get; set; } + + /// + /// Get the associated values from the collection separated into individual values. + /// Quoted values will not be split, and the quotes will be removed. + /// + /// The header name. + /// the associated values from the collection separated into individual values, or null if the key is not present. + IList GetCommaSeparatedValues(string key); + + /// + /// Add a new value. Appends to the header if already present + /// + /// The header name. + /// The header value. + void Append(string key, string value); + + /// + /// Add new values. Each item remains a separate array entry. + /// + /// The header name. + /// The header values. + void AppendValues(string key, params string[] values); + + /// + /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// + /// The header name. + /// The header values. + void AppendCommaSeparatedValues(string key, params string[] values); + + /// + /// Sets a specific header value. + /// + /// The header name. + /// The header value. + [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Set", Justification = "Re-evaluate later.")] + void Set(string key, string value); + + /// + /// Sets the specified header values without modification. + /// + /// The header name. + /// The header values. + void SetValues(string key, params string[] values); + + /// + /// Quotes any values containing comas, and then coma joins all of the values. + /// + /// The header name. + /// The header values. + void SetCommaSeparatedValues(string key, params string[] values); + } +} diff --git a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs new file mode 100644 index 0000000000..dc3f72c769 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs @@ -0,0 +1,42 @@ +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// Accessors for headers, query, forms, etc. + /// + public interface IReadableStringCollection : IEnumerable> + { + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + string this[string key] { get; } + + // Joined + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Re-evaluate later.")] + string Get(string key); + + // Joined + + /// + /// Get the associated values from the collection in their original format. + /// Returns null if the key is not present. + /// + /// + /// + IList GetValues(string key); + + // Raw + } +} diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs index 8cfab5912d..c497d40bf3 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -1,6 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; +using System; using System.Linq; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index e80f5eedcf..9d96419788 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -1,6 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; +using System; namespace Microsoft.AspNet.Abstractions { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs new file mode 100644 index 0000000000..7054d36350 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNet.Abstractions; +using System.Collections.Generic; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// Contains the parsed form values. + /// + public class FormCollection : ReadableStringCollection, IFormCollection + { + /// + /// Initializes a new instance of the class. + /// + /// The store for the form. + public FormCollection(IDictionary store) + : base(store) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs new file mode 100644 index 0000000000..8847fa66fc --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -0,0 +1,287 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. + /// + public class HeaderDictionary : IHeaderDictionary + { + /// + /// Initializes a new instance of the class. + /// + /// The underlying data store. + public HeaderDictionary(IDictionary store) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + + Store = store; + } + + private IDictionary Store { get; set; } + + /// + /// Gets an that contains the keys in the ;. + /// + /// An that contains the keys in the . + public ICollection Keys + { + get { return Store.Keys; } + } + + /// + /// + /// + public ICollection Values + { + get { return Store.Values; } + } + + /// + /// Gets the number of elements contained in the ;. + /// + /// The number of elements contained in the . + public int Count + { + get { return Store.Count; } + } + + /// + /// Gets a value that indicates whether the is in read-only mode. + /// + /// true if the is in read-only mode; otherwise, false. + public bool IsReadOnly + { + get { return Store.IsReadOnly; } + } + + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a single string or null if the key is not present. + public string this[string key] + { + get { return Get(key); } + set { Set(key, value); } + } + + /// + /// Throws KeyNotFoundException if the key is not present. + /// + /// The header name. + /// + string[] IDictionary.this[string key] + { + get { return Store[key]; } + set { Store[key] = value; } + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + public IEnumerator> GetEnumerator() + { + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + /// Get the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a single string or null if the key is not present. + public string Get(string key) + { + return ParsingHelpers.GetHeader(Store, key); + } + + /// + /// Get the associated values from the collection without modification. + /// + /// The header name. + /// the associated value from the collection without modification, or null if the key is not present. + public IList GetValues(string key) + { + return ParsingHelpers.GetHeaderUnmodified(Store, key); + } + + /// + /// Get the associated values from the collection separated into individual values. + /// Quoted values will not be split, and the quotes will be removed. + /// + /// The header name. + /// the associated values from the collection separated into individual values, or null if the key is not present. + public IList GetCommaSeparatedValues(string key) + { + IEnumerable values = ParsingHelpers.GetHeaderSplit(Store, key); + return values == null ? null : values.ToList(); + } + + /// + /// Add a new value. Appends to the header if already present + /// + /// The header name. + /// The header value. + public void Append(string key, string value) + { + ParsingHelpers.AppendHeader(Store, key, value); + } + + /// + /// Add new values. Each item remains a separate array entry. + /// + /// The header name. + /// The header values. + public void AppendValues(string key, params string[] values) + { + ParsingHelpers.AppendHeaderUnmodified(Store, key, values); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// + /// The header name. + /// The header values. + public void AppendCommaSeparatedValues(string key, params string[] values) + { + ParsingHelpers.AppendHeaderJoined(Store, key, values); + } + + /// + /// Sets a specific header value. + /// + /// The header name. + /// The header value. + public void Set(string key, string value) + { + ParsingHelpers.SetHeader(Store, key, value); + } + + /// + /// Sets the specified header values without modification. + /// + /// The header name. + /// The header values. + public void SetValues(string key, params string[] values) + { + ParsingHelpers.SetHeaderUnmodified(Store, key, values); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values. + /// + /// The header name. + /// The header values. + public void SetCommaSeparatedValues(string key, params string[] values) + { + ParsingHelpers.SetHeaderJoined(Store, key, values); + } + + /// + /// Adds the given header and values to the collection. + /// + /// The header name. + /// The header values. + public void Add(string key, string[] value) + { + Store.Add(key, value); + } + + /// + /// Determines whether the contains a specific key. + /// + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + return Store.ContainsKey(key); + } + + /// + /// Removes the given header from the collection. + /// + /// The header name. + /// true if the specified object was removed from the collection; otherwise, false. + public bool Remove(string key) + { + return Store.Remove(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out string[] value) + { + return Store.TryGetValue(key, out value); + } + + /// + /// Adds a new list of items to the collection. + /// + /// The item to add. + public void Add(KeyValuePair item) + { + Store.Add(item); + } + + /// + /// Clears the entire list of objects. + /// + public void Clear() + { + Store.Clear(); + } + + /// + /// Returns a value indicating whether the specified object occurs within this collection. + /// + /// The item. + /// true if the specified object occurs within this collection; otherwise, false. + public bool Contains(KeyValuePair item) + { + return Store.Contains(item); + } + + /// + /// Copies the elements to a one-dimensional Array instance at the specified index. + /// + /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The zero-based index in at which copying begins. + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + Store.CopyTo(array, arrayIndex); + } + + /// + /// Removes the given item from the the collection. + /// + /// The item. + /// true if the specified object was removed from the collection; otherwise, false. + public bool Remove(KeyValuePair item) + { + return Store.Remove(item); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs new file mode 100644 index 0000000000..f06a8aa5a0 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -0,0 +1,84 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// Accessors for query, forms, etc. + /// + public class ReadableStringCollection : IReadableStringCollection + { + /// + /// Create a new wrapper + /// + /// + public ReadableStringCollection(IDictionary store) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + + Store = store; + } + + private IDictionary Store { get; set; } + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + public string this[string key] + { + get { return Get(key); } + } + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// + public string Get(string key) + { + return ParsingHelpers.GetJoinedValue(Store, key); + } + + /// + /// Get the associated values from the collection in their original format. + /// Returns null if the key is not present. + /// + /// + /// + public IList GetValues(string key) + { + string[] values; + Store.TryGetValue(key, out values); + return values; + } + + /// + /// + /// + /// + public IEnumerator> GetEnumerator() + { + return Store.GetEnumerator(); + } + + /// + /// + /// + /// + IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs new file mode 100644 index 0000000000..91b1577f28 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs @@ -0,0 +1,60 @@ +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// A wrapper for the request Cookie header + /// + public class RequestCookieCollection : IEnumerable> + { + /// + /// Create a new wrapper + /// + /// + public RequestCookieCollection(IDictionary store) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + + Store = store; + } + + private IDictionary Store { get; set; } + + /// + /// Returns null rather than throwing KeyNotFoundException + /// + /// + /// + public string this[string key] + { + get + { + string value; + Store.TryGetValue(key, out value); + return value; + } + } + + /// + /// + /// + /// + public IEnumerator> GetEnumerator() + { + return Store.GetEnumerator(); + } + + /// + /// + /// + /// + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs new file mode 100644 index 0000000000..78703285cf --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs @@ -0,0 +1,140 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + /// + /// A wrapper for the response Set-Cookie header + /// + public class ResponseCookieCollection + { + /// + /// Create a new wrapper + /// + /// + public ResponseCookieCollection(IHeaderDictionary headers) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + + Headers = headers; + } + + private IHeaderDictionary Headers { get; set; } + + /// + /// Add a new cookie and value + /// + /// + /// + public void Append(string key, string value) + { + Headers.AppendValues(Constants.Headers.SetCookie, Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(value) + "; path=/"); + } + + /// + /// Add a new cookie + /// + /// + /// + /// + public void Append(string key, string value, CookieOptions options) + { + if (options == null) + { + throw new ArgumentNullException("options"); + } + + bool domainHasValue = !string.IsNullOrEmpty(options.Domain); + bool pathHasValue = !string.IsNullOrEmpty(options.Path); + bool expiresHasValue = options.Expires.HasValue; + + string setCookieValue = string.Concat( + Uri.EscapeDataString(key), + "=", + Uri.EscapeDataString(value ?? string.Empty), + !domainHasValue ? null : "; domain=", + !domainHasValue ? null : options.Domain, + !pathHasValue ? null : "; path=", + !pathHasValue ? null : options.Path, + !expiresHasValue ? null : "; expires=", + !expiresHasValue ? null : options.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss ", CultureInfo.InvariantCulture) + "GMT", + !options.Secure ? null : "; secure", + !options.HttpOnly ? null : "; HttpOnly"); + Headers.AppendValues("Set-Cookie", setCookieValue); + } + + /// + /// Sets an expired cookie + /// + /// + public void Delete(string key) + { + Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + + var deleteCookies = new[] { Uri.EscapeDataString(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; + IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + if (existingValues == null || existingValues.Count == 0) + { + Headers.SetValues(Constants.Headers.SetCookie, deleteCookies); + } + else + { + Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); + } + } + + /// + /// Sets an expired cookie + /// + /// + /// + public void Delete(string key, CookieOptions options) + { + if (options == null) + { + throw new ArgumentNullException("options"); + } + + bool domainHasValue = !string.IsNullOrEmpty(options.Domain); + bool pathHasValue = !string.IsNullOrEmpty(options.Path); + + Func rejectPredicate; + if (domainHasValue) + { + rejectPredicate = value => + value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.IndexOf("domain=" + options.Domain, StringComparison.OrdinalIgnoreCase) != -1; + } + else if (pathHasValue) + { + rejectPredicate = value => + value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.IndexOf("path=" + options.Path, StringComparison.OrdinalIgnoreCase) != -1; + } + else + { + rejectPredicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + } + + IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + if (existingValues != null) + { + Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); + } + + Append(key, string.Empty, new CookieOptions + { + Path = options.Path, + Domain = options.Domain, + Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc), + }); + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 73860a9f32..4a5be161e2 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -70,5 +70,85 @@ namespace Microsoft.AspNet.PipelineCore get { return IHttpRequest.Body; } set { IHttpRequest.Body = value; } } + + public override string Method + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override string Scheme + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override bool IsSecure + { + get { throw new NotImplementedException(); } + } + + public override HostString Host + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override IReadableStringCollection Query + { + get { throw new NotImplementedException(); } + } + + public override string Protocol + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } + + public override IHeaderDictionary Headers + { + get { throw new NotImplementedException(); } + } + + public override IReadableStringCollection Cookies + { + get { throw new NotImplementedException(); } + } + + public override System.Threading.CancellationToken CallCanceled + { + get + { + throw new NotImplementedException(); + } + set + { + throw new NotImplementedException(); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs new file mode 100644 index 0000000000..114ae660e3 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Abstractions.Infrastructure +{ + internal static class Constants + { + internal const string Https = "HTTPS"; + + internal const string HttpDateFormat = "r"; + + internal static class Headers + { + internal const string ContentType = "Content-Type"; + internal const string CacheControl = "Cache-Control"; + internal const string MediaType = "Media-Type"; + internal const string Accept = "Accept"; + internal const string Host = "Host"; + internal const string ETag = "ETag"; + internal const string Location = "Location"; + internal const string ContentLength = "Content-Length"; + internal const string SetCookie = "Set-Cookie"; + internal const string Expires = "Expires"; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs new file mode 100644 index 0000000000..204b3cda0e --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -0,0 +1,862 @@ +using Microsoft.AspNet.Abstractions; +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.AspNet.PipelineCore.Infrastructure +{ + internal struct HeaderSegment : IEquatable + { + private readonly StringSegment _formatting; + private readonly StringSegment _data; + + // + // Initializes a new instance of the class. + // + public HeaderSegment(StringSegment formatting, StringSegment data) + { + _formatting = formatting; + _data = data; + } + + public StringSegment Formatting + { + get { return _formatting; } + } + + public StringSegment Data + { + get { return _data; } + } + + #region Equality members + + public bool Equals(HeaderSegment other) + { + return _formatting.Equals(other._formatting) && _data.Equals(other._data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegment && Equals((HeaderSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); + } + } + + public static bool operator ==(HeaderSegment left, HeaderSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegment left, HeaderSegment right) + { + return !left.Equals(right); + } + + #endregion + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct HeaderSegmentCollection : IEnumerable, IEquatable + { + private readonly string[] _headers; + + public HeaderSegmentCollection(string[] headers) + { + _headers = headers; + } + + #region Equality members + + public bool Equals(HeaderSegmentCollection other) + { + return Equals(_headers, other._headers); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegmentCollection && Equals((HeaderSegmentCollection)obj); + } + + public override int GetHashCode() + { + return (_headers != null ? _headers.GetHashCode() : 0); + } + + public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return !left.Equals(right); + } + + #endregion + + public Enumerator GetEnumerator() + { + return new Enumerator(_headers); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + internal struct Enumerator : IEnumerator + { + private readonly string[] _headers; + private int _index; + + private string _header; + private int _headerLength; + private int _offset; + + private int _leadingStart; + private int _leadingEnd; + private int _valueStart; + private int _valueEnd; + private int _trailingStart; + + private Mode _mode; + + private static readonly string[] NoHeaders = new string[0]; + + public Enumerator(string[] headers) + { + _headers = headers ?? NoHeaders; + _header = string.Empty; + _headerLength = -1; + _index = -1; + _offset = -1; + _leadingStart = -1; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + _mode = Mode.Leading; + } + + private enum Mode + { + Leading, + Value, + ValueQuoted, + Trailing, + Produce, + } + + private enum Attr + { + Value, + Quote, + Delimiter, + Whitespace + } + + public HeaderSegment Current + { + get + { + return new HeaderSegment( + new StringSegment(_header, _leadingStart, _leadingEnd - _leadingStart), + new StringSegment(_header, _valueStart, _valueEnd - _valueStart)); + } + } + + object IEnumerator.Current + { + get { return Current; } + } + + public void Dispose() + { + } + + public bool MoveNext() + { + while (true) + { + if (_mode == Mode.Produce) + { + _leadingStart = _trailingStart; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + if (_offset == _headerLength && + _leadingStart != -1 && + _leadingStart != _offset) + { + // Also produce trailing whitespace + _leadingEnd = _offset; + return true; + } + _mode = Mode.Leading; + } + + // if end of a string + if (_offset == _headerLength) + { + ++_index; + _offset = -1; + _leadingStart = 0; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + // if that was the last string + if (_index == _headers.Length) + { + // no more move nexts + return false; + } + + // grab the next string + _header = _headers[_index] ?? string.Empty; + _headerLength = _header.Length; + } + while (true) + { + ++_offset; + char ch = _offset == _headerLength ? (char)0 : _header[_offset]; + // todo - array of attrs + Attr attr = char.IsWhiteSpace(ch) ? Attr.Whitespace : ch == '\"' ? Attr.Quote : (ch == ',' || ch == (char)0) ? Attr.Delimiter : Attr.Value; + + switch (_mode) + { + case Mode.Leading: + switch (attr) + { + case Attr.Delimiter: + _leadingEnd = _offset; + _mode = Mode.Produce; + break; + case Attr.Quote: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Value: + switch (attr) + { + case Attr.Quote: + _mode = Mode.ValueQuoted; + break; + case Attr.Delimiter: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + break; + case Attr.Value: + // more + break; + case Attr.Whitespace: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Trailing; + break; + } + break; + case Mode.ValueQuoted: + switch (attr) + { + case Attr.Quote: + _mode = Mode.Value; + break; + case Attr.Delimiter: + if (ch == (char)0) + { + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + } + break; + case Attr.Value: + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Trailing: + switch (attr) + { + case Attr.Delimiter: + _mode = Mode.Produce; + break; + case Attr.Quote: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + } + if (_mode == Mode.Produce) + { + return true; + } + } + } + } + + public void Reset() + { + _index = 0; + _offset = 0; + _leadingStart = 0; + _leadingEnd = 0; + _valueStart = 0; + _valueEnd = 0; + } + } + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct StringSegment : IEquatable + { + private readonly string _buffer; + private readonly int _offset; + private readonly int _count; + + // + // Initializes a new instance of the class. + // + public StringSegment(string buffer, int offset, int count) + { + _buffer = buffer; + _offset = offset; + _count = count; + } + + public string Buffer + { + get { return _buffer; } + } + + public int Offset + { + get { return _offset; } + } + + public int Count + { + get { return _count; } + } + + public string Value + { + get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } + } + + public bool HasValue + { + get { return _offset != -1 && _count != 0 && _buffer != null; } + } + + #region Equality members + + public bool Equals(StringSegment other) + { + return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is StringSegment && Equals((StringSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ _offset; + hashCode = (hashCode * 397) ^ _count; + return hashCode; + } + } + + public static bool operator ==(StringSegment left, StringSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(StringSegment left, StringSegment right) + { + return !left.Equals(right); + } + + #endregion + + public bool StartsWith(string text, StringComparison comparisonType) + { + if (text == null) + { + throw new ArgumentNullException("text"); + } + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public bool EndsWith(string text, StringComparison comparisonType) + { + if (text == null) + { + throw new ArgumentNullException("text"); + } + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; + } + + public bool Equals(string text, StringComparison comparisonType) + { + if (text == null) + { + throw new ArgumentNullException("text"); + } + int textLength = text.Length; + if (!HasValue || _count != textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public string Substring(int offset, int length) + { + return _buffer.Substring(_offset + offset, length); + } + + public StringSegment Subsegment(int offset, int length) + { + return new StringSegment(_buffer, _offset + offset, length); + } + + public override string ToString() + { + return Value ?? string.Empty; + } + } + + internal static partial class ParsingHelpers + { + private static readonly Action AddCookieCallback = (name, value, state) => + { + var dictionary = (IDictionary)state; + if (!dictionary.ContainsKey(name)) + { + dictionary.Add(name, value); + } + }; + + private static readonly char[] SemicolonAndComma = new[] { ';', ',' }; + + internal static IDictionary GetCookies(HttpRequest request) + { + var cookies = request.Get>("Microsoft.Owin.Cookies#dictionary"); + if (cookies == null) + { + cookies = new Dictionary(StringComparer.Ordinal); + request.Set("Microsoft.Owin.Cookies#dictionary", cookies); + } + + string text = GetHeader(request.Headers, "Cookie"); + if (request.Get("Microsoft.Owin.Cookies#text") != text) + { + cookies.Clear(); + ParseDelimited(text, SemicolonAndComma, AddCookieCallback, cookies); + request.Set("Microsoft.Owin.Cookies#text", text); + } + return cookies; + } + + internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) + { + int textLength = text.Length; + int equalIndex = text.IndexOf('='); + if (equalIndex == -1) + { + equalIndex = textLength; + } + int scanIndex = 0; + while (scanIndex < textLength) + { + int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); + if (delimiterIndex == -1) + { + delimiterIndex = textLength; + } + if (equalIndex < delimiterIndex) + { + while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) + { + ++scanIndex; + } + string name = text.Substring(scanIndex, equalIndex - scanIndex); + string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); + callback( + Uri.UnescapeDataString(name.Replace('+', ' ')), + Uri.UnescapeDataString(value.Replace('+', ' ')), + state); + equalIndex = text.IndexOf('=', delimiterIndex); + if (equalIndex == -1) + { + equalIndex = textLength; + } + } + scanIndex = delimiterIndex + 1; + } + } + + internal static string GetJoinedValue(IDictionary Store, string key) + { + throw new NotImplementedException(); + } + } + + internal static partial class OwinHelpers + { + public static string GetHeader(IDictionary headers, string key) + { + string[] values = GetHeaderUnmodified(headers, key); + return values == null ? null : string.Join(",", values); + } + + public static IEnumerable GetHeaderSplit(IDictionary headers, string key) + { + string[] values = GetHeaderUnmodified(headers, key); + return values == null ? null : GetHeaderSplitImplementation(values); + } + + private static IEnumerable GetHeaderSplitImplementation(string[] values) + { + foreach (var segment in new HeaderSegmentCollection(values)) + { + if (segment.Data.HasValue) + { + yield return DeQuote(segment.Data.Value); + } + } + } + + public static string[] GetHeaderUnmodified(IDictionary headers, string key) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + string[] values; + return headers.TryGetValue(key, out values) ? values : null; + } + + public static void SetHeader(IDictionary headers, string key, string value) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException("key"); + } + if (string.IsNullOrWhiteSpace(value)) + { + headers.Remove(key); + } + else + { + headers[key] = new[] { value }; + } + } + + public static void SetHeaderJoined(IDictionary headers, string key, params string[] values) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException("key"); + } + if (values == null || values.Length == 0) + { + headers.Remove(key); + } + else + { + headers[key] = new[] { string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + } + } + + // Quote items that contain comas and are not already quoted. + private static string QuoteIfNeeded(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Contains(',')) + { + if (value[0] != '"' || value[value.Length - 1] != '"') + { + value = '"' + value + '"'; + } + } + + return value; + } + + private static string DeQuote(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + { + value = value.Substring(1, value.Length - 2); + } + + return value; + } + + public static void SetHeaderUnmodified(IDictionary headers, string key, params string[] values) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException("key"); + } + if (values == null || values.Length == 0) + { + headers.Remove(key); + } + else + { + headers[key] = values; + } + } + + public static void SetHeaderUnmodified(IDictionary headers, string key, IEnumerable values) + { + if (headers == null) + { + throw new ArgumentNullException("headers"); + } + headers[key] = values.ToArray(); + } + + public static void AppendHeader(IDictionary headers, string key, string values) + { + if (string.IsNullOrWhiteSpace(values)) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeader(headers, key, values); + } + else + { + headers[key] = new[] { existing + "," + values }; + } + } + + public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeaderJoined(headers, key, values); + } + else + { + headers[key] = new[] { existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + } + } + + public static void AppendHeaderUnmodified(IDictionary headers, string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string[] existing = GetHeaderUnmodified(headers, key); + if (existing == null) + { + SetHeaderUnmodified(headers, key, values); + } + else + { + SetHeaderUnmodified(headers, key, existing.Concat(values)); + } + } + } + + internal static partial class OwinHelpers + { + private static readonly Action AppendItemCallback = (name, value, state) => + { + var dictionary = (IDictionary>)state; + + List existing; + if (!dictionary.TryGetValue(name, out existing)) + { + dictionary.Add(name, new List(1) { value }); + } + else + { + existing.Add(value); + } + }; + + private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; + + internal static IDictionary GetQuery(HttpRequest request) + { + var query = request.Get>("Microsoft.Owin.Query#dictionary"); + if (query == null) + { + query = new Dictionary(StringComparer.OrdinalIgnoreCase); + request.Set("Microsoft.Owin.Query#dictionary", query); + } + + string text = request.QueryString.Value; + if (request.Get("Microsoft.Owin.Query#text") != text) + { + query.Clear(); + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(text, AmpersandAndSemicolon, AppendItemCallback, accumulator); + foreach (var kv in accumulator) + { + query.Add(kv.Key, kv.Value.ToArray()); + } + request.Set("Microsoft.Owin.Query#text", text); + } + return query; + } + +#if !NET40 + internal static IFormCollection GetForm(string text) + { + IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); + foreach (var kv in accumulator) + { + form.Add(kv.Key, kv.Value.ToArray()); + } + return new FormCollection(form); + } +#endif + + internal static string GetJoinedValue(IDictionary store, string key) + { + string[] values = GetUnmodifiedValues(store, key); + return values == null ? null : string.Join(",", values); + } + + internal static string[] GetUnmodifiedValues(IDictionary store, string key) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + string[] values; + return store.TryGetValue(key, out values) ? values : null; + } + } + + internal static partial class OwinHelpers + { + internal static string GetHost(HttpRequest request) + { + IHeaderDictionary headers = request.Headers; + + string host = GetHeader(headers, "Host"); + if (!string.IsNullOrWhiteSpace(host)) + { + return host; + } + + string localIpAddress = request.LocalIpAddress ?? "localhost"; + var localPort = request.Get(OwinConstants.CommonKeys.LocalPort); + return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); + } + } +} diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index da65ff9698..8beefe2634 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -using System.Reflection; +using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -31,6 +31,6 @@ using System.Runtime.InteropServices; // // 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: AssemblyVersion("0.1.0")] +[assembly: AssemblyVersion("0.1.0")] +[assembly: AssemblyFileVersion("0.1.0")] diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj index 9ef35f3c8d..d68b62764a 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj @@ -53,6 +53,19 @@ + + + + + + + + + + + + + From d6cd02d1211c66cc9acb05227b6e5cc23195db00 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 27 Jan 2014 11:40:30 -0800 Subject: [PATCH 0018/1838] Updating abstractions --- HttpAbstractions.sln | 1 + .../HttpContext.cs | 6 +- .../DefaultHttpContext.cs | 1 + .../Infrastructure/ParsingHelpers.cs | 39 +++++---- ...Microsoft.AspNet.PipelineCore.net45.csproj | 80 +++++++++++++++++++ 5 files changed, 109 insertions(+), 18 deletions(-) create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index d0bb133101..48380ad6d4 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -26,6 +26,7 @@ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.k10", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.k10.csproj", "{C5C104A4-EE38-4D77-AC77-DF599FD5443A}" + EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 241c1d17e2..ab1193bd44 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,13 +1,15 @@ using System; +using System.Collections.Generic; namespace Microsoft.AspNet.Abstractions { public abstract class HttpContext : IDisposable { - // TODO - review IOwinContext for properties - public abstract HttpRequest Request { get; } + public abstract HttpResponse Response { get; } + + public abstract IDictionary Items { get; } public abstract void Dispose(); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index bbd69ef0f8..f5a85826d7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -18,6 +18,7 @@ namespace Microsoft.AspNet.PipelineCore } public override HttpRequest Request { get { return _request; } } + public override HttpResponse Response { get { return _response; } } public int Revision { get { return _environment.Revision; } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 204b3cda0e..0a9a581ec2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,4 +1,5 @@ using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Collections; using System; using System.Collections; using System.Collections.Generic; @@ -514,21 +515,32 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure private static readonly char[] SemicolonAndComma = new[] { ';', ',' }; + internal static T GetItem(HttpRequest request, string key) + { + object value; + return request.HttpContext.Items.TryGetValue(key, out value) ? (T)value : default(T); + } + + internal static void SetItem(HttpRequest request, string key, T value) + { + request.HttpContext.Items[key] = value; + } + internal static IDictionary GetCookies(HttpRequest request) { - var cookies = request.Get>("Microsoft.Owin.Cookies#dictionary"); + var cookies = GetItem>(request, "Microsoft.Owin.Cookies#dictionary"); if (cookies == null) { cookies = new Dictionary(StringComparer.Ordinal); - request.Set("Microsoft.Owin.Cookies#dictionary", cookies); + SetItem(request, "Microsoft.Owin.Cookies#dictionary", cookies); } string text = GetHeader(request.Headers, "Cookie"); - if (request.Get("Microsoft.Owin.Cookies#text") != text) + if (GetItem(request, "Microsoft.Owin.Cookies#text") != text) { cookies.Clear(); ParseDelimited(text, SemicolonAndComma, AddCookieCallback, cookies); - request.Set("Microsoft.Owin.Cookies#text", text); + SetItem(request, "Microsoft.Owin.Cookies#text", text); } return cookies; } @@ -570,14 +582,9 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure scanIndex = delimiterIndex + 1; } } - - internal static string GetJoinedValue(IDictionary Store, string key) - { - throw new NotImplementedException(); - } } - internal static partial class OwinHelpers + internal static partial class ParsingHelpers { public static string GetHeader(IDictionary headers, string key) { @@ -768,7 +775,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - internal static partial class OwinHelpers + internal static partial class ParsingHelpers { private static readonly Action AppendItemCallback = (name, value, state) => { @@ -789,15 +796,15 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure internal static IDictionary GetQuery(HttpRequest request) { - var query = request.Get>("Microsoft.Owin.Query#dictionary"); + var query = GetItem>(request, "Microsoft.Owin.Query#dictionary"); if (query == null) { query = new Dictionary(StringComparer.OrdinalIgnoreCase); - request.Set("Microsoft.Owin.Query#dictionary", query); + SetItem(request, "Microsoft.Owin.Query#dictionary", query); } string text = request.QueryString.Value; - if (request.Get("Microsoft.Owin.Query#text") != text) + if (GetItem(request, "Microsoft.Owin.Query#text") != text) { query.Clear(); var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); @@ -806,7 +813,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure { query.Add(kv.Key, kv.Value.ToArray()); } - request.Set("Microsoft.Owin.Query#text", text); + SetItem(request, "Microsoft.Owin.Query#text", text); } return query; } @@ -842,7 +849,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - internal static partial class OwinHelpers + internal static partial class ParsingHelpers { internal static string GetHost(HttpRequest request) { diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj new file mode 100644 index 0000000000..b4d658e9fb --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -0,0 +1,80 @@ + + + + + Debug + AnyCPU + {68A538BA-D542-49CB-9615-B4F5A4E78C87} + Library + Properties + Microsoft.AspNet.PipelineCore + Microsoft.AspNet.PipelineCore + v4.5 + 512 + obj/net45 + + + AnyCPU + true + full + false + bin\Debug\net45 + DEBUG;TRACE;NET45 + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\net45 + TRACE;NET45 + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + {95AEE59D-BF51-47CB-A957-C03D909CC148} + Microsoft.AspNet.FeatureModel + + + {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} + Microsoft.AspNet.Abstractions + + + {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} + Microsoft.AspNet.HttpFeature + + + + + \ No newline at end of file From fd9f392ec920e7e3dcd74a515f5f787c60d19b15 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 27 Jan 2014 12:47:14 -0800 Subject: [PATCH 0019/1838] Fixing merge conflicts (?) --- HttpAbstractions.sln | 37 +++++----- ...Microsoft.AspNet.PipelineCore.net45.csproj | 71 +++++++++---------- 2 files changed, 53 insertions(+), 55 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 48380ad6d4..c223d6618e 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -21,12 +21,15 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCo EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.csproj", "{8C671AE3-1188-499F-A2A2-3A0B117B33CE}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.net45", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.net45.csproj", "{E6B7056F-547E-4B96-9E58-858DDDAE75D3}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Owin.k10", "src\Microsoft.AspNet.Abstractions.Owin\Microsoft.AspNet.Abstractions.Owin.k10.csproj", "{C5C104A4-EE38-4D77-AC77-DF599FD5443A}" - +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{ADDAE1B2-094E-4DA8-86DE-13E8708072D8}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{4B39A6DA-68BD-4F50-BE76-0399EB82DCBF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -70,10 +73,6 @@ Global {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.Build.0 = Debug|Any CPU {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.ActiveCfg = Release|Any CPU {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.Build.0 = Release|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {86942914-0334-4352-87ED-B971281C74E2}.Release|Any CPU.Build.0 = Release|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Debug|Any CPU.Build.0 = Debug|Any CPU {E6B7056F-547E-4B96-9E58-858DDDAE75D3}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -87,17 +86,17 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {8C671AE3-1188-499F-A2A2-3A0B117B33CE} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} - {86942914-0334-4352-87ED-B971281C74E2} = {1D737C82-F2F1-40B6-AE95-A3D878612E91} - {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {D3242B56-EA73-4F41-86A4-DF6C70271592} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} - {C5C104A4-EE38-4D77-AC77-DF599FD5443A} = {D38DDB2B-1138-4F45-8A6A-9499E880F620} + {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {C5C104A4-EE38-4D77-AC77-DF599FD5443A} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {E6B7056F-547E-4B96-9E58-858DDDAE75D3} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj index b4d658e9fb..9c9e6c6f47 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -1,10 +1,10 @@ - + - + Debug AnyCPU - {68A538BA-D542-49CB-9615-B4F5A4E78C87} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} Library Properties Microsoft.AspNet.PipelineCore @@ -19,7 +19,7 @@ full false bin\Debug\net45 - DEBUG;TRACE;NET45 + DEBUG;TRACE;NET45; prompt 4 @@ -28,48 +28,47 @@ pdbonly true bin\Release\net45 - TRACE;NET45 + TRACE;NET45; prompt 4 - - - - + + + + + - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - {95AEE59D-BF51-47CB-A957-C03D909CC148} - Microsoft.AspNet.FeatureModel - - - {D36288AF-8A0E-48DD-8AF8-15B72F91C70A} - Microsoft.AspNet.Abstractions - - - {A6DEB0D3-982E-4A07-8EE7-39269F192AF7} - Microsoft.AspNet.HttpFeature - + + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} + Microsoft.AspNet.FeatureModel + + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} + Microsoft.AspNet.Abstractions + + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} + Microsoft.AspNet.HttpFeature + - + - \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs new file mode 100644 index 0000000000..c99a8b1909 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.FeatureModel.Tests +{ + public class Thing : IThing + { + public string Hello() + { + return "World"; + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json new file mode 100644 index 0000000000..e52db7c2c2 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -0,0 +1,17 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.AppBuilderSupport": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "" + }, + "configurations": { + "net45": { + "dependencies": { + "Shouldly": "1.1.1.1", + "xunit": "1.9.2" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json new file mode 100644 index 0000000000..0a90b7ac74 --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -0,0 +1,23 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.AppBuilderSupport": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "" + }, + "configurations": { + "net45": { + "dependencies": { + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.Owin.Hosting": "2.1.0", + "Microsoft.Owin.Testing": "2.1.0", + "Moq": "4.2.1312.1622", + "xunit": "1.9.2", + "Microsoft.Net.Http": "2.2.13", + "System.Net.Http": "" + } + } + } +} \ No newline at end of file From 003718c564326d3e31311728f4b92bfed4cf827b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 31 Jan 2014 13:35:26 -0800 Subject: [PATCH 0026/1838] Fixing build errors --- .../Microsoft.AspNet.PipelineCore.net45.csproj | 1 + .../InterfaceDictionaryTests.cs | 15 +++++++-------- .../BuilderTests.cs | 3 +-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj index 9844b7f087..08b14e00ac 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj @@ -60,6 +60,7 @@ + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index c42f4b37d1..a8f005ee07 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,5 +1,4 @@ using System; -using Shouldly; using Xunit; namespace Microsoft.AspNet.FeatureModel.Tests @@ -14,11 +13,11 @@ namespace Microsoft.AspNet.FeatureModel.Tests interfaces.Add(typeof(IThing), thing); - interfaces[typeof(IThing)].ShouldBe(thing); + Assert.Equal(interfaces[typeof(IThing)], thing); object thing2; - interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); - thing2.ShouldBe(thing); + Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); + Assert.Equal(thing2, thing); } [Fact] @@ -29,11 +28,11 @@ namespace Microsoft.AspNet.FeatureModel.Tests interfaces[typeof(IThing)] = thing; - interfaces[typeof(IThing)].ShouldBe(thing); + Assert.Equal(interfaces[typeof(IThing)], thing); object thing2; - interfaces.TryGetValue(typeof(IThing), out thing2).ShouldBe(true); - thing2.ShouldBe(thing); + Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); + Assert.Equal(thing2, thing); } [Fact] @@ -44,7 +43,7 @@ namespace Microsoft.AspNet.FeatureModel.Tests interfaces.Add(typeof(IThing), thing); - Should.Throw(() => interfaces.Add(typeof(IThing), thing)); + Assert.Throws(() => interfaces.Add(typeof(IThing), thing)); } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 7455439ed7..3dfc4278d8 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -1,5 +1,4 @@ using Microsoft.AspNet.Abstractions; -using Shouldly; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests @@ -18,7 +17,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests mockHttpResponse.SetupProperty(x => x.StatusCode); app.Invoke(mockHttpContext.Object); - mockHttpContext.Object.Response.StatusCode.ShouldBe(404); + Assert.Equal(mockHttpContext.Object.Response.StatusCode, 404); } } } \ No newline at end of file From 4ce1423b1c0bb56bcc0be33947c4710045b17810 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 1 Feb 2014 02:32:46 -0800 Subject: [PATCH 0027/1838] Made small changes to prevent null refs when getting HttpRequestInformation - Use FeatureReference.Default instead of new when constructing - Fixed project.json in tests --- .../DefaultCanHasQuery.cs | 2 +- .../DefaultCanHasRequestCookies.cs | 2 +- .../DefaultHttpContext.cs | 2 +- .../DefaultHttpRequest.cs | 10 +++++----- .../Infrastructure/FeatureReference.cs | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 5 +++-- 6 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs index 7e97670db1..fa3069d427 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasQuery : ICanHasQuery { private readonly IFeatureCollection _features; - private FeatureReference _request = new FeatureReference(); + private FeatureReference _request = FeatureReference.Default; private string _queryString; private IReadableStringCollection _query; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index f4d23e029e..df33085763 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasRequestCookies : ICanHasRequestCookies { private readonly IFeatureCollection _features; - private FeatureReference _request = new FeatureReference(); + private FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; private static readonly string[] ZeroHeaders = new string[0]; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 4dc7adf253..778611eee0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.PipelineCore _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _canHasItems = new FeatureReference(); + _canHasItems = FeatureReference.Default; } ICanHasItems CanHasItems diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 055af55c49..2e96c4eca7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -12,11 +12,11 @@ namespace Microsoft.AspNet.PipelineCore private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _request = new FeatureReference(); - private FeatureReference _connection = new FeatureReference(); - private FeatureReference _transportLayerSecurity = new FeatureReference(); - private FeatureReference _canHasQuery = new FeatureReference(); - private FeatureReference _canHasCookies = new FeatureReference(); + private FeatureReference _request = FeatureReference.Default; + private FeatureReference _connection = FeatureReference.Default; + private FeatureReference _transportLayerSecurity = FeatureReference.Default; + private FeatureReference _canHasQuery = FeatureReference.Default; + private FeatureReference _canHasCookies = FeatureReference.Default; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index 70aba473a5..ed76942784 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } public static readonly FeatureReference Default = new FeatureReference(default(T), -1); - + public T Fetch(IFeatureCollection features) { if (_revision == features.Revision) return _feature; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 0a90b7ac74..e4bb833e89 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -4,7 +4,8 @@ "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "" + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.PipelineCore": "" }, "configurations": { "net45": { @@ -13,7 +14,7 @@ "Microsoft.Owin": "2.1.0", "Microsoft.Owin.Hosting": "2.1.0", "Microsoft.Owin.Testing": "2.1.0", - "Moq": "4.2.1312.1622", + "Moq": "4.2.1312.1622", "xunit": "1.9.2", "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" From 370a6b7ba3967962124eaaad434ae1a5ae221aac Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 1 Feb 2014 03:09:04 -0800 Subject: [PATCH 0028/1838] Added code for the k10 case in FeatureObject. --- src/Microsoft.AspNet.FeatureModel/FeatureObject.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 7b662285b9..fbc69b814f 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -40,6 +40,11 @@ namespace Microsoft.AspNet.FeatureModel return Converter.Convert(interfaceType, type, _instance); } } +#else + if (_instance != null && type == _instance.GetType()) + { + return _instance; + } #endif return null; } From 15eb51163d48d04fb72d9ae41004fa681b90af68 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 2 Feb 2014 08:20:45 -0800 Subject: [PATCH 0029/1838] Updating build.cmd to cache NuGet.exe --- build.cmd | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index d54931bc8f..7045ee1f84 100644 --- a/build.cmd +++ b/build.cmd @@ -1,10 +1,18 @@ @echo off cd %~dp0 -IF EXIST .nuget\NuGet.exe goto restore +SETLOCAL +SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe + +IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... +IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'" + +:copynuget +IF EXIST .nuget\nuget.exe goto restore md .nuget -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '.nuget\NuGet.exe'" +copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run From f9d29fd8aab79ae38f1b9dbdac0681893550bebf Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 7 Feb 2014 10:07:02 -0800 Subject: [PATCH 0030/1838] Workaround for myget being down --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index ab583b0ff7..a059188b09 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From e2f45c59eab74d14a70b09e4f2cce19028060e45 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sat, 8 Feb 2014 16:03:59 -0800 Subject: [PATCH 0031/1838] Placing IServiceProvider on IBuilder Replaces concept of features/items on builder instance for now --- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 5 +-- src/Microsoft.AspNet.PipelineCore/Builder.cs | 44 ++----------------- 2 files changed, 6 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 778e98d404..5699bed1b4 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -4,13 +4,12 @@ namespace Microsoft.AspNet.Abstractions { public interface IBuilder { + IServiceProvider ServiceProvider { get; set; } + IBuilder Use(Func middleware); IBuilder Run(RequestDelegate handler); IBuilder New(); RequestDelegate Build(); - - object GetItem(Type type); - void SetItem(Type type, object feature); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 8e4d2f0ac0..48edba1ce2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,56 +1,20 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.PipelineCore { public class Builder : IBuilder { - private readonly IFeatureCollection _interfaces; - private readonly IDictionary _properties; private readonly IList> _components = new List>(); - public Builder() + public Builder(IServiceProvider serviceProvider) { - _interfaces = new FeatureCollection(); - _properties = new Dictionary(); + ServiceProvider = serviceProvider; } - public Builder(IFeatureCollection interfaces, IDictionary properties) - { - _interfaces = interfaces; - _properties = properties; - } - - public void Dispose() - { - _interfaces.Dispose(); - } - - public virtual object GetItem(Type key) - { - object value; - return _interfaces.TryGetValue(key, out value); - } - - public virtual void SetItem(Type key, object value) - { - _interfaces[key] = value; - } - - public virtual object GetItem(string key) - { - object value; - return _properties.TryGetValue(key, out value); - } - - public virtual void SetItem(string key, object value) - { - _properties[key] = value; - } + public IServiceProvider ServiceProvider { get; set; } public IBuilder Use(Func middleware) { @@ -65,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore public IBuilder New() { - return new Builder(_interfaces, _properties); + return new Builder(ServiceProvider); } public RequestDelegate Build() From 86025a3ec43d5120da71d6fed589022c2c420890 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 9 Feb 2014 18:24:16 -0800 Subject: [PATCH 0032/1838] Updated Builder constructors --- .../AppBuilderSupportExtensions.cs | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs index d434c85b97..dfb66eb492 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs @@ -16,7 +16,7 @@ namespace Owin { public static IAppBuilder UseBuilder(this IAppBuilder appBuilder, Action configuration) { - IBuilder builder = new Builder(); + IBuilder builder = new Builder(null); configuration(builder); Func middleware1 = next1 => { Func middleware2 = next2 => { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 3dfc4278d8..4541585c1d 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests [Fact] public void BuildReturnsCallableDelegate() { - var builder = new Builder(); + var builder = new Builder(null); var app = builder.Build(); var mockHttpContext = new Moq.Mock(); From c37c555333f9fa33c19af22fa1dcfdbb6b4de1a1 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 9 Feb 2014 18:28:14 -0800 Subject: [PATCH 0033/1838] Initializing repository --- .gitattributes | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ .gitignore | 22 ++++++++++++++++++++++ NuGet.Config | 13 +++++++++++++ build.cmd | 15 +++++++++++++++ makefile.shade | 7 +++++++ 5 files changed, 107 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 NuGet.Config create mode 100644 build.cmd create mode 100644 makefile.shade diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000..bdaa5ba982 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,50 @@ +*.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 + +*.jpg binary +*.png binary +*.gif binary + +*.cs text=auto diff=csharp +*.vb text=auto +*.resx text=auto +*.c text=auto +*.cpp text=auto +*.cxx text=auto +*.h text=auto +*.hxx text=auto +*.py text=auto +*.rb text=auto +*.java text=auto +*.html text=auto +*.htm text=auto +*.css text=auto +*.scss text=auto +*.sass text=auto +*.less text=auto +*.js text=auto +*.lisp text=auto +*.clj text=auto +*.sql text=auto +*.php text=auto +*.lua text=auto +*.m text=auto +*.asm text=auto +*.erl text=auto +*.fs text=auto +*.fsx text=auto +*.hs text=auto + +*.csproj text=auto +*.vbproj text=auto +*.fsproj text=auto +*.dbproj text=auto +*.sln text=auto eol=crlf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..2554a1fc23 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +[Oo]bj/ +[Bb]in/ +TestResults/ +.nuget/ +_ReSharper.*/ +packages/ +artifacts/ +PublishProfiles/ +*.user +*.suo +*.cache +*.docstates +_ReSharper.* +nuget.exe +*net45.csproj +*k10.csproj +*.psess +*.vsp +*.pidb +*.userprefs +*DS_Store +*.ncrunchsolution diff --git a/NuGet.Config b/NuGet.Config new file mode 100644 index 0000000000..ab583b0ff7 --- /dev/null +++ b/NuGet.Config @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/build.cmd b/build.cmd new file mode 100644 index 0000000000..d54931bc8f --- /dev/null +++ b/build.cmd @@ -0,0 +1,15 @@ +@echo off +cd %~dp0 + +IF EXIST .nuget\NuGet.exe goto restore +echo Downloading latest version of NuGet.exe... +md .nuget +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '.nuget\NuGet.exe'" + +:restore +IF EXIST packages\KoreBuild goto run +.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +.nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion + +:run +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/makefile.shade b/makefile.shade new file mode 100644 index 0000000000..6357ea2841 --- /dev/null +++ b/makefile.shade @@ -0,0 +1,7 @@ + +var VERSION='0.1' +var FULL_VERSION='0.1' +var AUTHORS='Microsoft' + +use-standard-lifecycle +k-standard-goals From 0e813fbb790230a9226641d218573b9e4a0fb5b3 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 9 Feb 2014 23:25:56 -0800 Subject: [PATCH 0034/1838] Rough outline of hosting components --- Hosting.sln | 43 ++++++++ .../Builder/BuilderFactory.cs | 20 ++++ .../Builder/HttpContextFactory.cs | 18 +++ .../Builder/IBuilderFactory.cs | 9 ++ .../Builder/IHttpContextFactory.cs | 9 ++ .../HostingContext.cs | 20 ++++ src/Microsoft.AspNet.Hosting/HostingEngine.cs | 104 ++++++++++++++++++ .../HostingServices.cs | 81 ++++++++++++++ .../IHostingEngine.cs | 9 ++ .../PipelineInstance.cs | 31 ++++++ .../Server/IServerFactory.cs | 11 ++ .../Server/IServerFactoryProvider.cs | 7 ++ .../Server/IServerManager.cs | 7 ++ .../Server/ServerManager.cs | 10 ++ .../ServerFactoryProvider.cs | 13 +++ .../Startup/IStartupLoader.cs | 11 ++ .../Startup/IStartupLoaderProvider.cs | 9 ++ .../Startup/IStartupManager.cs | 10 ++ .../Startup/NullStartupLoader.cs | 21 ++++ .../Startup/StartupLoader.cs | 62 +++++++++++ .../Startup/StartupLoaderProvider.cs | 21 ++++ .../Startup/StartupManager.cs | 36 ++++++ .../WebApplication.cs | 23 ++++ src/Microsoft.AspNet.Hosting/project.json | 14 +++ .../Fakes/FakeStartup.cs | 11 ++ .../Fakes/FakeStartupWithServices.cs | 19 ++++ .../Fakes/IFakeStartupCallback.cs | 7 ++ .../HostingEngineTests.cs | 88 +++++++++++++++ .../StartupManagerTests.cs | 51 +++++++++ .../project.json | 12 ++ 30 files changed, 787 insertions(+) create mode 100644 Hosting.sln create mode 100644 src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/HostingContext.cs create mode 100644 src/Microsoft.AspNet.Hosting/HostingEngine.cs create mode 100644 src/Microsoft.AspNet.Hosting/HostingServices.cs create mode 100644 src/Microsoft.AspNet.Hosting/IHostingEngine.cs create mode 100644 src/Microsoft.AspNet.Hosting/PipelineInstance.cs create mode 100644 src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs create mode 100644 src/Microsoft.AspNet.Hosting/Server/IServerManager.cs create mode 100644 src/Microsoft.AspNet.Hosting/Server/ServerManager.cs create mode 100644 src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs create mode 100644 src/Microsoft.AspNet.Hosting/WebApplication.cs create mode 100644 src/Microsoft.AspNet.Hosting/project.json create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/project.json diff --git a/Hosting.sln b/Hosting.sln new file mode 100644 index 0000000000..3394417c72 --- /dev/null +++ b/Hosting.sln @@ -0,0 +1,43 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.21005.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{FEB39027-9158-4DE2-997F-7ADAEF8188D0}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.net45", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.net45.csproj", "{D546290B-E280-4D99-BA9C-0D364A0AFB54}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.k10", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.k10.csproj", "{DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.Tests.net45", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.net45.csproj", "{80588AF3-6B14-4D11-9DC4-1EF6453B54C9}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Release|Any CPU.Build.0 = Release|Any CPU + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Release|Any CPU.Build.0 = Release|Any CPU + {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {80588AF3-6B14-4D11-9DC4-1EF6453B54C9} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} + EndGlobalSection +EndGlobal diff --git a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs new file mode 100644 index 0000000000..bee42edcd3 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs @@ -0,0 +1,20 @@ +using System; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Builder +{ + public class BuilderFactory : IBuilderFactory + { + private readonly IServiceProvider _serviceProvider; + + public BuilderFactory(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public IBuilder CreateBuilder() + { + return new PipelineCore.Builder(_serviceProvider); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs new file mode 100644 index 0000000000..18dc5a4341 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -0,0 +1,18 @@ +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.PipelineCore; + +namespace Microsoft.AspNet.Hosting.Builder +{ + public class HttpContextFactory : IHttpContextFactory + { + public HttpContext CreateHttpContext(object serverContext) + { + var featureObject = serverContext as IFeatureCollection ?? new FeatureObject(serverContext); + var featureCollection = new FeatureCollection(featureObject); + var httpContext = new DefaultHttpContext(featureCollection); + return httpContext; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs new file mode 100644 index 0000000000..f69589727a --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Builder +{ + public interface IBuilderFactory + { + IBuilder CreateBuilder(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs new file mode 100644 index 0000000000..3db4473167 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -0,0 +1,9 @@ +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Builder +{ + public interface IHttpContextFactory + { + HttpContext CreateHttpContext(object serverContext); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs new file mode 100644 index 0000000000..303e9e7770 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -0,0 +1,20 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Hosting.Server; + +namespace Microsoft.AspNet.Hosting +{ + public class HostingContext + { + public IServiceProvider Services { get; set; } + + public IBuilder Builder { get; set; } + + public string ApplicationName { get; set; } + public Action ApplicationStartup { get; set; } + public RequestDelegate ApplicationDelegate { get; set; } + + public string ServerName { get; set; } + public IServerFactory ServerFactory { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs new file mode 100644 index 0000000000..6a33dbde7d --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -0,0 +1,104 @@ +using System; +using System.Threading; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Hosting.Server; + +namespace Microsoft.AspNet.Hosting +{ + public class HostingEngine : IHostingEngine + { + private readonly IServerManager _serverManager; + private readonly IStartupManager _startupManager; + private readonly IBuilderFactory _builderFactory; + private readonly IHttpContextFactory _httpContextFactory; + + public HostingEngine( + IServerManager serverManager, + IStartupManager startupManager, + IBuilderFactory builderFactory, + IHttpContextFactory httpContextFactory) + { + _serverManager = serverManager; + _startupManager = startupManager; + _builderFactory = builderFactory; + _httpContextFactory = httpContextFactory; + } + + public IDisposable Start(HostingContext context) + { + EnsureBuilder(context); + EnsureServerFactory(context); + EnsureApplicationDelegate(context); + + var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate); + var server = context.ServerFactory.Start(pipeline.Invoke); + + return new Disposable(() => + { + server.Dispose(); + pipeline.Dispose(); + }); + } + + private void EnsureBuilder(HostingContext context) + { + if (context.Builder != null) + { + return; + } + + context.Builder = _builderFactory.CreateBuilder(); + } + + private void EnsureServerFactory(HostingContext context) + { + if (context.ServerFactory != null) + { + return; + } + + context.ServerFactory = _serverManager.GetServer(context.ServerName); + } + + private void EnsureApplicationDelegate(HostingContext context) + { + if (context.ApplicationDelegate != null) + { + return; + } + + EnsureApplicationStartup(context); + EnsureBuilder(context); + + context.ApplicationStartup.Invoke(context.Builder); + context.ApplicationDelegate = context.Builder.Build(); + } + + private void EnsureApplicationStartup(HostingContext context) + { + if (context.ApplicationStartup != null) + { + return; + } + + context.ApplicationStartup = _startupManager.LoadStartup(context.ApplicationName); + } + + private class Disposable : IDisposable + { + private Action _dispose; + + public Disposable(Action dispose) + { + _dispose = dispose; + } + + public void Dispose() + { + Interlocked.Exchange(ref _dispose, () => { }).Invoke(); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs new file mode 100644 index 0000000000..5af7a8c077 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Configuration; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Hosting.Server; + +namespace Microsoft.AspNet.Hosting +{ + public static class HostingServices + { + public static IEnumerable DefaultServices() + { + return DefaultServices(new EmptyConfiguration()); + } + + public static IEnumerable DefaultServices(IConfiguration configuration) + { + yield return DescribeService(configuration); + yield return DescribeService(configuration); + + yield return DescribeService(configuration); + yield return DescribeService(configuration); + + yield return DescribeService(configuration); + yield return DescribeService(configuration); + } + + public static IServiceDescriptor DescribeService(IConfiguration configuration, + LifecycleKind lifecycle = LifecycleKind.Transient) + { + return DescribeService(typeof(TService), typeof(TImplementation), configuration, lifecycle); + } + + public static IServiceDescriptor DescribeService( + Type serviceType, + Type implementationType, + IConfiguration configuration, + LifecycleKind lifecycle) + { + var serviceTypeName = serviceType.FullName; + var implemenationTypeName = configuration.Get(serviceTypeName); + if (!String.IsNullOrEmpty(implemenationTypeName)) + { + try + { + implementationType = Type.GetType(implemenationTypeName); + } + catch (Exception ex) + { + throw new Exception(string.Format("TODO: unable to locate implementation {0} for service {1}", implemenationTypeName, serviceTypeName), ex); + } + } + return new ServiceTypeDescriptor(serviceType, implementationType, lifecycle); + } + + public class EmptyConfiguration : IConfiguration + { + public string Get(string key) + { + return null; + } + } + + public class ServiceTypeDescriptor : IServiceDescriptor + { + public ServiceTypeDescriptor(Type serviceType, Type implementationType, LifecycleKind lifecycle) + { + ServiceType = serviceType; + ImplementationType = implementationType; + Lifecycle = lifecycle; + } + + public LifecycleKind Lifecycle { get; private set; } + public Type ServiceType { get; private set; } + public Type ImplementationType { get; private set; } + public object ImplementationInstance { get; private set; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs new file mode 100644 index 0000000000..89195e69f4 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs @@ -0,0 +1,9 @@ +using System; + +namespace Microsoft.AspNet.Hosting +{ + public interface IHostingEngine + { + IDisposable Start(HostingContext context); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs new file mode 100644 index 0000000000..cc7580b713 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Server; + +namespace Microsoft.AspNet.Hosting +{ + public class PipelineInstance : IDisposable + { + private readonly IHttpContextFactory _httpContextFactory; + private readonly RequestDelegate _requestDelegate; + + public PipelineInstance(IHttpContextFactory httpContextFactory, RequestDelegate requestDelegate) + { + _httpContextFactory = httpContextFactory; + _requestDelegate = requestDelegate; + } + + public Task Invoke(object serverEnvironment) + { + var httpContext = _httpContextFactory.CreateHttpContext(serverEnvironment); + return _requestDelegate(httpContext); + } + + public void Dispose() + { + // TODO: application notification of disposal + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs new file mode 100644 index 0000000000..2d8350d53e --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -0,0 +1,11 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Server +{ + public interface IServerFactory + { + IDisposable Start(Func application); + } +} diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs new file mode 100644 index 0000000000..714a51ba8b --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs @@ -0,0 +1,7 @@ +namespace Microsoft.AspNet.Hosting.Server +{ + public interface IServerFactoryProvider + { + IServerFactory GetServerFactory(string serverName); + } +} diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs new file mode 100644 index 0000000000..471f9445bd --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs @@ -0,0 +1,7 @@ +namespace Microsoft.AspNet.Hosting.Server +{ + public interface IServerManager + { + IServerFactory GetServer(string serverName); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs new file mode 100644 index 0000000000..b8bf9cf6b5 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -0,0 +1,10 @@ +namespace Microsoft.AspNet.Hosting.Server +{ + public class ServerManager : IServerManager + { + public IServerFactory GetServer(string serverName) + { + throw new System.NotImplementedException(); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs b/src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs new file mode 100644 index 0000000000..eb5743a86a --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNet.Hosting.Server; + +namespace Microsoft.AspNet.Hosting +{ + public class ServerFactoryProvider : IServerFactoryProvider + { + public IServerFactory GetServerFactory(string serverFactoryIdentifier) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs new file mode 100644 index 0000000000..067e5a4ebe --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public interface IStartupLoader + { + Action LoadStartup(string applicationName, IList diagnosticMessages); + } +} diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs new file mode 100644 index 0000000000..ad96af9793 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs @@ -0,0 +1,9 @@ +namespace Microsoft.AspNet.Hosting.Startup +{ + public interface IStartupLoaderProvider + { + int Order { get; } + + IStartupLoader CreateStartupLoader(IStartupLoader next); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs new file mode 100644 index 0000000000..0d92e09a89 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -0,0 +1,10 @@ +using System; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public interface IStartupManager + { + Action LoadStartup(string applicationName); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs new file mode 100644 index 0000000000..e5e63c01f7 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public class NullStartupLoader : IStartupLoader + { + static NullStartupLoader() + { + Instance = new NullStartupLoader(); + } + + public static IStartupLoader Instance { get; private set; } + + public Action LoadStartup(string applicationName, IList diagnosticMessages) + { + return null; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs new file mode 100644 index 0000000000..c0949b178f --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public class StartupLoader : IStartupLoader + { + private readonly IServiceProvider _services; + private readonly IStartupLoader _next; + + public StartupLoader(IServiceProvider services, IStartupLoader next) + { + _services = services; + _next = next; + } + + public Action LoadStartup(string applicationName, IList diagnosticMessages) + { + if (String.IsNullOrWhiteSpace(applicationName)) + { + return _next.LoadStartup(applicationName, diagnosticMessages); + } + + var parts = applicationName.Split(new[] { ',' }, 2); + if (parts.Length == 2) + { + var typeName = parts[0]; + var assemblyName = parts[1]; + + var assembly = Assembly.Load(new AssemblyName(assemblyName)); + if (assembly == null) + { + throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); + } + + var type = assembly.GetType(typeName); + if (type == null) + { + throw new Exception(String.Format("TODO: type {0} failed to load message", typeName)); + } + + var methodInfo = type.GetTypeInfo().GetDeclaredMethod("Configuration"); + if (methodInfo == null) + { + throw new Exception("TODO: Configuration method not found"); + } + + object instance = null; + if (!methodInfo.IsStatic) + { + instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); + } + return builder => methodInfo.Invoke(instance, new object[] { builder }); + } + throw new Exception("TODO: Unrecognized format"); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs new file mode 100644 index 0000000000..a30cc50488 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs @@ -0,0 +1,21 @@ +using System; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public class StartupLoaderProvider : IStartupLoaderProvider + { + private readonly IServiceProvider _services; + + public StartupLoaderProvider(IServiceProvider services) + { + _services = services; + } + + public int Order { get { return -100; } } + + public IStartupLoader CreateStartupLoader(IStartupLoader next) + { + return new StartupLoader(_services, next); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs new file mode 100644 index 0000000000..41d68b03da --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -0,0 +1,36 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public class StartupManager : IStartupManager + { + private readonly IEnumerable _providers; + + public StartupManager(IEnumerable providers) + { + _providers = providers; + } + + public Action LoadStartup(string applicationName) + { + // build ordered chain of application loaders + var chain = _providers + .OrderBy(provider => provider.Order) + .Aggregate(NullStartupLoader.Instance, (next, provider) => provider.CreateStartupLoader(next)); + + // invoke chain to acquire application entrypoint and diagnostic messages + var diagnosticMessages = new List(); + var application = chain.LoadStartup(applicationName, diagnosticMessages); + + if (application == null) + { + throw new Exception(diagnosticMessages.Aggregate("TODO: web application entrypoint not found message", (a, b) => a + "\r\n" + b)); + } + + return application; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs new file mode 100644 index 0000000000..773ae80d26 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -0,0 +1,23 @@ +using System; +using Microsoft.AspNet.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public static class WebApplication + { + public static IDisposable Start() + { + var context = new HostingContext + { + Services = new ServiceProvider().Add(HostingServices.DefaultServices()) + }; + + var engine = context.Services.GetService(); + if (engine == null) + { + throw new Exception("TODO: IHostingEngine service not available exception"); + } + return engine.Start(context); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json new file mode 100644 index 0000000000..57e379cfb1 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -0,0 +1,14 @@ +{ + "version": "0.1-alpha-*", + "dependencies":{ + "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", + "Microsoft.AspNet.Configuration":"0.1-alpha-*", + "Microsoft.AspNet.PipelineCore":"0.1-alpha-*", + "Microsoft.AspNet.Abstractions":"0.1-alpha-*", + "Microsoft.AspNet.FeatureModel":"0.1-alpha-*" + }, + "configurations": { + "net45" : {}, + "k10" : {} + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs new file mode 100644 index 0000000000..f8aae20612 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs @@ -0,0 +1,11 @@ +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Tests.Fakes +{ + public class FakeStartup + { + public void Configuration(IBuilder builder) + { + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs new file mode 100644 index 0000000000..1557c568ab --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs @@ -0,0 +1,19 @@ +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.Hosting.Tests.Fakes +{ + public class FakeStartupWithServices + { + private readonly IFakeStartupCallback _fakeStartupCallback; + + public FakeStartupWithServices(IFakeStartupCallback fakeStartupCallback) + { + _fakeStartupCallback = fakeStartupCallback; + } + + public void Configuration(IBuilder builder) + { + _fakeStartupCallback.ConfigurationMethodCalled(this); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs new file mode 100644 index 0000000000..cfe02c2b46 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs @@ -0,0 +1,7 @@ +namespace Microsoft.AspNet.Hosting.Tests.Fakes +{ + public interface IFakeStartupCallback + { + void ConfigurationMethodCalled(object instance); + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs new file mode 100644 index 0000000000..ab29f28bb5 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -0,0 +1,88 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Hosting.Server; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class HostingEngineTests : IServerManager, IServerFactory + { + private readonly IList _startInstances = new List(); + + [Fact] + public void HostingEngineCanBeResolvedWithDefaultServices() + { + var services = new ServiceProvider() + .Add(HostingServices.DefaultServices()); + + var engine = services.GetService(); + + Assert.NotNull(engine); + } + + [Fact] + public void HostingEngineCanBeStarted() + { + var services = new ServiceProvider() + .Add(HostingServices.DefaultServices() + .Where(descriptor => descriptor.ServiceType != typeof(IServerManager))) + .AddInstance(this); + + var engine = services.GetService(); + + var context = new HostingContext + { + ApplicationName = "Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests" + }; + + var engineStart = engine.Start(context); + + Assert.NotNull(engineStart); + Assert.Equal(1, _startInstances.Count); + Assert.Equal(0, _startInstances[0].DisposeCalls); + + engineStart.Dispose(); + + Assert.Equal(1, _startInstances[0].DisposeCalls); + } + + public IServerFactory GetServer(string serverName) + { + return this; + } + + public void Initialize(IBuilder builder) + { + + } + + public IDisposable Start(Func application) + { + var startInstance = new StartInstance(application); + _startInstances.Add(startInstance); + return startInstance; + } + + public class StartInstance : IDisposable + { + private readonly Func _application; + + public StartInstance(Func application) + { + _application = application; + } + + public int DisposeCalls { get; set; } + + public void Dispose() + { + DisposeCalls += 1; + } + } + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs new file mode 100644 index 0000000000..4a848b13fb --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -0,0 +1,51 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Hosting.Tests.Fakes; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + + public class StartupManagerTests : IFakeStartupCallback + { + private readonly IList _configurationMethodCalledList = new List(); + + [Fact] + public void DefaultServicesLocateStartupByNameAndNamespace() + { + IServiceProvider services = new ServiceProvider().Add(HostingServices.DefaultServices()); + + var manager = services.GetService(); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests"); + + Assert.IsType(manager); + Assert.NotNull(startup); + } + + [Fact] + public void StartupClassMayHaveHostingServicesInjected() + { + IServiceProvider services = new ServiceProvider() + .Add(HostingServices.DefaultServices()) + .AddInstance(this); + + var manager = services.GetService(); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartupWithServices, Microsoft.AspNet.Hosting.Tests"); + + startup.Invoke(null); + + Assert.Equal(1, _configurationMethodCalledList.Count); + } + + public void ConfigurationMethodCalled(object instance) + { + _configurationMethodCalledList.Add(instance); + } + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json new file mode 100644 index 0000000000..486e0ac6b1 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -0,0 +1,12 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "xunit": "1.9.2", + "Microsoft.AspNet.Hosting":"", + "Microsoft.AspNet.Abstractions":"0.1-alpha-*", + "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*" + }, + "configurations": { + "net45": {} + } +} \ No newline at end of file From 850128dc396fc59fc5111cbf89f95fd9dcaa9368 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 6 Feb 2014 14:43:32 -0800 Subject: [PATCH 0035/1838] Implement request and response properties: Headers, ContentLength. --- .../HttpResponse.cs | 2 + .../DefaultHttpRequest.cs | 7 ++- .../DefaultHttpResponse.cs | 50 +++++++++++++++++-- 3 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 6402033422..de84899fda 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -9,8 +9,10 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpContext HttpContext { get; } public abstract int StatusCode { get; set; } + public abstract IHeaderDictionary Headers { get; } public abstract Stream Body { get; set; } + public abstract long? ContentLength { get; set; } public abstract string ContentType { get; set; } public abstract Task WriteAsync(string data); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 2e96c4eca7..ac5e3d7572 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,8 +1,10 @@ using System; using System.IO; +using System.Threading; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore @@ -118,7 +120,7 @@ namespace Microsoft.AspNet.PipelineCore public override IHeaderDictionary Headers { - get { throw new NotImplementedException(); } + get { return new HeaderDictionary(HttpRequestInformation.Headers); } } public override IReadableStringCollection Cookies @@ -130,7 +132,8 @@ namespace Microsoft.AspNet.PipelineCore { get { - throw new NotImplementedException(); + return CancellationToken.None; + // throw new NotImplementedException(); } set { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 614005692a..5431315cb7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,9 +1,12 @@ -using System.IO; +using System.Globalization; +using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore @@ -33,22 +36,63 @@ namespace Microsoft.AspNet.PipelineCore set { HttpResponseInformation.StatusCode = value; } } + public override IHeaderDictionary Headers + { + get { return new HeaderDictionary(HttpResponseInformation.Headers); } + } + public override Stream Body { get { return HttpResponseInformation.Body; } set { HttpResponseInformation.Body = value; } } + public override long? ContentLength + { + get + { + string[] values; + long value; + if (HttpResponseInformation.Headers.TryGetValue(Constants.Headers.ContentLength, out values) + && values != null && values.Length > 0 && !string.IsNullOrWhiteSpace(values[0]) + && long.TryParse(values[0], out value)) + { + return value; + } + + return null; + } + set + { + if (value.HasValue) + { + HttpResponseInformation.Headers[Constants.Headers.ContentLength] = + new[] { value.Value.ToString(CultureInfo.InvariantCulture) }; + } + else + { + HttpResponseInformation.Headers.Remove(Constants.Headers.ContentLength); + } + } + } + public override string ContentType { get { - var contentTypeValues = HttpResponseInformation.Headers["Content-Type"]; + var contentTypeValues = HttpResponseInformation.Headers[Constants.Headers.ContentType]; return contentTypeValues.Length == 0 ? null : contentTypeValues[0]; } set { - HttpResponseInformation.Headers["Content-Type"] = new[] { value }; + if (string.IsNullOrWhiteSpace(value)) + { + HttpResponseInformation.Headers.Remove(Constants.Headers.ContentType); + } + else + { + HttpResponseInformation.Headers[Constants.Headers.ContentType] = new[] { value }; + } } } From 40a7181ff07e3f793d33add9656b0be875d10e38 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 7 Feb 2014 12:12:11 -0800 Subject: [PATCH 0036/1838] Lazy translate conditional Owin keys to Features. --- .../AppBuilderSupportExtensions.cs | 3 +- .../OwinConstants.cs | 1 + .../OwinHttpEnvironment.cs | 180 +++++++++++++++++- 3 files changed, 181 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs index dfb66eb492..215afb8bcf 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs @@ -31,8 +31,7 @@ namespace Owin return app.Invoke( new DefaultHttpContext( new FeatureCollection( - new FeatureObject( - new OwinHttpEnvironment(env))))); + new OwinHttpEnvironment(env)))); }; }; return appBuilder.Use(middleware1); diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs index c7eafe6019..45aabf2913 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs @@ -56,6 +56,7 @@ internal static class CommonKeys { public const string ClientCertificate = "ssl.ClientCertificate"; + public const string LoadClientCertAsync = "ssl.LoadClientCertAsync"; public const string RemoteIpAddress = "server.RemoteIpAddress"; public const string RemotePort = "server.RemotePort"; public const string LocalIpAddress = "server.LocalIpAddress"; diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs index 0fb7a5ea01..b03c9bd7fe 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs @@ -2,17 +2,23 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Linq; using System.Net; +using System.Reflection; #if NET45 using System.Security.Cryptography.X509Certificates; #endif using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.PipelineCore.Owin { + using SendFileFunc = Func; + public class OwinHttpEnvironment : + IFeatureCollection, IHttpRequestInformation, IHttpResponseInformation, IHttpConnection, @@ -149,9 +155,40 @@ namespace Microsoft.AspNet.PipelineCore.Owin set { Prop(OwinConstants.CommonKeys.LocalPort, value); } } + private bool SupportsSendFile + { + get + { + object obj; + return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null; + } + } + Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) { - throw new NotImplementedException(); + object obj; + if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) + { + SendFileFunc func = (SendFileFunc)obj; + return func(path, offset, length, cancellation); + } + throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); + } + + private bool SupportsClientCerts + { + get + { + object obj; + if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) + && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) + || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) + && obj != null) + { + return true; + } + return false; + } } #if NET45 X509Certificate IHttpTransportLayerSecurity.ClientCertificate @@ -164,5 +201,146 @@ namespace Microsoft.AspNet.PipelineCore.Owin { throw new NotImplementedException(); } + + public int Revision + { + get { return 0; } // Not modifiable + } + + public void Add(Type key, object value) + { + throw new NotSupportedException(); + } + + public bool ContainsKey(Type key) + { + // Does this type implement the requested interface? + if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) + { + // Check for conditional features + if (key == typeof(IHttpSendFile)) + { + return SupportsSendFile; + } + else if (key == typeof(IHttpTransportLayerSecurity)) + { + return SupportsClientCerts; + } + + // The rest of the features are always supported. + return true; + } + return false; + } + + public ICollection Keys + { + get + { + IList keys = new List() + { + typeof(IHttpRequestInformation), + typeof(IHttpResponseInformation), + typeof(IHttpConnection), + typeof(ICanHasOwinEnvironment), + }; + if (SupportsSendFile) + { + keys.Add(typeof(IHttpSendFile)); + } + if (SupportsClientCerts) + { + keys.Add(typeof(IHttpTransportLayerSecurity)); + } + return keys; + } + } + + public bool Remove(Type key) + { + throw new NotSupportedException(); + } + + public bool TryGetValue(Type key, out object value) + { + if (ContainsKey(key)) + { + value = this; + return true; + } + value = null; + return false; + } + + public ICollection Values + { + get { throw new NotSupportedException(); } + } + + public object this[Type key] + { + get + { + object value; + if (TryGetValue(key, out value)) + { + return value; + } + throw new KeyNotFoundException(key.FullName); + } + set + { + throw new NotSupportedException(); + } + } + + public void Add(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public void Clear() + { + throw new NotSupportedException(); + } + + public bool Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + public int Count + { + get { return Keys.Count; } + } + + public bool IsReadOnly + { + get { return true; } + } + + public bool Remove(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public IEnumerator> GetEnumerator() + { + return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Dispose() + { + } } } \ No newline at end of file From fe1011e50713732a608a3be1e766986b0115684c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 10 Feb 2014 10:52:19 -0800 Subject: [PATCH 0037/1838] Code review cleanup. --- .../OwinHttpEnvironment.cs | 26 ++++++++++++++++--- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 6 ++--- 3 files changed, 25 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs index b03c9bd7fe..02be7db4a5 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs +++ b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.PipelineCore.Owin object obj; if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) { - SendFileFunc func = (SendFileFunc)obj; + var func = (SendFileFunc)obj; return func(path, offset, length, cancellation); } throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); @@ -237,7 +237,7 @@ namespace Microsoft.AspNet.PipelineCore.Owin { get { - IList keys = new List() + var keys = new List() { typeof(IHttpRequestInformation), typeof(IHttpResponseInformation), @@ -306,12 +306,30 @@ namespace Microsoft.AspNet.PipelineCore.Owin public bool Contains(KeyValuePair item) { - throw new NotImplementedException(); + object result; + return TryGetValue(item.Key, out result) && result.Equals(item.Value); } public void CopyTo(KeyValuePair[] array, int arrayIndex) { - throw new NotImplementedException(); + if (array == null) + { + throw new ArgumentNullException("array"); + } + if (arrayIndex < 0 || arrayIndex > array.Length) + { + throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); + } + var keys = Keys; + if (keys.Count > array.Length - arrayIndex) + { + throw new ArgumentException(); + } + + foreach (var key in keys) + { + array[arrayIndex++] = new KeyValuePair(key, this[key]); + } } public int Count diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index ac5e3d7572..0f98a561f1 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -132,8 +132,8 @@ namespace Microsoft.AspNet.PipelineCore { get { + // TODO: Which feature exposes this? return CancellationToken.None; - // throw new NotImplementedException(); } set { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 5431315cb7..5fec0bc498 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -51,11 +51,9 @@ namespace Microsoft.AspNet.PipelineCore { get { - string[] values; long value; - if (HttpResponseInformation.Headers.TryGetValue(Constants.Headers.ContentLength, out values) - && values != null && values.Length > 0 && !string.IsNullOrWhiteSpace(values[0]) - && long.TryParse(values[0], out value)) + string rawValue = Headers.Get(Constants.Headers.ContentLength); + if (!string.IsNullOrWhiteSpace(rawValue) && long.TryParse(rawValue, out value)) { return value; } From f59d29b5ebac253ebd57ebf8ae276dc19cb2f262 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 10 Feb 2014 17:57:44 -0800 Subject: [PATCH 0038/1838] Renaming DefaultServices to GetDefaultServices --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 6 +++--- src/Microsoft.AspNet.Hosting/WebApplication.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 5af7a8c077..2c8a9437c9 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -10,12 +10,12 @@ namespace Microsoft.AspNet.Hosting { public static class HostingServices { - public static IEnumerable DefaultServices() + public static IEnumerable GetDefaultServices() { - return DefaultServices(new EmptyConfiguration()); + return GetDefaultServices(new EmptyConfiguration()); } - public static IEnumerable DefaultServices(IConfiguration configuration) + public static IEnumerable GetDefaultServices(IConfiguration configuration) { yield return DescribeService(configuration); yield return DescribeService(configuration); diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index 773ae80d26..fca80cb48c 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.Hosting { var context = new HostingContext { - Services = new ServiceProvider().Add(HostingServices.DefaultServices()) + Services = new ServiceProvider().Add(HostingServices.GetDefaultServices()) }; var engine = context.Services.GetService(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index ab29f28bb5..74580b3a5e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void HostingEngineCanBeResolvedWithDefaultServices() { var services = new ServiceProvider() - .Add(HostingServices.DefaultServices()); + .Add(HostingServices.GetDefaultServices()); var engine = services.GetService(); @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void HostingEngineCanBeStarted() { var services = new ServiceProvider() - .Add(HostingServices.DefaultServices() + .Add(HostingServices.GetDefaultServices() .Where(descriptor => descriptor.ServiceType != typeof(IServerManager))) .AddInstance(this); diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 4a848b13fb..c2770d98b0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting.Tests [Fact] public void DefaultServicesLocateStartupByNameAndNamespace() { - IServiceProvider services = new ServiceProvider().Add(HostingServices.DefaultServices()); + IServiceProvider services = new ServiceProvider().Add(HostingServices.GetDefaultServices()); var manager = services.GetService(); @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupClassMayHaveHostingServicesInjected() { IServiceProvider services = new ServiceProvider() - .Add(HostingServices.DefaultServices()) + .Add(HostingServices.GetDefaultServices()) .AddInstance(this); var manager = services.GetService(); From 14679a78ee91838637dc0d517ff9eb517fbefd47 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 10 Feb 2014 18:18:10 -0800 Subject: [PATCH 0039/1838] Implementing code review feedback --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 8 ++++---- src/Microsoft.AspNet.Hosting/Server/ServerManager.cs | 6 ++++-- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 2c8a9437c9..298b187a71 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -40,16 +40,16 @@ namespace Microsoft.AspNet.Hosting LifecycleKind lifecycle) { var serviceTypeName = serviceType.FullName; - var implemenationTypeName = configuration.Get(serviceTypeName); - if (!String.IsNullOrEmpty(implemenationTypeName)) + var implementationTypeName = configuration.Get(serviceTypeName); + if (!String.IsNullOrEmpty(implementationTypeName)) { try { - implementationType = Type.GetType(implemenationTypeName); + implementationType = Type.GetType(implementationTypeName); } catch (Exception ex) { - throw new Exception(string.Format("TODO: unable to locate implementation {0} for service {1}", implemenationTypeName, serviceTypeName), ex); + throw new Exception(string.Format("TODO: unable to locate implementation {0} for service {1}", implementationTypeName, serviceTypeName), ex); } } return new ServiceTypeDescriptor(serviceType, implementationType, lifecycle); diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index b8bf9cf6b5..a6b91be91d 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -1,10 +1,12 @@ +using System; + namespace Microsoft.AspNet.Hosting.Server { public class ServerManager : IServerManager { public IServerFactory GetServer(string serverName) { - throw new System.NotImplementedException(); + throw new NotImplementedException(); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index c0949b178f..da13ebfff9 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Hosting.Startup public Action LoadStartup(string applicationName, IList diagnosticMessages) { - if (String.IsNullOrWhiteSpace(applicationName)) + if (String.IsNullOrEmpty(applicationName)) { return _next.LoadStartup(applicationName, diagnosticMessages); } From a34826d90b21b9c5af7e2507e1a99302a7888279 Mon Sep 17 00:00:00 2001 From: Yishai Galatzer Date: Wed, 12 Feb 2014 12:43:13 -0800 Subject: [PATCH 0040/1838] Use the right collection, so accessing a non existent ContentType on a response doesn't throw and return null instead --- src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 5fec0bc498..9ff8135d63 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -78,8 +78,8 @@ namespace Microsoft.AspNet.PipelineCore { get { - var contentTypeValues = HttpResponseInformation.Headers[Constants.Headers.ContentType]; - return contentTypeValues.Length == 0 ? null : contentTypeValues[0]; + var contentType = Headers[Constants.Headers.ContentType]; + return contentType; } set { From 7aeecf6bce21fe2c9c9189a9affab9d1a8c9109f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 14 Feb 2014 00:20:08 -0800 Subject: [PATCH 0041/1838] Look for Startup and AssemblyName.Startup --- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index da13ebfff9..2ed642f959 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.Hosting.Startup throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); } - var type = assembly.GetType(typeName); + var type = assembly.GetType(typeName) ?? assembly.GetType(assemblyName + "." + typeName); if (type == null) { throw new Exception(String.Format("TODO: type {0} failed to load message", typeName)); From 69addcac863da0d2179a82dadb2cf137ef52a0ca Mon Sep 17 00:00:00 2001 From: GrabYourPitchforks Date: Fri, 14 Feb 2014 16:26:13 -0800 Subject: [PATCH 0042/1838] FeatureModel should use Type.IsInstanceOf rather than direct type equality. --- src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs | 7 +++---- src/Microsoft.AspNet.FeatureModel/FeatureObject.cs | 2 +- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 028a1c9477..d3aaff33cf 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,6 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Reflection; using System.Threading; using Microsoft.AspNet.FeatureModel.Implementation; @@ -42,11 +43,7 @@ namespace Microsoft.AspNet.FeatureModel { if (_featureByFeatureType.TryGetValue(actualType, out feature)) { -#if NET45 var isInstanceOfType = type.IsInstanceOfType(feature); -#else - var isInstanceOfType = feature != null && type == feature.GetType(); -#endif if (isInstanceOfType) { @@ -54,6 +51,8 @@ namespace Microsoft.AspNet.FeatureModel } #if NET45 return Converter.Convert(type, actualType, feature); +#else + return null; #endif } } diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index fbc69b814f..42d2bf8e79 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -27,12 +27,12 @@ namespace Microsoft.AspNet.FeatureModel public object GetInterface(Type type) { -#if NET45 if (type.IsInstanceOfType(_instance)) { return _instance; } +#if NET45 foreach (var interfaceType in _instance.GetType().GetInterfaces()) { if (interfaceType.FullName == type.FullName) From ad5a77ca4c0bec8bd25c13aae141c1acc1b3d650 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 14 Feb 2014 19:56:27 -0800 Subject: [PATCH 0043/1838] Removing csproj files that are not meant to be commited --- ...Microsoft.AspNet.PipelineCore.net45.csproj | 86 ----------------- ...Microsoft.AspNet.PipelineCore.Tests.csproj | 95 ------------------- 2 files changed, 181 deletions(-) delete mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj delete mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj deleted file mode 100644 index 08b14e00ac..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.net45.csproj +++ /dev/null @@ -1,86 +0,0 @@ - - - - - Debug - AnyCPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B} - Library - Properties - Microsoft.AspNet.PipelineCore - Microsoft.AspNet.PipelineCore - v4.5 - 512 - obj/net45 - - - AnyCPU - true - full - false - bin\Debug\net45 - DEBUG;TRACE;NET45; - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\net45 - TRACE;NET45; - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} - Microsoft.AspNet.FeatureModel - - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} - Microsoft.AspNet.Abstractions - - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} - Microsoft.AspNet.HttpFeature - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj deleted file mode 100644 index d68b62764a..0000000000 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.csproj +++ /dev/null @@ -1,95 +0,0 @@ - - - - - Debug - AnyCPU - {86942914-0334-4352-87ED-B971281C74E2} - Library - Properties - Microsoft.AspNet.PipelineCore.Tests - Microsoft.AspNet.PipelineCore.Tests - v4.5 - 512 - - - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - bin\Release\Microsoft.AspNet.PipelineCore.Tests.XML - - - - False - ..\..\packages\Moq.4.2.1312.1622\lib\net40\Moq.dll - - - False - ..\..\packages\Shouldly.1.1.1.1\lib\35\Shouldly.dll - - - - - - - - - - False - ..\..\packages\xunit.1.9.2\lib\net20\xunit.dll - - - - - - - - - - - - - - - - - - - - - - - - - {d36288af-8a0e-48dd-8af8-15b72f91c70a} - Microsoft.AspNet.Abstractions.net45 - - - {68a538ba-d542-49cb-9615-b4f5a4e78c87} - Microsoft.AspNet.PipelineCore.net45 - - - - - - - - \ No newline at end of file From fe15f4a84976d9110c8a3ce3877712a70c3c6a6e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 17 Feb 2014 15:27:32 -0800 Subject: [PATCH 0044/1838] Ensure HttpResponse.Query is populated with query string values --- .../DefaultCanHasQuery.cs | 3 +- .../Infrastructure/ParsingHelpers.cs | 32 ++++++------------- .../DefaultCanHasQueryTests.cs | 31 ++++++++++++++++++ 3 files changed, 41 insertions(+), 25 deletions(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs index fa3069d427..9a3e45e5fb 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs @@ -27,8 +27,7 @@ namespace Microsoft.AspNet.PipelineCore if (_query == null || _queryString != queryString) { _queryString = queryString; - // TODO - _query = new ReadableStringCollection(new Dictionary()); + _query = new ReadableStringCollection(ParsingHelpers.GetQuery(queryString)); } return _query; } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 91254955f7..18153db162 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,9 +1,9 @@ -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.PipelineCore.Collections; using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure { @@ -799,28 +799,14 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; - internal static IDictionary GetQuery(HttpRequest request) + internal static IDictionary GetQuery(string queryString) { - var query = GetItem>(request, "Microsoft.Owin.Query#dictionary"); - if (query == null) - { - query = new Dictionary(StringComparer.OrdinalIgnoreCase); - SetItem(request, "Microsoft.Owin.Query#dictionary", query); - } - - string text = request.QueryString.Value; - if (GetItem(request, "Microsoft.Owin.Query#text") != text) - { - query.Clear(); - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, AmpersandAndSemicolon, AppendItemCallback, accumulator); - foreach (var kv in accumulator) - { - query.Add(kv.Key, kv.Value.ToArray()); - } - SetItem(request, "Microsoft.Owin.Query#text", text); - } - return query; + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); + return accumulator.ToDictionary( + item => item.Key, + item => item.Value.ToArray(), + StringComparer.OrdinalIgnoreCase); } #if !NET40 diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs new file mode 100644 index 0000000000..5bef67e18d --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs @@ -0,0 +1,31 @@ +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultCanHasQueryTests + { + [Fact] + public void QueryReturnsParsedQueryCollection() + { + // Arrange + var features = new Mock(); + var request = new Mock(); + request.SetupGet(r => r.QueryString).Returns("foo=bar"); + + object value = request.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + .Returns(true); + + var provider = new DefaultCanHasQuery(features.Object); + + // Act + var queryCollection = provider.Query; + + // Assert + Assert.Equal("bar", queryCollection["foo"]); + } + } +} From 590ae2720857d6346548f0175d5f9e6b693938fa Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 24 Feb 2014 13:31:31 -0800 Subject: [PATCH 0045/1838] Adding ITypeActivator and TypeActivator to hosting services --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 298b187a71..19982a159a 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -25,6 +25,8 @@ namespace Microsoft.AspNet.Hosting yield return DescribeService(configuration); yield return DescribeService(configuration); + + yield return DescribeService(configuration); } public static IServiceDescriptor DescribeService(IConfiguration configuration, From 09cc1964e7d24bc9ff3ad49af5282efff167006b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 25 Feb 2014 12:52:00 -0800 Subject: [PATCH 0046/1838] Adding GetFormAsync on HttpRequest to read form data --- .../HttpRequest.cs | 7 ++ .../DefaultCanHasForm.cs | 42 ++++++++++++ .../DefaultHttpRequest.cs | 12 ++++ .../ICanHasForm.cs | 10 +++ .../DefaultCanHasFormTests.cs | 68 +++++++++++++++++++ 5 files changed, 139 insertions(+) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index f7b85de29d..9e8f53a110 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Threading; +using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions { @@ -58,6 +59,12 @@ namespace Microsoft.AspNet.Abstractions /// The query value collection parsed from owin.RequestQueryString. public abstract IReadableStringCollection Query { get; } + /// + /// Gets the query value collection form collection. + /// + /// The form collection parsed from the request body. + public abstract Task GetFormAsync(); + /// /// Gets or set the owin.RequestProtocol. /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs new file mode 100644 index 0000000000..d7547eab2a --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs @@ -0,0 +1,42 @@ +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultCanHasForm : ICanHasForm + { + private readonly IFeatureCollection _features; + private readonly FeatureReference _request = FeatureReference.Default; + private Stream _bodyStream; + private IReadableStringCollection _form; + + public DefaultCanHasForm(IFeatureCollection features) + { + _features = features; + } + + public async Task GetFormAsync() + { + var body = _request.Fetch(_features).Body; + + if (_bodyStream == null || _bodyStream != body) + { + _bodyStream = body; + using (var streamReader = new StreamReader(body, Encoding.UTF8, + detectEncodingFromByteOrderMarks: true, + bufferSize: 1024, leaveOpen: true)) + { + string formQuery = await streamReader.ReadToEndAsync(); + _form = new ReadableStringCollection(ParsingHelpers.GetQuery(formQuery)); + } + } + return _form; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 0f98a561f1..7afd73181d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,6 +1,7 @@ using System; using System.IO; using System.Threading; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; @@ -18,6 +19,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _connection = FeatureReference.Default; private FeatureReference _transportLayerSecurity = FeatureReference.Default; private FeatureReference _canHasQuery = FeatureReference.Default; + private FeatureReference _canHasForm = FeatureReference.Default; private FeatureReference _canHasCookies = FeatureReference.Default; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) @@ -46,6 +48,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasQuery.Fetch(_features) ?? _canHasQuery.Update(_features, new DefaultCanHasQuery(_features)); } } + private ICanHasForm CanHasForm + { + get { return _canHasForm.Fetch(_features) ?? _canHasForm.Update(_features, new DefaultCanHasForm(_features)); } + } + private ICanHasRequestCookies CanHasRequestCookies { get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasRequestCookies(_features)); } @@ -112,6 +119,11 @@ namespace Microsoft.AspNet.PipelineCore get { return CanHasQuery.Query; } } + public override Task GetFormAsync() + { + return CanHasForm.GetFormAsync(); + } + public override string Protocol { get { return HttpRequestInformation.Protocol; } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs new file mode 100644 index 0000000000..aba500a592 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.PipelineCore +{ + public interface ICanHasForm + { + Task GetFormAsync(); + } +} diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs new file mode 100644 index 0000000000..967839793d --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs @@ -0,0 +1,68 @@ +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Moq; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultCanHasFormTests + { + [Fact] + public async Task GetFormAsync_ReturnsParsedFormCollection() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); + var features = new Mock(); + var request = new Mock(); + request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent)); + + object value = request.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + .Returns(true); + + var provider = new DefaultCanHasForm(features.Object); + + // Act + var formCollection = await provider.GetFormAsync(); + + // Assert + Assert.Equal("bar", formCollection["foo"]); + Assert.Equal("2", formCollection["baz"]); + } + + [Fact] + public async Task GetFormAsync_CachesFormCollectionPerBodyStream() + { + // Arrange + var formContent1 = Encoding.UTF8.GetBytes("foo=bar&baz=2"); + var formContent2 = Encoding.UTF8.GetBytes("collection2=value"); + var features = new Mock(); + var request = new Mock(); + request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent1)); + + object value = request.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + .Returns(true); + + var provider = new DefaultCanHasForm(features.Object); + + // Act - 1 + var formCollection = await provider.GetFormAsync(); + + // Assert - 1 + Assert.Equal("bar", formCollection["foo"]); + Assert.Equal("2", formCollection["baz"]); + Assert.Same(formCollection, await provider.GetFormAsync()); + + // Act - 2 + request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent2)); + formCollection = await provider.GetFormAsync(); + + // Assert - 2 + Assert.Equal("value", formCollection["collection2"]); + } + } +} From c4e98614e5cd11331e706b83493df8497404d701 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 4 Mar 2014 20:23:51 -0800 Subject: [PATCH 0047/1838] Pointing at updated configuration package name --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 12 ++---------- src/Microsoft.AspNet.Hosting/project.json | 2 +- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 19982a159a..a8b90e96b4 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -1,6 +1,6 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Configuration; +using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Startup; @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Hosting { public static IEnumerable GetDefaultServices() { - return GetDefaultServices(new EmptyConfiguration()); + return GetDefaultServices(new Configuration()); } public static IEnumerable GetDefaultServices(IConfiguration configuration) @@ -57,14 +57,6 @@ namespace Microsoft.AspNet.Hosting return new ServiceTypeDescriptor(serviceType, implementationType, lifecycle); } - public class EmptyConfiguration : IConfiguration - { - public string Get(string key) - { - return null; - } - } - public class ServiceTypeDescriptor : IServiceDescriptor { public ServiceTypeDescriptor(Type serviceType, Type implementationType, LifecycleKind lifecycle) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 57e379cfb1..ae3bdc0eef 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies":{ "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", - "Microsoft.AspNet.Configuration":"0.1-alpha-*", + "Microsoft.AspNet.ConfigurationModel":"0.1-alpha-*", "Microsoft.AspNet.PipelineCore":"0.1-alpha-*", "Microsoft.AspNet.Abstractions":"0.1-alpha-*", "Microsoft.AspNet.FeatureModel":"0.1-alpha-*" From 2dfdfafaa6b7223edd6fc1d3a95f570c38b905ea Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 7 Mar 2014 02:17:04 -0800 Subject: [PATCH 0048/1838] Added required packages for K --- .../project.json | 15 +++++++++-- .../Implementation/Converter.cs | 2 ++ .../project.json | 14 +++++++++-- .../IHttpConnection.cs | 2 ++ src/Microsoft.AspNet.HttpFeature/project.json | 12 +++++++-- .../project.json | 25 +++++++++++++++---- 6 files changed, 59 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 5f23498788..669ddaed1c 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -2,7 +2,18 @@ "version": "0.1-alpha-*", "dependencies": {}, "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.IO": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs index 32f3943634..0102dea38a 100644 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs @@ -2,7 +2,9 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; +#if NET45 using System.Reflection.Emit; +#endif using System.Runtime.CompilerServices; namespace Microsoft.AspNet.FeatureModel.Implementation diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 5f23498788..33f8ba15f7 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,17 @@ "version": "0.1-alpha-*", "dependencies": {}, "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Reflection.Compatibility": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Threading": "4.0.0.0" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index fcb2318f3d..9af5df12e8 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,4 +1,6 @@ +#if NET45 using System.Net; +#endif namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 17465c3576..4660c1d1cd 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,7 +1,15 @@ { "version": "0.1-alpha-*", "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.IO": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Security.Principal": "4.0.0.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index c55207d3f0..82b021a735 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,12 +1,27 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.FeatureModel" : "", - "Microsoft.AspNet.Abstractions" : "", - "Microsoft.AspNet.HttpFeature" : "" + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.HttpFeature": "" }, "configurations": { - "net45": { }, - "k10" : { } + "net45": {}, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Text.Encoding": "4.0.10.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } } \ No newline at end of file From f420ba460019b4c216dbccf53d153e7d5ee8bcb8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 7 Mar 2014 02:39:48 -0800 Subject: [PATCH 0049/1838] Added required packages for K --- src/Microsoft.AspNet.Hosting/project.json | 30 ++++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index ae3bdc0eef..0577dc0777 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,14 +1,26 @@ { "version": "0.1-alpha-*", - "dependencies":{ - "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", - "Microsoft.AspNet.ConfigurationModel":"0.1-alpha-*", - "Microsoft.AspNet.PipelineCore":"0.1-alpha-*", - "Microsoft.AspNet.Abstractions":"0.1-alpha-*", - "Microsoft.AspNet.FeatureModel":"0.1-alpha-*" + "dependencies": { + "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", + "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", + "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", + "Microsoft.AspNet.Abstractions": "0.1-alpha-*", + "Microsoft.AspNet.FeatureModel": "0.1-alpha-*" }, "configurations": { - "net45" : {}, - "k10" : {} + "net45": {}, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.0.0" + } + } } -} +} \ No newline at end of file From 7423a21b11523c8d6be74d6b9905aeaec329482f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 8 Mar 2014 12:34:29 -0800 Subject: [PATCH 0050/1838] Added ability to run unit tests on build --- global.json | 3 +++ .../project.json | 20 ++++++++++++++----- 2 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 global.json diff --git a/global.json b/global.json new file mode 100644 index 0000000000..840c36f6ad --- /dev/null +++ b/global.json @@ -0,0 +1,3 @@ +{ + "sources": ["src"] +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 486e0ac6b1..05d852b2aa 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,12 +1,22 @@ { "version": "0.1-alpha-*", "dependencies": { - "xunit": "1.9.2", - "Microsoft.AspNet.Hosting":"", - "Microsoft.AspNet.Abstractions":"0.1-alpha-*", - "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*" + "Microsoft.AspNet.Hosting": "", + "Microsoft.AspNet.Abstractions":"0.1-alpha-*", + "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "3.0.0-alpha-*", + "xunit2": "0.1-alpha-*", + "xunit2.assert": "0.1-alpha-*" }, "configurations": { - "net45": {} + "net45": { + "dependencies": { + "System.Runtime" : "" + } + } + }, + "commands": { + "test": "Xunit.KRunner" } } \ No newline at end of file From 059a7665d030d158d4f1fa9746ef7884a131be23 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Mon, 10 Mar 2014 12:28:41 -0700 Subject: [PATCH 0051/1838] React to xunit changes --- test/Microsoft.AspNet.Hosting.Tests/project.json | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 05d852b2aa..8c46f5dd94 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -5,9 +5,10 @@ "Microsoft.AspNet.Abstractions":"0.1-alpha-*", "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", "Xunit.KRunner": "0.1-alpha-*", - "xunit.abstractions": "3.0.0-alpha-*", - "xunit2": "0.1-alpha-*", - "xunit2.assert": "0.1-alpha-*" + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" }, "configurations": { "net45": { From 9ac0a8c70333cd96fc6922e8aefd4f916e4dc288 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 10 Mar 2014 18:00:54 -0700 Subject: [PATCH 0052/1838] Adding ContentLength to HttpRequest Partially addresses #15 --- .../HttpRequest.cs | 5 ++ .../DefaultHttpRequest.cs | 15 +++- .../DefaultHttpResponse.cs | 19 +---- .../Infrastructure/ParsingHelpers.cs | 32 ++++++++- .../DefaultHttpRequestTests.cs | 70 +++++++++++++++++++ .../project.json | 1 + 6 files changed, 122 insertions(+), 20 deletions(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index 9e8f53a110..b4f563464b 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -83,6 +83,11 @@ namespace Microsoft.AspNet.Abstractions /// The collection of Cookies for this request. public abstract IReadableStringCollection Cookies { get; } + /// + /// Gets or sets the Content-Length header + /// + public abstract long? ContentLength { get; set; } + /// /// Gets or sets the Content-Type header. /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 7afd73181d..9579b7c814 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,8 +1,10 @@ using System; +using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; @@ -58,7 +60,6 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasRequestCookies(_features)); } } - public override HttpContext HttpContext { get { return _context; } } public override PathString PathBase @@ -79,6 +80,18 @@ namespace Microsoft.AspNet.PipelineCore set { HttpRequestInformation.QueryString = value.Value; } } + public override long? ContentLength + { + get + { + return ParsingHelpers.GetContentLength(Headers); + } + set + { + ParsingHelpers.SetContentLength(Headers, value); + } + } + public override Stream Body { get { return HttpRequestInformation.Body; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 9ff8135d63..c1ec42c5d0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -51,26 +51,11 @@ namespace Microsoft.AspNet.PipelineCore { get { - long value; - string rawValue = Headers.Get(Constants.Headers.ContentLength); - if (!string.IsNullOrWhiteSpace(rawValue) && long.TryParse(rawValue, out value)) - { - return value; - } - - return null; + return ParsingHelpers.GetContentLength(Headers); } set { - if (value.HasValue) - { - HttpResponseInformation.Headers[Constants.Headers.ContentLength] = - new[] { value.Value.ToString(CultureInfo.InvariantCulture) }; - } - else - { - HttpResponseInformation.Headers.Remove(Constants.Headers.ContentLength); - } + ParsingHelpers.SetContentLength(Headers, value); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 18153db162..7ab6b1c817 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,8 +1,10 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Globalization; using System.Linq; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure @@ -804,8 +806,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); return accumulator.ToDictionary( - item => item.Key, - item => item.Value.ToArray(), + item => item.Key, + item => item.Value.ToArray(), StringComparer.OrdinalIgnoreCase); } @@ -856,5 +858,31 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure // var localPort = request.Get(OwinConstants.CommonKeys.LocalPort); // return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); //} + + public static long? GetContentLength(IHeaderDictionary headers) + { + const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; + long value; + string rawValue = headers.Get(Constants.Headers.ContentLength); + if (!string.IsNullOrWhiteSpace(rawValue) && + long.TryParse(rawValue, styles, CultureInfo.InvariantCulture, out value)) + { + return value; + } + + return null; + } + + public static void SetContentLength(IHeaderDictionary headers, long? value) + { + if (value.HasValue) + { + headers[Constants.Headers.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); + } + else + { + headers.Remove(Constants.Headers.ContentLength); + } + } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs new file mode 100644 index 0000000000..f56039abf9 --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -0,0 +1,70 @@ +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Moq; +using Xunit; +using Xunit.Extensions; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultHttpRequestTests + { + [Theory] + [InlineData(0)] + [InlineData(9001)] + [InlineData(65535)] + public void GetContentLength_ReturnsParsedHeader(long value) + { + // Arrange + var request = GetRequest(value.ToString(CultureInfo.InvariantCulture)); + + // Act and Assert + Assert.Equal(value, request.ContentLength); + } + + [Fact] + public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequest(contentLength: null); + + // Act and Assert + Assert.Null(request.ContentLength); + } + + [Theory] + [InlineData("cant-parse-this")] + [InlineData("-1000")] + [InlineData("1000.00")] + [InlineData("100/5")] + public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) + { + // Arrange + var request = GetRequest(contentLength); + + // Act and Assert + Assert.Null(request.ContentLength); + } + + private static DefaultHttpRequest GetRequest(string contentLength = null) + { + var features = new Mock(); + var mockRequestInfo = new Mock(); + var headers = new Dictionary(); + if (contentLength != null) + { + headers.Add("Content-Length", new[] { contentLength }); + + } + mockRequestInfo.SetupGet(r => r.Headers) + .Returns(headers); + object requestInfo = mockRequestInfo.Object; + features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out requestInfo)) + .Returns(true); + var context = new DefaultHttpContext(features.Object); + var request = new DefaultHttpRequest(context, features.Object); + return request; + } + } +} diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index e4bb833e89..5d77e10d07 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -16,6 +16,7 @@ "Microsoft.Owin.Testing": "2.1.0", "Moq": "4.2.1312.1622", "xunit": "1.9.2", + "xunit.extensions": "1.9.2", "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" } From 45adfac95b3a8b4fcdd9e6fd36635f3b220cfa95 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 11 Mar 2014 11:38:25 -0700 Subject: [PATCH 0053/1838] Updating MyGet feed to unblock build --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index ab583b0ff7..9dc2833940 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 543e818acda8a28198e078c5e2adbab738edceb0 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 10 Mar 2014 17:12:16 -0700 Subject: [PATCH 0054/1838] Add support for host based on Host header --- .../DefaultHttpRequest.cs | 10 +- .../DefaultHttpRequestTests.cs | 95 +++++++++++++++---- 2 files changed, 81 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 9579b7c814..188cf06102 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -117,14 +117,8 @@ namespace Microsoft.AspNet.PipelineCore public override HostString Host { - get - { - throw new NotImplementedException(); - } - set - { - throw new NotImplementedException(); - } + get { return HostString.FromUriComponent(Headers["Host"]); } + set { Headers["Host"] = value.ToUriComponent(); } } public override IReadableStringCollection Query diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index f56039abf9..652edf2927 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,5 +1,7 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Globalization; +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; @@ -17,7 +19,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsParsedHeader(long value) { // Arrange - var request = GetRequest(value.ToString(CultureInfo.InvariantCulture)); + var request = GetRequestWithContentLength(value.ToString(CultureInfo.InvariantCulture)); // Act and Assert Assert.Equal(value, request.ContentLength); @@ -27,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() { // Arrange - var request = GetRequest(contentLength: null); + var request = GetRequestWithContentLength(contentLength: null); // Act and Assert Assert.Null(request.ContentLength); @@ -41,30 +43,91 @@ namespace Microsoft.AspNet.PipelineCore.Tests public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) { // Arrange - var request = GetRequest(contentLength); + var request = GetRequestWithContentLength(contentLength); // Act and Assert Assert.Null(request.ContentLength); } - private static DefaultHttpRequest GetRequest(string contentLength = null) + [Fact] + public void Host_GetsHostFromHeaders() { - var features = new Mock(); - var mockRequestInfo = new Mock(); - var headers = new Dictionary(); + // Arrange + const string expected = "localhost:9001"; + + var headers = new Dictionary(StringComparer.Ordinal) + { + { "Host", new string[]{ expected } }, + }; + + var request = CreateRequest(headers); + + // Act + var host = request.Host; + + // Assert + Assert.Equal(expected, host.Value); + } + + [Fact] + public void Host_DecodesPunyCode() + { + // Arrange + const string expected = "löcalhöst"; + + var headers = new Dictionary(StringComparer.Ordinal) + { + { "Host", new string[]{ "xn--lcalhst-90ae" } }, + }; + + var request = CreateRequest(headers); + + // Act + var host = request.Host; + + // Assert + Assert.Equal(expected, host.Value); + } + + [Fact] + public void Host_EncodesPunyCode() + { + // Arrange + const string expected = "xn--lcalhst-90ae"; + + var headers = new Dictionary(StringComparer.Ordinal); + + var request = CreateRequest(headers); + + // Act + request.Host = new HostString("löcalhöst"); + + // Assert + Assert.Equal(expected, headers["Host"][0]); + } + + private static DefaultHttpRequest CreateRequest(IDictionary headers) + { + var requestInfo = new Mock(); + requestInfo.SetupGet(r => r.Headers).Returns(headers); + + var features = new FeatureCollection(); + features.Add(typeof(IHttpRequestInformation), requestInfo.Object); + + var context = new DefaultHttpContext(features); + return new DefaultHttpRequest(context, features); + } + + private static DefaultHttpRequest GetRequestWithContentLength(string contentLength = null) + { + var headers = new Dictionary(StringComparer.Ordinal); if (contentLength != null) { headers.Add("Content-Length", new[] { contentLength }); } - mockRequestInfo.SetupGet(r => r.Headers) - .Returns(headers); - object requestInfo = mockRequestInfo.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out requestInfo)) - .Returns(true); - var context = new DefaultHttpContext(features.Object); - var request = new DefaultHttpRequest(context, features.Object); - return request; + + return CreateRequest(headers); } } } From a3eb280275a5f16425be004610fd1110eee9dbcf Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 12 Mar 2014 15:07:37 -0700 Subject: [PATCH 0055/1838] Implement Program.Main and ServerManager. Add Startup search. --- samples/KWebStartup/Startup.cs | 21 +++++ samples/KWebStartup/project.json | 32 ++++++++ .../AssemblyNeutralAttribute.cs | 10 +++ src/Microsoft.AspNet.Hosting/HostingEngine.cs | 4 +- .../HostingServices.cs | 2 +- .../IApplicationEnvironment.cs | 14 ++++ src/Microsoft.AspNet.Hosting/Program.cs | 60 ++++++++++++++ .../Server/IServerFactory.cs | 2 + .../Server/IServerFactoryProvider.cs | 7 -- .../Server/IServerManager.cs | 2 +- .../Server/ServerManager.cs | 81 ++++++++++++++++++- .../ServerFactoryProvider.cs | 13 --- .../Startup/StartupLoader.cs | 81 ++++++++++++------- src/Microsoft.AspNet.Hosting/project.json | 3 + .../HostingEngineTests.cs | 12 +-- 15 files changed, 281 insertions(+), 63 deletions(-) create mode 100644 samples/KWebStartup/Startup.cs create mode 100644 samples/KWebStartup/project.json create mode 100644 src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs create mode 100644 src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs create mode 100644 src/Microsoft.AspNet.Hosting/Program.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs delete mode 100644 src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs new file mode 100644 index 0000000000..cd080de5f2 --- /dev/null +++ b/samples/KWebStartup/Startup.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNet.Abstractions; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace KWebStartup +{ + public class Startup + { + public void Configuration(IBuilder app) + { + app.Run(async context => + { + context.Response.ContentType = "text/plain"; + await context.Response.WriteAsync("Hello world"); + }); + } + } +} \ No newline at end of file diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json new file mode 100644 index 0000000000..471e0621f6 --- /dev/null +++ b/samples/KWebStartup/project.json @@ -0,0 +1,32 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Hosting": "0.1-alpha-*", + "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" + }, + "commands": { "web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener" }, + "configurations": { + "net45": { + }, + "k10": { + "dependencies": { + "System.Console": "4.0.0.0", + "System.Collections": "4.0.0.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.0.0", + "System.IO.FileSystem": "4.0.0.0", + "System.IO.FileSystem.Primitives": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Resources.ResourceManager": "4.0.0.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.10.0", + "System.Text.Encoding": "4.0.10.0", + "System.Threading.Tasks": "4.0.0.0" + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs new file mode 100644 index 0000000000..2191d5198d --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.Net.Runtime +{ + [AssemblyNeutral] + [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] + public sealed class AssemblyNeutralAttribute : Attribute + { + } +} diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 6a33dbde7d..da496d32e0 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Hosting.Server; @@ -54,12 +55,13 @@ namespace Microsoft.AspNet.Hosting private void EnsureServerFactory(HostingContext context) { + context.ServerFactory = context.ServerFactory ?? context.Services.GetService(); if (context.ServerFactory != null) { return; } - context.ServerFactory = _serverManager.GetServer(context.ServerName); + context.ServerFactory = _serverManager.GetServerFactory(context.ServerName); } private void EnsureApplicationDelegate(HostingContext context) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index a8b90e96b4..d5f4d58a59 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Hosting public static IEnumerable GetDefaultServices(IConfiguration configuration) { yield return DescribeService(configuration); - yield return DescribeService(configuration); + yield return DescribeService(configuration); yield return DescribeService(configuration); yield return DescribeService(configuration); diff --git a/src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs b/src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs new file mode 100644 index 0000000000..1c772bc835 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs @@ -0,0 +1,14 @@ +using System; +using System.Runtime.Versioning; + +namespace Microsoft.Net.Runtime +{ + [AssemblyNeutral] + public interface IApplicationEnvironment + { + string ApplicationName { get; } + string Version { get; } + string ApplicationBasePath { get; } + FrameworkName TargetFramework { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs new file mode 100644 index 0000000000..3b1f10ae33 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -0,0 +1,60 @@ +using Microsoft.AspNet.ConfigurationModel; +using Microsoft.AspNet.ConfigurationModel.Sources; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.Net.Runtime; +using System; +using System.IO; + +namespace Microsoft.AspNet.Hosting +{ + public class Program + { + private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini"; + + private readonly IServiceProvider _serviceProvider; + + public Program(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + + public void Main(string[] args) + { + var config = new Configuration(); + config.AddCommandLine(args); + config.AddEnvironmentVariables(); + if (File.Exists(HostingIniFile)) + { + config.AddIniFile(HostingIniFile); + } + + var services = new ServiceProvider(_serviceProvider) + .Add(HostingServices.GetDefaultServices(config)); + + var appEnvironment = _serviceProvider.GetService(); + + var context = new HostingContext() + { + Services = services, + ServerName = config.Get("server.name"), // TODO: Key names + ApplicationName = config.Get("app.name") // TODO: Key names + ?? appEnvironment.ApplicationName, + }; + + var engine = services.GetService(); + if (engine == null) + { + throw new Exception("TODO: IHostingEngine service not available exception"); + } + + using (engine.Start(context)) + { +#if NET45 + Console.WriteLine("Started"); + Console.ReadLine(); +#endif + } + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 2d8350d53e..368004e197 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -1,9 +1,11 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting.Server { + [AssemblyNeutral] public interface IServerFactory { IDisposable Start(Func application); diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs deleted file mode 100644 index 714a51ba8b..0000000000 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactoryProvider.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Microsoft.AspNet.Hosting.Server -{ - public interface IServerFactoryProvider - { - IServerFactory GetServerFactory(string serverName); - } -} diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs index 471f9445bd..5a6b6b9166 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs @@ -2,6 +2,6 @@ namespace Microsoft.AspNet.Hosting.Server { public interface IServerManager { - IServerFactory GetServer(string serverName); + IServerFactory GetServerFactory(string serverName); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index a6b91be91d..a35e3a9fb6 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -1,12 +1,89 @@ +using Microsoft.AspNet.DependencyInjection; using System; +using System.Linq; +using System.Reflection; namespace Microsoft.AspNet.Hosting.Server { public class ServerManager : IServerManager { - public IServerFactory GetServer(string serverName) + private readonly IServiceProvider _services; + + public ServerManager(IServiceProvider services) { - throw new NotImplementedException(); + _services = services; + } + + public IServerFactory GetServerFactory(string serverFactoryIdentifier) + { + if (string.IsNullOrWhiteSpace(serverFactoryIdentifier)) + { + throw new ArgumentNullException("serverFactoryIdentifier"); + } + + string typeName; + string assemblyName; + var parts = serverFactoryIdentifier.Split(new[] { ',' }, 2); + if (parts.Length == 1) + { + typeName = null; + assemblyName = serverFactoryIdentifier; + } + else if (parts.Length == 2) + { + typeName = parts[0]; + assemblyName = parts[1]; + } + else + { + throw new ArgumentException("TODO: Unrecognized format", "serverFactoryIdentifier"); + } + + var assembly = Assembly.Load(new AssemblyName(assemblyName)); + if (assembly == null) + { + throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); + } + + Type type = null; + Type interfaceInfo; + if (string.IsNullOrWhiteSpace(typeName)) + { + foreach (var typeInfo in assembly.DefinedTypes) + { + interfaceInfo = typeInfo.ImplementedInterfaces.FirstOrDefault(interf => + interf.FullName == typeof(IServerFactory).FullName); + if (interfaceInfo != null) + { + type = typeInfo.AsType(); + } + } + + if (type == null) + { + throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "")); + } + } + else + { + type = assembly.GetType(typeName) ?? assembly.GetType(assemblyName + "." + typeName); + + if (type == null) + { + throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "")); + } + + interfaceInfo = type.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(interf => + interf.FullName == typeof(IServerFactory).FullName); + + if (interfaceInfo == null) + { + throw new Exception("TODO: IServerFactory interface not found"); + } + } + + object instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); + return (IServerFactory)instance; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs b/src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs deleted file mode 100644 index eb5743a86a..0000000000 --- a/src/Microsoft.AspNet.Hosting/ServerFactoryProvider.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; -using Microsoft.AspNet.Hosting.Server; - -namespace Microsoft.AspNet.Hosting -{ - public class ServerFactoryProvider : IServerFactoryProvider - { - public IServerFactory GetServerFactory(string serverFactoryIdentifier) - { - throw new NotImplementedException(); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 2ed642f959..abdd853bbf 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -25,38 +25,61 @@ namespace Microsoft.AspNet.Hosting.Startup return _next.LoadStartup(applicationName, diagnosticMessages); } + string typeName; + string assemblyName; var parts = applicationName.Split(new[] { ',' }, 2); - if (parts.Length == 2) + if (parts.Length == 1) { - var typeName = parts[0]; - var assemblyName = parts[1]; - - var assembly = Assembly.Load(new AssemblyName(assemblyName)); - if (assembly == null) - { - throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); - } - - var type = assembly.GetType(typeName) ?? assembly.GetType(assemblyName + "." + typeName); - if (type == null) - { - throw new Exception(String.Format("TODO: type {0} failed to load message", typeName)); - } - - var methodInfo = type.GetTypeInfo().GetDeclaredMethod("Configuration"); - if (methodInfo == null) - { - throw new Exception("TODO: Configuration method not found"); - } - - object instance = null; - if (!methodInfo.IsStatic) - { - instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); - } - return builder => methodInfo.Invoke(instance, new object[] { builder }); + typeName = null; + assemblyName = applicationName; } - throw new Exception("TODO: Unrecognized format"); + else if (parts.Length == 2) + { + typeName = parts[0]; + assemblyName = parts[1]; + } + else + { + throw new Exception("TODO: Unrecognized format"); + } + + var assembly = Assembly.Load(new AssemblyName(assemblyName)); + if (assembly == null) + { + throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); + } + + Type type = null; + if (string.IsNullOrWhiteSpace(typeName)) + { + var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals("Startup")); + if (typeInfo != null) + { + type = typeInfo.AsType(); + } + } + else + { + type = assembly.GetType(typeName); + } + + if (type == null) + { + throw new Exception(String.Format("TODO: type {0} failed to load message", typeName)); + } + + var methodInfo = type.GetTypeInfo().GetDeclaredMethod("Configuration"); + if (methodInfo == null) + { + throw new Exception("TODO: Configuration method not found"); + } + + object instance = null; + if (!methodInfo.IsStatic) + { + instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); + } + return builder => methodInfo.Invoke(instance, new object[] { builder }); } } } diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 0577dc0777..07acc75da3 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -14,6 +14,9 @@ "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", + "System.IO": "4.0.0.0", + "System.IO.FileSystem": "4.0.0.0", + "System.IO.FileSystem.Primitives": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Runtime": "4.0.20.0", diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 74580b3a5e..476e1a4454 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -10,7 +10,7 @@ using Xunit; namespace Microsoft.AspNet.Hosting.Tests { - public class HostingEngineTests : IServerManager, IServerFactory + public class HostingEngineTests : IServerFactory { private readonly IList _startInstances = new List(); @@ -29,14 +29,13 @@ namespace Microsoft.AspNet.Hosting.Tests public void HostingEngineCanBeStarted() { var services = new ServiceProvider() - .Add(HostingServices.GetDefaultServices() - .Where(descriptor => descriptor.ServiceType != typeof(IServerManager))) - .AddInstance(this); + .Add(HostingServices.GetDefaultServices()); var engine = services.GetService(); var context = new HostingContext { + ServerFactory = this, ApplicationName = "Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests" }; @@ -51,11 +50,6 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Equal(1, _startInstances[0].DisposeCalls); } - public IServerFactory GetServer(string serverName) - { - return this; - } - public void Initialize(IBuilder builder) { From ee4bb6de87b8dca4bb6a1888ec3761a1e564fc83 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 13 Mar 2014 09:33:29 -0700 Subject: [PATCH 0056/1838] Review feedback. Style cleanup. Updated build template files. --- .gitignore | 2 + Hosting.sln | 18 ++++++++- NuGet.Config | 2 +- build.cmd | 12 +++++- samples/KWebStartup/Startup.cs | 5 --- samples/KWebStartup/project.json | 1 + src/Microsoft.AspNet.Hosting/HostingEngine.cs | 8 ++-- .../HostingServices.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 10 ++--- .../Server/ServerManager.cs | 39 ++++++------------- .../Startup/StartupLoader.cs | 22 ++--------- src/Microsoft.AspNet.Hosting/Utilities.cs | 29 ++++++++++++++ .../Fakes/FakeStartup.cs | 2 +- .../Fakes/FakeStartupWithServices.cs | 2 +- .../Fakes/IFakeStartupCallback.cs | 2 +- .../HostingEngineTests.cs | 4 +- .../StartupManagerTests.cs | 6 +-- 17 files changed, 91 insertions(+), 75 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Utilities.cs diff --git a/.gitignore b/.gitignore index 2554a1fc23..8bc217058d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ nuget.exe *.userprefs *DS_Store *.ncrunchsolution +*.*sdf +*.ipch \ No newline at end of file diff --git a/Hosting.sln b/Hosting.sln index 3394417c72..def8ba2b14 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.30203.2 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -13,6 +13,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.k1 EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.Tests.net45", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.net45.csproj", "{80588AF3-6B14-4D11-9DC4-1EF6453B54C9}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C30C98CD-3D69-4AE9-B680-0E0E6D8834C6}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.net45", "samples\KWebStartup\KWebStartup.net45.csproj", "{E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.k10", "samples\KWebStartup\KWebStartup.k10.csproj", "{348007AA-AB91-48B2-98DB-57D068E2C1AE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -31,6 +37,14 @@ Global {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Debug|Any CPU.Build.0 = Debug|Any CPU {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.ActiveCfg = Release|Any CPU {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.Build.0 = Release|Any CPU + {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Release|Any CPU.Build.0 = Release|Any CPU + {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -39,5 +53,7 @@ Global {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {E0497F39-AFFB-4819-A116-E39E361915AB} {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {E0497F39-AFFB-4819-A116-E39E361915AB} {80588AF3-6B14-4D11-9DC4-1EF6453B54C9} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} + {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} + {348007AA-AB91-48B2-98DB-57D068E2C1AE} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} EndGlobalSection EndGlobal diff --git a/NuGet.Config b/NuGet.Config index 9dc2833940..a059188b09 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + diff --git a/build.cmd b/build.cmd index d54931bc8f..7045ee1f84 100644 --- a/build.cmd +++ b/build.cmd @@ -1,10 +1,18 @@ @echo off cd %~dp0 -IF EXIST .nuget\NuGet.exe goto restore +SETLOCAL +SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe + +IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... +IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'" + +:copynuget +IF EXIST .nuget\nuget.exe goto restore md .nuget -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '.nuget\NuGet.exe'" +copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs index cd080de5f2..fc82494f77 100644 --- a/samples/KWebStartup/Startup.cs +++ b/samples/KWebStartup/Startup.cs @@ -1,9 +1,4 @@ using Microsoft.AspNet.Abstractions; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace KWebStartup { diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 471e0621f6..1d16b7bd9e 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -1,6 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { + "Microsoft.AspNet.Abstractions": "0.1-alpha-*", "Microsoft.AspNet.Hosting": "0.1-alpha-*", "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" }, diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index da496d32e0..1bf28ef25b 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -1,10 +1,9 @@ using System; using System.Threading; -using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; namespace Microsoft.AspNet.Hosting { @@ -55,7 +54,10 @@ namespace Microsoft.AspNet.Hosting private void EnsureServerFactory(HostingContext context) { - context.ServerFactory = context.ServerFactory ?? context.Services.GetService(); + if (context.ServerFactory == null) + { + context.ServerFactory = context.Services.GetService(); + } if (context.ServerFactory != null) { return; diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index d5f4d58a59..9fe29dbc36 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -3,8 +3,8 @@ using System.Collections.Generic; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 3b1f10ae33..52d0da3911 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -1,10 +1,8 @@ -using Microsoft.AspNet.ConfigurationModel; -using Microsoft.AspNet.ConfigurationModel.Sources; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.Net.Runtime; -using System; +using System; using System.IO; +using Microsoft.AspNet.ConfigurationModel; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index a35e3a9fb6..daa2eedcb7 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -1,7 +1,7 @@ -using Microsoft.AspNet.DependencyInjection; using System; using System.Linq; using System.Reflection; +using Microsoft.AspNet.DependencyInjection; namespace Microsoft.AspNet.Hosting.Server { @@ -16,28 +16,14 @@ namespace Microsoft.AspNet.Hosting.Server public IServerFactory GetServerFactory(string serverFactoryIdentifier) { - if (string.IsNullOrWhiteSpace(serverFactoryIdentifier)) + if (string.IsNullOrEmpty(serverFactoryIdentifier)) { - throw new ArgumentNullException("serverFactoryIdentifier"); + throw new ArgumentException(string.Empty, "serverFactoryIdentifier"); } - string typeName; - string assemblyName; - var parts = serverFactoryIdentifier.Split(new[] { ',' }, 2); - if (parts.Length == 1) - { - typeName = null; - assemblyName = serverFactoryIdentifier; - } - else if (parts.Length == 2) - { - typeName = parts[0]; - assemblyName = parts[1]; - } - else - { - throw new ArgumentException("TODO: Unrecognized format", "serverFactoryIdentifier"); - } + var nameParts = Utilities.SplitTypeName(serverFactoryIdentifier); + string typeName = nameParts.Item1; + string assemblyName = nameParts.Item2; var assembly = Assembly.Load(new AssemblyName(assemblyName)); if (assembly == null) @@ -47,12 +33,11 @@ namespace Microsoft.AspNet.Hosting.Server Type type = null; Type interfaceInfo; - if (string.IsNullOrWhiteSpace(typeName)) + if (string.IsNullOrEmpty(typeName)) { foreach (var typeInfo in assembly.DefinedTypes) { - interfaceInfo = typeInfo.ImplementedInterfaces.FirstOrDefault(interf => - interf.FullName == typeof(IServerFactory).FullName); + interfaceInfo = typeInfo.ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory))); if (interfaceInfo != null) { type = typeInfo.AsType(); @@ -66,15 +51,14 @@ namespace Microsoft.AspNet.Hosting.Server } else { - type = assembly.GetType(typeName) ?? assembly.GetType(assemblyName + "." + typeName); + type = assembly.GetType(typeName); if (type == null) { throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "")); } - interfaceInfo = type.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(interf => - interf.FullName == typeof(IServerFactory).FullName); + interfaceInfo = type.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory))); if (interfaceInfo == null) { @@ -82,8 +66,7 @@ namespace Microsoft.AspNet.Hosting.Server } } - object instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); - return (IServerFactory)instance; + return (IServerFactory)ActivatorUtilities.GetServiceOrCreateInstance(_services, type); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index abdd853bbf..b6a40be8e2 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -25,23 +25,9 @@ namespace Microsoft.AspNet.Hosting.Startup return _next.LoadStartup(applicationName, diagnosticMessages); } - string typeName; - string assemblyName; - var parts = applicationName.Split(new[] { ',' }, 2); - if (parts.Length == 1) - { - typeName = null; - assemblyName = applicationName; - } - else if (parts.Length == 2) - { - typeName = parts[0]; - assemblyName = parts[1]; - } - else - { - throw new Exception("TODO: Unrecognized format"); - } + var nameParts = Utilities.SplitTypeName(applicationName); + string typeName = nameParts.Item1; + string assemblyName = nameParts.Item2; var assembly = Assembly.Load(new AssemblyName(assemblyName)); if (assembly == null) @@ -50,7 +36,7 @@ namespace Microsoft.AspNet.Hosting.Startup } Type type = null; - if (string.IsNullOrWhiteSpace(typeName)) + if (string.IsNullOrEmpty(typeName)) { var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals("Startup")); if (typeInfo != null) diff --git a/src/Microsoft.AspNet.Hosting/Utilities.cs b/src/Microsoft.AspNet.Hosting/Utilities.cs new file mode 100644 index 0000000000..21ec780149 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Utilities.cs @@ -0,0 +1,29 @@ +using System; + +namespace Microsoft.AspNet.Hosting +{ + internal static class Utilities + { + internal static Tuple SplitTypeName(string identifier) + { + string typeName; + string assemblyName; + var parts = identifier.Split(new[] { ',' }, 2); + if (parts.Length == 1) + { + typeName = null; + assemblyName = identifier.Trim(); + } + else if (parts.Length == 2) + { + typeName = parts[0].Trim(); + assemblyName = parts[1].Trim(); + } + else + { + throw new ArgumentException("TODO: Unrecognized format", "identifier"); + } + return new Tuple(typeName, assemblyName); + } + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs index f8aae20612..255fcf1aef 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs @@ -1,6 +1,6 @@ using Microsoft.AspNet.Abstractions; -namespace Microsoft.AspNet.Hosting.Tests.Fakes +namespace Microsoft.AspNet.Hosting.Fakes { public class FakeStartup { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs index 1557c568ab..ee8b28e3a5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs @@ -1,6 +1,6 @@ using Microsoft.AspNet.Abstractions; -namespace Microsoft.AspNet.Hosting.Tests.Fakes +namespace Microsoft.AspNet.Hosting.Fakes { public class FakeStartupWithServices { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs index cfe02c2b46..7fd7c9ba2b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs @@ -1,4 +1,4 @@ -namespace Microsoft.AspNet.Hosting.Tests.Fakes +namespace Microsoft.AspNet.Hosting.Fakes { public interface IFakeStartupCallback { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 476e1a4454..e7e9c3a266 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -1,14 +1,12 @@ using System; -using System.Collections; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Server; using Xunit; -namespace Microsoft.AspNet.Hosting.Tests +namespace Microsoft.AspNet.Hosting { public class HostingEngineTests : IServerFactory { diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index c2770d98b0..1f464894d4 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -1,13 +1,11 @@ using System; -using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Startup; -using Microsoft.AspNet.Hosting.Tests.Fakes; +using Microsoft.AspNet.Hosting.Fakes; using Xunit; -namespace Microsoft.AspNet.Hosting.Tests +namespace Microsoft.AspNet.Hosting { public class StartupManagerTests : IFakeStartupCallback From 6a5cb913c8508e76899ef42cfa30208c378b0dd7 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 13 Mar 2014 14:25:30 -0700 Subject: [PATCH 0057/1838] Review cleanup. Cleaner Startup auto-detect. Fix tests. --- src/Microsoft.AspNet.Hosting/Program.cs | 2 -- .../Startup/StartupLoader.cs | 15 ++++++++++----- src/Microsoft.AspNet.Hosting/project.json | 1 + .../HostingEngineTests.cs | 2 +- .../StartupManagerTests.cs | 4 ++-- 5 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 52d0da3911..ffc4a713d9 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -48,10 +48,8 @@ namespace Microsoft.AspNet.Hosting using (engine.Start(context)) { -#if NET45 Console.WriteLine("Started"); Console.ReadLine(); -#endif } } } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index b6a40be8e2..f49dd7a3c8 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -38,16 +38,21 @@ namespace Microsoft.AspNet.Hosting.Startup Type type = null; if (string.IsNullOrEmpty(typeName)) { - var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals("Startup")); + typeName = "Startup"; + } + + // Check the most likely places first + type = assembly.GetType(typeName) ?? assembly.GetType(assembly + "." + typeName); + + if (type == null) + { + // Full scan + var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals(typeName)); if (typeInfo != null) { type = typeInfo.AsType(); } } - else - { - type = assembly.GetType(typeName); - } if (type == null) { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 07acc75da3..26ca426580 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -12,6 +12,7 @@ "k10": { "dependencies": { "System.Collections": "4.0.0.0", + "System.Console": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.IO": "4.0.0.0", diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index e7e9c3a266..87220ea473 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Hosting var context = new HostingContext { ServerFactory = this, - ApplicationName = "Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests" + ApplicationName = "Microsoft.AspNet.Hosting.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests" }; var engineStart = engine.Start(context); diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 1f464894d4..5f58859ab2 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Hosting var manager = services.GetService(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests"); + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests"); Assert.IsType(manager); Assert.NotNull(startup); @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Hosting var manager = services.GetService(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests.Fakes.FakeStartupWithServices, Microsoft.AspNet.Hosting.Tests"); + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Fakes.FakeStartupWithServices, Microsoft.AspNet.Hosting.Tests"); startup.Invoke(null); From 2b7272fe07ea9cfd6d28ca74348bde12a3949d0e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 14 Mar 2014 10:17:46 -0700 Subject: [PATCH 0058/1838] Review feedback. --- .../Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Utilities.cs | 15 +++------------ 2 files changed, 4 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index f49dd7a3c8..7b1362e90f 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Hosting.Startup if (type == null) { // Full scan - var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals(typeName)); + var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals(typeName, StringComparison.OrdinalIgnoreCase)); if (typeInfo != null) { type = typeInfo.AsType(); diff --git a/src/Microsoft.AspNet.Hosting/Utilities.cs b/src/Microsoft.AspNet.Hosting/Utilities.cs index 21ec780149..ae98ea538f 100644 --- a/src/Microsoft.AspNet.Hosting/Utilities.cs +++ b/src/Microsoft.AspNet.Hosting/Utilities.cs @@ -6,23 +6,14 @@ namespace Microsoft.AspNet.Hosting { internal static Tuple SplitTypeName(string identifier) { - string typeName; - string assemblyName; + string typeName = null; + string assemblyName = identifier.Trim(); var parts = identifier.Split(new[] { ',' }, 2); - if (parts.Length == 1) - { - typeName = null; - assemblyName = identifier.Trim(); - } - else if (parts.Length == 2) + if (parts.Length == 2) { typeName = parts[0].Trim(); assemblyName = parts[1].Trim(); } - else - { - throw new ArgumentException("TODO: Unrecognized format", "identifier"); - } return new Tuple(typeName, assemblyName); } } From c3e0279aac7df3aa6e2b778a81f6dd1778cfe4e1 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 14 Mar 2014 14:22:20 -0700 Subject: [PATCH 0059/1838] Updated to use service collection --- src/Microsoft.AspNet.Hosting/Program.cs | 5 +++-- src/Microsoft.AspNet.Hosting/WebApplication.cs | 7 ++++++- .../HostingEngineTests.cs | 11 +++++++---- .../StartupManagerTests.cs | 14 +++++++++----- 4 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index ffc4a713d9..0db86e734d 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -27,8 +27,9 @@ namespace Microsoft.AspNet.Hosting config.AddIniFile(HostingIniFile); } - var services = new ServiceProvider(_serviceProvider) - .Add(HostingServices.GetDefaultServices(config)); + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices(config)); + var services = serviceCollection.FallbackServices; var appEnvironment = _serviceProvider.GetService(); diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index fca80cb48c..f01c7dea23 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -1,5 +1,6 @@ using System; using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; namespace Microsoft.AspNet.Hosting { @@ -7,9 +8,12 @@ namespace Microsoft.AspNet.Hosting { public static IDisposable Start() { + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var context = new HostingContext { - Services = new ServiceProvider().Add(HostingServices.GetDefaultServices()) + Services = serviceCollection.BuildServiceProvider() }; var engine = context.Services.GetService(); @@ -17,6 +21,7 @@ namespace Microsoft.AspNet.Hosting { throw new Exception("TODO: IHostingEngine service not available exception"); } + return engine.Start(context); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 87220ea473..eb09beba24 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.DependencyInjection.Fallback; using Xunit; namespace Microsoft.AspNet.Hosting @@ -15,8 +16,9 @@ namespace Microsoft.AspNet.Hosting [Fact] public void HostingEngineCanBeResolvedWithDefaultServices() { - var services = new ServiceProvider() - .Add(HostingServices.GetDefaultServices()); + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var services = serviceCollection.BuildServiceProvider(); var engine = services.GetService(); @@ -26,8 +28,9 @@ namespace Microsoft.AspNet.Hosting [Fact] public void HostingEngineCanBeStarted() { - var services = new ServiceProvider() - .Add(HostingServices.GetDefaultServices()); + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var services = serviceCollection.BuildServiceProvider(); var engine = services.GetService(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 5f58859ab2..d2693d12a1 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -1,13 +1,14 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Hosting.Fakes; using Xunit; namespace Microsoft.AspNet.Hosting { - + public class StartupManagerTests : IFakeStartupCallback { private readonly IList _configurationMethodCalledList = new List(); @@ -15,7 +16,9 @@ namespace Microsoft.AspNet.Hosting [Fact] public void DefaultServicesLocateStartupByNameAndNamespace() { - IServiceProvider services = new ServiceProvider().Add(HostingServices.GetDefaultServices()); + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var services = serviceCollection.BuildServiceProvider(); var manager = services.GetService(); @@ -28,9 +31,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public void StartupClassMayHaveHostingServicesInjected() { - IServiceProvider services = new ServiceProvider() - .Add(HostingServices.GetDefaultServices()) - .AddInstance(this); + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + serviceCollection.AddInstance(this); + var services = serviceCollection.BuildServiceProvider(); var manager = services.GetService(); From 4d511b3aef12874d100d7cdf5289c330b4c362df Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 14 Mar 2014 15:13:00 -0700 Subject: [PATCH 0060/1838] Make IServerFactory not assembly neutral temporarily. --- src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 368004e197..4ae76a13b4 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -5,7 +5,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting.Server { - [AssemblyNeutral] + // TODO: [AssemblyNeutral] public interface IServerFactory { IDisposable Start(Func application); From d7bbcb96449a59699b1b265ea2cbde6e0630a537 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 15 Mar 2014 14:41:41 -0700 Subject: [PATCH 0061/1838] Fixed service provider building --- src/Microsoft.AspNet.Hosting/Program.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 0db86e734d..8153333fb1 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -2,6 +2,7 @@ using System.IO; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting @@ -29,7 +30,8 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); - var services = serviceCollection.FallbackServices; + var services = serviceCollection.BuildServiceProvider(); + serviceCollection.FallbackServices = _serviceProvider; var appEnvironment = _serviceProvider.GetService(); From 063420067e8529da45cab4bdb2e14dab785a5d0f Mon Sep 17 00:00:00 2001 From: GrabYourPitchforks Date: Mon, 17 Mar 2014 14:09:31 -0700 Subject: [PATCH 0062/1838] HostingServices should provide a default implementation of IDataProtectionProvider --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 11 +++++++++++ src/Microsoft.AspNet.Hosting/project.json | 3 ++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 9fe29dbc36..9032db6706 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -5,6 +5,7 @@ using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Security.DataProtection; namespace Microsoft.AspNet.Hosting { @@ -27,6 +28,16 @@ namespace Microsoft.AspNet.Hosting yield return DescribeService(configuration); yield return DescribeService(configuration); + + // The default IDataProtectionProvider is a singleton. + // Note: DPAPI isn't usable in IIS where the user profile hasn't been loaded, but loading DPAPI + // is deferred until the first call to Protect / Unprotect. It's up to an IIS-based host to + // replace this service as part of application initialization. + yield return new ServiceDescriptor { + ServiceType = typeof(IDataProtectionProvider), + Lifecycle = LifecycleKind.Singleton, + ImplementationInstance = DataProtectionProvider.CreateFromDpapi() + }; } public static IServiceDescriptor DescribeService(IConfiguration configuration, diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 26ca426580..3f0cca6268 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -5,7 +5,8 @@ "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", "Microsoft.AspNet.Abstractions": "0.1-alpha-*", - "Microsoft.AspNet.FeatureModel": "0.1-alpha-*" + "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", + "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*" }, "configurations": { "net45": {}, From cd9d3a333572cf7d32f80e9d038b00860ca73918 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 17 Mar 2014 19:24:31 -0700 Subject: [PATCH 0063/1838] Updated hosting to use service describer --- .../HostingServices.cs | 68 +++---------------- 1 file changed, 11 insertions(+), 57 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 9032db6706..3f9555448e 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; @@ -18,69 +17,24 @@ namespace Microsoft.AspNet.Hosting public static IEnumerable GetDefaultServices(IConfiguration configuration) { - yield return DescribeService(configuration); - yield return DescribeService(configuration); + var describer = new ServiceDescriber(configuration); - yield return DescribeService(configuration); - yield return DescribeService(configuration); + yield return describer.Transient(); + yield return describer.Transient(); - yield return DescribeService(configuration); - yield return DescribeService(configuration); + yield return describer.Transient(); + yield return describer.Transient(); - yield return DescribeService(configuration); + yield return describer.Transient(); + yield return describer.Transient(); + + yield return describer.Transient(); // The default IDataProtectionProvider is a singleton. // Note: DPAPI isn't usable in IIS where the user profile hasn't been loaded, but loading DPAPI // is deferred until the first call to Protect / Unprotect. It's up to an IIS-based host to // replace this service as part of application initialization. - yield return new ServiceDescriptor { - ServiceType = typeof(IDataProtectionProvider), - Lifecycle = LifecycleKind.Singleton, - ImplementationInstance = DataProtectionProvider.CreateFromDpapi() - }; - } - - public static IServiceDescriptor DescribeService(IConfiguration configuration, - LifecycleKind lifecycle = LifecycleKind.Transient) - { - return DescribeService(typeof(TService), typeof(TImplementation), configuration, lifecycle); - } - - public static IServiceDescriptor DescribeService( - Type serviceType, - Type implementationType, - IConfiguration configuration, - LifecycleKind lifecycle) - { - var serviceTypeName = serviceType.FullName; - var implementationTypeName = configuration.Get(serviceTypeName); - if (!String.IsNullOrEmpty(implementationTypeName)) - { - try - { - implementationType = Type.GetType(implementationTypeName); - } - catch (Exception ex) - { - throw new Exception(string.Format("TODO: unable to locate implementation {0} for service {1}", implementationTypeName, serviceTypeName), ex); - } - } - return new ServiceTypeDescriptor(serviceType, implementationType, lifecycle); - } - - public class ServiceTypeDescriptor : IServiceDescriptor - { - public ServiceTypeDescriptor(Type serviceType, Type implementationType, LifecycleKind lifecycle) - { - ServiceType = serviceType; - ImplementationType = implementationType; - Lifecycle = lifecycle; - } - - public LifecycleKind Lifecycle { get; private set; } - public Type ServiceType { get; private set; } - public Type ImplementationType { get; private set; } - public object ImplementationInstance { get; private set; } + yield return describer.Instance(DataProtectionProvider.CreateFromDpapi()); } } } \ No newline at end of file From ca2ef860f5cdfe3b4e6740a1f409638af8aa75cc Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Mon, 17 Mar 2014 21:42:35 -0700 Subject: [PATCH 0064/1838] Adding IServiceProvider interfaces to HttpContext --- .../HttpContext.cs | 4 ++++ .../DefaultCanHasServiceProviders.cs | 10 ++++++++++ .../DefaultHttpContext.cs | 19 +++++++++++++++++++ .../ICanHasServiceProviders.cs | 10 ++++++++++ 4 files changed, 43 insertions(+) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 03d8c7ec2e..9f2eac3614 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -11,6 +11,10 @@ namespace Microsoft.AspNet.Abstractions public abstract IDictionary Items { get; } + public abstract IServiceProvider ApplicationServices { get; set; } + + public abstract IServiceProvider RequestServices { get; set; } + public abstract void Dispose(); public abstract object GetFeature(Type type); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs new file mode 100644 index 0000000000..58ccd6565d --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultCanHasServiceProviders : ICanHasServiceProviders + { + public IServiceProvider ApplicationServices { get; set; } + public IServiceProvider RequestServices { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 778611eee0..da5e692686 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -12,6 +12,7 @@ namespace Microsoft.AspNet.PipelineCore private readonly HttpResponse _response; private FeatureReference _canHasItems; + private FeatureReference _canHasServiceProviders; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -21,6 +22,7 @@ namespace Microsoft.AspNet.PipelineCore _response = new DefaultHttpResponse(this, features); _canHasItems = FeatureReference.Default; + _canHasServiceProviders = FeatureReference.Default; } ICanHasItems CanHasItems @@ -28,6 +30,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasItems.Fetch(_features) ?? _canHasItems.Update(_features, new DefaultCanHasItems()); } } + ICanHasServiceProviders CanHasServiceProviders + { + get { return _canHasServiceProviders.Fetch(_features) ?? _canHasServiceProviders.Update(_features, new DefaultCanHasServiceProviders()); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -37,6 +44,18 @@ namespace Microsoft.AspNet.PipelineCore get { return CanHasItems.Items; } } + public override IServiceProvider ApplicationServices + { + get { return CanHasServiceProviders.ApplicationServices; } + set { CanHasServiceProviders.ApplicationServices = value; } + } + + public override IServiceProvider RequestServices + { + get { return CanHasServiceProviders.RequestServices; } + set { CanHasServiceProviders.RequestServices = value; } + } + public int Revision { get { return _features.Revision; } } public override void Dispose() diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs new file mode 100644 index 0000000000..77befcf990 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.AspNet.PipelineCore +{ + public interface ICanHasServiceProviders + { + IServiceProvider ApplicationServices { get; set; } + IServiceProvider RequestServices { get; set; } + } +} \ No newline at end of file From ea1f93aa919e9059cb17a5600fe43465e8982195 Mon Sep 17 00:00:00 2001 From: GrabYourPitchforks Date: Tue, 18 Mar 2014 11:44:25 -0700 Subject: [PATCH 0065/1838] Fix bad call to Assembly.GetType in Hosting. CR: chrross --- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 7b1362e90f..eed8e7a6e4 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Hosting.Startup } // Check the most likely places first - type = assembly.GetType(typeName) ?? assembly.GetType(assembly + "." + typeName); + type = assembly.GetType(typeName) ?? assembly.GetType(assembly.GetName().Name + "." + typeName); if (type == null) { From aa0b52df4eb6968a243358bd0a5046cb123e77b8 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Tue, 18 Mar 2014 15:04:49 -0700 Subject: [PATCH 0066/1838] ServiceCollection.FallbackServices no longer exists - Pass the fallback service provider to BuildServiceProvider instead --- src/Microsoft.AspNet.Hosting/Program.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 8153333fb1..76dffada12 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -30,8 +30,7 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); - var services = serviceCollection.BuildServiceProvider(); - serviceCollection.FallbackServices = _serviceProvider; + var services = serviceCollection.BuildServiceProvider(_serviceProvider); var appEnvironment = _serviceProvider.GetService(); From ae9545a124b1b0469ca9ff181ea892dfd6e676bc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:21:12 -0700 Subject: [PATCH 0067/1838] Improve request and response cookie handling. --- .gitignore | 2 + .../HttpResponse.cs | 1 + .../IResponseCookiesCollection.cs | 37 ++++++++++++ .../Collections/RequestCookieCollection.cs | 60 ------------------- .../RequestCookiesCollection.cs | 2 +- ...ection.cs => ResponseCookiesCollection.cs} | 7 +-- .../DefaultCanHasRequestCookies.cs | 4 +- .../DefaultCanHasResponseCookies.cs | 35 +++++++++++ .../DefaultHttpResponse.cs | 10 ++++ .../ICanHasResponseCookies.cs | 10 ++++ .../Infrastructure/Constants.cs | 1 + 11 files changed, 103 insertions(+), 66 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs delete mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs rename src/Microsoft.AspNet.PipelineCore/{ => Collections}/RequestCookiesCollection.cs (97%) rename src/Microsoft.AspNet.PipelineCore/Collections/{ResponseCookieCollection.cs => ResponseCookiesCollection.cs} (96%) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs diff --git a/.gitignore b/.gitignore index 2554a1fc23..8bc217058d 100644 --- a/.gitignore +++ b/.gitignore @@ -20,3 +20,5 @@ nuget.exe *.userprefs *DS_Store *.ncrunchsolution +*.*sdf +*.ipch \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index de84899fda..8df6277482 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.Abstractions public abstract long? ContentLength { get; set; } public abstract string ContentType { get; set; } + public abstract IResponseCookiesCollection Cookies { get; } public abstract Task WriteAsync(string data); } } diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs b/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs new file mode 100644 index 0000000000..8e38bb92dd --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs @@ -0,0 +1,37 @@ + +namespace Microsoft.AspNet.Abstractions +{ + /// + /// A wrapper for the response Set-Cookie header + /// + public interface IResponseCookiesCollection + { + /// + /// Add a new cookie and value + /// + /// + /// + void Append(string key, string value); + + /// + /// Add a new cookie + /// + /// + /// + /// + void Append(string key, string value, CookieOptions options); + + /// + /// Sets an expired cookie + /// + /// + void Delete(string key); + + /// + /// Sets an expired cookie + /// + /// + /// + void Delete(string key, CookieOptions options); + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs deleted file mode 100644 index 91b1577f28..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookieCollection.cs +++ /dev/null @@ -1,60 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNet.PipelineCore.Collections -{ - /// - /// A wrapper for the request Cookie header - /// - public class RequestCookieCollection : IEnumerable> - { - /// - /// Create a new wrapper - /// - /// - public RequestCookieCollection(IDictionary store) - { - if (store == null) - { - throw new ArgumentNullException("store"); - } - - Store = store; - } - - private IDictionary Store { get; set; } - - /// - /// Returns null rather than throwing KeyNotFoundException - /// - /// - /// - public string this[string key] - { - get - { - string value; - Store.TryGetValue(key, out value); - return value; - } - } - - /// - /// - /// - /// - public IEnumerator> GetEnumerator() - { - return Store.GetEnumerator(); - } - - /// - /// - /// - /// - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs similarity index 97% rename from src/Microsoft.AspNet.PipelineCore/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 0f84ea704f..40445bb31d 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.PipelineCore.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.PipelineCore.Collections { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs similarity index 96% rename from src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs index 78703285cf..1a11469597 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookieCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs @@ -3,20 +3,19 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Abstractions.Collections { /// /// A wrapper for the response Set-Cookie header /// - public class ResponseCookieCollection + public class ResponseCookiesCollection : IResponseCookiesCollection { /// /// Create a new wrapper /// /// - public ResponseCookieCollection(IHeaderDictionary headers) + public ResponseCookiesCollection(IHeaderDictionary headers) { if (headers == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index df33085763..b6071c4d41 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -1,7 +1,9 @@ using System; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore @@ -24,7 +26,7 @@ namespace Microsoft.AspNet.PipelineCore get { var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, "Cookies") ?? ""; + string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? ""; if (_cookiesCollection == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs new file mode 100644 index 0000000000..ee176b7af9 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -0,0 +1,35 @@ +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Collections; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultCanHasResponseCookies : ICanHasResponseCookies + { + private readonly IFeatureCollection _features; + private FeatureReference _request = FeatureReference.Default; + private IResponseCookiesCollection _cookiesCollection; + + public DefaultCanHasResponseCookies(IFeatureCollection features) + { + _features = features; + } + + public IResponseCookiesCollection Cookies + { + get + { + var headers = _request.Fetch(_features).Headers; + if (_cookiesCollection == null) + { + _cookiesCollection = new ResponseCookiesCollection(new HeaderDictionary(headers)); + } + + return _cookiesCollection; + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index c1ec42c5d0..4351f7a18d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -16,6 +16,7 @@ namespace Microsoft.AspNet.PipelineCore private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; private FeatureReference _response = FeatureReference.Default; + private FeatureReference _canHasCookies = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -28,6 +29,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _response.Fetch(_features); } } + private ICanHasResponseCookies CanHasResponseCookies + { + get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasResponseCookies(_features)); } + } + public override HttpContext HttpContext { get { return _context; } } public override int StatusCode @@ -79,6 +85,10 @@ namespace Microsoft.AspNet.PipelineCore } } + public override IResponseCookiesCollection Cookies + { + get { return CanHasResponseCookies.Cookies; } + } public override Task WriteAsync(string data) { var bytes = Encoding.UTF8.GetBytes(data); diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs new file mode 100644 index 0000000000..23c73d4d2a --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs @@ -0,0 +1,10 @@ +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.PipelineCore.Collections; + +namespace Microsoft.AspNet.PipelineCore +{ + public interface ICanHasResponseCookies + { + IResponseCookiesCollection Cookies { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 114ae660e3..cc92a10786 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -18,6 +18,7 @@ namespace Microsoft.AspNet.Abstractions.Infrastructure internal const string ETag = "ETag"; internal const string Location = "Location"; internal const string ContentLength = "Content-Length"; + internal const string Cookie = "Cookie"; internal const string SetCookie = "Set-Cookie"; internal const string Expires = "Expires"; } From cbd84015822d0440bc1a2c3bd4097d54f64dc904 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:22:47 -0700 Subject: [PATCH 0068/1838] Fill in OnSendingHeaders, Redirect, IsSecure. --- src/Microsoft.AspNet.Abstractions/HttpResponse.cs | 8 +++++++- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 15 ++++++++++++++- 3 files changed, 22 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 8df6277482..add21b64b8 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -1,4 +1,5 @@ -using System.IO; +using System; +using System.IO; using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions @@ -16,6 +17,11 @@ namespace Microsoft.AspNet.Abstractions public abstract string ContentType { get; set; } public abstract IResponseCookiesCollection Cookies { get; } + + public abstract void OnSendingHeaders(Action callback, object state); + + public abstract void Redirect(string location); + public abstract Task WriteAsync(string data); } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 188cf06102..b091197a70 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.PipelineCore public override bool IsSecure { - get { throw new NotImplementedException(); } + get { return string.Equals("https", Scheme, StringComparison.OrdinalIgnoreCase); } } public override HostString Host diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 4351f7a18d..7f1fc3229a 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,4 +1,5 @@ -using System.Globalization; +using System; +using System.Globalization; using System.IO; using System.Text; using System.Threading.Tasks; @@ -89,6 +90,18 @@ namespace Microsoft.AspNet.PipelineCore { get { return CanHasResponseCookies.Cookies; } } + + public override void OnSendingHeaders(Action callback, object state) + { + HttpResponseInformation.OnSendingHeaders(callback, state); + } + + public override void Redirect(string location) + { + HttpResponseInformation.StatusCode = 302; + Headers.Set(Constants.Headers.Location, location); + } + public override Task WriteAsync(string data) { var bytes = Encoding.UTF8.GetBytes(data); From fc8832f69fd53c220a12e4d6ef675ec12fe8cb33 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:23:25 -0700 Subject: [PATCH 0069/1838] Add Claims dependency. --- .../Security/IAuthenticationResult.cs | 6 ------ .../Security/IAuthenticationSignIn.cs | 4 ---- src/Microsoft.AspNet.HttpFeature/project.json | 1 + 3 files changed, 1 insertion(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs index a4716b880f..b047bae8bd 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; -#if NET45 using System.Security.Claims; -#endif using Microsoft.AspNet.HttpFeature.Security; // ReSharper disable once CheckNamespace @@ -9,11 +7,7 @@ namespace Microsoft.AspNet.Interfaces.Security { public interface IAuthenticationResult { -#if NET45 ClaimsIdentity Identity { get; } -#else - -#endif IDictionary Properties { get; } IAuthenticationDescription Description { get; } } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs index a86f94e132..6033b173c5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs @@ -1,15 +1,11 @@ using System.Collections.Generic; -#if NET45 using System.Security.Claims; -#endif namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthenticationSignIn { -#if NET45 ClaimsPrincipal User { get; } -#endif IDictionary Properties { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 4660c1d1cd..fe3cbc04bc 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -7,6 +7,7 @@ "System.IO": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.10.0", + "System.Security.Claims": "0.1-alpha-*", "System.Security.Principal": "4.0.0.0", "System.Threading.Tasks": "4.0.0.0" } From bc43ccbc30b8265cf8b0efec9e7cf7892ef41622 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:51:15 -0700 Subject: [PATCH 0070/1838] Change QueryString to include the leading '?'. --- .../QueryString.cs | 37 +++++++++++-------- .../Infrastructure/ParsingHelpers.cs | 4 ++ 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index 9d96419788..0bca5c7262 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -15,27 +15,31 @@ namespace Microsoft.AspNet.Abstractions private readonly string _value; /// - /// Initalize the query string with a given value. This value must be in escaped and delimited format without + /// Initialize the query string with a given value. This value must be in escaped and delimited format with /// a leading '?' character. /// /// The query string to be assigned to the Value property. public QueryString(string value) { + if (!string.IsNullOrEmpty(value) && value[0] != '?') + { + throw new ArgumentException("The leading '?' must be included for a non-empty query."); + } _value = value; } /// - /// Initialize a query string with a single given parameter name and value. The value is + /// Initialize a query string with a single given parameter name and value. /// - /// The unencoded parameter name - /// The unencoded parameter value + /// The un-encoded parameter name + /// The un-encoded parameter value public QueryString(string name, string value) { - _value = Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); + _value = "?" + Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); } /// - /// The unescaped query string without the leading '?' character + /// The escaped query string with the leading '?' character /// public string Value { @@ -47,12 +51,12 @@ namespace Microsoft.AspNet.Abstractions /// public bool HasValue { - get { return !String.IsNullOrWhiteSpace(_value); } + get { return !String.IsNullOrEmpty(_value); } } /// /// Provides the query string escaped in a way which is correct for combining into the URI representation. - /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentally + /// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially /// dangerous are escaped. /// /// The query string value @@ -63,7 +67,7 @@ namespace Microsoft.AspNet.Abstractions /// /// Provides the query string escaped in a way which is correct for combining into the URI representation. - /// A leading '?' character will be prepended unless the Value is null or empty. Characters which are potentially + /// A leading '?' character will be included unless the Value is null or empty. Characters which are potentially /// dangerous are escaped. /// /// The query string value @@ -71,7 +75,7 @@ namespace Microsoft.AspNet.Abstractions public string ToUriComponent() { // Escape things properly so System.Uri doesn't mis-interpret the data. - return HasValue ? "?" + _value.Replace("#", "%23") : String.Empty; + return HasValue ? _value.Replace("#", "%23") : String.Empty; } /// @@ -87,11 +91,7 @@ namespace Microsoft.AspNet.Abstractions { return new QueryString(string.Empty); } - if (uriComponent[0] != '?') - { - throw new ArgumentException(""/*Resources.Exception_QueryStringMustStartWithDelimiter*/, "uriComponent"); - } - return new QueryString(uriComponent.Substring(1)); + return new QueryString(uriComponent); } /// @@ -105,7 +105,12 @@ namespace Microsoft.AspNet.Abstractions { throw new ArgumentNullException("uri"); } - return new QueryString(uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped)); + string queryValue = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped); + if (!string.IsNullOrEmpty(queryValue)) + { + queryValue = "?" + queryValue; + } + return new QueryString(queryValue); } public bool Equals(QueryString other) diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 7ab6b1c817..5f3f4f5bdb 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -803,6 +803,10 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure internal static IDictionary GetQuery(string queryString) { + if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); return accumulator.ToDictionary( From b9899fc72af32839c359b191dce7b6037fb7d8d0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 10:55:24 -0700 Subject: [PATCH 0071/1838] Fix response cookies namespace. --- .../Collections/ResponseCookiesCollection.cs | 3 ++- .../DefaultCanHasResponseCookies.cs | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs index 1a11469597..7d7189ff7f 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs @@ -2,9 +2,10 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Infrastructure; -namespace Microsoft.AspNet.Abstractions.Collections +namespace Microsoft.AspNet.PipelineCore.Collections { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index ee176b7af9..c908b7fa11 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -1,5 +1,4 @@ using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Collections; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; From 732ae3d030feb425844c746b68fa651ea29ddce7 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 18 Mar 2014 12:01:57 -0700 Subject: [PATCH 0072/1838] Code review cleanup. --- src/Microsoft.AspNet.Abstractions/QueryString.cs | 6 +++--- .../DefaultCanHasRequestCookies.cs | 2 +- .../DefaultCanHasResponseCookies.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index 0bca5c7262..5109294bb6 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Abstractions { if (!string.IsNullOrEmpty(value) && value[0] != '?') { - throw new ArgumentException("The leading '?' must be included for a non-empty query."); + throw new ArgumentException("The leading '?' must be included for a non-empty query.", "value"); } _value = value; } @@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Abstractions /// public bool HasValue { - get { return !String.IsNullOrEmpty(_value); } + get { return !string.IsNullOrEmpty(_value); } } /// @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Abstractions public string ToUriComponent() { // Escape things properly so System.Uri doesn't mis-interpret the data. - return HasValue ? _value.Replace("#", "%23") : String.Empty; + return HasValue ? _value.Replace("#", "%23") : string.Empty; } /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index b6071c4d41..5aff939af5 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasRequestCookies : ICanHasRequestCookies { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; private static readonly string[] ZeroHeaders = new string[0]; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index c908b7fa11..c0b51b27cb 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.PipelineCore public class DefaultCanHasResponseCookies : ICanHasResponseCookies { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private IResponseCookiesCollection _cookiesCollection; public DefaultCanHasResponseCookies(IFeatureCollection features) @@ -21,9 +21,9 @@ namespace Microsoft.AspNet.PipelineCore { get { - var headers = _request.Fetch(_features).Headers; if (_cookiesCollection == null) { + var headers = _request.Fetch(_features).Headers; _cookiesCollection = new ResponseCookiesCollection(new HeaderDictionary(headers)); } From f2835e71857adfa4d1def52ad4688b0ec89fa0f4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 19 Mar 2014 09:09:44 -0700 Subject: [PATCH 0073/1838] Rename IResponseCookiesCollection to IResponseCookies. --- src/Microsoft.AspNet.Abstractions/HttpResponse.cs | 2 +- .../{IResponseCookiesCollection.cs => IResponseCookies.cs} | 2 +- .../{ResponseCookiesCollection.cs => ResponseCookies.cs} | 4 ++-- .../DefaultCanHasResponseCookies.cs | 6 +++--- src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs | 2 +- src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs | 2 +- 6 files changed, 9 insertions(+), 9 deletions(-) rename src/Microsoft.AspNet.Abstractions/{IResponseCookiesCollection.cs => IResponseCookies.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/Collections/{ResponseCookiesCollection.cs => ResponseCookies.cs} (97%) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index add21b64b8..6f6662e737 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Abstractions public abstract long? ContentLength { get; set; } public abstract string ContentType { get; set; } - public abstract IResponseCookiesCollection Cookies { get; } + public abstract IResponseCookies Cookies { get; } public abstract void OnSendingHeaders(Action callback, object state); diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs rename to src/Microsoft.AspNet.Abstractions/IResponseCookies.cs index 8e38bb92dd..4358ad69ce 100644 --- a/src/Microsoft.AspNet.Abstractions/IResponseCookiesCollection.cs +++ b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs @@ -4,7 +4,7 @@ namespace Microsoft.AspNet.Abstractions /// /// A wrapper for the response Set-Cookie header /// - public interface IResponseCookiesCollection + public interface IResponseCookies { /// /// Add a new cookie and value diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs similarity index 97% rename from src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 7d7189ff7f..9963a7373f 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -10,13 +10,13 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// /// A wrapper for the response Set-Cookie header /// - public class ResponseCookiesCollection : IResponseCookiesCollection + public class ResponseCookies : IResponseCookies { /// /// Create a new wrapper /// /// - public ResponseCookiesCollection(IHeaderDictionary headers) + public ResponseCookies(IHeaderDictionary headers) { if (headers == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index c0b51b27cb..b695832694 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -10,21 +10,21 @@ namespace Microsoft.AspNet.PipelineCore { private readonly IFeatureCollection _features; private readonly FeatureReference _request = FeatureReference.Default; - private IResponseCookiesCollection _cookiesCollection; + private IResponseCookies _cookiesCollection; public DefaultCanHasResponseCookies(IFeatureCollection features) { _features = features; } - public IResponseCookiesCollection Cookies + public IResponseCookies Cookies { get { if (_cookiesCollection == null) { var headers = _request.Fetch(_features).Headers; - _cookiesCollection = new ResponseCookiesCollection(new HeaderDictionary(headers)); + _cookiesCollection = new ResponseCookies(new HeaderDictionary(headers)); } return _cookiesCollection; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 7f1fc3229a..f1f57ff4a1 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.PipelineCore } } - public override IResponseCookiesCollection Cookies + public override IResponseCookies Cookies { get { return CanHasResponseCookies.Cookies; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs index 23c73d4d2a..87f0ecc87e 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.PipelineCore { public interface ICanHasResponseCookies { - IResponseCookiesCollection Cookies { get; } + IResponseCookies Cookies { get; } } } \ No newline at end of file From 951dcbebb78ffec2f016b75be334d28b6ce7ce03 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 19 Mar 2014 11:35:24 -0700 Subject: [PATCH 0074/1838] Add IServerInformation to IBuilder. --- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 1 + src/Microsoft.AspNet.Abstractions/IServerInformation.cs | 9 +++++++++ src/Microsoft.AspNet.PipelineCore/Builder.cs | 9 ++++++++- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Abstractions/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 5699bed1b4..ce79cc7251 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -5,6 +5,7 @@ namespace Microsoft.AspNet.Abstractions public interface IBuilder { IServiceProvider ServiceProvider { get; set; } + IServerInformation Server { get; set; } IBuilder Use(Func middleware); IBuilder Run(RequestDelegate handler); diff --git a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs new file mode 100644 index 0000000000..47784e3782 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs @@ -0,0 +1,9 @@ + +namespace Microsoft.AspNet.Abstractions +{ + // TODO: [AssemblyNeutral] + public interface IServerInformation + { + string Name { get; } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 48edba1ce2..d88711a05c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -14,7 +14,14 @@ namespace Microsoft.AspNet.PipelineCore ServiceProvider = serviceProvider; } + internal Builder(Builder builder) + { + ServiceProvider = builder.ServiceProvider; + Server = builder.Server; + } + public IServiceProvider ServiceProvider { get; set; } + public IServerInformation Server { get; set; } public IBuilder Use(Func middleware) { @@ -29,7 +36,7 @@ namespace Microsoft.AspNet.PipelineCore public IBuilder New() { - return new Builder(ServiceProvider); + return new Builder(this); } public RequestDelegate Build() From c39a41bd9f055ee6c780f043f01ff63bbf972667 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 18 Mar 2014 23:01:42 -0700 Subject: [PATCH 0075/1838] Adding UseContainer middleware Assigns values to HttpContext.ApplicationServices and HttpContext.RequestServices as call passes through --- Hosting.sln | 50 +++++--- .../ContainerExtensions.cs | 45 +++++++ .../ContainerMiddleware.cs | 114 ++++++++++++++++++ .../project.json | 23 ++++ 4 files changed, 217 insertions(+), 15 deletions(-) create mode 100644 src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs create mode 100644 src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs create mode 100644 src/Microsoft.AspNet.RequestContainer/project.json diff --git a/Hosting.sln b/Hosting.sln index def8ba2b14..76c17f7d3e 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30203.2 +VisualStudioVersion = 12.0.21005.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -15,9 +15,17 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.Te EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C30C98CD-3D69-4AE9-B680-0E0E6D8834C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.net45", "samples\KWebStartup\KWebStartup.net45.csproj", "{E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.RequestContainer.net45", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.net45.csproj", "{F4C7B46C-B39F-4172-9C3A-05352183D469}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.k10", "samples\KWebStartup\KWebStartup.k10.csproj", "{348007AA-AB91-48B2-98DB-57D068E2C1AE}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.RequestContainer.k10", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.k10.csproj", "{FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{EB784E77-FD42-46EC-9C8C-502B78962407}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.k10", "samples\KWebStartup\KWebStartup.k10.csproj", "{C0235BA1-9198-42C0-92D8-7578E9B9D96B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.net45", "samples\KWebStartup\KWebStartup.net45.csproj", "{B5939234-73ED-4DAD-A2C6-D61AA6DFB406}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -37,23 +45,35 @@ Global {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Debug|Any CPU.Build.0 = Debug|Any CPU {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.ActiveCfg = Release|Any CPU {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.Build.0 = Release|Any CPU - {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF}.Release|Any CPU.Build.0 = Release|Any CPU - {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {348007AA-AB91-48B2-98DB-57D068E2C1AE}.Release|Any CPU.Build.0 = Release|Any CPU + {F4C7B46C-B39F-4172-9C3A-05352183D469}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F4C7B46C-B39F-4172-9C3A-05352183D469}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F4C7B46C-B39F-4172-9C3A-05352183D469}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F4C7B46C-B39F-4172-9C3A-05352183D469}.Release|Any CPU.Build.0 = Release|Any CPU + {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Release|Any CPU.Build.0 = Release|Any CPU + {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Release|Any CPU.Build.0 = Release|Any CPU + {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {E0497F39-AFFB-4819-A116-E39E361915AB} - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {EB784E77-FD42-46EC-9C8C-502B78962407} = {E0497F39-AFFB-4819-A116-E39E361915AB} {80588AF3-6B14-4D11-9DC4-1EF6453B54C9} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} - {E9B21845-E51A-4B8C-AF0B-0C4CE16550BF} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} - {348007AA-AB91-48B2-98DB-57D068E2C1AE} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} + {F4C7B46C-B39F-4172-9C3A-05352183D469} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} + {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} + {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B} = {EB784E77-FD42-46EC-9C8C-502B78962407} + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {EB784E77-FD42-46EC-9C8C-502B78962407} + {C0235BA1-9198-42C0-92D8-7578E9B9D96B} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} + {B5939234-73ED-4DAD-A2C6-D61AA6DFB406} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs new file mode 100644 index 0000000000..4cfdb4210f --- /dev/null +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -0,0 +1,45 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; + +namespace Microsoft.AspNet.RequestContainer +{ + public static class ContainerExtensions + { + public static IBuilder UseMiddleware(this IBuilder builder, Type middleware, params object[] args) + { + // TODO: move this ext method someplace nice + return builder.Use(next => + { + //TODO: this should be MethodInfo.CreateDelegate for coreclr + var typeActivator = builder.ServiceProvider.GetService(); + var instance = typeActivator.CreateInstance(middleware, new[] { next }.Concat(args).ToArray()); + return (RequestDelegate)Delegate.CreateDelegate(typeof(RequestDelegate), instance, "Invoke"); + }); + } + + public static IBuilder UseContainer(this IBuilder app) + { + return app.UseMiddleware(typeof(ContainerMiddleware)); + } + + public static IBuilder UseContainer(this IBuilder app, IServiceProvider applicationServices) + { + app.ServiceProvider = applicationServices; + + return app.UseMiddleware(typeof(ContainerMiddleware)); + } + + public static IBuilder UseContainer(this IBuilder app, IEnumerable applicationServices) + { + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(applicationServices); + app.ServiceProvider = serviceCollection.BuildServiceProvider(app.ServiceProvider); + + return app.UseMiddleware(typeof(ContainerMiddleware)); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs new file mode 100644 index 0000000000..d2295e90c1 --- /dev/null +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -0,0 +1,114 @@ +using System; +#if NET45 +using System.Runtime.Remoting.Messaging; +#endif +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; + +namespace Microsoft.AspNet.RequestContainer +{ + public class ContainerMiddleware + { + private const string LogicalDataKey = "__HttpContext_Current__"; + private readonly RequestDelegate _next; + private readonly IServiceProvider _rootServiceProvider; + private readonly IContextAccessor _rootHttpContextAccessor; + private readonly IServiceScopeFactory _rootServiceScopeFactory; + + public ContainerMiddleware( + RequestDelegate next, + IServiceProvider rootServiceProvider, + IContextAccessor rootHttpContextAccessor, + IServiceScopeFactory rootServiceScopeFactory) + { + if (rootServiceProvider == null) + { + throw new ArgumentNullException("rootServiceProvider"); + } + if (rootHttpContextAccessor == null) + { + throw new ArgumentNullException("rootHttpContextAccessor"); + } + if (rootServiceScopeFactory == null) + { + throw new ArgumentNullException("rootServiceScopeFactory"); + } + + _next = next; + _rootServiceProvider = rootServiceProvider; + _rootServiceScopeFactory = rootServiceScopeFactory; + _rootHttpContextAccessor = rootHttpContextAccessor; + + _rootHttpContextAccessor.SetContextSource(AccessRootHttpContext, ExchangeRootHttpContext); + } + + private HttpContext AccessRootHttpContext() + { +#if NET45 + return CallContext.LogicalGetData(LogicalDataKey) as HttpContext; +#else + throw new NotImplementedException() +#endif + } + + private HttpContext ExchangeRootHttpContext(HttpContext httpContext) + { +#if NET45 + var prior = CallContext.LogicalGetData(LogicalDataKey) as HttpContext; + CallContext.LogicalSetData(LogicalDataKey, httpContext); + return prior; +#else + throw new NotImplementedException() +#endif + } + + public async Task Invoke(HttpContext httpContext) + { + if (httpContext.RequestServices != null) + { + throw new Exception("TODO: nested request container scope? this is probably a mistake on your part?"); + } + + var priorApplicationServices = httpContext.ApplicationServices; + var priorRequestServices = httpContext.RequestServices; + + var appServiceProvider = _rootServiceProvider; + var appServiceScopeFactory = _rootServiceScopeFactory; + var appHttpContextAccessor = _rootHttpContextAccessor; + + if (priorApplicationServices != null && + priorApplicationServices != appServiceProvider) + { + appServiceProvider = priorApplicationServices; + appServiceScopeFactory = priorApplicationServices.GetService(); + appHttpContextAccessor = priorApplicationServices.GetService>(); + } + + using (var scope = appServiceScopeFactory.CreateScope()) + { + var scopeServiceProvider = scope.ServiceProvider; + var scopeHttpContextAccessor = scopeServiceProvider.GetService>(); + + httpContext.ApplicationServices = appServiceProvider; + httpContext.RequestServices = scopeServiceProvider; + + var priorAppHttpContext = appHttpContextAccessor.ExchangeValue(httpContext); + var priorScopeHttpContext = scopeHttpContextAccessor.ExchangeValue(httpContext); + + try + { + await _next.Invoke(httpContext); + } + finally + { + scopeHttpContextAccessor.ExchangeValue(priorScopeHttpContext); + appHttpContextAccessor.ExchangeValue(priorAppHttpContext); + + httpContext.RequestServices = priorRequestServices; + httpContext.ApplicationServices = priorApplicationServices; + } + } + } + } +} diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json new file mode 100644 index 0000000000..b89873123e --- /dev/null +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -0,0 +1,23 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", + "Microsoft.AspNet.Abstractions": "0.1-alpha-*" + }, + "configurations": { + "net45": {}, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.0.0" + } + } + } +} \ No newline at end of file From 7b038d4e3108cadfda9a1c04eff98b65dc0aabb1 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Mar 2014 14:26:04 -0700 Subject: [PATCH 0076/1838] Adding standard implementation of IContextAccessor<> --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 3f9555448e..4ef1e162c6 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -30,6 +30,13 @@ namespace Microsoft.AspNet.Hosting yield return describer.Transient(); + yield return new ServiceDescriptor + { + ServiceType = typeof(IContextAccessor<>), + ImplementationType = typeof(ContextAccessor<>), + Lifecycle = LifecycleKind.Scoped + }; + // The default IDataProtectionProvider is a singleton. // Note: DPAPI isn't usable in IIS where the user profile hasn't been loaded, but loading DPAPI // is deferred until the first call to Protect / Unprotect. It's up to an IIS-based host to From 951e8df8935dcae1984346d97c50f3dc366c8617 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 18 Mar 2014 23:29:26 -0700 Subject: [PATCH 0077/1838] Making core clr friendly --- .../ContainerExtensions.cs | 21 ++++++++++--------- .../ContainerMiddleware.cs | 13 ++++++++++-- 2 files changed, 22 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 4cfdb4210f..86d72c1e20 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Reflection; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Abstractions; @@ -14,32 +15,32 @@ namespace Microsoft.AspNet.RequestContainer // TODO: move this ext method someplace nice return builder.Use(next => { - //TODO: this should be MethodInfo.CreateDelegate for coreclr var typeActivator = builder.ServiceProvider.GetService(); var instance = typeActivator.CreateInstance(middleware, new[] { next }.Concat(args).ToArray()); - return (RequestDelegate)Delegate.CreateDelegate(typeof(RequestDelegate), instance, "Invoke"); + var methodinfo = middleware.GetTypeInfo().GetDeclaredMethod("Invoke"); + return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); }); } - public static IBuilder UseContainer(this IBuilder app) + public static IBuilder UseContainer(this IBuilder builder) { - return app.UseMiddleware(typeof(ContainerMiddleware)); + return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IBuilder UseContainer(this IBuilder app, IServiceProvider applicationServices) + public static IBuilder UseContainer(this IBuilder builder, IServiceProvider applicationServices) { - app.ServiceProvider = applicationServices; + builder.ServiceProvider = applicationServices; - return app.UseMiddleware(typeof(ContainerMiddleware)); + return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IBuilder UseContainer(this IBuilder app, IEnumerable applicationServices) + public static IBuilder UseContainer(this IBuilder builder, IEnumerable applicationServices) { var serviceCollection = new ServiceCollection(); serviceCollection.Add(applicationServices); - app.ServiceProvider = serviceCollection.BuildServiceProvider(app.ServiceProvider); + builder.ServiceProvider = serviceCollection.BuildServiceProvider(builder.ServiceProvider); - return app.UseMiddleware(typeof(ContainerMiddleware)); + return builder.UseMiddleware(typeof(ContainerMiddleware)); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index d2295e90c1..a33a6ac7db 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -43,12 +43,19 @@ namespace Microsoft.AspNet.RequestContainer _rootHttpContextAccessor.SetContextSource(AccessRootHttpContext, ExchangeRootHttpContext); } +#if NET45 +#else +#warning This MUST NOT be ThreadStatic in reality + [ThreadStatic] + HttpContext THIS_IS_BROKEN_AND_MUST_BE_CHANGED; +#endif + private HttpContext AccessRootHttpContext() { #if NET45 return CallContext.LogicalGetData(LogicalDataKey) as HttpContext; #else - throw new NotImplementedException() + return THIS_IS_BROKEN_AND_MUST_BE_CHANGED; #endif } @@ -59,7 +66,9 @@ namespace Microsoft.AspNet.RequestContainer CallContext.LogicalSetData(LogicalDataKey, httpContext); return prior; #else - throw new NotImplementedException() + var prior = THIS_IS_BROKEN_AND_MUST_BE_CHANGED; + THIS_IS_BROKEN_AND_MUST_BE_CHANGED = httpContext; + return prior; #endif } From ff1962883240d942ced116e8c42950317fbd93b3 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 19 Mar 2014 00:02:58 -0700 Subject: [PATCH 0078/1838] Removing the temporary use of thread static --- .../ContainerMiddleware.cs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index a33a6ac7db..61d985fc3d 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -43,20 +43,13 @@ namespace Microsoft.AspNet.RequestContainer _rootHttpContextAccessor.SetContextSource(AccessRootHttpContext, ExchangeRootHttpContext); } -#if NET45 -#else -#warning This MUST NOT be ThreadStatic in reality - [ThreadStatic] - HttpContext THIS_IS_BROKEN_AND_MUST_BE_CHANGED; -#endif - private HttpContext AccessRootHttpContext() { #if NET45 return CallContext.LogicalGetData(LogicalDataKey) as HttpContext; #else - return THIS_IS_BROKEN_AND_MUST_BE_CHANGED; -#endif + throw new Exception("TODO: CallContext not available"); +#endif } private HttpContext ExchangeRootHttpContext(HttpContext httpContext) @@ -66,9 +59,7 @@ namespace Microsoft.AspNet.RequestContainer CallContext.LogicalSetData(LogicalDataKey, httpContext); return prior; #else - var prior = THIS_IS_BROKEN_AND_MUST_BE_CHANGED; - THIS_IS_BROKEN_AND_MUST_BE_CHANGED = httpContext; - return prior; + return null; #endif } From 2c49d89094a46d3e9857ad5505b3c68ebb6472f8 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 20 Mar 2014 11:19:42 -0700 Subject: [PATCH 0079/1838] Code review cleanup. --- src/Microsoft.AspNet.PipelineCore/Builder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index d88711a05c..9c9da66547 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.PipelineCore ServiceProvider = serviceProvider; } - internal Builder(Builder builder) + private Builder(Builder builder) { ServiceProvider = builder.ServiceProvider; Server = builder.Server; From 11762840cdb7e1dd064f89e0aec4ae2be9726e19 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 19 Mar 2014 11:43:13 -0700 Subject: [PATCH 0080/1838] Add an Initialize step to IServerFactory. --- samples/KWebStartup/project.json | 2 +- src/Microsoft.AspNet.Hosting/HostingContext.cs | 3 +++ src/Microsoft.AspNet.Hosting/HostingEngine.cs | 17 +++++++++++++++-- src/Microsoft.AspNet.Hosting/Program.cs | 1 + .../Server/IServerFactory.cs | 4 +++- .../HostingEngineTests.cs | 10 ++++++++-- .../Microsoft.AspNet.Hosting.Tests/project.json | 1 + 7 files changed, 32 insertions(+), 6 deletions(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 1d16b7bd9e..70b55fad15 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -5,7 +5,7 @@ "Microsoft.AspNet.Hosting": "0.1-alpha-*", "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" }, - "commands": { "web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener" }, + "commands": { "web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, "configurations": { "net45": { }, diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index 303e9e7770..b1d96a88e0 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -1,5 +1,6 @@ using System; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.Hosting.Server; namespace Microsoft.AspNet.Hosting @@ -7,6 +8,7 @@ namespace Microsoft.AspNet.Hosting public class HostingContext { public IServiceProvider Services { get; set; } + public IConfiguration Configuration { get; set; } public IBuilder Builder { get; set; } @@ -16,5 +18,6 @@ namespace Microsoft.AspNet.Hosting public string ServerName { get; set; } public IServerFactory ServerFactory { get; set; } + public IServerInformation Server { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 1bf28ef25b..b04d02f65a 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -30,10 +30,11 @@ namespace Microsoft.AspNet.Hosting { EnsureBuilder(context); EnsureServerFactory(context); + InitalizeServerFactory(context); EnsureApplicationDelegate(context); var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate); - var server = context.ServerFactory.Start(pipeline.Invoke); + var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); return new Disposable(() => { @@ -66,6 +67,19 @@ namespace Microsoft.AspNet.Hosting context.ServerFactory = _serverManager.GetServerFactory(context.ServerName); } + private void InitalizeServerFactory(HostingContext context) + { + if (context.Server == null) + { + context.Server = context.ServerFactory.Initialize(context.Configuration); + } + + if (context.Builder.Server == null) + { + context.Builder.Server = context.Server; + } + } + private void EnsureApplicationDelegate(HostingContext context) { if (context.ApplicationDelegate != null) @@ -74,7 +88,6 @@ namespace Microsoft.AspNet.Hosting } EnsureApplicationStartup(context); - EnsureBuilder(context); context.ApplicationStartup.Invoke(context.Builder); context.ApplicationDelegate = context.Builder.Build(); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 76dffada12..18dc9f4899 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -37,6 +37,7 @@ namespace Microsoft.AspNet.Hosting var context = new HostingContext() { Services = services, + Configuration = config, ServerName = config.Get("server.name"), // TODO: Key names ApplicationName = config.Get("app.name") // TODO: Key names ?? appEnvironment.ApplicationName, diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 4ae76a13b4..79b4b6c554 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.ConfigurationModel; using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting.Server @@ -8,6 +9,7 @@ namespace Microsoft.AspNet.Hosting.Server // TODO: [AssemblyNeutral] public interface IServerFactory { - IDisposable Start(Func application); + IServerInformation Initialize(IConfiguration configuraiton); + IDisposable Start(IServerInformation serverInformation, Func application); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index eb09beba24..b94ec289b2 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -2,9 +2,10 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.AspNet.Hosting.Server; using Xunit; namespace Microsoft.AspNet.Hosting @@ -56,7 +57,12 @@ namespace Microsoft.AspNet.Hosting } - public IDisposable Start(Func application) + public IServerInformation Initialize(IConfiguration configuraiton) + { + return null; + } + + public IDisposable Start(IServerInformation serverInformation, Func application) { var startInstance = new StartInstance(application); _startInstances.Add(startInstance); diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 8c46f5dd94..b99c5d336f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,6 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", + "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", "Microsoft.AspNet.Abstractions":"0.1-alpha-*", "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", "Xunit.KRunner": "0.1-alpha-*", From 982cf2a1d63cd153419d807dafbe61ce854f3009 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 20 Mar 2014 11:20:16 -0700 Subject: [PATCH 0081/1838] Code review cleanup. --- src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs | 3 +-- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 79b4b6c554..054e5e0308 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -2,14 +2,13 @@ using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.ConfigurationModel; -using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting.Server { // TODO: [AssemblyNeutral] public interface IServerFactory { - IServerInformation Initialize(IConfiguration configuraiton); + IServerInformation Initialize(IConfiguration configuration); IDisposable Start(IServerInformation serverInformation, Func application); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index b94ec289b2..a7fbfc88f1 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Hosting } - public IServerInformation Initialize(IConfiguration configuraiton) + public IServerInformation Initialize(IConfiguration configuration) { return null; } From 9a4678d40fd9b91687058c512e6a62932474d71a Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 20 Mar 2014 21:13:31 -0700 Subject: [PATCH 0082/1838] Change config order. --- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 18dc9f4899..e8ce97b453 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -22,11 +22,11 @@ namespace Microsoft.AspNet.Hosting { var config = new Configuration(); config.AddCommandLine(args); - config.AddEnvironmentVariables(); if (File.Exists(HostingIniFile)) { config.AddIniFile(HostingIniFile); } + config.AddEnvironmentVariables(); var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); From 2207acb917ecf327b1738878551c014c1c9172ed Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 21 Mar 2014 17:53:18 -0700 Subject: [PATCH 0083/1838] Incorporate breaking change from DI --- src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 86d72c1e20..05b56f92cd 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.RequestContainer return builder.Use(next => { var typeActivator = builder.ServiceProvider.GetService(); - var instance = typeActivator.CreateInstance(middleware, new[] { next }.Concat(args).ToArray()); + var instance = typeActivator.CreateInstance(builder.ServiceProvider, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetTypeInfo().GetDeclaredMethod("Invoke"); return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); }); From a5dbcac2b75a4ad8fdc742dd560536bc7e78b556 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 23 Mar 2014 14:25:24 -0700 Subject: [PATCH 0084/1838] Use new test infrastructure. --- HttpAbstractions.sln | 23 +++++++--------- global.json | 3 +++ .../project.json | 26 +++++++++++------- .../project.json | 14 +++++++--- .../DefaultHttpRequestTests.cs | 1 - .../project.json | 27 ++++++++++++------- 6 files changed, 58 insertions(+), 36 deletions(-) create mode 100644 global.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 52bda0a4c2..be895cf892 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.30313.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{659F2FD7-D44F-4953-A69D-94AF3D41BA21}" EndProject @@ -33,8 +33,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.AppBuilder EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{04077455-D4A2-43AF-ABA2-E68968856E17}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{8C87E051-8A68-439A-A6C3-B16948126606}" -EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests.net45", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.net45.csproj", "{4C82EE1A-9B93-4374-91E0-75476AABF5CD}" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests.net45", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.net45.csproj", "{00A03235-B248-4079-A7EE-4F77AB3A84E4}" @@ -98,20 +96,19 @@ Global HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution + {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} + {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} + {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} {C2E0CB24-159D-422F-B8D1-ACA7353B5C44} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {8C87E051-8A68-439A-A6C3-B16948126606} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03} = {04077455-D4A2-43AF-ABA2-E68968856E17} + {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {4C82EE1A-9B93-4374-91E0-75476AABF5CD} = {04077455-D4A2-43AF-ABA2-E68968856E17} {00A03235-B248-4079-A7EE-4F77AB3A84E4} = {04077455-D4A2-43AF-ABA2-E68968856E17} EndGlobalSection diff --git a/global.json b/global.json new file mode 100644 index 0000000000..840c36f6ad --- /dev/null +++ b/global.json @@ -0,0 +1,3 @@ +{ + "sources": ["src"] +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json index 3ff0961905..e092fca527 100644 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json +++ b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json @@ -4,19 +4,27 @@ "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "" + "Microsoft.AspNet.FeatureModel": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" }, "configurations": { "net45": { "dependencies": { - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", - "Shouldly": "1.1.1.1", - "xunit": "1.9.2", - "Microsoft.Net.Http": "2.2.13", - "System.Net.Http": "" + "System.Runtime": "", + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.Owin.Hosting": "2.1.0", + "Microsoft.Owin.Testing": "2.1.0", + "Shouldly": "1.1.1.1", + "Microsoft.Net.Http": "2.2.13", + "System.Net.Http": "" } } } diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index e52db7c2c2..f5db7e821f 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -4,13 +4,21 @@ "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "" + "Microsoft.AspNet.FeatureModel": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" }, "configurations": { "net45": { "dependencies": { - "Shouldly": "1.1.1.1", - "xunit": "1.9.2" + "Shouldly": "1.1.1.1", + "System.Runtime": "" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 652edf2927..801f4fb3a2 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -6,7 +6,6 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; using Xunit; -using Xunit.Extensions; namespace Microsoft.AspNet.PipelineCore.Tests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 5d77e10d07..efafaacca3 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -5,20 +5,27 @@ "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.PipelineCore": "" + "Microsoft.AspNet.PipelineCore": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" }, "configurations": { "net45": { "dependencies": { - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", - "Moq": "4.2.1312.1622", - "xunit": "1.9.2", - "xunit.extensions": "1.9.2", - "Microsoft.Net.Http": "2.2.13", - "System.Net.Http": "" + "System.Runtime": "", + "Owin": "1.0", + "Microsoft.Owin": "2.1.0", + "Microsoft.Owin.Hosting": "2.1.0", + "Microsoft.Owin.Testing": "2.1.0", + "Moq": "4.2.1312.1622", + "Microsoft.Net.Http": "2.2.13", + "System.Net.Http": "" } } } From b366cb1cd09b43364e2ea5f6b61e3a2bc820dbbf Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 27 Mar 2014 18:30:24 -0700 Subject: [PATCH 0085/1838] Updating CoreCLR package versions --- samples/KWebStartup/project.json | 6 +++--- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.RequestContainer/project.json | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 70b55fad15..9b3ca4f7cf 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -24,9 +24,9 @@ "System.Resources.ResourceManager": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.10.0", - "System.Text.Encoding": "4.0.10.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Runtime.InteropServices": "4.0.20.0", + "System.Text.Encoding": "4.0.20.0", + "System.Threading.Tasks": "4.0.10.0" } } } diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 3f0cca6268..be245644fd 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -24,7 +24,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Threading.Tasks": "4.0.10.0" } } } diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index b89873123e..a438c15933 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -16,7 +16,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Threading.Tasks": "4.0.10.0" } } } From eaddb295772edff2ebcd21f600bfbf270363eb8d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 28 Mar 2014 06:03:23 -0700 Subject: [PATCH 0086/1838] Updating CoreCLR package versions --- src/Microsoft.AspNet.Abstractions/project.json | 4 ++-- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 4 ++-- src/Microsoft.AspNet.PipelineCore/project.json | 7 ++++--- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 669ddaed1c..e0db39cefa 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -11,8 +11,8 @@ "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.10.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Runtime.InteropServices": "4.0.20.0", + "System.Threading.Tasks": "4.0.10.0" } } } diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 33f8ba15f7..7d3092564d 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -10,7 +10,7 @@ "System.Reflection": "4.0.10.0", "System.Reflection.Compatibility": "4.0.0.0", "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", "System.Threading": "4.0.0.0" } } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index fe3cbc04bc..35f7cd2425 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -6,10 +6,10 @@ "dependencies": { "System.IO": "4.0.0.0", "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", "System.Security.Claims": "0.1-alpha-*", "System.Security.Principal": "4.0.0.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Threading.Tasks": "4.0.10.0" } } } diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 82b021a735..58a9d9ef86 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,3 +1,4 @@ + { "version": "0.1-alpha-*", "dependencies": { @@ -18,9 +19,9 @@ "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.10.0", - "System.Text.Encoding": "4.0.10.0", - "System.Threading.Tasks": "4.0.0.0" + "System.Runtime.InteropServices": "4.0.20.0", + "System.Text.Encoding": "4.0.20.0", + "System.Threading.Tasks": "4.0.10.0" } } } From 4347ddfd0f7b97675ee0e4e489d69e42c6e29081 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 27 Mar 2014 16:13:29 -0700 Subject: [PATCH 0087/1838] Security contracts. --- .../HttpContext.cs | 6 + .../Security/AuthenticateResult.cs | 56 +++++ .../Security/AuthenticationDescription.cs | 72 +++++++ .../Security/AuthenticationManager.cs | 37 ++++ .../Security/AuthenticationProperties.cs | 164 +++++++++++++++ .../project.json | 8 +- .../Security/IAuthenticateContext.cs | 14 ++ .../Security/IAuthenticationChallenge.cs | 10 - .../Security/IAuthenticationDescription.cs | 9 - .../Security/IAuthenticationHandler.cs | 19 ++ .../Security/IAuthenticationResult.cs | 14 -- .../Security/IAuthenticationSignOut.cs | 9 - .../Security/IChallengeContext .cs | 12 ++ .../Security/IHttpAuthentication.cs | 15 +- ...henticationSignIn.cs => ISignInContext.cs} | 4 +- .../Security/ISignOutContext .cs | 11 + .../DefaultHttpContext.cs | 21 ++ .../Security/AuthenticateContext.cs | 37 ++++ .../Security/ChallengeContext.cs | 30 +++ .../Security/DefaultAuthenticationManager.cs | 196 ++++++++++++++++++ .../Security/DefaultHttpAuthentication.cs | 24 +++ .../Security/SignInContext.cs | 28 +++ .../Security/SignOutContext.cs | 24 +++ .../project.json | 2 + 24 files changed, 766 insertions(+), 56 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs rename src/Microsoft.AspNet.HttpFeature/Security/{IAuthenticationSignIn.cs => ISignInContext.cs} (64%) create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 9f2eac3614..7856d02d99 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,5 +1,7 @@ using System; using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Abstractions { @@ -8,6 +10,10 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpRequest Request { get; } public abstract HttpResponse Response { get; } + + public abstract AuthenticationManager Authentication { get; } + + public abstract ClaimsPrincipal User { get; set; } public abstract IDictionary Items { get; } diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs new file mode 100644 index 0000000000..2584f395fa --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Security.Principal; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.Abstractions.Security +{ + /// + /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. + /// + public class AuthenticationResult + { + /// + /// Create an instance of the result object + /// + /// Assigned to Identity. May be null. + /// Assigned to Properties. Contains extra information carried along with the identity. + /// Assigned to Description. Contains information describing the authentication provider. + public AuthenticationResult(IIdentity identity, AuthenticationProperties properties, AuthenticationDescription description) + { + if (properties == null) + { + throw new ArgumentNullException("properties"); + } + if (description == null) + { + throw new ArgumentNullException("description"); + } + if (identity != null) + { + Identity = identity as ClaimsIdentity ?? new ClaimsIdentity(identity); + } + Properties = properties; + Description = description; + } + + /// + /// Contains the claims that were authenticated by the given AuthenticationType. If the authentication + /// type was not successful the Identity property will be null. + /// + public ClaimsIdentity Identity { get; private set; } + + /// + /// Contains extra values that were provided with the original SignIn call. + /// + public AuthenticationProperties Properties { get; private set; } + + /// + /// Contains description properties for the middleware authentication type in general. Does not + /// vary per request. + /// + public AuthenticationDescription Description { get; private set; } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs new file mode 100644 index 0000000000..de627373a5 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.Abstractions.Security +{ + /// + /// Contains information describing an authentication provider. + /// + public class AuthenticationDescription + { + private const string CaptionPropertyKey = "Caption"; + private const string AuthenticationTypePropertyKey = "AuthenticationType"; + + /// + /// Initializes a new instance of the class + /// + public AuthenticationDescription() + { + Dictionary = new Dictionary(StringComparer.Ordinal); + } + + /// + /// Initializes a new instance of the class + /// + /// + public AuthenticationDescription(IDictionary properties) + { + if (properties == null) + { + throw new ArgumentNullException("properties"); + } + Dictionary = properties; + } + + /// + /// Contains metadata about the authentication provider. + /// + public IDictionary Dictionary { get; private set; } + + /// + /// Gets or sets the name used to reference the authentication middleware instance. + /// + public string AuthenticationType + { + get { return GetString(AuthenticationTypePropertyKey); } + set { Dictionary[AuthenticationTypePropertyKey] = value; } + } + + /// + /// Gets or sets the display name for the authentication provider. + /// + public string Caption + { + get { return GetString(CaptionPropertyKey); } + set { Dictionary[CaptionPropertyKey] = value; } + } + + private string GetString(string name) + { + object value; + if (Dictionary.TryGetValue(name, out value)) + { + return Convert.ToString(value, CultureInfo.InvariantCulture); + } + return null; + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs new file mode 100644 index 0000000000..36ed704cc9 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Security +{ + public abstract class AuthenticationManager + { + public abstract HttpContext HttpContext { get; } + + public abstract IEnumerable GetAuthenticationTypes(); + public abstract IEnumerable GetAuthenticationTypes(Func predicate); + + public abstract AuthenticationResult Authenticate(string authenticationType); // TODO: Is sync a good idea? + public abstract IEnumerable Authenticate(IList authenticationTypes); + + public abstract Task AuthenticateAsync(string authenticationType); + public abstract Task> AuthenticateAsync(IList authenticationTypes); + + public abstract void Challenge(); + public abstract void Challenge(AuthenticationProperties properties); + public abstract void Challenge(string authenticationType); + public abstract void Challenge(string authenticationType, AuthenticationProperties properties); + public abstract void Challenge(IList authenticationTypes); + public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); + + public abstract void SignIn(ClaimsPrincipal user); // TODO: This took multiple identities in Katana. Is that needed? + public abstract void SignIn(ClaimsPrincipal user, AuthenticationProperties properties); // TODO: ClaimsIdentity vs ClaimsPrincipal? + + public abstract void SignOut(); + public abstract void SignOut(string authenticationType); + public abstract void SignOut(IList authenticationTypes); + } +} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs new file mode 100644 index 0000000000..9d03d42c92 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -0,0 +1,164 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.Abstractions.Security +{ + /// + /// Dictionary used to store state values about the authentication session. + /// + public class AuthenticationProperties + { + internal const string IssuedUtcKey = ".issued"; + internal const string ExpiresUtcKey = ".expires"; + internal const string IsPersistentKey = ".persistent"; + internal const string RedirectUriKey = ".redirect"; + internal const string UtcDateTimeFormat = "r"; + + /// + /// Initializes a new instance of the class + /// + public AuthenticationProperties() + : this(null) + { + } + + /// + /// Initializes a new instance of the class + /// + /// + public AuthenticationProperties(IDictionary dictionary) + { + Dictionary = dictionary ?? new Dictionary(StringComparer.Ordinal); + } + + /// + /// State values about the authentication session. + /// + public IDictionary Dictionary { get; private set; } + + /// + /// Gets or sets whether the authentication session is persisted across multiple requests. + /// + public bool IsPersistent + { + get { return Dictionary.ContainsKey(IsPersistentKey); } + set + { + if (Dictionary.ContainsKey(IsPersistentKey)) + { + if (!value) + { + Dictionary.Remove(IsPersistentKey); + } + } + else + { + if (value) + { + Dictionary.Add(IsPersistentKey, string.Empty); + } + } + } + } + + /// + /// Gets or sets the full path or absolute URI to be used as an http redirect response value. + /// + [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] + public string RedirectUri + { + get + { + string value; + return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; + } + set + { + if (value != null) + { + Dictionary[RedirectUriKey] = value; + } + else + { + if (Dictionary.ContainsKey(RedirectUriKey)) + { + Dictionary.Remove(RedirectUriKey); + } + } + } + } + + /// + /// Gets or sets the time at which the authentication ticket was issued. + /// + public DateTimeOffset? IssuedUtc + { + get + { + string value; + if (Dictionary.TryGetValue(IssuedUtcKey, out value)) + { + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + { + return dateTimeOffset; + } + } + return null; + } + set + { + if (value.HasValue) + { + Dictionary[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else + { + if (Dictionary.ContainsKey(IssuedUtcKey)) + { + Dictionary.Remove(IssuedUtcKey); + } + } + } + } + + /// + /// Gets or sets the time at which the authentication ticket expires. + /// + public DateTimeOffset? ExpiresUtc + { + get + { + string value; + if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) + { + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + { + return dateTimeOffset; + } + } + return null; + } + set + { + if (value.HasValue) + { + Dictionary[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + } + else + { + if (Dictionary.ContainsKey(ExpiresUtcKey)) + { + Dictionary.Remove(ExpiresUtcKey); + } + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index e0db39cefa..4b9c817d53 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -1,17 +1,23 @@ { "version": "0.1-alpha-*", - "dependencies": {}, + "dependencies": { + "Microsoft.AspNet.HttpFeature": "" + }, "configurations": { "net45": {}, "k10": { "dependencies": { + "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "0.1-alpha-*", + "System.Security.Principal" : "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs new file mode 100644 index 0000000000..7f617e08a2 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using System.Security.Claims; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface IAuthenticateContext + { + IList AuthenticationTypes { get; } + + void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description); + + void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs deleted file mode 100644 index 4f8324d45e..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationChallenge.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.HttpFeature.Security -{ - public interface IAuthenticationChallenge - { - IEnumerable AuthenticationTypes { get; } - IDictionary Properties { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs deleted file mode 100644 index f7cca258f5..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationDescription.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.HttpFeature.Security -{ - public interface IAuthenticationDescription - { - IDictionary Properties { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs new file mode 100644 index 0000000000..66c82fccfc --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public delegate void DescriptionDelegate(IDictionary description, object state); + + public interface IAuthenticationHandler + { + void GetDescriptions(DescriptionDelegate callback, object state); + + void Authenticate(IAuthenticateContext context); // TODO: (maybe?) + Task AuthenticateAsync(IAuthenticateContext context); + + void Challenge(IChallengeContext context); + void SignIn(ISignInContext context); + void SignOut(ISignOutContext context); + } +} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs deleted file mode 100644 index b047bae8bd..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationResult.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.AspNet.HttpFeature.Security; - -// ReSharper disable once CheckNamespace -namespace Microsoft.AspNet.Interfaces.Security -{ - public interface IAuthenticationResult - { - ClaimsIdentity Identity { get; } - IDictionary Properties { get; } - IAuthenticationDescription Description { get; } - } -} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs deleted file mode 100644 index bab55a23e1..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignOut.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.HttpFeature.Security -{ - public interface IAuthenticationSignOut - { - IEnumerable AuthenticationTypes { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs new file mode 100644 index 0000000000..9b80cdd5be --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface IChallengeContext + { + IList AuthenticationTypes {get;} + IDictionary Properties {get;} + + void Ack(string authenticationType, IDictionary description); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index 477df94a12..d1a7c16596 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,19 +1,10 @@ -using System.Collections.Generic; -using System.Security.Principal; -using System.Threading.Tasks; -using Microsoft.AspNet.Interfaces.Security; +using System.Security.Claims; namespace Microsoft.AspNet.HttpFeature.Security { public interface IHttpAuthentication { - IPrincipal User { get; set; } - - IEnumerable Authenticate(string[] authenticationTypes); - Task> AuthenticateAsync(string[] authenticationTypes); - - IAuthenticationChallenge ChallengeDetails { get; set; } - IAuthenticationSignIn SignInDetails { get; set; } - IAuthenticationSignOut SignOutDetails { get; set; } + ClaimsPrincipal User { get; set; } + IAuthenticationHandler Handler { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs similarity index 64% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs rename to src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index 6033b173c5..abcfd2e6bd 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationSignIn.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -3,9 +3,11 @@ using System.Security.Claims; namespace Microsoft.AspNet.HttpFeature.Security { - public interface IAuthenticationSignIn + public interface ISignInContext { ClaimsPrincipal User { get; } IDictionary Properties { get; } + + void Ack(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs new file mode 100644 index 0000000000..97df86501c --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -0,0 +1,11 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface ISignOutContext + { + IList AuthenticationTypes { get; } + + void Ack(string authenticationType, IDictionary description); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index da5e692686..b4632aabb7 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,8 +1,12 @@ using System; using System.Collections.Generic; +using System.Security.Claims; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.PipelineCore { @@ -10,9 +14,11 @@ namespace Microsoft.AspNet.PipelineCore { private readonly HttpRequest _request; private readonly HttpResponse _response; + private readonly AuthenticationManager _authentication; private FeatureReference _canHasItems; private FeatureReference _canHasServiceProviders; + private FeatureReference _auth; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -20,9 +26,11 @@ namespace Microsoft.AspNet.PipelineCore _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); + _authentication = new DefaultAuthenticationManager(this, features); _canHasItems = FeatureReference.Default; _canHasServiceProviders = FeatureReference.Default; + _auth = FeatureReference.Default; } ICanHasItems CanHasItems @@ -35,10 +43,23 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasServiceProviders.Fetch(_features) ?? _canHasServiceProviders.Update(_features, new DefaultCanHasServiceProviders()); } } + private IHttpAuthentication HttpAuthentication + { + get { return _auth.Fetch(_features) ?? _auth.Update(_features, new DefaultHttpAuthentication()); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } + public override AuthenticationManager Authentication { get { return _authentication; } } + + public override ClaimsPrincipal User + { + get { return HttpAuthentication.User; } + set { HttpAuthentication.User = value; } + } + public override IDictionary Items { get { return CanHasItems.Items; } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs new file mode 100644 index 0000000000..f9d6359260 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class AuthenticateContext : IAuthenticateContext + { + public AuthenticateContext(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException("authenticationType"); + } + AuthenticationTypes = authenticationTypes; + Results = new List(); + } + + public IList AuthenticationTypes { get; private set; } + + public IList Results { get; private set; } + + public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) + { + Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), new AuthenticationDescription(description))); + } + + public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs new file mode 100644 index 0000000000..7ce8d1c039 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class ChallengeContext : IChallengeContext + { + public ChallengeContext(IList authenticationTypes, IDictionary properties) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + AuthenticationTypes = authenticationTypes; + Properties = properties ?? new Dictionary(StringComparer.Ordinal); + } + + public IList AuthenticationTypes { get; private set; } + + public IDictionary Properties { get; private set; } + + public void Ack(string authenticationType, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs new file mode 100644 index 0000000000..39f47c0acf --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Security.Claims; +using System.Security.Principal; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore.Infrastructure; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class DefaultAuthenticationManager : AuthenticationManager + { + private readonly DefaultHttpContext _context; + private readonly IFeatureCollection _features; + + private readonly FeatureReference _authentication = FeatureReference.Default; + private readonly FeatureReference _response = FeatureReference.Default; + + public DefaultAuthenticationManager(DefaultHttpContext context, IFeatureCollection features) + { + _context = context; + _features = features; + } + + private IHttpAuthentication HttpAuthentication + { + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + } + + public override HttpContext HttpContext { get { return _context; } } + + private IHttpResponseInformation HttpResponseInformation + { + get { return _response.Fetch(_features); } + } + + public override IEnumerable GetAuthenticationTypes() + { + return GetAuthenticationTypes(_ => true); + } + + public override IEnumerable GetAuthenticationTypes(Func predicate) + { + var descriptions = new List(); + var handler = HttpAuthentication.Handler; + if (handler != null) + { + // TODO: static delegate field + handler.GetDescriptions(GetAuthenticationTypesCallback, descriptions); + } + return descriptions; + } + + private static void GetAuthenticationTypesCallback(IDictionary description, object state) + { + var localDescriptions = (List)state; + localDescriptions.Add(new AuthenticationDescription(description)); + } + + public override AuthenticationResult Authenticate(string authenticationType) + { + return Authenticate(new[] { authenticationType }).SingleOrDefault(); + } + + public override IEnumerable Authenticate(IList authenticationTypes) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return new AuthenticationResult[0]; + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + handler.Authenticate(authenticateContext); + // TODO: Verify all types ack'd + + return authenticateContext.Results; + } + + public override async Task AuthenticateAsync(string authenticationType) + { + return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); + } + + public override async Task> AuthenticateAsync(IList authenticationTypes) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return new AuthenticationResult[0]; + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + await handler.AuthenticateAsync(authenticateContext); + // TODO: Verify all types ack'd + + return authenticateContext.Results; + } + + public override void Challenge() + { + Challenge(new string[0]); + } + + public override void Challenge(AuthenticationProperties properties) + { + Challenge(new string[0], properties); + } + + public override void Challenge(string authenticationType) + { + Challenge(new[] { authenticationType }); + } + + public override void Challenge(string authenticationType, AuthenticationProperties properties) + { + Challenge(new[] { authenticationType }, properties); + } + + public override void Challenge(IList authenticationTypes) + { + Challenge(authenticationTypes, null); + } + + public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? If authTypes.Length > 1? + return; + } + + var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); + handler.Challenge(challengeContext); + // TODO: Verify all types ack'd + } + + public override void SignIn(ClaimsPrincipal user) + { + SignIn(user, null); + } + + public override void SignIn(ClaimsPrincipal user, AuthenticationProperties properties) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return; + } + + var signInContext = new SignInContext(user, properties == null ? null : properties.Dictionary); + handler.SignIn(signInContext); + // TODO: Verify all types ack'd + } + + public override void SignOut() + { + SignOut(new string[0]); + } + + public override void SignOut(string authenticationType) + { + SignOut(new[] { authenticationType }); + } + + public override void SignOut(IList authenticationTypes) + { + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + // TODO: InvalidOperationException? No auth types supported? + return; + } + + var signOutContext = new SignOutContext(authenticationTypes); + handler.SignOut(signOutContext); + // TODO: Verify all types ack'd + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs new file mode 100644 index 0000000000..519b1a6c5e --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs @@ -0,0 +1,24 @@ +using System.Security.Claims; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class DefaultHttpAuthentication : IHttpAuthentication + { + public DefaultHttpAuthentication() + { + } + + public ClaimsPrincipal User + { + get; + set; + } + + public IAuthenticationHandler Handler + { + get; + set; + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs new file mode 100644 index 0000000000..2f48119b88 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class SignInContext : ISignInContext + { + public SignInContext(ClaimsPrincipal user, IDictionary dictionary) + { + if (user == null) + { + throw new ArgumentNullException("user"); + } + User = user; + Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + } + + public ClaimsPrincipal User { get; private set; } + + public IDictionary Properties { get; private set; } + + public void Ack(string authenticationType, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs new file mode 100644 index 0000000000..b99950d3bc --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class SignOutContext : ISignOutContext + { + public SignOutContext(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException("authenticationTypes"); + } + AuthenticationTypes = authenticationTypes; + } + + public IList AuthenticationTypes { get; private set; } + + public void Ack(string authenticationType, IDictionary description) + { + } + } +} diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 58a9d9ef86..e8e90fdd08 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -20,6 +20,8 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "0.1-alpha-*", + "System.Security.Principal" : "4.0.0.0", "System.Text.Encoding": "4.0.20.0", "System.Threading.Tasks": "4.0.10.0" } From 097138e81380d1b603f7602a4f8aed709fe54926 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 31 Mar 2014 11:09:38 -0700 Subject: [PATCH 0088/1838] Auth: Validate acks. --- .../Security/AuthenticateContext.cs | 8 +- .../Security/ChallengeContext.cs | 4 + .../Security/DefaultAuthenticationManager.cs | 84 ++++++++++++++----- .../Security/SignInContext.cs | 4 + .../Security/SignOutContext.cs | 4 + 5 files changed, 82 insertions(+), 22 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index f9d6359260..15f9be71b3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -19,19 +19,25 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Results = new List(); + Acked = new List(); } public IList AuthenticationTypes { get; private set; } public IList Results { get; private set; } + public IList Acked { get; private set; } + public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) { - Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), new AuthenticationDescription(description))); + var descrip = new AuthenticationDescription(description); + Acked.Add(descrip.AuthenticationType); + Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); } public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) { + Acked.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 7ce8d1c039..991ecb52a0 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -17,14 +17,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); + Acked = new List(); } public IList AuthenticationTypes { get; private set; } public IDictionary Properties { get; private set; } + + public IList Acked { get; private set; } public void Ack(string authenticationType, IDictionary description) { + Acked.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs index 39f47c0acf..4030e67d21 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs @@ -17,6 +17,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class DefaultAuthenticationManager : AuthenticationManager { + private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; + private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; @@ -52,8 +54,7 @@ namespace Microsoft.AspNet.PipelineCore.Security var handler = HttpAuthentication.Handler; if (handler != null) { - // TODO: static delegate field - handler.GetDescriptions(GetAuthenticationTypesCallback, descriptions); + handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); } return descriptions; } @@ -71,17 +72,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override IEnumerable Authenticate(IList authenticationTypes) { - HttpResponseInformation.StatusCode = 401; + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return new AuthenticationResult[0]; + throw new InvalidOperationException("No authentication handlers present."); } var authenticateContext = new AuthenticateContext(authenticationTypes); handler.Authenticate(authenticateContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } return authenticateContext.Results; } @@ -93,17 +102,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override async Task> AuthenticateAsync(IList authenticationTypes) { - HttpResponseInformation.StatusCode = 401; + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return new AuthenticationResult[0]; + throw new InvalidOperationException("No authentication handlers present."); } var authenticateContext = new AuthenticateContext(authenticationTypes); await handler.AuthenticateAsync(authenticateContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } return authenticateContext.Results; } @@ -135,17 +152,26 @@ namespace Microsoft.AspNet.PipelineCore.Security public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } HttpResponseInformation.StatusCode = 401; var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? If authTypes.Length > 1? - return; + throw new InvalidOperationException("No authentication handlers present."); } var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); handler.Challenge(challengeContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } } public override void SignIn(ClaimsPrincipal user) @@ -155,17 +181,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override void SignIn(ClaimsPrincipal user, AuthenticationProperties properties) { - HttpResponseInformation.StatusCode = 401; + if (user == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return; + throw new InvalidOperationException("No authentication handlers present."); } var signInContext = new SignInContext(user, properties == null ? null : properties.Dictionary); handler.SignIn(signInContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = user.Identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } } public override void SignOut() @@ -180,17 +214,25 @@ namespace Microsoft.AspNet.PipelineCore.Security public override void SignOut(IList authenticationTypes) { - HttpResponseInformation.StatusCode = 401; + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } var handler = HttpAuthentication.Handler; if (handler == null) { - // TODO: InvalidOperationException? No auth types supported? - return; + throw new InvalidOperationException("No authentication handlers present."); } var signOutContext = new SignOutContext(authenticationTypes); handler.SignOut(signOutContext); - // TODO: Verify all types ack'd + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 2f48119b88..24c16de568 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -15,14 +15,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } User = user; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + Acked = new List(); } public ClaimsPrincipal User { get; private set; } public IDictionary Properties { get; private set; } + public IList Acked { get; private set; } + public void Ack(string authenticationType, IDictionary description) { + Acked.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index b99950d3bc..d81ded334d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -13,12 +13,16 @@ namespace Microsoft.AspNet.PipelineCore.Security throw new ArgumentNullException("authenticationTypes"); } AuthenticationTypes = authenticationTypes; + Acked = new List(); } public IList AuthenticationTypes { get; private set; } + public IList Acked { get; private set; } + public void Ack(string authenticationType, IDictionary description) { + Acked.Add(authenticationType); } } } From 60d892b5290be5c9ddffce2302b5eaeb9969c86e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 31 Mar 2014 11:28:27 -0700 Subject: [PATCH 0089/1838] Revert new project dependnecy. --- .../Security/AuthenticateResult.cs | 1 - .../Security/AuthenticationDescription.cs | 1 - .../Security/AuthenticationProperties.cs | 1 - src/Microsoft.AspNet.Abstractions/project.json | 4 +--- 4 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs index 2584f395fa..2fdc1ae241 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs @@ -3,7 +3,6 @@ using System; using System.Security.Claims; using System.Security.Principal; -using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Abstractions.Security { diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs index de627373a5..3c6f9a7994 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Abstractions.Security { diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs index 9d03d42c92..d38722cec1 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; -using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Abstractions.Security { diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 4b9c817d53..40f2abd874 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -1,8 +1,6 @@ { "version": "0.1-alpha-*", - "dependencies": { - "Microsoft.AspNet.HttpFeature": "" - }, + "dependencies": {}, "configurations": { "net45": {}, "k10": { From 63dc9ad7196260225a6a15790174912cb2463efd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 31 Mar 2014 12:00:55 -0700 Subject: [PATCH 0090/1838] Auth: Remove GetAuthType predicate overload. --- .../Security/AuthenticationManager.cs | 1 - .../Security/DefaultAuthenticationManager.cs | 5 ----- 2 files changed, 6 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs index 36ed704cc9..c72e625ba8 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs @@ -12,7 +12,6 @@ namespace Microsoft.AspNet.Abstractions.Security public abstract HttpContext HttpContext { get; } public abstract IEnumerable GetAuthenticationTypes(); - public abstract IEnumerable GetAuthenticationTypes(Func predicate); public abstract AuthenticationResult Authenticate(string authenticationType); // TODO: Is sync a good idea? public abstract IEnumerable Authenticate(IList authenticationTypes); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs index 4030e67d21..025e7d243b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs @@ -44,11 +44,6 @@ namespace Microsoft.AspNet.PipelineCore.Security } public override IEnumerable GetAuthenticationTypes() - { - return GetAuthenticationTypes(_ => true); - } - - public override IEnumerable GetAuthenticationTypes(Func predicate) { var descriptions = new List(); var handler = HttpAuthentication.Handler; From c638c74bc93676974f09876d4b1581c51e75c47e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Apr 2014 16:03:54 -0700 Subject: [PATCH 0091/1838] Move AuthManager methods to Context and Response. --- .../HttpContext.cs | 20 +- .../HttpResponse.cs | 59 +++++ .../Security/AuthenticationManager.cs | 36 --- .../Security/AuthenticationProperties.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../DefaultHttpContext.cs | 83 ++++++- .../DefaultHttpResponse.cs | 83 ++++++- .../Security/DefaultAuthenticationManager.cs | 233 ------------------ .../Security/SignInContext.cs | 10 +- 9 files changed, 242 insertions(+), 286 deletions(-) delete mode 100644 src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs delete mode 100644 src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 7856d02d99..a933d34660 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Abstractions @@ -11,8 +13,6 @@ namespace Microsoft.AspNet.Abstractions public abstract HttpResponse Response { get; } - public abstract AuthenticationManager Authentication { get; } - public abstract ClaimsPrincipal User { get; set; } public abstract IDictionary Items { get; } @@ -36,5 +36,21 @@ namespace Microsoft.AspNet.Abstractions { SetFeature(typeof(T), instance); } + + public abstract IEnumerable GetAuthenticationTypes(); + + public virtual AuthenticationResult Authenticate(string authenticationType) + { + return Authenticate(new[] { authenticationType }).SingleOrDefault(); + } + + public abstract IEnumerable Authenticate(IList authenticationTypes); + + public virtual async Task AuthenticateAsync(string authenticationType) + { + return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); + } + + public abstract Task> AuthenticateAsync(IList authenticationTypes); } } diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 6f6662e737..bed5e5c8f2 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -1,6 +1,9 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions.Security; namespace Microsoft.AspNet.Abstractions { @@ -23,5 +26,61 @@ namespace Microsoft.AspNet.Abstractions public abstract void Redirect(string location); public abstract Task WriteAsync(string data); + + public virtual void Challenge() + { + Challenge(new string[0]); + } + + public virtual void Challenge(AuthenticationProperties properties) + { + Challenge(new string[0], properties); + } + + public virtual void Challenge(string authenticationType) + { + Challenge(new[] { authenticationType }); + } + + public virtual void Challenge(string authenticationType, AuthenticationProperties properties) + { + Challenge(new[] { authenticationType }, properties); + } + + public virtual void Challenge(IList authenticationTypes) + { + Challenge(authenticationTypes, properties: null); + } + + public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); + + public virtual void SignIn(ClaimsIdentity identity) + { + SignIn(identity, properties: null); + } + + public virtual void SignIn(ClaimsIdentity identity, AuthenticationProperties properties) + { + SignIn(new[] { identity }, properties); + } + + public virtual void SignIn(IList identities) + { + SignIn(identities, properties: null); + } + + public abstract void SignIn(IList identities, AuthenticationProperties properties); + + public virtual void SignOut() + { + SignOut(new string[0]); + } + + public virtual void SignOut(string authenticationType) + { + SignOut(new[] { authenticationType }); + } + + public abstract void SignOut(IList authenticationTypes); } } diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs deleted file mode 100644 index c72e625ba8..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationManager.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using System.Threading.Tasks; - -namespace Microsoft.AspNet.Abstractions.Security -{ - public abstract class AuthenticationManager - { - public abstract HttpContext HttpContext { get; } - - public abstract IEnumerable GetAuthenticationTypes(); - - public abstract AuthenticationResult Authenticate(string authenticationType); // TODO: Is sync a good idea? - public abstract IEnumerable Authenticate(IList authenticationTypes); - - public abstract Task AuthenticateAsync(string authenticationType); - public abstract Task> AuthenticateAsync(IList authenticationTypes); - - public abstract void Challenge(); - public abstract void Challenge(AuthenticationProperties properties); - public abstract void Challenge(string authenticationType); - public abstract void Challenge(string authenticationType, AuthenticationProperties properties); - public abstract void Challenge(IList authenticationTypes); - public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); - - public abstract void SignIn(ClaimsPrincipal user); // TODO: This took multiple identities in Katana. Is that needed? - public abstract void SignIn(ClaimsPrincipal user, AuthenticationProperties properties); // TODO: ClaimsIdentity vs ClaimsPrincipal? - - public abstract void SignOut(); - public abstract void SignOut(string authenticationType); - public abstract void SignOut(IList authenticationTypes); - } -} diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs index d38722cec1..7eb707420b 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Abstractions.Security /// Initializes a new instance of the class /// public AuthenticationProperties() - : this(null) + : this(dictionary: null) { } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index abcfd2e6bd..a19fdaa86b 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -5,7 +5,7 @@ namespace Microsoft.AspNet.HttpFeature.Security { public interface ISignInContext { - ClaimsPrincipal User { get; } + IList Identities { get; } IDictionary Properties { get; } void Ack(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index b4632aabb7..ba2d7688ff 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; @@ -14,11 +16,10 @@ namespace Microsoft.AspNet.PipelineCore { private readonly HttpRequest _request; private readonly HttpResponse _response; - private readonly AuthenticationManager _authentication; private FeatureReference _canHasItems; private FeatureReference _canHasServiceProviders; - private FeatureReference _auth; + private FeatureReference _authentication; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -26,11 +27,10 @@ namespace Microsoft.AspNet.PipelineCore _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _authentication = new DefaultAuthenticationManager(this, features); _canHasItems = FeatureReference.Default; _canHasServiceProviders = FeatureReference.Default; - _auth = FeatureReference.Default; + _authentication = FeatureReference.Default; } ICanHasItems CanHasItems @@ -45,15 +45,13 @@ namespace Microsoft.AspNet.PipelineCore private IHttpAuthentication HttpAuthentication { - get { return _auth.Fetch(_features) ?? _auth.Update(_features, new DefaultHttpAuthentication()); } + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } } public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } - public override AuthenticationManager Authentication { get { return _authentication; } } - public override ClaimsPrincipal User { get { return HttpAuthentication.User; } @@ -95,5 +93,76 @@ namespace Microsoft.AspNet.PipelineCore { _features[type] = instance; } + + // TODO: Use context, not a delegate, like all the other APIs + private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; + + public override IEnumerable GetAuthenticationTypes() + { + // TODO: Use context, not a delegate, like all the other APIs + var descriptions = new List(); + var handler = HttpAuthentication.Handler; + if (handler != null) + { + handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); + } + return descriptions; + } + + private static void GetAuthenticationTypesCallback(IDictionary description, object state) + { + var localDescriptions = (List)state; + localDescriptions.Add(new AuthenticationDescription(description)); + } + + public override IEnumerable Authenticate(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + handler.Authenticate(authenticateContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + + return authenticateContext.Results; + } + + public override async Task> AuthenticateAsync(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var authenticateContext = new AuthenticateContext(authenticationTypes); + await handler.AuthenticateAsync(authenticateContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + + return authenticateContext.Results; + } } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index f1f57ff4a1..ec77460f58 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,14 +1,19 @@ using System; -using System.Globalization; +using System.Collections.Generic; using System.IO; +using System.Linq; +using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.PipelineCore { @@ -18,6 +23,7 @@ namespace Microsoft.AspNet.PipelineCore private readonly IFeatureCollection _features; private FeatureReference _response = FeatureReference.Default; private FeatureReference _canHasCookies = FeatureReference.Default; + private FeatureReference _authentication = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -35,6 +41,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasResponseCookies(_features)); } } + private IHttpAuthentication HttpAuthentication + { + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + } + public override HttpContext HttpContext { get { return _context; } } public override int StatusCode @@ -107,5 +118,75 @@ namespace Microsoft.AspNet.PipelineCore var bytes = Encoding.UTF8.GetBytes(data); return Body.WriteAsync(bytes, 0, bytes.Length); } + + public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + HttpResponseInformation.StatusCode = 401; + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); + handler.Challenge(challengeContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + } + + public override void SignIn(IList identities, AuthenticationProperties properties) + { + if (identities == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); + handler.SignIn(signInContext); + + // Verify all types ack'd + IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + } + + public override void SignOut(IList authenticationTypes) + { + if (authenticationTypes == null) + { + throw new ArgumentNullException(); + } + var handler = HttpAuthentication.Handler; + if (handler == null) + { + throw new InvalidOperationException("No authentication handlers present."); + } + + var signOutContext = new SignOutContext(authenticationTypes); + handler.SignOut(signOutContext); + + // Verify all types ack'd + IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); + if (leftovers.Any()) + { + throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs deleted file mode 100644 index 025e7d243b..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultAuthenticationManager.cs +++ /dev/null @@ -1,233 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Security.Claims; -using System.Security.Principal; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Security; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Infrastructure; - -namespace Microsoft.AspNet.PipelineCore.Security -{ - public class DefaultAuthenticationManager : AuthenticationManager - { - private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; - - private readonly DefaultHttpContext _context; - private readonly IFeatureCollection _features; - - private readonly FeatureReference _authentication = FeatureReference.Default; - private readonly FeatureReference _response = FeatureReference.Default; - - public DefaultAuthenticationManager(DefaultHttpContext context, IFeatureCollection features) - { - _context = context; - _features = features; - } - - private IHttpAuthentication HttpAuthentication - { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } - } - - public override HttpContext HttpContext { get { return _context; } } - - private IHttpResponseInformation HttpResponseInformation - { - get { return _response.Fetch(_features); } - } - - public override IEnumerable GetAuthenticationTypes() - { - var descriptions = new List(); - var handler = HttpAuthentication.Handler; - if (handler != null) - { - handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); - } - return descriptions; - } - - private static void GetAuthenticationTypesCallback(IDictionary description, object state) - { - var localDescriptions = (List)state; - localDescriptions.Add(new AuthenticationDescription(description)); - } - - public override AuthenticationResult Authenticate(string authenticationType) - { - return Authenticate(new[] { authenticationType }).SingleOrDefault(); - } - - public override IEnumerable Authenticate(IList authenticationTypes) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var authenticateContext = new AuthenticateContext(authenticationTypes); - handler.Authenticate(authenticateContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - - return authenticateContext.Results; - } - - public override async Task AuthenticateAsync(string authenticationType) - { - return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); - } - - public override async Task> AuthenticateAsync(IList authenticationTypes) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var authenticateContext = new AuthenticateContext(authenticationTypes); - await handler.AuthenticateAsync(authenticateContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - - return authenticateContext.Results; - } - - public override void Challenge() - { - Challenge(new string[0]); - } - - public override void Challenge(AuthenticationProperties properties) - { - Challenge(new string[0], properties); - } - - public override void Challenge(string authenticationType) - { - Challenge(new[] { authenticationType }); - } - - public override void Challenge(string authenticationType, AuthenticationProperties properties) - { - Challenge(new[] { authenticationType }, properties); - } - - public override void Challenge(IList authenticationTypes) - { - Challenge(authenticationTypes, null); - } - - public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - HttpResponseInformation.StatusCode = 401; - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); - handler.Challenge(challengeContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - } - - public override void SignIn(ClaimsPrincipal user) - { - SignIn(user, null); - } - - public override void SignIn(ClaimsPrincipal user, AuthenticationProperties properties) - { - if (user == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var signInContext = new SignInContext(user, properties == null ? null : properties.Dictionary); - handler.SignIn(signInContext); - - // Verify all types ack'd - IEnumerable leftovers = user.Identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - } - - public override void SignOut() - { - SignOut(new string[0]); - } - - public override void SignOut(string authenticationType) - { - SignOut(new[] { authenticationType }); - } - - public override void SignOut(IList authenticationTypes) - { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } - - var signOutContext = new SignOutContext(authenticationTypes); - handler.SignOut(signOutContext); - - // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); - if (leftovers.Any()) - { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); - } - } - } -} diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 24c16de568..d7669d36e4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -7,18 +7,18 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class SignInContext : ISignInContext { - public SignInContext(ClaimsPrincipal user, IDictionary dictionary) + public SignInContext(IList identities, IDictionary dictionary) { - if (user == null) + if (identities == null) { - throw new ArgumentNullException("user"); + throw new ArgumentNullException("identities"); } - User = user; + Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); Acked = new List(); } - public ClaimsPrincipal User { get; private set; } + public IList Identities { get; private set; } public IDictionary Properties { get; private set; } From dfc0c5d323d8a83397cded64ce00a9427846074f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Apr 2014 16:29:47 -0700 Subject: [PATCH 0092/1838] Change GetAuthType to use a context object instead of a delegate. --- .../Security/IAuthTypeContext.cs | 9 ++++++++ .../Security/IAuthenticationHandler.cs | 6 ++--- .../DefaultHttpContext.cs | 18 +++++---------- .../Security/AuthTypeContext.cs | 22 +++++++++++++++++++ 4 files changed, 38 insertions(+), 17 deletions(-) create mode 100644 src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs new file mode 100644 index 0000000000..634517ad6b --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.HttpFeature.Security +{ + public interface IAuthTypeContext + { + void Ack(IDictionary description); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 66c82fccfc..8a519b5de9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -3,13 +3,11 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.HttpFeature.Security { - public delegate void DescriptionDelegate(IDictionary description, object state); - public interface IAuthenticationHandler { - void GetDescriptions(DescriptionDelegate callback, object state); + void GetDescriptions(IAuthTypeContext context); - void Authenticate(IAuthenticateContext context); // TODO: (maybe?) + void Authenticate(IAuthenticateContext context); Task AuthenticateAsync(IAuthenticateContext context); void Challenge(IChallengeContext context); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index ba2d7688ff..1edb07771c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -94,25 +94,17 @@ namespace Microsoft.AspNet.PipelineCore _features[type] = instance; } - // TODO: Use context, not a delegate, like all the other APIs - private static DescriptionDelegate GetAuthenticationTypesDelegate = GetAuthenticationTypesCallback; - public override IEnumerable GetAuthenticationTypes() { - // TODO: Use context, not a delegate, like all the other APIs - var descriptions = new List(); var handler = HttpAuthentication.Handler; - if (handler != null) + if (handler == null) { - handler.GetDescriptions(GetAuthenticationTypesDelegate, descriptions); + return new AuthenticationDescription[0]; } - return descriptions; - } - private static void GetAuthenticationTypesCallback(IDictionary description, object state) - { - var localDescriptions = (List)state; - localDescriptions.Add(new AuthenticationDescription(description)); + var authTypeContext = new AuthTypeContext(); + handler.GetDescriptions(authTypeContext); + return authTypeContext.Results; } public override IEnumerable Authenticate(IList authenticationTypes) diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs new file mode 100644 index 0000000000..ccf8d40ed0 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.HttpFeature.Security; + +namespace Microsoft.AspNet.PipelineCore.Security +{ + public class AuthTypeContext : IAuthTypeContext + { + public AuthTypeContext() + { + Results = new List(); + } + + public IList Results { get; private set; } + + public void Ack(IDictionary description) + { + Results.Add(new AuthenticationDescription(description)); + } + } +} From ee37c75544d71470ba56add811ebd5c3abe115d1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Apr 2014 17:08:09 -0700 Subject: [PATCH 0093/1838] Rename Auth Context API Ack to Accept --- .../Security/IAuthTypeContext.cs | 2 +- .../{IChallengeContext .cs => IChallengeContext.cs} | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext .cs | 2 +- .../DefaultHttpContext.cs | 8 ++++---- .../DefaultHttpResponse.cs | 12 ++++++------ .../Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 8 ++++---- .../Security/ChallengeContext.cs | 8 ++++---- .../Security/SignInContext.cs | 8 ++++---- .../Security/SignOutContext.cs | 8 ++++---- 11 files changed, 31 insertions(+), 31 deletions(-) rename src/Microsoft.AspNet.HttpFeature/Security/{IChallengeContext .cs => IChallengeContext.cs} (72%) diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index 634517ad6b..e91797ceca 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -4,6 +4,6 @@ namespace Microsoft.AspNet.HttpFeature.Security { public interface IAuthTypeContext { - void Ack(IDictionary description); + void Accept(IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs similarity index 72% rename from src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs rename to src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index 9b80cdd5be..2707c6c63d 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -7,6 +7,6 @@ namespace Microsoft.AspNet.HttpFeature.Security IList AuthenticationTypes {get;} IDictionary Properties {get;} - void Ack(string authenticationType, IDictionary description); + void Accept(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index a19fdaa86b..cb78f661b2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -8,6 +8,6 @@ namespace Microsoft.AspNet.HttpFeature.Security IList Identities { get; } IDictionary Properties { get; } - void Ack(string authenticationType, IDictionary description); + void Accept(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 97df86501c..9a1232ff3a 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -6,6 +6,6 @@ namespace Microsoft.AspNet.HttpFeature.Security { IList AuthenticationTypes { get; } - void Ack(string authenticationType, IDictionary description); + void Accept(string authenticationType, IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 1edb07771c..0525f0cd6c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -123,10 +123,10 @@ namespace Microsoft.AspNet.PipelineCore handler.Authenticate(authenticateContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; @@ -148,10 +148,10 @@ namespace Microsoft.AspNet.PipelineCore await handler.AuthenticateAsync(authenticateContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index ec77460f58..278f16b591 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -136,10 +136,10 @@ namespace Microsoft.AspNet.PipelineCore handler.Challenge(challengeContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(challengeContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(challengeContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } @@ -159,10 +159,10 @@ namespace Microsoft.AspNet.PipelineCore handler.SignIn(signInContext); // Verify all types ack'd - IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Acked); + IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } @@ -182,10 +182,10 @@ namespace Microsoft.AspNet.PipelineCore handler.SignOut(signOutContext); // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(signOutContext.Acked); + IEnumerable leftovers = authenticationTypes.Except(signOutContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types did not ack: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index ccf8d40ed0..f4632607a4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.PipelineCore.Security public IList Results { get; private set; } - public void Ack(IDictionary description) + public void Accept(IDictionary description) { Results.Add(new AuthenticationDescription(description)); } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 15f9be71b3..9fa561372a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -19,25 +19,25 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Results = new List(); - Acked = new List(); + Accepted = new List(); } public IList AuthenticationTypes { get; private set; } public IList Results { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - Acked.Add(descrip.AuthenticationType); + Accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); } public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 991ecb52a0..ed43ee31e2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -17,18 +17,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - Acked = new List(); + Accepted = new List(); } public IList AuthenticationTypes { get; private set; } public IDictionary Properties { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } - public void Ack(string authenticationType, IDictionary description) + public void Accept(string authenticationType, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index d7669d36e4..690388dcc8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -15,18 +15,18 @@ namespace Microsoft.AspNet.PipelineCore.Security } Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); - Acked = new List(); + Accepted = new List(); } public IList Identities { get; private set; } public IDictionary Properties { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } - public void Ack(string authenticationType, IDictionary description) + public void Accept(string authenticationType, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index d81ded334d..2d2814cd02 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -13,16 +13,16 @@ namespace Microsoft.AspNet.PipelineCore.Security throw new ArgumentNullException("authenticationTypes"); } AuthenticationTypes = authenticationTypes; - Acked = new List(); + Accepted = new List(); } public IList AuthenticationTypes { get; private set; } - public IList Acked { get; private set; } + public IList Accepted { get; private set; } - public void Ack(string authenticationType, IDictionary description) + public void Accept(string authenticationType, IDictionary description) { - Acked.Add(authenticationType); + Accepted.Add(authenticationType); } } } From 9f3433acece40a3186df6a5fabe068f911989f97 Mon Sep 17 00:00:00 2001 From: sornaks Date: Tue, 1 Apr 2014 10:46:23 -0700 Subject: [PATCH 0094/1838] WebFX 156 - Introducing RedirectPermanent. Merging RedirectPermanent to Redirect. --- src/Microsoft.AspNet.Abstractions/HttpResponse.cs | 7 ++++++- .../DefaultHttpResponse.cs | 12 ++++++++++-- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index bed5e5c8f2..28814c747b 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -23,7 +23,12 @@ namespace Microsoft.AspNet.Abstractions public abstract void OnSendingHeaders(Action callback, object state); - public abstract void Redirect(string location); + public virtual void Redirect(string location) + { + Redirect(location, permanent: false); + } + + public abstract void Redirect(string location, bool permanent); public abstract Task WriteAsync(string data); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 278f16b591..2a24076c19 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -107,9 +107,17 @@ namespace Microsoft.AspNet.PipelineCore HttpResponseInformation.OnSendingHeaders(callback, state); } - public override void Redirect(string location) + public override void Redirect(string location, bool permanent) { - HttpResponseInformation.StatusCode = 302; + if (permanent) + { + HttpResponseInformation.StatusCode = 301; + } + else + { + HttpResponseInformation.StatusCode = 302; + } + Headers.Set(Constants.Headers.Location, location); } From f4904e18031ef9f23c63a84998a29df530f8beea Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 3 Apr 2014 12:53:34 -0700 Subject: [PATCH 0095/1838] Fixing PathString.Add(PathString) to handle trailing slashes correctly Fixes #31 --- HttpAbstractions.sln | 7 +++ .../PathString.cs | 9 ++++ .../PathStringTests.cs | 51 +++++++++++++++++++ .../project.json | 23 +++++++++ 4 files changed, 90 insertions(+) create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index be895cf892..81c1feee17 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -37,6 +37,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureMod EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests.net45", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.net45.csproj", "{00A03235-B248-4079-A7EE-4F77AB3A84E4}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Tests.net45", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.net45.csproj", "{EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -91,6 +93,10 @@ Global {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Debug|Any CPU.Build.0 = Debug|Any CPU {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.ActiveCfg = Release|Any CPU {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.Build.0 = Release|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -111,5 +117,6 @@ Global {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {4C82EE1A-9B93-4374-91E0-75476AABF5CD} = {04077455-D4A2-43AF-ABA2-E68968856E17} {00A03235-B248-4079-A7EE-4F77AB3A84E4} = {04077455-D4A2-43AF-ABA2-E68968856E17} + {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0} = {04077455-D4A2-43AF-ABA2-E68968856E17} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs index c497d40bf3..07c6de5446 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -127,6 +127,15 @@ namespace Microsoft.AspNet.Abstractions /// The combined PathString value public PathString Add(PathString other) { + if (HasValue && + other.HasValue && + Value[Value.Length - 1] == '/') + { + // If the path string has a trailing slash and the other string has a leading slash, we need + // to trim one of them. + return new PathString(Value + other.Value.Substring(1)); + } + return new PathString(Value + other.Value); } diff --git a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs new file mode 100644 index 0000000000..02ac73736d --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNet.Testing; +using Xunit; + +namespace Microsoft.AspNet.Abstractions +{ + public class PathStringTests + { + [Fact] + public void CtorThrows_IfPathDoesNotHaveLeadingSlash() + { + // Act and Assert + ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", ""); + } + + [Theory] + [InlineData(null, null)] + [InlineData("", null)] + public void AddPathString_HandlesNullAndEmptyStrings(string appString, string concatString) + { + // Arrange + var appPath = new PathString(appString); + var concatPath = new PathString(concatString); + + // Act + var result = appPath.Add(concatPath); + + // Assert + Assert.False(result.HasValue); + } + + [Theory] + [InlineData("", "/", "/")] + [InlineData("/", null, "/")] + [InlineData("/", "", "/")] + [InlineData("/", "/test", "/test")] + [InlineData("/myapp/", "/test/bar", "/myapp/test/bar")] + [InlineData("/myapp/", "/test/bar/", "/myapp/test/bar/")] + public void AddPathString_HandlesLeadingAndTrailingSlashes(string appString, string concatString, string expected) + { + // Arrange + var appPath = new PathString(appString); + var concatPath = new PathString(concatString); + + // Act + var result = appPath.Add(concatPath); + + // Assert + Assert.Equal(expected, result.Value); + } + } +} diff --git a/test/Microsoft.AspNet.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Abstractions.Tests/project.json new file mode 100644 index 0000000000..110d62bb6d --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/project.json @@ -0,0 +1,23 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Testing": "0.1-alpha-*", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Runtime": "", + "Shouldly": "1.1.1.1" + } + } + } +} \ No newline at end of file From 7e7c940c63a681c508167739257e77de725d7140 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 8 Apr 2014 01:10:29 -0700 Subject: [PATCH 0096/1838] Updated to use the new tooling --- HttpAbstractions.sln | 200 +++++++++--------- .../Microsoft.AspNet.Abstractions.kproj | 43 ++++ .../Microsoft.AspNet.AppBuilderSupport.kproj | 30 +++ .../Microsoft.AspNet.FeatureModel.kproj | 30 +++ .../Microsoft.AspNet.HttpFeature.kproj | 41 ++++ .../Microsoft.AspNet.PipelineCore.kproj | 56 +++++ .../Microsoft.AspNet.Abstractions.Tests.kproj | 27 +++ .../Microsoft.AspNet.FeatureModel.Tests.kproj | 30 +++ .../packages.config | 5 - .../Microsoft.AspNet.PipelineCore.Tests.kproj | 31 +++ .../packages.config | 6 - 11 files changed, 392 insertions(+), 107 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj create mode 100644 src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj create mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj create mode 100644 src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj create mode 100644 src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj create mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj delete mode 100644 test/Microsoft.AspNet.FeatureModel.Tests/packages.config create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj delete mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/packages.config diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 81c1feee17..993a99605c 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,122 +1,130 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30313.0 +VisualStudioVersion = 12.0.30327.0 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.net45", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.net45.csproj", "{659F2FD7-D44F-4953-A69D-94AF3D41BA21}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.k10", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.k10.csproj", "{7A5C31E4-97FD-479F-8938-D818436ADFDD}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.net45", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.net45.csproj", "{70095525-BD99-45F9-8A6A-3BD3503FC3EE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.k10", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.k10.csproj", "{D3242B56-EA73-4F41-86A4-DF6C70271592}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.net45", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.net45.csproj", "{8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.HttpFeature.k10", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.k10.csproj", "{3A586BF4-08D4-46E3-B74D-5D514A3B84CC}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.net45", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.net45.csproj", "{A195DDE4-CFB0-4A6C-9798-10658236C97B}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.k10", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.k10.csproj", "{E31CF247-FDA9-4007-B194-A7DBAC18532C}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{ADDAE1B2-094E-4DA8-86DE-13E8708072D8}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{4B39A6DA-68BD-4F50-BE76-0399EB82DCBF}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.AppBuilderSupport.net45", "src\Microsoft.AspNet.AppBuilderSupport\Microsoft.AspNet.AppBuilderSupport.net45.csproj", "{C2E0CB24-159D-422F-B8D1-ACA7353B5C44}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.AppBuilderSupport.Tests.net45", "test\Microsoft.AspNet.AppBuilderSupport.Tests\Microsoft.AspNet.AppBuilderSupport.Tests.net45.csproj", "{9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{04077455-D4A2-43AF-ABA2-E68968856E17}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.FeatureModel.Tests.net45", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.net45.csproj", "{4C82EE1A-9B93-4374-91E0-75476AABF5CD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.PipelineCore.Tests.net45", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.net45.csproj", "{00A03235-B248-4079-A7EE-4F77AB3A84E4}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Abstractions.Tests.net45", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.net45.csproj", "{EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport", "src\Microsoft.AspNet.AppBuilderSupport\Microsoft.AspNet.AppBuilderSupport.kproj", "{65C93D2B-CBD1-4E51-9312-10C1965A7241}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Debug|Any CPU.Build.0 = Debug|Any CPU - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.ActiveCfg = Release|Any CPU - {659F2FD7-D44F-4953-A69D-94AF3D41BA21}.Release|Any CPU.Build.0 = Release|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7A5C31E4-97FD-479F-8938-D818436ADFDD}.Release|Any CPU.Build.0 = Release|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {70095525-BD99-45F9-8A6A-3BD3503FC3EE}.Release|Any CPU.Build.0 = Release|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D3242B56-EA73-4F41-86A4-DF6C70271592}.Release|Any CPU.Build.0 = Release|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE}.Release|Any CPU.Build.0 = Release|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC}.Release|Any CPU.Build.0 = Release|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A195DDE4-CFB0-4A6C-9798-10658236C97B}.Release|Any CPU.Build.0 = Release|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E31CF247-FDA9-4007-B194-A7DBAC18532C}.Release|Any CPU.Build.0 = Release|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44}.Release|Any CPU.Build.0 = Release|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03}.Release|Any CPU.Build.0 = Release|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4C82EE1A-9B93-4374-91E0-75476AABF5CD}.Release|Any CPU.Build.0 = Release|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {00A03235-B248-4079-A7EE-4F77AB3A84E4}.Release|Any CPU.Build.0 = Release|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0}.Release|Any CPU.Build.0 = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.Build.0 = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.Build.0 = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.Build.0 = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.Build.0 = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.Build.0 = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.Build.0 = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.Build.0 = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.Build.0 = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.Build.0 = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Any CPU.ActiveCfg = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.ActiveCfg = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.Build.0 = Debug|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Any CPU.ActiveCfg = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.Build.0 = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.ActiveCfg = Release|x86 + {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.Build.0 = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.Build.0 = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.Build.0 = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.Build.0 = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {659F2FD7-D44F-4953-A69D-94AF3D41BA21} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {7A5C31E4-97FD-479F-8938-D818436ADFDD} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {70095525-BD99-45F9-8A6A-3BD3503FC3EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {D3242B56-EA73-4F41-86A4-DF6C70271592} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {8A6EE89E-8ACC-44C1-8B1E-D2FB4C7189EE} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {3A586BF4-08D4-46E3-B74D-5D514A3B84CC} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {A195DDE4-CFB0-4A6C-9798-10658236C97B} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {E31CF247-FDA9-4007-B194-A7DBAC18532C} = {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} - {ADDAE1B2-094E-4DA8-86DE-13E8708072D8} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {C2E0CB24-159D-422F-B8D1-ACA7353B5C44} = {4B39A6DA-68BD-4F50-BE76-0399EB82DCBF} - {9DF61BB6-65EC-466B-8A86-FA1CE1F1DA03} = {04077455-D4A2-43AF-ABA2-E68968856E17} - {04077455-D4A2-43AF-ABA2-E68968856E17} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {4C82EE1A-9B93-4374-91E0-75476AABF5CD} = {04077455-D4A2-43AF-ABA2-E68968856E17} - {00A03235-B248-4079-A7EE-4F77AB3A84E4} = {04077455-D4A2-43AF-ABA2-E68968856E17} - {EE4DFB8C-FDD8-4A6E-97B7-AE6E663EE5D0} = {04077455-D4A2-43AF-ABA2-E68968856E17} + {BCF0F967-8753-4438-BD07-AADCA9CE509A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj new file mode 100644 index 0000000000..3d0fa73ca4 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -0,0 +1,43 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj new file mode 100644 index 0000000000..3457dc5557 --- /dev/null +++ b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 65c93d2b-cbd1-4e51-9312-10c1965a7241 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj new file mode 100644 index 0000000000..b665f9574f --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 32a4c918-30ee-41db-8e26-8a3bb88ed231 + Library + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj new file mode 100644 index 0000000000..57f6c9414d --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -0,0 +1,41 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + d9128247-8f97-48b8-a863-f1f21a029fce + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj new file mode 100644 index 0000000000..42286a86d5 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -0,0 +1,56 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + bcf0f967-8753-4438-bd07-aadca9ce509a + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj new file mode 100644 index 0000000000..e8a380615a --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj @@ -0,0 +1,27 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + f16692b8-9f38-4dca-a582-e43172b989c6 + Library + net45 + + + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj new file mode 100644 index 0000000000..eb170543e0 --- /dev/null +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + c5d2bae1-e182-48a0-aa74-1af14b782bf7 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/packages.config b/test/Microsoft.AspNet.FeatureModel.Tests/packages.config deleted file mode 100644 index 5500407987..0000000000 --- a/test/Microsoft.AspNet.FeatureModel.Tests/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj new file mode 100644 index 0000000000..efb347f4aa --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -0,0 +1,31 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + aa99af26-f7b1-4a6b-a922-5c25539f6391 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/packages.config b/test/Microsoft.AspNet.PipelineCore.Tests/packages.config deleted file mode 100644 index 2190a4eebc..0000000000 --- a/test/Microsoft.AspNet.PipelineCore.Tests/packages.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file From a8a47a048958430987af01c04f1c12ac1bab482a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 8 Apr 2014 09:25:29 -0700 Subject: [PATCH 0097/1838] Removed all assembly infos. --- .../Microsoft.AspNet.Abstractions.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- .../Microsoft.AspNet.FeatureModel.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- .../Microsoft.AspNet.HttpFeature.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- .../Microsoft.AspNet.PipelineCore.kproj | 1 - .../Properties/AssemblyInfo.cs | 36 ------------------- 8 files changed, 148 deletions(-) delete mode 100644 src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj index 3d0fa73ca4..12a6a518dc 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -32,7 +32,6 @@ - diff --git a/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs deleted file mode 100644 index 906de25b7f..0000000000 --- a/src/Microsoft.AspNet.Abstractions/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Microsoft.AspNet.Abstractions")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("f67dab3e-89ef-4d28-a57e-230af874bbe8")] - -// 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("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index b665f9574f..e0f6a454d3 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -24,7 +24,6 @@ - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs deleted file mode 100644 index 264c8db996..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Microsoft.AspNet.FeatureModel")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("cf678d83-e6f7-4433-9bf2-c0efa68e399b")] - -// 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("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 57f6c9414d..5f8f775ed5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -28,7 +28,6 @@ - diff --git a/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs deleted file mode 100644 index 80a1326d0b..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Microsoft.AspNet.Interfaces")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Interfaces")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("fbcea83c-9fdd-445d-a2d4-93e9062754f3")] - -// 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("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 42286a86d5..51c55b0566 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -44,7 +44,6 @@ - diff --git a/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs deleted file mode 100644 index 05cb3146e3..0000000000 --- a/src/Microsoft.AspNet.PipelineCore/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("Microsoft.AspNet.Abstractions.Implementation")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Abstractions.Implementation")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5886f89f-de4d-4e44-81c2-7a32b2c89cfd")] - -// 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("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] From 8ca4a331e2766efe243993cabbbbca79f6498d17 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Thu, 3 Apr 2014 17:45:05 -0700 Subject: [PATCH 0098/1838] Created an in memory host for testing purposes and added the appropriate APIs to allow sending requests through the pipeline easily. --- Hosting.sln | 24 +- .../RequestInformation.cs | 34 +++ .../ResponseInformation.cs | 29 +++ src/Microsoft.AspNet.TestHost/TestClient.cs | 206 ++++++++++++++++++ src/Microsoft.AspNet.TestHost/TestServer.cs | 109 +++++++++ src/Microsoft.AspNet.TestHost/project.json | 32 +++ .../TestApplicationEnvironment.cs | 29 +++ .../TestClientTests.cs | 153 +++++++++++++ .../TestServerTests.cs | 74 +++++++ .../project.json | 41 ++++ 10 files changed, 726 insertions(+), 5 deletions(-) create mode 100644 src/Microsoft.AspNet.TestHost/RequestInformation.cs create mode 100644 src/Microsoft.AspNet.TestHost/ResponseInformation.cs create mode 100644 src/Microsoft.AspNet.TestHost/TestClient.cs create mode 100644 src/Microsoft.AspNet.TestHost/TestServer.cs create mode 100644 src/Microsoft.AspNet.TestHost/project.json create mode 100644 test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/project.json diff --git a/Hosting.sln b/Hosting.sln index 76c17f7d3e..164d969b42 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +VisualStudioVersion = 12.0.30319.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -27,6 +27,10 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.k10", "samples\ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.net45", "samples\KWebStartup\KWebStartup.net45.csproj", "{B5939234-73ED-4DAD-A2C6-D61AA6DFB406}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.TestHost.Tests.net45", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.net45.csproj", "{A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.TestHost.net45", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.net45.csproj", "{25E1550A-A73F-4E06-9F13-9F72695ADFC8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -61,19 +65,29 @@ Global {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Debug|Any CPU.Build.0 = Debug|Any CPU {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Release|Any CPU.ActiveCfg = Release|Any CPU {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Release|Any CPU.Build.0 = Release|Any CPU + {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Release|Any CPU.Build.0 = Release|Any CPU + {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} = {E0497F39-AFFB-4819-A116-E39E361915AB} - {EB784E77-FD42-46EC-9C8C-502B78962407} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} + {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {EB784E77-FD42-46EC-9C8C-502B78962407} {80588AF3-6B14-4D11-9DC4-1EF6453B54C9} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} {F4C7B46C-B39F-4172-9C3A-05352183D469} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} - {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B} = {EB784E77-FD42-46EC-9C8C-502B78962407} - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {EB784E77-FD42-46EC-9C8C-502B78962407} + {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {EB784E77-FD42-46EC-9C8C-502B78962407} = {E0497F39-AFFB-4819-A116-E39E361915AB} {C0235BA1-9198-42C0-92D8-7578E9B9D96B} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} {B5939234-73ED-4DAD-A2C6-D61AA6DFB406} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} + {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} + {25E1550A-A73F-4E06-9F13-9F72695ADFC8} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.TestHost/RequestInformation.cs b/src/Microsoft.AspNet.TestHost/RequestInformation.cs new file mode 100644 index 0000000000..eabfc0213a --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/RequestInformation.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.TestHost +{ + internal class RequestInformation : IHttpRequestInformation + { + public RequestInformation() + { + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + PathBase = ""; + Body = Stream.Null; + Protocol = "HTTP/1.1"; + } + + public Stream Body { get; set; } + + public IDictionary Headers { get; set; } + + public string Method { get; set; } + + public string Path { get; set; } + + public string PathBase { get; set; } + + public string Protocol { get; set; } + + public string QueryString { get; set; } + + public string Scheme { get; set; } + } +} diff --git a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs new file mode 100644 index 0000000000..7000b081c5 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.TestHost +{ + internal class ResponseInformation : IHttpResponseInformation + { + public ResponseInformation() + { + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Body = new MemoryStream(); + } + + public int StatusCode { get; set; } + + public string ReasonPhrase { get; set; } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + public void OnSendingHeaders(Action callback, object state) + { + // TODO: Figure out how to implement this thing. + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/TestClient.cs b/src/Microsoft.AspNet.TestHost/TestClient.cs new file mode 100644 index 0000000000..e5f5fb6778 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/TestClient.cs @@ -0,0 +1,206 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; + +namespace Microsoft.AspNet.TestHost +{ + public class TestClient + { + private readonly Func _pipeline; + + public TestClient(Func pipeline) + { + _pipeline = pipeline; + } + + public async Task SendAsync(string method, + string url, + IDictionary headers = null, + Stream body = null, + Action onSendingRequest = null) + { + return await SendAsync(method, new Uri(url), headers, body, onSendingRequest); + } + + public async Task SendAsync(string method, + Uri uri, + IDictionary headers = null, + Stream body = null, + Action onSendingRequest = null) + { + var request = CreateRequest(method, uri, headers, body); + var response = new ResponseInformation(); + + var features = new FeatureCollection(); + features.Add(typeof(IHttpRequestInformation), request); + features.Add(typeof(IHttpResponseInformation), response); + var httpContext = new DefaultHttpContext(features); + + if (onSendingRequest != null) + { + onSendingRequest(httpContext.Request); + } + await _pipeline(features); + + response.Body.Seek(0, SeekOrigin.Begin); + return httpContext.Response; + } + + private static IHttpRequestInformation CreateRequest( + string method, + Uri uri, + IDictionary headers, + Stream body) + { + var request = new RequestInformation(); + request.Method = method; + request.Scheme = uri.Scheme; + request.Path = PathString.FromUriComponent(uri).Value; + request.QueryString = QueryString.FromUriComponent(uri).Value; + request.Headers = headers ?? request.Headers; + if (!request.Headers.ContainsKey("Host")) + { + var host = new string[1]; + if (uri.IsDefaultPort) + { + host[0] = uri.Host; + } + else + { + host[0] = uri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); + } + request.Headers["Host"] = host; + } + + if (body != null) + { + EnsureContentLength(request.Headers, body); + request.Body = body; + } + else + { + request.Body = Stream.Null; + } + return request; + } + + public async Task GetAsync(string url) + { + var uri = new Uri(url); + return await GetAsync(uri); + } + + public async Task GetAsync(Uri uri) + { + return await SendAsync("GET", uri); + } + + public async Task GetStringAsync(string url) + { + var uri = new Uri(url); + return await GetStringAsync(uri); + } + + public async Task GetStringAsync(Uri uri) + { + var response = await GetAsync(uri); + return await new StreamReader(response.Body).ReadToEndAsync(); + } + + public async Task GetStreamAsync(string url) + { + var uri = new Uri(url); + return await GetStreamAsync(uri); + } + + public async Task GetStreamAsync(Uri uri) + { + var response = await GetAsync(uri); + return response.Body; + } + + public async Task PostAsync( + string url, + string content, + string contentType, + Action onSendingRequest = null) + { + return await PostAsync(new Uri(url), content, contentType, onSendingRequest); + } + + public async Task PostAsync( + Uri url, + string content, + string contentType, + Action onSendingRequest = null) + { + var bytes = GetBytes(content); + var headers = CreateContentHeaders(contentType, bytes.Length); + var body = new MemoryStream(bytes); + + return await SendAsync("POST", url, headers, body, onSendingRequest); + } + + public async Task PutAsync( + string url, + string content, + string contentType, + Action onSendingRequest = null) + { + return await PutAsync(new Uri(url), content, contentType, onSendingRequest); + } + + public async Task PutAsync( + Uri url, + string content, + string contentType, + Action onSendingRequest = null) + { + var bytes = GetBytes(content); + var headers = CreateContentHeaders(contentType, bytes.Length); + var body = new MemoryStream(bytes); + + return await SendAsync("PUT", url, headers, body, onSendingRequest); + } + + public async Task DeleteAsync(string url) + { + return await DeleteAsync(new Uri(url)); + } + + public async Task DeleteAsync(Uri uri) + { + return await SendAsync("DELETE", uri); + } + + private static void EnsureContentLength(IDictionary dictionary, Stream body) + { + if (!dictionary.ContainsKey("Content-Length")) + { + dictionary["Content-Length"] = new[] { body.Length.ToString(CultureInfo.InvariantCulture) }; + } + } + + private static byte[] GetBytes(string content) + { + var bytes = Encoding.UTF8.GetBytes(content); + return bytes; + } + + private static Dictionary CreateContentHeaders(string contentType, int contentLength) + { + return new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Content-Type", new [] { contentType } }, + { "Content-Length", new [] { contentLength.ToString(CultureInfo.InvariantCulture) } } + }; + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs new file mode 100644 index 0000000000..9256501426 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Runtime.Versioning; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.ConfigurationModel; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Net.Runtime; + +namespace Microsoft.AspNet.TestHost +{ + public class TestServer : IServerFactory, IDisposable + { + private static readonly string ServerName = typeof(TestServer).FullName; + private static readonly ServerInformation ServerInfo = new ServerInformation(); + private Func _appDelegate; + private TestClient _handler; + + public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) + { + var env = serviceProvider.GetService(); + if (env == null) + { + throw new ArgumentException("IApplicationEnvironment couldn't be resolved.", "serviceProvider"); + } + + HostingContext hostContext = new HostingContext() + { + ApplicationName = env.ApplicationName, + Configuration = config, + ServerFactory = this, + Services = serviceProvider, + ApplicationStartup = appStartup + }; + + var engine = serviceProvider.GetService(); + var disposable = engine.Start(hostContext); + } + + public static TestServer Create(IServiceProvider provider) + { + var startupLoader = new StartupLoader(provider, new NullStartupLoader()); + var name = typeof(TStartup).AssemblyQualifiedName; + var diagnosticMessages = new List(); + return Create(provider, startupLoader.LoadStartup(name, diagnosticMessages)); + } + + public static TestServer Create(IServiceProvider provider, Action app) + { + var collection = new ServiceCollection(); + var hostingServices = HostingServices.GetDefaultServices(); + + var config = new Configuration(); + collection.Add(hostingServices); + + var serviceProvider = collection.BuildServiceProvider(provider); + return new TestServer(config, serviceProvider, app); + } + + public TestClient Handler + { + get + { + if (_handler == null) + { + _handler = new TestClient(_appDelegate); + } + + return _handler; + } + } + + public IServerInformation Initialize(IConfiguration configuration) + { + return ServerInfo; + } + + public IDisposable Start(IServerInformation serverInformation, Func application) + { + if (!(serverInformation.GetType() == typeof(ServerInformation))) + { + throw new ArgumentException(string.Format("The server must be {0}", ServerName), "serverInformation"); + } + + _appDelegate = application; + + return this; + } + + public void Dispose() + { + // IServerFactory.Start needs to return an IDisposable. Typically this IDisposable instance is used to + // clear any server resources when tearing down the host. In our case we don't have anything to clear + // so we just implement IDisposable and do nothing. + } + + private class ServerInformation : IServerInformation + { + public string Name + { + get { return TestServer.ServerName; } + } + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json new file mode 100644 index 0000000000..48c00f0871 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -0,0 +1,32 @@ +{ + "version" : "0.1-alpha-*", + "dependencies": { + "System.Reflection": "4.0.10.0", + "System.Runtime" : "4.0.20.0", + "Microsoft.AspNet.Abstractions": "0.1-alpha-*", + "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", + "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", + "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", + "Microsoft.AspNet.Hosting": "0.1-alpha-*", + "Microsoft.AspNet.HttpFeature": "0.1-alpha-*", + "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", + "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.Serialization.Primitives": "4.0.0.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.0.0", + "System.Threading.Thread": "4.0.0.0" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs new file mode 100644 index 0000000000..93fb40c3f5 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -0,0 +1,29 @@ +using System; +using System.Runtime.Versioning; +using Microsoft.Net.Runtime; + +namespace Microsoft.AspNet.TestHost.Tests +{ + public class TestApplicationEnvironment : IApplicationEnvironment + { + public string ApplicationName + { + get { return "Test App environment"; } + } + + public string Version + { + get { return "1.0.0"; } + } + + public string ApplicationBasePath + { + get { return Environment.CurrentDirectory; } + } + + public FrameworkName TargetFramework + { + get { return new FrameworkName(".NETFramework", new Version(4, 5)); } + } + } +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs new file mode 100644 index 0000000000..b18dd0ccfa --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -0,0 +1,153 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Runtime.Versioning; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.Net.Runtime; +using Xunit; + +namespace Microsoft.AspNet.TestHost.Tests +{ + public class TestClientTests + { + private readonly IServiceProvider _services; + private readonly TestServer _server; + + public TestClientTests() + { + _services = new ServiceCollection() + .AddSingleton() + .BuildServiceProvider(); + + _server = TestServer.Create(_services, app => app.Run(async ctx => { })); + } + + [Fact] + public async Task SendAsync_ConfiguresRequestProperly() + { + // Arrange + var client = _server.Handler; + + // Act + var response = await client.SendAsync("GET", "http://localhost:12345/Home/Index?id=3&name=peter#fragment"); + var request = response.HttpContext.Request; + + // Assert + Assert.NotNull(request); + Assert.Equal("HTTP/1.1", request.Protocol); + Assert.Equal("GET", request.Method); + Assert.Equal("http", request.Scheme); + Assert.Equal("localhost:12345", request.Host.Value); + Assert.Equal("", request.PathBase.Value); + Assert.True(request.Path.HasValue); + Assert.Equal("/Home/Index", request.Path.Value); + Assert.Equal("?id=3&name=peter", request.QueryString.Value); + Assert.Null(request.ContentLength); + Assert.Equal(1, request.Headers.Count); + Assert.True(request.Headers.ContainsKey("Host")); + } + + [Fact] + public async Task SendAsync_InvokesCallbackWhenPassed() + { + // Arrange + var client = _server.Handler; + var invoked = false; + + // Act + var response = await client.SendAsync("GET", "http://localhost:12345/", null, null, _ => invoked = true); + + // Assert + Assert.True(invoked); + } + + [Fact] + public async Task SendAsync_RespectsExistingHost() + { + // Arrange + var client = _server.Handler; + var headers = new Dictionary { { "Host", new string[] { "server:12345" } } }; + + // Act + var response = await client.SendAsync("GET", "http://localhost:12345/Home/", headers); + var request = response.HttpContext.Request; + + // Assert + Assert.Equal("server:12345", request.Host.Value); + } + + [Fact] + public async Task SendAsync_RespectsArgumentBody() + { + // Arrange + var client = _server.Handler; + var headers = new Dictionary { { "Content-Type", new string[] { "text/plain" } } }; + var body = new MemoryStream(); + new StreamWriter(body).Write("Hello world"); + body.Position = 0; + + // Act + var response = await client.SendAsync("POST", "http://host/", headers, body); + var request = response.HttpContext.Request; + + // Assert + Assert.Same(body, request.Body); + Assert.Equal(0, request.Body.Position); + Assert.Equal(body.Length, request.ContentLength); + } + + [Fact] + public async Task SendAsync_RewindsTheResponseStream() + { + // Arrange + var server = TestServer.Create(_services, app => app.Run(ctx => ctx.Response.WriteAsync("Hello world"))); + var client = server.Handler; + + // Act + var response = await client.SendAsync("GET", "http://localhost"); + + // Assert + Assert.Equal(0, response.Body.Position); + Assert.Equal("Hello world", new StreamReader(response.Body).ReadToEnd()); + } + + [Fact] + public async Task PutAsyncWorks() + { + // Arrange + RequestDelegate appDelegate = async ctx => + await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd()); + var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var client = server.Handler; + + // Act + var response = await client.PutAsync("http://localhost:12345", "Hello world", "text/plain"); + var request = response.HttpContext.Request; + + // Assert + Assert.Equal("PUT", request.Method); + Assert.Equal("Hello world", new StreamReader(response.Body).ReadToEnd()); + } + + [Fact] + public async Task PostAsyncWorks() + { + // Arrange + RequestDelegate appDelegate = async ctx => + await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd()); + var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var client = server.Handler; + + // Act + var response = await client.PostAsync("http://localhost:12345", "Hello world", "text/plain"); + var request = response.HttpContext.Request; + + // Assert + Assert.Equal("POST", request.Method); + Assert.Equal("Hello world", new StreamReader(response.Body).ReadToEnd()); + } + } +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs new file mode 100644 index 0000000000..62416f99f1 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -0,0 +1,74 @@ +using System; +using System.IO; +using System.Runtime.Versioning; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.Net.Runtime; +using Xunit; + +namespace Microsoft.AspNet.TestHost.Tests +{ + public class TestServerTests + { + [Fact] + public void CreateWithDelegate() + { + // Arrange + var services = new ServiceCollection() + .AddSingleton() + .BuildServiceProvider(); + + // Act & Assert + Assert.DoesNotThrow(() => TestServer.Create(services, app => { })); + } + + [Fact] + public async Task CreateWithGeneric() + { + // Arrange + var services = new ServiceCollection() + .AddSingleton() + .BuildServiceProvider(); + + var server = TestServer.Create(services); + var client = server.Handler; + + // Act + var response = await client.GetAsync("http://any"); + + // Assert + Assert.Equal("Startup", new StreamReader(response.Body).ReadToEnd()); + } + + [Fact] + public void ThrowsIfNoApplicationEnvironmentIsRegisteredWithTheProvider() + { + // Arrange + var services = new ServiceCollection() + .BuildServiceProvider(); + + // Act & Assert + Assert.Throws( + "serviceProvider", + () => TestServer.Create(services)); + } + + public class Startup + { + public void Configuration(IBuilder builder) + { + builder.Run(ctx => ctx.Response.WriteAsync("Startup")); + } + } + + public class AnotherStartup + { + public void Configuration(IBuilder builder) + { + builder.Run(ctx => ctx.Response.WriteAsync("Another Startup")); + } + } + } +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json new file mode 100644 index 0000000000..34ba146fef --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -0,0 +1,41 @@ +{ + "version" : "0.1-alpha-*", + "dependencies": { + "System.Reflection": "4.0.10.0", + "System.Runtime" : "4.0.20.0", + "Microsoft.AspNet.Abstractions": "0.1-alpha-*", + "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", + "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", + "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", + "Microsoft.AspNet.Hosting": "", + "Microsoft.AspNet.TestHost": "", + "Microsoft.AspNet.HttpFeature": "0.1-alpha-*", + "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", + "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.Serialization.Primitives": "4.0.0.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.0.0", + "System.Threading.Thread": "4.0.0.0" + } + } + } +} \ No newline at end of file From 73a00a1b21106a5fcdded1982bf3d89aa7e1f742 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Wed, 9 Apr 2014 14:00:06 -0700 Subject: [PATCH 0099/1838] Bumped the version of System.Threading.Tasks to 4.0.10.0 to fix the build break --- test/Microsoft.AspNet.TestHost.Tests/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 34ba146fef..3b30a0aed7 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -33,7 +33,7 @@ "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.Serialization.Primitives": "4.0.0.0", "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0", "System.Threading.Thread": "4.0.0.0" } } From 89e532873e463ce7531af659427cac14378bd19d Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Wed, 9 Apr 2014 14:05:01 -0700 Subject: [PATCH 0100/1838] Bumped the version of System.Threading.Tasks to 4.0.10.0 to fix the build break in the remaining project.json --- src/Microsoft.AspNet.TestHost/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 48c00f0871..0028a68196 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -24,7 +24,7 @@ "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.Serialization.Primitives": "4.0.0.0", "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0", "System.Threading.Thread": "4.0.0.0" } } From e3c64aeb55893effd104c88b1ced3e80f8711c9f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 9 Apr 2014 22:08:21 -0700 Subject: [PATCH 0101/1838] Updated to use the new tooling --- Hosting.sln | 141 ++++++++++-------- samples/KWebStartup/KWebStartup.kproj | 26 ++++ samples/KWebStartup/project.json | 2 +- .../Microsoft.AspNet.Hosting.kproj | 49 ++++++ .../Microsoft.AspNet.RequestContainer.kproj | 27 ++++ .../Microsoft.AspNet.TestHost.kproj | 29 ++++ src/Microsoft.AspNet.TestHost/project.json | 14 +- .../Microsoft.AspNet.Hosting.Tests.kproj | 31 ++++ .../project.json | 3 - .../Microsoft.AspNet.TestHost.Tests.kproj | 29 ++++ .../project.json | 19 +-- 11 files changed, 273 insertions(+), 97 deletions(-) create mode 100644 samples/KWebStartup/KWebStartup.kproj create mode 100644 src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj create mode 100644 src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj create mode 100644 src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj create mode 100644 test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj diff --git a/Hosting.sln b/Hosting.sln index 164d969b42..afb4be9861 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,93 +1,106 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30319.0 +VisualStudioVersion = 12.0.30327.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{FEB39027-9158-4DE2-997F-7ADAEF8188D0}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.net45", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.net45.csproj", "{D546290B-E280-4D99-BA9C-0D364A0AFB54}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.k10", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.k10.csproj", "{DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.Hosting.Tests.net45", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.net45.csproj", "{80588AF3-6B14-4D11-9DC4-1EF6453B54C9}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C30C98CD-3D69-4AE9-B680-0E0E6D8834C6}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.RequestContainer.net45", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.net45.csproj", "{F4C7B46C-B39F-4172-9C3A-05352183D469}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost.Tests", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.kproj", "{0ACB2719-9484-49B5-B8E3-117091192511}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.RequestContainer.k10", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.k10.csproj", "{FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.kproj", "{1A415A3F-1081-45DB-809B-EE19CEA02DC0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "net45", "net45", "{93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.kproj", "{3944F036-7E75-47E8-AA52-C4B89A64EC3A}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "k10", "k10", "{EB784E77-FD42-46EC-9C8C-502B78962407}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Tests", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.kproj", "{D4F18D58-52B1-435D-A012-10F2CDF158C4}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.k10", "samples\KWebStartup\KWebStartup.k10.csproj", "{C0235BA1-9198-42C0-92D8-7578E9B9D96B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.RequestContainer", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.kproj", "{374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "KWebStartup.net45", "samples\KWebStartup\KWebStartup.net45.csproj", "{B5939234-73ED-4DAD-A2C6-D61AA6DFB406}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.TestHost.Tests.net45", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.net45.csproj", "{A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNet.TestHost.net45", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.net45.csproj", "{25E1550A-A73F-4E06-9F13-9F72695ADFC8}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "KWebStartup", "samples\KWebStartup\KWebStartup.kproj", "{A2F321A5-3F55-4413-B357-EEF85DC0ECA6}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D546290B-E280-4D99-BA9C-0D364A0AFB54}.Release|Any CPU.Build.0 = Release|Any CPU - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91}.Release|Any CPU.Build.0 = Release|Any CPU - {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Debug|Any CPU.Build.0 = Debug|Any CPU - {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.ActiveCfg = Release|Any CPU - {80588AF3-6B14-4D11-9DC4-1EF6453B54C9}.Release|Any CPU.Build.0 = Release|Any CPU - {F4C7B46C-B39F-4172-9C3A-05352183D469}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {F4C7B46C-B39F-4172-9C3A-05352183D469}.Debug|Any CPU.Build.0 = Debug|Any CPU - {F4C7B46C-B39F-4172-9C3A-05352183D469}.Release|Any CPU.ActiveCfg = Release|Any CPU - {F4C7B46C-B39F-4172-9C3A-05352183D469}.Release|Any CPU.Build.0 = Release|Any CPU - {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B}.Release|Any CPU.Build.0 = Release|Any CPU - {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C0235BA1-9198-42C0-92D8-7578E9B9D96B}.Release|Any CPU.Build.0 = Release|Any CPU - {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B5939234-73ED-4DAD-A2C6-D61AA6DFB406}.Release|Any CPU.Build.0 = Release|Any CPU - {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145}.Release|Any CPU.Build.0 = Release|Any CPU - {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {25E1550A-A73F-4E06-9F13-9F72695ADFC8}.Release|Any CPU.Build.0 = Release|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.ActiveCfg = Debug|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|x86.ActiveCfg = Debug|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|x86.Build.0 = Debug|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Any CPU.ActiveCfg = Release|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Mixed Platforms.Build.0 = Release|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.ActiveCfg = Release|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.Build.0 = Release|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.ActiveCfg = Debug|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|x86.ActiveCfg = Debug|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|x86.Build.0 = Debug|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Any CPU.ActiveCfg = Release|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Mixed Platforms.Build.0 = Release|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.ActiveCfg = Release|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.Build.0 = Release|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|x86.ActiveCfg = Debug|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|x86.Build.0 = Debug|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Any CPU.ActiveCfg = Release|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Mixed Platforms.Build.0 = Release|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.ActiveCfg = Release|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.Build.0 = Release|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|x86.ActiveCfg = Debug|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|x86.Build.0 = Debug|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Any CPU.ActiveCfg = Release|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.Build.0 = Release|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.ActiveCfg = Release|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.Build.0 = Release|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.ActiveCfg = Debug|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.ActiveCfg = Debug|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.Build.0 = Debug|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Any CPU.ActiveCfg = Release|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.Build.0 = Release|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.Build.0 = Release|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.ActiveCfg = Debug|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.Build.0 = Debug|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Any CPU.ActiveCfg = Release|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.Build.0 = Release|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|x86.ActiveCfg = Release|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution - {D546290B-E280-4D99-BA9C-0D364A0AFB54} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} - {DBB72F0F-755D-41CF-8FE2-F4B6AE214E91} = {EB784E77-FD42-46EC-9C8C-502B78962407} - {80588AF3-6B14-4D11-9DC4-1EF6453B54C9} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} - {F4C7B46C-B39F-4172-9C3A-05352183D469} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} - {FD9833B9-3FB1-4612-BBB4-64F539DB0F8B} = {EB784E77-FD42-46EC-9C8C-502B78962407} - {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} = {E0497F39-AFFB-4819-A116-E39E361915AB} - {EB784E77-FD42-46EC-9C8C-502B78962407} = {E0497F39-AFFB-4819-A116-E39E361915AB} - {C0235BA1-9198-42C0-92D8-7578E9B9D96B} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} - {B5939234-73ED-4DAD-A2C6-D61AA6DFB406} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} - {A19DBFCE-7B43-4BC6-9C3B-A47EBB65E145} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} - {25E1550A-A73F-4E06-9F13-9F72695ADFC8} = {93FB86DB-7D2A-46CE-AFD2-0B53E6A8CF69} + {0ACB2719-9484-49B5-B8E3-117091192511} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} + {1A415A3F-1081-45DB-809B-EE19CEA02DC0} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {3944F036-7E75-47E8-AA52-C4B89A64EC3A} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} EndGlobalSection EndGlobal diff --git a/samples/KWebStartup/KWebStartup.kproj b/samples/KWebStartup/KWebStartup.kproj new file mode 100644 index 0000000000..0250b93f66 --- /dev/null +++ b/samples/KWebStartup/KWebStartup.kproj @@ -0,0 +1,26 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + a2f321a5-3f55-4413-b357-eef85dc0eca6 + Library + + + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 9b3ca4f7cf..e7414d56e5 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Abstractions": "0.1-alpha-*", - "Microsoft.AspNet.Hosting": "0.1-alpha-*", + "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" }, "commands": { "web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj new file mode 100644 index 0000000000..537d74ac2b --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -0,0 +1,49 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 3944f036-7e75-47e8-aa52-c4b89a64ec3a + Library + + + + + + + 2.0 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj new file mode 100644 index 0000000000..13fc912c56 --- /dev/null +++ b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj @@ -0,0 +1,27 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 374a5b0c-3e93-4a23-a4a0-ee2ab6df7814 + Library + + + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj new file mode 100644 index 0000000000..b0b2425081 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -0,0 +1,29 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 1a415a3f-1081-45db-809b-ee19cea02dc0 + Library + + + + + + + 2.0 + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 0028a68196..96182c3ed0 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,19 +1,11 @@ { "version" : "0.1-alpha-*", "dependencies": { - "System.Reflection": "4.0.10.0", - "System.Runtime" : "4.0.20.0", - "Microsoft.AspNet.Abstractions": "0.1-alpha-*", - "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", - "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", - "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", - "Microsoft.AspNet.Hosting": "0.1-alpha-*", - "Microsoft.AspNet.HttpFeature": "0.1-alpha-*", - "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*" + "Microsoft.AspNet.Hosting": "" }, "configurations": { - "net45": { + "net45": { }, + "k10" : { "dependencies": { "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj new file mode 100644 index 0000000000..48a9989141 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -0,0 +1,31 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + d4f18d58-52b1-435d-a012-10f2cdf158c4 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index b99c5d336f..31f45a0967 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,9 +2,6 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", - "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", - "Microsoft.AspNet.Abstractions":"0.1-alpha-*", - "Microsoft.AspNet.DependencyInjection":"0.1-alpha-*", "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj new file mode 100644 index 0000000000..4deca87e2d --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -0,0 +1,29 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 0acb2719-9484-49b5-b8e3-117091192511 + Library + net45 + + + + + + + 2.0 + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 3b30a0aed7..458aa6f103 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -3,15 +3,8 @@ "dependencies": { "System.Reflection": "4.0.10.0", "System.Runtime" : "4.0.20.0", - "Microsoft.AspNet.Abstractions": "0.1-alpha-*", - "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", - "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", - "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.TestHost": "", - "Microsoft.AspNet.HttpFeature": "0.1-alpha-*", - "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", @@ -24,17 +17,7 @@ "configurations": { "net45": { "dependencies": { - "System.Collections": "4.0.0.0", - "System.ComponentModel": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.Serialization.Primitives": "4.0.0.0", - "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0", - "System.Threading.Thread": "4.0.0.0" + "System.Runtime": "" } } } From 0bda88145d98adb1ab89504c8a4526d97caff0b5 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 9 Apr 2014 22:14:59 -0700 Subject: [PATCH 0102/1838] Removed declared ANIs and referenced Microsoft.Net.Runtime.Interfaces instead --- .../AssemblyNeutralAttribute.cs | 10 ---------- .../IApplicationEnvironment.cs | 14 -------------- .../Microsoft.AspNet.Hosting.kproj | 2 -- src/Microsoft.AspNet.Hosting/project.json | 3 ++- 4 files changed, 2 insertions(+), 27 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs delete mode 100644 src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs deleted file mode 100644 index 2191d5198d..0000000000 --- a/src/Microsoft.AspNet.Hosting/AssemblyNeutralAttribute.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System; - -namespace Microsoft.Net.Runtime -{ - [AssemblyNeutral] - [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] - public sealed class AssemblyNeutralAttribute : Attribute - { - } -} diff --git a/src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs b/src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs deleted file mode 100644 index 1c772bc835..0000000000 --- a/src/Microsoft.AspNet.Hosting/IApplicationEnvironment.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System; -using System.Runtime.Versioning; - -namespace Microsoft.Net.Runtime -{ - [AssemblyNeutral] - public interface IApplicationEnvironment - { - string ApplicationName { get; } - string Version { get; } - string ApplicationBasePath { get; } - FrameworkName TargetFramework { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index 537d74ac2b..de22702e86 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -20,7 +20,6 @@ - @@ -28,7 +27,6 @@ - diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index be245644fd..5181a9bdac 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,7 +6,8 @@ "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", "Microsoft.AspNet.Abstractions": "0.1-alpha-*", "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", - "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*" + "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", + "Microsoft.Net.Runtime.Interfaces": "0.1-alpha-*" }, "configurations": { "net45": {}, From 165effebde94870d581eb0803bcd326b3ae596a0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 11 Apr 2014 10:52:45 -0700 Subject: [PATCH 0103/1838] Abstractions: Pull in k10 dependency for IdnMapping. --- .../HostString.cs | 194 ------------------ .../project.json | 1 + 2 files changed, 1 insertion(+), 194 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Abstractions/HostString.cs index f127eddaad..0847c7421e 100644 --- a/src/Microsoft.AspNet.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Abstractions/HostString.cs @@ -193,199 +193,5 @@ namespace Microsoft.AspNet.Abstractions { return !left.Equals(right); } - -#if K10 - internal class IdnMapping - { - // - // Summary: - // Encodes a string of domain name labels that consist of Unicode characters - // to a string of displayable Unicode characters in the US-ASCII character range. - // The string is formatted according to the IDNA standard. - // - // Parameters: - // unicode: - // The string to convert, which consists of one or more domain name labels delimited - // with label separators. - // - // Returns: - // The equivalent of the string specified by the unicode parameter, consisting - // of displayable Unicode characters in the US-ASCII character range (U+0020 - // to U+007E) and formatted according to the IDNA standard. - // - // Exceptions: - // System.ArgumentNullException: - // unicode is null. - // - // System.ArgumentException: - // unicode is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetAscii(string unicode) { throw new NotImplementedException(); } - - // - // Summary: - // Encodes a substring of domain name labels that include Unicode characters - // outside the US-ASCII character range. The substring is converted to a string - // of displayable Unicode characters in the US-ASCII character range and is - // formatted according to the IDNA standard. - // - // Parameters: - // unicode: - // The string to convert, which consists of one or more domain name labels delimited - // with label separators. - // - // index: - // A zero-based offset into unicode that specifies the start of the substring - // to convert. The conversion operation continues to the end of the unicode - // string. - // - // Returns: - // The equivalent of the substring specified by the unicode and index parameters, - // consisting of displayable Unicode characters in the US-ASCII character range - // (U+0020 to U+007E) and formatted according to the IDNA standard. - // - // Exceptions: - // System.ArgumentNullException: - // unicode is null. - // - // System.ArgumentOutOfRangeException: - // index is less than zero.-or-index is greater than the length of unicode. - // - // System.ArgumentException: - // unicode is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetAscii(string unicode, int index) { throw new NotImplementedException(); } - - // - // Summary: - // Encodes the specified number of characters in a substring of domain name - // labels that include Unicode characters outside the US-ASCII character range. - // The substring is converted to a string of displayable Unicode characters - // in the US-ASCII character range and is formatted according to the IDNA standard. - // - // Parameters: - // unicode: - // The string to convert, which consists of one or more domain name labels delimited - // with label separators. - // - // index: - // A zero-based offset into unicode that specifies the start of the substring. - // - // count: - // The number of characters to convert in the substring that starts at the position - // specified by index in the unicode string. - // - // Returns: - // The equivalent of the substring specified by the unicode, index, and count - // parameters, consisting of displayable Unicode characters in the US-ASCII - // character range (U+0020 to U+007E) and formatted according to the IDNA standard. - // - // Exceptions: - // System.ArgumentNullException: - // unicode is null. - // - // System.ArgumentOutOfRangeException: - // index or count is less than zero.-or-index is greater than the length of - // unicode.-or-index is greater than the length of unicode minus count. - // - // System.ArgumentException: - // unicode is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetAscii(string unicode, int index, int count) { throw new NotImplementedException(); } - - // - // Summary: - // Decodes a string of one or more domain name labels, encoded according to - // the IDNA standard, to a string of Unicode characters. - // - // Parameters: - // ascii: - // The string to decode, which consists of one or more labels in the US-ASCII - // character range (U+0020 to U+007E) encoded according to the IDNA standard. - // - // Returns: - // The Unicode equivalent of the IDNA substring specified by the ascii parameter. - // - // Exceptions: - // System.ArgumentNullException: - // ascii is null. - // - // System.ArgumentException: - // ascii is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetUnicode(string ascii) { throw new NotImplementedException(); } - - // - // Summary: - // Decodes a substring of one or more domain name labels, encoded according - // to the IDNA standard, to a string of Unicode characters. - // - // Parameters: - // ascii: - // The string to decode, which consists of one or more labels in the US-ASCII - // character range (U+0020 to U+007E) encoded according to the IDNA standard. - // - // index: - // A zero-based offset into ascii that specifies the start of the substring - // to decode. The decoding operation continues to the end of the ascii string. - // - // Returns: - // The Unicode equivalent of the IDNA substring specified by the ascii and index - // parameters. - // - // Exceptions: - // System.ArgumentNullException: - // ascii is null. - // - // System.ArgumentOutOfRangeException: - // index is less than zero.-or-index is greater than the length of ascii. - // - // System.ArgumentException: - // ascii is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetUnicode(string ascii, int index) { throw new NotImplementedException(); } - - // - // Summary: - // Decodes a substring of a specified length that contains one or more domain - // name labels, encoded according to the IDNA standard, to a string of Unicode - // characters. - // - // Parameters: - // ascii: - // The string to decode, which consists of one or more labels in the US-ASCII - // character range (U+0020 to U+007E) encoded according to the IDNA standard. - // - // index: - // A zero-based offset into ascii that specifies the start of the substring. - // - // count: - // The number of characters to convert in the substring that starts at the position - // specified by index in the ascii string. - // - // Returns: - // The Unicode equivalent of the IDNA substring specified by the ascii, index, - // and count parameters. - // - // Exceptions: - // System.ArgumentNullException: - // ascii is null. - // - // System.ArgumentOutOfRangeException: - // index or count is less than zero.-or-index is greater than the length of - // ascii.-or-index is greater than the length of ascii minus count. - // - // System.ArgumentException: - // ascii is invalid based on the System.Globalization.IdnMapping.AllowUnassigned - // and System.Globalization.IdnMapping.UseStd3AsciiRules properties, and the - // IDNA standard. - public string GetUnicode(string ascii, int index, int count) { throw new NotImplementedException(); } - } -#endif } } diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Abstractions/project.json index 40f2abd874..f626e3463a 100644 --- a/src/Microsoft.AspNet.Abstractions/project.json +++ b/src/Microsoft.AspNet.Abstractions/project.json @@ -9,6 +9,7 @@ "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", + "System.Globalization.Extensions": "4.0.0.0", "System.IO": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", From a20f65627fa3e4d6ab22e5380a6b80d70fced971 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 12 Apr 2014 12:39:30 -0700 Subject: [PATCH 0104/1838] Removing unused Owin packages that are causing build failure --- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 4 ---- 1 file changed, 4 deletions(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index efafaacca3..896deb8c1b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -19,10 +19,6 @@ "net45": { "dependencies": { "System.Runtime": "", - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", "Moq": "4.2.1312.1622", "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" From c31e0f295fd318b3c66546ffcdc053c822038cb4 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 12 Apr 2014 12:39:30 -0700 Subject: [PATCH 0105/1838] Removing unused Owin packages that are causing build failure * Adding Microsoft.AspNet.AppBuildSupport.Tests to sln --- HttpAbstractions.sln | 17 +++++++++-- .../Microsoft.AspNet.AppBuilderSupport.kproj | 3 ++ ...osoft.AspNet.AppBuilderSupport.Tests.kproj | 30 +++++++++++++++++++ .../project.json | 1 - .../project.json | 1 - 5 files changed, 48 insertions(+), 4 deletions(-) create mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 993a99605c..287f3868d2 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30327.0 +VisualStudioVersion = 12.0.30410.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -23,6 +23,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport.Tests", "test\Microsoft.AspNet.AppBuilderSupport.Tests\Microsoft.AspNet.AppBuilderSupport.Tests.kproj", "{83D44696-C790-4356-9187-79F89010ED4F}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -113,6 +115,16 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Any CPU.ActiveCfg = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.ActiveCfg = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.Build.0 = Debug|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|Any CPU.ActiveCfg = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.Build.0 = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.ActiveCfg = Release|x86 + {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -123,8 +135,9 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {83D44696-C790-4356-9187-79F89010ED4F} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj index 3457dc5557..ad85762a01 100644 --- a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj +++ b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj @@ -26,5 +26,8 @@ + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj b/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj new file mode 100644 index 0000000000..3c166c3380 --- /dev/null +++ b/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj @@ -0,0 +1,30 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 83d44696-c790-4356-9187-79f89010ed4f + Library + + + + + + + 2.0 + + + + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json index e092fca527..a0a22125e6 100644 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json +++ b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json @@ -23,7 +23,6 @@ "Microsoft.Owin.Hosting": "2.1.0", "Microsoft.Owin.Testing": "2.1.0", "Shouldly": "1.1.1.1", - "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 896deb8c1b..8ac9b6c2fa 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -20,7 +20,6 @@ "dependencies": { "System.Runtime": "", "Moq": "4.2.1312.1622", - "Microsoft.Net.Http": "2.2.13", "System.Net.Http": "" } } From f12117fe1fdaaa22a2f9f9806b5a9b3955d1c49e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 15 Apr 2014 11:28:42 -0700 Subject: [PATCH 0106/1838] Remove temp IAppBuilder support. --- HttpAbstractions.sln | 15 +- .../AppBuilderSupportExtensions.cs | 40 -- .../ICanHasOwinEnvironment.cs | 9 - .../Microsoft.AspNet.AppBuilderSupport.kproj | 33 -- .../OwinConstants.cs | 175 --------- .../OwinHttpEnvironment.cs | 364 ------------------ .../project.json | 16 - .../AppBuilderSupportTests.cs | 43 --- ...osoft.AspNet.AppBuilderSupport.Tests.kproj | 30 -- .../OwinHttpEnvironmentTests.cs | 50 --- .../project.json | 30 -- 11 files changed, 1 insertion(+), 804 deletions(-) delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs delete mode 100644 src/Microsoft.AspNet.AppBuilderSupport/project.json delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs delete mode 100644 test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 287f3868d2..4629030603 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30410.0 +VisualStudioVersion = 12.0.30401.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -17,8 +17,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport", "src\Microsoft.AspNet.AppBuilderSupport\Microsoft.AspNet.AppBuilderSupport.kproj", "{65C93D2B-CBD1-4E51-9312-10C1965A7241}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" @@ -85,16 +83,6 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Any CPU.ActiveCfg = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.ActiveCfg = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Debug|x86.Build.0 = Debug|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Any CPU.ActiveCfg = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|Mixed Platforms.Build.0 = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.ActiveCfg = Release|x86 - {65C93D2B-CBD1-4E51-9312-10C1965A7241}.Release|x86.Build.0 = Release|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 @@ -135,7 +123,6 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {65C93D2B-CBD1-4E51-9312-10C1965A7241} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {83D44696-C790-4356-9187-79F89010ED4F} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} diff --git a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs b/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs deleted file mode 100644 index 215afb8bcf..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/AppBuilderSupportExtensions.cs +++ /dev/null @@ -1,40 +0,0 @@ -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.PipelineCore; -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.PipelineCore.Owin; - -namespace Owin -{ - using AppFunc = Func, Task>; - - public static class AppBuilderSupportExtensions - { - public static IAppBuilder UseBuilder(this IAppBuilder appBuilder, Action configuration) - { - IBuilder builder = new Builder(null); - configuration(builder); - Func middleware1 = next1 => { - Func middleware2 = next2 => { - return httpContext => { - return next1(httpContext.GetFeature().Environment); - }; - }; - builder.Use(middleware2); - var app = builder.Build(); - return env => - { - return app.Invoke( - new DefaultHttpContext( - new FeatureCollection( - new OwinHttpEnvironment(env)))); - }; - }; - return appBuilder.Use(middleware1); - } - } -} diff --git a/src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs deleted file mode 100644 index 37632116bd..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/ICanHasOwinEnvironment.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Microsoft.AspNet.PipelineCore.Owin -{ - public interface ICanHasOwinEnvironment - { - IDictionary Environment { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj b/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj deleted file mode 100644 index ad85762a01..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/Microsoft.AspNet.AppBuilderSupport.kproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - 12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 65c93d2b-cbd1-4e51-9312-10c1965a7241 - Library - net45 - - - - - - - 2.0 - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs deleted file mode 100644 index 45aabf2913..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinConstants.cs +++ /dev/null @@ -1,175 +0,0 @@ -namespace Microsoft.AspNet.PipelineCore.Owin -{ - internal static class OwinConstants - { - #region OWIN v1.0.0 - 3.2.1. Request Data - - // http://owin.org/spec/owin-1.0.0.html - - public const string RequestScheme = "owin.RequestScheme"; - public const string RequestMethod = "owin.RequestMethod"; - public const string RequestPathBase = "owin.RequestPathBase"; - public const string RequestPath = "owin.RequestPath"; - public const string RequestQueryString = "owin.RequestQueryString"; - public const string RequestProtocol = "owin.RequestProtocol"; - public const string RequestHeaders = "owin.RequestHeaders"; - public const string RequestBody = "owin.RequestBody"; - - #endregion - - #region OWIN v1.0.0 - 3.2.2. Response Data - - // http://owin.org/spec/owin-1.0.0.html - - public const string ResponseStatusCode = "owin.ResponseStatusCode"; - public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; - public const string ResponseProtocol = "owin.ResponseProtocol"; - public const string ResponseHeaders = "owin.ResponseHeaders"; - public const string ResponseBody = "owin.ResponseBody"; - - #endregion - - #region OWIN v1.0.0 - 3.2.3. Other Data - - // http://owin.org/spec/owin-1.0.0.html - - public const string CallCancelled = "owin.CallCancelled"; - - public const string OwinVersion = "owin.Version"; - - #endregion - - #region OWIN Keys for IAppBuilder.Properties - - internal static class Builder - { - public const string AddSignatureConversion = "builder.AddSignatureConversion"; - public const string DefaultApp = "builder.DefaultApp"; - } - - #endregion - - #region OWIN Key Guidelines and Common Keys - 6. Common keys - - // http://owin.org/spec/CommonKeys.html - - internal static class CommonKeys - { - public const string ClientCertificate = "ssl.ClientCertificate"; - public const string LoadClientCertAsync = "ssl.LoadClientCertAsync"; - public const string RemoteIpAddress = "server.RemoteIpAddress"; - public const string RemotePort = "server.RemotePort"; - public const string LocalIpAddress = "server.LocalIpAddress"; - public const string LocalPort = "server.LocalPort"; - public const string IsLocal = "server.IsLocal"; - public const string TraceOutput = "host.TraceOutput"; - public const string Addresses = "host.Addresses"; - public const string AppName = "host.AppName"; - public const string Capabilities = "server.Capabilities"; - public const string OnSendingHeaders = "server.OnSendingHeaders"; - public const string OnAppDisposing = "host.OnAppDisposing"; - public const string Scheme = "scheme"; - public const string Host = "host"; - public const string Port = "port"; - public const string Path = "path"; - } - - #endregion - - #region SendFiles v0.3.0 - - // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm - - internal static class SendFiles - { - // 3.1. Startup - - public const string Version = "sendfile.Version"; - public const string Support = "sendfile.Support"; - public const string Concurrency = "sendfile.Concurrency"; - - // 3.2. Per Request - - public const string SendAsync = "sendfile.SendAsync"; - } - - #endregion - - #region Opaque v0.3.0 - - // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm - - internal static class OpaqueConstants - { - // 3.1. Startup - - public const string Version = "opaque.Version"; - - // 3.2. Per Request - - public const string Upgrade = "opaque.Upgrade"; - - // 5. Consumption - - public const string Stream = "opaque.Stream"; - // public const string Version = "opaque.Version"; // redundant, declared above - public const string CallCancelled = "opaque.CallCancelled"; - } - - #endregion - - #region WebSocket v0.4.0 - - // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm - - internal static class WebSocket - { - // 3.1. Startup - - public const string Version = "websocket.Version"; - - // 3.2. Per Request - - public const string Accept = "websocket.Accept"; - - // 4. Accept - - public const string SubProtocol = "websocket.SubProtocol"; - - // 5. Consumption - - public const string SendAsync = "websocket.SendAsync"; - public const string ReceiveAsync = "websocket.ReceiveAsync"; - public const string CloseAsync = "websocket.CloseAsync"; - // public const string Version = "websocket.Version"; // redundant, declared above - public const string CallCancelled = "websocket.CallCancelled"; - public const string ClientCloseStatus = "websocket.ClientCloseStatus"; - public const string ClientCloseDescription = "websocket.ClientCloseDescription"; - } - - #endregion - - #region Security v0.1.0 - - // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm - - internal static class Security - { - // 3.2. Per Request - - public const string User = "server.User"; - - public const string Authenticate = "security.Authenticate"; - - // 3.3. Response - - public const string SignIn = "security.SignIn"; - - public const string SignOut = "security.SignOut"; - - public const string Challenge = "security.Challenge"; - } - - #endregion - } -} diff --git a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs b/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs deleted file mode 100644 index 02be7db4a5..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/OwinHttpEnvironment.cs +++ /dev/null @@ -1,364 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Net; -using System.Reflection; -#if NET45 -using System.Security.Cryptography.X509Certificates; -#endif -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.FeatureModel; - -namespace Microsoft.AspNet.PipelineCore.Owin -{ - using SendFileFunc = Func; - - public class OwinHttpEnvironment : - IFeatureCollection, - IHttpRequestInformation, - IHttpResponseInformation, - IHttpConnection, - IHttpSendFile, - IHttpTransportLayerSecurity, - ICanHasOwinEnvironment - { - public IDictionary Environment { get; set; } - - public OwinHttpEnvironment(IDictionary environment) - { - Environment = environment; - } - - T Prop(string key) - { - object value; - if (Environment.TryGetValue(key, out value) && value is T) - { - return (T)value; - } - return default(T); - } - - void Prop(string key, object value) - { - Environment[key] = value; - } - - string IHttpRequestInformation.Protocol - { - get { return Prop("owin.RequestProtocol"); } - set { Prop("owin.RequestProtocol", value); } - } - - string IHttpRequestInformation.Scheme - { - get { return Prop("owin.RequestScheme"); } - set { Prop("owin.RequestScheme", value); } - } - - string IHttpRequestInformation.Method - { - get { return Prop("owin.RequestMethod"); } - set { Prop("owin.RequestMethod", value); } - } - - string IHttpRequestInformation.PathBase - { - get { return Prop("owin.RequestPathBase"); } - set { Prop("owin.RequestPathBase", value); } - } - - string IHttpRequestInformation.Path - { - get { return Prop("owin.RequestPath"); } - set { Prop("owin.RequestPath", value); } - } - - string IHttpRequestInformation.QueryString - { - get { return Prop("owin.RequestQueryString"); } - set { Prop("owin.RequestQueryString", value); } - } - - IDictionary IHttpRequestInformation.Headers - { - get { return Prop>("owin.RequestHeaders"); } - set { Prop("owin.RequestHeaders", value); } - } - - Stream IHttpRequestInformation.Body - { - get { return Prop("owin.RequestBody"); } - set { Prop("owin.RequestBody", value); } - } - - int IHttpResponseInformation.StatusCode - { - get { return Prop("owin.ResponseStatusCode"); } - set { Prop("owin.ResponseStatusCode", value); } - } - - string IHttpResponseInformation.ReasonPhrase - { - get { return Prop("owin.ResponseReasonPhrase"); } - set { Prop("owin.ResponseReasonPhrase", value); } - } - - IDictionary IHttpResponseInformation.Headers - { - get { return Prop>("owin.ResponseHeaders"); } - set { Prop("owin.ResponseHeaders", value); } - } - - Stream IHttpResponseInformation.Body - { - get { return Prop("owin.ResponseBody"); } - set { Prop("owin.ResponseBody", value); } - } - - void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) - { - // TODO: - } -#if NET45 - IPAddress IHttpConnection.RemoteIpAddress - { - get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } - set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } - } - - IPAddress IHttpConnection.LocalIpAddress - { - get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } - set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } - } -#endif - int IHttpConnection.RemotePort - { - get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } - set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } - } - - int IHttpConnection.LocalPort - { - get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } - set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } - } - - bool IHttpConnection.IsLocal - { - get { return Prop(OwinConstants.CommonKeys.IsLocal); } - set { Prop(OwinConstants.CommonKeys.LocalPort, value); } - } - - private bool SupportsSendFile - { - get - { - object obj; - return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null; - } - } - - Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) - { - object obj; - if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) - { - var func = (SendFileFunc)obj; - return func(path, offset, length, cancellation); - } - throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); - } - - private bool SupportsClientCerts - { - get - { - object obj; - if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) - && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) - || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) - && obj != null) - { - return true; - } - return false; - } - } -#if NET45 - X509Certificate IHttpTransportLayerSecurity.ClientCertificate - { - get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } - set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } - } -#endif - Task IHttpTransportLayerSecurity.LoadAsync() - { - throw new NotImplementedException(); - } - - public int Revision - { - get { return 0; } // Not modifiable - } - - public void Add(Type key, object value) - { - throw new NotSupportedException(); - } - - public bool ContainsKey(Type key) - { - // Does this type implement the requested interface? - if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) - { - // Check for conditional features - if (key == typeof(IHttpSendFile)) - { - return SupportsSendFile; - } - else if (key == typeof(IHttpTransportLayerSecurity)) - { - return SupportsClientCerts; - } - - // The rest of the features are always supported. - return true; - } - return false; - } - - public ICollection Keys - { - get - { - var keys = new List() - { - typeof(IHttpRequestInformation), - typeof(IHttpResponseInformation), - typeof(IHttpConnection), - typeof(ICanHasOwinEnvironment), - }; - if (SupportsSendFile) - { - keys.Add(typeof(IHttpSendFile)); - } - if (SupportsClientCerts) - { - keys.Add(typeof(IHttpTransportLayerSecurity)); - } - return keys; - } - } - - public bool Remove(Type key) - { - throw new NotSupportedException(); - } - - public bool TryGetValue(Type key, out object value) - { - if (ContainsKey(key)) - { - value = this; - return true; - } - value = null; - return false; - } - - public ICollection Values - { - get { throw new NotSupportedException(); } - } - - public object this[Type key] - { - get - { - object value; - if (TryGetValue(key, out value)) - { - return value; - } - throw new KeyNotFoundException(key.FullName); - } - set - { - throw new NotSupportedException(); - } - } - - public void Add(KeyValuePair item) - { - throw new NotSupportedException(); - } - - public void Clear() - { - throw new NotSupportedException(); - } - - public bool Contains(KeyValuePair item) - { - object result; - return TryGetValue(item.Key, out result) && result.Equals(item.Value); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - if (array == null) - { - throw new ArgumentNullException("array"); - } - if (arrayIndex < 0 || arrayIndex > array.Length) - { - throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); - } - var keys = Keys; - if (keys.Count > array.Length - arrayIndex) - { - throw new ArgumentException(); - } - - foreach (var key in keys) - { - array[arrayIndex++] = new KeyValuePair(key, this[key]); - } - } - - public int Count - { - get { return Keys.Count; } - } - - public bool IsReadOnly - { - get { return true; } - } - - public bool Remove(KeyValuePair item) - { - throw new NotSupportedException(); - } - - public IEnumerator> GetEnumerator() - { - return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); - } - - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Dispose() - { - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.AppBuilderSupport/project.json b/src/Microsoft.AspNet.AppBuilderSupport/project.json deleted file mode 100644 index c597c1a29a..0000000000 --- a/src/Microsoft.AspNet.AppBuilderSupport/project.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "version": "0.1-alpha-*", - "dependencies": { - "Microsoft.AspNet.Abstractions": "0.1-alpha-*", - "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", - "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.HttpFeature" : "" - }, - "configurations": { - "net45": { - "dependencies": { - "Owin": "1.0" - } - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs b/test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs deleted file mode 100644 index 4b2c70872d..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/AppBuilderSupportTests.cs +++ /dev/null @@ -1,43 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Net; -using System.Runtime.Remoting.Contexts; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Owin; -using Xunit; - -namespace Microsoft.AspNet.AppBuilderSupport.Tests -{ - public class AppBuilderSupportTests - { - [Fact] - public async Task BuildCanGoInsideAppBuilder() - { - var server = Microsoft.Owin.Testing.TestServer.Create( - app => app.UseBuilder(HelloWorld)); - - var result = await server.CreateRequest("/hello").GetAsync(); - var body = await result.Content.ReadAsStringAsync(); - - Assert.Equal(result.StatusCode, HttpStatusCode.Accepted); - Assert.Equal(body, "Hello world!"); - } - - private void HelloWorld(IBuilder builder) - { - builder.Use(next => async context => - { - await next(context); - }); - builder.Run(async context => - { - context.Response.StatusCode = 202; - await context.Response.WriteAsync("Hello world!"); - }); - } - } -} diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj b/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj deleted file mode 100644 index 3c166c3380..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/Microsoft.AspNet.AppBuilderSupport.Tests.kproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - 12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 83d44696-c790-4356-9187-79f89010ed4f - Library - - - - - - - 2.0 - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs b/test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs deleted file mode 100644 index 5b639a6a0c..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/OwinHttpEnvironmentTests.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Owin; -using Xunit; - -namespace Microsoft.AspNet.AppBuilderSupport.Tests -{ - public class OwinHttpEnvironmentTests - { - private T Get(IFeatureCollection features) - { - object value; - return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); - } - - [Fact] - public void OwinHttpEnvironmentCanBeCreated() - { - var env = new Dictionary - { - {"owin.RequestMethod", "POST"} - }; - var features = new FeatureObject( new OwinHttpEnvironment(env)); - - Assert.Equal(Get(features).Method, "POST"); - } - - [Fact] - public void ImplementedInterfacesAreEnumerated() - { - var env = new Dictionary - { - {"owin.RequestMethod", "POST"} - }; - var features = new FeatureObject(new OwinHttpEnvironment(env)); - - var entries = features.ToArray(); - var keys = features.Keys.ToArray(); - var values = features.Values.ToArray(); - - Assert.Contains(typeof(IHttpRequestInformation), keys); - Assert.Contains(typeof(IHttpResponseInformation), keys); - } - } -} diff --git a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json b/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json deleted file mode 100644 index a0a22125e6..0000000000 --- a/test/Microsoft.AspNet.AppBuilderSupport.Tests/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "version": "0.1-alpha-*", - "dependencies": { - "Microsoft.AspNet.AppBuilderSupport": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", - "Microsoft.AspNet.FeatureModel": "", - "Xunit.KRunner": "0.1-alpha-*", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "configurations": { - "net45": { - "dependencies": { - "System.Runtime": "", - "Owin": "1.0", - "Microsoft.Owin": "2.1.0", - "Microsoft.Owin.Hosting": "2.1.0", - "Microsoft.Owin.Testing": "2.1.0", - "Shouldly": "1.1.1.1", - "System.Net.Http": "" - } - } - } -} \ No newline at end of file From e99576a4294731986a61fdcd2d2b9ccbe3903d44 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 00:12:41 -0700 Subject: [PATCH 0107/1838] Added callback overload to UseContainer - Allows caller to pass a delegate to configure add services via the ServiceCollection. --- .../ContainerExtensions.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 05b56f92cd..346eb28680 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -35,9 +35,14 @@ namespace Microsoft.AspNet.RequestContainer } public static IBuilder UseContainer(this IBuilder builder, IEnumerable applicationServices) + { + return builder.UseContainer(services => services.Add(applicationServices)); + } + + public static IBuilder UseContainer(this IBuilder builder, Action configureServices) { var serviceCollection = new ServiceCollection(); - serviceCollection.Add(applicationServices); + configureServices(serviceCollection); builder.ServiceProvider = serviceCollection.BuildServiceProvider(builder.ServiceProvider); return builder.UseMiddleware(typeof(ContainerMiddleware)); From 10ee3c20e340dc5075132be408e484053c55af13 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 20:27:18 -0700 Subject: [PATCH 0108/1838] Rename UseContainer to UseServices --- .../Microsoft.AspNet.Hosting.kproj | 3 +++ .../ContainerExtensions.cs | 10 +++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index de22702e86..e09cae4005 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -43,5 +43,8 @@ + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 346eb28680..9ae44867e1 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -22,24 +22,24 @@ namespace Microsoft.AspNet.RequestContainer }); } - public static IBuilder UseContainer(this IBuilder builder) + public static IBuilder UseServices(this IBuilder builder) { return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IBuilder UseContainer(this IBuilder builder, IServiceProvider applicationServices) + public static IBuilder UseServices(this IBuilder builder, IServiceProvider applicationServices) { builder.ServiceProvider = applicationServices; return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IBuilder UseContainer(this IBuilder builder, IEnumerable applicationServices) + public static IBuilder UseServices(this IBuilder builder, IEnumerable applicationServices) { - return builder.UseContainer(services => services.Add(applicationServices)); + return builder.UseServices(services => services.Add(applicationServices)); } - public static IBuilder UseContainer(this IBuilder builder, Action configureServices) + public static IBuilder UseServices(this IBuilder builder, Action configureServices) { var serviceCollection = new ServiceCollection(); configureServices(serviceCollection); From 11080a5d0699a002222c6d073be3a3bafc3abcb4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 20:31:11 -0700 Subject: [PATCH 0109/1838] Removed Properties folder --- src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index e09cae4005..de22702e86 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -43,8 +43,5 @@ - - - \ No newline at end of file From 3b69e024a23c214803d44983a10f3ac207f0924e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 21:54:55 -0700 Subject: [PATCH 0110/1838] Updated solution --- HttpAbstractions.sln | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 4629030603..83fd260c8c 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30401.0 +VisualStudioVersion = 12.0.30327.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -21,8 +21,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.AppBuilderSupport.Tests", "test\Microsoft.AspNet.AppBuilderSupport.Tests\Microsoft.AspNet.AppBuilderSupport.Tests.kproj", "{83D44696-C790-4356-9187-79F89010ED4F}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -103,16 +101,6 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Any CPU.ActiveCfg = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.ActiveCfg = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Debug|x86.Build.0 = Debug|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|Any CPU.ActiveCfg = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|Mixed Platforms.Build.0 = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.ActiveCfg = Release|x86 - {83D44696-C790-4356-9187-79F89010ED4F}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -125,6 +113,5 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {83D44696-C790-4356-9187-79F89010ED4F} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal From 03b089abe02add9860174f239e0d40adfa8d7c69 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 22:08:47 -0700 Subject: [PATCH 0111/1838] Renamed Builder.ServiceProvider to Builder.ApplicationServices - Made things consistent with HttpContext.ApplicationServices --- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 2 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index ce79cc7251..d187c75ec2 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -4,7 +4,7 @@ namespace Microsoft.AspNet.Abstractions { public interface IBuilder { - IServiceProvider ServiceProvider { get; set; } + IServiceProvider ApplicationServices { get; set; } IServerInformation Server { get; set; } IBuilder Use(Func middleware); diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 9c9da66547..e5e4696118 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -11,16 +11,16 @@ namespace Microsoft.AspNet.PipelineCore public Builder(IServiceProvider serviceProvider) { - ServiceProvider = serviceProvider; + ApplicationServices = serviceProvider; } private Builder(Builder builder) { - ServiceProvider = builder.ServiceProvider; + ApplicationServices = builder.ApplicationServices; Server = builder.Server; } - public IServiceProvider ServiceProvider { get; set; } + public IServiceProvider ApplicationServices { get; set; } public IServerInformation Server { get; set; } public IBuilder Use(Func middleware) From 252f17e5e2e69b621fd07735e6953ae73443ee3a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 17 Apr 2014 22:16:04 -0700 Subject: [PATCH 0112/1838] Adjusting due to API changes --- .../ContainerExtensions.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 9ae44867e1..1047a44c07 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -15,8 +15,8 @@ namespace Microsoft.AspNet.RequestContainer // TODO: move this ext method someplace nice return builder.Use(next => { - var typeActivator = builder.ServiceProvider.GetService(); - var instance = typeActivator.CreateInstance(builder.ServiceProvider, middleware, new[] { next }.Concat(args).ToArray()); + var typeActivator = builder.ApplicationServices.GetService(); + var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetTypeInfo().GetDeclaredMethod("Invoke"); return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); }); @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.RequestContainer public static IBuilder UseServices(this IBuilder builder, IServiceProvider applicationServices) { - builder.ServiceProvider = applicationServices; + builder.ApplicationServices = applicationServices; return builder.UseMiddleware(typeof(ContainerMiddleware)); } @@ -43,7 +43,7 @@ namespace Microsoft.AspNet.RequestContainer { var serviceCollection = new ServiceCollection(); configureServices(serviceCollection); - builder.ServiceProvider = serviceCollection.BuildServiceProvider(builder.ServiceProvider); + builder.ApplicationServices = serviceCollection.BuildServiceProvider(builder.ApplicationServices); return builder.UseMiddleware(typeof(ContainerMiddleware)); } From bba57874bceb6fa2d3eaea33448fc4475f0939cd Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 18 Apr 2014 00:13:10 -0700 Subject: [PATCH 0113/1838] Put UseServices extension method in Microsoft.AspNet --- src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 1047a44c07..8648d8b220 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -5,8 +5,9 @@ using System.Linq; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.AspNet.RequestContainer; -namespace Microsoft.AspNet.RequestContainer +namespace Microsoft.AspNet { public static class ContainerExtensions { From 28fbacc7f4a64fdfe765fce6b43f06b7262cfd9c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Apr 2014 09:17:37 -0700 Subject: [PATCH 0114/1838] Remove #if NET45s for IPAddress, X509Certificate. --- src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs | 4 ---- .../IHttpTransportLayerSecurity.cs | 5 +---- src/Microsoft.AspNet.HttpFeature/project.json | 2 ++ 3 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index 9af5df12e8..3598c015f1 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,15 +1,11 @@ -#if NET45 using System.Net; -#endif namespace Microsoft.AspNet.HttpFeature { public interface IHttpConnection { -#if NET45 IPAddress RemoteIpAddress { get; set; } IPAddress LocalIpAddress { get; set; } -#endif int RemotePort { get; set; } int LocalPort { get; set; } bool IsLocal { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index 7a27df9b6c..fd08f2b076 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,15 +1,12 @@ -#if NET45 + using System.Security.Cryptography.X509Certificates; -#endif using System.Threading.Tasks; namespace Microsoft.AspNet.HttpFeature { public interface IHttpTransportLayerSecurity { -#if NET45 X509Certificate ClientCertificate { get; set; } -#endif Task LoadAsync(); } } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 35f7cd2425..7060443fce 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -5,9 +5,11 @@ "k10": { "dependencies": { "System.IO": "4.0.0.0", + "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", "System.Security.Claims": "0.1-alpha-*", + "System.Security.Cryptography.X509Certificates": "4.0.0.0", "System.Security.Principal": "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } From e3afbae213be0f211c0562ec2e2fd1e7eed1d91e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 19 Apr 2014 02:27:17 -0700 Subject: [PATCH 0115/1838] Remove the converter logic --- .../FeatureCollection.cs | 6 +- .../FeatureObject.cs | 15 - .../Implementation/Converter.cs | 388 ------------------ .../Microsoft.AspNet.FeatureModel.kproj | 1 - 4 files changed, 1 insertion(+), 409 deletions(-) delete mode 100644 src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index d3aaff33cf..00d2a38e4f 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Threading; -using Microsoft.AspNet.FeatureModel.Implementation; namespace Microsoft.AspNet.FeatureModel { @@ -49,11 +48,8 @@ namespace Microsoft.AspNet.FeatureModel { return feature; } -#if NET45 - return Converter.Convert(type, actualType, feature); -#else + return null; -#endif } } diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 42d2bf8e79..d937d09dc5 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Linq; -using Microsoft.AspNet.FeatureModel.Implementation; namespace Microsoft.AspNet.FeatureModel { @@ -32,20 +31,6 @@ namespace Microsoft.AspNet.FeatureModel return _instance; } -#if NET45 - foreach (var interfaceType in _instance.GetType().GetInterfaces()) - { - if (interfaceType.FullName == type.FullName) - { - return Converter.Convert(interfaceType, type, _instance); - } - } -#else - if (_instance != null && type == _instance.GetType()) - { - return _instance; - } -#endif return null; } diff --git a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs b/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs deleted file mode 100644 index 0102dea38a..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Implementation/Converter.cs +++ /dev/null @@ -1,388 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -#if NET45 -using System.Reflection.Emit; -#endif -using System.Runtime.CompilerServices; - -namespace Microsoft.AspNet.FeatureModel.Implementation -{ - #if NET45 - public abstract class NonGenericProxyBase - { - public readonly Type WrappedType; - protected NonGenericProxyBase(Type wrappedType) - { - this.WrappedType = wrappedType; - } - public abstract object UnderlyingInstanceAsObject - { - get; - } - } - - public class BaseType : NonGenericProxyBase where T : class - { - protected T instance; - public BaseType(T inst) - : base(typeof(T)) - { - if (inst == null) throw new InvalidOperationException("should never construct proxy over null"); - this.instance = inst; - } - public T UnderlyingInstance - { - get - { - return instance; - } - } - public override object UnderlyingInstanceAsObject - { - get - { - return instance; - } - } - } - - public class Converter - { - public static object Convert(Type outputType, Type inputType, object input) - { - if (inputType == outputType) return input; - - if (!inputType.IsInterface || !outputType.IsInterface) throw new InvalidOperationException("Both types must be interfaces"); - - if (inputType.GetInterfaces().Contains(outputType)) return input; - - if (input == null) return null; - - Type t = EnsureConverter(outputType, inputType); - - return Activator.CreateInstance(t, input); - } - - public static TOut Convert(Type inputType, object input) - where TOut : class - { - return (TOut)Convert(typeof (TOut), inputType, input); - } - - public static TOut Convert(TIn input) - where TIn : class - where TOut : class - { - return Convert(typeof(TIn), input); - } - - public static TOut Convert(object input) - where TOut : class - { - if (input == null) return null; - var interfaceName = typeof(TOut).FullName; - foreach (var inputType in input.GetType().GetInterfaces()) - { - if (inputType.FullName == interfaceName) - { - return Convert(inputType, input); - } - } - return null; - } - - - public static Type EnsureConverter(Type tout, Type tin) - { - CacheResult result; - if (!ConverterTypeCache.TryGetValue(new Tuple(tin, tout), out result)) - { - EnsureCastPossible(tout, tin); - return EnsureConverter(tout, tin); - } - else - { - if (result is ErrorResult) - { - throw new InvalidCastException((result as ErrorResult).error); - } - else if (result is CurrentlyVerifyingResult) - { - throw new InvalidOperationException("Type cannot be obtained in verification phase"); - } - else if (result is TypeBuilderResult) - { - return (result as TypeBuilderResult).result; - } - else if (result is VerificationSucceededResult) - { - return CreateWrapperType(tout, tin, result as VerificationSucceededResult); - } - else - { - throw new InvalidOperationException("Invalid cache state"); - } - } - } - - class CacheResult - { - } - - class TypeBuilderResult : CacheResult - { - internal TypeBuilderResult(Type result) - { - this.result = result; - } - internal readonly Type result; - } - class ErrorResult : CacheResult - { - internal ErrorResult(string error) - { - this.error = error; - } - internal readonly string error; - } - class CurrentlyVerifyingResult : CacheResult - { - } - enum SuccessKind - { - Identity, - SubInterface, - Wrapper, - } - class VerificationSucceededResult : CacheResult - { - internal VerificationSucceededResult(SuccessKind kind) - { - this.kind = kind; - } - internal VerificationSucceededResult(Dictionary mappings) - { - this.kind = SuccessKind.Wrapper; - this.methodMappings = mappings; - } - internal readonly SuccessKind kind; - internal readonly Dictionary methodMappings; - } - - static Dictionary, CacheResult> ConverterTypeCache = new Dictionary, CacheResult>(); - static ConditionalWeakTable ConverterInstanceCache = new ConditionalWeakTable(); - static AssemblyBuilder ab = AssemblyBuilder.DefineDynamicAssembly(new AssemblyName("ProxyHolderAssembly"), AssemblyBuilderAccess.Run); - static ModuleBuilder modb = ab.DefineDynamicModule("Main Module"); - - class EqComparer : IEqualityComparer - { - - bool IEqualityComparer.Equals(ParameterInfo x, ParameterInfo y) - { - return EqualTypes(x.ParameterType, y.ParameterType); - } - - int IEqualityComparer.GetHashCode(ParameterInfo obj) - { - return obj.GetHashCode(); - } - } - - static bool EqualTypes(Type sourceType, Type targetType) - { - return EnsureCastPossible(targetType, sourceType); - } - - - - static MethodInfo FindCorrespondingMethod(Type targetType, Type sourceType, MethodInfo miTarget) - { - MethodInfo[] sms = sourceType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance).Where((MethodInfo mi) => mi.Name == miTarget.Name).ToArray(); - if (sms != null && sms.Length != 0) - { - MethodInfo[] sm = null; - try - { - sm = sms.Where((mi) => (mi.GetParameters().SequenceEqual(miTarget.GetParameters(), new EqComparer()))).ToArray(); - } - catch - { - } - if (sm != null && sm.Length != 0) - { - if (sm.Length > 1) return null; - if (EqualTypes(sm[0].ReturnType, miTarget.ReturnType)) - { - return sm[0]; - } - } - } - MethodInfo[] rval = sourceType.GetInterfaces().Select((inheritedItf) => FindCorrespondingMethod(targetType, inheritedItf, miTarget)).ToArray(); - if (rval == null || rval.Length == 0) return null; - if (rval.Length > 1) return null; - return rval[0]; - - } - - - static void AddMethod(Type targetType, Type sourceType, TypeBuilder tb, MethodInfo miTarget, MethodInfo miSource) - { - ParameterInfo[] pisTarget = miTarget.GetParameters(); - ParameterInfo[] pisSource = miSource.GetParameters(); - MethodBuilder metb; - Type[] typesTarget; - if (pisTarget == null || pisTarget.Length == 0) - { - metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null); - pisTarget = new ParameterInfo[0]; - typesTarget = new Type[0]; - } - else - { - typesTarget = pisTarget.Select((pi) => pi.ParameterType).ToArray(); - Type[][] requiredCustomMods = pisTarget.Select((pi) => pi.GetRequiredCustomModifiers()).ToArray(); - Type[][] optionalCustomMods = pisTarget.Select((pi) => pi.GetOptionalCustomModifiers()).ToArray(); - - metb = tb.DefineMethod(miTarget.Name, MethodAttributes.Virtual, CallingConventions.HasThis, miTarget.ReturnType, null, null, typesTarget, requiredCustomMods, optionalCustomMods); - } - - ILGenerator il = metb.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldfld, tb.BaseType.GetField("instance", BindingFlags.NonPublic | BindingFlags.Instance)); - for (int pi = 0; pi < pisTarget.Length; pi++) - { - il.Emit(OpCodes.Ldarg, pi + 1); - EmitParamConversion(il, typesTarget[pi], pisSource[pi].ParameterType); - } - il.EmitCall(OpCodes.Callvirt, miSource, null); - - EmitParamConversion(il, miSource.ReturnType, miTarget.ReturnType); - il.Emit(OpCodes.Ret); - - tb.DefineMethodOverride(metb, miTarget); - } - - static void EmitParamConversion(ILGenerator il, Type typeOnStack, Type typeRequiredInSignature) - { - if (typeOnStack != typeRequiredInSignature) - { - if (typeOnStack.GetInterfaces().Contains(typeRequiredInSignature)) - { - il.Emit(OpCodes.Castclass, typeRequiredInSignature); - } - else - { - Label lEnd = il.DefineLabel(); - Label lCreateProxy = il.DefineLabel(); - il.Emit(OpCodes.Dup); // o o - il.Emit(OpCodes.Brfalse_S, lEnd); // o - il.Emit(OpCodes.Dup); // o o - il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // o [p/n] - il.Emit(OpCodes.Brfalse_S, lCreateProxy); // o - il.Emit(OpCodes.Isinst, typeof(NonGenericProxyBase)); // p - il.EmitCall(OpCodes.Callvirt, typeof(NonGenericProxyBase).GetMethod("get_UnderlyingInstanceAsObject"), null); // uo - il.Emit(OpCodes.Dup); // uo uo - il.Emit(OpCodes.Isinst, typeRequiredInSignature); // uo [ro/n] - il.Emit(OpCodes.Brtrue_S, lEnd); // uo - il.MarkLabel(lCreateProxy); // uo - Type paramProxyType = EnsureConverter(typeRequiredInSignature, typeOnStack); - il.Emit(OpCodes.Newobj, paramProxyType.GetConstructors()[0]); - il.MarkLabel(lEnd); // ro - } - } - } - - - - static bool EnsureCastPossible(Type targetType, Type sourceType) - { - var key = new Tuple(sourceType, targetType); - CacheResult cr = null; - if (ConverterTypeCache.TryGetValue(key, out cr)) - { - if (cr is CurrentlyVerifyingResult || cr is VerificationSucceededResult || cr is TypeBuilderResult) return true; - if (cr is ErrorResult) return false; - } - if (targetType == sourceType) - { - ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.Identity); - return true; - } - if (targetType.GetInterfaces().Contains(sourceType)) - { - ConverterTypeCache[key] = new VerificationSucceededResult(SuccessKind.SubInterface); - return true; - } - if (!targetType.IsInterface || !sourceType.IsInterface) - { - ConverterTypeCache[key] = new ErrorResult("Cannot cast " + sourceType + " to " + targetType); - return false; - } - bool success = false; - ConverterTypeCache[key] = new CurrentlyVerifyingResult(); - try - { - Dictionary mappings = new Dictionary(); - foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) - { - MethodInfo mapping = FindCorrespondingMethod(targetType, sourceType, mi); - if (mapping == null) - { - ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType + " because of missing method: " + mi.Name); - return false; - } - mappings[mi] = mapping; - } - ConverterTypeCache[key] = new VerificationSucceededResult(mappings); - success = true; - return true; - } - finally - { - if (!success) - { - if (!(ConverterTypeCache[key] is ErrorResult)) - { - ConverterTypeCache[key] = new ErrorResult("Can not cast " + sourceType + " to " + targetType); - } - } - } - } - - static int counter = 0; - static Type CreateWrapperType(Type targetType, Type sourceType, VerificationSucceededResult result) - { - Dictionary mappings = result.methodMappings; - Type baseType = typeof(BaseType<>).MakeGenericType(sourceType); - TypeBuilder tb = modb.DefineType("ProxyType" + counter++ + " wrapping:" + sourceType.Name + " to look like:" + targetType.Name, TypeAttributes.Class, baseType, new Type[] { targetType }); - ConstructorBuilder cb = tb.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, new Type[] { sourceType }); - ILGenerator il = cb.GetILGenerator(); - il.Emit(OpCodes.Ldarg_0); - il.Emit(OpCodes.Ldarg_1); - il.Emit(OpCodes.Castclass, sourceType); - il.Emit(OpCodes.Call, baseType.GetConstructor(new Type[] { sourceType })); - il.Emit(OpCodes.Ret); - var tuple = new Tuple(sourceType, targetType); - try - { - ConverterTypeCache[tuple] = new TypeBuilderResult(tb); - foreach (MethodInfo mi in targetType.GetMethods().Concat(targetType.GetInterfaces().SelectMany((itf) => itf.GetMethods()))) - { - AddMethod(targetType, sourceType, tb, mi, mappings[mi]); - } - Type t = tb.CreateType(); - ConverterTypeCache[tuple] = new TypeBuilderResult(t); - return t; - } - catch (Exception e) - { - ConverterTypeCache[tuple] = new ErrorResult(e.Message); - throw; - } - } - - } - #endif -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index e0f6a454d3..7a566cbcf8 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -23,7 +23,6 @@ - \ No newline at end of file From a04d592d06ddf7f7add921f19ebc01bf78165dc8 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 21 Apr 2014 16:26:15 -0700 Subject: [PATCH 0116/1838] OWIN->K and K->OWIN support via Func. --- HttpAbstractions.sln | 37 +- .../ICanHasOwinEnvironment.cs | 9 + .../Microsoft.AspNet.Owin.kproj | 31 ++ src/Microsoft.AspNet.Owin/OwinConstants.cs | 175 +++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 269 +++++++++++++ src/Microsoft.AspNet.Owin/OwinExtensions.cs | 30 ++ .../OwinFeatureCollection.cs | 368 ++++++++++++++++++ .../OwinMiddlewareFactory.cs | 50 +++ src/Microsoft.AspNet.Owin/Project.json | 30 ++ .../Microsoft.AspNet.Owin.Tests.kproj | 27 ++ .../OwinEnvironmentTests.cs | 226 +++++++++++ .../OwinFeatureCollectionTests.cs | 47 +++ test/Microsoft.AspNet.Owin.Tests/Project.json | 26 ++ 13 files changed, 1324 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs create mode 100644 src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj create mode 100644 src/Microsoft.AspNet.Owin/OwinConstants.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinEnvironment.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinExtensions.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs create mode 100644 src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs create mode 100644 src/Microsoft.AspNet.Owin/Project.json create mode 100644 test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj create mode 100644 test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs create mode 100644 test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs create mode 100644 test/Microsoft.AspNet.Owin.Tests/Project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 83fd260c8c..c7f07227ab 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30327.0 +VisualStudioVersion = 12.0.30401.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -21,6 +21,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureMod EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.kproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.kproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -32,6 +36,7 @@ Global EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|x86 @@ -42,6 +47,7 @@ Global {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|x86 {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.Build.0 = Release|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|x86 + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|x86 @@ -52,6 +58,7 @@ Global {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|x86 {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.Build.0 = Release|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|x86 @@ -62,6 +69,7 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|x86 {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.Build.0 = Release|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|x86 + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|x86 @@ -72,6 +80,7 @@ Global {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|x86 {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.Build.0 = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|x86 + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|x86 @@ -82,6 +91,7 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|x86 @@ -92,6 +102,7 @@ Global {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|x86 {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|x86 @@ -101,6 +112,28 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.Build.0 = Debug|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|x86 + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.Build.0 = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.Build.0 = Debug|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|x86 + {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.Build.0 = Release|x86 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -113,5 +146,7 @@ Global {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {59BED991-F207-48ED-B24C-0A1D9C986C01} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs new file mode 100644 index 0000000000..49218e1115 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Microsoft.AspNet.Owin +{ + public interface ICanHasOwinEnvironment + { + IDictionary Environment { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj new file mode 100644 index 0000000000..fb37b90152 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -0,0 +1,31 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 59bed991-f207-48ed-b24c-0a1d9c986c01 + Library + + + + + + + 2.0 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs new file mode 100644 index 0000000000..a54f04cccf --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -0,0 +1,175 @@ +namespace Microsoft.AspNet.Owin +{ + internal static class OwinConstants + { + #region OWIN v1.0.0 - 3.2.1. Request Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string RequestScheme = "owin.RequestScheme"; + public const string RequestMethod = "owin.RequestMethod"; + public const string RequestPathBase = "owin.RequestPathBase"; + public const string RequestPath = "owin.RequestPath"; + public const string RequestQueryString = "owin.RequestQueryString"; + public const string RequestProtocol = "owin.RequestProtocol"; + public const string RequestHeaders = "owin.RequestHeaders"; + public const string RequestBody = "owin.RequestBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.2. Response Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string ResponseStatusCode = "owin.ResponseStatusCode"; + public const string ResponseReasonPhrase = "owin.ResponseReasonPhrase"; + public const string ResponseProtocol = "owin.ResponseProtocol"; + public const string ResponseHeaders = "owin.ResponseHeaders"; + public const string ResponseBody = "owin.ResponseBody"; + + #endregion + + #region OWIN v1.0.0 - 3.2.3. Other Data + + // http://owin.org/spec/owin-1.0.0.html + + public const string CallCancelled = "owin.CallCancelled"; + + public const string OwinVersion = "owin.Version"; + + #endregion + + #region OWIN Keys for IAppBuilder.Properties + + internal static class Builder + { + public const string AddSignatureConversion = "builder.AddSignatureConversion"; + public const string DefaultApp = "builder.DefaultApp"; + } + + #endregion + + #region OWIN Key Guidelines and Common Keys - 6. Common keys + + // http://owin.org/spec/CommonKeys.html + + internal static class CommonKeys + { + public const string ClientCertificate = "ssl.ClientCertificate"; + public const string LoadClientCertAsync = "ssl.LoadClientCertAsync"; + public const string RemoteIpAddress = "server.RemoteIpAddress"; + public const string RemotePort = "server.RemotePort"; + public const string LocalIpAddress = "server.LocalIpAddress"; + public const string LocalPort = "server.LocalPort"; + public const string IsLocal = "server.IsLocal"; + public const string TraceOutput = "host.TraceOutput"; + public const string Addresses = "host.Addresses"; + public const string AppName = "host.AppName"; + public const string Capabilities = "server.Capabilities"; + public const string OnSendingHeaders = "server.OnSendingHeaders"; + public const string OnAppDisposing = "host.OnAppDisposing"; + public const string Scheme = "scheme"; + public const string Host = "host"; + public const string Port = "port"; + public const string Path = "path"; + } + + #endregion + + #region SendFiles v0.3.0 + + // http://owin.org/extensions/owin-SendFile-Extension-v0.3.0.htm + + internal static class SendFiles + { + // 3.1. Startup + + public const string Version = "sendfile.Version"; + public const string Support = "sendfile.Support"; + public const string Concurrency = "sendfile.Concurrency"; + + // 3.2. Per Request + + public const string SendAsync = "sendfile.SendAsync"; + } + + #endregion + + #region Opaque v0.3.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class OpaqueConstants + { + // 3.1. Startup + + public const string Version = "opaque.Version"; + + // 3.2. Per Request + + public const string Upgrade = "opaque.Upgrade"; + + // 5. Consumption + + public const string Stream = "opaque.Stream"; + // public const string Version = "opaque.Version"; // redundant, declared above + public const string CallCancelled = "opaque.CallCancelled"; + } + + #endregion + + #region WebSocket v0.4.0 + + // http://owin.org/extensions/owin-OpaqueStream-Extension-v0.3.0.htm + + internal static class WebSocket + { + // 3.1. Startup + + public const string Version = "websocket.Version"; + + // 3.2. Per Request + + public const string Accept = "websocket.Accept"; + + // 4. Accept + + public const string SubProtocol = "websocket.SubProtocol"; + + // 5. Consumption + + public const string SendAsync = "websocket.SendAsync"; + public const string ReceiveAsync = "websocket.ReceiveAsync"; + public const string CloseAsync = "websocket.CloseAsync"; + // public const string Version = "websocket.Version"; // redundant, declared above + public const string CallCancelled = "websocket.CallCancelled"; + public const string ClientCloseStatus = "websocket.ClientCloseStatus"; + public const string ClientCloseDescription = "websocket.ClientCloseDescription"; + } + + #endregion + + #region Security v0.1.0 + + // http://owin.org/extensions/owin-Security-Extension-v0.1.0.htm + + internal static class Security + { + // 3.2. Per Request + + public const string User = "server.User"; + + public const string Authenticate = "security.Authenticate"; + + // 3.3. Response + + public const string SignIn = "security.SignIn"; + + public const string SignOut = "security.SignOut"; + + public const string Challenge = "security.Challenge"; + } + + #endregion + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs new file mode 100644 index 0000000000..157d98ba86 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -0,0 +1,269 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + using SendFileFunc = Func; + + public class OwinEnvironment : IDictionary + { + private HttpContext _context; + private IDictionary _entries; + + public OwinEnvironment(HttpContext context) + { + _context = context; + _entries = new Dictionary() + { + { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, + { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, + { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, + { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, + { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + + { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, + { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, + + { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), + (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, + { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), + (feature, value) => feature.RemotePort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, + + { OwinConstants.CommonKeys.LocalIpAddress, new FeatureMap(feature => feature.LocalIpAddress.ToString(), + (feature, value) => feature.LocalIpAddress = IPAddress.Parse(Convert.ToString(value))) }, + { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), + (feature, value) => feature.RemoteIpAddress = IPAddress.Parse(Convert.ToString(value))) }, + + { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, + + { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, + }; + + if (context.Request.IsSecure) + { + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + (feature, value) => feature.ClientCertificate = (X509Certificate)value)); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); + } + + _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN + } + + // Public in case there's a new/custom feature interface that needs to be added. + public IDictionary FeatureMaps + { + get { return _entries; } + } + + void IDictionary.Add(string key, object value) + { + if (_entries.ContainsKey(key)) + { + throw new InvalidOperationException("Key already present"); + } + _context.Items.Add(key, value); + } + + bool IDictionary.ContainsKey(string key) + { + return _entries.ContainsKey(key) || _context.Items.ContainsKey(key); + } + + ICollection IDictionary.Keys + { + get + { + return _entries.Keys.Concat(_context.Items.Keys.Select(key => Convert.ToString(key))).ToList(); + } + } + + bool IDictionary.Remove(string key) + { + if (_entries.Remove(key)) + { + return true; + } + return _context.Items.Remove(key); + } + + bool IDictionary.TryGetValue(string key, out object value) + { + FeatureMap entry; + if (_entries.TryGetValue(key, out entry)) + { + value = entry.Get(_context); + return true; + } + return _context.Items.TryGetValue(key, out value); + } + + ICollection IDictionary.Values + { + get { throw new NotImplementedException(); } + } + + object IDictionary.this[string key] + { + get + { + FeatureMap entry; + if (_entries.TryGetValue(key, out entry)) + { + return entry.Get(_context); + } + object value; + if (_context.Items.TryGetValue(key, out value)) + { + return value; + } + throw new KeyNotFoundException(key); + } + set + { + FeatureMap entry; + if (_entries.TryGetValue(key, out entry)) + { + if (entry.Setter == null) + { + _entries.Remove(key); + if (value != null) + { + _context.Items[key] = value; + } + } + else + { + entry.Setter(_context.GetFeature(entry.FeatureInterface), value); + } + } + else + { + if (value == null) + { + _context.Items.Remove(key); + } + else + { + _context.Items[key] = value; + } + } + } + } + + void ICollection>.Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + void ICollection>.Clear() + { + _entries.Clear(); + _context.Items.Clear(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + int ICollection>.Count + { + get { return _entries.Count + _context.Items.Count; } + } + + bool ICollection>.IsReadOnly + { + get { return false; } + } + + bool ICollection>.Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + IEnumerator> IEnumerable>.GetEnumerator() + { + foreach (var entryPair in _entries) + { + yield return new KeyValuePair(entryPair.Key, entryPair.Value.Get(_context)); + } + foreach (var entryPair in _context.Items) + { + yield return new KeyValuePair(Convert.ToString(entryPair.Key), entryPair.Value); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + public class FeatureMap + { + internal FeatureMap(Type featureInterface, Func getter) + : this(featureInterface, getter, null) + { + } + + internal FeatureMap(Type featureInterface, Func getter, Action setter) + { + FeatureInterface = featureInterface; + Getter = getter; + Setter = setter; + } + + internal Type FeatureInterface { get; set; } + internal Func Getter { get; set; } + internal Action Setter { get; set; } + + internal object Get(HttpContext context) + { + object featureInstance = context.GetFeature(FeatureInterface); + if (featureInstance == null) + { + return null; + } + return Getter(featureInstance); + } + + internal void Set(HttpContext context, object value) + { + Setter(context.GetFeature(FeatureInterface), value); + } + } + + public class FeatureMap : FeatureMap + { + internal FeatureMap(Func getter) + : base(typeof(T), feature => getter((T)feature)) + { + } + + internal FeatureMap(Func getter, Action setter) + : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) + { + } + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs new file mode 100644 index 0000000000..135973e654 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Owin; + +namespace Microsoft.AspNet +{ + using AppFunc = Func, Task>; + + public static class OwinExtensions + { + public static IBuilder UseOwinMiddleware(this IBuilder builder, Func middleware) + { + Func middleware1 = next1 => + { + AppFunc exitMiddlware = env => + { + return next1((HttpContext)env[typeof(HttpContext).FullName]); + }; + var app = middleware(exitMiddlware); + return httpContext => + { + return app.Invoke(new OwinEnvironment(httpContext)); + }; + }; + return builder.Use(middleware1); + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs new file mode 100644 index 0000000000..8dc7f3422f --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -0,0 +1,368 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Net; +using System.Reflection; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.FeatureModel; + +namespace Microsoft.AspNet.Owin +{ + using SendFileFunc = Func; + + public class OwinFeatureCollection : + IFeatureCollection, + IHttpRequestInformation, + IHttpResponseInformation, + IHttpConnection, + IHttpSendFile, + IHttpTransportLayerSecurity, + ICanHasOwinEnvironment + { + public IDictionary Environment { get; set; } + + public OwinFeatureCollection(IDictionary environment) + { + Environment = environment; + } + + T Prop(string key) + { + object value; + if (Environment.TryGetValue(key, out value) && value is T) + { + return (T)value; + } + return default(T); + } + + void Prop(string key, object value) + { + Environment[key] = value; + } + + string IHttpRequestInformation.Protocol + { + get { return Prop(OwinConstants.RequestProtocol); } + set { Prop(OwinConstants.RequestProtocol, value); } + } + + string IHttpRequestInformation.Scheme + { + get { return Prop(OwinConstants.RequestScheme); } + set { Prop(OwinConstants.RequestScheme, value); } + } + + string IHttpRequestInformation.Method + { + get { return Prop(OwinConstants.RequestMethod); } + set { Prop(OwinConstants.RequestMethod, value); } + } + + string IHttpRequestInformation.PathBase + { + get { return Prop(OwinConstants.RequestPathBase); } + set { Prop(OwinConstants.RequestPathBase, value); } + } + + string IHttpRequestInformation.Path + { + get { return Prop(OwinConstants.RequestPath); } + set { Prop(OwinConstants.RequestPath, value); } + } + + string IHttpRequestInformation.QueryString + { + get { return Prop(OwinConstants.RequestQueryString); } + set { Prop(OwinConstants.RequestQueryString, value); } + } + + IDictionary IHttpRequestInformation.Headers + { + get { return Prop>(OwinConstants.RequestHeaders); } + set { Prop(OwinConstants.RequestHeaders, value); } + } + + Stream IHttpRequestInformation.Body + { + get { return Prop(OwinConstants.RequestBody); } + set { Prop(OwinConstants.RequestBody, value); } + } + + int IHttpResponseInformation.StatusCode + { + get { return Prop(OwinConstants.ResponseStatusCode); } + set { Prop(OwinConstants.ResponseStatusCode, value); } + } + + string IHttpResponseInformation.ReasonPhrase + { + get { return Prop(OwinConstants.ResponseReasonPhrase); } + set { Prop(OwinConstants.ResponseReasonPhrase, value); } + } + + IDictionary IHttpResponseInformation.Headers + { + get { return Prop>(OwinConstants.ResponseHeaders); } + set { Prop(OwinConstants.ResponseHeaders, value); } + } + + Stream IHttpResponseInformation.Body + { + get { return Prop(OwinConstants.ResponseBody); } + set { Prop(OwinConstants.ResponseBody, value); } + } + + void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) + { + var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); + if (register == null) + { + throw new NotSupportedException(OwinConstants.CommonKeys.OnSendingHeaders); + } + register(callback, state); + } + + IPAddress IHttpConnection.RemoteIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } + set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } + } + + IPAddress IHttpConnection.LocalIpAddress + { + get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } + set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } + } + + int IHttpConnection.RemotePort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } + set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } + } + + int IHttpConnection.LocalPort + { + get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } + } + + bool IHttpConnection.IsLocal + { + get { return Prop(OwinConstants.CommonKeys.IsLocal); } + set { Prop(OwinConstants.CommonKeys.LocalPort, value); } + } + + private bool SupportsSendFile + { + get + { + object obj; + return Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj) && obj != null; + } + } + + Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + { + object obj; + if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) + { + var func = (SendFileFunc)obj; + return func(path, offset, length, cancellation); + } + throw new NotSupportedException(OwinConstants.SendFiles.SendAsync); + } + + private bool SupportsClientCerts + { + get + { + object obj; + if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) + && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) + || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) + && obj != null) + { + return true; + } + return false; + } + } + + X509Certificate IHttpTransportLayerSecurity.ClientCertificate + { + get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } + set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } + } + + Task IHttpTransportLayerSecurity.LoadAsync() + { + throw new NotImplementedException(); + } + + public int Revision + { + get { return 0; } // Not modifiable + } + + public void Add(Type key, object value) + { + throw new NotSupportedException(); + } + + public bool ContainsKey(Type key) + { + // Does this type implement the requested interface? + if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) + { + // Check for conditional features + if (key == typeof(IHttpSendFile)) + { + return SupportsSendFile; + } + else if (key == typeof(IHttpTransportLayerSecurity)) + { + return SupportsClientCerts; + } + + // The rest of the features are always supported. + return true; + } + return false; + } + + public ICollection Keys + { + get + { + var keys = new List() + { + typeof(IHttpRequestInformation), + typeof(IHttpResponseInformation), + typeof(IHttpConnection), + typeof(ICanHasOwinEnvironment), + }; + if (SupportsSendFile) + { + keys.Add(typeof(IHttpSendFile)); + } + if (SupportsClientCerts) + { + keys.Add(typeof(IHttpTransportLayerSecurity)); + } + return keys; + } + } + + public bool Remove(Type key) + { + throw new NotSupportedException(); + } + + public bool TryGetValue(Type key, out object value) + { + if (ContainsKey(key)) + { + value = this; + return true; + } + value = null; + return false; + } + + public ICollection Values + { + get { throw new NotSupportedException(); } + } + + public object this[Type key] + { + get + { + object value; + if (TryGetValue(key, out value)) + { + return value; + } + throw new KeyNotFoundException(key.FullName); + } + set + { + throw new NotSupportedException(); + } + } + + public void Add(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public void Clear() + { + throw new NotSupportedException(); + } + + public bool Contains(KeyValuePair item) + { + object result; + return TryGetValue(item.Key, out result) && result.Equals(item.Value); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + if (array == null) + { + throw new ArgumentNullException("array"); + } + if (arrayIndex < 0 || arrayIndex > array.Length) + { + throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); + } + var keys = Keys; + if (keys.Count > array.Length - arrayIndex) + { + throw new ArgumentException(); + } + + foreach (var key in keys) + { + array[arrayIndex++] = new KeyValuePair(key, this[key]); + } + } + + public int Count + { + get { return Keys.Count; } + } + + public bool IsReadOnly + { + get { return true; } + } + + public bool Remove(KeyValuePair item) + { + throw new NotSupportedException(); + } + + public IEnumerator> GetEnumerator() + { + return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); + } + + System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public void Dispose() + { + } + } +} + diff --git a/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs b/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs new file mode 100644 index 0000000000..96bbaa48f5 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs @@ -0,0 +1,50 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.PipelineCore; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + + public static class OwinMiddlewareFactory + { + public static Func Create(Action configuration) + { + return Create(services: null, configuration: configuration); + } + + public static Func Create(IServiceProvider services, Action configuration) + { + var builder = new Builder(services); + configuration(builder); + + return Create(exit => + { + builder.Use(ignored => exit); + return builder.Build(); + }); + } + + public static Func Create(Func middleware) + { + return next => + { + var app = middleware(httpContext => + { + return next(httpContext.GetFeature().Environment); + }); + + return env => + { + return app.Invoke( + new DefaultHttpContext( + new FeatureCollection( + new OwinFeatureCollection(env)))); + }; + }; + } + } +} diff --git a/src/Microsoft.AspNet.Owin/Project.json b/src/Microsoft.AspNet.Owin/Project.json new file mode 100644 index 0000000000..4a7ce42ba7 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Project.json @@ -0,0 +1,30 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.HttpFeature": "" + }, + "configurations": { + "net45": { }, + "k10": { + "dependencies": { + "System.Collections": "4.0.0.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.0.0", + "System.Linq": "4.0.0.0", + "System.Net.Primitives": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "0.1-alpha-*", + "System.Security.Cryptography.X509Certificates": "4.0.0.0", + "System.Security.Principal" : "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj new file mode 100644 index 0000000000..23a18cf7d4 --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -0,0 +1,27 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 16219571-3268-4d12-8689-12b7163dba13 + Library + + + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs new file mode 100644 index 0000000000..de9fc4a4a6 --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -0,0 +1,226 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Security.Claims; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.HttpFeature; +using Xunit; + +namespace Microsoft.AspNet.Owin +{ + public class OwinEnvironmentTests + { + private T Get(IDictionary environment, string key) + { + object value; + return environment.TryGetValue(key, out value) ? (T)value : default(T); + } + + [Fact] + public void OwinEnvironmentCanBeCreated() + { + MoqHttpContext context = new MoqHttpContext(); + context.Request.Method = "SomeMethod"; + IDictionary env = new OwinEnvironment(context); + + Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); + env["owin.RequestMethod"] = "SomeOtherMethod"; + Assert.Equal("SomeOtherMethod", context.Request.Method); + } + + private class MoqHttpContext : HttpContext + { + private HttpRequest _request; + private IDictionary _items; + + public MoqHttpContext() + { + _request = new MoqHttpRequest(); + _items = new Dictionary(); + } + + public override HttpRequest Request + { + get { return _request; } + } + + public override HttpResponse Response + { + get { throw new NotImplementedException(); } + } + + public override ClaimsPrincipal User + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IDictionary Items + { + get { return _items; } + } + + public override IServiceProvider ApplicationServices + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IServiceProvider RequestServices + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override void Dispose() + { + throw new NotImplementedException(); + } + + public override object GetFeature(Type type) + { + return Request; + } + + public override void SetFeature(Type type, object instance) + { + throw new NotImplementedException(); + } + + public override IEnumerable GetAuthenticationTypes() + { + throw new NotImplementedException(); + } + + public override IEnumerable Authenticate(IList authenticationTypes) + { + throw new NotImplementedException(); + } + + public override Task> AuthenticateAsync(IList authenticationTypes) + { + throw new NotImplementedException(); + } + } + + private class MoqHttpRequest : HttpRequest, IHttpRequestInformation + { + public override HttpContext HttpContext + { + get { throw new NotImplementedException(); } + } + + public override string Method + { + get; + set; + } + + public override string Scheme + { + get; + set; + } + + public override bool IsSecure + { + get { return false; } + } + + public override HostString Host + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override PathString PathBase + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override PathString Path + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override QueryString QueryString + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IReadableStringCollection Query + { + get { throw new NotImplementedException(); } + } + + public override Task GetFormAsync() + { + throw new NotImplementedException(); + } + + public override string Protocol + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override IHeaderDictionary Headers + { + get { throw new NotImplementedException(); } + } + + public override IReadableStringCollection Cookies + { + get { throw new NotImplementedException(); } + } + + public override long? ContentLength + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override Stream Body + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + public override CancellationToken CallCanceled + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + + string IHttpRequestInformation.PathBase + { + get; + set; + } + + string IHttpRequestInformation.Path + { + get; + set; + } + + string IHttpRequestInformation.QueryString + { + get; + set; + } + + IDictionary IHttpRequestInformation.Headers + { + get; + set; + } + } + } +} diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs new file mode 100644 index 0000000000..d6476c0a8a --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -0,0 +1,47 @@ +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Xunit; + +namespace Microsoft.AspNet.Owin +{ + public class OwinHttpEnvironmentTests + { + private T Get(IFeatureCollection features) + { + object value; + return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); + } + + [Fact] + public void OwinHttpEnvironmentCanBeCreated() + { + var env = new Dictionary + { + {"owin.RequestMethod", "POST"} + }; + var features = new FeatureObject(new OwinFeatureCollection(env)); + + Assert.Equal(Get(features).Method, "POST"); + } + + [Fact] + public void ImplementedInterfacesAreEnumerated() + { + var env = new Dictionary + { + {"owin.RequestMethod", "POST"} + }; + var features = new FeatureObject(new OwinFeatureCollection(env)); + + var entries = features.ToArray(); + var keys = features.Keys.ToArray(); + var values = features.Values.ToArray(); + + Assert.Contains(typeof(IHttpRequestInformation), keys); + Assert.Contains(typeof(IHttpResponseInformation), keys); + } + } +} + diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json new file mode 100644 index 0000000000..3ba09cb57f --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/Project.json @@ -0,0 +1,26 @@ +{ + "version": "0.1-alpha-*", + "dependencies": { + "Microsoft.AspNet.Owin": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.PipelineCore": "", + "Xunit.KRunner": "0.1-alpha-*", + "xunit.abstractions": "2.0.0-aspnet-*", + "xunit.assert": "2.0.0-aspnet-*", + "xunit.core": "2.0.0-aspnet-*", + "xunit.execution": "2.0.0-aspnet-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "System.Runtime": "", + "Shouldly": "1.1.1.1" + } + } + } +} \ No newline at end of file From aa4dfffd8435eae2406f41fddce819ab4af1fdd2 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 21 Apr 2014 22:27:14 -0700 Subject: [PATCH 0117/1838] Fixed references in test host --- test/Microsoft.AspNet.TestHost.Tests/project.json | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 458aa6f103..191a4928ef 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,8 +1,6 @@ { "version" : "0.1-alpha-*", "dependencies": { - "System.Reflection": "4.0.10.0", - "System.Runtime" : "4.0.20.0", "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.TestHost": "", "xunit.abstractions": "2.0.0-aspnet-*", From caff1d3d68502455e7f014d0387fff45df805383 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 21 Apr 2014 22:31:46 -0700 Subject: [PATCH 0118/1838] Fixed unused project references --- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 1 - test/Microsoft.AspNet.PipelineCore.Tests/project.json | 1 - 2 files changed, 2 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index f5db7e821f..25bbf54fa6 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,7 +1,6 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", "Microsoft.AspNet.FeatureModel": "", diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 8ac9b6c2fa..ae27e76817 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,7 +1,6 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.AppBuilderSupport": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Abstractions": "", "Microsoft.AspNet.FeatureModel": "", From 4a5de61cd154ae072785df3d84ab34d3c9f4edfd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 23 Apr 2014 12:01:25 -0700 Subject: [PATCH 0119/1838] OWIN: Change interop extension methods. --- .../Microsoft.AspNet.Owin.kproj | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 74 +++++++++++++++++-- .../OwinMiddlewareFactory.cs | 50 ------------- 3 files changed, 66 insertions(+), 59 deletions(-) delete mode 100644 src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index fb37b90152..210e9491a3 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -25,7 +25,6 @@ - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 135973e654..a98c449a25 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -3,28 +3,86 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Owin; +using Microsoft.AspNet.PipelineCore; namespace Microsoft.AspNet { using AppFunc = Func, Task>; + using CreateMiddleware = Func< + Func, Task>, + Func, Task> + >; + using AddMiddleware = Action, Task>, + Func, Task> + >>; public static class OwinExtensions { - public static IBuilder UseOwinMiddleware(this IBuilder builder, Func middleware) + public static AddMiddleware UseOwin(this IBuilder builder) { - Func middleware1 = next1 => + return middleware => { - AppFunc exitMiddlware = env => + Func middleware1 = next1 => { - return next1((HttpContext)env[typeof(HttpContext).FullName]); + AppFunc exitMiddlware = env => + { + return next1((HttpContext)env[typeof(HttpContext).FullName]); + }; + var app = middleware(exitMiddlware); + return httpContext => + { + return app.Invoke(new OwinEnvironment(httpContext)); + }; }; - var app = middleware(exitMiddlware); - return httpContext => + builder.Use(middleware1); + }; + } + + public static IBuilder UseOwin(this IBuilder builder, Action pipeline) + { + pipeline(builder.UseOwin()); + return builder; + } + + public static IBuilder UseBuilder(this AddMiddleware app) + { + var builder = new Builder(serviceProvider: null); + + CreateMiddleware middleware = CreateMiddlewareFactory(exit => + { + builder.Use(ignored => exit); + return builder.Build(); + }); + + app(middleware); + return builder; + } + + private static CreateMiddleware CreateMiddlewareFactory(Func middleware) + { + return next => + { + var app = middleware(httpContext => { - return app.Invoke(new OwinEnvironment(httpContext)); + return next(httpContext.GetFeature().Environment); + }); + + return env => + { + return app.Invoke( + new DefaultHttpContext( + new FeatureCollection( + new OwinFeatureCollection(env)))); }; }; - return builder.Use(middleware1); + } + + public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) + { + var builder = app.UseBuilder(); + pipeline(builder); + return app; } } } diff --git a/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs b/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs deleted file mode 100644 index 96bbaa48f5..0000000000 --- a/src/Microsoft.AspNet.Owin/OwinMiddlewareFactory.cs +++ /dev/null @@ -1,50 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.PipelineCore; - -namespace Microsoft.AspNet.Owin -{ - using AppFunc = Func, Task>; - - public static class OwinMiddlewareFactory - { - public static Func Create(Action configuration) - { - return Create(services: null, configuration: configuration); - } - - public static Func Create(IServiceProvider services, Action configuration) - { - var builder = new Builder(services); - configuration(builder); - - return Create(exit => - { - builder.Use(ignored => exit); - return builder.Build(); - }); - } - - public static Func Create(Func middleware) - { - return next => - { - var app = middleware(httpContext => - { - return next(httpContext.GetFeature().Environment); - }); - - return env => - { - return app.Invoke( - new DefaultHttpContext( - new FeatureCollection( - new OwinFeatureCollection(env)))); - }; - }; - } - } -} From 66495cdc5835e4e57aba49b97ff2623a55cdd100 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 23 Apr 2014 14:15:41 -0700 Subject: [PATCH 0120/1838] Add missing namespace. --- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index a98c449a25..f96b6300c9 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; using Microsoft.AspNet.PipelineCore; From b751cf19d0b4b573dd0bdd558879e5128675e1df Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 22 Apr 2014 09:35:49 -0700 Subject: [PATCH 0121/1838] #34 - Make HttpContext.User return non-null. --- .../DefaultHttpContext.cs | 11 ++++- .../DefaultHttpContextTests.cs | 43 +++++++++++++++++++ .../Microsoft.AspNet.PipelineCore.Tests.kproj | 1 + 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 0525f0cd6c..dd114e9e8b 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -54,7 +54,16 @@ namespace Microsoft.AspNet.PipelineCore public override ClaimsPrincipal User { - get { return HttpAuthentication.User; } + get + { + var user = HttpAuthentication.User; + if (user == null) + { + user = new ClaimsPrincipal(new ClaimsIdentity()); + HttpAuthentication.User = user; + } + return user; + } set { HttpAuthentication.User = value; } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs new file mode 100644 index 0000000000..4eb0b87d9e --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Security.Claims; +using System.Linq; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class DefaultHttpContextTests + { + [Fact] + public void EmptyUserIsNeverNull() + { + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.NotNull(context.User); + Assert.Equal(1, context.User.Identities.Count()); + Assert.True(object.ReferenceEquals(context.User, context.User)); + Assert.False(context.User.Identity.IsAuthenticated); + Assert.True(string.IsNullOrEmpty(context.User.Identity.AuthenticationType)); + + context.User = null; + Assert.NotNull(context.User); + Assert.Equal(1, context.User.Identities.Count()); + Assert.True(object.ReferenceEquals(context.User, context.User)); + Assert.False(context.User.Identity.IsAuthenticated); + Assert.True(string.IsNullOrEmpty(context.User.Identity.AuthenticationType)); + + context.User = new ClaimsPrincipal(); + Assert.NotNull(context.User); + Assert.Equal(0, context.User.Identities.Count()); + Assert.True(object.ReferenceEquals(context.User, context.User)); + Assert.Null(context.User.Identity); + + context.User = new ClaimsPrincipal(new ClaimsIdentity("SomeAuthType")); + Assert.Equal("SomeAuthType", context.User.Identity.AuthenticationType); + Assert.True(context.User.Identity.IsAuthenticated); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index efb347f4aa..2f35d88951 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -24,6 +24,7 @@ + From 4077c03a7ba7f0d84e5829878dd8651970a6d5a8 Mon Sep 17 00:00:00 2001 From: GrabYourPitchforks Date: Thu, 24 Apr 2014 12:54:50 -0700 Subject: [PATCH 0122/1838] Hosting: Throw if startup method isn't void-returning. --- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index eed8e7a6e4..0f07be61b0 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -65,6 +65,11 @@ namespace Microsoft.AspNet.Hosting.Startup throw new Exception("TODO: Configuration method not found"); } + if (methodInfo.ReturnType != typeof(void)) + { + throw new Exception("TODO: Configuration method isn't void-returning."); + } + object instance = null; if (!methodInfo.IsStatic) { From 8ad7b489e2d58726fd8d3c97fd4ac0afc9b2026f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Apr 2014 14:44:50 -0700 Subject: [PATCH 0123/1838] #18 - Add interfaces for request lifetime management. --- .../HttpContext.cs | 5 ++++ .../IHttpRequestLifetime.cs | 10 +++++++ .../Microsoft.AspNet.HttpFeature.kproj | 1 + .../DefaultHttpContext.cs | 30 +++++++++++++++++++ .../OwinEnvironmentTests.cs | 10 +++++++ 5 files changed, 56 insertions(+) create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index a933d34660..81e44240c2 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions.Security; @@ -21,6 +22,10 @@ namespace Microsoft.AspNet.Abstractions public abstract IServiceProvider RequestServices { get; set; } + public abstract CancellationToken OnRequestAborted { get; } + + public abstract void Abort(); + public abstract void Dispose(); public abstract object GetFeature(Type type); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs new file mode 100644 index 0000000000..3ea7a0ee34 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs @@ -0,0 +1,10 @@ +using System.Threading; + +namespace Microsoft.AspNet.HttpFeature +{ + public interface IHttpRequestLifetime + { + CancellationToken OnRequestAborted { get; } + void Abort(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 5f8f775ed5..96973626c9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -24,6 +24,7 @@ + diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index dd114e9e8b..462e5a593e 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -2,10 +2,12 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Infrastructure; using Microsoft.AspNet.PipelineCore.Security; @@ -20,6 +22,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _canHasItems; private FeatureReference _canHasServiceProviders; private FeatureReference _authentication; + private FeatureReference _lifetime; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -48,6 +51,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } } + private IHttpRequestLifetime Lifetime + { + get { return _lifetime.Fetch(_features); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -86,6 +94,28 @@ namespace Microsoft.AspNet.PipelineCore public int Revision { get { return _features.Revision; } } + public override CancellationToken OnRequestAborted + { + get + { + var lifetime = Lifetime; + if (lifetime != null) + { + return lifetime.OnRequestAborted; + } + return CancellationToken.None; + } + } + + public override void Abort() + { + var lifetime = Lifetime; + if (lifetime != null) + { + lifetime.Abort(); + } + } + public override void Dispose() { // REVIEW: is this necessary? is the environment "owned" by the context? diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index de9fc4a4a6..e84926c2f6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -104,6 +104,16 @@ namespace Microsoft.AspNet.Owin { throw new NotImplementedException(); } + + public override CancellationToken OnRequestAborted + { + get { throw new NotImplementedException(); } + } + + public override void Abort() + { + throw new NotImplementedException(); + } } private class MoqHttpRequest : HttpRequest, IHttpRequestInformation From 78bb008681224da48e34cc53adb6980f7d814f89 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Apr 2014 16:27:18 -0700 Subject: [PATCH 0124/1838] #38 - Provide a default dictionary for HttpContext.Items that returns null for missing values. --- .../Collections/ItemsDictionary.cs | 111 ++++++++++++++++++ .../DefaultCanHasItems.cs | 2 +- .../Microsoft.AspNet.PipelineCore.kproj | 1 + 3 files changed, 113 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs new file mode 100644 index 0000000000..5f4abca7c0 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -0,0 +1,111 @@ +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet.PipelineCore +{ + public class ItemsDictionary : IDictionary + { + public ItemsDictionary() + : this(new Dictionary()) + { + } + + public ItemsDictionary(IDictionary items) + { + Items = items; + } + + public IDictionary Items { get; private set; } + + // Replace the indexer with one that returns null for missing values + object IDictionary.this[object key] + { + get + { + object value; + if (Items.TryGetValue(key, out value)) + { + return value; + } + return null; + } + set { Items[key] = value; } + } + + void IDictionary.Add(object key, object value) + { + Items.Add(key, value); + } + + bool IDictionary.ContainsKey(object key) + { + return Items.ContainsKey(key); + } + + ICollection IDictionary.Keys + { + get { return Items.Keys; } + } + + bool IDictionary.Remove(object key) + { + return Items.Remove(key); + } + + bool IDictionary.TryGetValue(object key, out object value) + { + return Items.TryGetValue(key, out value); + } + + ICollection IDictionary.Values + { + get { return Items.Values; } + } + + void ICollection>.Add(KeyValuePair item) + { + Items.Add(item); + } + + void ICollection>.Clear() + { + Items.Clear(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + return Items.Contains(item); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + Items.CopyTo(array, arrayIndex); + } + + int ICollection>.Count + { + get { return Items.Count; } + } + + bool ICollection>.IsReadOnly + { + get { return Items.IsReadOnly; } + } + + bool ICollection>.Remove(KeyValuePair item) + { + return Items.Remove(item); + } + + IEnumerator> IEnumerable>.GetEnumerator() + { + return Items.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return Items.GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs index 31e41440bb..13513d3653 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs @@ -6,7 +6,7 @@ namespace Microsoft.AspNet.PipelineCore { public DefaultCanHasItems() { - Items = new Dictionary(); + Items = new ItemsDictionary(); } public IDictionary Items { get; private set; } diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 51c55b0566..9cf723fe9e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -23,6 +23,7 @@ + From be5a98d38f2b9c2f113f7003e990beadbdd0ee66 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 26 Apr 2014 20:52:00 -0700 Subject: [PATCH 0125/1838] Added build.sh --- build.sh | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100755 build.sh diff --git a/build.sh b/build.sh new file mode 100755 index 0000000000..db1e0c3dde --- /dev/null +++ b/build.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +if test `uname` = Darwin; then + cachedir=~/Library/Caches/KBuild +else + if x$XDG_DATA_HOME = x; then + cachedir=$HOME/.local/share + else + cachedir=$XDG_DATA_HOME; + fi +fi +mkdir -p $cachedir + +url=https://www.nuget.org/nuget.exe + +if test ! -f $cachedir/nuget.exe; then + wget -o $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null +fi + +if test ! -e .nuget; then + mkdir .nuget + cp $cachedir/nuget.exe .nuget +fi + +if test ! -d packages/KoreBuild; then + mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion +fi + +mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file From cfe76de294c0dcf62e471a5789236d0c9d7c45f5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 25 Apr 2014 11:42:17 -0700 Subject: [PATCH 0126/1838] #53 - Reduce auth exceptions for missing handlers. --- .../DefaultHttpContext.cs | 18 ++++++------- .../DefaultHttpResponse.cs | 27 +++++++++---------- 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 462e5a593e..539319b868 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -153,13 +153,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var authenticateContext = new AuthenticateContext(authenticationTypes); - handler.Authenticate(authenticateContext); + if (handler != null) + { + handler.Authenticate(authenticateContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); @@ -178,13 +177,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var authenticateContext = new AuthenticateContext(authenticationTypes); - await handler.AuthenticateAsync(authenticateContext); + if (handler != null) + { + await handler.AuthenticateAsync(authenticateContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 2a24076c19..0b6fe2c349 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -135,13 +135,12 @@ namespace Microsoft.AspNet.PipelineCore } HttpResponseInformation.StatusCode = 401; var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); - handler.Challenge(challengeContext); + if (handler != null) + { + handler.Challenge(challengeContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(challengeContext.Accepted); @@ -158,13 +157,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); - handler.SignIn(signInContext); + if (handler != null) + { + handler.SignIn(signInContext); + } // Verify all types ack'd IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Accepted); @@ -181,13 +179,12 @@ namespace Microsoft.AspNet.PipelineCore throw new ArgumentNullException(); } var handler = HttpAuthentication.Handler; - if (handler == null) - { - throw new InvalidOperationException("No authentication handlers present."); - } var signOutContext = new SignOutContext(authenticationTypes); - handler.SignOut(signOutContext); + if (handler != null) + { + handler.SignOut(signOutContext); + } // Verify all types ack'd IEnumerable leftovers = authenticationTypes.Except(signOutContext.Accepted); From 19d49b06a68491caffe962205bdbc177a8bcd25c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 25 Apr 2014 14:30:56 -0700 Subject: [PATCH 0127/1838] #53 - Add Auth unit tests. --- .../DefaultHttpContextTests.cs | 62 ++++++++++++++++++- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 4eb0b87d9e..6701e62863 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -1,8 +1,9 @@ using System; using System.Collections.Generic; -using System.Globalization; -using System.Security.Claims; +using System.IO; using System.Linq; +using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; @@ -39,5 +40,62 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Equal("SomeAuthType", context.User.Identity.AuthenticationType); Assert.True(context.User.Identity.IsAuthenticated); } + + [Fact] + public async Task AuthenticateWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Authenticate("Foo")); + await Assert.ThrowsAsync(async () => await context.AuthenticateAsync("Foo")); + } + + [Fact] + public void ChallengeWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Response.Challenge(); + Assert.Equal(401, context.Response.StatusCode); + + Assert.Throws(() => context.Response.Challenge("Foo")); + } + + [Fact] + public void SignInWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Response.SignIn(new ClaimsIdentity("Foo"))); + } + + [Fact] + public void SignOutWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Response.SignOut(); + + Assert.Throws(() => context.Response.SignOut("Foo")); + } + + private HttpContext CreateContext() + { + var context = new DefaultHttpContext(new FeatureCollection()); + context.SetFeature(new FakeHttpResponse()); + return context; + } + + private class FakeHttpResponse : IHttpResponseInformation + { + public int StatusCode { get; set; } + + public string ReasonPhrase { get; set; } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + public void OnSendingHeaders(Action callback, object state) + { + throw new NotImplementedException(); + } + } } } \ No newline at end of file From 7b4e1fd48e91408eb039b7f565ca8bfbb8fb030a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 29 Apr 2014 23:58:53 -0700 Subject: [PATCH 0128/1838] Added DPAPI implementation that works on mono --- .../HostingServices.cs | 19 ++++++++++++++----- .../Microsoft.AspNet.Hosting.kproj | 1 + .../PlatformHelper.cs | 17 +++++++++++++++++ 3 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/PlatformHelper.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 4ef1e162c6..64f50b58ad 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -37,11 +37,20 @@ namespace Microsoft.AspNet.Hosting Lifecycle = LifecycleKind.Scoped }; - // The default IDataProtectionProvider is a singleton. - // Note: DPAPI isn't usable in IIS where the user profile hasn't been loaded, but loading DPAPI - // is deferred until the first call to Protect / Unprotect. It's up to an IIS-based host to - // replace this service as part of application initialization. - yield return describer.Instance(DataProtectionProvider.CreateFromDpapi()); + if (PlatformHelper.IsMono) + { +#if NET45 + yield return describer.Instance(DataProtectionProvider.CreateFromLegacyDpapi()); +#endif + } + else + { + // The default IDataProtectionProvider is a singleton. + // Note: DPAPI isn't usable in IIS where the user profile hasn't been loaded, but loading DPAPI + // is deferred until the first call to Protect / Unprotect. It's up to an IIS-based host to + // replace this service as part of application initialization. + yield return describer.Instance(DataProtectionProvider.CreateFromDpapi()); + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index de22702e86..5e436ba601 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -29,6 +29,7 @@ + diff --git a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs new file mode 100644 index 0000000000..2d2f0adeed --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs @@ -0,0 +1,17 @@ +using System; + +namespace Microsoft.AspNet.Hosting +{ + internal static class PlatformHelper + { + private static Lazy _isMono = new Lazy(() => Type.GetType("Mono.Runtime") != null); + + public static bool IsMono + { + get + { + return _isMono.Value; + } + } + } +} \ No newline at end of file From 5557b959c465499a9eacf5b7180316e03248edfc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 29 Apr 2014 16:25:56 -0700 Subject: [PATCH 0129/1838] #20 - Port Map and MapWhen. Move Run. --- .../Extensions/MapExtensions.cs | 50 +++++ .../Extensions/MapMiddleware.cs | 38 ++++ .../Extensions/MapOptions.cs | 19 ++ .../Extensions/MapWhenExtensions.cs | 62 ++++++ .../Extensions/MapWhenMiddleware.cs | 42 ++++ .../Extensions/MapWhenOptions.cs | 26 +++ .../Extensions/RunExtensions.cs | 13 ++ src/Microsoft.AspNet.Abstractions/IBuilder.cs | 1 - .../Microsoft.AspNet.Abstractions.kproj | 8 + .../NotNullAttribute.cs | 9 + src/Microsoft.AspNet.PipelineCore/Builder.cs | 12 +- .../Fakes.cs | 32 +++ .../MapPathMiddlewareTests.cs | 196 ++++++++++++++++++ .../MapPredicateMiddlewareTests.cs | 183 ++++++++++++++++ .../Microsoft.AspNet.Abstractions.Tests.kproj | 3 + .../project.json | 2 + 16 files changed, 689 insertions(+), 7 deletions(-) create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs create mode 100644 src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs create mode 100644 test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs new file mode 100644 index 0000000000..72aa61bc97 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs @@ -0,0 +1,50 @@ +using System; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Extensions; + +namespace Microsoft.AspNet +{ + public static class MapExtensions + { + /// + /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of + /// continuing to the next component in the pipeline. + /// + /// + /// The path to match + /// The branch to take for positive path matches + /// + public static IBuilder Map([NotNull] this IBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) + { + return Map(app, new PathString(pathMatch), configuration); + } + + /// + /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of + /// continuing to the next component in the pipeline. + /// + /// + /// The path to match + /// The branch to take for positive path matches + /// + public static IBuilder Map([NotNull] this IBuilder app, PathString pathMatch, [NotNull] Action configuration) + { + if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) + { + throw new ArgumentException("The path must not end with a '/'", "pathMatch"); + } + + // create branch + IBuilder branchBuilder = app.New(); + configuration(branchBuilder); + var branch = branchBuilder.Build(); + + var options = new MapOptions() + { + Branch = branch, + PathMatch = pathMatch, + }; + return app.Use(next => new MapMiddleware(next, options).Invoke); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs new file mode 100644 index 0000000000..9a2905ab1b --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs @@ -0,0 +1,38 @@ +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class MapMiddleware + { + private readonly RequestDelegate _next; + private readonly MapOptions _options; + + public MapMiddleware([NotNull] RequestDelegate next, [NotNull] MapOptions options) + { + _next = next; + _options = options; + } + + public async Task Invoke([NotNull] HttpContext context) + { + PathString path = context.Request.Path; + PathString remainingPath; + if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) + { + // Update the path + PathString pathBase = context.Request.PathBase; + context.Request.PathBase = pathBase + _options.PathMatch; + context.Request.Path = remainingPath; + + await _options.Branch(context); + + context.Request.PathBase = pathBase; + context.Request.Path = path; + } + else + { + await _next(context); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs new file mode 100644 index 0000000000..43b479cbc4 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs @@ -0,0 +1,19 @@ + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + /// + /// Options for the Map middleware + /// + public class MapOptions + { + /// + /// The path to match + /// + public PathString PathMatch { get; set; } + + /// + /// The branch taken for a positive match + /// + public RequestDelegate Branch { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs new file mode 100644 index 0000000000..aaad90ae74 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs @@ -0,0 +1,62 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Abstractions.Extensions; + +namespace Microsoft.AspNet +{ + using Predicate = Func; + using PredicateAsync = Func>; + + /// + /// Extension methods for the MapWhenMiddleware + /// + public static class MapWhenExtensions + { + /// + /// Branches the request pipeline based on the result of the given predicate. + /// + /// + /// Invoked with the request environment to determine if the branch should be taken + /// Configures a branch to take + /// + public static IBuilder MapWhen([NotNull] this IBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) + { + // create branch + IBuilder branchBuilder = app.New(); + configuration(branchBuilder); + var branch = branchBuilder.Build(); + + // put middleware in pipeline + var options = new MapWhenOptions + { + Predicate = predicate, + Branch = branch, + }; + return app.Use(next => new MapWhenMiddleware(next, options).Invoke); + } + + /// + /// Branches the request pipeline based on the async result of the given predicate. + /// + /// + /// Invoked asynchronously with the request environment to determine if the branch should be taken + /// Configures a branch to take + /// + public static IBuilder MapWhenAsync([NotNull] this IBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) + { + // create branch + IBuilder branchBuilder = app.New(); + configuration(branchBuilder); + var branch = branchBuilder.Build(); + + // put middleware in pipeline + var options = new MapWhenOptions + { + PredicateAsync = predicate, + Branch = branch, + }; + return app.Use(next => new MapWhenMiddleware(next, options).Invoke); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs new file mode 100644 index 0000000000..597fec36b0 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class MapWhenMiddleware + { + private readonly RequestDelegate _next; + private readonly MapWhenOptions _options; + + public MapWhenMiddleware([NotNull] RequestDelegate next, [NotNull] MapWhenOptions options) + { + _next = next; + _options = options; + } + + public async Task Invoke([NotNull] HttpContext context) + { + if (_options.Predicate != null) + { + if (_options.Predicate(context)) + { + await _options.Branch(context); + } + else + { + await _next(context); + } + } + else + { + if (await _options.PredicateAsync(context)) + { + await _options.Branch(context); + } + else + { + await _next(context); + } + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs new file mode 100644 index 0000000000..380e69ba57 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs @@ -0,0 +1,26 @@ +using System; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + /// + /// Options for the MapWhen middleware + /// + public class MapWhenOptions + { + /// + /// The user callback that determines if the branch should be taken + /// + public Func Predicate { get; set; } + + /// + /// The async user callback that determines if the branch should be taken + /// + public Func> PredicateAsync { get; set; } + + /// + /// The branch taken for a positive match + /// + public RequestDelegate Branch { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs new file mode 100644 index 0000000000..b03f4d288f --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs @@ -0,0 +1,13 @@ +using System; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet +{ + public static class RunExtensions + { + public static void Run([NotNull] this IBuilder app, [NotNull] RequestDelegate handler) + { + app.Use(_ => handler); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index d187c75ec2..13936e6773 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -8,7 +8,6 @@ namespace Microsoft.AspNet.Abstractions IServerInformation Server { get; set; } IBuilder Use(Func middleware); - IBuilder Run(RequestDelegate handler); IBuilder New(); RequestDelegate Build(); diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj index 12a6a518dc..83c250addc 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -21,6 +21,13 @@ + + + + + + + @@ -31,6 +38,7 @@ + diff --git a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs new file mode 100644 index 0000000000..4a342de834 --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Microsoft.AspNet.Abstractions +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index e5e4696118..7f4093b7bc 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore @@ -29,11 +30,6 @@ namespace Microsoft.AspNet.PipelineCore return this; } - public IBuilder Run(RequestDelegate handler) - { - return Use(next => handler); - } - public IBuilder New() { return new Builder(this); @@ -41,7 +37,11 @@ namespace Microsoft.AspNet.PipelineCore public RequestDelegate Build() { - RequestDelegate app = async context => context.Response.StatusCode = 404; + RequestDelegate app = context => + { + context.Response.StatusCode = 404; + return Task.FromResult(0); + }; foreach (var component in _components.Reverse()) { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs new file mode 100644 index 0000000000..0d4553e08a --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs @@ -0,0 +1,32 @@ + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class FakeHttpRequestInfo : IHttpRequestInformation + { + public string Protocol { get; set; } + public string Scheme { get; set; } + public string Method { get; set; } + public string PathBase { get; set; } + public string Path { get; set; } + public string QueryString { get; set; } + public IDictionary Headers { get; set; } + public Stream Body { get; set; } + } + + public class FakeHttpResponseInfo : IHttpResponseInformation + { + public int StatusCode { get; set; } + public string ReasonPhrase { get; set; } + public IDictionary Headers { get; set; } + public Stream Body { get; set; } + public void OnSendingHeaders(Action callback, object state) + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs new file mode 100644 index 0000000000..c6f8912747 --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -0,0 +1,196 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Shouldly; +using Xunit; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + public class MapPathMiddlewareTests + { + private static readonly Action ActionNotImplemented = new Action(_ => { throw new NotImplementedException(); }); + + private static Task Success(HttpContext context) + { + context.Response.StatusCode = 200; + context.Items["test.PathBase"] = context.Request.PathBase.Value; + context.Items["test.Path"] = context.Request.Path.Value; + return Task.FromResult(null); + } + + private static void UseSuccess(IBuilder app) + { + app.Run(Success); + } + + private static Task NotImplemented(HttpContext context) + { + throw new NotImplementedException(); + } + + private static void UseNotImplemented(IBuilder app) + { + app.Run(NotImplemented); + } + + [Fact] + public void NullArguments_ArgumentNullException() + { + var builder = new Builder(serviceProvider: null); + var noMiddleware = new Builder(serviceProvider: null).Build(); + var noOptions = new MapOptions(); + // TODO: [NotNull] Assert.Throws(() => builder.Map(null, ActionNotImplemented)); + // TODO: [NotNull] Assert.Throws(() => builder.Map("/foo", (Action)null)); + // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(null, noOptions)); + // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(noMiddleware, null)); + } + + [Theory] + [InlineData("/foo", "", "/foo")] + [InlineData("/foo", "", "/foo/")] + [InlineData("/foo", "/Bar", "/foo")] + [InlineData("/foo", "/Bar", "/foo/cho")] + [InlineData("/foo", "/Bar", "/foo/cho/")] + [InlineData("/foo/cho", "/Bar", "/foo/cho")] + [InlineData("/foo/cho", "/Bar", "/foo/cho/do")] + public void PathMatchFunc_BranchTaken(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath, context.Request.PathBase.Value); + Assert.Equal(requestPath, context.Request.Path.Value); + } + + [Theory] + [InlineData("/foo", "", "/foo")] + [InlineData("/foo", "", "/foo/")] + [InlineData("/foo", "/Bar", "/foo")] + [InlineData("/foo", "/Bar", "/foo/cho")] + [InlineData("/foo", "/Bar", "/foo/cho/")] + [InlineData("/foo/cho", "/Bar", "/foo/cho")] + [InlineData("/foo/cho", "/Bar", "/foo/cho/do")] + public void PathMatchAction_BranchTaken(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath + matchPath, context.Items["test.PathBase"]); + Assert.Equal(requestPath.Substring(matchPath.Length), context.Items["test.Path"]); + } + + [Theory] + [InlineData("/")] + [InlineData("/foo/")] + [InlineData("/foo/cho/")] + public void MatchPathWithTrailingSlashThrowsException(string matchPath) + { + Should.Throw(() => new Builder(serviceProvider: null).Map(matchPath, map => { }).Build()); + } + + [Theory] + [InlineData("/foo", "", "")] + [InlineData("/foo", "/bar", "")] + [InlineData("/foo", "", "/bar")] + [InlineData("/foo", "/foo", "")] + [InlineData("/foo", "/foo", "/bar")] + [InlineData("/foo", "", "/bar/foo")] + [InlineData("/foo/bar", "/foo", "/bar")] + public void PathMismatchFunc_PassedThrough(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath, context.Request.PathBase.Value); + Assert.Equal(requestPath, context.Request.Path.Value); + } + + [Theory] + [InlineData("/foo", "", "")] + [InlineData("/foo", "/bar", "")] + [InlineData("/foo", "", "/bar")] + [InlineData("/foo", "/foo", "")] + [InlineData("/foo", "/foo", "/bar")] + [InlineData("/foo", "", "/bar/foo")] + [InlineData("/foo/bar", "/foo", "/bar")] + public void PathMismatchAction_PassedThrough(string matchPath, string basePath, string requestPath) + { + HttpContext context = CreateRequest(basePath, requestPath); + IBuilder builder = new Builder(serviceProvider: null); + builder.Map(matchPath, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(basePath, context.Request.PathBase.Value); + Assert.Equal(requestPath, context.Request.Path.Value); + } + + [Fact] + public void ChainedRoutes_Success() + { + IBuilder builder = new Builder(serviceProvider: null); + builder.Map("/route1", map => + { + map.Map((string)"/subroute1", UseSuccess); + map.Run(NotImplemented); + }); + builder.Map("/route2/subroute2", UseSuccess); + var app = builder.Build(); + + HttpContext context = CreateRequest(string.Empty, "/route1"); + Assert.Throws(() => app.Invoke(context).Wait()); + + context = CreateRequest(string.Empty, "/route1/subroute1"); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route1/subroute1", context.Request.Path.Value); + + context = CreateRequest(string.Empty, "/route2"); + app.Invoke(context).Wait(); + Assert.Equal(404, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route2", context.Request.Path.Value); + + context = CreateRequest(string.Empty, "/route2/subroute2"); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route2/subroute2", context.Request.Path.Value); + + context = CreateRequest(string.Empty, "/route2/subroute2/subsub2"); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/route2/subroute2/subsub2", context.Request.Path.Value); + } + + private HttpContext CreateRequest(string basePath, string requestPath) + { + HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); + context.SetFeature(new FakeHttpRequestInfo()); + context.SetFeature(new FakeHttpResponseInfo()); + context.Request.PathBase = new PathString(basePath); + context.Request.Path = new PathString(requestPath); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs new file mode 100644 index 0000000000..689d30ab76 --- /dev/null +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.Abstractions.Extensions +{ + using AppFunc = Func, Task>; + using Predicate = Func; + using PredicateAsync = Func>; + + public class MapPredicateMiddlewareTests + { + private static readonly Predicate NotImplementedPredicate = new Predicate(envionment => { throw new NotImplementedException(); }); + private static readonly PredicateAsync NotImplementedPredicateAsync = new PredicateAsync(envionment => { throw new NotImplementedException(); }); + + private static Task Success(HttpContext context) + { + context.Response.StatusCode = 200; + return Task.FromResult(null); + } + + private static void UseSuccess(IBuilder app) + { + app.Run(Success); + } + + private static Task NotImplemented(HttpContext context) + { + throw new NotImplementedException(); + } + + private static void UseNotImplemented(IBuilder app) + { + app.Run(NotImplemented); + } + + private bool TruePredicate(HttpContext context) + { + return true; + } + + private bool FalsePredicate(HttpContext context) + { + return false; + } + + private Task TruePredicateAsync(HttpContext context) + { + return Task.FromResult(true); + } + + private Task FalsePredicateAsync(HttpContext context) + { + return Task.FromResult(false); + } + + [Fact] + public void NullArguments_ArgumentNullException() + { + var builder = new Builder(serviceProvider: null); + var noMiddleware = new Builder(serviceProvider: null).Build(); + var noOptions = new MapWhenOptions(); + // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); + // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, (Action)null)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + + // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(null, UseNotImplemented)); + // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(NotImplementedPredicateAsync, (Action)null)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + } + + [Fact] + public void PredicateTrue_BranchTaken() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(TruePredicate, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateTrueAction_BranchTaken() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(TruePredicate, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateFalseAction_PassThrough() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(FalsePredicate, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateAsyncTrueAction_BranchTaken() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhenAsync(TruePredicateAsync, UseSuccess); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void PredicateAsyncFalseAction_PassThrough() + { + HttpContext context = CreateRequest(); + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhenAsync(FalsePredicateAsync, UseNotImplemented); + builder.Run(Success); + var app = builder.Build(); + app.Invoke(context).Wait(); + + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void ChainedPredicates_Success() + { + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhen(TruePredicate, map1 => + { + map1.MapWhen((Predicate)FalsePredicate, UseNotImplemented); + map1.MapWhen((Predicate)TruePredicate, map2 => map2.MapWhen((Predicate)TruePredicate, UseSuccess)); + map1.Run(NotImplemented); + }); + var app = builder.Build(); + + HttpContext context = CreateRequest(); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + } + + [Fact] + public void ChainedPredicatesAsync_Success() + { + IBuilder builder = new Builder(serviceProvider: null); + builder.MapWhenAsync(TruePredicateAsync, map1 => + { + map1.MapWhenAsync((PredicateAsync)FalsePredicateAsync, UseNotImplemented); + map1.MapWhenAsync((PredicateAsync)TruePredicateAsync, map2 => map2.MapWhenAsync((PredicateAsync)TruePredicateAsync, UseSuccess)); + map1.Run(NotImplemented); + }); + var app = builder.Build(); + + HttpContext context = CreateRequest(); + app.Invoke(context).Wait(); + Assert.Equal(200, context.Response.StatusCode); + } + + private HttpContext CreateRequest() + { + HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); + context.SetFeature(new FakeHttpRequestInfo()); + context.SetFeature(new FakeHttpResponseInfo()); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj index e8a380615a..8b42411360 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj +++ b/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj @@ -21,6 +21,9 @@ + + + diff --git a/test/Microsoft.AspNet.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Abstractions.Tests/project.json index 110d62bb6d..5a3029b789 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Abstractions.Tests/project.json @@ -2,6 +2,8 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Testing": "0.1-alpha-*", "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", From 98f4212915fb5c6ac615b0b21fca43dba6f5127c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 30 Apr 2014 10:53:33 -0700 Subject: [PATCH 0130/1838] #20 - Add Use extension for inline middleware. --- .../Extensions/UseExtensions.cs | 27 +++++++++++++++++++ .../Microsoft.AspNet.Abstractions.kproj | 1 + 2 files changed, 28 insertions(+) create mode 100644 src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs new file mode 100644 index 0000000000..698b19ca5c --- /dev/null +++ b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Abstractions; + +namespace Microsoft.AspNet +{ + public static class UseExtensions + { + /// + /// Use middleware defined in-line. + /// + /// + /// A function that handles the request or calls the given next function. + /// + public static IBuilder Use(this IBuilder app, Func, Task> middleware) + { + return app.Use(next => + { + return context => + { + Func simpleNext = () => next(context); + return middleware(context, simpleNext); + }; + }); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj index 83c250addc..0b62b9b387 100644 --- a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj +++ b/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj @@ -28,6 +28,7 @@ + From ce0e1128d59ba9b4528f90d630b7cd4b5d425fe8 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 30 Apr 2014 11:46:23 -0700 Subject: [PATCH 0131/1838] Make HTTP feature interfaces assembly neutral --- .../AssemblyNeutralAttribute.cs | 10 ++++++++++ .../IHttpApplicationInformation.cs | 2 ++ src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs | 5 ++++- src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs | 2 ++ .../IHttpRequestInformation.cs | 2 ++ .../IHttpRequestLifetime.cs | 2 ++ .../IHttpResponseInformation.cs | 2 ++ src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs | 2 ++ .../IHttpTransportLayerSecurity.cs | 3 ++- .../IHttpWebSocketAccept.cs | 2 ++ .../Security/IAuthTypeContext.cs | 2 ++ .../Security/IAuthenticateContext.cs | 2 ++ .../Security/IAuthenticationHandler.cs | 2 ++ .../Security/IChallengeContext.cs | 2 ++ .../Security/IHttpAuthentication.cs | 2 ++ .../Security/ISignInContext.cs | 2 ++ .../Security/ISignOutContext .cs | 2 ++ 17 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs new file mode 100644 index 0000000000..1aa358ee9f --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -0,0 +1,10 @@ +using System; + +namespace Microsoft.Net.Runtime +{ + [AssemblyNeutralAttribute] + [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] + public sealed class AssemblyNeutralAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs index 37dea109ab..92100273e2 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -1,7 +1,9 @@ using System.Threading; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpApplicationInformation { string AppName { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs index e13fde6988..5a996c4299 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -1,5 +1,8 @@ -namespace Microsoft.AspNet.HttpFeature +using Microsoft.Net.Runtime; + +namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpBuffering { void DisableRequestBuffering(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index 3598c015f1..73a76ffbf0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,7 +1,9 @@ using System.Net; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpConnection { IPAddress RemoteIpAddress { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs index a293218830..b223d151e4 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpRequestInformation { string Protocol { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs index 3ea7a0ee34..41728c5869 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs @@ -1,7 +1,9 @@ using System.Threading; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpRequestLifetime { CancellationToken OnRequestAborted { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs index ce0185c88e..090c0f9107 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs @@ -1,9 +1,11 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpResponseInformation { int StatusCode { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs index f64ea29264..faeed5f775 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -1,8 +1,10 @@ using System.Threading; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpSendFile { Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index fd08f2b076..e759aef2b9 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,9 +1,10 @@ - using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpTransportLayerSecurity { X509Certificate ClientCertificate { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index d7b230df24..772dd96f32 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,9 +1,11 @@ #if NET45 using System.Net.WebSockets; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { + [AssemblyNeutral] public interface IHttpWebSocketAccept { bool IsWebSocketRequest { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index e91797ceca..df9e9b4aca 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IAuthTypeContext { void Accept(IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index 7f617e08a2..dc26a4eeaf 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Security.Claims; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IAuthenticateContext { IList AuthenticationTypes { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 8a519b5de9..efc3a3b344 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IAuthenticationHandler { void GetDescriptions(IAuthTypeContext context); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index 2707c6c63d..d684fe7542 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IChallengeContext { IList AuthenticationTypes {get;} diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index d1a7c16596..0d24c184f7 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,7 +1,9 @@ using System.Security.Claims; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface IHttpAuthentication { ClaimsPrincipal User { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index cb78f661b2..0a57985f62 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -1,8 +1,10 @@ using System.Collections.Generic; using System.Security.Claims; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface ISignInContext { IList Identities { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 9a1232ff3a..6a27a9e5ea 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -1,7 +1,9 @@ using System.Collections.Generic; +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { + [AssemblyNeutral] public interface ISignOutContext { IList AuthenticationTypes { get; } From 61924dd73e76c101088d28d5877df21af575e7ec Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 30 Apr 2014 15:43:21 -0700 Subject: [PATCH 0132/1838] Fix renamed IContextAccessor APIs. --- .../ContainerMiddleware.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 61d985fc3d..881d71ee0e 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -93,8 +93,8 @@ namespace Microsoft.AspNet.RequestContainer httpContext.ApplicationServices = appServiceProvider; httpContext.RequestServices = scopeServiceProvider; - var priorAppHttpContext = appHttpContextAccessor.ExchangeValue(httpContext); - var priorScopeHttpContext = scopeHttpContextAccessor.ExchangeValue(httpContext); + var priorAppHttpContext = appHttpContextAccessor.SetValue(httpContext); + var priorScopeHttpContext = scopeHttpContextAccessor.SetValue(httpContext); try { @@ -102,8 +102,8 @@ namespace Microsoft.AspNet.RequestContainer } finally { - scopeHttpContextAccessor.ExchangeValue(priorScopeHttpContext); - appHttpContextAccessor.ExchangeValue(priorAppHttpContext); + scopeHttpContextAccessor.SetValue(priorScopeHttpContext); + appHttpContextAccessor.SetValue(priorAppHttpContext); httpContext.RequestServices = priorRequestServices; httpContext.ApplicationServices = priorApplicationServices; From 95667dba69756701ee9f31414883993f69c09acc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 1 May 2014 14:15:11 -0700 Subject: [PATCH 0133/1838] Remove unused filesystem dependencies. --- samples/KWebStartup/project.json | 2 -- src/Microsoft.AspNet.Hosting/project.json | 2 -- 2 files changed, 4 deletions(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index e7414d56e5..ab2f5706ee 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -17,8 +17,6 @@ "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", - "System.IO.FileSystem": "4.0.0.0", - "System.IO.FileSystem.Primitives": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Resources.ResourceManager": "4.0.0.0", diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 5181a9bdac..159032003b 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -18,8 +18,6 @@ "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.IO": "4.0.0.0", - "System.IO.FileSystem": "4.0.0.0", - "System.IO.FileSystem.Primitives": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Runtime": "4.0.20.0", From d8c68b61f034ed7531c9609b3c3e46b2b6a56c43 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 1 May 2014 14:15:28 -0700 Subject: [PATCH 0134/1838] Add missing namespace to the sample. --- samples/KWebStartup/Startup.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs index fc82494f77..3bc58d1ba1 100644 --- a/samples/KWebStartup/Startup.cs +++ b/samples/KWebStartup/Startup.cs @@ -1,3 +1,4 @@ +using Microsoft.AspNet; using Microsoft.AspNet.Abstractions; namespace KWebStartup From e645599aa61eb4b1e499dcd50f2cc2709c8db338 Mon Sep 17 00:00:00 2001 From: anpete Date: Thu, 1 May 2014 17:39:17 -0700 Subject: [PATCH 0135/1838] Update file headers --- samples/KWebStartup/Startup.cs | 17 +++++++++++++++++ .../Builder/BuilderFactory.cs | 19 ++++++++++++++++++- .../Builder/HttpContextFactory.cs | 17 +++++++++++++++++ .../Builder/IBuilderFactory.cs | 19 ++++++++++++++++++- .../Builder/IHttpContextFactory.cs | 19 ++++++++++++++++++- .../HostingContext.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 17 +++++++++++++++++ .../HostingServices.cs | 19 ++++++++++++++++++- .../IHostingEngine.cs | 19 ++++++++++++++++++- .../PipelineInstance.cs | 17 +++++++++++++++++ .../PlatformHelper.cs | 17 +++++++++++++++++ src/Microsoft.AspNet.Hosting/Program.cs | 19 ++++++++++++++++++- .../Server/IServerFactory.cs | 19 ++++++++++++++++++- .../Server/IServerManager.cs | 17 +++++++++++++++++ .../Server/ServerManager.cs | 17 +++++++++++++++++ .../Startup/IStartupLoader.cs | 17 +++++++++++++++++ .../Startup/IStartupLoaderProvider.cs | 17 +++++++++++++++++ .../Startup/IStartupManager.cs | 17 +++++++++++++++++ .../Startup/NullStartupLoader.cs | 17 +++++++++++++++++ .../Startup/StartupLoader.cs | 17 +++++++++++++++++ .../Startup/StartupLoaderProvider.cs | 17 +++++++++++++++++ .../Startup/StartupManager.cs | 17 +++++++++++++++++ src/Microsoft.AspNet.Hosting/Utilities.cs | 19 ++++++++++++++++++- .../WebApplication.cs | 19 ++++++++++++++++++- .../ContainerExtensions.cs | 19 ++++++++++++++++++- .../ContainerMiddleware.cs | 19 ++++++++++++++++++- .../RequestInformation.cs | 19 ++++++++++++++++++- .../ResponseInformation.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.TestHost/TestClient.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.TestHost/TestServer.cs | 19 ++++++++++++++++++- .../Fakes/FakeStartup.cs | 17 +++++++++++++++++ .../Fakes/FakeStartupWithServices.cs | 17 +++++++++++++++++ .../Fakes/IFakeStartupCallback.cs | 17 +++++++++++++++++ .../HostingEngineTests.cs | 19 ++++++++++++++++++- .../StartupManagerTests.cs | 19 ++++++++++++++++++- .../TestApplicationEnvironment.cs | 19 ++++++++++++++++++- .../TestClientTests.cs | 19 ++++++++++++++++++- .../TestServerTests.cs | 19 ++++++++++++++++++- 38 files changed, 667 insertions(+), 21 deletions(-) diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs index 3bc58d1ba1..003f957c97 100644 --- a/samples/KWebStartup/Startup.cs +++ b/samples/KWebStartup/Startup.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using Microsoft.AspNet; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs index bee42edcd3..8a19d56ed9 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.Hosting.Builder diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 18dc5a4341..d2e8ba071a 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Server; diff --git a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs index f69589727a..5f76b74b90 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs index 3db4473167..2cdcf30a75 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index b1d96a88e0..974c4783f4 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.Hosting.Server; diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index b04d02f65a..5346305db9 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Threading; using Microsoft.AspNet.DependencyInjection; diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 64f50b58ad..d196876873 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; diff --git a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs index 89195e69f4..324e9beba8 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index cc7580b713..b6bf92de86 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs index 2d2f0adeed..0581162444 100644 --- a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs +++ b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; namespace Microsoft.AspNet.Hosting diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index e8ce97b453..7c5585bbc6 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.IO; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 054e5e0308..cd8e42f28b 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.ConfigurationModel; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs index 5a6b6b9166..169ce54cf5 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Hosting.Server { public interface IServerManager diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index daa2eedcb7..45b902e8cc 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Linq; using System.Reflection; diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index 067e5a4ebe..2115a7e57d 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs index ad96af9793..3a2f9561c2 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupLoaderProvider diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs index 0d92e09a89..8f2a948b78 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs index e5e63c01f7..9a6e15ac3f 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 0f07be61b0..73a04b4abe 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs index a30cc50488..a5e962786e 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs index 41d68b03da..4f84d583fc 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.Hosting/Utilities.cs b/src/Microsoft.AspNet.Hosting/Utilities.cs index ae98ea538f..c1795d0ab1 100644 --- a/src/Microsoft.AspNet.Hosting/Utilities.cs +++ b/src/Microsoft.AspNet.Hosting/Utilities.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index f01c7dea23..df3d548e84 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 8648d8b220..0296824e4c 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Reflection; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 881d71ee0e..d72564f56c 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; #if NET45 using System.Runtime.Remoting.Messaging; #endif diff --git a/src/Microsoft.AspNet.TestHost/RequestInformation.cs b/src/Microsoft.AspNet.TestHost/RequestInformation.cs index eabfc0213a..cc1080ded0 100644 --- a/src/Microsoft.AspNet.TestHost/RequestInformation.cs +++ b/src/Microsoft.AspNet.TestHost/RequestInformation.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; diff --git a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs index 7000b081c5..17851b4c2e 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; diff --git a/src/Microsoft.AspNet.TestHost/TestClient.cs b/src/Microsoft.AspNet.TestHost/TestClient.cs index e5f5fb6778..576617337b 100644 --- a/src/Microsoft.AspNet.TestHost/TestClient.cs +++ b/src/Microsoft.AspNet.TestHost/TestClient.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using System.IO; diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 9256501426..0f5369578f 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Runtime.Versioning; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs index 255fcf1aef..9fa8ee9668 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs index ee8b28e3a5..22968394c5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs index 7fd7c9ba2b..708dac5281 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Hosting.Fakes { public interface IFakeStartupCallback diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index a7fbfc88f1..884aaba514 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index d2693d12a1..efd7e2763a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index 93fb40c3f5..4e8ea2fe94 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Runtime.Versioning; using Microsoft.Net.Runtime; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index b18dd0ccfa..e752b61e3b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Runtime.Versioning; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 62416f99f1..1c829edae6 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.IO; using System.Runtime.Versioning; using System.Threading.Tasks; From 35f921856f29c2c8adfda4871a0f1f58afeab16d Mon Sep 17 00:00:00 2001 From: anpete Date: Thu, 1 May 2014 17:39:31 -0700 Subject: [PATCH 0136/1838] Update file headers --- .../CookieOptions.cs | 19 ++++++++++++++++++- .../Extensions/MapExtensions.cs | 19 ++++++++++++++++++- .../Extensions/MapMiddleware.cs | 19 ++++++++++++++++++- .../Extensions/MapOptions.cs | 18 +++++++++++++++++- .../Extensions/MapWhenExtensions.cs | 19 ++++++++++++++++++- .../Extensions/MapWhenMiddleware.cs | 19 ++++++++++++++++++- .../Extensions/MapWhenOptions.cs | 19 ++++++++++++++++++- .../Extensions/RunExtensions.cs | 19 ++++++++++++++++++- .../Extensions/UseExtensions.cs | 19 ++++++++++++++++++- .../HostString.cs | 19 ++++++++++++++++++- .../HttpContext.cs | 17 +++++++++++++++++ .../HttpRequest.cs | 19 ++++++++++++++++++- .../HttpResponse.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Abstractions/IBuilder.cs | 17 +++++++++++++++++ .../IFormCollection.cs | 19 ++++++++++++++++++- .../IHeaderDictionary.cs | 19 ++++++++++++++++++- .../IReadableStringCollection.cs | 19 ++++++++++++++++++- .../IResponseCookies.cs | 18 +++++++++++++++++- .../IServerInformation.cs | 18 +++++++++++++++++- .../NotNullAttribute.cs | 19 ++++++++++++++++++- .../PathString.cs | 19 ++++++++++++++++++- .../QueryString.cs | 19 ++++++++++++++++++- .../RequestDelegate.cs | 17 +++++++++++++++++ .../Security/AuthenticateResult.cs | 17 ++++++++++++++++- .../Security/AuthenticationDescription.cs | 17 ++++++++++++++++- .../Security/AuthenticationProperties.cs | 17 ++++++++++++++++- .../FeatureCollection.cs | 19 ++++++++++++++++++- .../FeatureObject.cs | 19 ++++++++++++++++++- .../IFeatureCollection.cs | 19 ++++++++++++++++++- .../AssemblyNeutralAttribute.cs | 19 ++++++++++++++++++- .../IHttpApplicationInformation.cs | 17 +++++++++++++++++ .../IHttpBuffering.cs | 19 ++++++++++++++++++- .../IHttpConnection.cs | 17 +++++++++++++++++ .../IHttpRequestInformation.cs | 19 ++++++++++++++++++- .../IHttpRequestLifetime.cs | 19 ++++++++++++++++++- .../IHttpResponseInformation.cs | 19 ++++++++++++++++++- .../IHttpSendFile.cs | 17 +++++++++++++++++ .../IHttpTransportLayerSecurity.cs | 17 +++++++++++++++++ .../IHttpWebSocketAccept.cs | 17 +++++++++++++++++ .../Security/IAuthTypeContext.cs | 17 +++++++++++++++++ .../Security/IAuthenticateContext.cs | 17 +++++++++++++++++ .../Security/IAuthenticationHandler.cs | 19 ++++++++++++++++++- .../Security/IChallengeContext.cs | 17 +++++++++++++++++ .../Security/IHttpAuthentication.cs | 17 +++++++++++++++++ .../Security/ISignInContext.cs | 17 +++++++++++++++++ .../Security/ISignOutContext .cs | 17 +++++++++++++++++ .../ICanHasOwinEnvironment.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Owin/OwinConstants.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 19 ++++++++++++++++++- .../OwinFeatureCollection.cs | 19 ++++++++++++++++++- src/Microsoft.AspNet.PipelineCore/Builder.cs | 19 ++++++++++++++++++- .../Collections/FormCollection.cs | 19 ++++++++++++++++++- .../Collections/HeaderDictionary.cs | 19 ++++++++++++++++++- .../Collections/ItemsDictionary.cs | 19 ++++++++++++++++++- .../Collections/ReadableStringCollection.cs | 19 ++++++++++++++++++- .../Collections/RequestCookiesCollection.cs | 17 +++++++++++++++++ .../Collections/ResponseCookies.cs | 19 ++++++++++++++++++- .../DefaultCanHasForm.cs | 19 ++++++++++++++++++- .../DefaultCanHasItems.cs | 19 ++++++++++++++++++- .../DefaultCanHasQuery.cs | 19 ++++++++++++++++++- .../DefaultCanHasRequestCookies.cs | 19 ++++++++++++++++++- .../DefaultCanHasResponseCookies.cs | 19 ++++++++++++++++++- .../DefaultCanHasServiceProviders.cs | 19 ++++++++++++++++++- .../DefaultHttpContext.cs | 19 ++++++++++++++++++- .../DefaultHttpRequest.cs | 19 ++++++++++++++++++- .../DefaultHttpResponse.cs | 19 ++++++++++++++++++- .../ICanHasForm.cs | 19 ++++++++++++++++++- .../ICanHasItems.cs | 17 +++++++++++++++++ .../ICanHasQuery.cs | 17 +++++++++++++++++ .../ICanHasRequestCookies.cs | 19 ++++++++++++++++++- .../ICanHasResponseCookies.cs | 19 ++++++++++++++++++- .../ICanHasServiceProviders.cs | 19 ++++++++++++++++++- .../Infrastructure/Constants.cs | 17 ++++++++++++++++- .../Infrastructure/FeatureReference.cs | 19 ++++++++++++++++++- .../Infrastructure/ParsingHelpers.cs | 17 +++++++++++++++++ .../Security/AuthTypeContext.cs | 19 ++++++++++++++++++- .../Security/AuthenticateContext.cs | 19 ++++++++++++++++++- .../Security/ChallengeContext.cs | 19 ++++++++++++++++++- .../Security/DefaultHttpAuthentication.cs | 19 ++++++++++++++++++- .../Security/SignInContext.cs | 19 ++++++++++++++++++- .../Security/SignOutContext.cs | 19 ++++++++++++++++++- .../Fakes.cs | 18 +++++++++++++++++- .../MapPathMiddlewareTests.cs | 17 ++++++++++++++++- .../MapPredicateMiddlewareTests.cs | 17 ++++++++++++++++- .../PathStringTests.cs | 19 ++++++++++++++++++- .../IThing.cs | 19 ++++++++++++++++++- .../InterfaceDictionaryTests.cs | 19 ++++++++++++++++++- .../Properties/AssemblyInfo.cs | 17 +++++++++++++++++ .../Thing.cs | 19 ++++++++++++++++++- .../OwinEnvironmentTests.cs | 19 ++++++++++++++++++- .../OwinFeatureCollectionTests.cs | 19 ++++++++++++++++++- .../BuilderTests.cs | 19 ++++++++++++++++++- .../DefaultCanHasFormTests.cs | 19 ++++++++++++++++++- .../DefaultCanHasQueryTests.cs | 19 ++++++++++++++++++- .../DefaultHttpContextTests.cs | 19 ++++++++++++++++++- .../DefaultHttpRequestTests.cs | 19 ++++++++++++++++++- .../Properties/AssemblyInfo.cs | 17 +++++++++++++++++ 98 files changed, 1728 insertions(+), 78 deletions(-) diff --git a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs index c8505cae1b..b7c0690cdd 100644 --- a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Abstractions/CookieOptions.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; namespace Microsoft.AspNet.Abstractions @@ -34,7 +51,7 @@ namespace Microsoft.AspNet.Abstractions public DateTime? Expires { get; set; } /// - /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)that is, over HTTPS only. + /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)�that is, over HTTPS only. /// /// true to transmit the cookie only over an SSL connection (HTTPS); otherwise, false. public bool Secure { get; set; } diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs index 72aa61bc97..2ecaa2898f 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Extensions; diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs index 9a2905ab1b..d1bd14ecbb 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs @@ -1,4 +1,21 @@ -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions.Extensions { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs index 43b479cbc4..4a9dcf1c90 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Abstractions.Extensions { /// diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs index aaad90ae74..2c088737a9 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Extensions; diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs index 597fec36b0..02ed400c42 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs @@ -1,4 +1,21 @@ -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions.Extensions { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs index 380e69ba57..56bd141044 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions.Extensions diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs index b03f4d288f..ae4082221a 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs index 698b19ca5c..ed90dc1ec7 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Abstractions/HostString.cs index 0847c7421e..246553a1d5 100644 --- a/src/Microsoft.AspNet.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Abstractions/HostString.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Abstractions/HttpContext.cs index 81e44240c2..43690fe366 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs index b4f563464b..452c4600c8 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpRequest.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.IO; using System.Threading; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs index 28814c747b..3766e872c7 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Abstractions/HttpResponse.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Abstractions/IBuilder.cs index 13936e6773..7f913c4988 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Abstractions/IBuilder.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs index 56862e6be6..444436049a 100644 --- a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Abstractions/IFormCollection.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.Abstractions +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.Abstractions { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs index 7039b8b87e..8f38346e36 100644 --- a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs index dc3f72c769..4aeb854c30 100644 --- a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs index 4358ad69ce..00a44ccaf0 100644 --- a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Abstractions { /// diff --git a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs index 47784e3782..5db85fd9cf 100644 --- a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs +++ b/src/Microsoft.AspNet.Abstractions/IServerInformation.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + namespace Microsoft.AspNet.Abstractions { // TODO: [AssemblyNeutral] diff --git a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs index 4a342de834..972c2e4aef 100644 --- a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.Abstractions { diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Abstractions/PathString.cs index 07c6de5446..b722e8baee 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Abstractions/PathString.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Linq; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Abstractions/QueryString.cs index 5109294bb6..1188530052 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Abstractions/QueryString.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.Abstractions { diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs index 235b430713..951c668d9a 100644 --- a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Threading.Tasks; namespace Microsoft.AspNet.Abstractions diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs index 2fdc1ae241..812895a631 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs index 3c6f9a7994..8d3ad0c293 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs index 7eb707420b..cc793057d0 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 00d2a38e4f..96ce5a4a19 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Reflection; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index d937d09dc5..28028821cf 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Reflection; diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs index af70e6c2d7..220294ee88 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; namespace Microsoft.AspNet.FeatureModel diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs index 1aa358ee9f..7282be839b 100644 --- a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.Net.Runtime { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs index 92100273e2..23292385c1 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Threading; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs index 5a996c4299..815eeb7740 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs @@ -1,4 +1,21 @@ -using Microsoft.Net.Runtime; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs index 73a76ffbf0..6678d7ca62 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Net; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs index b223d151e4..dbeaa70c48 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs index 41728c5869..8a242f4033 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs @@ -1,4 +1,21 @@ -using System.Threading; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading; using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs index 090c0f9107..282fed1705 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs index faeed5f775..2b59f99714 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Threading; using System.Threading.Tasks; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs index e759aef2b9..ace42ab0ea 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs index 772dd96f32..d13021e330 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + #if NET45 using System.Net.WebSockets; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index df9e9b4aca..13033b5f82 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index dc26a4eeaf..d230f16764 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using System.Security.Claims; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index efc3a3b344..942caa29a2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index d684fe7542..873ee856d9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs index 0d24c184f7..e3eefb18a2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Security.Claims; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index 0a57985f62..d83e224bb4 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using System.Security.Claims; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 6a27a9e5ea..0a98bdbac8 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs index 49218e1115..45aa526a84 100644 --- a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index a54f04cccf..968c618000 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.Owin +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.Owin { internal static class OwinConstants { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 157d98ba86..15119e747d 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Globalization; diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index f96b6300c9..05078d6c8e 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 8dc7f3422f..be06f137d8 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using System.IO; diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 7f4093b7bc..2b775fc4c3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index 7054d36350..7a9c41cbc3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index 8847fa66fc..620fddd26b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using System.Linq; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index 5f4abca7c0..22e26e112c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -1,4 +1,21 @@ -using System.Collections; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index f06a8aa5a0..b8e70872df 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Abstractions.Infrastructure; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 40445bb31d..c2959cbe1d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 9963a7373f..f70ef385cf 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using System.Linq; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs index d7547eab2a..6b4a6143bc 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs @@ -1,4 +1,21 @@ -using System.IO; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs index 13513d3653..fdf10565b0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs index 9a3e45e5fb..2c53a4ceb2 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs index 5aff939af5..b935db4cca 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.Abstractions.Infrastructure; using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs index b695832694..99bcb5d6f9 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs index 58ccd6565d..f768aaa565 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 539319b868..1913a4fa07 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index b091197a70..f9bd84289b 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Globalization; using System.IO; using System.Threading; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 0b6fe2c349..bb125bd88e 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs index aba500a592..0003e6a773 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs @@ -1,4 +1,21 @@ -using System.Threading.Tasks; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Threading.Tasks; using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs index d1adbf6030..59be854c23 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs index 570ef1c2d2..af2e66ce45 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs index 8bc138fbf5..976e2bdd99 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs index 87f0ecc87e..739f71a36a 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs index 77befcf990..17507634e8 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index cc92a10786..374c1af87d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. namespace Microsoft.AspNet.Abstractions.Infrastructure { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index ed76942784..cbcacc51d4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.FeatureModel; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.PipelineCore.Infrastructure { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 5f3f4f5bdb..a750fe5359 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index f4632607a4..dcefd97e6e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using Microsoft.AspNet.Abstractions.Security; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 9fa561372a..2ed6579ad8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index ed43ee31e2..103072565e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs index 519b1a6c5e..aef823d267 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs @@ -1,4 +1,21 @@ -using System.Security.Claims; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 690388dcc8..d211615e04 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 2d2814cd02..c24c41ac53 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using Microsoft.AspNet.HttpFeature.Security; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs index 0d4553e08a..225235c0ab 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs @@ -1,4 +1,20 @@ - +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System; using System.Collections.Generic; using System.IO; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs index c6f8912747..5bc4f85ec9 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 689d30ab76..ad4223f9de 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -1,4 +1,19 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs index 02ac73736d..171fa1caca 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Testing; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Testing; using Xunit; namespace Microsoft.AspNet.Abstractions diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs index 0a4a213540..1fb06e09b5 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.FeatureModel.Tests +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.FeatureModel.Tests { public interface IThing { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index a8f005ee07..97d36f5d35 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using Xunit; namespace Microsoft.AspNet.FeatureModel.Tests diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index 8beefe2634..2494fa2308 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs index c99a8b1909..4144a0482c 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -1,4 +1,21 @@ -namespace Microsoft.AspNet.FeatureModel.Tests +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.FeatureModel.Tests { public class Thing : IThing { diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index e84926c2f6..69737309a9 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index d6476c0a8a..b3bb3f68f4 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -1,4 +1,21 @@ -using System.Collections.Generic; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 4541585c1d..13044c0a29 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.Abstractions; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Abstractions; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs index 967839793d..9d029071f2 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs @@ -1,4 +1,21 @@ -using System.IO; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs index 5bef67e18d..55e02e7560 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs @@ -1,4 +1,21 @@ -using Microsoft.AspNet.FeatureModel; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 6701e62863..db800a6fff 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 801f4fb3a2..c78982b0df 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,4 +1,21 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Abstractions; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs index ca7eab6695..1679842ad2 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs @@ -1,3 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; From ae3f7846f4b4dcfc9e83e503fe606e9529a6cf08 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 2 May 2014 14:45:20 -0700 Subject: [PATCH 0137/1838] Updating build scripts --- .gitignore | 1 + build.cmd | 3 +++ 2 files changed, 4 insertions(+) diff --git a/.gitignore b/.gitignore index 8bc217058d..aba9c594d7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ PublishProfiles/ _ReSharper.* nuget.exe *net45.csproj +*net451.csproj *k10.csproj *.psess *.vsp diff --git a/build.cmd b/build.cmd index 7045ee1f84..2c32132fa3 100644 --- a/build.cmd +++ b/build.cmd @@ -18,6 +18,9 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion +CALL packages\KoreBuild\build\kvm install -svr50 -x86 +CALL packages\KoreBuild\build\kvm install -svrc50 -x86 :run +CALL packages\KoreBuild\build\kvm use default -svr50 -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From 1a75e932150c14c3e4717dae92d89b79fdb7356b Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 2 May 2014 14:45:23 -0700 Subject: [PATCH 0138/1838] Updating build scripts --- .gitignore | 1 + build.cmd | 3 +++ build.sh | 30 ++++++++++++++++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 build.sh diff --git a/.gitignore b/.gitignore index 8bc217058d..aba9c594d7 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ PublishProfiles/ _ReSharper.* nuget.exe *net45.csproj +*net451.csproj *k10.csproj *.psess *.vsp diff --git a/build.cmd b/build.cmd index 7045ee1f84..2c32132fa3 100644 --- a/build.cmd +++ b/build.cmd @@ -18,6 +18,9 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion +CALL packages\KoreBuild\build\kvm install -svr50 -x86 +CALL packages\KoreBuild\build\kvm install -svrc50 -x86 :run +CALL packages\KoreBuild\build\kvm use default -svr50 -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh new file mode 100644 index 0000000000..db1e0c3dde --- /dev/null +++ b/build.sh @@ -0,0 +1,30 @@ +#!/bin/sh + +if test `uname` = Darwin; then + cachedir=~/Library/Caches/KBuild +else + if x$XDG_DATA_HOME = x; then + cachedir=$HOME/.local/share + else + cachedir=$XDG_DATA_HOME; + fi +fi +mkdir -p $cachedir + +url=https://www.nuget.org/nuget.exe + +if test ! -f $cachedir/nuget.exe; then + wget -o $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null +fi + +if test ! -e .nuget; then + mkdir .nuget + cp $cachedir/nuget.exe .nuget +fi + +if test ! -d packages/KoreBuild; then + mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion +fi + +mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file From 73a8194005f5ef1fb800d8b7e953b765ce6492fa Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 2 May 2014 15:07:35 -0700 Subject: [PATCH 0139/1838] Updating build scripts --- build.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 2c32132fa3..903d532df3 100644 --- a/build.cmd +++ b/build.cmd @@ -18,8 +18,8 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -CALL packages\KoreBuild\build\kvm install -svr50 -x86 -CALL packages\KoreBuild\build\kvm install -svrc50 -x86 +CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 +CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 :run CALL packages\KoreBuild\build\kvm use default -svr50 -x86 From 0e56ed4f3482de255c34c0766eabcb4cc040188f Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 2 May 2014 15:07:38 -0700 Subject: [PATCH 0140/1838] Updating build scripts --- build.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 2c32132fa3..903d532df3 100644 --- a/build.cmd +++ b/build.cmd @@ -18,8 +18,8 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -CALL packages\KoreBuild\build\kvm install -svr50 -x86 -CALL packages\KoreBuild\build\kvm install -svrc50 -x86 +CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 +CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 :run CALL packages\KoreBuild\build\kvm use default -svr50 -x86 From f11e62d0ef4c44a27190bc11f905de4e263816a6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 10:20:46 -0700 Subject: [PATCH 0141/1838] Update reflection dependency. --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 7d3092564d..8fda7d4cff 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -8,7 +8,7 @@ "System.Collections": "4.0.0.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", - "System.Reflection.Compatibility": "4.0.0.0", + "System.Reflection.TypeExtensions": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", "System.Threading": "4.0.0.0" From 7fd80850eef4852b714eaf89a7286c066069bddd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 14:33:41 -0700 Subject: [PATCH 0142/1838] Rename all feature interfaces to I*Feature. --- ...ormation.cs => IHttpApplicationFeature.cs} | 2 +- ...pBuffering.cs => IHttpBufferingFeature.cs} | 2 +- ...onnection.cs => IHttpConnectionFeature.cs} | 2 +- ...tInformation.cs => IHttpRequestFeature.cs} | 8 +-- ...time.cs => IHttpRequestLifetimeFeature.cs} | 2 +- ...Information.cs => IHttpResponseFeature.cs} | 2 +- ...ttpSendFile.cs => IHttpSendFileFeature.cs} | 2 +- ... => IHttpTransportLayerSecurityFeature.cs} | 2 +- ...cketAccept.cs => IHttpWebSocketFeature.cs} | 2 +- .../Microsoft.AspNet.HttpFeature.kproj | 21 +++--- ...ation.cs => IHttpAuthenticationFeature.cs} | 2 +- ...ironment.cs => IOwinEnvironmentFeature.cs} | 2 +- .../Microsoft.AspNet.Owin.kproj | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 42 +++++------ src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- .../OwinFeatureCollection.cs | 72 +++++++++---------- .../DefaultHttpContext.cs | 54 +++++++------- .../DefaultHttpRequest.cs | 66 ++++++++--------- .../DefaultHttpResponse.cs | 46 ++++++------ .../{DefaultCanHasForm.cs => FormFeature.cs} | 6 +- .../{ICanHasForm.cs => IFormFeature.cs} | 2 +- .../{ICanHasItems.cs => IItemsFeature.cs} | 2 +- .../{ICanHasQuery.cs => IQueryFeature.cs} | 2 +- ...stCookies.cs => IRequestCookiesFeature.cs} | 2 +- ...eCookies.cs => IResponseCookiesFeature.cs} | 2 +- ...oviders.cs => IServiceProvidersFeature.cs} | 2 +- ...{DefaultCanHasItems.cs => ItemsFeature.cs} | 4 +- .../Microsoft.AspNet.PipelineCore.kproj | 26 +++---- ...{DefaultCanHasQuery.cs => QueryFeature.cs} | 6 +- ...estCookies.cs => RequestCookiesFeature.cs} | 6 +- ...seCookies.cs => ResponseCookiesFeature.cs} | 6 +- ...cation.cs => HttpAuthenticationFeature.cs} | 4 +- ...roviders.cs => ServiceProvidersFeature.cs} | 2 +- .../Fakes.cs | 4 +- .../MapPathMiddlewareTests.cs | 4 +- .../MapPredicateMiddlewareTests.cs | 4 +- .../OwinEnvironmentTests.cs | 10 +-- .../OwinFeatureCollectionTests.cs | 6 +- .../DefaultHttpContextTests.cs | 4 +- .../DefaultHttpRequestTests.cs | 4 +- ...CanHasFormTests.cs => FormFeatureTests.cs} | 14 ++-- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 4 +- ...nHasQueryTests.cs => QueryFeatureTests.cs} | 8 +-- 43 files changed, 231 insertions(+), 236 deletions(-) rename src/Microsoft.AspNet.HttpFeature/{IHttpApplicationInformation.cs => IHttpApplicationFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpBuffering.cs => IHttpBufferingFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpConnection.cs => IHttpConnectionFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpRequestInformation.cs => IHttpRequestFeature.cs} (89%) rename src/Microsoft.AspNet.HttpFeature/{IHttpRequestLifetime.cs => IHttpRequestLifetimeFeature.cs} (94%) rename src/Microsoft.AspNet.HttpFeature/{IHttpResponseInformation.cs => IHttpResponseFeature.cs} (96%) rename src/Microsoft.AspNet.HttpFeature/{IHttpSendFile.cs => IHttpSendFileFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/{IHttpTransportLayerSecurity.cs => IHttpTransportLayerSecurityFeature.cs} (94%) rename src/Microsoft.AspNet.HttpFeature/{IHttpWebSocketAccept.cs => IHttpWebSocketFeature.cs} (95%) rename src/Microsoft.AspNet.HttpFeature/Security/{IHttpAuthentication.cs => IHttpAuthenticationFeature.cs} (95%) rename src/Microsoft.AspNet.Owin/{ICanHasOwinEnvironment.cs => IOwinEnvironmentFeature.cs} (94%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasForm.cs => FormFeature.cs} (89%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasForm.cs => IFormFeature.cs} (96%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasItems.cs => IItemsFeature.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasQuery.cs => IQueryFeature.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasRequestCookies.cs => IRequestCookiesFeature.cs} (94%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasResponseCookies.cs => IResponseCookiesFeature.cs} (95%) rename src/Microsoft.AspNet.PipelineCore/{ICanHasServiceProviders.cs => IServiceProvidersFeature.cs} (94%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasItems.cs => ItemsFeature.cs} (91%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasQuery.cs => QueryFeature.cs} (87%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasRequestCookies.cs => RequestCookiesFeature.cs} (88%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasResponseCookies.cs => ResponseCookiesFeature.cs} (84%) rename src/Microsoft.AspNet.PipelineCore/Security/{DefaultHttpAuthentication.cs => HttpAuthenticationFeature.cs} (90%) rename src/Microsoft.AspNet.PipelineCore/{DefaultCanHasServiceProviders.cs => ServiceProvidersFeature.cs} (92%) rename test/Microsoft.AspNet.PipelineCore.Tests/{DefaultCanHasFormTests.cs => FormFeatureTests.cs} (88%) rename test/Microsoft.AspNet.PipelineCore.Tests/{DefaultCanHasQueryTests.cs => QueryFeatureTests.cs} (87%) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs index 23292385c1..218b8732f6 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpApplicationInformation + public interface IHttpApplicationFeature { string AppName { get; set; } string AppMode { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs index 815eeb7740..84c9f5b885 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBuffering.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs @@ -20,7 +20,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpBuffering + public interface IHttpBufferingFeature { void DisableRequestBuffering(); void DisableResponseBuffering(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs index 6678d7ca62..1cb3cc12fa 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnection.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpConnection + public interface IHttpConnectionFeature { IPAddress RemoteIpAddress { get; set; } IPAddress LocalIpAddress { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs index dbeaa70c48..cad2c7ccf0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs @@ -23,7 +23,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpRequestInformation + public interface IHttpRequestFeature { string Protocol { get; set; } string Scheme { get; set; } @@ -33,11 +33,5 @@ namespace Microsoft.AspNet.HttpFeature string QueryString { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } - // FURI: Uri Uri { get; } - } - - public interface ICanHasSession - { - } } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs similarity index 94% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index 8a242f4033..19956ea09f 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetime.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpRequestLifetime + public interface IHttpRequestLifetimeFeature { CancellationToken OnRequestAborted { get; } void Abort(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs similarity index 96% rename from src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index 282fed1705..afd1cdebca 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseInformation.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -23,7 +23,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpResponseInformation + public interface IHttpResponseFeature { int StatusCode { get; set; } string ReasonPhrase { get; set; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs index 2b59f99714..f53ca06c07 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFile.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs @@ -22,7 +22,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpSendFile + public interface IHttpSendFileFeature { Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs similarity index 94% rename from src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs index ace42ab0ea..8e7f9a5f1b 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurity.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs @@ -22,7 +22,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpTransportLayerSecurity + public interface IHttpTransportLayerSecurityFeature { X509Certificate ClientCertificate { get; set; } Task LoadAsync(); diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index d13021e330..8b2013652f 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketAccept.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -23,7 +23,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpWebSocketAccept + public interface IHttpWebSocketFeature { bool IsWebSocketRequest { get; set; } Task AcceptAsync(); diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 96973626c9..2fef2807ae 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -20,20 +20,21 @@ - - - - - - - - - + + + + + + + + + + - + diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs rename to src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs index e3eefb18a2..b18bd0ea3f 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthentication.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs @@ -21,7 +21,7 @@ using Microsoft.Net.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { [AssemblyNeutral] - public interface IHttpAuthentication + public interface IHttpAuthenticationFeature { ClaimsPrincipal User { get; set; } IAuthenticationHandler Handler { get; set; } diff --git a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs rename to src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs index 45aa526a84..45455159e3 100644 --- a/src/Microsoft.AspNet.Owin/ICanHasOwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs @@ -19,7 +19,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Owin { - public interface ICanHasOwinEnvironment + public interface IOwinEnvironmentFeature { IDictionary Environment { get; set; } } diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 210e9491a3..37d5045224 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -20,7 +20,7 @@ - + diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 15119e747d..5ad850ead3 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -42,41 +42,41 @@ namespace Microsoft.AspNet.Owin _context = context; _entries = new Dictionary() { - { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, - { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, - { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, - { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, - { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, - { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, + { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, + { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, + { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, + { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, - { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, - { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, + { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, + { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, - { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), + { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, - { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), + { OwinConstants.CommonKeys.RemotePort, new FeatureMap(feature => feature.RemotePort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.RemotePort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, - { OwinConstants.CommonKeys.LocalIpAddress, new FeatureMap(feature => feature.LocalIpAddress.ToString(), + { OwinConstants.CommonKeys.LocalIpAddress, new FeatureMap(feature => feature.LocalIpAddress.ToString(), (feature, value) => feature.LocalIpAddress = IPAddress.Parse(Convert.ToString(value))) }, - { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), + { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), (feature, value) => feature.RemoteIpAddress = IPAddress.Parse(Convert.ToString(value))) }, - { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, + { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, - { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, + { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, }; if (context.Request.IsSecure) { - _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 05078d6c8e..4a4d80d177 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -83,7 +83,7 @@ namespace Microsoft.AspNet { var app = middleware(httpContext => { - return next(httpContext.GetFeature().Environment); + return next(httpContext.GetFeature().Environment); }); return env => diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index be06f137d8..4c6483ffcb 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -34,12 +34,12 @@ namespace Microsoft.AspNet.Owin public class OwinFeatureCollection : IFeatureCollection, - IHttpRequestInformation, - IHttpResponseInformation, - IHttpConnection, - IHttpSendFile, - IHttpTransportLayerSecurity, - ICanHasOwinEnvironment + IHttpRequestFeature, + IHttpResponseFeature, + IHttpConnectionFeature, + IHttpSendFileFeature, + IHttpTransportLayerSecurityFeature, + IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -63,79 +63,79 @@ namespace Microsoft.AspNet.Owin Environment[key] = value; } - string IHttpRequestInformation.Protocol + string IHttpRequestFeature.Protocol { get { return Prop(OwinConstants.RequestProtocol); } set { Prop(OwinConstants.RequestProtocol, value); } } - string IHttpRequestInformation.Scheme + string IHttpRequestFeature.Scheme { get { return Prop(OwinConstants.RequestScheme); } set { Prop(OwinConstants.RequestScheme, value); } } - string IHttpRequestInformation.Method + string IHttpRequestFeature.Method { get { return Prop(OwinConstants.RequestMethod); } set { Prop(OwinConstants.RequestMethod, value); } } - string IHttpRequestInformation.PathBase + string IHttpRequestFeature.PathBase { get { return Prop(OwinConstants.RequestPathBase); } set { Prop(OwinConstants.RequestPathBase, value); } } - string IHttpRequestInformation.Path + string IHttpRequestFeature.Path { get { return Prop(OwinConstants.RequestPath); } set { Prop(OwinConstants.RequestPath, value); } } - string IHttpRequestInformation.QueryString + string IHttpRequestFeature.QueryString { get { return Prop(OwinConstants.RequestQueryString); } set { Prop(OwinConstants.RequestQueryString, value); } } - IDictionary IHttpRequestInformation.Headers + IDictionary IHttpRequestFeature.Headers { get { return Prop>(OwinConstants.RequestHeaders); } set { Prop(OwinConstants.RequestHeaders, value); } } - Stream IHttpRequestInformation.Body + Stream IHttpRequestFeature.Body { get { return Prop(OwinConstants.RequestBody); } set { Prop(OwinConstants.RequestBody, value); } } - int IHttpResponseInformation.StatusCode + int IHttpResponseFeature.StatusCode { get { return Prop(OwinConstants.ResponseStatusCode); } set { Prop(OwinConstants.ResponseStatusCode, value); } } - string IHttpResponseInformation.ReasonPhrase + string IHttpResponseFeature.ReasonPhrase { get { return Prop(OwinConstants.ResponseReasonPhrase); } set { Prop(OwinConstants.ResponseReasonPhrase, value); } } - IDictionary IHttpResponseInformation.Headers + IDictionary IHttpResponseFeature.Headers { get { return Prop>(OwinConstants.ResponseHeaders); } set { Prop(OwinConstants.ResponseHeaders, value); } } - Stream IHttpResponseInformation.Body + Stream IHttpResponseFeature.Body { get { return Prop(OwinConstants.ResponseBody); } set { Prop(OwinConstants.ResponseBody, value); } } - void IHttpResponseInformation.OnSendingHeaders(Action callback, object state) + void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); if (register == null) @@ -145,31 +145,31 @@ namespace Microsoft.AspNet.Owin register(callback, state); } - IPAddress IHttpConnection.RemoteIpAddress + IPAddress IHttpConnectionFeature.RemoteIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } set { Prop(OwinConstants.CommonKeys.RemoteIpAddress, value.ToString()); } } - IPAddress IHttpConnection.LocalIpAddress + IPAddress IHttpConnectionFeature.LocalIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.LocalIpAddress)); } set { Prop(OwinConstants.CommonKeys.LocalIpAddress, value.ToString()); } } - int IHttpConnection.RemotePort + int IHttpConnectionFeature.RemotePort { get { return int.Parse(Prop(OwinConstants.CommonKeys.RemotePort)); } set { Prop(OwinConstants.CommonKeys.RemotePort, value.ToString(CultureInfo.InvariantCulture)); } } - int IHttpConnection.LocalPort + int IHttpConnectionFeature.LocalPort { get { return int.Parse(Prop(OwinConstants.CommonKeys.LocalPort)); } set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } } - bool IHttpConnection.IsLocal + bool IHttpConnectionFeature.IsLocal { get { return Prop(OwinConstants.CommonKeys.IsLocal); } set { Prop(OwinConstants.CommonKeys.LocalPort, value); } @@ -184,7 +184,7 @@ namespace Microsoft.AspNet.Owin } } - Task IHttpSendFile.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + Task IHttpSendFileFeature.SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) { object obj; if (Environment.TryGetValue(OwinConstants.SendFiles.SendAsync, out obj)) @@ -200,7 +200,7 @@ namespace Microsoft.AspNet.Owin get { object obj; - if (string.Equals("https", ((IHttpRequestInformation)this).Scheme, StringComparison.OrdinalIgnoreCase) + if (string.Equals("https", ((IHttpRequestFeature)this).Scheme, StringComparison.OrdinalIgnoreCase) && (Environment.TryGetValue(OwinConstants.CommonKeys.LoadClientCertAsync, out obj) || Environment.TryGetValue(OwinConstants.CommonKeys.ClientCertificate, out obj)) && obj != null) @@ -211,13 +211,13 @@ namespace Microsoft.AspNet.Owin } } - X509Certificate IHttpTransportLayerSecurity.ClientCertificate + X509Certificate IHttpTransportLayerSecurityFeature.ClientCertificate { get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpTransportLayerSecurity.LoadAsync() + Task IHttpTransportLayerSecurityFeature.LoadAsync() { throw new NotImplementedException(); } @@ -238,11 +238,11 @@ namespace Microsoft.AspNet.Owin if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) { // Check for conditional features - if (key == typeof(IHttpSendFile)) + if (key == typeof(IHttpSendFileFeature)) { return SupportsSendFile; } - else if (key == typeof(IHttpTransportLayerSecurity)) + else if (key == typeof(IHttpTransportLayerSecurityFeature)) { return SupportsClientCerts; } @@ -259,18 +259,18 @@ namespace Microsoft.AspNet.Owin { var keys = new List() { - typeof(IHttpRequestInformation), - typeof(IHttpResponseInformation), - typeof(IHttpConnection), - typeof(ICanHasOwinEnvironment), + typeof(IHttpRequestFeature), + typeof(IHttpResponseFeature), + typeof(IHttpConnectionFeature), + typeof(IOwinEnvironmentFeature), }; if (SupportsSendFile) { - keys.Add(typeof(IHttpSendFile)); + keys.Add(typeof(IHttpSendFileFeature)); } if (SupportsClientCerts) { - keys.Add(typeof(IHttpTransportLayerSecurity)); + keys.Add(typeof(IHttpTransportLayerSecurityFeature)); } return keys; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 1913a4fa07..ad4f3902a9 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -36,10 +36,10 @@ namespace Microsoft.AspNet.PipelineCore private readonly HttpRequest _request; private readonly HttpResponse _response; - private FeatureReference _canHasItems; - private FeatureReference _canHasServiceProviders; - private FeatureReference _authentication; - private FeatureReference _lifetime; + private FeatureReference _items; + private FeatureReference _serviceProviders; + private FeatureReference _authentication; + private FeatureReference _lifetime; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -48,27 +48,27 @@ namespace Microsoft.AspNet.PipelineCore _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _canHasItems = FeatureReference.Default; - _canHasServiceProviders = FeatureReference.Default; - _authentication = FeatureReference.Default; + _items = FeatureReference.Default; + _serviceProviders = FeatureReference.Default; + _authentication = FeatureReference.Default; } - ICanHasItems CanHasItems + IItemsFeature ItemsFeature { - get { return _canHasItems.Fetch(_features) ?? _canHasItems.Update(_features, new DefaultCanHasItems()); } + get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); } } - ICanHasServiceProviders CanHasServiceProviders + IServiceProvidersFeature ServiceProvidersFeature { - get { return _canHasServiceProviders.Fetch(_features) ?? _canHasServiceProviders.Update(_features, new DefaultCanHasServiceProviders()); } + get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); } } - private IHttpAuthentication HttpAuthentication + private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } } - private IHttpRequestLifetime Lifetime + private IHttpRequestLifetimeFeature LifetimeFeature { get { return _lifetime.Fetch(_features); } } @@ -81,32 +81,32 @@ namespace Microsoft.AspNet.PipelineCore { get { - var user = HttpAuthentication.User; + var user = HttpAuthenticationFeature.User; if (user == null) { user = new ClaimsPrincipal(new ClaimsIdentity()); - HttpAuthentication.User = user; + HttpAuthenticationFeature.User = user; } return user; } - set { HttpAuthentication.User = value; } + set { HttpAuthenticationFeature.User = value; } } public override IDictionary Items { - get { return CanHasItems.Items; } + get { return ItemsFeature.Items; } } public override IServiceProvider ApplicationServices { - get { return CanHasServiceProviders.ApplicationServices; } - set { CanHasServiceProviders.ApplicationServices = value; } + get { return ServiceProvidersFeature.ApplicationServices; } + set { ServiceProvidersFeature.ApplicationServices = value; } } public override IServiceProvider RequestServices { - get { return CanHasServiceProviders.RequestServices; } - set { CanHasServiceProviders.RequestServices = value; } + get { return ServiceProvidersFeature.RequestServices; } + set { ServiceProvidersFeature.RequestServices = value; } } public int Revision { get { return _features.Revision; } } @@ -115,7 +115,7 @@ namespace Microsoft.AspNet.PipelineCore { get { - var lifetime = Lifetime; + var lifetime = LifetimeFeature; if (lifetime != null) { return lifetime.OnRequestAborted; @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.PipelineCore public override void Abort() { - var lifetime = Lifetime; + var lifetime = LifetimeFeature; if (lifetime != null) { lifetime.Abort(); @@ -152,7 +152,7 @@ namespace Microsoft.AspNet.PipelineCore public override IEnumerable GetAuthenticationTypes() { - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; if (handler == null) { return new AuthenticationDescription[0]; @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); if (handler != null) @@ -193,7 +193,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); if (handler != null) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index f9bd84289b..602f6bebfb 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -34,12 +34,12 @@ namespace Microsoft.AspNet.PipelineCore private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; - private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _transportLayerSecurity = FeatureReference.Default; - private FeatureReference _canHasQuery = FeatureReference.Default; - private FeatureReference _canHasForm = FeatureReference.Default; - private FeatureReference _canHasCookies = FeatureReference.Default; + private FeatureReference _request = FeatureReference.Default; + private FeatureReference _connection = FeatureReference.Default; + private FeatureReference _transportLayerSecurity = FeatureReference.Default; + private FeatureReference _query = FeatureReference.Default; + private FeatureReference _form = FeatureReference.Default; + private FeatureReference _cookies = FeatureReference.Default; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { @@ -47,54 +47,54 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - private IHttpRequestInformation HttpRequestInformation + private IHttpRequestFeature HttpRequestFeature { get { return _request.Fetch(_features); } } - private IHttpConnection HttpConnection + private IHttpConnectionFeature HttpConnectionFeature { get { return _connection.Fetch(_features); } } - private IHttpTransportLayerSecurity HttpTransportLayerSecurity + private IHttpTransportLayerSecurityFeature HttpTransportLayerSecurityFeature { get { return _transportLayerSecurity.Fetch(_features); } } - private ICanHasQuery CanHasQuery + private IQueryFeature QueryFeature { - get { return _canHasQuery.Fetch(_features) ?? _canHasQuery.Update(_features, new DefaultCanHasQuery(_features)); } + get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); } } - private ICanHasForm CanHasForm + private IFormFeature FormFeature { - get { return _canHasForm.Fetch(_features) ?? _canHasForm.Update(_features, new DefaultCanHasForm(_features)); } + get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(_features)); } } - private ICanHasRequestCookies CanHasRequestCookies + private IRequestCookiesFeature RequestCookiesFeature { - get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasRequestCookies(_features)); } + get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); } } public override HttpContext HttpContext { get { return _context; } } public override PathString PathBase { - get { return new PathString(HttpRequestInformation.PathBase); } - set { HttpRequestInformation.PathBase = value.Value; } + get { return new PathString(HttpRequestFeature.PathBase); } + set { HttpRequestFeature.PathBase = value.Value; } } public override PathString Path { - get { return new PathString(HttpRequestInformation.Path); } - set { HttpRequestInformation.Path = value.Value; } + get { return new PathString(HttpRequestFeature.Path); } + set { HttpRequestFeature.Path = value.Value; } } public override QueryString QueryString { - get { return new QueryString(HttpRequestInformation.QueryString); } - set { HttpRequestInformation.QueryString = value.Value; } + get { return new QueryString(HttpRequestFeature.QueryString); } + set { HttpRequestFeature.QueryString = value.Value; } } public override long? ContentLength @@ -111,20 +111,20 @@ namespace Microsoft.AspNet.PipelineCore public override Stream Body { - get { return HttpRequestInformation.Body; } - set { HttpRequestInformation.Body = value; } + get { return HttpRequestFeature.Body; } + set { HttpRequestFeature.Body = value; } } public override string Method { - get { return HttpRequestInformation.Method; } - set { HttpRequestInformation.Method = value; } + get { return HttpRequestFeature.Method; } + set { HttpRequestFeature.Method = value; } } public override string Scheme { - get { return HttpRequestInformation.Scheme; } - set { HttpRequestInformation.Scheme = value; } + get { return HttpRequestFeature.Scheme; } + set { HttpRequestFeature.Scheme = value; } } public override bool IsSecure @@ -140,28 +140,28 @@ namespace Microsoft.AspNet.PipelineCore public override IReadableStringCollection Query { - get { return CanHasQuery.Query; } + get { return QueryFeature.Query; } } public override Task GetFormAsync() { - return CanHasForm.GetFormAsync(); + return FormFeature.GetFormAsync(); } public override string Protocol { - get { return HttpRequestInformation.Protocol; } - set { HttpRequestInformation.Protocol = value; } + get { return HttpRequestFeature.Protocol; } + set { HttpRequestFeature.Protocol = value; } } public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpRequestInformation.Headers); } + get { return new HeaderDictionary(HttpRequestFeature.Headers); } } public override IReadableStringCollection Cookies { - get { return CanHasRequestCookies.Cookies; } + get { return RequestCookiesFeature.Cookies; } } public override System.Threading.CancellationToken CallCanceled diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index bb125bd88e..7075b69663 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -38,9 +38,9 @@ namespace Microsoft.AspNet.PipelineCore { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _response = FeatureReference.Default; - private FeatureReference _canHasCookies = FeatureReference.Default; - private FeatureReference _authentication = FeatureReference.Default; + private FeatureReference _response = FeatureReference.Default; + private FeatureReference _cookies = FeatureReference.Default; + private FeatureReference _authentication = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -48,38 +48,38 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - private IHttpResponseInformation HttpResponseInformation + private IHttpResponseFeature HttpResponseFeature { get { return _response.Fetch(_features); } } - private ICanHasResponseCookies CanHasResponseCookies + private IResponseCookiesFeature ResponseCookiesFeature { - get { return _canHasCookies.Fetch(_features) ?? _canHasCookies.Update(_features, new DefaultCanHasResponseCookies(_features)); } + get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); } } - private IHttpAuthentication HttpAuthentication + private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new DefaultHttpAuthentication()); } + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } } public override HttpContext HttpContext { get { return _context; } } public override int StatusCode { - get { return HttpResponseInformation.StatusCode; } - set { HttpResponseInformation.StatusCode = value; } + get { return HttpResponseFeature.StatusCode; } + set { HttpResponseFeature.StatusCode = value; } } public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpResponseInformation.Headers); } + get { return new HeaderDictionary(HttpResponseFeature.Headers); } } public override Stream Body { - get { return HttpResponseInformation.Body; } - set { HttpResponseInformation.Body = value; } + get { return HttpResponseFeature.Body; } + set { HttpResponseFeature.Body = value; } } public override long? ContentLength @@ -105,34 +105,34 @@ namespace Microsoft.AspNet.PipelineCore { if (string.IsNullOrWhiteSpace(value)) { - HttpResponseInformation.Headers.Remove(Constants.Headers.ContentType); + HttpResponseFeature.Headers.Remove(Constants.Headers.ContentType); } else { - HttpResponseInformation.Headers[Constants.Headers.ContentType] = new[] { value }; + HttpResponseFeature.Headers[Constants.Headers.ContentType] = new[] { value }; } } } public override IResponseCookies Cookies { - get { return CanHasResponseCookies.Cookies; } + get { return ResponseCookiesFeature.Cookies; } } public override void OnSendingHeaders(Action callback, object state) { - HttpResponseInformation.OnSendingHeaders(callback, state); + HttpResponseFeature.OnSendingHeaders(callback, state); } public override void Redirect(string location, bool permanent) { if (permanent) { - HttpResponseInformation.StatusCode = 301; + HttpResponseFeature.StatusCode = 301; } else { - HttpResponseInformation.StatusCode = 302; + HttpResponseFeature.StatusCode = 302; } Headers.Set(Constants.Headers.Location, location); @@ -150,8 +150,8 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - HttpResponseInformation.StatusCode = 401; - var handler = HttpAuthentication.Handler; + HttpResponseFeature.StatusCode = 401; + var handler = HttpAuthenticationFeature.Handler; var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); if (handler != null) @@ -173,7 +173,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); if (handler != null) @@ -195,7 +195,7 @@ namespace Microsoft.AspNet.PipelineCore { throw new ArgumentNullException(); } - var handler = HttpAuthentication.Handler; + var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationTypes); if (handler != null) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs similarity index 89% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs rename to src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 6b4a6143bc..9613162d6f 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -26,14 +26,14 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasForm : ICanHasForm + public class FormFeature : IFormFeature { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private Stream _bodyStream; private IReadableStringCollection _form; - public DefaultCanHasForm(IFeatureCollection features) + public FormFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs similarity index 96% rename from src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs rename to src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 0003e6a773..f80d2c2713 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasForm.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -20,7 +20,7 @@ using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasForm + public interface IFormFeature { Task GetFormAsync(); } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs rename to src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs index 59be854c23..30762add7b 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs @@ -19,7 +19,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasItems + public interface IItemsFeature { IDictionary Items { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs rename to src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index af2e66ce45..6dcaa1836e 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -19,7 +19,7 @@ using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasQuery + public interface IQueryFeature { IReadableStringCollection Query { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs similarity index 94% rename from src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs rename to src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index 976e2bdd99..8cfcd2cb40 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -19,7 +19,7 @@ using Microsoft.AspNet.Abstractions; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasRequestCookies + public interface IRequestCookiesFeature { IReadableStringCollection Cookies { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs rename to src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index 739f71a36a..02a10ff95a 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -20,7 +20,7 @@ using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasResponseCookies + public interface IResponseCookiesFeature { IResponseCookies Cookies { get; } } diff --git a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs similarity index 94% rename from src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs rename to src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs index 17507634e8..ed6dc1d77b 100644 --- a/src/Microsoft.AspNet.PipelineCore/ICanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs @@ -19,7 +19,7 @@ using System; namespace Microsoft.AspNet.PipelineCore { - public interface ICanHasServiceProviders + public interface IServiceProvidersFeature { IServiceProvider ApplicationServices { get; set; } IServiceProvider RequestServices { get; set; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs similarity index 91% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs rename to src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs index fdf10565b0..c5933f1d0f 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasItems.cs +++ b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs @@ -19,9 +19,9 @@ using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasItems : ICanHasItems + public class ItemsFeature : IItemsFeature { - public DefaultCanHasItems() + public ItemsFeature() { Items = new ItemsDictionary(); } diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 9cf723fe9e..366ffd4df5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -27,28 +27,28 @@ - - - - - - + + + + + + - - - - - - + + + + + + - + diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs similarity index 87% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs rename to src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 2c53a4ceb2..994fa4b0e8 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasQuery.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -24,14 +24,14 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasQuery : ICanHasQuery + public class QueryFeature : IQueryFeature { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private FeatureReference _request = FeatureReference.Default; private string _queryString; private IReadableStringCollection _query; - public DefaultCanHasQuery(IFeatureCollection features) + public QueryFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs similarity index 88% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs rename to src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index b935db4cca..6d38678bbe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasRequestCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -25,15 +25,15 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasRequestCookies : ICanHasRequestCookies + public class RequestCookiesFeature : IRequestCookiesFeature { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; private static readonly string[] ZeroHeaders = new string[0]; - public DefaultCanHasRequestCookies(IFeatureCollection features) + public RequestCookiesFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs similarity index 84% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs rename to src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index 99bcb5d6f9..0fa8afff85 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -23,13 +23,13 @@ using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasResponseCookies : ICanHasResponseCookies + public class ResponseCookiesFeature : IResponseCookiesFeature { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private readonly FeatureReference _request = FeatureReference.Default; private IResponseCookies _cookiesCollection; - public DefaultCanHasResponseCookies(IFeatureCollection features) + public ResponseCookiesFeature(IFeatureCollection features) { _features = features; } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs similarity index 90% rename from src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs rename to src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs index aef823d267..e203abeec2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/DefaultHttpAuthentication.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs @@ -20,9 +20,9 @@ using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security { - public class DefaultHttpAuthentication : IHttpAuthentication + public class HttpAuthenticationFeature : IHttpAuthenticationFeature { - public DefaultHttpAuthentication() + public HttpAuthenticationFeature() { } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs similarity index 92% rename from src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs rename to src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs index f768aaa565..bc2b654f28 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultCanHasServiceProviders.cs +++ b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs @@ -19,7 +19,7 @@ using System; namespace Microsoft.AspNet.PipelineCore { - public class DefaultCanHasServiceProviders : ICanHasServiceProviders + public class ServiceProvidersFeature : IServiceProvidersFeature { public IServiceProvider ApplicationServices { get; set; } public IServiceProvider RequestServices { get; set; } diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs index 225235c0ab..8e65358410 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.Abstractions.Extensions { - public class FakeHttpRequestInfo : IHttpRequestInformation + public class FakeHttpRequestFeature : IHttpRequestFeature { public string Protocol { get; set; } public string Scheme { get; set; } @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Abstractions.Extensions public Stream Body { get; set; } } - public class FakeHttpResponseInfo : IHttpResponseInformation + public class FakeHttpResponseFeature : IHttpResponseFeature { public int StatusCode { get; set; } public string ReasonPhrase { get; set; } diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs index 5bc4f85ec9..c7faa83160 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -201,8 +201,8 @@ namespace Microsoft.AspNet.Abstractions.Extensions private HttpContext CreateRequest(string basePath, string requestPath) { HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestInfo()); - context.SetFeature(new FakeHttpResponseInfo()); + context.SetFeature(new FakeHttpRequestFeature()); + context.SetFeature(new FakeHttpResponseFeature()); context.Request.PathBase = new PathString(basePath); context.Request.Path = new PathString(requestPath); return context; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs index ad4223f9de..80fe6c0e88 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -190,8 +190,8 @@ namespace Microsoft.AspNet.Abstractions.Extensions private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestInfo()); - context.SetFeature(new FakeHttpResponseInfo()); + context.SetFeature(new FakeHttpRequestFeature()); + context.SetFeature(new FakeHttpResponseFeature()); return context; } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 69737309a9..aa1f4a59e1 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.Owin } } - private class MoqHttpRequest : HttpRequest, IHttpRequestInformation + private class MoqHttpRequest : HttpRequest, IHttpRequestFeature { public override HttpContext HttpContext { @@ -225,25 +225,25 @@ namespace Microsoft.AspNet.Owin set { throw new NotImplementedException(); } } - string IHttpRequestInformation.PathBase + string IHttpRequestFeature.PathBase { get; set; } - string IHttpRequestInformation.Path + string IHttpRequestFeature.Path { get; set; } - string IHttpRequestInformation.QueryString + string IHttpRequestFeature.QueryString { get; set; } - IDictionary IHttpRequestInformation.Headers + IDictionary IHttpRequestFeature.Headers { get; set; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index b3bb3f68f4..b300605afa 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Owin }; var features = new FeatureObject(new OwinFeatureCollection(env)); - Assert.Equal(Get(features).Method, "POST"); + Assert.Equal(Get(features).Method, "POST"); } [Fact] @@ -56,8 +56,8 @@ namespace Microsoft.AspNet.Owin var keys = features.Keys.ToArray(); var values = features.Values.ToArray(); - Assert.Contains(typeof(IHttpRequestInformation), keys); - Assert.Contains(typeof(IHttpResponseInformation), keys); + Assert.Contains(typeof(IHttpRequestFeature), keys); + Assert.Contains(typeof(IHttpResponseFeature), keys); } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index db800a6fff..a2d913c9f8 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -95,11 +95,11 @@ namespace Microsoft.AspNet.PipelineCore.Tests private HttpContext CreateContext() { var context = new DefaultHttpContext(new FeatureCollection()); - context.SetFeature(new FakeHttpResponse()); + context.SetFeature(new FakeHttpResponse()); return context; } - private class FakeHttpResponse : IHttpResponseInformation + private class FakeHttpResponse : IHttpResponseFeature { public int StatusCode { get; set; } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index c78982b0df..9ec72f8a89 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -124,11 +124,11 @@ namespace Microsoft.AspNet.PipelineCore.Tests private static DefaultHttpRequest CreateRequest(IDictionary headers) { - var requestInfo = new Mock(); + var requestInfo = new Mock(); requestInfo.SetupGet(r => r.Headers).Returns(headers); var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestInformation), requestInfo.Object); + features.Add(typeof(IHttpRequestFeature), requestInfo.Object); var context = new DefaultHttpContext(features); return new DefaultHttpRequest(context, features); diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs similarity index 88% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs rename to test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index 9d029071f2..31098e78cb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasFormTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -25,7 +25,7 @@ using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests { - public class DefaultCanHasFormTests + public class FormFeatureTests { [Fact] public async Task GetFormAsync_ReturnsParsedFormCollection() @@ -33,14 +33,14 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); var features = new Mock(); - var request = new Mock(); + var request = new Mock(); request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent)); object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) .Returns(true); - var provider = new DefaultCanHasForm(features.Object); + var provider = new FormFeature(features.Object); // Act var formCollection = await provider.GetFormAsync(); @@ -57,14 +57,14 @@ namespace Microsoft.AspNet.PipelineCore.Tests var formContent1 = Encoding.UTF8.GetBytes("foo=bar&baz=2"); var formContent2 = Encoding.UTF8.GetBytes("collection2=value"); var features = new Mock(); - var request = new Mock(); + var request = new Mock(); request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent1)); object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) .Returns(true); - var provider = new DefaultCanHasForm(features.Object); + var provider = new FormFeature(features.Object); // Act - 1 var formCollection = await provider.GetFormAsync(); diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 2f35d88951..073aabb443 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -22,8 +22,8 @@ - - + + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs similarity index 87% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs rename to test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs index 55e02e7560..7ddf43d57e 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultCanHasQueryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs @@ -22,21 +22,21 @@ using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests { - public class DefaultCanHasQueryTests + public class QueryFeatureTests { [Fact] public void QueryReturnsParsedQueryCollection() { // Arrange var features = new Mock(); - var request = new Mock(); + var request = new Mock(); request.SetupGet(r => r.QueryString).Returns("foo=bar"); object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestInformation), out value)) + features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) .Returns(true); - var provider = new DefaultCanHasQuery(features.Object); + var provider = new QueryFeature(features.Object); // Act var queryCollection = provider.Query; From 0ecb989103489bd184f351189030fca7289403d5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 16:04:53 -0700 Subject: [PATCH 0143/1838] Name Microsoft.AspNet.Abstractions to Microsoft.AspNet.Http. --- HttpAbstractions.sln | 8 ++++---- .../CookieOptions.cs | 2 +- .../Extensions/MapExtensions.cs | 4 ++-- .../Extensions/MapMiddleware.cs | 2 +- .../Extensions/MapOptions.cs | 2 +- .../Extensions/MapWhenExtensions.cs | 4 ++-- .../Extensions/MapWhenMiddleware.cs | 2 +- .../Extensions/MapWhenOptions.cs | 2 +- .../Extensions/RunExtensions.cs | 2 +- .../Extensions/UseExtensions.cs | 2 +- .../HostString.cs | 2 +- .../HttpContext.cs | 4 ++-- .../HttpRequest.cs | 2 +- .../HttpResponse.cs | 4 ++-- .../IBuilder.cs | 2 +- .../IFormCollection.cs | 2 +- .../IHeaderDictionary.cs | 2 +- .../IReadableStringCollection.cs | 2 +- .../IResponseCookies.cs | 2 +- .../IServerInformation.cs | 2 +- .../Microsoft.AspNet.Http.kproj} | 0 .../NotNullAttribute.cs | 2 +- .../PathString.cs | 2 +- .../QueryString.cs | 2 +- .../RequestDelegate.cs | 2 +- .../Security/AuthenticateResult.cs | 2 +- .../Security/AuthenticationDescription.cs | 2 +- .../Security/AuthenticationProperties.cs | 2 +- .../project.json | 0 src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- src/Microsoft.AspNet.Owin/Project.json | 2 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 2 +- .../Collections/FormCollection.cs | 2 +- .../Collections/HeaderDictionary.cs | 4 ++-- .../Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 4 ++-- .../Collections/RequestCookiesCollection.cs | 2 +- .../Collections/ResponseCookies.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs | 6 +++--- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 2 +- src/Microsoft.AspNet.PipelineCore/IFormFeature.cs | 2 +- src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs | 2 +- .../IRequestCookiesFeature.cs | 2 +- .../IResponseCookiesFeature.cs | 2 +- .../Infrastructure/Constants.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/QueryFeature.cs | 2 +- .../RequestCookiesFeature.cs | 4 ++-- .../ResponseCookiesFeature.cs | 2 +- .../Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- .../Fakes.cs | 2 +- .../MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- .../Microsoft.AspNet.Http.Tests.kproj} | 0 .../PathStringTests.cs | 2 +- .../Project.json} | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 4 ++-- test/Microsoft.AspNet.Owin.Tests/Project.json | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs | 2 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- 68 files changed, 82 insertions(+), 82 deletions(-) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/CookieOptions.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapExtensions.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapMiddleware.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapOptions.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapWhenExtensions.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapWhenMiddleware.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/MapWhenOptions.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/RunExtensions.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Extensions/UseExtensions.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HostString.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HttpContext.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HttpRequest.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/HttpResponse.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IBuilder.cs (96%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IFormCollection.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IHeaderDictionary.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IReadableStringCollection.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IResponseCookies.cs (97%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/IServerInformation.cs (95%) rename src/{Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj => Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj} (100%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/NotNullAttribute.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/PathString.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/QueryString.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/RequestDelegate.cs (95%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Security/AuthenticateResult.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Security/AuthenticationDescription.cs (98%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/Security/AuthenticationProperties.cs (99%) rename src/{Microsoft.AspNet.Abstractions => Microsoft.AspNet.Http}/project.json (100%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/Fakes.cs (96%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/MapPathMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/MapPredicateMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj => Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj} (100%) rename test/{Microsoft.AspNet.Abstractions.Tests => Microsoft.AspNet.Http.Tests}/PathStringTests.cs (98%) rename test/{Microsoft.AspNet.Abstractions.Tests/project.json => Microsoft.AspNet.Http.Tests/Project.json} (93%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index c7f07227ab..c4043ac0a1 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30401.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.21628.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -9,7 +9,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-3 EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions", "src\Microsoft.AspNet.Abstractions\Microsoft.AspNet.Abstractions.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject @@ -19,7 +19,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCo EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Abstractions.Tests", "test\Microsoft.AspNet.Abstractions.Tests\Microsoft.AspNet.Abstractions.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.kproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject diff --git a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Http/CookieOptions.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/CookieOptions.cs rename to src/Microsoft.AspNet.Http/CookieOptions.cs index b7c0690cdd..5a479f8967 100644 --- a/src/Microsoft.AspNet.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http/CookieOptions.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Options used to create a new cookie. diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index 2ecaa2898f..fa071712da 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -16,8 +16,8 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Extensions; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Extensions; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index d1bd14ecbb..b8bf99c9a8 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class MapMiddleware { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapOptions.cs index 4a9dcf1c90..d0611b9aa7 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { /// /// Options for the Map middleware diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index 2c088737a9..d6201678c5 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -17,8 +17,8 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Extensions; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Extensions; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index 02ed400c42..d9cf89dc10 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class MapWhenMiddleware { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs index 56bd141044..914d9ee56a 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs @@ -18,7 +18,7 @@ using System; using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { /// /// Options for the MapWhen middleware diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index ae4082221a..5d1b9d1a1a 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs rename to src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index ed90dc1ec7..95fcbb6bbe 100644 --- a/src/Microsoft.AspNet.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -17,7 +17,7 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/HostString.cs rename to src/Microsoft.AspNet.Http/HostString.cs index 246553a1d5..78483f7ce9 100644 --- a/src/Microsoft.AspNet.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -19,7 +19,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in diff --git a/src/Microsoft.AspNet.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/HttpContext.cs rename to src/Microsoft.AspNet.Http/HttpContext.cs index 43690fe366..eb5a5dc12f 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -21,9 +21,9 @@ using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public abstract class HttpContext : IDisposable { diff --git a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/HttpRequest.cs rename to src/Microsoft.AspNet.Http/HttpRequest.cs index 452c4600c8..488f3ea85c 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -20,7 +20,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public abstract class HttpRequest { diff --git a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/HttpResponse.cs rename to src/Microsoft.AspNet.Http/HttpResponse.cs index 3766e872c7..4cbd853465 100644 --- a/src/Microsoft.AspNet.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -20,9 +20,9 @@ using System.Collections.Generic; using System.IO; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public abstract class HttpResponse { diff --git a/src/Microsoft.AspNet.Abstractions/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs similarity index 96% rename from src/Microsoft.AspNet.Abstractions/IBuilder.cs rename to src/Microsoft.AspNet.Http/IBuilder.cs index 7f913c4988..8a5331e903 100644 --- a/src/Microsoft.AspNet.Abstractions/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public interface IBuilder { diff --git a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http/IFormCollection.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/IFormCollection.cs rename to src/Microsoft.AspNet.Http/IFormCollection.cs index 444436049a..fa27a142c0 100644 --- a/src/Microsoft.AspNet.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http/IFormCollection.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs rename to src/Microsoft.AspNet.Http/IHeaderDictionary.cs index 8f38346e36..58e0fd7c78 100644 --- a/src/Microsoft.AspNet.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -18,7 +18,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Represents request and response headers diff --git a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs rename to src/Microsoft.AspNet.Http/IReadableStringCollection.cs index 4aeb854c30..4e4e99ee75 100644 --- a/src/Microsoft.AspNet.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs @@ -18,7 +18,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Accessors for headers, query, forms, etc. diff --git a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNet.Http/IResponseCookies.cs similarity index 97% rename from src/Microsoft.AspNet.Abstractions/IResponseCookies.cs rename to src/Microsoft.AspNet.Http/IResponseCookies.cs index 00a44ccaf0..f12023b4e8 100644 --- a/src/Microsoft.AspNet.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookies.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/IServerInformation.cs rename to src/Microsoft.AspNet.Http/IServerInformation.cs index 5db85fd9cf..48554d0a65 100644 --- a/src/Microsoft.AspNet.Abstractions/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { // TODO: [AssemblyNeutral] public interface IServerInformation diff --git a/src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj similarity index 100% rename from src/Microsoft.AspNet.Abstractions/Microsoft.AspNet.Abstractions.kproj rename to src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj diff --git a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs b/src/Microsoft.AspNet.Http/NotNullAttribute.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs rename to src/Microsoft.AspNet.Http/NotNullAttribute.cs index 972c2e4aef..eb75fc366d 100644 --- a/src/Microsoft.AspNet.Abstractions/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.Http/NotNullAttribute.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullAttribute : Attribute diff --git a/src/Microsoft.AspNet.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/PathString.cs rename to src/Microsoft.AspNet.Http/PathString.cs index b722e8baee..acb90717fa 100644 --- a/src/Microsoft.AspNet.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -18,7 +18,7 @@ using System; using System.Linq; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNet.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/QueryString.cs rename to src/Microsoft.AspNet.Http/QueryString.cs index 1188530052..9e88c9c025 100644 --- a/src/Microsoft.AspNet.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { /// /// Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http/RequestDelegate.cs similarity index 95% rename from src/Microsoft.AspNet.Abstractions/RequestDelegate.cs rename to src/Microsoft.AspNet.Http/RequestDelegate.cs index 951c668d9a..fbfdc584b5 100644 --- a/src/Microsoft.AspNet.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http/RequestDelegate.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs index 812895a631..a7055c919d 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs @@ -19,7 +19,7 @@ using System; using System.Security.Claims; using System.Security.Principal; -namespace Microsoft.AspNet.Abstractions.Security +namespace Microsoft.AspNet.Http.Security { /// /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs similarity index 98% rename from src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs index 8d3ad0c293..630b8a09cc 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Abstractions.Security +namespace Microsoft.AspNet.Http.Security { /// /// Contains information describing an authentication provider. diff --git a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs similarity index 99% rename from src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index cc793057d0..a55f35ecd8 100644 --- a/src/Microsoft.AspNet.Abstractions/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; -namespace Microsoft.AspNet.Abstractions.Security +namespace Microsoft.AspNet.Http.Security { /// /// Dictionary used to store state values about the authentication session. diff --git a/src/Microsoft.AspNet.Abstractions/project.json b/src/Microsoft.AspNet.Http/project.json similarity index 100% rename from src/Microsoft.AspNet.Abstractions/project.json rename to src/Microsoft.AspNet.Http/project.json diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5ad850ead3..819f288991 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -25,7 +25,7 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.Owin diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 4a4d80d177..d6790b35b1 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; using Microsoft.AspNet.PipelineCore; diff --git a/src/Microsoft.AspNet.Owin/Project.json b/src/Microsoft.AspNet.Owin/Project.json index 4a7ce42ba7..18e1116930 100644 --- a/src/Microsoft.AspNet.Owin/Project.json +++ b/src/Microsoft.AspNet.Owin/Project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "" diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index 2b775fc4c3..df93a7a3e3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index 7a9c41cbc3..2a93e7dde0 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using System.Collections.Generic; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index 620fddd26b..ab53ba639e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -19,8 +19,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index 22e26e112c..2771932385 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -17,7 +17,7 @@ using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index b8e70872df..a18dcdeabb 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -18,8 +18,8 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index c2959cbe1d..056b3beda5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -18,7 +18,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index f70ef385cf..c3451dab58 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -19,8 +19,8 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.PipelineCore.Collections { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index ad4f3902a9..47fadff71d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -21,8 +21,8 @@ using System.Linq; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 602f6bebfb..719a3c2362 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -20,8 +20,8 @@ using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 7075b69663..2caeec3851 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -22,9 +22,9 @@ using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 9613162d6f..bcf0d46c67 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -18,7 +18,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index f80d2c2713..cef0c76d2d 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index 6dcaa1836e..c17f61973e 100644 --- a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index 8cfcd2cb40..af9a3bedec 100644 --- a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index 02a10ff95a..b6e5bbc7e6 100644 --- a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 374c1af87d..5d2c5635f1 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Abstractions.Infrastructure +namespace Microsoft.AspNet.Http.Infrastructure { internal static class Constants { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index a750fe5359..afbf7116ea 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -20,8 +20,8 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 994fa4b0e8..757a015d08 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 6d38678bbe..75ceae3ada 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -16,8 +16,8 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Infrastructure; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index 0fa8afff85..7127a87684 100644 --- a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index dcefd97e6e..476762aaee 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 2ed6579ad8..36a6ce567d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -21,7 +21,7 @@ using System.Linq; using System.Security.Claims; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.PipelineCore.Security diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index e8e90fdd08..3af3011dda 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -3,7 +3,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "" }, "configurations": { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 25bbf54fa6..dfb641df68 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs b/test/Microsoft.AspNet.Http.Tests/Fakes.cs similarity index 96% rename from test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs rename to test/Microsoft.AspNet.Http.Tests/Fakes.cs index 8e65358410..04cce33960 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Http.Tests/Fakes.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class FakeHttpRequestFeature : IHttpRequestFeature { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index c7faa83160..0096fe7b56 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.PipelineCore; using Shouldly; using Xunit; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { public class MapPathMiddlewareTests { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index 80fe6c0e88..d57293440b 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; -namespace Microsoft.AspNet.Abstractions.Extensions +namespace Microsoft.AspNet.Http.Extensions { using AppFunc = Func, Task>; using Predicate = Func; diff --git a/test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj similarity index 100% rename from test/Microsoft.AspNet.Abstractions.Tests/Microsoft.AspNet.Abstractions.Tests.kproj rename to test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj diff --git a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs similarity index 98% rename from test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs rename to test/Microsoft.AspNet.Http.Tests/PathStringTests.cs index 171fa1caca..0bc9dd09e3 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs @@ -18,7 +18,7 @@ using Microsoft.AspNet.Testing; using Xunit; -namespace Microsoft.AspNet.Abstractions +namespace Microsoft.AspNet.Http { public class PathStringTests { diff --git a/test/Microsoft.AspNet.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/Project.json similarity index 93% rename from test/Microsoft.AspNet.Abstractions.Tests/project.json rename to test/Microsoft.AspNet.Http.Tests/Project.json index 5a3029b789..6d51c6c3da 100644 --- a/test/Microsoft.AspNet.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/Project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Testing": "0.1-alpha-*", diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index aa1f4a59e1..37a655632a 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -21,8 +21,8 @@ using System.IO; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; -using Microsoft.AspNet.Abstractions.Security; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json index 3ba09cb57f..ea8857b6ba 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Project.json +++ b/test/Microsoft.AspNet.Owin.Tests/Project.json @@ -3,7 +3,7 @@ "dependencies": { "Microsoft.AspNet.Owin": "", "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.PipelineCore": "", "Xunit.KRunner": "0.1-alpha-*", diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 13044c0a29..65a1e04edf 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index a2d913c9f8..37364386be 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -21,7 +21,7 @@ using System.IO; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Xunit; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 9ec72f8a89..5b8986bccb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Moq; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index ae27e76817..54bcce5f18 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Abstractions": "", + "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.PipelineCore": "", "Xunit.KRunner": "0.1-alpha-*", From 3141543f0439f85b10ce6fd72d2c820310e1ed47 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 16:26:26 -0700 Subject: [PATCH 0144/1838] Fix HttpAbstractions dependency renames. --- Hosting.sln | 8 +++++++- samples/KWebStartup/Startup.cs | 2 +- samples/KWebStartup/project.json | 2 +- src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs | 2 +- .../Builder/HttpContextFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs | 2 +- .../Builder/IHttpContextFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/HostingContext.cs | 2 +- src/Microsoft.AspNet.Hosting/PipelineInstance.cs | 2 +- src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- .../ContainerExtensions.cs | 2 +- .../ContainerMiddleware.cs | 2 +- src/Microsoft.AspNet.RequestContainer/project.json | 2 +- src/Microsoft.AspNet.TestHost/RequestInformation.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseInformation.cs | 2 +- src/Microsoft.AspNet.TestHost/TestClient.cs | 8 ++++---- src/Microsoft.AspNet.TestHost/TestServer.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs | 2 +- .../Fakes/FakeStartupWithServices.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 28 files changed, 37 insertions(+), 31 deletions(-) diff --git a/Hosting.sln b/Hosting.sln index afb4be9861..f9376adc31 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 2013 -VisualStudioVersion = 12.0.30327.0 +VisualStudioVersion = 12.0.30401.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -32,6 +32,7 @@ Global EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.ActiveCfg = Debug|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.Build.0 = Debug|x86 {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.Build.0 = Debug|x86 {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|x86.ActiveCfg = Debug|x86 @@ -42,6 +43,7 @@ Global {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.ActiveCfg = Release|x86 {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.Build.0 = Release|x86 {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.ActiveCfg = Debug|x86 + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.Build.0 = Debug|x86 {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.Build.0 = Debug|x86 {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|x86.ActiveCfg = Debug|x86 @@ -52,6 +54,7 @@ Global {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.ActiveCfg = Release|x86 {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.Build.0 = Release|x86 {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.ActiveCfg = Debug|x86 + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.Build.0 = Debug|x86 {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.Build.0 = Debug|x86 {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|x86.ActiveCfg = Debug|x86 @@ -62,6 +65,7 @@ Global {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.ActiveCfg = Release|x86 {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.Build.0 = Release|x86 {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.ActiveCfg = Debug|x86 + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.Build.0 = Debug|x86 {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.Build.0 = Debug|x86 {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|x86.ActiveCfg = Debug|x86 @@ -72,6 +76,7 @@ Global {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.ActiveCfg = Release|x86 {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.Build.0 = Release|x86 {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.ActiveCfg = Debug|x86 + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.Build.0 = Debug|x86 {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.Build.0 = Debug|x86 {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.ActiveCfg = Debug|x86 @@ -82,6 +87,7 @@ Global {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|x86 {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.Build.0 = Release|x86 {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.ActiveCfg = Debug|x86 + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.Build.0 = Debug|x86 {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.Build.0 = Debug|x86 {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.ActiveCfg = Debug|x86 diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs index 003f957c97..daeb4dd7d3 100644 --- a/samples/KWebStartup/Startup.cs +++ b/samples/KWebStartup/Startup.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using Microsoft.AspNet; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace KWebStartup { diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index ab2f5706ee..627c07e0ac 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Abstractions": "0.1-alpha-*", + "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" }, diff --git a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs index 8a19d56ed9..64eaba6302 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index d2e8ba071a..288dea101d 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.PipelineCore; diff --git a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs index 5f76b74b90..4e80cc8730 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs index 2cdcf30a75..6621c4b605 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index 974c4783f4..08183b88e0 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.Hosting.Server; diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index b6bf92de86..40c656b9be 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -17,7 +17,7 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index cd8e42f28b..0f069629e1 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -17,7 +17,7 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.ConfigurationModel; namespace Microsoft.AspNet.Hosting.Server diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index 2115a7e57d..e06ea4fa1b 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs index 8f2a948b78..82e14d4b01 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs index 9a6e15ac3f..1ce1553cc8 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -17,7 +17,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 73a04b4abe..2c13cc06c8 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs index 4f84d583fc..e94d71a184 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 159032003b..90f6209355 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.Abstractions": "0.1-alpha-*", + "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", "Microsoft.Net.Runtime.Interfaces": "0.1-alpha-*" diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 0296824e4c..e16de29de2 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -19,7 +19,7 @@ using System; using System.Reflection; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.RequestContainer; diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index d72564f56c..02105f8290 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -20,7 +20,7 @@ using System; using System.Runtime.Remoting.Messaging; #endif using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; namespace Microsoft.AspNet.RequestContainer diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index a438c15933..5b12dbaab9 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", - "Microsoft.AspNet.Abstractions": "0.1-alpha-*" + "Microsoft.AspNet.Http": "0.1-alpha-*" }, "configurations": { "net45": {}, diff --git a/src/Microsoft.AspNet.TestHost/RequestInformation.cs b/src/Microsoft.AspNet.TestHost/RequestInformation.cs index cc1080ded0..d5815ee993 100644 --- a/src/Microsoft.AspNet.TestHost/RequestInformation.cs +++ b/src/Microsoft.AspNet.TestHost/RequestInformation.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.TestHost { - internal class RequestInformation : IHttpRequestInformation + internal class RequestInformation : IHttpRequestFeature { public RequestInformation() { diff --git a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs index 17851b4c2e..9a8f672817 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs @@ -22,7 +22,7 @@ using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.TestHost { - internal class ResponseInformation : IHttpResponseInformation + internal class ResponseInformation : IHttpResponseFeature { public ResponseInformation() { diff --git a/src/Microsoft.AspNet.TestHost/TestClient.cs b/src/Microsoft.AspNet.TestHost/TestClient.cs index 576617337b..7f9d7e8219 100644 --- a/src/Microsoft.AspNet.TestHost/TestClient.cs +++ b/src/Microsoft.AspNet.TestHost/TestClient.cs @@ -21,7 +21,7 @@ using System.Globalization; using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; @@ -56,8 +56,8 @@ namespace Microsoft.AspNet.TestHost var response = new ResponseInformation(); var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestInformation), request); - features.Add(typeof(IHttpResponseInformation), response); + features.Add(typeof(IHttpRequestFeature), request); + features.Add(typeof(IHttpResponseFeature), response); var httpContext = new DefaultHttpContext(features); if (onSendingRequest != null) @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.TestHost return httpContext.Response; } - private static IHttpRequestInformation CreateRequest( + private static IHttpRequestFeature CreateRequest( string method, Uri uri, IDictionary headers, diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 0f5369578f..d4c39ba180 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Runtime.Versioning; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs index 9fa8ee9668..eeb7b22470 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs index 22968394c5..cef3346562 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 884aaba514..847d0a056c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index e752b61e3b..3c7a156069 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.IO; using System.Runtime.Versioning; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.Net.Runtime; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 1c829edae6..351a74ff01 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -19,7 +19,7 @@ using System; using System.IO; using System.Runtime.Versioning; using System.Threading.Tasks; -using Microsoft.AspNet.Abstractions; +using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.Net.Runtime; From d8ff084dc163618ef5fb3968c9ff721351520c25 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 5 May 2014 19:55:23 -0700 Subject: [PATCH 0145/1838] Update dependency namespace --- src/Microsoft.AspNet.Hosting/HostingContext.cs | 2 +- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index 08183b88e0..bb85c4d25f 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -17,7 +17,7 @@ using System; using Microsoft.AspNet.Http; -using Microsoft.AspNet.ConfigurationModel; +using Microsoft.Framework.ConfigurationModel; using Microsoft.AspNet.Hosting.Server; namespace Microsoft.AspNet.Hosting diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index d196876873..b9b0c94dbb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.AspNet.ConfigurationModel; +using Microsoft.Framework.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 7c5585bbc6..5f098b4bd8 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -17,7 +17,7 @@ using System; using System.IO; -using Microsoft.AspNet.ConfigurationModel; +using Microsoft.Framework.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.Net.Runtime; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 0f069629e1..83a1c67c19 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -18,7 +18,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.ConfigurationModel; +using Microsoft.Framework.ConfigurationModel; namespace Microsoft.AspNet.Hosting.Server { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 90f6209355..0cd026f131 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -2,7 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", - "Microsoft.AspNet.ConfigurationModel": "0.1-alpha-*", + "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index d4c39ba180..4c6092ac27 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.Runtime.Versioning; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.ConfigurationModel; +using Microsoft.Framework.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.Hosting; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 847d0a056c..c4ba4895c5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -19,7 +19,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.ConfigurationModel; +using Microsoft.Framework.ConfigurationModel; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.Hosting.Server; From 8b26f1d319748af89062c755bf7fd0595fa7a4a2 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 5 May 2014 21:05:21 -0700 Subject: [PATCH 0146/1838] Move IBuilder and related components to the Ms.AspNet.Builder namespace. --- src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs | 4 ++-- src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs | 3 ++- src/Microsoft.AspNet.Http/Extensions/MapOptions.cs | 4 +++- src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs | 4 ++-- src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs | 3 ++- src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs | 3 ++- src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs | 2 +- src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs | 2 +- src/Microsoft.AspNet.Http/IBuilder.cs | 2 +- src/Microsoft.AspNet.Http/IServerInformation.cs | 2 +- src/Microsoft.AspNet.Http/RequestDelegate.cs | 3 ++- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- src/Microsoft.AspNet.PipelineCore/Builder.cs | 2 +- test/Microsoft.AspNet.Http.Tests/Fakes.cs | 2 +- test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs | 3 ++- .../MapPredicateMiddlewareTests.cs | 3 ++- test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs | 2 +- 17 files changed, 27 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index fa071712da..95a6af45d1 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -17,9 +17,9 @@ using System; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNet.Builder.Extensions; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class MapExtensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index b8bf99c9a8..a6238081b6 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -16,8 +16,9 @@ // permissions and limitations under the License. using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class MapMiddleware { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs index d0611b9aa7..16bd8f0df5 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs @@ -15,7 +15,9 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Http.Extensions +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.Builder.Extensions { /// /// Options for the Map middleware diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index d6201678c5..2ede36599e 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -18,9 +18,9 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNet.Builder.Extensions; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { using Predicate = Func; using PredicateAsync = Func>; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index d9cf89dc10..1aeed9f340 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -16,8 +16,9 @@ // permissions and limitations under the License. using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class MapWhenMiddleware { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs index 914d9ee56a..5d1b4ea0bf 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs @@ -17,8 +17,9 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { /// /// Options for the MapWhen middleware diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 5d1b9d1a1a..8f2de3eac1 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -18,7 +18,7 @@ using System; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class RunExtensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 95fcbb6bbe..68879bb92f 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -19,7 +19,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class UseExtensions { diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs index 8a5331e903..c7ea6ccc5b 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Builder { public interface IBuilder { diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs index 48554d0a65..83d11d5b7e 100644 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Builder { // TODO: [AssemblyNeutral] public interface IServerInformation diff --git a/src/Microsoft.AspNet.Http/RequestDelegate.cs b/src/Microsoft.AspNet.Http/RequestDelegate.cs index fbfdc584b5..cfa81d7242 100644 --- a/src/Microsoft.AspNet.Http/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http/RequestDelegate.cs @@ -16,8 +16,9 @@ // permissions and limitations under the License. using System.Threading.Tasks; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Builder { public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index d6790b35b1..e33824bf75 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -23,7 +23,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; using Microsoft.AspNet.PipelineCore; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { using AppFunc = Func, Task>; using CreateMiddleware = Func< diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index df93a7a3e3..f78fcccc5a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -21,7 +21,7 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Builder { public class Builder : IBuilder { diff --git a/test/Microsoft.AspNet.Http.Tests/Fakes.cs b/test/Microsoft.AspNet.Http.Tests/Fakes.cs index 04cce33960..98297a0982 100644 --- a/test/Microsoft.AspNet.Http.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Http.Tests/Fakes.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class FakeHttpRequestFeature : IHttpRequestFeature { diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 0096fe7b56..9f5a09336f 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -17,12 +17,13 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Shouldly; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { public class MapPathMiddlewareTests { diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index d57293440b..63e83925bd 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -18,11 +18,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Builder.Extensions { using AppFunc = Func, Task>; using Predicate = Func; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index 65a1e04edf..c41552bf79 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -18,7 +18,7 @@ using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Builder.Tests { public class BuilderTests { From a4816ab78293acb1f08c686143139ebfd8c3477d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 6 May 2014 00:02:26 -0700 Subject: [PATCH 0147/1838] React to renames --- src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs | 3 ++- src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs | 1 + src/Microsoft.AspNet.Hosting/HostingContext.cs | 1 + src/Microsoft.AspNet.Hosting/PipelineInstance.cs | 1 + src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs | 1 + src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs | 1 + src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs | 1 + src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs | 1 + src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 1 + src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs | 1 + src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs | 1 + src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs | 1 + src/Microsoft.AspNet.TestHost/TestServer.cs | 1 + test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs | 1 + .../Fakes/FakeStartupWithServices.cs | 1 + test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 1 + test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 1 + test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 1 + 18 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs index 64eaba6302..01a04d5df5 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs @@ -16,6 +16,7 @@ // permissions and limitations under the License. using System; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder @@ -31,7 +32,7 @@ namespace Microsoft.AspNet.Hosting.Builder public IBuilder CreateBuilder() { - return new PipelineCore.Builder(_serviceProvider); + return new Microsoft.AspNet.Builder.Builder(_serviceProvider); } } } diff --git a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs index 4e80cc8730..ab9c2d3ba3 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs @@ -15,6 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index bb85c4d25f..b682e1a8c1 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -19,6 +19,7 @@ using System; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index 40c656b9be..c1a4977c24 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -20,6 +20,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 83a1c67c19..21d3f06fbe 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -17,6 +17,7 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index e06ea4fa1b..e8eaede1c7 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs index 82e14d4b01..7d4655f36f 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -16,6 +16,7 @@ // permissions and limitations under the License. using System; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs index 1ce1553cc8..c70dad2e65 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -17,6 +17,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 2c13cc06c8..70adf45faa 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -21,6 +21,7 @@ using System.Linq; using System.Reflection; using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs index e94d71a184..16a6a4e2bb 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index e16de29de2..b4127db07f 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -23,6 +23,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.RequestContainer; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet { diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 02105f8290..edef5e2f37 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -22,6 +22,7 @@ using System.Runtime.Remoting.Messaging; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.RequestContainer { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 4c6092ac27..ebd87322b4 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -27,6 +27,7 @@ using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Net.Runtime; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs index eeb7b22470..1df444a0af 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs @@ -15,6 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs index cef3346562..2150b21ea7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs @@ -15,6 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index c4ba4895c5..7bdd75f9c2 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -24,6 +24,7 @@ using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.Hosting.Server; using Xunit; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 3c7a156069..6a8dbbe2a3 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -25,6 +25,7 @@ using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.Net.Runtime; using Xunit; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.TestHost.Tests { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 351a74ff01..91e30a1cb2 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -24,6 +24,7 @@ using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.Net.Runtime; using Xunit; +using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.TestHost.Tests { From f72de34e103df9fb85b1f5076e4acfbf9fa4591f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 6 May 2014 00:17:09 -0700 Subject: [PATCH 0148/1838] Move extension methods to builder namespace and fix sample --- samples/KWebStartup/Startup.cs | 1 + src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs | 3 +-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs index daeb4dd7d3..a46d8bbc06 100644 --- a/samples/KWebStartup/Startup.cs +++ b/samples/KWebStartup/Startup.cs @@ -16,6 +16,7 @@ // permissions and limitations under the License. using Microsoft.AspNet; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; namespace KWebStartup diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index b4127db07f..7afc6cd6ab 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -23,9 +23,8 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.DependencyInjection.Fallback; using Microsoft.AspNet.RequestContainer; -using Microsoft.AspNet.Builder; -namespace Microsoft.AspNet +namespace Microsoft.AspNet.Builder { public static class ContainerExtensions { From 3b5767414141071c0501fbbd1cb0ed953bcf1a6a Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 6 May 2014 11:11:00 -0700 Subject: [PATCH 0149/1838] Update DI dependency. --- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/HostingServices.cs | 4 ++-- src/Microsoft.AspNet.Hosting/Program.cs | 4 ++-- src/Microsoft.AspNet.Hosting/Server/ServerManager.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/WebApplication.cs | 4 ++-- src/Microsoft.AspNet.Hosting/project.json | 2 +- .../ContainerExtensions.cs | 7 +++---- .../ContainerMiddleware.cs | 4 ++-- src/Microsoft.AspNet.RequestContainer/project.json | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 10 ++++------ .../HostingEngineTests.cs | 11 +++++------ .../StartupManagerTests.cs | 7 +++---- .../TestClientTests.cs | 8 +++----- .../TestServerTests.cs | 8 +++----- 15 files changed, 34 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 5346305db9..b1dd6093cb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -17,10 +17,10 @@ using System; using System.Threading; -using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index b9b0c94dbb..2ce566dbeb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -16,12 +16,12 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Security.DataProtection; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 5f098b4bd8..62cf645910 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -18,8 +18,8 @@ using System; using System.IO; using Microsoft.Framework.ConfigurationModel; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Net.Runtime; namespace Microsoft.AspNet.Hosting diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index 45b902e8cc..899e695fc0 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -18,7 +18,7 @@ using System; using System.Linq; using System.Reflection; -using Microsoft.AspNet.DependencyInjection; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Server { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 70adf45faa..b45aa4c004 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -20,7 +20,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http; -using Microsoft.AspNet.DependencyInjection; +using Microsoft.Framework.DependencyInjection; using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index df3d548e84..ccd679476d 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -16,8 +16,8 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 0cd026f131..612bea6588 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", + "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", "Microsoft.AspNet.Http": "0.1-alpha-*", diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 7afc6cd6ab..8289754ef5 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -16,13 +16,12 @@ // permissions and limitations under the License. using System; -using System.Reflection; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; +using System.Reflection; using Microsoft.AspNet.RequestContainer; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index edef5e2f37..8ef3862ac0 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -20,9 +20,9 @@ using System; using System.Runtime.Remoting.Messaging; #endif using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.DependencyInjection; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.RequestContainer { diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 5b12dbaab9..fed205590c 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,7 +1,7 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.DependencyInjection": "0.1-alpha-*", + "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", "Microsoft.AspNet.Http": "0.1-alpha-*" }, "configurations": { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index ebd87322b4..79b024ad96 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -17,17 +17,15 @@ using System; using System.Collections.Generic; -using System.Runtime.Versioning; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Net.Runtime; -using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 7bdd75f9c2..5491f92de9 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -18,13 +18,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; -using Microsoft.AspNet.Hosting.Server; -using Xunit; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Xunit; namespace Microsoft.AspNet.Hosting { diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index efd7e2763a..b04aef9e4c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -15,12 +15,11 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using System; using System.Collections.Generic; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Hosting.Fakes; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; using Xunit; namespace Microsoft.AspNet.Hosting diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 6a8dbbe2a3..d31abab0a4 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -18,14 +18,12 @@ using System; using System.Collections.Generic; using System.IO; -using System.Runtime.Versioning; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Net.Runtime; using Xunit; -using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.TestHost.Tests { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 91e30a1cb2..93561d7cc6 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -17,14 +17,12 @@ using System; using System.IO; -using System.Runtime.Versioning; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.DependencyInjection; -using Microsoft.AspNet.DependencyInjection.Fallback; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Net.Runtime; using Xunit; -using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.TestHost.Tests { From 7c7efeda57c7f4c11605d394921d90ce9ba4c1e1 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 6 May 2014 14:59:55 -0700 Subject: [PATCH 0150/1838] Fix ordering of usings and dependencies after namespace renaming --- src/Microsoft.AspNet.Hosting/HostingContext.cs | 6 +++--- src/Microsoft.AspNet.Hosting/PipelineInstance.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 8 ++++---- src/Microsoft.AspNet.RequestContainer/project.json | 4 ++-- 5 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index b682e1a8c1..b0d430626d 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -16,10 +16,10 @@ // permissions and limitations under the License. using System; -using Microsoft.AspNet.Http; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.Framework.ConfigurationModel; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index c1a4977c24..ec3a8f5284 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -17,10 +17,10 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index b45aa4c004..f9629c819f 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -19,9 +19,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 612bea6588..70308d391e 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,12 +1,12 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", - "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", - "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", + "Microsoft.AspNet.Http": "0.1-alpha-*", + "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", + "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", + "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", "Microsoft.Net.Runtime.Interfaces": "0.1-alpha-*" }, "configurations": { diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index fed205590c..786d98c8c2 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,8 +1,8 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", - "Microsoft.AspNet.Http": "0.1-alpha-*" + "Microsoft.AspNet.Http": "0.1-alpha-*", + "Microsoft.Framework.DependencyInjection": "0.1-alpha-*" }, "configurations": { "net45": {}, From 4e36207b14b0503308036b1c6b7a55db36ede00c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 6 May 2014 15:08:50 -0700 Subject: [PATCH 0151/1838] Owin adapter: Fix FeatureMap constructor visibility. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 819f288991..e08b8ead59 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -238,12 +238,12 @@ namespace Microsoft.AspNet.Owin public class FeatureMap { - internal FeatureMap(Type featureInterface, Func getter) + public FeatureMap(Type featureInterface, Func getter) : this(featureInterface, getter, null) { } - internal FeatureMap(Type featureInterface, Func getter, Action setter) + public FeatureMap(Type featureInterface, Func getter, Action setter) { FeatureInterface = featureInterface; Getter = getter; @@ -272,12 +272,12 @@ namespace Microsoft.AspNet.Owin public class FeatureMap : FeatureMap { - internal FeatureMap(Func getter) + public FeatureMap(Func getter) : base(typeof(T), feature => getter((T)feature)) { } - internal FeatureMap(Func getter, Action setter) + public FeatureMap(Func getter, Action setter) : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) { } From af38d26fe74a0a04b3e38934a2118296b03e0f0b Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 6 May 2014 14:57:48 -0700 Subject: [PATCH 0152/1838] Provide empty logger factory service. --- .../HostingServices.cs | 23 +++++++++++++++++++ src/Microsoft.AspNet.Hosting/project.json | 1 + 2 files changed, 24 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 2ce566dbeb..c7376cd52e 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -15,6 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. +using System; using System.Collections.Generic; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; @@ -22,6 +23,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Hosting { @@ -47,6 +49,9 @@ namespace Microsoft.AspNet.Hosting yield return describer.Transient(); + // TODO: We expect this to be provide by the runtime eventually. + yield return describer.Instance(new NullLoggerFactory()); + yield return new ServiceDescriptor { ServiceType = typeof(IContextAccessor<>), @@ -69,5 +74,23 @@ namespace Microsoft.AspNet.Hosting yield return describer.Instance(DataProtectionProvider.CreateFromDpapi()); } } + + // TODO: Temp workaround until the runtime reliably provides logging. + // If ILoggerFactory is never guaranteed, move this fallback into Microsoft.AspNet.Logging. + private class NullLoggerFactory : ILoggerFactory + { + public ILogger Create(string name) + { + return new NullLogger(); + } + } + + private class NullLogger : ILogger + { + public bool WriteCore(TraceType eventType, int eventId, object state, Exception exception, Func formatter) + { + return false; + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 70308d391e..bc7d383d2d 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -7,6 +7,7 @@ "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", + "Microsoft.Framework.Logging": "0.1-alpha-*", "Microsoft.Net.Runtime.Interfaces": "0.1-alpha-*" }, "configurations": { From 4d78121aa4264ecc31e05f28f8a68c2c03b95f93 Mon Sep 17 00:00:00 2001 From: Glenn Condron Date: Wed, 7 May 2014 15:11:50 -0700 Subject: [PATCH 0153/1838] Wrap HttpContext in an ObjectHandle to avoid cross domain issues --- .../ContainerMiddleware.cs | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 8ef3862ac0..38398d3889 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -23,7 +23,9 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; - +#if NET45 +using System.Runtime.Remoting; +#endif namespace Microsoft.AspNet.RequestContainer { public class ContainerMiddleware @@ -64,7 +66,8 @@ namespace Microsoft.AspNet.RequestContainer private HttpContext AccessRootHttpContext() { #if NET45 - return CallContext.LogicalGetData(LogicalDataKey) as HttpContext; + var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + return handle != null ? handle.Unwrap() as HttpContext : null; #else throw new Exception("TODO: CallContext not available"); #endif @@ -73,9 +76,9 @@ namespace Microsoft.AspNet.RequestContainer private HttpContext ExchangeRootHttpContext(HttpContext httpContext) { #if NET45 - var prior = CallContext.LogicalGetData(LogicalDataKey) as HttpContext; - CallContext.LogicalSetData(LogicalDataKey, httpContext); - return prior; + var prior = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(httpContext)); + return prior != null ? prior.Unwrap() as HttpContext : null; #else return null; #endif From 73792af79965e544a3bd9bdca20b0ae5ff87034f Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 7 May 2014 16:59:22 -0700 Subject: [PATCH 0154/1838] Sort dependencies and remove duplicates in dependencies --- samples/KWebStartup/project.json | 4 ++-- src/Microsoft.AspNet.Hosting/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 627c07e0ac..3ed8d30072 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -1,8 +1,8 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.Hosting": "", + "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" }, "commands": { "web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, @@ -11,8 +11,8 @@ }, "k10": { "dependencies": { - "System.Console": "4.0.0.0", "System.Collections": "4.0.0.0", + "System.Console": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index bc7d383d2d..a79ae473f1 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -15,8 +15,8 @@ "k10": { "dependencies": { "System.Collections": "4.0.0.0", - "System.Console": "4.0.0.0", "System.ComponentModel": "4.0.0.0", + "System.Console": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.IO": "4.0.0.0", "System.Linq": "4.0.0.0", diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 31f45a0967..50ffba28ed 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,11 +2,11 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "configurations": { "net45": { From 2ba629d886cf5e2769515066d699a145cf474686 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 7 May 2014 17:05:41 -0700 Subject: [PATCH 0155/1838] Sort dependencies and remove duplicates in dependencies --- .../project.json | 8 ++++---- test/Microsoft.AspNet.Http.Tests/Project.json | 10 +++++----- test/Microsoft.AspNet.Owin.Tests/Project.json | 14 +++++++------- .../project.json | 12 ++++++------ 4 files changed, 22 insertions(+), 22 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index dfb641df68..ca05fee96f 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,14 +1,14 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", - "Xunit.KRunner": "0.1-alpha-*", + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.HttpFeature": "", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.Http.Tests/Project.json b/test/Microsoft.AspNet.Http.Tests/Project.json index 6d51c6c3da..29620862ab 100644 --- a/test/Microsoft.AspNet.Http.Tests/Project.json +++ b/test/Microsoft.AspNet.Http.Tests/Project.json @@ -2,14 +2,14 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.Testing": "0.1-alpha-*", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" @@ -17,8 +17,8 @@ "configurations": { "net45": { "dependencies": { - "System.Runtime": "", - "Shouldly": "1.1.1.1" + "Shouldly": "1.1.1.1", + "System.Runtime": "" } } } diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json index ea8857b6ba..362d8821c4 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Project.json +++ b/test/Microsoft.AspNet.Owin.Tests/Project.json @@ -1,16 +1,16 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.Owin": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.Owin": "", "Microsoft.AspNet.PipelineCore": "", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" @@ -18,8 +18,8 @@ "configurations": { "net45": { "dependencies": { - "System.Runtime": "", - "Shouldly": "1.1.1.1" + "Shouldly": "1.1.1.1", + "System.Runtime": "" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 54bcce5f18..4efc819ed8 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,15 +1,15 @@ { "version": "0.1-alpha-*", "dependencies": { - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.PipelineCore": "", - "Xunit.KRunner": "0.1-alpha-*", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*" + "xunit.execution": "2.0.0-aspnet-*", + "Xunit.KRunner": "0.1-alpha-*" }, "commands": { "test": "Xunit.KRunner" @@ -17,9 +17,9 @@ "configurations": { "net45": { "dependencies": { - "System.Runtime": "", "Moq": "4.2.1312.1622", - "System.Net.Http": "" + "System.Net.Http": "", + "System.Runtime": "" } } } From 03cffeb451bf6e7cd42d615c355115dfca16249c Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 8 May 2014 03:49:01 -0700 Subject: [PATCH 0156/1838] React to renames --- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 2 +- .../TestApplicationEnvironment.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 62cf645910..2834105153 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -20,7 +20,7 @@ using System.IO; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index bc7d383d2d..467ea3f868 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -8,7 +8,7 @@ "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", "Microsoft.Framework.Logging": "0.1-alpha-*", - "Microsoft.Net.Runtime.Interfaces": "0.1-alpha-*" + "Microsoft.Framework.Runtime.Interfaces": "0.1-alpha-*" }, "configurations": { "net45": {}, diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 79b024ad96..16684a4bd8 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -25,7 +25,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index 4e8ea2fe94..14495b9fdb 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -17,7 +17,7 @@ using System; using System.Runtime.Versioning; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.TestHost.Tests { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index d31abab0a4..91730ee12c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -22,7 +22,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; using Xunit; namespace Microsoft.AspNet.TestHost.Tests diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 93561d7cc6..f2a2f436a1 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -21,7 +21,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; using Xunit; namespace Microsoft.AspNet.TestHost.Tests From efc77e60e09daf95db88b8e0f03312123ef688b6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 8 May 2014 10:08:17 -0700 Subject: [PATCH 0157/1838] More fallout from the rename --- src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs | 2 +- .../IHttpTransportLayerSecurityFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs | 2 +- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IAuthenticationHandler.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs | 2 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs | 2 +- src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs | 2 +- 17 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs index 7282be839b..0ed7a7e8ed 100644 --- a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -17,7 +17,7 @@ using System; -namespace Microsoft.Net.Runtime +namespace Microsoft.Framework.Runtime { [AssemblyNeutralAttribute] [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs index 218b8732f6..7abefe40d0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Threading; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs index 84c9f5b885..d258b60673 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs @@ -15,7 +15,7 @@ // See the Apache 2 License for the specific language governing // permissions and limitations under the License. -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs index 1cb3cc12fa..87bec2d68b 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Net; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs index cad2c7ccf0..441df31f24 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index 19956ea09f..067148392e 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Threading; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index afd1cdebca..2b3d9e9372 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -18,7 +18,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs index f53ca06c07..409db09e19 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs @@ -17,7 +17,7 @@ using System.Threading; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs index 8e7f9a5f1b..76c94f0a3c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs @@ -17,7 +17,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index 8b2013652f..07c6bf4644 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -18,7 +18,7 @@ #if NET45 using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index 13033b5f82..5ee1ddbaf2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index d230f16764..06e61070c1 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 942caa29a2..50f240f6b8 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index 873ee856d9..b19caca74d 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs index b18bd0ea3f..3113a5e49a 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Security.Claims; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index d83e224bb4..3a77ad533a 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -17,7 +17,7 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 0a98bdbac8..2cffae53b9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -16,7 +16,7 @@ // permissions and limitations under the License. using System.Collections.Generic; -using Microsoft.Net.Runtime; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature.Security { From 7580a9a2913f32b5fdf0af5622e7d745c186531c Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Thu, 8 May 2014 11:36:44 -0700 Subject: [PATCH 0158/1838] Changed the default status code of ResponseInformation to 200 in order to be consistent with the behavior of the rest of the hosts. --- .../Microsoft.AspNet.TestHost.kproj | 1 + .../Properties/AssemblyInfo.cs | 38 +++++++++++++++++++ .../ResponseInformation.cs | 4 ++ .../Microsoft.AspNet.TestHost.Tests.kproj | 2 + .../Properties/AssemblyInfo.cs | 36 ++++++++++++++++++ .../ResponseInformationTests.cs | 34 +++++++++++++++++ 6 files changed, 115 insertions(+) create mode 100644 src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index b0b2425081..0711ff81b0 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -20,6 +20,7 @@ + diff --git a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..5eb8f1ffac --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +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("Microsoft.AspNet.TestHost")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Microsoft.AspNet.TestHost")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("12A3EDBB-65B6-4D47-98FC-2B80CEC71E51")] + +[assembly: InternalsVisibleTo("Microsoft.AspNet.TestHost.Tests")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs index 9a8f672817..7cccbafc53 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs @@ -28,6 +28,10 @@ namespace Microsoft.AspNet.TestHost { Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = new MemoryStream(); + + // 200 is the default status code all the way down to the host, so we set it + // here to be consistent with the rest of the hosts when writing tests. + StatusCode = 200; } public int StatusCode { get; set; } diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 4deca87e2d..cb04e9bc60 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -21,6 +21,8 @@ + + diff --git a/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..64d1e18c97 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +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("Microsoft.AspNet.TestHost.Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyProduct("Microsoft.AspNet.TestHost.Tests")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("82F61927-58D7-465C-9100-92D202FEA300")] \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs new file mode 100644 index 0000000000..1717152773 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Xunit; + +namespace Microsoft.AspNet.TestHost.Tests +{ + public class ResponseInformationTests + { + [Fact] + public void StatusCode_DefaultsTo200() + { + // Arrange & Act + var responseInformation = new ResponseInformation(); + + // Assert + Assert.Equal(200, responseInformation.StatusCode); + } + } +} \ No newline at end of file From e8ce130315a46c6eef6acf4ccb074189169043af Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Thu, 8 May 2014 16:34:52 -0700 Subject: [PATCH 0159/1838] Create LICENSE.txt --- LICENSE.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000..d85a1524ad --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +these files 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. From 60f8c9e1252e23d7964c8cd92a37bca366590daf Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Thu, 8 May 2014 16:35:19 -0700 Subject: [PATCH 0160/1838] Create LICENSE.txt --- LICENSE.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 LICENSE.txt diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000..d85a1524ad --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,12 @@ +Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. + +Licensed under the Apache License, Version 2.0 (the "License"); you may not use +these files 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. From 55271e8719b3f06381f0f77da9e67ea8d357ff2e Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 8 May 2014 20:38:36 -0700 Subject: [PATCH 0161/1838] Supporting Startup method dependency injection also changes method name from Configuration to Configure also supports enviroment name command line and --- samples/KWebStartup/Startup.cs | 7 +- samples/KWebStartup/project.json | 2 +- .../HostingContext.cs | 1 + src/Microsoft.AspNet.Hosting/HostingEngine.cs | 4 +- src/Microsoft.AspNet.Hosting/Program.cs | 7 +- .../Startup/IStartupLoader.cs | 5 +- .../Startup/IStartupManager.cs | 4 +- .../Startup/NullStartupLoader.cs | 5 +- .../Startup/StartupLoader.cs | 89 ++++++++++++++----- .../Startup/StartupManager.cs | 6 +- 10 files changed, 96 insertions(+), 34 deletions(-) diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs index a46d8bbc06..dbe847a1be 100644 --- a/samples/KWebStartup/Startup.cs +++ b/samples/KWebStartup/Startup.cs @@ -18,18 +18,19 @@ using Microsoft.AspNet; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; +using Microsoft.Framework.Runtime; namespace KWebStartup { public class Startup { - public void Configuration(IBuilder app) + public void Configure(IBuilder app, IApplicationEnvironment env) { app.Run(async context => { context.Response.ContentType = "text/plain"; - await context.Response.WriteAsync("Hello world"); + await context.Response.WriteAsync("Hello world, from " + env.ApplicationName); }); } } -} \ No newline at end of file +} diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 3ed8d30072..e2d56265b7 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -5,7 +5,7 @@ "Microsoft.AspNet.Http": "0.1-alpha-*", "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" }, - "commands": { "web": "Microsoft.AspNet.Hosting server.name=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, + "commands": { "web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, "configurations": { "net45": { }, diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index b0d430626d..ea5685e6bb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -31,6 +31,7 @@ namespace Microsoft.AspNet.Hosting public IBuilder Builder { get; set; } public string ApplicationName { get; set; } + public string EnvironmentName { get; set; } public Action ApplicationStartup { get; set; } public RequestDelegate ApplicationDelegate { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index b1dd6093cb..b8cecf5752 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -117,7 +117,9 @@ namespace Microsoft.AspNet.Hosting return; } - context.ApplicationStartup = _startupManager.LoadStartup(context.ApplicationName); + context.ApplicationStartup = _startupManager.LoadStartup( + context.ApplicationName, + context.EnvironmentName); } private class Disposable : IDisposable diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 2834105153..00b4a6af5c 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -38,12 +38,12 @@ namespace Microsoft.AspNet.Hosting public void Main(string[] args) { var config = new Configuration(); - config.AddCommandLine(args); if (File.Exists(HostingIniFile)) { config.AddIniFile(HostingIniFile); } config.AddEnvironmentVariables(); + config.AddCommandLine(args); var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); @@ -55,9 +55,10 @@ namespace Microsoft.AspNet.Hosting { Services = services, Configuration = config, - ServerName = config.Get("server.name"), // TODO: Key names - ApplicationName = config.Get("app.name") // TODO: Key names + ServerName = config.Get("server"), // TODO: Key names + ApplicationName = config.Get("app") // TODO: Key names ?? appEnvironment.ApplicationName, + EnvironmentName = config.Get("env") ?? "Development" }; var engine = services.GetService(); diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index e8eaede1c7..a6a0741ad7 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -24,6 +24,9 @@ namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupLoader { - Action LoadStartup(string applicationName, IList diagnosticMessages); + Action LoadStartup( + string applicationName, + string environmentName, + IList diagnosticMessages); } } diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs index 7d4655f36f..1b8b9f19cc 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -23,6 +23,8 @@ namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupManager { - Action LoadStartup(string applicationName); + Action LoadStartup( + string applicationName, + string environmentName); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs index c70dad2e65..559d44d5e2 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -31,7 +31,10 @@ namespace Microsoft.AspNet.Hosting.Startup public static IStartupLoader Instance { get; private set; } - public Action LoadStartup(string applicationName, IList diagnosticMessages) + public Action LoadStartup( + string applicationName, + string environmentName, + IList diagnosticMessages) { return null; } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index f9629c819f..98aec36c67 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -30,42 +30,49 @@ namespace Microsoft.AspNet.Hosting.Startup private readonly IServiceProvider _services; private readonly IStartupLoader _next; - public StartupLoader(IServiceProvider services, IStartupLoader next) + public StartupLoader( + IServiceProvider services, + IStartupLoader next) { _services = services; _next = next; } - public Action LoadStartup(string applicationName, IList diagnosticMessages) + public Action LoadStartup( + string applicationName, + string environmentName, + IList diagnosticMessages) { if (String.IsNullOrEmpty(applicationName)) { - return _next.LoadStartup(applicationName, diagnosticMessages); + return _next.LoadStartup(applicationName, environmentName, diagnosticMessages); } - var nameParts = Utilities.SplitTypeName(applicationName); - string typeName = nameParts.Item1; - string assemblyName = nameParts.Item2; - - var assembly = Assembly.Load(new AssemblyName(assemblyName)); + var assembly = Assembly.Load(new AssemblyName(applicationName)); if (assembly == null) { - throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); + throw new Exception(String.Format("TODO: assembly {0} failed to load message", applicationName)); } - Type type = null; - if (string.IsNullOrEmpty(typeName)) - { - typeName = "Startup"; - } + var startupName1 = "Startup" + environmentName; + var startupName2 = "Startup"; // Check the most likely places first - type = assembly.GetType(typeName) ?? assembly.GetType(assembly.GetName().Name + "." + typeName); + var type = + assembly.GetType(startupName1) ?? + assembly.GetType(applicationName + "." + startupName1) ?? + assembly.GetType(startupName2) ?? + assembly.GetType(applicationName + "." + startupName2); if (type == null) { // Full scan - var typeInfo = assembly.DefinedTypes.FirstOrDefault(aType => aType.Name.Equals(typeName, StringComparison.OrdinalIgnoreCase)); + var definedTypes = assembly.DefinedTypes.ToList(); + + var startupType1 = definedTypes.Where(info => info.Name.Equals(startupName1, StringComparison.Ordinal)); + var startupType2 = definedTypes.Where(info => info.Name.Equals(startupName2, StringComparison.Ordinal)); + + var typeInfo = startupType1.Concat(startupType2).FirstOrDefault(); if (typeInfo != null) { type = typeInfo.AsType(); @@ -74,18 +81,30 @@ namespace Microsoft.AspNet.Hosting.Startup if (type == null) { - throw new Exception(String.Format("TODO: type {0} failed to load message", typeName)); + throw new Exception(String.Format("TODO: {0} or {1} class not found in assembly {2}", + startupName1, + startupName2, + applicationName)); } - var methodInfo = type.GetTypeInfo().GetDeclaredMethod("Configuration"); + var configureMethod1 = "Configure" + environmentName; + var configureMethod2 = "Configure"; + var methodInfo = type.GetTypeInfo().GetDeclaredMethod(configureMethod1); if (methodInfo == null) { - throw new Exception("TODO: Configuration method not found"); + methodInfo = type.GetTypeInfo().GetDeclaredMethod(configureMethod2); + } + if (methodInfo == null) + { + throw new Exception(string.Format("TODO: {0} or {1} method not found", + configureMethod1, + configureMethod2)); } if (methodInfo.ReturnType != typeof(void)) { - throw new Exception("TODO: Configuration method isn't void-returning."); + throw new Exception(string.Format("TODO: {0} method isn't void-returning.", + methodInfo.Name)); } object instance = null; @@ -93,7 +112,35 @@ namespace Microsoft.AspNet.Hosting.Startup { instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); } - return builder => methodInfo.Invoke(instance, new object[] { builder }); + + return builder => + { + var parameterInfos = methodInfo.GetParameters(); + var parameters = new object[parameterInfos.Length]; + for (var index = 0; index != parameterInfos.Length; ++index) + { + var parameterInfo = parameterInfos[index]; + if (parameterInfo.ParameterType == typeof(IBuilder)) + { + parameters[index] = builder; + } + else + { + try + { + parameters[index] = _services.GetService(parameterInfo.ParameterType); + } + catch (Exception ex) + { + throw new Exception(string.Format( + "TODO: Unable to resolve service for startup method {0} {1}", + parameterInfo.Name, + parameterInfo.ParameterType.FullName)); + } + } + } + methodInfo.Invoke(instance, parameters); + }; } } } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs index 16a6a4e2bb..8c4bc7b1ff 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -32,7 +32,9 @@ namespace Microsoft.AspNet.Hosting.Startup _providers = providers; } - public Action LoadStartup(string applicationName) + public Action LoadStartup( + string applicationName, + string environmentName) { // build ordered chain of application loaders var chain = _providers @@ -41,7 +43,7 @@ namespace Microsoft.AspNet.Hosting.Startup // invoke chain to acquire application entrypoint and diagnostic messages var diagnosticMessages = new List(); - var application = chain.LoadStartup(applicationName, diagnosticMessages); + var application = chain.LoadStartup(applicationName, environmentName, diagnosticMessages); if (application == null) { From 7edc2dfbe96b3d485b33dcc0bcadfce7ca806a5c Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 8 May 2014 22:36:56 -0700 Subject: [PATCH 0162/1838] Fixing unit tests --- src/Microsoft.AspNet.TestHost/TestServer.cs | 14 ++++----- .../Fakes/{FakeStartup.cs => Startup.cs} | 8 +++-- ...WithServices.cs => StartupWithServices.cs} | 7 +++-- .../HostingEngineTests.cs | 2 +- .../Microsoft.AspNet.Hosting.Tests.kproj | 1 - .../StartupManagerTests.cs | 19 ++---------- .../TestServerTests.cs | 30 +++++++++---------- 7 files changed, 35 insertions(+), 46 deletions(-) rename test/Microsoft.AspNet.Hosting.Tests/Fakes/{FakeStartup.cs => Startup.cs} (87%) rename test/Microsoft.AspNet.Hosting.Tests/Fakes/{FakeStartupWithServices.cs => StartupWithServices.cs} (79%) diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 16684a4bd8..48f1679f05 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -57,13 +57,13 @@ namespace Microsoft.AspNet.TestHost var disposable = engine.Start(hostContext); } - public static TestServer Create(IServiceProvider provider) - { - var startupLoader = new StartupLoader(provider, new NullStartupLoader()); - var name = typeof(TStartup).AssemblyQualifiedName; - var diagnosticMessages = new List(); - return Create(provider, startupLoader.LoadStartup(name, diagnosticMessages)); - } + //public static TestServer Create(IServiceProvider provider) + //{ + // var startupLoader = new StartupLoader(provider, new NullStartupLoader()); + // var name = typeof(TStartup).AssemblyQualifiedName; + // var diagnosticMessages = new List(); + // return Create(provider, startupLoader.LoadStartup(name, "Test", diagnosticMessages)); + //} public static TestServer Create(IServiceProvider provider, Action app) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs similarity index 87% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs rename to test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 1df444a0af..da91cbeca0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -20,9 +20,13 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes { - public class FakeStartup + public class Startup { - public void Configuration(IBuilder builder) + public Startup() + { + } + + public void Configure(IBuilder builder) { } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs similarity index 79% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs rename to test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs index 2150b21ea7..166b4ff5c5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeStartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs @@ -20,18 +20,19 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes { - public class FakeStartupWithServices + public class StartupWithServices { private readonly IFakeStartupCallback _fakeStartupCallback; - public FakeStartupWithServices(IFakeStartupCallback fakeStartupCallback) + public StartupWithServices(IFakeStartupCallback fakeStartupCallback) { _fakeStartupCallback = fakeStartupCallback; } - public void Configuration(IBuilder builder) + public void Configure(IBuilder builder, IFakeStartupCallback fakeStartupCallback2) { _fakeStartupCallback.ConfigurationMethodCalled(this); + fakeStartupCallback2.ConfigurationMethodCalled(this); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 5491f92de9..d6cbf86841 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Hosting var context = new HostingContext { ServerFactory = this, - ApplicationName = "Microsoft.AspNet.Hosting.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests" + ApplicationName = "Microsoft.AspNet.Hosting.Tests" }; var engineStart = engine.Start(context); diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 48a9989141..65a7bd78f0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -21,7 +21,6 @@ - diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index b04aef9e4c..6684a56205 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -29,21 +29,6 @@ namespace Microsoft.AspNet.Hosting { private readonly IList _configurationMethodCalledList = new List(); - [Fact] - public void DefaultServicesLocateStartupByNameAndNamespace() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - var services = serviceCollection.BuildServiceProvider(); - - var manager = services.GetService(); - - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Fakes.FakeStartup, Microsoft.AspNet.Hosting.Tests"); - - Assert.IsType(manager); - Assert.NotNull(startup); - } - [Fact] public void StartupClassMayHaveHostingServicesInjected() { @@ -54,11 +39,11 @@ namespace Microsoft.AspNet.Hosting var manager = services.GetService(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Fakes.FakeStartupWithServices, Microsoft.AspNet.Hosting.Tests"); + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithServices"); startup.Invoke(null); - Assert.Equal(1, _configurationMethodCalledList.Count); + Assert.Equal(2, _configurationMethodCalledList.Count); } public void ConfigurationMethodCalled(object instance) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index f2a2f436a1..c1b0ea1fb3 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -40,23 +40,23 @@ namespace Microsoft.AspNet.TestHost.Tests Assert.DoesNotThrow(() => TestServer.Create(services, app => { })); } - [Fact] - public async Task CreateWithGeneric() - { - // Arrange - var services = new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); + //[Fact] + //public async Task CreateWithGeneric() + //{ + // // Arrange + // var services = new ServiceCollection() + // .AddSingleton() + // .BuildServiceProvider(); - var server = TestServer.Create(services); - var client = server.Handler; + // var server = TestServer.Create(services); + // var client = server.Handler; - // Act - var response = await client.GetAsync("http://any"); + // // Act + // var response = await client.GetAsync("http://any"); - // Assert - Assert.Equal("Startup", new StreamReader(response.Body).ReadToEnd()); - } + // // Assert + // Assert.Equal("Startup", new StreamReader(response.Body).ReadToEnd()); + //} [Fact] public void ThrowsIfNoApplicationEnvironmentIsRegisteredWithTheProvider() @@ -68,7 +68,7 @@ namespace Microsoft.AspNet.TestHost.Tests // Act & Assert Assert.Throws( "serviceProvider", - () => TestServer.Create(services)); + () => TestServer.Create(services, new Startup().Configuration)); } public class Startup From 00d49bbd603364eadc5a84f18db65e7347f1fffe Mon Sep 17 00:00:00 2001 From: Andrew Peters Date: Thu, 8 May 2014 23:01:09 -0700 Subject: [PATCH 0163/1838] Updating copyright headers --- .../FeatureCollection.cs | 18 ++---------------- .../FeatureObject.cs | 18 ++---------------- .../IFeatureCollection.cs | 18 ++---------------- src/Microsoft.AspNet.Http/CookieOptions.cs | 18 ++---------------- .../Extensions/MapExtensions.cs | 18 ++---------------- .../Extensions/MapMiddleware.cs | 18 ++---------------- .../Extensions/MapOptions.cs | 18 ++---------------- .../Extensions/MapWhenExtensions.cs | 18 ++---------------- .../Extensions/MapWhenMiddleware.cs | 18 ++---------------- .../Extensions/MapWhenOptions.cs | 18 ++---------------- .../Extensions/RunExtensions.cs | 18 ++---------------- .../Extensions/UseExtensions.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HostString.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HttpContext.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HttpRequest.cs | 18 ++---------------- src/Microsoft.AspNet.Http/HttpResponse.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IBuilder.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IFormCollection.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IHeaderDictionary.cs | 18 ++---------------- .../IReadableStringCollection.cs | 18 ++---------------- src/Microsoft.AspNet.Http/IResponseCookies.cs | 18 ++---------------- .../IServerInformation.cs | 18 ++---------------- src/Microsoft.AspNet.Http/NotNullAttribute.cs | 18 ++---------------- src/Microsoft.AspNet.Http/PathString.cs | 18 ++---------------- src/Microsoft.AspNet.Http/QueryString.cs | 18 ++---------------- src/Microsoft.AspNet.Http/RequestDelegate.cs | 18 ++---------------- .../Security/AuthenticateResult.cs | 18 ++---------------- .../Security/AuthenticationDescription.cs | 18 ++---------------- .../Security/AuthenticationProperties.cs | 18 ++---------------- .../AssemblyNeutralAttribute.cs | 18 ++---------------- .../IHttpApplicationFeature.cs | 18 ++---------------- .../IHttpBufferingFeature.cs | 18 ++---------------- .../IHttpConnectionFeature.cs | 18 ++---------------- .../IHttpRequestFeature.cs | 18 ++---------------- .../IHttpRequestLifetimeFeature.cs | 18 ++---------------- .../IHttpResponseFeature.cs | 18 ++---------------- .../IHttpSendFileFeature.cs | 18 ++---------------- .../IHttpTransportLayerSecurityFeature.cs | 18 ++---------------- .../IHttpWebSocketFeature.cs | 18 ++---------------- .../Security/IAuthTypeContext.cs | 18 ++---------------- .../Security/IAuthenticateContext.cs | 18 ++---------------- .../Security/IAuthenticationHandler.cs | 18 ++---------------- .../Security/IChallengeContext.cs | 18 ++---------------- .../Security/IHttpAuthenticationFeature.cs | 18 ++---------------- .../Security/ISignInContext.cs | 18 ++---------------- .../Security/ISignOutContext .cs | 18 ++---------------- .../IOwinEnvironmentFeature.cs | 18 ++---------------- src/Microsoft.AspNet.Owin/OwinConstants.cs | 18 ++---------------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 18 ++---------------- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 18 ++---------------- .../OwinFeatureCollection.cs | 18 ++---------------- src/Microsoft.AspNet.PipelineCore/Builder.cs | 18 ++---------------- .../Collections/FormCollection.cs | 18 ++---------------- .../Collections/HeaderDictionary.cs | 18 ++---------------- .../Collections/ItemsDictionary.cs | 18 ++---------------- .../Collections/ReadableStringCollection.cs | 18 ++---------------- .../Collections/RequestCookiesCollection.cs | 18 ++---------------- .../Collections/ResponseCookies.cs | 18 ++---------------- .../DefaultHttpContext.cs | 18 ++---------------- .../DefaultHttpRequest.cs | 18 ++---------------- .../DefaultHttpResponse.cs | 18 ++---------------- .../FormFeature.cs | 18 ++---------------- .../IFormFeature.cs | 18 ++---------------- .../IItemsFeature.cs | 18 ++---------------- .../IQueryFeature.cs | 18 ++---------------- .../IRequestCookiesFeature.cs | 18 ++---------------- .../IResponseCookiesFeature.cs | 18 ++---------------- .../IServiceProvidersFeature.cs | 18 ++---------------- .../Infrastructure/Constants.cs | 18 ++---------------- .../Infrastructure/FeatureReference.cs | 18 ++---------------- .../Infrastructure/ParsingHelpers.cs | 18 ++---------------- .../ItemsFeature.cs | 18 ++---------------- .../QueryFeature.cs | 18 ++---------------- .../RequestCookiesFeature.cs | 18 ++---------------- .../ResponseCookiesFeature.cs | 18 ++---------------- .../Security/AuthTypeContext.cs | 18 ++---------------- .../Security/AuthenticateContext.cs | 18 ++---------------- .../Security/ChallengeContext.cs | 18 ++---------------- .../Security/HttpAuthenticationFeature.cs | 18 ++---------------- .../Security/SignInContext.cs | 18 ++---------------- .../Security/SignOutContext.cs | 18 ++---------------- .../ServiceProvidersFeature.cs | 18 ++---------------- .../IThing.cs | 18 ++---------------- .../InterfaceDictionaryTests.cs | 18 ++---------------- .../Properties/AssemblyInfo.cs | 18 ++---------------- .../Thing.cs | 18 ++---------------- test/Microsoft.AspNet.Http.Tests/Fakes.cs | 18 ++---------------- .../MapPathMiddlewareTests.cs | 18 ++---------------- .../MapPredicateMiddlewareTests.cs | 18 ++---------------- .../PathStringTests.cs | 18 ++---------------- .../OwinEnvironmentTests.cs | 18 ++---------------- .../OwinFeatureCollectionTests.cs | 18 ++---------------- .../BuilderTests.cs | 18 ++---------------- .../DefaultHttpContextTests.cs | 18 ++---------------- .../DefaultHttpRequestTests.cs | 18 ++---------------- .../FormFeatureTests.cs | 18 ++---------------- .../Properties/AssemblyInfo.cs | 18 ++---------------- .../QueryFeatureTests.cs | 18 ++---------------- 98 files changed, 196 insertions(+), 1568 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 96ce5a4a19..222dc181f0 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 28028821cf..40e873e2e3 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs index 220294ee88..a6c5c2da9d 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/CookieOptions.cs b/src/Microsoft.AspNet.Http/CookieOptions.cs index 5a479f8967..9dab37f844 100644 --- a/src/Microsoft.AspNet.Http/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http/CookieOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index 95a6af45d1..b4a44adddf 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index a6238081b6..5bf26af0b8 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs index 16bd8f0df5..f3c85a1086 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index 2ede36599e..b46bbbe0e9 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index 1aeed9f340..51606e609c 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs index 5d1b4ea0bf..c94b15f181 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 8f2de3eac1..de565c2e3d 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 68879bb92f..3f0f8f51c3 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 78483f7ce9..1786a7c338 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Diagnostics.CodeAnalysis; diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index eb5a5dc12f..7bad161454 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 488f3ea85c..a59ae78ab6 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.IO; diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 4cbd853465..6f0a6a44dd 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs index c7ea6ccc5b..6a2c1b3197 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/IFormCollection.cs b/src/Microsoft.AspNet.Http/IFormCollection.cs index fa27a142c0..a69162fa4d 100644 --- a/src/Microsoft.AspNet.Http/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http/IFormCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs index 58e0fd7c78..d740fe03bf 100644 --- a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; diff --git a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs index 4e4e99ee75..21a00450ea 100644 --- a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; diff --git a/src/Microsoft.AspNet.Http/IResponseCookies.cs b/src/Microsoft.AspNet.Http/IResponseCookies.cs index f12023b4e8..53b1d3da60 100644 --- a/src/Microsoft.AspNet.Http/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookies.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs index 83d11d5b7e..f7f267996c 100644 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http/NotNullAttribute.cs b/src/Microsoft.AspNet.Http/NotNullAttribute.cs index eb75fc366d..d43b93e4e4 100644 --- a/src/Microsoft.AspNet.Http/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.Http/NotNullAttribute.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index acb90717fa..a6cf0c85b3 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index 9e88c9c025..5ba16151c7 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/RequestDelegate.cs b/src/Microsoft.AspNet.Http/RequestDelegate.cs index cfa81d7242..b590996e17 100644 --- a/src/Microsoft.AspNet.Http/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http/RequestDelegate.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs index a7055c919d..5a1998f336 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs index 630b8a09cc..d6423f34fd 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index a55f35ecd8..6a6fb4fadf 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs index 0ed7a7e8ed..e1d35fbf25 100644 --- a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs +++ b/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs index 7abefe40d0..344f87352c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs index d258b60673..53b7fd9894 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs index 87bec2d68b..7598c9ce0b 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs index 441df31f24..66b5c5fa82 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index 067148392e..dca2418de9 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index 2b3d9e9372..cf322f6747 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs index 409db09e19..be42442acc 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs index 76c94f0a3c..1eb020776f 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index 07c6bf4644..a04a584532 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #if NET45 using System.Net.WebSockets; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs index 5ee1ddbaf2..bf3627a3d8 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index 06e61070c1..f44c411ffc 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs index 50f240f6b8..f081744b22 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index b19caca74d..c5855cb322 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs index 3113a5e49a..4ee676b095 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index 3a77ad533a..b6c1730a69 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Security.Claims; diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 2cffae53b9..8346ae040b 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs index 45455159e3..53e61267e0 100644 --- a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 968c618000..1e1296b67d 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index e08b8ead59..c624e1a8c0 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index e33824bf75..d48462c16e 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 4c6483ffcb..c0f75caa46 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index f78fcccc5a..fae10cf6a2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index 2a93e7dde0..b1da4f6c3c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index ab53ba639e..22d62c5989 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index 2771932385..e9c21c835d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index a18dcdeabb..84f95d7e0e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 056b3beda5..e562487fd1 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index c3451dab58..27bfbbd38e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 47fadff71d..a5c559f112 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 719a3c2362..09106220e0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Globalization; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 2caeec3851..436517b0b9 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index bcf0d46c67..ad7598af3e 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; using System.Text; diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index cef0c76d2d..261b77d551 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs index 30762add7b..9afe1623de 100644 --- a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index c17f61973e..e1ad3146c0 100644 --- a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index af9a3bedec..ba1a0e3616 100644 --- a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index b6e5bbc7e6..6d51b7a015 100644 --- a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs index ed6dc1d77b..03dffc578d 100644 --- a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 5d2c5635f1..e0cf75c268 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http.Infrastructure { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index cbcacc51d4..0726b73b95 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index afbf7116ea..8dc89e6063 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections; diff --git a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs index c5933f1d0f..54d7d123f4 100644 --- a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 757a015d08..71e75e5031 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 75ceae3ada..6af65fa206 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index 7127a87684..f8ea2bf1b7 100644 --- a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index 476762aaee..20bc565605 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 36a6ce567d..469c38cf3c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 103072565e..b86f4cff8e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs index e203abeec2..368b888573 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index d211615e04..7f9694fd2a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index c24c41ac53..1c8049d3cb 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs index bc2b654f28..50bfab0065 100644 --- a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs index 1fb06e09b5..c82223ad06 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index 97d36f5d35..37eac34813 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Xunit; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index 2494fa2308..604b34761c 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; using System.Runtime.CompilerServices; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs index 4144a0482c..e064589fdc 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests { diff --git a/test/Microsoft.AspNet.Http.Tests/Fakes.cs b/test/Microsoft.AspNet.Http.Tests/Fakes.cs index 98297a0982..d33efeaa2b 100644 --- a/test/Microsoft.AspNet.Http.Tests/Fakes.cs +++ b/test/Microsoft.AspNet.Http.Tests/Fakes.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 9f5a09336f..3bca69be56 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index 63e83925bd..17cce7c777 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs index 0bc9dd09e3..d547c0a4ac 100644 --- a/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Testing; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 37a655632a..5cd6230df6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index b300605afa..ca21c566de 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using System.Linq; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs index c41552bf79..1fab0f3938 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Xunit; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 37364386be..6ece4245fa 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 5b8986bccb..93d816e875 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index 31098e78cb..6566bc75eb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; using System.Text; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs index 1679842ad2..2a4dd7d85d 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; using System.Runtime.CompilerServices; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs index 7ddf43d57e..975edda5b1 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; From afa87bf8573590e5ee02fc7dd434e6f8d133c11c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 9 May 2014 09:11:21 -0700 Subject: [PATCH 0164/1838] #22 - Make UseMiddleware look for any Invoke method. --- .../ContainerExtensions.cs | 7 ++++++- src/Microsoft.AspNet.RequestContainer/project.json | 1 + 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 8289754ef5..df630d1794 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -27,6 +27,11 @@ namespace Microsoft.AspNet.Builder { public static class ContainerExtensions { + public static IBuilder UseMiddleware(this IBuilder builder, params object[] args) + { + return builder.UseMiddleware(typeof(T), args); + } + public static IBuilder UseMiddleware(this IBuilder builder, Type middleware, params object[] args) { // TODO: move this ext method someplace nice @@ -34,7 +39,7 @@ namespace Microsoft.AspNet.Builder { var typeActivator = builder.ApplicationServices.GetService(); var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); - var methodinfo = middleware.GetTypeInfo().GetDeclaredMethod("Invoke"); + var methodinfo = middleware.GetRuntimeMethods().Single(info => info.Name.Equals("Invoke")); return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); }); } diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 786d98c8c2..91bf41f1fa 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -13,6 +13,7 @@ "System.Diagnostics.Debug": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", + "System.Reflection.Extensions": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Threading": "4.0.0.0", From 5a0969044761d8fc77ffd37266f5aaa22579fd6b Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 9 May 2014 11:19:17 -0700 Subject: [PATCH 0165/1838] #22 - Use binding flags to locate method. --- src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs | 2 +- src/Microsoft.AspNet.RequestContainer/project.json | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index df630d1794..7db63fe5ff 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Builder { var typeActivator = builder.ApplicationServices.GetService(); var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); - var methodinfo = middleware.GetRuntimeMethods().Single(info => info.Name.Equals("Invoke")); + var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); }); } diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 91bf41f1fa..1a1a36198f 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -14,6 +14,7 @@ "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Reflection.Extensions": "4.0.0.0", + "System.Reflection.TypeExtensions": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Threading": "4.0.0.0", From fb937c509d4f75757186c25bbe139f9fc227c00d Mon Sep 17 00:00:00 2001 From: Glenn Date: Mon, 12 May 2014 19:12:08 -0700 Subject: [PATCH 0166/1838] Create README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..1dbf89ce85 --- /dev/null +++ b/README.md @@ -0,0 +1,6 @@ +Hosting +======= + +The Hosting repo contains code required to host an ASP.NET vNext application, it is the entry point used when self-hosting an application. + +This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. From 025c03bfb9bd713ccaee56a5bba366e274b48a9f Mon Sep 17 00:00:00 2001 From: Glenn Date: Mon, 12 May 2014 19:21:26 -0700 Subject: [PATCH 0167/1838] Create README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000000..6ba75cfaa8 --- /dev/null +++ b/README.md @@ -0,0 +1,9 @@ +HttpAbstractions +================ + +Contains HTTP abstractions for ASP.NET vNext such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. + +This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. + + + From 71d19e9f7145932a246c62cc3d204d04ee3a7ff3 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 13 May 2014 01:02:29 -0700 Subject: [PATCH 0168/1838] Create CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..eac4268e4c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +Contributing +====== + +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. From f92bc6bb69e97d4ec14161bc86041d652a6891c3 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 13 May 2014 01:02:32 -0700 Subject: [PATCH 0169/1838] Create CONTRIBUTING.md --- CONTRIBUTING.md | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 CONTRIBUTING.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000000..eac4268e4c --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,4 @@ +Contributing +====== + +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. From 8695da085be21a6f524faba2435d8dd86210ab0d Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 15 May 2014 16:24:39 -0700 Subject: [PATCH 0170/1838] Add IOptionsAccessor as a default service --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index c7376cd52e..5403f190fb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -59,6 +59,14 @@ namespace Microsoft.AspNet.Hosting Lifecycle = LifecycleKind.Scoped }; + // TODO: Review whether this is the right long term home, and whether Scoped is correct lifetime + yield return new ServiceDescriptor + { + ServiceType = typeof(IOptionsAccessor<>), + ImplementationType = typeof(OptionsAccessor<>), + Lifecycle = LifecycleKind.Scoped + }; + if (PlatformHelper.IsMono) { #if NET45 From 1189f10ba81af8a67d17464b4c6fb5289ea06e7b Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 15 May 2014 18:11:51 -0700 Subject: [PATCH 0171/1838] Move Options to UseServices Hosting default services wasn't working as expected, UseServices --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 8 -------- .../ContainerExtensions.cs | 9 +++++++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 5403f190fb..c7376cd52e 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -59,14 +59,6 @@ namespace Microsoft.AspNet.Hosting Lifecycle = LifecycleKind.Scoped }; - // TODO: Review whether this is the right long term home, and whether Scoped is correct lifetime - yield return new ServiceDescriptor - { - ServiceType = typeof(IOptionsAccessor<>), - ImplementationType = typeof(OptionsAccessor<>), - Lifecycle = LifecycleKind.Scoped - }; - if (PlatformHelper.IsMono) { #if NET45 diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 7db63fe5ff..d2ae5e3619 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -64,6 +64,15 @@ namespace Microsoft.AspNet.Builder public static IBuilder UseServices(this IBuilder builder, Action configureServices) { var serviceCollection = new ServiceCollection(); + + // TODO: Review whether this is the right long term home, and whether Scoped is correct lifetime + serviceCollection.Add(new ServiceDescriptor + { + ServiceType = typeof(IOptionsAccessor<>), + ImplementationType = typeof(OptionsAccessor<>), + Lifecycle = LifecycleKind.Scoped + }); + configureServices(serviceCollection); builder.ApplicationServices = serviceCollection.BuildServiceProvider(builder.ApplicationServices); From aa9b259da767528503af42b34b6f4fded4e610f3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 18 May 2014 20:13:55 -0700 Subject: [PATCH 0172/1838] Updating kproj file to match tooling changes --- .gitignore | 3 ++- .../Microsoft.AspNet.FeatureModel.kproj | 6 +++--- src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 6 +++--- .../Microsoft.AspNet.HttpFeature.kproj | 6 +++--- src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.kproj | 6 +++--- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Http.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Owin.Tests.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 6 +++--- 10 files changed, 29 insertions(+), 28 deletions(-) diff --git a/.gitignore b/.gitignore index aba9c594d7..08e21e25bf 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ nuget.exe *DS_Store *.ncrunchsolution *.*sdf -*.ipch \ No newline at end of file +*.ipch +*.sln.ide \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 7a566cbcf8..21aae3fe0c 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 32a4c918-30ee-41db-8e26-8a3bb88ed231 Library @@ -24,5 +24,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 0b62b9b387..68f6341aeb 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd Library @@ -47,5 +47,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 2fef2807ae..37ce1da46d 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + d9128247-8f97-48b8-a863-f1f21a029fce Library @@ -38,5 +38,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 37d5045224..719dd4dcce 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 59bed991-f207-48ed-b24c-0a1d9c986c01 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 366ffd4df5..e283aadf56 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + bcf0f967-8753-4438-bd07-aadca9ce509a Library @@ -52,5 +52,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index eb170543e0..5dd7665e44 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + c5d2bae1-e182-48a0-aa74-1af14b782bf7 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 8b42411360..086e1cdc80 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + f16692b8-9f38-4dca-a582-e43172b989c6 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index 23a18cf7d4..c057512365 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 16219571-3268-4d12-8689-12b7163dba13 Library @@ -23,5 +23,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 073aabb443..052bc58358 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + aa99af26-f7b1-4a6b-a922-5c25539f6391 Library @@ -28,5 +28,5 @@ - + \ No newline at end of file From cab0d80f9d864c2a66013a7bb6260f7fb0e48950 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 18 May 2014 20:13:55 -0700 Subject: [PATCH 0173/1838] Updating kproj file to match tooling changes --- .gitignore | 3 ++- samples/KWebStartup/KWebStartup.kproj | 6 +++--- src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj | 6 +++--- .../Microsoft.AspNet.RequestContainer.kproj | 6 +++--- .../Microsoft.AspNet.TestHost.kproj | 6 +++--- .../Microsoft.AspNet.Hosting.Tests.kproj | 6 +++--- .../Microsoft.AspNet.TestHost.Tests.kproj | 6 +++--- 7 files changed, 20 insertions(+), 19 deletions(-) diff --git a/.gitignore b/.gitignore index aba9c594d7..08e21e25bf 100644 --- a/.gitignore +++ b/.gitignore @@ -22,4 +22,5 @@ nuget.exe *DS_Store *.ncrunchsolution *.*sdf -*.ipch \ No newline at end of file +*.ipch +*.sln.ide \ No newline at end of file diff --git a/samples/KWebStartup/KWebStartup.kproj b/samples/KWebStartup/KWebStartup.kproj index 0250b93f66..a776cdc9db 100644 --- a/samples/KWebStartup/KWebStartup.kproj +++ b/samples/KWebStartup/KWebStartup.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + a2f321a5-3f55-4413-b357-eef85dc0eca6 Library @@ -22,5 +22,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index 5e436ba601..102ee4062c 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 3944f036-7e75-47e8-aa52-c4b89a64ec3a Library @@ -44,5 +44,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj index 13fc912c56..35422bca16 100644 --- a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj +++ b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 374a5b0c-3e93-4a23-a4a0-ee2ab6df7814 Library @@ -23,5 +23,5 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index 0711ff81b0..3e50a40255 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 1a415a3f-1081-45db-809b-ee19cea02dc0 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 65a7bd78f0..2afbd680d6 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + d4f18d58-52b1-435d-a012-10f2cdf158c4 Library @@ -26,5 +26,5 @@ - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index cb04e9bc60..2c5387a97e 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -1,10 +1,10 @@ - + 12.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 0acb2719-9484-49b5-b8e3-117091192511 Library @@ -27,5 +27,5 @@ - + \ No newline at end of file From 3eb2f6c032d742f205ef6a2604c2883830ab9a67 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 May 2014 04:11:24 -0700 Subject: [PATCH 0174/1838] Updated build.sh --- build.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index db1e0c3dde..a918165425 100755 --- a/build.sh +++ b/build.sh @@ -4,9 +4,9 @@ if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else if x$XDG_DATA_HOME = x; then - cachedir=$HOME/.local/share + cachedir=$HOME/.local/share else - cachedir=$XDG_DATA_HOME; + cachedir=$XDG_DATA_HOME; fi fi mkdir -p $cachedir @@ -27,4 +27,14 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi +KRE_VERSION=$(mono .nuget/nuget.exe install KRE-mono45-x86 -pre -o ~/.kre/packages | head -1 | sed "s/.*KRE-mono45-x86 \([^']*\).*/\1/") +KRE_BIN=~/.kre/packages/KRE-mono45-x86.$KRE_VERSION/bin + +chmod +x $KRE_BIN/k +chmod +x $KRE_BIN/klr +chmod +x $KRE_BIN/kpm +chmod +x $KRE_BIN/k-build + +export PATH=$KRE_BIN:$PATH + mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file From d8ef441454d5910051e7eff051cd0fb9b00889d8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 May 2014 04:16:20 -0700 Subject: [PATCH 0175/1838] Updated build.sh --- build.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) mode change 100644 => 100755 build.sh diff --git a/build.sh b/build.sh old mode 100644 new mode 100755 index db1e0c3dde..a918165425 --- a/build.sh +++ b/build.sh @@ -4,9 +4,9 @@ if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else if x$XDG_DATA_HOME = x; then - cachedir=$HOME/.local/share + cachedir=$HOME/.local/share else - cachedir=$XDG_DATA_HOME; + cachedir=$XDG_DATA_HOME; fi fi mkdir -p $cachedir @@ -27,4 +27,14 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi +KRE_VERSION=$(mono .nuget/nuget.exe install KRE-mono45-x86 -pre -o ~/.kre/packages | head -1 | sed "s/.*KRE-mono45-x86 \([^']*\).*/\1/") +KRE_BIN=~/.kre/packages/KRE-mono45-x86.$KRE_VERSION/bin + +chmod +x $KRE_BIN/k +chmod +x $KRE_BIN/klr +chmod +x $KRE_BIN/kpm +chmod +x $KRE_BIN/k-build + +export PATH=$KRE_BIN:$PATH + mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file From 07daba445745c4398ba8cb14e738b6a5d3861cc8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 25 May 2014 10:03:44 -0700 Subject: [PATCH 0176/1838] Renamed Project.json to Project.json2 --- src/Microsoft.AspNet.TestHost/{project.json => Project.json2} | 0 .../{project.json => Project.json2} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.TestHost/{project.json => Project.json2} (100%) rename test/Microsoft.AspNet.TestHost.Tests/{project.json => Project.json2} (100%) diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/Project.json2 similarity index 100% rename from src/Microsoft.AspNet.TestHost/project.json rename to src/Microsoft.AspNet.TestHost/Project.json2 diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/Project.json2 similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/project.json rename to test/Microsoft.AspNet.TestHost.Tests/Project.json2 From f656f0dfe20942d43c9486e0b8b2b9ab25360782 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 25 May 2014 10:03:44 -0700 Subject: [PATCH 0177/1838] Fixed casing of project.json --- src/Microsoft.AspNet.TestHost/{Project.json2 => project.json} | 0 .../{Project.json2 => project.json} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.TestHost/{Project.json2 => project.json} (100%) rename test/Microsoft.AspNet.TestHost.Tests/{Project.json2 => project.json} (100%) diff --git a/src/Microsoft.AspNet.TestHost/Project.json2 b/src/Microsoft.AspNet.TestHost/project.json similarity index 100% rename from src/Microsoft.AspNet.TestHost/Project.json2 rename to src/Microsoft.AspNet.TestHost/project.json diff --git a/test/Microsoft.AspNet.TestHost.Tests/Project.json2 b/test/Microsoft.AspNet.TestHost.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/Project.json2 rename to test/Microsoft.AspNet.TestHost.Tests/project.json From e5724c7301916743530463706c3375c007f41778 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 25 May 2014 10:04:11 -0700 Subject: [PATCH 0178/1838] Renamed Project.json to Project.json2 --- src/Microsoft.AspNet.Owin/{Project.json => Project.json2} | 0 test/Microsoft.AspNet.Http.Tests/{Project.json => Project.json2} | 0 test/Microsoft.AspNet.Owin.Tests/{Project.json => Project.json2} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.Owin/{Project.json => Project.json2} (100%) rename test/Microsoft.AspNet.Http.Tests/{Project.json => Project.json2} (100%) rename test/Microsoft.AspNet.Owin.Tests/{Project.json => Project.json2} (100%) diff --git a/src/Microsoft.AspNet.Owin/Project.json b/src/Microsoft.AspNet.Owin/Project.json2 similarity index 100% rename from src/Microsoft.AspNet.Owin/Project.json rename to src/Microsoft.AspNet.Owin/Project.json2 diff --git a/test/Microsoft.AspNet.Http.Tests/Project.json b/test/Microsoft.AspNet.Http.Tests/Project.json2 similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Project.json rename to test/Microsoft.AspNet.Http.Tests/Project.json2 diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json b/test/Microsoft.AspNet.Owin.Tests/Project.json2 similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Project.json rename to test/Microsoft.AspNet.Owin.Tests/Project.json2 From 57717dd325bc2a072677cf7211c8191d4e94e8f9 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 25 May 2014 10:04:11 -0700 Subject: [PATCH 0179/1838] Fixed casing of project.json --- src/Microsoft.AspNet.Owin/{Project.json2 => project.json} | 0 test/Microsoft.AspNet.Http.Tests/{Project.json2 => project.json} | 0 test/Microsoft.AspNet.Owin.Tests/{Project.json2 => project.json} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.Owin/{Project.json2 => project.json} (100%) rename test/Microsoft.AspNet.Http.Tests/{Project.json2 => project.json} (100%) rename test/Microsoft.AspNet.Owin.Tests/{Project.json2 => project.json} (100%) diff --git a/src/Microsoft.AspNet.Owin/Project.json2 b/src/Microsoft.AspNet.Owin/project.json similarity index 100% rename from src/Microsoft.AspNet.Owin/Project.json2 rename to src/Microsoft.AspNet.Owin/project.json diff --git a/test/Microsoft.AspNet.Http.Tests/Project.json2 b/test/Microsoft.AspNet.Http.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Project.json2 rename to test/Microsoft.AspNet.Http.Tests/project.json diff --git a/test/Microsoft.AspNet.Owin.Tests/Project.json2 b/test/Microsoft.AspNet.Owin.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Project.json2 rename to test/Microsoft.AspNet.Owin.Tests/project.json From 124749de2835287c02ec9b70c6ce011805449399 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 26 May 2014 02:49:34 -0700 Subject: [PATCH 0180/1838] Fixed project.json casing --- .../Microsoft.AspNet.FeatureModel.kproj | 6 +++--- src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 6 +++--- .../Microsoft.AspNet.HttpFeature.kproj | 6 +++--- src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.kproj | 6 +++--- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Http.Tests.kproj | 6 +++--- .../Microsoft.AspNet.Owin.Tests.kproj | 6 +++--- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 6 +++--- 9 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 21aae3fe0c..1938d81a2f 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -25,4 +25,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 68f6341aeb..a93ecf8e2a 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -48,4 +48,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 37ce1da46d..38f5ea72e7 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -39,4 +39,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 719dd4dcce..825f49a06f 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index e283aadf56..957d775894 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -53,4 +53,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index 5dd7665e44..dddeb54073 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 086e1cdc80..883a9d895c 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index c057512365..e0adddc849 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -21,7 +21,7 @@ - + - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 052bc58358..13a5649e18 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -29,4 +29,4 @@ - \ No newline at end of file + From aa76fe3b4ffd9537aed10f7f58825dd17090bab3 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 27 May 2014 00:23:05 -0700 Subject: [PATCH 0181/1838] Fixed project.json casing --- samples/KWebStartup/KWebStartup.kproj | 6 +++--- src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj | 6 +++--- .../Microsoft.AspNet.RequestContainer.kproj | 6 +++--- .../Microsoft.AspNet.TestHost.kproj | 6 +++--- .../Microsoft.AspNet.Hosting.Tests.kproj | 6 +++--- .../Microsoft.AspNet.TestHost.Tests.kproj | 6 +++--- 6 files changed, 18 insertions(+), 18 deletions(-) diff --git a/samples/KWebStartup/KWebStartup.kproj b/samples/KWebStartup/KWebStartup.kproj index a776cdc9db..b900357cfd 100644 --- a/samples/KWebStartup/KWebStartup.kproj +++ b/samples/KWebStartup/KWebStartup.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,10 +17,10 @@ 2.0 - + - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index 102ee4062c..60f6546eb4 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -45,4 +45,4 @@ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj index 35422bca16..dbadd459f2 100644 --- a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj +++ b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,11 +17,11 @@ 2.0 - + - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index 3e50a40255..882610a036 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -17,7 +17,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 2afbd680d6..8ead4b5c01 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -27,4 +27,4 @@ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 2c5387a97e..0ce16dcb3d 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -1,4 +1,4 @@ - + 12.0 @@ -18,7 +18,7 @@ 2.0 - + @@ -28,4 +28,4 @@ - \ No newline at end of file + From a2fd1e1d908bc3ea7ff6969f5a850c68f8c476b0 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 28 May 2014 12:09:29 -0700 Subject: [PATCH 0182/1838] Remove options services from UseServices Add OptionsModel.OptionServices.DefaultServices instead --- .../ContainerExtensions.cs | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index d2ae5e3619..0a17cdb806 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -65,14 +65,6 @@ namespace Microsoft.AspNet.Builder { var serviceCollection = new ServiceCollection(); - // TODO: Review whether this is the right long term home, and whether Scoped is correct lifetime - serviceCollection.Add(new ServiceDescriptor - { - ServiceType = typeof(IOptionsAccessor<>), - ImplementationType = typeof(OptionsAccessor<>), - Lifecycle = LifecycleKind.Scoped - }); - configureServices(serviceCollection); builder.ApplicationServices = serviceCollection.BuildServiceProvider(builder.ApplicationServices); From 43ae61f7bcdb1cd3221d9fdfd4015cfd013aac7c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 30 May 2014 15:49:14 -0700 Subject: [PATCH 0183/1838] #23 - Implement graceful shutdown. --- .../ApplicationLifetime.cs | 72 +++++++++++++++++++ .../HostingContext.cs | 1 + src/Microsoft.AspNet.Hosting/HostingEngine.cs | 15 ++++ .../IApplicationLifetime.cs | 30 ++++++++ .../Microsoft.AspNet.Hosting.kproj | 4 +- src/Microsoft.AspNet.Hosting/Program.cs | 24 ++++++- 6 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs create mode 100644 src/Microsoft.AspNet.Hosting/IApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs new file mode 100644 index 0000000000..d1db40def4 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; + +namespace Microsoft.AspNet.Hosting +{ + /// + /// Allows consumers to perform cleanup during a graceful shutdown. + /// + public class ApplicationLifetime : IApplicationLifetime + { + private readonly CancellationTokenSource _stoppingSource = new CancellationTokenSource(); + private readonly CancellationTokenSource _stoppedSource = new CancellationTokenSource(); + + public ApplicationLifetime() + { + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// Request may still be in flight. Shutdown will block until this event completes. + /// + /// + public CancellationToken ApplicationStopping + { + get { return _stoppingSource.Token; } + } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// All requests should be complete at this point. Shutdown will block + /// until this event completes. + /// + /// + public CancellationToken ApplicationStopped + { + get { return _stoppedSource.Token; } + } + + /// + /// Signals the ApplicationStopping event and blocks until it completes. + /// + public void SignalStopping() + { + try + { + _stoppingSource.Cancel(throwOnFirstException: false); + } + catch (Exception) + { + // TODO: LOG + } + } + + /// + /// Signals the ApplicationStopped event and blocks until it completes. + /// + public void SignalStopped() + { + try + { + _stoppedSource.Cancel(throwOnFirstException: false); + } + catch (Exception) + { + // TODO: LOG + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index ea5685e6bb..7ad428b722 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -27,6 +27,7 @@ namespace Microsoft.AspNet.Hosting { public IServiceProvider Services { get; set; } public IConfiguration Configuration { get; set; } + public ApplicationLifetime Lifetime { get; set; } public IBuilder Builder { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index b8cecf5752..7458f5713b 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -21,6 +21,7 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.AspNet.Hosting { @@ -45,6 +46,7 @@ namespace Microsoft.AspNet.Hosting public IDisposable Start(HostingContext context) { + EnsureLifetime(context); EnsureBuilder(context); EnsureServerFactory(context); InitalizeServerFactory(context); @@ -55,11 +57,24 @@ namespace Microsoft.AspNet.Hosting return new Disposable(() => { + context.Lifetime.SignalStopping(); server.Dispose(); + context.Lifetime.SignalStopped(); pipeline.Dispose(); }); } + private void EnsureLifetime(HostingContext context) + { + if (context.Lifetime == null) + { + context.Lifetime = new ApplicationLifetime(); + } + var serviceCollection = new ServiceCollection(); + serviceCollection.AddInstance(context.Lifetime); + context.Services = serviceCollection.BuildServiceProvider(context.Services); + } + private void EnsureBuilder(HostingContext context) { if (context.Builder != null) diff --git a/src/Microsoft.AspNet.Hosting/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/IApplicationLifetime.cs new file mode 100644 index 0000000000..df20556da1 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IApplicationLifetime.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + /// + /// Allows consumers to perform cleanup during a graceful shutdown. + /// + [AssemblyNeutral] + public interface IApplicationLifetime + { + /// + /// Triggered when the application host is performing a graceful shutdown. + /// Request may still be in flight. Shutdown will block until this event completes. + /// + /// + CancellationToken ApplicationStopping { get; } + + /// + /// Triggered when the application host is performing a graceful shutdown. + /// All requests should be complete at this point. Shutdown will block + /// until this event completes. + /// + /// + CancellationToken ApplicationStopped { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index 60f6546eb4..c58f27a50a 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -20,6 +20,7 @@ + @@ -27,6 +28,7 @@ + @@ -45,4 +47,4 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 00b4a6af5c..8599267216 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -17,6 +17,8 @@ using System; using System.IO; +using System.Threading; +using System.Threading.Tasks; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; @@ -67,11 +69,29 @@ namespace Microsoft.AspNet.Hosting throw new Exception("TODO: IHostingEngine service not available exception"); } - using (engine.Start(context)) + var appShutdownService = _serviceProvider.GetService(); + if (appShutdownService == null) + { + throw new Exception("TODO: IApplicationShutdown service not available"); + } + var shutdownHandle = new ManualResetEvent(false); + + var serverShutdown = engine.Start(context); + + appShutdownService.ShutdownRequested.Register(() => + { + serverShutdown.Dispose(); + shutdownHandle.Set(); + }); + + Task ignored = Task.Run(() => { Console.WriteLine("Started"); Console.ReadLine(); - } + appShutdownService.RequestShutdown(); + }); + + shutdownHandle.WaitOne(); } } } From 25db4123324908bca1f417cba2b4ed9e23598306 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 30 May 2014 16:30:51 -0700 Subject: [PATCH 0184/1838] Clean up IApplicaitonLifetime service injection. --- src/Microsoft.AspNet.Hosting/HostingContext.cs | 1 - src/Microsoft.AspNet.Hosting/HostingEngine.cs | 17 +++-------------- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 ++ src/Microsoft.AspNet.Hosting/Program.cs | 2 +- 4 files changed, 6 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index 7ad428b722..ea5685e6bb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -27,7 +27,6 @@ namespace Microsoft.AspNet.Hosting { public IServiceProvider Services { get; set; } public IConfiguration Configuration { get; set; } - public ApplicationLifetime Lifetime { get; set; } public IBuilder Builder { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 7458f5713b..eac137bb38 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -46,35 +46,24 @@ namespace Microsoft.AspNet.Hosting public IDisposable Start(HostingContext context) { - EnsureLifetime(context); EnsureBuilder(context); EnsureServerFactory(context); InitalizeServerFactory(context); EnsureApplicationDelegate(context); + var applicationLifetime = (ApplicationLifetime)context.Services.GetService(); var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate); var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); return new Disposable(() => { - context.Lifetime.SignalStopping(); + applicationLifetime.SignalStopping(); server.Dispose(); - context.Lifetime.SignalStopped(); pipeline.Dispose(); + applicationLifetime.SignalStopped(); }); } - private void EnsureLifetime(HostingContext context) - { - if (context.Lifetime == null) - { - context.Lifetime = new ApplicationLifetime(); - } - var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance(context.Lifetime); - context.Services = serviceCollection.BuildServiceProvider(context.Services); - } - private void EnsureBuilder(HostingContext context) { if (context.Builder != null) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index c7376cd52e..e0995468d9 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -49,6 +49,8 @@ namespace Microsoft.AspNet.Hosting yield return describer.Transient(); + yield return describer.Instance(new ApplicationLifetime()); + // TODO: We expect this to be provide by the runtime eventually. yield return describer.Instance(new NullLoggerFactory()); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 8599267216..b1f694e018 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -84,7 +84,7 @@ namespace Microsoft.AspNet.Hosting shutdownHandle.Set(); }); - Task ignored = Task.Run(() => + var ignored = Task.Run(() => { Console.WriteLine("Started"); Console.ReadLine(); From 04ca5e968d748e963c136187be9c69c1fc5115a7 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 30 May 2014 22:32:37 -0700 Subject: [PATCH 0185/1838] Fixed tests --- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index d6cbf86841..96915f09fd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -55,6 +55,7 @@ namespace Microsoft.AspNet.Hosting var context = new HostingContext { ServerFactory = this, + Services = services, ApplicationName = "Microsoft.AspNet.Hosting.Tests" }; From 63f643e0c1d9be3485300a297a74b13c8ed8299e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 31 May 2014 00:04:06 -0700 Subject: [PATCH 0186/1838] Fix up the project/sln files --- Hosting.sln | 130 +++++++++--------- .../Microsoft.AspNet.Hosting.Tests.kproj | 5 +- 2 files changed, 65 insertions(+), 70 deletions(-) diff --git a/Hosting.sln b/Hosting.sln index f9376adc31..66ecdc97c7 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.30401.0 +# Visual Studio 14 +VisualStudioVersion = 14.0.21723.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -31,72 +31,66 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.ActiveCfg = Debug|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.Build.0 = Debug|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|x86.ActiveCfg = Debug|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|x86.Build.0 = Debug|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Any CPU.ActiveCfg = Release|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Mixed Platforms.Build.0 = Release|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.ActiveCfg = Release|x86 - {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.Build.0 = Release|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.ActiveCfg = Debug|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.Build.0 = Debug|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|x86.ActiveCfg = Debug|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|x86.Build.0 = Debug|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Any CPU.ActiveCfg = Release|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Mixed Platforms.Build.0 = Release|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.ActiveCfg = Release|x86 - {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.Build.0 = Release|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.ActiveCfg = Debug|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.Build.0 = Debug|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|x86.ActiveCfg = Debug|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|x86.Build.0 = Debug|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Any CPU.ActiveCfg = Release|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Mixed Platforms.Build.0 = Release|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.ActiveCfg = Release|x86 - {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.Build.0 = Release|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.Build.0 = Debug|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|x86.ActiveCfg = Debug|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|x86.Build.0 = Debug|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Any CPU.ActiveCfg = Release|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.Build.0 = Release|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.ActiveCfg = Release|x86 - {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.Build.0 = Release|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.ActiveCfg = Debug|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.Build.0 = Debug|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.ActiveCfg = Debug|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.Build.0 = Debug|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Any CPU.ActiveCfg = Release|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.Build.0 = Release|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|x86 - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.Build.0 = Release|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.Build.0 = Debug|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.ActiveCfg = Debug|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.Build.0 = Debug|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Any CPU.ActiveCfg = Release|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.Build.0 = Release|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|x86.ActiveCfg = Release|x86 - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|x86.Build.0 = Release|x86 + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Debug|x86.ActiveCfg = Debug|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Any CPU.Build.0 = Release|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {0ACB2719-9484-49B5-B8E3-117091192511}.Release|x86.ActiveCfg = Release|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Debug|x86.ActiveCfg = Debug|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Any CPU.Build.0 = Release|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1A415A3F-1081-45DB-809B-EE19CEA02DC0}.Release|x86.ActiveCfg = Release|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Any CPU.Build.0 = Release|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3944F036-7E75-47E8-AA52-C4B89A64EC3A}.Release|x86.ActiveCfg = Release|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Debug|x86.ActiveCfg = Debug|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Any CPU.Build.0 = Release|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.ActiveCfg = Release|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.Build.0 = Debug|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.ActiveCfg = Debug|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Any CPU.ActiveCfg = Release|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Any CPU.Build.0 = Release|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Any CPU.Build.0 = Release|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 8ead4b5c01..0ffb62252d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -21,10 +21,11 @@ - + + - + \ No newline at end of file From 44503744a37bfeee687ceb05ebc4d930c82e6a8d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 3 Jun 2014 10:15:37 -0700 Subject: [PATCH 0187/1838] Adding switch to build.cmd to skip KRE install --- build.cmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.cmd b/build.cmd index 903d532df3..3aaf957583 100644 --- a/build.cmd +++ b/build.cmd @@ -18,6 +18,8 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion + +IF "%SKIP_KRE_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 From 7d4345f62fd157b26ae205aed2e9b70fa8235449 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 3 Jun 2014 10:15:47 -0700 Subject: [PATCH 0188/1838] Adding switch to build.cmd to skip KRE install --- build.cmd | 2 ++ 1 file changed, 2 insertions(+) diff --git a/build.cmd b/build.cmd index 903d532df3..3aaf957583 100644 --- a/build.cmd +++ b/build.cmd @@ -18,6 +18,8 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion + +IF "%SKIP_KRE_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 From 3fb1a06e258ebad0a13c84a1c2f524dd2aace2ec Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 3 Jun 2014 15:03:57 -0700 Subject: [PATCH 0189/1838] Add OptionsServices in UseServices --- src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs | 2 ++ src/Microsoft.AspNet.RequestContainer/project.json | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 0a17cdb806..5e60f67127 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -22,6 +22,7 @@ using System.Reflection; using Microsoft.AspNet.RequestContainer; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Builder { @@ -65,6 +66,7 @@ namespace Microsoft.AspNet.Builder { var serviceCollection = new ServiceCollection(); + serviceCollection.Add(OptionsServices.GetDefaultServices()); configureServices(serviceCollection); builder.ApplicationServices = serviceCollection.BuildServiceProvider(builder.ApplicationServices); diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 1a1a36198f..75819c8802 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -2,7 +2,8 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Http": "0.1-alpha-*", - "Microsoft.Framework.DependencyInjection": "0.1-alpha-*" + "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", + "Microsoft.Framework.OptionsModel": "0.1-alpha-*" }, "configurations": { "net45": {}, From 45dcd20268974bd113d6c39ebef8b177f0f46091 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 10 Jun 2014 17:22:35 -0700 Subject: [PATCH 0190/1838] Updating build.sh based on KRuntime changes --- build.sh | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/build.sh b/build.sh index a918165425..4323aefc48 100755 --- a/build.sh +++ b/build.sh @@ -3,10 +3,10 @@ if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else - if x$XDG_DATA_HOME = x; then - cachedir=$HOME/.local/share + if [ -z $XDG_DATA_HOME ]; then + cachedir=$HOME/.local/share else - cachedir=$XDG_DATA_HOME; + cachedir=$XDG_DATA_HOME; fi fi mkdir -p $cachedir @@ -14,12 +14,12 @@ mkdir -p $cachedir url=https://www.nuget.org/nuget.exe if test ! -f $cachedir/nuget.exe; then - wget -o $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null + wget -O $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null fi if test ! -e .nuget; then mkdir .nuget - cp $cachedir/nuget.exe .nuget + cp $cachedir/nuget.exe .nuget/nuget.exe fi if test ! -d packages/KoreBuild; then @@ -27,14 +27,12 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi -KRE_VERSION=$(mono .nuget/nuget.exe install KRE-mono45-x86 -pre -o ~/.kre/packages | head -1 | sed "s/.*KRE-mono45-x86 \([^']*\).*/\1/") -KRE_BIN=~/.kre/packages/KRE-mono45-x86.$KRE_VERSION/bin +if ! type k > /dev/null 2>&1; then + source setup/kvm.sh +fi -chmod +x $KRE_BIN/k -chmod +x $KRE_BIN/klr -chmod +x $KRE_BIN/kpm -chmod +x $KRE_BIN/k-build +if ! type k > /dev/null 2>&1; then + kvm upgrade +fi -export PATH=$KRE_BIN:$PATH - -mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file +mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From ae6004dd11a6df89fc8c1681dd307ade4f30ec3e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 10 Jun 2014 17:22:44 -0700 Subject: [PATCH 0191/1838] Updating build.sh based on KRuntime changes --- build.sh | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/build.sh b/build.sh index a918165425..4323aefc48 100755 --- a/build.sh +++ b/build.sh @@ -3,10 +3,10 @@ if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else - if x$XDG_DATA_HOME = x; then - cachedir=$HOME/.local/share + if [ -z $XDG_DATA_HOME ]; then + cachedir=$HOME/.local/share else - cachedir=$XDG_DATA_HOME; + cachedir=$XDG_DATA_HOME; fi fi mkdir -p $cachedir @@ -14,12 +14,12 @@ mkdir -p $cachedir url=https://www.nuget.org/nuget.exe if test ! -f $cachedir/nuget.exe; then - wget -o $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null + wget -O $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null fi if test ! -e .nuget; then mkdir .nuget - cp $cachedir/nuget.exe .nuget + cp $cachedir/nuget.exe .nuget/nuget.exe fi if test ! -d packages/KoreBuild; then @@ -27,14 +27,12 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi -KRE_VERSION=$(mono .nuget/nuget.exe install KRE-mono45-x86 -pre -o ~/.kre/packages | head -1 | sed "s/.*KRE-mono45-x86 \([^']*\).*/\1/") -KRE_BIN=~/.kre/packages/KRE-mono45-x86.$KRE_VERSION/bin +if ! type k > /dev/null 2>&1; then + source setup/kvm.sh +fi -chmod +x $KRE_BIN/k -chmod +x $KRE_BIN/klr -chmod +x $KRE_BIN/kpm -chmod +x $KRE_BIN/k-build +if ! type k > /dev/null 2>&1; then + kvm upgrade +fi -export PATH=$KRE_BIN:$PATH - -mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" \ No newline at end of file +mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From 25bbfa7165dcffccbe1969a1635a2ec8e95a6a8f Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Wed, 11 Jun 2014 12:14:37 -0700 Subject: [PATCH 0192/1838] Fix test now that ServiceProvider throws a generic exception aspnet/DependencyInjection#87 --- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index c1b0ea1fb3..b486dd3ffb 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -66,9 +66,7 @@ namespace Microsoft.AspNet.TestHost.Tests .BuildServiceProvider(); // Act & Assert - Assert.Throws( - "serviceProvider", - () => TestServer.Create(services, new Startup().Configuration)); + Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); } public class Startup From abbd763f0f9d8e835c53fb28e7c4c0e14df5889f Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Wed, 11 Jun 2014 18:32:40 -0700 Subject: [PATCH 0193/1838] Use GetServiceOrDefault for optional dependency --- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index eac137bb38..88f1dc5184 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -78,7 +78,7 @@ namespace Microsoft.AspNet.Hosting { if (context.ServerFactory == null) { - context.ServerFactory = context.Services.GetService(); + context.ServerFactory = context.Services.GetServiceOrDefault(); } if (context.ServerFactory != null) { From b9d7561bf9a4036b2ab809d5a2ab9208526b0758 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 12 Jun 2014 15:04:56 -0700 Subject: [PATCH 0194/1838] Enable WebSocket and Opaque features. --- src/Microsoft.AspNet.Http/HttpContext.cs | 12 ++++++ src/Microsoft.AspNet.Http/project.json | 1 + .../IHttpOpaqueUpgradeFeature.cs | 13 ++++++ .../IHttpWebSocketFeature.cs | 9 ++-- .../IWebSocketAcceptContext.cs | 13 ++++++ .../Microsoft.AspNet.HttpFeature.kproj | 4 +- src/Microsoft.AspNet.HttpFeature/project.json | 1 + .../DefaultHttpContext.cs | 43 ++++++++++++++++++- .../Infrastructure/Constants.cs | 1 + .../Microsoft.AspNet.PipelineCore.kproj | 3 +- .../WebSocketAcceptContext.cs | 12 ++++++ .../project.json | 1 + .../OwinEnvironmentTests.cs | 16 +++++++ 13 files changed, 120 insertions(+), 9 deletions(-) create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 7bad161454..7bd166d4da 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; @@ -27,6 +28,10 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken OnRequestAborted { get; } + public abstract bool IsWebSocketRequest { get; } + + public abstract IList WebSocketRequestedProtocols { get; } + public abstract void Abort(); public abstract void Dispose(); @@ -60,5 +65,12 @@ namespace Microsoft.AspNet.Http } public abstract Task> AuthenticateAsync(IList authenticationTypes); + + public virtual Task AcceptWebSocketAsync() + { + return AcceptWebSocket(subProtocol: null); + } + + public abstract Task AcceptWebSocket(string subProtocol); } } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index f626e3463a..11a017e2d5 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -5,6 +5,7 @@ "net45": {}, "k10": { "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs new file mode 100644 index 0000000000..f4fb2f4f0f --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs @@ -0,0 +1,13 @@ +using System.IO; +using System.Threading.Tasks; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface IHttpOpaqueUpgradeFeature + { + bool IsUpgradableRequest { get; } + Task UpgradeAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs index a04a584532..3d87e86bb4 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#if NET45 using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.Framework.Runtime; @@ -11,8 +10,8 @@ namespace Microsoft.AspNet.HttpFeature [AssemblyNeutral] public interface IHttpWebSocketFeature { - bool IsWebSocketRequest { get; set; } - Task AcceptAsync(); + bool IsWebSocketRequest { get; } + + Task AcceptAsync(IWebSocketAcceptContext context); } -} -#endif \ No newline at end of file +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs new file mode 100644 index 0000000000..dbcc14c7ce --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface IWebSocketAcceptContext + { + string SubProtocol { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 38f5ea72e7..96237c3118 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -24,12 +24,14 @@ + + @@ -39,4 +41,4 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 7060443fce..2fa40105ad 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -4,6 +4,7 @@ "net45": {}, "k10": { "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", "System.IO": "4.0.0.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index a5c559f112..4a8b059972 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -4,12 +4,14 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -19,6 +21,8 @@ namespace Microsoft.AspNet.PipelineCore { public class DefaultHttpContext : HttpContext { + private static IList EmptyList = new List(); + private readonly HttpRequest _request; private readonly HttpResponse _response; @@ -26,6 +30,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _serviceProviders; private FeatureReference _authentication; private FeatureReference _lifetime; + private FeatureReference _webSockets; private IFeatureCollection _features; public DefaultHttpContext(IFeatureCollection features) @@ -37,6 +42,8 @@ namespace Microsoft.AspNet.PipelineCore _items = FeatureReference.Default; _serviceProviders = FeatureReference.Default; _authentication = FeatureReference.Default; + _lifetime = FeatureReference.Default; + _webSockets = FeatureReference.Default; } IItemsFeature ItemsFeature @@ -59,6 +66,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _lifetime.Fetch(_features); } } + private IHttpWebSocketFeature WebSocketFeature + { + get { return _webSockets.Fetch(_features); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -110,6 +122,23 @@ namespace Microsoft.AspNet.PipelineCore } } + public override bool IsWebSocketRequest + { + get + { + var webSocketFeature = WebSocketFeature; + return webSocketFeature != null && webSocketFeature.IsWebSocketRequest; + } + } + + public override IList WebSocketRequestedProtocols + { + get + { + return Request.Headers.GetValues(Constants.Headers.WebSocketSubProtocols) ?? EmptyList; + } + } + public override void Abort() { var lifetime = LifetimeFeature; @@ -196,5 +225,15 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } + + public override Task AcceptWebSocket(string subProtocol) + { + var webSocketFeature = WebSocketFeature; + if (WebSocketFeature == null) + { + throw new NotSupportedException("WebSockets are not supported"); + } + return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } ); + } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index e0cf75c268..1f440b0bf1 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -22,6 +22,7 @@ namespace Microsoft.AspNet.Http.Infrastructure internal const string Cookie = "Cookie"; internal const string SetCookie = "Set-Cookie"; internal const string Expires = "Expires"; + internal const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 957d775894..05dd7de5dd 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -51,6 +51,7 @@ + - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs new file mode 100644 index 0000000000..6e9a7ba0dd --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.PipelineCore +{ + public class WebSocketAcceptContext : IWebSocketAcceptContext + { + public virtual string SubProtocol { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 3af3011dda..0c280000e8 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -10,6 +10,7 @@ "net45": {}, "k10": { "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 5cd6230df6..87ae8aeb28 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; @@ -113,10 +114,25 @@ namespace Microsoft.AspNet.Owin get { throw new NotImplementedException(); } } + public override bool IsWebSocketRequest + { + get { throw new NotImplementedException(); } + } + + public override IList WebSocketRequestedProtocols + { + get { throw new NotImplementedException(); } + } + public override void Abort() { throw new NotImplementedException(); } + + public override Task AcceptWebSocket(string subProtocol) + { + throw new NotImplementedException(); + } } private class MoqHttpRequest : HttpRequest, IHttpRequestFeature From 434a128f1a1ee8ad78bc9eea0bc6c3d5f916dcc5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 13 Jun 2014 08:37:23 -0700 Subject: [PATCH 0195/1838] Rename AcceptWebSocket to AcceptWebSocketAsync. --- src/Microsoft.AspNet.Http/HttpContext.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 7bd166d4da..f14a8b059b 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -68,9 +68,9 @@ namespace Microsoft.AspNet.Http public virtual Task AcceptWebSocketAsync() { - return AcceptWebSocket(subProtocol: null); + return AcceptWebSocketAsync(subProtocol: null); } - public abstract Task AcceptWebSocket(string subProtocol); + public abstract Task AcceptWebSocketAsync(string subProtocol); } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 4a8b059972..b8383d05fe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -226,7 +226,7 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } - public override Task AcceptWebSocket(string subProtocol) + public override Task AcceptWebSocketAsync(string subProtocol) { var webSocketFeature = WebSocketFeature; if (WebSocketFeature == null) diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 87ae8aeb28..44f182db49 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -129,7 +129,7 @@ namespace Microsoft.AspNet.Owin throw new NotImplementedException(); } - public override Task AcceptWebSocket(string subProtocol) + public override Task AcceptWebSocketAsync(string subProtocol) { throw new NotImplementedException(); } From 0ab560e08695e709fc650eb31026c8c0b2a44b31 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Mon, 16 Jun 2014 18:30:51 -0700 Subject: [PATCH 0196/1838] Add UseServices overload that takes a Func returning IServiceProvider - This should be useful for third-party IoC containers --- .../ContainerExtensions.cs | 12 +++++- .../Microsoft.AspNet.Hosting.Tests.kproj | 1 + .../UseServicesFacts.cs | 43 +++++++++++++++++++ .../project.json | 1 + 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 5e60f67127..45b7375683 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -63,12 +63,20 @@ namespace Microsoft.AspNet.Builder } public static IBuilder UseServices(this IBuilder builder, Action configureServices) + { + return builder.UseServices(serviceCollection => + { + configureServices(serviceCollection); + return serviceCollection.BuildServiceProvider(builder.ApplicationServices); + }); + } + + public static IBuilder UseServices(this IBuilder builder, Func configureServices) { var serviceCollection = new ServiceCollection(); serviceCollection.Add(OptionsServices.GetDefaultServices()); - configureServices(serviceCollection); - builder.ApplicationServices = serviceCollection.BuildServiceProvider(builder.ApplicationServices); + builder.ApplicationServices = configureServices(serviceCollection); return builder.UseMiddleware(typeof(ContainerMiddleware)); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 0ffb62252d..412181c036 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -26,6 +26,7 @@ + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs new file mode 100644 index 0000000000..df88e1e855 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -0,0 +1,43 @@ +using System; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.OptionsModel; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class UseServicesFacts + { + [Fact] + public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithAction() + { + var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); + var builder = new Microsoft.AspNet.Builder.Builder(baseServiceProvider); + + builder.UseServices(serviceCollection => { }); + + var optionsAccessor = builder.ApplicationServices.GetService>(); + Assert.NotNull(optionsAccessor); + } + + + [Fact] + public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithFunc() + { + var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); + var builder = new Microsoft.AspNet.Builder.Builder(baseServiceProvider); + IServiceProvider serviceProvider = null; + + builder.UseServices(serviceCollection => + { + serviceProvider = serviceCollection.BuildServiceProvider(builder.ApplicationServices); + return serviceProvider; + }); + + Assert.Same(serviceProvider, builder.ApplicationServices); + var optionsAccessor = builder.ApplicationServices.GetService>(); + Assert.NotNull(optionsAccessor); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 50ffba28ed..7ad9bce822 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,6 +2,7 @@ "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", + "Microsoft.AspNet.RequestContainer": "", "xunit.abstractions": "2.0.0-aspnet-*", "xunit.assert": "2.0.0-aspnet-*", "xunit.core": "2.0.0-aspnet-*", From 45933b149e2198c147354d843c745286e6c6f637 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 17 Jun 2014 15:10:13 -0700 Subject: [PATCH 0197/1838] IServerFactory is never a registered service IServerManager is registered when needed Or the caller may provide context.ServerFactory instance when an override is needed --- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 88f1dc5184..f921780c8e 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -76,10 +76,6 @@ namespace Microsoft.AspNet.Hosting private void EnsureServerFactory(HostingContext context) { - if (context.ServerFactory == null) - { - context.ServerFactory = context.Services.GetServiceOrDefault(); - } if (context.ServerFactory != null) { return; From e34a149f858964c468ae7f818789478237a74e6a Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 18 Jun 2014 16:28:11 -0700 Subject: [PATCH 0198/1838] Change the default author in makefile.shade --- makefile.shade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile.shade b/makefile.shade index 6357ea2841..562494d144 100644 --- a/makefile.shade +++ b/makefile.shade @@ -1,7 +1,7 @@ var VERSION='0.1' var FULL_VERSION='0.1' -var AUTHORS='Microsoft' +var AUTHORS='Microsoft Open Technologies, Inc.' use-standard-lifecycle k-standard-goals From cd906e306ed9792c14913fc685d3977f2c0eaacd Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 18 Jun 2014 16:28:59 -0700 Subject: [PATCH 0199/1838] Change the default author in makefile.shade --- makefile.shade | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/makefile.shade b/makefile.shade index 6357ea2841..562494d144 100644 --- a/makefile.shade +++ b/makefile.shade @@ -1,7 +1,7 @@ var VERSION='0.1' var FULL_VERSION='0.1' -var AUTHORS='Microsoft' +var AUTHORS='Microsoft Open Technologies, Inc.' use-standard-lifecycle k-standard-goals From 2ae3a24a16dfd8df48edb029ac4b62ab0b68abc0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 18 Jun 2014 15:50:14 -0700 Subject: [PATCH 0200/1838] Remove CallCancelled property. Fix Owin query string. Add Owin user. Add Owin tests. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 7 - src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 39 ++- .../DefaultHttpRequest.cs | 13 - .../OwinEnvironmentTests.cs | 315 +++++++----------- 4 files changed, 155 insertions(+), 219 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index a59ae78ab6..9a09b01a65 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -120,12 +120,5 @@ namespace Microsoft.AspNet.Http /// /// The owin.RequestBody Stream. public abstract Stream Body { get; set; } - - /// - /// Gets or sets the cancellation token for the request. - /// - /// The cancellation token for the request. - public abstract CancellationToken CallCanceled { get; set; } - } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index c624e1a8c0..38cb35443c 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -8,11 +8,14 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Security.Claims; using System.Security.Cryptography.X509Certificates; +using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; namespace Microsoft.AspNet.Owin { @@ -28,12 +31,14 @@ namespace Microsoft.AspNet.Owin _context = context; _entries = new Dictionary() { + { OwinConstants.CallCancelled, new FeatureMap(feature => feature.OnRequestAborted) }, { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => feature.QueryString, (feature, value) => feature.QueryString = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => RemoveQuestionMark(feature.QueryString), + (feature, value) => feature.QueryString = AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, @@ -56,6 +61,8 @@ namespace Microsoft.AspNet.Owin { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, + + { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = MakeClaimsPrincipal((IPrincipal)value)) }, }; if (context.Request.IsSecure) @@ -222,6 +229,36 @@ namespace Microsoft.AspNet.Owin throw new NotImplementedException(); } + private string RemoveQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + if (queryString[0] == '?') + { + return queryString.Substring(1); + } + } + return queryString; + } + + private string AddQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + return '?' + queryString; + } + return queryString; + } + + private ClaimsPrincipal MakeClaimsPrincipal(IPrincipal principal) + { + if (principal is ClaimsPrincipal) + { + return principal as ClaimsPrincipal; + } + return new ClaimsPrincipal(principal); + } + public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 09106220e0..e99c7e0b02 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -149,18 +149,5 @@ namespace Microsoft.AspNet.PipelineCore { get { return RequestCookiesFeature.Cookies; } } - - public override System.Threading.CancellationToken CallCanceled - { - get - { - // TODO: Which feature exposes this? - return CancellationToken.None; - } - set - { - throw new NotImplementedException(); - } - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 44f182db49..ea603bc501 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -4,13 +4,14 @@ using System; using System.Collections.Generic; using System.IO; -using System.Net.WebSockets; +using System.Linq; using System.Security.Claims; using System.Threading; -using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore; using Xunit; namespace Microsoft.AspNet.Owin @@ -26,230 +27,148 @@ namespace Microsoft.AspNet.Owin [Fact] public void OwinEnvironmentCanBeCreated() { - MoqHttpContext context = new MoqHttpContext(); + HttpContext context = CreateContext(); context.Request.Method = "SomeMethod"; + context.User = new ClaimsPrincipal(new ClaimsIdentity("Foo")); + context.Request.Body = Stream.Null; + context.Request.Headers["CustomRequestHeader"] = "CustomRequestValue"; + context.Request.Path = new PathString("/path"); + context.Request.PathBase = new PathString("/pathBase"); + context.Request.Protocol = "http/1.0"; + context.Request.QueryString = new QueryString("?key=value"); + context.Request.Scheme = "http"; + context.Response.Body = Stream.Null; + context.Response.Headers["CustomResponseHeader"] = "CustomResponseValue"; + context.Response.StatusCode = 201; + + IDictionary env = new OwinEnvironment(context); + Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); + Assert.Equal("Foo", Get(env, "server.User").Identity.AuthenticationType); + Assert.Same(Stream.Null, Get(env, "owin.RequestBody")); + var requestHeaders = Get>(env, "owin.RequestHeaders"); + Assert.NotNull(requestHeaders); + Assert.Equal("CustomRequestValue", requestHeaders["CustomRequestHeader"].First()); + Assert.Equal("/path", Get(env, "owin.RequestPath")); + Assert.Equal("/pathBase", Get(env, "owin.RequestPathBase")); + Assert.Equal("http/1.0", Get(env, "owin.RequestProtocol")); + Assert.Equal("key=value", Get(env, "owin.RequestQueryString")); + Assert.Equal("http", Get(env, "owin.RequestScheme")); + + Assert.Same(Stream.Null, Get(env, "owin.ResponseBody")); + var responseHeaders = Get>(env, "owin.ResponseHeaders"); + Assert.NotNull(responseHeaders); + Assert.Equal("CustomResponseValue", responseHeaders["CustomResponseHeader"].First()); + Assert.Equal(201, Get(env, "owin.ResponseStatusCode")); + } + + [Fact] + public void OwinEnvironmentCanBeModified() + { + HttpContext context = CreateContext(); IDictionary env = new OwinEnvironment(context); - Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); - env["owin.RequestMethod"] = "SomeOtherMethod"; - Assert.Equal("SomeOtherMethod", context.Request.Method); + env["owin.RequestMethod"] = "SomeMethod"; + env["server.User"] = new ClaimsPrincipal(new ClaimsIdentity("Foo")); + env["owin.RequestBody"] = Stream.Null; + var requestHeaders = Get>(env, "owin.RequestHeaders"); + Assert.NotNull(requestHeaders); + requestHeaders["CustomRequestHeader"] = new[] { "CustomRequestValue" }; + env["owin.RequestPath"] = "/path"; + env["owin.RequestPathBase"] = "/pathBase"; + env["owin.RequestProtocol"] = "http/1.0"; + env["owin.RequestQueryString"] = "key=value"; + env["owin.RequestScheme"] = "http"; + env["owin.ResponseBody"] = Stream.Null; + var responseHeaders = Get>(env, "owin.ResponseHeaders"); + Assert.NotNull(responseHeaders); + responseHeaders["CustomResponseHeader"] = new[] { "CustomResponseValue" }; + env["owin.ResponseStatusCode"] = 201; + + Assert.Equal("SomeMethod", context.Request.Method); + Assert.Equal("Foo", context.User.Identity.AuthenticationType); + Assert.Same(Stream.Null, context.Request.Body); + Assert.Equal("CustomRequestValue", context.Request.Headers["CustomRequestHeader"]); + Assert.Equal("/path", context.Request.Path.Value); + Assert.Equal("/pathBase", context.Request.PathBase.Value); + Assert.Equal("http/1.0", context.Request.Protocol); + Assert.Equal("?key=value", context.Request.QueryString.Value); + Assert.Equal("http", context.Request.Scheme); + + Assert.Same(Stream.Null, context.Response.Body); + Assert.Equal("CustomResponseValue", context.Response.Headers["CustomResponseHeader"]); + Assert.Equal(201, context.Response.StatusCode); } - private class MoqHttpContext : HttpContext + private HttpContext CreateContext() { - private HttpRequest _request; - private IDictionary _items; + var features = new FeatureCollection(); + features.Add(typeof(IHttpRequestFeature), new MoqHttpRequestFeature()); + features.Add(typeof(IHttpResponseFeature), new MoqHttpResponseFeature()); + features.Add(typeof(IHttpAuthenticationFeature), new MoqHttpAuthenticationFeature()); + features.Add(typeof(IHttpRequestLifetimeFeature), new MoqHttpRequestLifetimeFeature()); + return new DefaultHttpContext(features); + } - public MoqHttpContext() + private class MoqHttpRequestFeature : IHttpRequestFeature + { + public MoqHttpRequestFeature() { - _request = new MoqHttpRequest(); - _items = new Dictionary(); + Headers = new Dictionary(); } - public override HttpRequest Request + public string Method { get; set; } + + public string Scheme { get; set; } + + public string Protocol { get; set; } + + public Stream Body { get; set; } + + public string PathBase { get; set; } + + public string Path { get; set; } + + public string QueryString { get; set; } + + public IDictionary Headers { get; set; } + } + + private class MoqHttpResponseFeature : IHttpResponseFeature + { + public MoqHttpResponseFeature() { - get { return _request; } + Headers = new Dictionary(); } - public override HttpResponse Response - { - get { throw new NotImplementedException(); } - } + public Stream Body { get; set; } - public override ClaimsPrincipal User - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + public int StatusCode { get; set; } - public override IDictionary Items - { - get { return _items; } - } + public string ReasonPhrase { get; set; } - public override IServiceProvider ApplicationServices - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + public IDictionary Headers { get; set; } - public override IServiceProvider RequestServices - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override void Dispose() - { - throw new NotImplementedException(); - } - - public override object GetFeature(Type type) - { - return Request; - } - - public override void SetFeature(Type type, object instance) - { - throw new NotImplementedException(); - } - - public override IEnumerable GetAuthenticationTypes() - { - throw new NotImplementedException(); - } - - public override IEnumerable Authenticate(IList authenticationTypes) - { - throw new NotImplementedException(); - } - - public override Task> AuthenticateAsync(IList authenticationTypes) - { - throw new NotImplementedException(); - } - - public override CancellationToken OnRequestAborted - { - get { throw new NotImplementedException(); } - } - - public override bool IsWebSocketRequest - { - get { throw new NotImplementedException(); } - } - - public override IList WebSocketRequestedProtocols - { - get { throw new NotImplementedException(); } - } - - public override void Abort() - { - throw new NotImplementedException(); - } - - public override Task AcceptWebSocketAsync(string subProtocol) + public void OnSendingHeaders(Action callback, object state) { throw new NotImplementedException(); } } - private class MoqHttpRequest : HttpRequest, IHttpRequestFeature + private class MoqHttpAuthenticationFeature : IHttpAuthenticationFeature { - public override HttpContext HttpContext - { - get { throw new NotImplementedException(); } - } + public ClaimsPrincipal User { get; set; } - public override string Method - { - get; - set; - } + public IAuthenticationHandler Handler { get; set; } + } - public override string Scheme - { - get; - set; - } + private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature + { + public CancellationToken OnRequestAborted { get; private set; } - public override bool IsSecure - { - get { return false; } - } - - public override HostString Host - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override PathString PathBase - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override PathString Path - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override QueryString QueryString - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override IReadableStringCollection Query - { - get { throw new NotImplementedException(); } - } - - public override Task GetFormAsync() + public void Abort() { throw new NotImplementedException(); } - - public override string Protocol - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override IHeaderDictionary Headers - { - get { throw new NotImplementedException(); } - } - - public override IReadableStringCollection Cookies - { - get { throw new NotImplementedException(); } - } - - public override long? ContentLength - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override Stream Body - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - public override CancellationToken CallCanceled - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } - - string IHttpRequestFeature.PathBase - { - get; - set; - } - - string IHttpRequestFeature.Path - { - get; - set; - } - - string IHttpRequestFeature.QueryString - { - get; - set; - } - - IDictionary IHttpRequestFeature.Headers - { - get; - set; - } } } } From b6f4207b3be1046b5409bf313dc96ff3881bd508 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 19 Jun 2014 11:46:13 -0700 Subject: [PATCH 0201/1838] #70 - Refactor client cert feature interface. --- ...tyFeature.cs => IHttpClientCertificateFeature.cs} | 12 ++++++++++-- .../Microsoft.AspNet.HttpFeature.kproj | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 10 +++++----- .../DefaultHttpRequest.cs | 6 +++--- 5 files changed, 21 insertions(+), 13 deletions(-) rename src/Microsoft.AspNet.HttpFeature/{IHttpTransportLayerSecurityFeature.cs => IHttpClientCertificateFeature.cs} (54%) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs similarity index 54% rename from src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs rename to src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs index 1eb020776f..ccaf9b1298 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpTransportLayerSecurityFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs @@ -8,9 +8,17 @@ using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.HttpFeature { [AssemblyNeutral] - public interface IHttpTransportLayerSecurityFeature + public interface IHttpClientCertificateFeature { + /// + /// Synchronously retrieves the client certificate, if any. + /// X509Certificate ClientCertificate { get; set; } - Task LoadAsync(); + + /// + /// Asynchronously retrieves the client certificate, if any. + /// + /// + Task GetClientCertificateAsync(); } } diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 96237c3118..d9f328a5d5 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -29,7 +29,7 @@ - + diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 38cb35443c..82656dcba9 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -67,9 +67,9 @@ namespace Microsoft.AspNet.Owin if (context.Request.IsSecure) { - _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.LoadAsync))); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.GetClientCertificateAsync))); } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index c0f75caa46..0e0a5abeb9 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Owin IHttpResponseFeature, IHttpConnectionFeature, IHttpSendFileFeature, - IHttpTransportLayerSecurityFeature, + IHttpClientCertificateFeature, IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -197,13 +197,13 @@ namespace Microsoft.AspNet.Owin } } - X509Certificate IHttpTransportLayerSecurityFeature.ClientCertificate + X509Certificate IHttpClientCertificateFeature.ClientCertificate { get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpTransportLayerSecurityFeature.LoadAsync() + Task IHttpClientCertificateFeature.GetClientCertificateAsync() { throw new NotImplementedException(); } @@ -228,7 +228,7 @@ namespace Microsoft.AspNet.Owin { return SupportsSendFile; } - else if (key == typeof(IHttpTransportLayerSecurityFeature)) + else if (key == typeof(IHttpClientCertificateFeature)) { return SupportsClientCerts; } @@ -256,7 +256,7 @@ namespace Microsoft.AspNet.Owin } if (SupportsClientCerts) { - keys.Add(typeof(IHttpTransportLayerSecurityFeature)); + keys.Add(typeof(IHttpClientCertificateFeature)); } return keys; } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index e99c7e0b02..29a1e34b4c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _request = FeatureReference.Default; private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _transportLayerSecurity = FeatureReference.Default; + private FeatureReference _clientCertificate = FeatureReference.Default; private FeatureReference _query = FeatureReference.Default; private FeatureReference _form = FeatureReference.Default; private FeatureReference _cookies = FeatureReference.Default; @@ -43,9 +43,9 @@ namespace Microsoft.AspNet.PipelineCore get { return _connection.Fetch(_features); } } - private IHttpTransportLayerSecurityFeature HttpTransportLayerSecurityFeature + private IHttpClientCertificateFeature HttpClientCertificateFeature { - get { return _transportLayerSecurity.Fetch(_features); } + get { return _clientCertificate.Fetch(_features); } } private IQueryFeature QueryFeature From 64850167a118142c83b99c23b7f83641c87c920a Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 19 Jun 2014 10:54:07 -0700 Subject: [PATCH 0202/1838] Bump version to 1.0.0-* --- samples/KWebStartup/project.json | 5 ++--- src/Microsoft.AspNet.Hosting/project.json | 18 +++++++++--------- .../project.json | 8 ++++---- src/Microsoft.AspNet.TestHost/project.json | 2 +- .../project.json | 7 +------ .../project.json | 7 +------ 6 files changed, 18 insertions(+), 29 deletions(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index e2d56265b7..37e00580c2 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -1,9 +1,8 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", - "Microsoft.AspNet.Http": "0.1-alpha-*", - "Microsoft.AspNet.Server.WebListener": "0.1-alpha-*" + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Server.WebListener": "1.0.0-*" }, "commands": { "web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, "configurations": { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index db0c026552..333585a93c 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,14 +1,14 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.FeatureModel": "0.1-alpha-*", - "Microsoft.AspNet.Http": "0.1-alpha-*", - "Microsoft.AspNet.PipelineCore": "0.1-alpha-*", - "Microsoft.AspNet.Security.DataProtection": "0.1-alpha-*", - "Microsoft.Framework.ConfigurationModel": "0.1-alpha-*", - "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", - "Microsoft.Framework.Logging": "0.1-alpha-*", - "Microsoft.Framework.Runtime.Interfaces": "0.1-alpha-*" + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", + "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, "configurations": { "net45": {}, diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 75819c8802..cb4dec51ef 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,9 +1,9 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "0.1-alpha-*", - "Microsoft.Framework.DependencyInjection": "0.1-alpha-*", - "Microsoft.Framework.OptionsModel": "0.1-alpha-*" + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*" }, "configurations": { "net45": {}, diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 96182c3ed0..8002f95317 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,5 +1,5 @@ { - "version" : "0.1-alpha-*", + "version" : "1.0.0-*", "dependencies": { "Microsoft.AspNet.Hosting": "" }, diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 7ad9bce822..5218599846 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,13 +1,8 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.RequestContainer": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "configurations": { "net45": { diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 191a4928ef..5f960dc372 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,13 +1,8 @@ { - "version" : "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.TestHost": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" From 7f1135cec3afb66a9e7f9decd274abd798afdcb4 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 19 Jun 2014 10:56:15 -0700 Subject: [PATCH 0203/1838] Bump version to 1.0.0-* --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 6 +++--- src/Microsoft.AspNet.HttpFeature/project.json | 6 +++--- src/Microsoft.AspNet.Owin/project.json | 4 ++-- src/Microsoft.AspNet.PipelineCore/project.json | 6 +++--- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 7 +------ test/Microsoft.AspNet.Http.Tests/project.json | 9 ++------- test/Microsoft.AspNet.Owin.Tests/project.json | 7 +------ test/Microsoft.AspNet.PipelineCore.Tests/project.json | 7 +------ 9 files changed, 17 insertions(+), 37 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 8fda7d4cff..04c5fa7e3a 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,5 +1,5 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": {}, "configurations": { "net45": {}, diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 11a017e2d5..def3e11e29 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,11 +1,11 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": {}, "configurations": { "net45": {}, "k10": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", @@ -16,7 +16,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Principal" : "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 2fa40105ad..96bece8d27 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,15 +1,15 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "configurations": { "net45": {}, "k10": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.IO": "4.0.0.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0.0", "System.Security.Principal": "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 18e1116930..70e5093a74 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,5 +1,5 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.FeatureModel": "", @@ -20,7 +20,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Cryptography.X509Certificates": "4.0.0.0", "System.Security.Principal" : "4.0.0.0", "System.Threading.Tasks": "4.0.10.0" diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 0c280000e8..a90c55474e 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,6 +1,6 @@ { - "version": "0.1-alpha-*", + "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -10,7 +10,7 @@ "net45": {}, "k10": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "0.1-alpha-*", + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.0.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", @@ -21,7 +21,7 @@ "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "0.1-alpha-*", + "System.Security.Claims": "1.0.0-*", "System.Security.Principal" : "4.0.0.0", "System.Text.Encoding": "4.0.20.0", "System.Threading.Tasks": "4.0.10.0" diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index ca05fee96f..deec853dae 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,14 +1,9 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 29620862ab..1c00f87e1d 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,15 +1,10 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.PipelineCore": "", - "Microsoft.AspNet.Testing": "0.1-alpha-*", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Microsoft.AspNet.Testing": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 362d8821c4..8d59b446c6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,16 +1,11 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.Owin": "", "Microsoft.AspNet.PipelineCore": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 4efc819ed8..4b282a0a4b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,15 +1,10 @@ { - "version": "0.1-alpha-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", "Microsoft.AspNet.PipelineCore": "", - "xunit.abstractions": "2.0.0-aspnet-*", - "xunit.assert": "2.0.0-aspnet-*", - "xunit.core": "2.0.0-aspnet-*", - "xunit.execution": "2.0.0-aspnet-*", - "Xunit.KRunner": "0.1-alpha-*" + "Xunit.KRunner": "1.0.0-*" }, "commands": { "test": "Xunit.KRunner" From 3cd3e31644ec25583bbe910048a6ff8cefd262c6 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 19 Jun 2014 17:46:28 -0700 Subject: [PATCH 0204/1838] Temporarily reference Microsoft.AspNet.Server.WebListener 0.1-* --- samples/KWebStartup/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index 37e00580c2..c6ae4c11a8 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Server.WebListener": "1.0.0-*" + "Microsoft.AspNet.Server.WebListener": "0.1-*" }, "commands": { "web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, "configurations": { From a0e30591f861283d1f58b0aa3a5ebe5e6dad73d0 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 19 Jun 2014 18:35:34 -0700 Subject: [PATCH 0205/1838] Revert "Temporarily reference Microsoft.AspNet.Server.WebListener 0.1-*" This reverts commit 3cd3e31644ec25583bbe910048a6ff8cefd262c6. --- samples/KWebStartup/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json index c6ae4c11a8..37e00580c2 100644 --- a/samples/KWebStartup/project.json +++ b/samples/KWebStartup/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Server.WebListener": "0.1-*" + "Microsoft.AspNet.Server.WebListener": "1.0.0-*" }, "commands": { "web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, "configurations": { From a9fb12a597c2c26abcac77cc6284be680689730a Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 12:06:58 -0700 Subject: [PATCH 0206/1838] Removing sample --- samples/KWebStartup/KWebStartup.kproj | 26 ------------------- samples/KWebStartup/Startup.cs | 36 --------------------------- samples/KWebStartup/project.json | 30 ---------------------- 3 files changed, 92 deletions(-) delete mode 100644 samples/KWebStartup/KWebStartup.kproj delete mode 100644 samples/KWebStartup/Startup.cs delete mode 100644 samples/KWebStartup/project.json diff --git a/samples/KWebStartup/KWebStartup.kproj b/samples/KWebStartup/KWebStartup.kproj deleted file mode 100644 index b900357cfd..0000000000 --- a/samples/KWebStartup/KWebStartup.kproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - 12.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - a2f321a5-3f55-4413-b357-eef85dc0eca6 - Library - - - - - - - 2.0 - - - - - - - - - diff --git a/samples/KWebStartup/Startup.cs b/samples/KWebStartup/Startup.cs deleted file mode 100644 index dbe847a1be..0000000000 --- a/samples/KWebStartup/Startup.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. - -using Microsoft.AspNet; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; -using Microsoft.Framework.Runtime; - -namespace KWebStartup -{ - public class Startup - { - public void Configure(IBuilder app, IApplicationEnvironment env) - { - app.Run(async context => - { - context.Response.ContentType = "text/plain"; - await context.Response.WriteAsync("Hello world, from " + env.ApplicationName); - }); - } - } -} diff --git a/samples/KWebStartup/project.json b/samples/KWebStartup/project.json deleted file mode 100644 index 37e00580c2..0000000000 --- a/samples/KWebStartup/project.json +++ /dev/null @@ -1,30 +0,0 @@ -{ - "dependencies": { - "Microsoft.AspNet.Hosting": "", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Server.WebListener": "1.0.0-*" - }, - "commands": { "web": "Microsoft.AspNet.Hosting server=Microsoft.AspNet.Server.WebListener server.urls=http://localhost:5001" }, - "configurations": { - "net45": { - }, - "k10": { - "dependencies": { - "System.Collections": "4.0.0.0", - "System.Console": "4.0.0.0", - "System.Diagnostics.Debug": "4.0.10.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.0.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Resources.ResourceManager": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", - "System.Text.Encoding": "4.0.20.0", - "System.Threading.Tasks": "4.0.10.0" - } - } - } -} \ No newline at end of file From 940d3554ae578ae2d3cc0191fa46599fc6d363e6 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 14:32:48 -0700 Subject: [PATCH 0207/1838] Updating release Nuget.config --- NuGet.Config | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index a059188b09..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,13 +1,7 @@ - + - + - - - - - - - \ No newline at end of file + From f6f7c30a0507a04656da43026d7557fb52d6a294 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 14:32:49 -0700 Subject: [PATCH 0208/1838] Updating dev Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 53d1a62eaa4885785a25e6d1aa074a2b7bfb4075 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 14:32:55 -0700 Subject: [PATCH 0209/1838] Updating release Nuget.config --- NuGet.Config | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index a059188b09..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,13 +1,7 @@ - + - + - - - - - - - \ No newline at end of file + From 2e291cf033525e07de5ff00a7196009e8ab7ca57 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Fri, 20 Jun 2014 14:32:56 -0700 Subject: [PATCH 0210/1838] Updating dev Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 8f316654788bd5fab8ccd944e417c5d71dead5aa Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 20 Jun 2014 14:14:52 -0700 Subject: [PATCH 0211/1838] Make IServerFactory AssemblyNeutral. --- src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 21d3f06fbe..0b75dbe5e9 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -18,12 +18,12 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting.Server { - // TODO: [AssemblyNeutral] + [AssemblyNeutral] public interface IServerFactory { IServerInformation Initialize(IConfiguration configuration); From 8eb8cc1154d770dad42174b338f5257a634eb91d Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 20 Jun 2014 14:18:49 -0700 Subject: [PATCH 0212/1838] Remove deleted sample from sln. --- Hosting.sln | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/Hosting.sln b/Hosting.sln index 66ecdc97c7..a1be8041c3 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,14 +1,12 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21723.0 +VisualStudioVersion = 14.0.21730.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{FEB39027-9158-4DE2-997F-7ADAEF8188D0}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C30C98CD-3D69-4AE9-B680-0E0E6D8834C6}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost.Tests", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.kproj", "{0ACB2719-9484-49B5-B8E3-117091192511}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.kproj", "{1A415A3F-1081-45DB-809B-EE19CEA02DC0}" @@ -19,8 +17,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Te EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.RequestContainer", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.kproj", "{374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "KWebStartup", "samples\KWebStartup\KWebStartup.kproj", "{A2F321A5-3F55-4413-B357-EEF85DC0ECA6}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -81,16 +77,6 @@ Global {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.Build.0 = Release|Any CPU {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Debug|x86.ActiveCfg = Debug|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Any CPU.Build.0 = Release|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -101,6 +87,5 @@ Global {3944F036-7E75-47E8-AA52-C4B89A64EC3A} = {E0497F39-AFFB-4819-A116-E39E361915AB} {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814} = {E0497F39-AFFB-4819-A116-E39E361915AB} - {A2F321A5-3F55-4413-B357-EEF85DC0ECA6} = {C30C98CD-3D69-4AE9-B680-0E0E6D8834C6} EndGlobalSection EndGlobal From f08b6a8d53b4caed1a72166838ef633e690377fd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 24 Jun 2014 14:51:51 -0700 Subject: [PATCH 0213/1838] #3 - Add Count, Keys, and ContainsKey to IReadableStringCollection --- .../IReadableStringCollection.cs | 21 ++++-- .../Collections/ReadableStringCollection.cs | 27 ++++++++ .../Collections/RequestCookiesCollection.cs | 64 +++++++++++++++---- 3 files changed, 94 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs index 21a00450ea..8f18b618ba 100644 --- a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/IReadableStringCollection.cs @@ -19,7 +19,22 @@ namespace Microsoft.AspNet.Http /// string this[string key] { get; } - // Joined + /// + /// Gets the number of elements contained in the collection. + /// + int Count { get; } + + /// + /// Gets a collection containing the keys. + /// + ICollection Keys { get; } + + /// + /// Determines whether the collection contains an element with the specified key. + /// + /// + /// + bool ContainsKey(string key); /// /// Get the associated value from the collection. Multiple values will be merged. @@ -30,8 +45,6 @@ namespace Microsoft.AspNet.Http [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Re-evaluate later.")] string Get(string key); - // Joined - /// /// Get the associated values from the collection in their original format. /// Returns null if the key is not present. @@ -39,7 +52,5 @@ namespace Microsoft.AspNet.Http /// /// IList GetValues(string key); - - // Raw } } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index 84f95d7e0e..139d8d1c78 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -31,6 +31,23 @@ namespace Microsoft.AspNet.PipelineCore.Collections private IDictionary Store { get; set; } + /// + /// Gets the number of elements contained in the collection. + /// + public int Count + { + get { return Store.Count; } + } + + /// + /// Gets a collection containing the keys. + /// + public ICollection Keys + { + get { return Store.Keys; } + } + + /// /// Get the associated value from the collection. Multiple values will be merged. /// Returns null if the key is not present. @@ -42,6 +59,16 @@ namespace Microsoft.AspNet.PipelineCore.Collections get { return Get(key); } } + /// + /// Determines whether the collection contains an element with the specified key. + /// + /// + /// + public bool ContainsKey(string key) + { + return Store.ContainsKey(key); + } + /// /// Get the associated value from the collection. Multiple values will be merged. /// Returns null if the key is not present. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index e562487fd1..5fd131d990 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -18,30 +18,55 @@ namespace Microsoft.AspNet.PipelineCore.Collections _dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); } - public IEnumerator> GetEnumerator() - { - foreach (var pair in _dictionary) - { - yield return new KeyValuePair(pair.Key, new[] { pair.Value }); - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - public string this[string key] { get { return Get(key); } } + /// + /// Gets the number of elements contained in the collection. + /// + public int Count + { + get { return _dictionary.Count; } + } + + /// + /// Gets a collection containing the keys. + /// + public ICollection Keys + { + get { return _dictionary.Keys; } + } + + /// + /// Determines whether the collection contains an element with the specified key. + /// + /// + /// + public bool ContainsKey(string key) + { + return _dictionary.ContainsKey(key); + } + + /// + /// Get the associated value from the collection. Multiple values will be merged. + /// Returns null if the key is not present. + /// + /// + /// public string Get(string key) { string value; return _dictionary.TryGetValue(key, out value) ? value : null; } + /// + /// Get the associated values from the collection in their original format. + /// Returns null if the key is not present. + /// + /// + /// public IList GetValues(string key) { string value; @@ -56,6 +81,19 @@ namespace Microsoft.AspNet.PipelineCore.Collections ParsingHelpers.ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, _dictionary); } + public IEnumerator> GetEnumerator() + { + foreach (var pair in _dictionary) + { + yield return new KeyValuePair(pair.Key, new[] { pair.Value }); + } + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + private static readonly Action AddCookieCallback = (name, value, state) => { var dictionary = (IDictionary)state; From 82f72581c9ec10e412a1f67a41604b0b777101c4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 24 Jun 2014 15:47:08 -0700 Subject: [PATCH 0214/1838] Add an explict Count to IHeaderDictionary to resolve ambiguity. --- src/Microsoft.AspNet.Http/IHeaderDictionary.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs index d740fe03bf..fecac4a0f4 100644 --- a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -18,6 +18,12 @@ namespace Microsoft.AspNet.Http /// the associated value from the collection as a single string or null if the key is not present. new string this[string key] { get; set; } + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count + /// + /// Gets the number of elements contained in the collection. + /// + new int Count { get; } + /// /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. From ff31b958fe0219b5252fc026ffbbd3938b630ff9 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 24 Jun 2014 12:06:55 -0700 Subject: [PATCH 0215/1838] #80 - Add CancellationToken to GetClientCertAsyc, GetFormAsync. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 13 +++++++++++-- .../IHttpClientCertificateFeature.cs | 3 ++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 3 ++- .../OwinFeatureCollection.cs | 2 +- .../DefaultHttpRequest.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 15 ++++++++++++--- src/Microsoft.AspNet.PipelineCore/IFormFeature.cs | 3 ++- .../FormFeatureTests.cs | 9 +++++---- 8 files changed, 37 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 9a09b01a65..44fa1e945b 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -63,10 +63,19 @@ namespace Microsoft.AspNet.Http public abstract IReadableStringCollection Query { get; } /// - /// Gets the query value collection form collection. + /// Gets the form collection. /// /// The form collection parsed from the request body. - public abstract Task GetFormAsync(); + public virtual Task GetFormAsync() + { + return GetFormAsync(CancellationToken.None); + } + + /// + /// Gets the form collection. + /// + /// The form collection parsed from the request body. + public abstract Task GetFormAsync(CancellationToken cancel); /// /// Gets or set the owin.RequestProtocol. diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs index ccaf9b1298..2c9e77bdb1 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; +using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Runtime; @@ -19,6 +20,6 @@ namespace Microsoft.AspNet.HttpFeature /// Asynchronously retrieves the client certificate, if any. /// /// - Task GetClientCertificateAsync(); + Task GetClientCertificateAsync(CancellationToken cancel); } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 82656dcba9..8f6f9c4951 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -69,7 +69,8 @@ namespace Microsoft.AspNet.Owin { _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap(feature => new Func(feature.GetClientCertificateAsync))); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap( + feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 0e0a5abeb9..8994dfa6f4 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -203,7 +203,7 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpClientCertificateFeature.GetClientCertificateAsync() + Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancel) { throw new NotImplementedException(); } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 29a1e34b4c..eba4253862 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -129,9 +129,9 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync() + public override Task GetFormAsync(CancellationToken cancel) { - return FormFeature.GetFormAsync(); + return FormFeature.GetFormAsync(cancel); } public override string Protocol diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index ad7598af3e..86e1d4c0f3 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -3,9 +3,10 @@ using System.IO; using System.Text; +using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -24,14 +25,22 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - public async Task GetFormAsync() + public async Task GetFormAsync(CancellationToken cancel) { var body = _request.Fetch(_features).Body; if (_bodyStream == null || _bodyStream != body) { _bodyStream = body; - using (var streamReader = new StreamReader(body, Encoding.UTF8, + if (!_bodyStream.CanSeek) + { + MemoryStream buffer = new MemoryStream(); + await _bodyStream.CopyToAsync(buffer, 4096, cancel); + _bodyStream = buffer; + _request.Fetch(_features).Body = _bodyStream; + _bodyStream.Seek(0, SeekOrigin.Begin); + } + using (var streamReader = new StreamReader(_bodyStream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 261b77d551..0aed1a00f3 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; @@ -8,6 +9,6 @@ namespace Microsoft.AspNet.PipelineCore { public interface IFormFeature { - Task GetFormAsync(); + Task GetFormAsync(CancellationToken cancel); } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index 6566bc75eb..b7fdc8f563 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -3,6 +3,7 @@ using System.IO; using System.Text; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; @@ -29,7 +30,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests var provider = new FormFeature(features.Object); // Act - var formCollection = await provider.GetFormAsync(); + var formCollection = await provider.GetFormAsync(CancellationToken.None); // Assert Assert.Equal("bar", formCollection["foo"]); @@ -53,16 +54,16 @@ namespace Microsoft.AspNet.PipelineCore.Tests var provider = new FormFeature(features.Object); // Act - 1 - var formCollection = await provider.GetFormAsync(); + var formCollection = await provider.GetFormAsync(CancellationToken.None); // Assert - 1 Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); - Assert.Same(formCollection, await provider.GetFormAsync()); + Assert.Same(formCollection, await provider.GetFormAsync(CancellationToken.None)); // Act - 2 request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent2)); - formCollection = await provider.GetFormAsync(); + formCollection = await provider.GetFormAsync(CancellationToken.None); // Assert - 2 Assert.Equal("value", formCollection["collection2"]); From 55e491e354321f83b7582c5898b01add117fa501 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 25 Jun 2014 09:15:11 -0700 Subject: [PATCH 0216/1838] Make CancellationToken a default param. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 11 +---------- .../DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 2 +- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 44fa1e945b..f8632e5751 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -66,16 +66,7 @@ namespace Microsoft.AspNet.Http /// Gets the form collection. /// /// The form collection parsed from the request body. - public virtual Task GetFormAsync() - { - return GetFormAsync(CancellationToken.None); - } - - /// - /// Gets the form collection. - /// - /// The form collection parsed from the request body. - public abstract Task GetFormAsync(CancellationToken cancel); + public abstract Task GetFormAsync(CancellationToken cancel = default(CancellationToken)); /// /// Gets or set the owin.RequestProtocol. diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index eba4253862..609bcf8b89 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -129,7 +129,7 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync(CancellationToken cancel) + public override Task GetFormAsync(CancellationToken cancel = default(CancellationToken)) { return FormFeature.GetFormAsync(cancel); } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 86e1d4c0f3..36b3a169c2 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.PipelineCore _bodyStream = body; if (!_bodyStream.CanSeek) { - MemoryStream buffer = new MemoryStream(); + var buffer = new MemoryStream(); await _bodyStream.CopyToAsync(buffer, 4096, cancel); _bodyStream = buffer; _request.Fetch(_features).Body = _bodyStream; From df730a47a94fe56da53ffc5dfe0051c3b09cd0ab Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 26 Jun 2014 10:11:29 -0700 Subject: [PATCH 0217/1838] Rename CancellationToken parameter. --- src/Microsoft.AspNet.Http/HttpRequest.cs | 2 +- .../IHttpClientCertificateFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 4 ++-- src/Microsoft.AspNet.PipelineCore/IFormFeature.cs | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index f8632e5751..4d1aa1a9db 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Http /// Gets the form collection. /// /// The form collection parsed from the request body. - public abstract Task GetFormAsync(CancellationToken cancel = default(CancellationToken)); + public abstract Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)); /// /// Gets or set the owin.RequestProtocol. diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs index 2c9e77bdb1..b70fa027cf 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs @@ -20,6 +20,6 @@ namespace Microsoft.AspNet.HttpFeature /// Asynchronously retrieves the client certificate, if any. /// /// - Task GetClientCertificateAsync(CancellationToken cancel); + Task GetClientCertificateAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 8994dfa6f4..f0ebf96365 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -203,7 +203,7 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancel) + Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) { throw new NotImplementedException(); } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index 609bcf8b89..efdda560d1 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -129,9 +129,9 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync(CancellationToken cancel = default(CancellationToken)) + public override Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)) { - return FormFeature.GetFormAsync(cancel); + return FormFeature.GetFormAsync(cancellationToken); } public override string Protocol diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 36b3a169c2..25472d4057 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.PipelineCore _features = features; } - public async Task GetFormAsync(CancellationToken cancel) + public async Task GetFormAsync(CancellationToken cancellationToken) { var body = _request.Fetch(_features).Body; @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.PipelineCore if (!_bodyStream.CanSeek) { var buffer = new MemoryStream(); - await _bodyStream.CopyToAsync(buffer, 4096, cancel); + await _bodyStream.CopyToAsync(buffer, 4096, cancellationToken); _bodyStream = buffer; _request.Fetch(_features).Body = _bodyStream; _bodyStream.Seek(0, SeekOrigin.Begin); diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 0aed1a00f3..07debf7870 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -9,6 +9,6 @@ namespace Microsoft.AspNet.PipelineCore { public interface IFormFeature { - Task GetFormAsync(CancellationToken cancel); + Task GetFormAsync(CancellationToken cancellationToken); } } From f5173e44ae03227c1defbad89f6053b35f6c89d8 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 19 Jun 2014 13:42:01 -0700 Subject: [PATCH 0218/1838] Expand feature support for OWIN->K. --- .../Microsoft.AspNet.Owin.kproj | 3 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 36 ++------------- .../OwinFeatureCollection.cs | 40 +++++++++++++++-- src/Microsoft.AspNet.Owin/Utilities.cs | 45 +++++++++++++++++++ .../OwinFeatureCollectionTests.cs | 40 ++++++++++++++++- 5 files changed, 125 insertions(+), 39 deletions(-) create mode 100644 src/Microsoft.AspNet.Owin/Utilities.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 825f49a06f..ea1daa11aa 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -25,6 +25,7 @@ + - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 8f6f9c4951..040def476e 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,8 +37,8 @@ namespace Microsoft.AspNet.Owin { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => RemoveQuestionMark(feature.QueryString), - (feature, value) => feature.QueryString = AddQuestionMark(Convert.ToString(value))) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), + (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Owin { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, - { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = MakeClaimsPrincipal((IPrincipal)value)) }, + { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value)) }, }; if (context.Request.IsSecure) @@ -230,36 +230,6 @@ namespace Microsoft.AspNet.Owin throw new NotImplementedException(); } - private string RemoveQuestionMark(string queryString) - { - if (!string.IsNullOrEmpty(queryString)) - { - if (queryString[0] == '?') - { - return queryString.Substring(1); - } - } - return queryString; - } - - private string AddQuestionMark(string queryString) - { - if (!string.IsNullOrEmpty(queryString)) - { - return '?' + queryString; - } - return queryString; - } - - private ClaimsPrincipal MakeClaimsPrincipal(IPrincipal principal) - { - if (principal is ClaimsPrincipal) - { - return principal as ClaimsPrincipal; - } - return new ClaimsPrincipal(principal); - } - public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index f0ebf96365..c7af211b46 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -8,10 +8,13 @@ using System.IO; using System.Linq; using System.Net; using System.Reflection; +using System.Security.Claims; using System.Security.Cryptography.X509Certificates; +using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.Owin @@ -25,6 +28,8 @@ namespace Microsoft.AspNet.Owin IHttpConnectionFeature, IHttpSendFileFeature, IHttpClientCertificateFeature, + IHttpRequestLifetimeFeature, + IHttpAuthenticationFeature, IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -81,8 +86,8 @@ namespace Microsoft.AspNet.Owin string IHttpRequestFeature.QueryString { - get { return Prop(OwinConstants.RequestQueryString); } - set { Prop(OwinConstants.RequestQueryString, value); } + get { return Utilities.AddQuestionMark(Prop(OwinConstants.RequestQueryString)); } + set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } IDictionary IHttpRequestFeature.Headers @@ -203,11 +208,38 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) + async Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) + { + var loadAsync = Prop>(OwinConstants.CommonKeys.LoadClientCertAsync); + if (loadAsync != null) + { + await loadAsync(); + } + return Prop(OwinConstants.CommonKeys.ClientCertificate); + } + + CancellationToken IHttpRequestLifetimeFeature.OnRequestAborted + { + get { return Prop(OwinConstants.CallCancelled); } + } + + void IHttpRequestLifetimeFeature.Abort() { throw new NotImplementedException(); } + ClaimsPrincipal IHttpAuthenticationFeature.User + { + get { return Utilities.MakeClaimsPrincipal(Prop(OwinConstants.Security.User)); } + set { Prop(OwinConstants.Security.User, value); } + } + + IAuthenticationHandler IHttpAuthenticationFeature.Handler + { + get { throw new NotImplementedException(); } + set { throw new NotImplementedException(); } + } + public int Revision { get { return 0; } // Not modifiable @@ -249,6 +281,8 @@ namespace Microsoft.AspNet.Owin typeof(IHttpResponseFeature), typeof(IHttpConnectionFeature), typeof(IOwinEnvironmentFeature), + typeof(IHttpRequestLifetimeFeature), + typeof(IHttpAuthenticationFeature), }; if (SupportsSendFile) { diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs new file mode 100644 index 0000000000..ba3a4d4180 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Claims; +using System.Security.Principal; + +namespace Microsoft.AspNet.Owin +{ + internal static class Utilities + { + internal static string RemoveQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + if (queryString[0] == '?') + { + return queryString.Substring(1); + } + } + return queryString; + } + + internal static string AddQuestionMark(string queryString) + { + if (!string.IsNullOrEmpty(queryString)) + { + return '?' + queryString; + } + return queryString; + } + + internal static ClaimsPrincipal MakeClaimsPrincipal(IPrincipal principal) + { + if (principal == null) + { + return null; + } + if (principal is ClaimsPrincipal) + { + return principal as ClaimsPrincipal; + } + return new ClaimsPrincipal(principal); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index ca21c566de..663972150f 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -16,17 +16,53 @@ namespace Microsoft.AspNet.Owin object value; return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); } + private T Get(IDictionary env, string key) + { + object value; + return env.TryGetValue(key, out value) ? (T)value : default(T); + } [Fact] public void OwinHttpEnvironmentCanBeCreated() { var env = new Dictionary { - {"owin.RequestMethod", "POST"} + { "owin.RequestMethod", "POST" }, + { "owin.RequestPath", "/path" }, + { "owin.RequestPathBase", "/pathBase" }, + { "owin.RequestQueryString", "name=value" }, }; var features = new FeatureObject(new OwinFeatureCollection(env)); - Assert.Equal(Get(features).Method, "POST"); + var requestFeature = Get(features); + Assert.Equal(requestFeature.Method, "POST"); + Assert.Equal(requestFeature.Path, "/path"); + Assert.Equal(requestFeature.PathBase, "/pathBase"); + Assert.Equal(requestFeature.QueryString, "?name=value"); + } + + [Fact] + public void OwinHttpEnvironmentCanBeModified() + { + var env = new Dictionary + { + { "owin.RequestMethod", "POST" }, + { "owin.RequestPath", "/path" }, + { "owin.RequestPathBase", "/pathBase" }, + { "owin.RequestQueryString", "name=value" }, + }; + var features = new FeatureObject(new OwinFeatureCollection(env)); + + var requestFeature = Get(features); + requestFeature.Method = "GET"; + requestFeature.Path = "/path2"; + requestFeature.PathBase = "/pathBase2"; + requestFeature.QueryString = "?name=value2"; + + Assert.Equal("GET", Get(env, "owin.RequestMethod")); + Assert.Equal("/path2", Get(env, "owin.RequestPath")); + Assert.Equal("/pathBase2", Get(env, "owin.RequestPathBase")); + Assert.Equal("name=value2", Get(env, "owin.RequestQueryString")); } [Fact] From f4a397dfcc909deed02e962866ad71d94ac5f52e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 20 Jun 2014 12:13:51 -0700 Subject: [PATCH 0219/1838] OWIN: Support dynamically creatable features. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 57 +++++++++++++++---- .../OwinEnvironmentTests.cs | 8 --- 2 files changed, 45 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 040def476e..fd3565b16e 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -8,7 +8,6 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; -using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; @@ -16,6 +15,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.Owin { @@ -62,7 +62,10 @@ namespace Microsoft.AspNet.Owin { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, - { OwinConstants.Security.User, new FeatureMap(feature => feature.User, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value)) }, + { OwinConstants.Security.User, new FeatureMap(feature => feature.User, + (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), + () => new HttpAuthenticationFeature()) + }, }; if (context.Request.IsSecure) @@ -150,7 +153,11 @@ namespace Microsoft.AspNet.Owin FeatureMap entry; if (_entries.TryGetValue(key, out entry)) { - if (entry.Setter == null) + if (entry.CanSet) + { + entry.Set(_context, value); + } + else { _entries.Remove(key); if (value != null) @@ -158,10 +165,6 @@ namespace Microsoft.AspNet.Owin _context.Items[key] = value; } } - else - { - entry.Setter(_context.GetFeature(entry.FeatureInterface), value); - } } else { @@ -233,20 +236,32 @@ namespace Microsoft.AspNet.Owin public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) - : this(featureInterface, getter, null) + : this(featureInterface, getter, setter: null) { } public FeatureMap(Type featureInterface, Func getter, Action setter) + : this(featureInterface, getter, setter, featureCreator: null) + { + } + + public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureCreator) { FeatureInterface = featureInterface; Getter = getter; Setter = setter; + FeatureCreator = featureCreator; } - internal Type FeatureInterface { get; set; } - internal Func Getter { get; set; } - internal Action Setter { get; set; } + private Type FeatureInterface { get; set; } + private Func Getter { get; set; } + private Action Setter { get; set; } + private Func FeatureCreator { get; set; } + + public bool CanSet + { + get { return Setter != null; } + } internal object Get(HttpContext context) { @@ -260,7 +275,20 @@ namespace Microsoft.AspNet.Owin internal void Set(HttpContext context, object value) { - Setter(context.GetFeature(FeatureInterface), value); + var feature = context.GetFeature(FeatureInterface); + if (feature == null) + { + if (FeatureCreator == null) + { + throw new InvalidOperationException("Missing feature: " + FeatureInterface.FullName); + } + else + { + feature = FeatureCreator(); + context.SetFeature(FeatureInterface, feature); + } + } + Setter(feature, value); } } @@ -275,6 +303,11 @@ namespace Microsoft.AspNet.Owin : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) { } + + public FeatureMap(Func getter, Action setter, Func creator) + : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value), () => (T)creator()) + { + } } } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index ea603bc501..ddab64dca8 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -104,7 +104,6 @@ namespace Microsoft.AspNet.Owin var features = new FeatureCollection(); features.Add(typeof(IHttpRequestFeature), new MoqHttpRequestFeature()); features.Add(typeof(IHttpResponseFeature), new MoqHttpResponseFeature()); - features.Add(typeof(IHttpAuthenticationFeature), new MoqHttpAuthenticationFeature()); features.Add(typeof(IHttpRequestLifetimeFeature), new MoqHttpRequestLifetimeFeature()); return new DefaultHttpContext(features); } @@ -154,13 +153,6 @@ namespace Microsoft.AspNet.Owin } } - private class MoqHttpAuthenticationFeature : IHttpAuthenticationFeature - { - public ClaimsPrincipal User { get; set; } - - public IAuthenticationHandler Handler { get; set; } - } - private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { public CancellationToken OnRequestAborted { get; private set; } From 13f4c242ab700c7ecde71cfb705dda4e221b83d0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 27 Jun 2014 09:52:56 -0700 Subject: [PATCH 0220/1838] Rename T to TFeature, Creator to Factory. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 28 ++++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index fd3565b16e..5250b58479 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -241,22 +241,22 @@ namespace Microsoft.AspNet.Owin } public FeatureMap(Type featureInterface, Func getter, Action setter) - : this(featureInterface, getter, setter, featureCreator: null) + : this(featureInterface, getter, setter, featureFactory: null) { } - public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureCreator) + public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureFactory) { FeatureInterface = featureInterface; Getter = getter; Setter = setter; - FeatureCreator = featureCreator; + FeatureFactory = featureFactory; } private Type FeatureInterface { get; set; } private Func Getter { get; set; } private Action Setter { get; set; } - private Func FeatureCreator { get; set; } + private Func FeatureFactory { get; set; } public bool CanSet { @@ -278,13 +278,13 @@ namespace Microsoft.AspNet.Owin var feature = context.GetFeature(FeatureInterface); if (feature == null) { - if (FeatureCreator == null) + if (FeatureFactory == null) { - throw new InvalidOperationException("Missing feature: " + FeatureInterface.FullName); + throw new InvalidOperationException("Missing feature: " + FeatureInterface.FullName); // TODO: LOC } else { - feature = FeatureCreator(); + feature = FeatureFactory(); context.SetFeature(FeatureInterface, feature); } } @@ -292,20 +292,20 @@ namespace Microsoft.AspNet.Owin } } - public class FeatureMap : FeatureMap + public class FeatureMap : FeatureMap { - public FeatureMap(Func getter) - : base(typeof(T), feature => getter((T)feature)) + public FeatureMap(Func getter) + : base(typeof(TFeature), feature => getter((TFeature)feature)) { } - public FeatureMap(Func getter, Action setter) - : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value)) + public FeatureMap(Func getter, Action setter) + : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value)) { } - public FeatureMap(Func getter, Action setter, Func creator) - : base(typeof(T), feature => getter((T)feature), (feature, value) => setter((T)feature, value), () => (T)creator()) + public FeatureMap(Func getter, Action setter, Func featureFactory) + : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value), () => featureFactory()) { } } From 05a275faae0dd99b0545b8427e4d8bcefce30ab1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 30 Jun 2014 11:06:32 -0700 Subject: [PATCH 0221/1838] OWIN: #87 Make IHttpAuthenticationFeature.Handler not throw. --- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index c7af211b46..acd3b2f850 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -234,11 +234,7 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.Security.User, value); } } - IAuthenticationHandler IHttpAuthenticationFeature.Handler - { - get { throw new NotImplementedException(); } - set { throw new NotImplementedException(); } - } + IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } public int Revision { From bc2cf1223ed5a6f905193f3ac1a9bf3a4d6e1ea6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 1 Jul 2014 16:24:27 -0700 Subject: [PATCH 0222/1838] #89 - Rename OnRequestAborted to RequestAborted. --- src/Microsoft.AspNet.Http/HttpContext.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 4 ++-- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index f14a8b059b..89c421e5cb 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Http public abstract IServiceProvider RequestServices { get; set; } - public abstract CancellationToken OnRequestAborted { get; } + public abstract CancellationToken RequestAborted { get; } public abstract bool IsWebSocketRequest { get; } diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs index dca2418de9..b6bcee9c32 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.HttpFeature [AssemblyNeutral] public interface IHttpRequestLifetimeFeature { - CancellationToken OnRequestAborted { get; } + CancellationToken RequestAborted { get; } void Abort(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5250b58479..914837c083 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Owin _context = context; _entries = new Dictionary() { - { OwinConstants.CallCancelled, new FeatureMap(feature => feature.OnRequestAborted) }, + { OwinConstants.CallCancelled, new FeatureMap(feature => feature.RequestAborted) }, { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index acd3b2f850..f546eaa930 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -218,7 +218,7 @@ namespace Microsoft.AspNet.Owin return Prop(OwinConstants.CommonKeys.ClientCertificate); } - CancellationToken IHttpRequestLifetimeFeature.OnRequestAborted + CancellationToken IHttpRequestLifetimeFeature.RequestAborted { get { return Prop(OwinConstants.CallCancelled); } } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index b8383d05fe..a6b56103f8 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -109,14 +109,14 @@ namespace Microsoft.AspNet.PipelineCore public int Revision { get { return _features.Revision; } } - public override CancellationToken OnRequestAborted + public override CancellationToken RequestAborted { get { var lifetime = LifetimeFeature; if (lifetime != null) { - return lifetime.OnRequestAborted; + return lifetime.RequestAborted; } return CancellationToken.None; } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index ddab64dca8..d7ce8ae590 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -155,7 +155,7 @@ namespace Microsoft.AspNet.Owin private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { - public CancellationToken OnRequestAborted { get; private set; } + public CancellationToken RequestAborted { get; private set; } public void Abort() { From 10d8b1015e2b409ab05a7ace323ad58417bea8ea Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 26 Jun 2014 15:00:04 -0700 Subject: [PATCH 0223/1838] #69 Make auth APIs use IEnumerable instead of IList. --- src/Microsoft.AspNet.Http/HttpContext.cs | 4 +-- src/Microsoft.AspNet.Http/HttpResponse.cs | 10 +++---- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IChallengeContext.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext .cs | 2 +- .../DefaultHttpContext.cs | 4 +-- .../DefaultHttpResponse.cs | 6 ++--- .../Security/AuthTypeContext.cs | 11 +++++--- .../Security/AuthenticateContext.cs | 27 ++++++++++++------- .../Security/ChallengeContext.cs | 15 +++++++---- .../Security/SignInContext.cs | 15 +++++++---- .../Security/SignOutContext.cs | 15 +++++++---- 13 files changed, 72 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 89c421e5cb..191c3f02a6 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -57,14 +57,14 @@ namespace Microsoft.AspNet.Http return Authenticate(new[] { authenticationType }).SingleOrDefault(); } - public abstract IEnumerable Authenticate(IList authenticationTypes); + public abstract IEnumerable Authenticate(IEnumerable authenticationTypes); public virtual async Task AuthenticateAsync(string authenticationType) { return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); } - public abstract Task> AuthenticateAsync(IList authenticationTypes); + public abstract Task> AuthenticateAsync(IEnumerable authenticationTypes); public virtual Task AcceptWebSocketAsync() { diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 6f0a6a44dd..05ae0942d3 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -55,12 +55,12 @@ namespace Microsoft.AspNet.Http Challenge(new[] { authenticationType }, properties); } - public virtual void Challenge(IList authenticationTypes) + public virtual void Challenge(IEnumerable authenticationTypes) { Challenge(authenticationTypes, properties: null); } - public abstract void Challenge(IList authenticationTypes, AuthenticationProperties properties); + public abstract void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties); public virtual void SignIn(ClaimsIdentity identity) { @@ -72,12 +72,12 @@ namespace Microsoft.AspNet.Http SignIn(new[] { identity }, properties); } - public virtual void SignIn(IList identities) + public virtual void SignIn(IEnumerable identities) { SignIn(identities, properties: null); } - public abstract void SignIn(IList identities, AuthenticationProperties properties); + public abstract void SignIn(IEnumerable identities, AuthenticationProperties properties); public virtual void SignOut() { @@ -89,6 +89,6 @@ namespace Microsoft.AspNet.Http SignOut(new[] { authenticationType }); } - public abstract void SignOut(IList authenticationTypes); + public abstract void SignOut(IEnumerable authenticationTypes); } } diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs index f44c411ffc..333c044f86 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface IAuthenticateContext { - IList AuthenticationTypes { get; } + IEnumerable AuthenticationTypes { get; } void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs index c5855cb322..5f32f318df 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface IChallengeContext { - IList AuthenticationTypes {get;} + IEnumerable AuthenticationTypes {get;} IDictionary Properties {get;} void Accept(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs index b6c1730a69..694ece38d2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface ISignInContext { - IList Identities { get; } + IEnumerable Identities { get; } IDictionary Properties { get; } void Accept(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs index 8346ae040b..232db13ad7 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.HttpFeature.Security [AssemblyNeutral] public interface ISignOutContext { - IList AuthenticationTypes { get; } + IEnumerable AuthenticationTypes { get; } void Accept(string authenticationType, IDictionary description); } diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index a6b56103f8..9afbc4368c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -178,7 +178,7 @@ namespace Microsoft.AspNet.PipelineCore return authTypeContext.Results; } - public override IEnumerable Authenticate(IList authenticationTypes) + public override IEnumerable Authenticate(IEnumerable authenticationTypes) { if (authenticationTypes == null) { @@ -202,7 +202,7 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } - public override async Task> AuthenticateAsync(IList authenticationTypes) + public override async Task> AuthenticateAsync(IEnumerable authenticationTypes) { if (authenticationTypes == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 436517b0b9..3a0b19cab0 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -130,7 +130,7 @@ namespace Microsoft.AspNet.PipelineCore return Body.WriteAsync(bytes, 0, bytes.Length); } - public override void Challenge(IList authenticationTypes, AuthenticationProperties properties) + public override void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties) { if (authenticationTypes == null) { @@ -153,7 +153,7 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignIn(IList identities, AuthenticationProperties properties) + public override void SignIn(IEnumerable identities, AuthenticationProperties properties) { if (identities == null) { @@ -175,7 +175,7 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignOut(IList authenticationTypes) + public override void SignOut(IEnumerable authenticationTypes) { if (authenticationTypes == null) { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index 20bc565605..ffd779039e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -10,16 +10,21 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class AuthTypeContext : IAuthTypeContext { + private List _results; + public AuthTypeContext() { - Results = new List(); + _results = new List(); } - public IList Results { get; private set; } + public IEnumerable Results + { + get { return _results; } + } public void Accept(IDictionary description) { - Results.Add(new AuthenticationDescription(description)); + _results.Add(new AuthenticationDescription(description)); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 469c38cf3c..d975333fdf 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -14,33 +14,42 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class AuthenticateContext : IAuthenticateContext { - public AuthenticateContext(IList authenticationTypes) + private List _results; + private List _accepted; + + public AuthenticateContext(IEnumerable authenticationTypes) { if (authenticationTypes == null) { throw new ArgumentNullException("authenticationType"); } AuthenticationTypes = authenticationTypes; - Results = new List(); - Accepted = new List(); + _results = new List(); + _accepted = new List(); } - public IList AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationTypes { get; private set; } - public IList Results { get; private set; } + public IEnumerable Results + { + get { return _results; } + } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - Accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType - Results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); + _accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType + _results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); } public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index b86f4cff8e..45afd34594 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -12,7 +12,9 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class ChallengeContext : IChallengeContext { - public ChallengeContext(IList authenticationTypes, IDictionary properties) + private List _accepted; + + public ChallengeContext(IEnumerable authenticationTypes, IDictionary properties) { if (authenticationTypes == null) { @@ -20,18 +22,21 @@ namespace Microsoft.AspNet.PipelineCore.Security } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - Accepted = new List(); + _accepted = new List(); } - public IList AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationTypes { get; private set; } public IDictionary Properties { get; private set; } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Accept(string authenticationType, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 7f9694fd2a..b24a14758a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -10,7 +10,9 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class SignInContext : ISignInContext { - public SignInContext(IList identities, IDictionary dictionary) + private List _accepted; + + public SignInContext(IEnumerable identities, IDictionary dictionary) { if (identities == null) { @@ -18,18 +20,21 @@ namespace Microsoft.AspNet.PipelineCore.Security } Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); - Accepted = new List(); + _accepted = new List(); } - public IList Identities { get; private set; } + public IEnumerable Identities { get; private set; } public IDictionary Properties { get; private set; } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Accept(string authenticationType, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 1c8049d3cb..6ce2a64fa5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -9,23 +9,28 @@ namespace Microsoft.AspNet.PipelineCore.Security { public class SignOutContext : ISignOutContext { - public SignOutContext(IList authenticationTypes) + private List _accepted; + + public SignOutContext(IEnumerable authenticationTypes) { if (authenticationTypes == null) { throw new ArgumentNullException("authenticationTypes"); } AuthenticationTypes = authenticationTypes; - Accepted = new List(); + _accepted = new List(); } - public IList AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationTypes { get; private set; } - public IList Accepted { get; private set; } + public IEnumerable Accepted + { + get { return _accepted; } + } public void Accept(string authenticationType, IDictionary description) { - Accepted.Add(authenticationType); + _accepted.Add(authenticationType); } } } From 9028c6a1a57bf82da3bee6450c3f99e8752914da Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 3 Jul 2014 11:59:22 -0700 Subject: [PATCH 0224/1838] #88 Rename IHttpOpaqueUpgradeFeature to IHttpUpgradeFeature. --- .../IHttpOpaqueUpgradeFeature.cs | 13 ------------- .../IHttpUpgradeFeature.cs | 16 ++++++++++++++++ .../Microsoft.AspNet.HttpFeature.kproj | 2 +- 3 files changed, 17 insertions(+), 14 deletions(-) delete mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs deleted file mode 100644 index f4fb2f4f0f..0000000000 --- a/src/Microsoft.AspNet.HttpFeature/IHttpOpaqueUpgradeFeature.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System.IO; -using System.Threading.Tasks; -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.HttpFeature -{ - [AssemblyNeutral] - public interface IHttpOpaqueUpgradeFeature - { - bool IsUpgradableRequest { get; } - Task UpgradeAsync(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs new file mode 100644 index 0000000000..3d3f924cae --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading.Tasks; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface IHttpUpgradeFeature + { + bool IsUpgradableRequest { get; } + Task UpgradeAsync(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index d9f328a5d5..5ee49bef8e 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -24,7 +24,7 @@ - + From 0f9e23275934467aa1f49a497bc10761a3639707 Mon Sep 17 00:00:00 2001 From: Ben Brown Date: Thu, 3 Jul 2014 20:06:11 -0700 Subject: [PATCH 0225/1838] Updating ILogger descendants for interface change. --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index e0995468d9..0a0950d559 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -93,6 +93,21 @@ namespace Microsoft.AspNet.Hosting { return false; } + + public IDisposable BeginScope(object state) + { + return NullScope.Instance; + } + } + + private class NullScope : IDisposable + { + public static NullScope Instance = new NullScope(); + + public void Dispose() + { + // intentionally does nothing + } } } } \ No newline at end of file From 5bf4883cd99255902e669b74e54f77a2ed01f4ad Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 7 Jul 2014 10:48:07 -0700 Subject: [PATCH 0226/1838] #91 Provide a default constructor for DefaultHttpContext. --- .../DeafultHttpRequestFeature.cs | 30 ++++----- .../DefaultHttpContext.cs | 7 ++ .../DefaultHttpResponseFeature.cs | 33 +++++++++ .../Microsoft.AspNet.PipelineCore.kproj | 2 + .../MapPathMiddlewareTests.cs | 4 +- .../MapPredicateMiddlewareTests.cs | 4 +- .../Microsoft.AspNet.Http.Tests.kproj | 3 +- .../OwinEnvironmentTests.cs | 67 +------------------ .../DefaultHttpContextTests.cs | 19 +----- .../DefaultHttpRequestTests.cs | 28 +++----- 10 files changed, 73 insertions(+), 124 deletions(-) rename test/Microsoft.AspNet.Http.Tests/Fakes.cs => src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs (51%) create mode 100644 src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs diff --git a/test/Microsoft.AspNet.Http.Tests/Fakes.cs b/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs similarity index 51% rename from test/Microsoft.AspNet.Http.Tests/Fakes.cs rename to src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs index d33efeaa2b..bfbdf518a7 100644 --- a/test/Microsoft.AspNet.Http.Tests/Fakes.cs +++ b/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,10 +6,22 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNet.PipelineCore { - public class FakeHttpRequestFeature : IHttpRequestFeature + public class DeafultHttpRequestFeature : IHttpRequestFeature { + public DeafultHttpRequestFeature() + { + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Body = Stream.Null; + Protocol = string.Empty; + Scheme = string.Empty; + Method = string.Empty; + PathBase = string.Empty; + Path = string.Empty; + QueryString = string.Empty; + } + public string Protocol { get; set; } public string Scheme { get; set; } public string Method { get; set; } @@ -19,16 +31,4 @@ namespace Microsoft.AspNet.Builder.Extensions public IDictionary Headers { get; set; } public Stream Body { get; set; } } - - public class FakeHttpResponseFeature : IHttpResponseFeature - { - public int StatusCode { get; set; } - public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } - public Stream Body { get; set; } - public void OnSendingHeaders(Action callback, object state) - { - throw new NotImplementedException(); - } - } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 9afbc4368c..af1f15e790 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -33,6 +33,13 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _webSockets; private IFeatureCollection _features; + public DefaultHttpContext() + : this(new FeatureCollection()) + { + SetFeature(new DeafultHttpRequestFeature()); + SetFeature(new DefaultHttpResponseFeature()); + } + public DefaultHttpContext(IFeatureCollection features) { _features = features; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs new file mode 100644 index 0000000000..819ff17421 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.PipelineCore +{ + public class DefaultHttpResponseFeature : IHttpResponseFeature + { + public DefaultHttpResponseFeature() + { + StatusCode = 200; + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Body = Stream.Null; + } + + public int StatusCode { get; set; } + + public string ReasonPhrase { get; set; } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + public void OnSendingHeaders(Action callback, object state) + { + throw new NotSupportedException(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 05dd7de5dd..054abcaa32 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -27,6 +27,8 @@ + + diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 3bca69be56..4a9d68dd45 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -187,9 +187,7 @@ namespace Microsoft.AspNet.Builder.Extensions private HttpContext CreateRequest(string basePath, string requestPath) { - HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestFeature()); - context.SetFeature(new FakeHttpResponseFeature()); + HttpContext context = new DefaultHttpContext(); context.Request.PathBase = new PathString(basePath); context.Request.Path = new PathString(requestPath); return context; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index 17cce7c777..eb8ee8be9c 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -176,9 +176,7 @@ namespace Microsoft.AspNet.Builder.Extensions private HttpContext CreateRequest() { - HttpContext context = new DefaultHttpContext(new FeatureModel.FeatureCollection()); - context.SetFeature(new FakeHttpRequestFeature()); - context.SetFeature(new FakeHttpResponseFeature()); + HttpContext context = new DefaultHttpContext(); return context; } } diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 883a9d895c..f8e3963d7c 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -21,10 +21,9 @@ - - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index d7ce8ae590..cdc5eb680f 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,16 +1,11 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; -using System.Threading; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -101,66 +96,8 @@ namespace Microsoft.AspNet.Owin private HttpContext CreateContext() { - var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestFeature), new MoqHttpRequestFeature()); - features.Add(typeof(IHttpResponseFeature), new MoqHttpResponseFeature()); - features.Add(typeof(IHttpRequestLifetimeFeature), new MoqHttpRequestLifetimeFeature()); - return new DefaultHttpContext(features); - } - - private class MoqHttpRequestFeature : IHttpRequestFeature - { - public MoqHttpRequestFeature() - { - Headers = new Dictionary(); - } - - public string Method { get; set; } - - public string Scheme { get; set; } - - public string Protocol { get; set; } - - public Stream Body { get; set; } - - public string PathBase { get; set; } - - public string Path { get; set; } - - public string QueryString { get; set; } - - public IDictionary Headers { get; set; } - } - - private class MoqHttpResponseFeature : IHttpResponseFeature - { - public MoqHttpResponseFeature() - { - Headers = new Dictionary(); - } - - public Stream Body { get; set; } - - public int StatusCode { get; set; } - - public string ReasonPhrase { get; set; } - - public IDictionary Headers { get; set; } - - public void OnSendingHeaders(Action callback, object state) - { - throw new NotImplementedException(); - } - } - - private class MoqHttpRequestLifetimeFeature : IHttpRequestLifetimeFeature - { - public CancellationToken RequestAborted { get; private set; } - - public void Abort() - { - throw new NotImplementedException(); - } + var context = new DefaultHttpContext(); + return context; } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 6ece4245fa..723811a947 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -80,25 +80,8 @@ namespace Microsoft.AspNet.PipelineCore.Tests private HttpContext CreateContext() { - var context = new DefaultHttpContext(new FeatureCollection()); - context.SetFeature(new FakeHttpResponse()); + var context = new DefaultHttpContext(); return context; } - - private class FakeHttpResponse : IHttpResponseFeature - { - public int StatusCode { get; set; } - - public string ReasonPhrase { get; set; } - - public IDictionary Headers { get; set; } - - public Stream Body { get; set; } - - public void OnSendingHeaders(Action callback, object state) - { - throw new NotImplementedException(); - } - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 93d816e875..baa1c6c4ed 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -5,9 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; -using Moq; using Xunit; namespace Microsoft.AspNet.PipelineCore.Tests @@ -57,9 +55,9 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange const string expected = "localhost:9001"; - var headers = new Dictionary(StringComparer.Ordinal) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Host", new string[]{ expected } }, + { "Host", new string[] { expected } }, }; var request = CreateRequest(headers); @@ -77,7 +75,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange const string expected = "löcalhöst"; - var headers = new Dictionary(StringComparer.Ordinal) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { { "Host", new string[]{ "xn--lcalhst-90ae" } }, }; @@ -97,7 +95,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests // Arrange const string expected = "xn--lcalhst-90ae"; - var headers = new Dictionary(StringComparer.Ordinal); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); var request = CreateRequest(headers); @@ -108,25 +106,19 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Equal(expected, headers["Host"][0]); } - private static DefaultHttpRequest CreateRequest(IDictionary headers) + private static HttpRequest CreateRequest(IDictionary headers) { - var requestInfo = new Mock(); - requestInfo.SetupGet(r => r.Headers).Returns(headers); - - var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestFeature), requestInfo.Object); - - var context = new DefaultHttpContext(features); - return new DefaultHttpRequest(context, features); + var context = new DefaultHttpContext(); + context.GetFeature().Headers = headers; + return context.Request; } - private static DefaultHttpRequest GetRequestWithContentLength(string contentLength = null) + private static HttpRequest GetRequestWithContentLength(string contentLength = null) { - var headers = new Dictionary(StringComparer.Ordinal); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); if (contentLength != null) { headers.Add("Content-Length", new[] { contentLength }); - } return CreateRequest(headers); From 578518d5c4b7d2742529cde983cc1533b5c484a1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:34:57 -0700 Subject: [PATCH 0227/1838] #66 Add response writing extensions. --- HttpAbstractions.sln | 217 ++++++++++-------- .../HttpResponseSendingExtensions.cs | 152 ++++++++++++ .../Microsoft.AspNet.Http.Extensions.kproj | 36 +++ .../NotNullAttribute.cs | 12 + .../project.json | 15 ++ src/Microsoft.AspNet.Http/HttpResponse.cs | 2 - .../HttpResponseWritingExtensions.cs | 42 ++++ .../Microsoft.AspNet.Http.kproj | 3 +- .../DefaultHttpResponse.cs | 6 - .../HttpResponseSendingExtensionsTests.cs | 87 +++++++ ...crosoft.AspNet.Http.Extensions.Tests.kproj | 35 +++ .../project.json | 20 ++ .../HttpResponseWritingExtensionsTests.cs | 39 ++++ .../Microsoft.AspNet.Http.Tests.kproj | 1 + 14 files changed, 558 insertions(+), 109 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj create mode 100644 src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/project.json create mode 100644 src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/project.json create mode 100644 test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index c4043ac0a1..5158aff09e 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21628.1 +VisualStudioVersion = 14.0.21813.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -25,6 +25,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "sr EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.kproj", "{16219571-3268-4D12-8689-12B7163DBA13}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.kproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.kproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -35,105 +39,116 @@ Global Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.Build.0 = Debug|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|x86 - {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.Build.0 = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.Build.0 = Debug|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|x86 - {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.Build.0 = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.Build.0 = Debug|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|x86 - {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.Build.0 = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.Build.0 = Debug|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|x86 - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.Build.0 = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.Build.0 = Debug|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|x86 - {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.Build.0 = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.Build.0 = Debug|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|x86 - {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.Build.0 = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.Build.0 = Debug|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|x86 - {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.Build.0 = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.Build.0 = Debug|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|x86 - {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.Build.0 = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.Build.0 = Debug|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|x86 - {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.Build.0 = Release|x86 + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Debug|x86.ActiveCfg = Debug|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Any CPU.Build.0 = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BCF0F967-8753-4438-BD07-AADCA9CE509A}.Release|x86.ActiveCfg = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Debug|x86.ActiveCfg = Debug|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.ActiveCfg = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Any CPU.Build.0 = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {22071333-15BA-4D16-A1D5-4D5B1A83FBDD}.Release|x86.ActiveCfg = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Debug|x86.ActiveCfg = Debug|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Any CPU.Build.0 = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.Build.0 = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|x86.ActiveCfg = Debug|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Any CPU.Build.0 = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Release|x86.ActiveCfg = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Debug|x86.ActiveCfg = Debug|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Any CPU.Build.0 = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}.Release|x86.ActiveCfg = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Debug|x86.ActiveCfg = Debug|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Any CPU.Build.0 = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {F16692B8-9F38-4DCA-A582-E43172B989C6}.Release|x86.ActiveCfg = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Debug|x86.ActiveCfg = Debug|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.ActiveCfg = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Any CPU.Build.0 = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {59BED991-F207-48ED-B24C-0A1D9C986C01}.Release|x86.ActiveCfg = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Any CPU.Build.0 = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Debug|x86.ActiveCfg = Debug|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.ActiveCfg = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Any CPU.Build.0 = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {16219571-3268-4D12-8689-12B7163DBA13}.Release|x86.ActiveCfg = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Debug|x86.ActiveCfg = Debug|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Any CPU.Build.0 = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {CCC4363E-81E2-4058-94DD-00494E9E992A}.Release|x86.ActiveCfg = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Any CPU.Build.0 = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -148,5 +163,7 @@ Global {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {59BED991-F207-48ED-B24C-0A1D9C986C01} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {CCC4363E-81E2-4058-94DD-00494E9E992A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs new file mode 100644 index 0000000000..b97da7c13b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs @@ -0,0 +1,152 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + /// + /// Convenience methods for writing to the response. + /// + public static class HttpResponseSendingExtensions + { + /// + /// Sends a response with the given Content-Type and body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(text, Encoding.UTF8, contentType, cancellationToken); + } + + /// + /// Sends a response with the given Content-Type, encoding, and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentException("Empty Content-Type is not allowed."); + } + if (contentType.IndexOf("charset=", StringComparison.OrdinalIgnoreCase) < 0) + { + contentType += "; charset=" + encoding.WebName; + } + response.ContentType = contentType; + return response.SendAsync(text, encoding, cancellationToken); + } + + /// + /// Sends a response with the given body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(text, Encoding.UTF8, cancellationToken); + } + + /// + /// Sends a response with the given encoding and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) + { + byte[] data = encoding.GetBytes(text); + return response.SendAsync(data, cancellationToken); + } + + /// + /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(new ArraySegment(data), contentType, cancellationToken); + } + + /// + /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) + { + if (string.IsNullOrEmpty(contentType)) + { + throw new ArgumentException("Empty Content-Type is not allowed."); + } + response.ContentType = contentType; + return response.SendAsync(data, cancellationToken); + } + + /// + /// Sends a response with the given body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(new ArraySegment(data), cancellationToken); + } + + /// + /// Sends a response with the given body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, int offset, int count, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.SendAsync(new ArraySegment(data, offset, count), cancellationToken); + } + + /// + /// Sends a response with the given body. The Content-Length header will be set accordingly. + /// + /// + /// + /// + /// + public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, CancellationToken cancellationToken = default(CancellationToken)) + { + if (data.Array == null) + { + throw new ArgumentException("The Array cannot be null.", "data"); // TODO: LOC + } + response.ContentLength = data.Count; + return response.Body.WriteAsync(data.Array, data.Offset, data.Count, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj new file mode 100644 index 0000000000..7ca2e89f22 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -0,0 +1,36 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + ccc4363e-81e2-4058-94dd-00494e9e992a + Library + Microsoft.AspNet.Http.Extensions + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs new file mode 100644 index 0000000000..d43b93e4e4 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json new file mode 100644 index 0000000000..6faa246274 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -0,0 +1,15 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "" + }, + "configurations" : { + "net45" : { + }, + "k10" : { + "dependencies": { + "System.Runtime": "4.0.20.0" + } + } + } +} diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 05ae0942d3..a404c17c94 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -33,8 +33,6 @@ namespace Microsoft.AspNet.Http public abstract void Redirect(string location, bool permanent); - public abstract Task WriteAsync(string data); - public virtual void Challenge() { Challenge(new string[0]); diff --git a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs new file mode 100644 index 0000000000..464513f895 --- /dev/null +++ b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + /// + /// Convenience methods for writing to the response. + /// + public static class HttpResponseWritingExtensions + { + /// + /// Writes the given text to the response body. UTF-8 encoding will be used. + /// + /// + /// + /// + /// + public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) + { + return response.WriteAsync(text, Encoding.UTF8, cancellationToken); + } + + /// + /// Writes the given text to the response body using the given encoding. + /// + /// + /// + /// + /// + /// + public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) + { + byte[] data = encoding.GetBytes(text); + return response.Body.WriteAsync(data, 0, data.Length, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index a93ecf8e2a..0e326800f8 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -33,6 +33,7 @@ + @@ -48,4 +49,4 @@ - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 3a0b19cab0..5af0f9b5fe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -124,12 +124,6 @@ namespace Microsoft.AspNet.PipelineCore Headers.Set(Constants.Headers.Location, location); } - public override Task WriteAsync(string data) - { - var bytes = Encoding.UTF8.GetBytes(data); - return Body.WriteAsync(bytes, 0, bytes.Length); - } - public override void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties) { if (authenticationTypes == null) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs new file mode 100644 index 0000000000..d2e51ec219 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -0,0 +1,87 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions +{ + public class HttpResponseSendingExtensionsTests + { + [Fact] + public async Task SendData_SendBytes() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync(new byte[10]); + + Assert.Equal(10, context.Response.Body.Length); + Assert.Equal(10, context.Response.ContentLength); + Assert.Null(context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendBytesAndContentType() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync(new byte[10], "text/html"); + + Assert.Equal(10, context.Response.Body.Length); + Assert.Equal(10, context.Response.ContentLength); + Assert.Equal("text/html", context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendText() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World"); + + Assert.Equal(11, context.Response.Body.Length); + Assert.Equal(11, context.Response.ContentLength); + Assert.Null(context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendTextWithContentType() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World", "text/html"); + + Assert.Equal(11, context.Response.Body.Length); + Assert.Equal(11, context.Response.ContentLength); + Assert.Equal("text/html; charset=utf-8", context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendTextWithEncoding() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World", Encoding.UTF32); + + Assert.Equal(44, context.Response.Body.Length); + Assert.Equal(44, context.Response.ContentLength); + Assert.Null(context.Response.ContentType); + } + + [Fact] + public async Task SendData_SendTextWithContentTypeAndEncoding() + { + HttpContext context = CreateRequest(); + await context.Response.SendAsync("Hello World", Encoding.UTF32, "text/html"); + + Assert.Equal(44, context.Response.Body.Length); + Assert.Equal(44, context.Response.ContentLength); + Assert.Equal("text/html; charset=utf-32", context.Response.ContentType); + } + + private HttpContext CreateRequest() + { + HttpContext context = new DefaultHttpContext(); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj new file mode 100644 index 0000000000..6223e75396 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + ae25ef21-7f91-4b86-b73e-af746821d339 + Library + Microsoft.AspNet.Http.Extensions.Tests + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json new file mode 100644 index 0000000000..701d09c188 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -0,0 +1,20 @@ +{ + "dependencies": { + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.Http.Extensions": "", + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.PipelineCore": "", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "configurations": { + "net45": { + "dependencies": { + "Shouldly": "1.1.1.1", + "System.Runtime": "" + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs new file mode 100644 index 0000000000..e34518ea26 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.Http +{ + public class HttpResponseWritingExtensionsTests + { + [Fact] + public async Task WritingText_WriteText() + { + HttpContext context = CreateRequest(); + await context.Response.WriteAsync("Hello World"); + + Assert.Equal(11, context.Response.Body.Length); + } + + [Fact] + public async Task WritingText_MultipleWrites() + { + HttpContext context = CreateRequest(); + await context.Response.WriteAsync("Hello World"); + await context.Response.WriteAsync("Hello World"); + + Assert.Equal(22, context.Response.Body.Length); + } + + private HttpContext CreateRequest() + { + HttpContext context = new DefaultHttpContext(); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index f8e3963d7c..754a812c15 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -21,6 +21,7 @@ + From bd872c5fb036ce883a558a770c83699451c61e80 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:42:11 -0700 Subject: [PATCH 0228/1838] Fix rebase issue in tests. --- .../HttpResponseSendingExtensionsTests.cs | 4 ++-- .../HttpResponseWritingExtensionsTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs index d2e51ec219..05d662a955 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -1,10 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Extensions; -using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -81,6 +80,7 @@ namespace Microsoft.AspNet.Http.Extensions private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); return context; } } diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs index e34518ea26..aa6582e753 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs @@ -1,9 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Extensions; -using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -33,6 +32,7 @@ namespace Microsoft.AspNet.Http private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(); + context.Response.Body = new MemoryStream(); return context; } } From 6afcadd66a68d9812bbd8f99ee81c726497598de Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:59:13 -0700 Subject: [PATCH 0229/1838] Add using statement for extension methods. --- test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 1 + test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 91730ee12c..48d416b266 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -20,6 +20,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index b486dd3ffb..13793b8cea 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -19,6 +19,7 @@ using System; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; From 1ece87ef68aa6c0cc06bfbca558aee97f8148e4c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 9 Jul 2014 09:28:40 -0700 Subject: [PATCH 0230/1838] Fix mispelled class name. --- src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs | 2 +- ...fultHttpRequestFeature.cs => DefaultHttpRequestFeature.cs} | 4 ++-- .../Microsoft.AspNet.PipelineCore.kproj | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/Microsoft.AspNet.PipelineCore/{DeafultHttpRequestFeature.cs => DefaultHttpRequestFeature.cs} (90%) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index af1f15e790..148ef84e19 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.PipelineCore public DefaultHttpContext() : this(new FeatureCollection()) { - SetFeature(new DeafultHttpRequestFeature()); + SetFeature(new DefaultHttpRequestFeature()); SetFeature(new DefaultHttpResponseFeature()); } diff --git a/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs similarity index 90% rename from src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs rename to src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs index bfbdf518a7..156e362c9b 100644 --- a/src/Microsoft.AspNet.PipelineCore/DeafultHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs @@ -8,9 +8,9 @@ using Microsoft.AspNet.HttpFeature; namespace Microsoft.AspNet.PipelineCore { - public class DeafultHttpRequestFeature : IHttpRequestFeature + public class DefaultHttpRequestFeature : IHttpRequestFeature { - public DeafultHttpRequestFeature() + public DefaultHttpRequestFeature() { Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 054abcaa32..358e55cca5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -27,7 +27,7 @@ - + From 31edabdfcb1aba6eecbd677d2a9dbeaf32400972 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 09:13:45 -0700 Subject: [PATCH 0231/1838] #96 Enable Owin->AspNet WebSockets. --- .../Microsoft.AspNet.Owin.kproj | 3 + src/Microsoft.AspNet.Owin/OwinConstants.cs | 1 + .../OwinFeatureCollection.cs | 38 +++- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 129 ++++++++++++ .../WebSockets/OwinWebSocketAcceptContext.cs | 39 ++++ .../WebSockets/OwinWebSocketAdapter.cs | 191 ++++++++++++++++++ 6 files changed, 400 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index ea1daa11aa..44a2b3584a 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -26,6 +26,9 @@ + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 1e1296b67d..7589b57308 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -134,6 +134,7 @@ namespace Microsoft.AspNet.Owin // 3.2. Per Request public const string Accept = "websocket.Accept"; + public const string AcceptAlt = "websocket.AcceptAlt"; // Non-spec // 4. Accept diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index f546eaa930..bec1cd1292 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -7,15 +7,16 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.WebSockets; using System.Reflection; using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.FeatureModel; namespace Microsoft.AspNet.Owin { @@ -30,6 +31,7 @@ namespace Microsoft.AspNet.Owin IHttpClientCertificateFeature, IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, + IHttpWebSocketFeature, IOwinEnvironmentFeature { public IDictionary Environment { get; set; } @@ -236,6 +238,32 @@ namespace Microsoft.AspNet.Owin IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } + /// + /// Gets or sets if the underlying server supports WebSockets. This is disabled by default. + /// The value should be consistant across requests. + /// + public bool SupportsWebSockets { get; set; } + + bool IHttpWebSocketFeature.IsWebSocketRequest + { + get + { + object obj; + return Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj); + } + } + + Task IHttpWebSocketFeature.AcceptAsync(IWebSocketAcceptContext context) + { + object obj; + if (!Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj)) + { + throw new NotSupportedException("WebSockets are not supported"); // TODO: LOC + } + var accept = (Func>)obj; + return accept(context); + } + public int Revision { get { return 0; } // Not modifiable @@ -260,6 +288,10 @@ namespace Microsoft.AspNet.Owin { return SupportsClientCerts; } + else if (key == typeof(IHttpWebSocketFeature)) + { + return SupportsWebSockets; + } // The rest of the features are always supported. return true; @@ -288,6 +320,10 @@ namespace Microsoft.AspNet.Owin { keys.Add(typeof(IHttpClientCertificateFeature)); } + if (SupportsWebSockets) + { + keys.Add(typeof(IHttpWebSocketFeature)); + } return keys; } } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs new file mode 100644 index 0000000000..ce45e4fc4f --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -0,0 +1,129 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + using WebSocketAccept = + Action + < + IDictionary, // WebSocket Accept parameters + Func // WebSocketFunc callback + < + IDictionary, // WebSocket environment + Task // Complete + > + >; + using WebSocketAcceptAlt = + Func + < + IWebSocketAcceptContext, // WebSocket Accept parameters + Task + >; + + public class OwinWebSocketAcceptAdapter + { + private WebSocketAccept _owinWebSocketAccept; + private TaskCompletionSource _requestTcs = new TaskCompletionSource(); + private TaskCompletionSource _acceptTcs = new TaskCompletionSource(); + private TaskCompletionSource _upstreamWentAsync = new TaskCompletionSource(); + private string _subProtocol = null; + + private OwinWebSocketAcceptAdapter(WebSocketAccept owinWebSocketAccept) + { + _owinWebSocketAccept = owinWebSocketAccept; + } + + private Task RequestTask { get { return _requestTcs.Task; } } + private Task UpstreamTask { get; set; } + private TaskCompletionSource UpstreamWentAsyncTcs { get { return _upstreamWentAsync; } } + + private async Task AcceptWebSocketAsync(IWebSocketAcceptContext context) + { + IDictionary options = null; + if (context is OwinWebSocketAcceptContext) + { + var acceptContext = context as OwinWebSocketAcceptContext; + options = acceptContext.Options; + _subProtocol = acceptContext.SubProtocol; + } + else if (context != null && context.SubProtocol != null) + { + options = new Dictionary(1) + { + { OwinConstants.WebSocket.SubProtocol, context.SubProtocol } + }; + _subProtocol = context.SubProtocol; + } + + // Accept may have been called synchronously on the original request thread, we might not have a task yet. Go async. + await _upstreamWentAsync.Task; + + _owinWebSocketAccept(options, OwinAcceptCallback); + _requestTcs.TrySetResult(0); // Let the pipeline unwind. + + return await _acceptTcs.Task; + } + + private Task OwinAcceptCallback(IDictionary webSocketContext) + { + _acceptTcs.TrySetResult(new OwinWebSocketAdapter(webSocketContext, _subProtocol)); + return UpstreamTask; + } + + // Make sure declined websocket requests complete. This is a no-op for accepted websocket requests. + private void EnsureCompleted(Task task) + { + if (task.IsCanceled) + { + _requestTcs.TrySetCanceled(); + } + else if (task.IsFaulted) + { + _requestTcs.TrySetException(task.Exception); + } + else + { + _requestTcs.TrySetResult(0); + } + } + + public static AppFunc AdaptWebSockets(AppFunc next) + { + return environment => + { + object accept; + if (environment.TryGetValue(OwinConstants.WebSocket.Accept, out accept) && accept is WebSocketAccept) + { + var adapter = new OwinWebSocketAcceptAdapter((WebSocketAccept)accept); + + environment[OwinConstants.WebSocket.AcceptAlt] = new WebSocketAcceptAlt(adapter.AcceptWebSocketAsync); + + try + { + adapter.UpstreamTask = next(environment); + adapter.UpstreamWentAsyncTcs.TrySetResult(0); + adapter.UpstreamTask.ContinueWith(adapter.EnsureCompleted, TaskContinuationOptions.ExecuteSynchronously); + } + catch (Exception ex) + { + adapter.UpstreamWentAsyncTcs.TrySetException(ex); + throw; + } + + return adapter.RequestTask; + } + else + { + return next(environment); + } + }; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs new file mode 100644 index 0000000000..b23e2dbdcb --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + public class OwinWebSocketAcceptContext : IWebSocketAcceptContext + { + private IDictionary _options = new Dictionary(1); + + public OwinWebSocketAcceptContext() + { + } + + public string SubProtocol + { + get + { + object obj; + if (_options.TryGetValue(OwinConstants.WebSocket.SubProtocol, out obj)) + { + return (string)obj; + } + return null; + } + set + { + _options[OwinConstants.WebSocket.SubProtocol] = value; + } + } + + public IDictionary Options + { + get { return _options; } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs new file mode 100644 index 0000000000..d77fd57295 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -0,0 +1,191 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using System.Net.WebSockets; + +namespace Microsoft.AspNet.Owin +{ + // http://owin.org/extensions/owin-WebSocket-Extension-v0.4.0.htm + using WebSocketCloseAsync = + Func; + using WebSocketReceiveAsync = + Func /* data */, + CancellationToken /* cancel */, + Task>>; + using WebSocketSendAsync = + Func /* data */, + int /* messageType */, + bool /* endOfMessage */, + CancellationToken /* cancel */, + Task>; + using RawWebSocketReceiveResult = Tuple; // count + + public class OwinWebSocketAdapter : WebSocket + { + private IDictionary _websocketContext; + private WebSocketSendAsync _sendAsync; + private WebSocketReceiveAsync _receiveAsync; + private WebSocketCloseAsync _closeAsync; + private WebSocketState _state; + private string _subProtocol; + + public OwinWebSocketAdapter(IDictionary websocketContext, string subProtocol) + { + _websocketContext = websocketContext; + _sendAsync = (WebSocketSendAsync)websocketContext[OwinConstants.WebSocket.SendAsync]; + _receiveAsync = (WebSocketReceiveAsync)websocketContext[OwinConstants.WebSocket.ReceiveAsync]; + _closeAsync = (WebSocketCloseAsync)websocketContext[OwinConstants.WebSocket.CloseAsync]; + _state = WebSocketState.Open; + _subProtocol = subProtocol; + } + + public override WebSocketCloseStatus? CloseStatus + { + get + { + object obj; + if (_websocketContext.TryGetValue(OwinConstants.WebSocket.ClientCloseStatus, out obj)) + { + return (WebSocketCloseStatus)obj; + } + return null; + } + } + + public override string CloseStatusDescription + { + get + { + object obj; + if (_websocketContext.TryGetValue(OwinConstants.WebSocket.ClientCloseDescription, out obj)) + { + return (string)obj; + } + return null; + } + } + + public override string SubProtocol + { + get + { + return _subProtocol; + } + } + + public override WebSocketState State + { + get + { + return _state; + } + } + + public override async Task ReceiveAsync(ArraySegment buffer, CancellationToken cancellationToken) + { + var rawResult = await _receiveAsync(buffer, cancellationToken); + var messageType = OpCodeToEnum(rawResult.Item1); + if (messageType == WebSocketMessageType.Close) + { + if (State == WebSocketState.Open) + { + _state = WebSocketState.CloseReceived; + } + else if (State == WebSocketState.CloseSent) + { + _state = WebSocketState.Closed; + } + return new WebSocketReceiveResult(rawResult.Item3, messageType, rawResult.Item2, CloseStatus, CloseStatusDescription); + } + else + { + return new WebSocketReceiveResult(rawResult.Item3, messageType, rawResult.Item2); + } + } + + public override Task SendAsync(ArraySegment buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) + { + return _sendAsync(buffer, EnumToOpCode(messageType), endOfMessage, cancellationToken); + } + + public override async Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) + { + if (State == WebSocketState.Open || State == WebSocketState.CloseReceived) + { + await CloseOutputAsync(closeStatus, statusDescription, cancellationToken); + } + + byte[] buffer = new byte[1024]; + while (State == WebSocketState.CloseSent) + { + // Drain until close received + await ReceiveAsync(new ArraySegment(buffer), cancellationToken); + } + } + + public override Task CloseOutputAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) + { + // TODO: Validate state + if (State == WebSocketState.Open) + { + _state = WebSocketState.CloseSent; + } + else if (State == WebSocketState.CloseReceived) + { + _state = WebSocketState.Closed; + } + return _closeAsync((int)closeStatus, statusDescription, cancellationToken); + } + + public override void Abort() + { + _state = WebSocketState.Aborted; + } + + public override void Dispose() + { + _state = WebSocketState.Closed; + } + + private static WebSocketMessageType OpCodeToEnum(int messageType) + { + switch (messageType) + { + case 0x1: + return WebSocketMessageType.Text; + case 0x2: + return WebSocketMessageType.Binary; + case 0x8: + return WebSocketMessageType.Close; + default: + throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + } + } + + private static int EnumToOpCode(WebSocketMessageType webSocketMessageType) + { + switch (webSocketMessageType) + { + case WebSocketMessageType.Text: + return 0x1; + case WebSocketMessageType.Binary: + return 0x2; + case WebSocketMessageType.Close: + return 0x8; + default: + throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + } + } + } +} \ No newline at end of file From b1c82c00667af055b7ae6363a14dd3ac6bc31a8f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 8 Jul 2014 13:55:03 -0700 Subject: [PATCH 0232/1838] #96 Enable AspNet->Owin WebSockets. --- .../Microsoft.AspNet.Owin.kproj | 2 + src/Microsoft.AspNet.Owin/OwinConstants.cs | 1 + src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 12 ++ .../WebSockets/OwinWebSocketAcceptContext.cs | 15 +- .../WebSockets/WebSocketAcceptAdapter.cs | 88 +++++++++ .../WebSockets/WebSocketAdapter.cs | 172 ++++++++++++++++++ 6 files changed, 287 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs create mode 100644 src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 44a2b3584a..931181cfd8 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -29,6 +29,8 @@ + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 7589b57308..b86dfc1a75 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -130,6 +130,7 @@ namespace Microsoft.AspNet.Owin // 3.1. Startup public const string Version = "websocket.Version"; + public const string VersionValue = "1.0"; // 3.2. Per Request diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 914837c083..781ba621e2 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -8,6 +8,7 @@ using System.Globalization; using System.IO; using System.Linq; using System.Net; +using System.Net.WebSockets; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; @@ -20,6 +21,12 @@ using Microsoft.AspNet.PipelineCore.Security; namespace Microsoft.AspNet.Owin { using SendFileFunc = Func; + using WebSocketAcceptAlt = + Func + < + IWebSocketAcceptContext, // WebSocket Accept parameters + Task + >; public class OwinEnvironment : IDictionary { @@ -76,6 +83,11 @@ namespace Microsoft.AspNet.Owin feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } + if (context.IsWebSocketRequest) + { + _entries.Add(OwinConstants.WebSocket.AcceptAlt, new FeatureMap(feature => new WebSocketAcceptAlt(feature.AcceptAsync))); + } + _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index b23e2dbdcb..d67be74199 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -8,18 +8,23 @@ namespace Microsoft.AspNet.Owin { public class OwinWebSocketAcceptContext : IWebSocketAcceptContext { - private IDictionary _options = new Dictionary(1); + private IDictionary _options; - public OwinWebSocketAcceptContext() + public OwinWebSocketAcceptContext() : this(new Dictionary(1)) { } + public OwinWebSocketAcceptContext(IDictionary options) + { + _options = options; + } + public string SubProtocol { get { object obj; - if (_options.TryGetValue(OwinConstants.WebSocket.SubProtocol, out obj)) + if (_options != null && _options.TryGetValue(OwinConstants.WebSocket.SubProtocol, out obj)) { return (string)obj; } @@ -27,6 +32,10 @@ namespace Microsoft.AspNet.Owin } set { + if (_options == null) + { + _options = new Dictionary(1); + } _options[OwinConstants.WebSocket.SubProtocol] = value; } } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs new file mode 100644 index 0000000000..5d5b4a5f3b --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + using WebSocketAccept = + Action + < + IDictionary, // WebSocket Accept parameters + Func // WebSocketFunc callback + < + IDictionary, // WebSocket environment + Task // Complete + > + >; + using WebSocketAcceptAlt = + Func + < + IWebSocketAcceptContext, // WebSocket Accept parameters + Task + >; + + public class WebSocketAcceptAdapter + { + private IDictionary _env; + private WebSocketAcceptAlt _accept; + private AppFunc _callback; + private IDictionary _options; + + public WebSocketAcceptAdapter(IDictionary env, WebSocketAcceptAlt accept) + { + _env = env; + _accept = accept; + } + + private void AcceptWebSocket(IDictionary options, AppFunc callback) + { + _options = options; + _callback = callback; + _env[OwinConstants.ResponseStatusCode] = 101; + } + + public static AppFunc AdaptWebSockets(AppFunc next) + { + return async environment => + { + object accept; + if (environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out accept) && accept is WebSocketAcceptAlt) + { + var adapter = new WebSocketAcceptAdapter(environment, (WebSocketAcceptAlt)accept); + + environment[OwinConstants.WebSocket.Accept] = new WebSocketAccept(adapter.AcceptWebSocket); + await next(environment); + if ((int)environment[OwinConstants.ResponseStatusCode] == 101 && adapter._callback != null) + { + IWebSocketAcceptContext acceptContext = null; + object obj; + if (adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) + { + acceptContext = obj as IWebSocketAcceptContext; + } + else if (adapter._options != null) + { + acceptContext = new OwinWebSocketAcceptContext(adapter._options); + } + + var webSocket = await adapter._accept(acceptContext); + var webSocketAdapter = new WebSocketAdapter(webSocket, (CancellationToken)environment[OwinConstants.CallCancelled]); + await adapter._callback(webSocketAdapter.Environment); + await webSocketAdapter.CleanupAsync(); + } + } + else + { + await next(environment); + } + }; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs new file mode 100644 index 0000000000..245157b6c1 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -0,0 +1,172 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Owin +{ + using WebSocketCloseAsync = + Func; + using WebSocketReceiveAsync = + Func /* data */, + CancellationToken /* cancel */, + Task>>; + using WebSocketReceiveTuple = + Tuple; + using WebSocketSendAsync = + Func /* data */, + int /* messageType */, + bool /* endOfMessage */, + CancellationToken /* cancel */, + Task>; + + public class WebSocketAdapter + { + private readonly WebSocket _webSocket; + private readonly IDictionary _environment; + private readonly CancellationToken _cancellationToken; + private readonly WebSocket _context; + + internal WebSocketAdapter(WebSocket webSocket, CancellationToken ct) + { + _webSocket = webSocket; + _cancellationToken = ct; + + _environment = new Dictionary(); + _environment[OwinConstants.WebSocket.SendAsync] = new WebSocketSendAsync(SendAsync); + _environment[OwinConstants.WebSocket.ReceiveAsync] = new WebSocketReceiveAsync(ReceiveAsync); + _environment[OwinConstants.WebSocket.CloseAsync] = new WebSocketCloseAsync(CloseAsync); + _environment[OwinConstants.WebSocket.CallCancelled] = ct; + _environment[OwinConstants.WebSocket.Version] = OwinConstants.WebSocket.VersionValue; + + _environment[typeof(WebSocket).FullName] = webSocket; + } + + internal IDictionary Environment + { + get { return _environment; } + } + + internal Task SendAsync(ArraySegment buffer, int messageType, bool endOfMessage, CancellationToken cancel) + { + // Remap close messages to CloseAsync. System.Net.WebSockets.WebSocket.SendAsync does not allow close messages. + if (messageType == 0x8) + { + return RedirectSendToCloseAsync(buffer, cancel); + } + else if (messageType == 0x9 || messageType == 0xA) + { + // Ping & Pong, not allowed by the underlying APIs, silently discard. + return Task.FromResult(0); + } + + return _webSocket.SendAsync(buffer, OpCodeToEnum(messageType), endOfMessage, cancel); + } + + internal async Task ReceiveAsync(ArraySegment buffer, CancellationToken cancel) + { + WebSocketReceiveResult nativeResult = await _webSocket.ReceiveAsync(buffer, cancel); + + if (nativeResult.MessageType == WebSocketMessageType.Close) + { + _environment[OwinConstants.WebSocket.ClientCloseStatus] = (int)(nativeResult.CloseStatus ?? WebSocketCloseStatus.NormalClosure); + _environment[OwinConstants.WebSocket.ClientCloseDescription] = nativeResult.CloseStatusDescription ?? string.Empty; + } + + return new WebSocketReceiveTuple( + EnumToOpCode(nativeResult.MessageType), + nativeResult.EndOfMessage, + nativeResult.Count); + } + + internal Task CloseAsync(int status, string description, CancellationToken cancel) + { + return _webSocket.CloseOutputAsync((WebSocketCloseStatus)status, description, cancel); + } + + private Task RedirectSendToCloseAsync(ArraySegment buffer, CancellationToken cancel) + { + if (buffer.Array == null || buffer.Count == 0) + { + return CloseAsync(1000, string.Empty, cancel); + } + else if (buffer.Count >= 2) + { + // Unpack the close message. + int statusCode = + (buffer.Array[buffer.Offset] << 8) + | buffer.Array[buffer.Offset + 1]; + string description = Encoding.UTF8.GetString(buffer.Array, buffer.Offset + 2, buffer.Count - 2); + + return CloseAsync(statusCode, description, cancel); + } + else + { + throw new ArgumentOutOfRangeException("buffer"); + } + } + + internal async Task CleanupAsync() + { + switch (_webSocket.State) + { + case WebSocketState.Closed: // Closed gracefully, no action needed. + case WebSocketState.Aborted: // Closed abortively, no action needed. + break; + case WebSocketState.CloseReceived: + // Echo what the client said, if anything. + await _webSocket.CloseAsync(_webSocket.CloseStatus ?? WebSocketCloseStatus.NormalClosure, + _webSocket.CloseStatusDescription ?? string.Empty, _cancellationToken); + break; + case WebSocketState.Open: + case WebSocketState.CloseSent: // No close received, abort so we don't have to drain the pipe. + _webSocket.Abort(); + break; + default: + throw new ArgumentOutOfRangeException("state", _webSocket.State, string.Empty); + } + } + + private static WebSocketMessageType OpCodeToEnum(int messageType) + { + switch (messageType) + { + case 0x1: + return WebSocketMessageType.Text; + case 0x2: + return WebSocketMessageType.Binary; + case 0x8: + return WebSocketMessageType.Close; + default: + throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + } + } + + private static int EnumToOpCode(WebSocketMessageType webSocketMessageType) + { + switch (webSocketMessageType) + { + case WebSocketMessageType.Text: + return 0x1; + case WebSocketMessageType.Binary: + return 0x2; + case WebSocketMessageType.Close: + return 0x8; + default: + throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + } + } + } +} From 1074fc102a2b49010e5e714eff7cd5bb398a0a6b Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 9 Jul 2014 17:19:41 -0700 Subject: [PATCH 0233/1838] OWIN WebSockets: Cleanup, docs, extension methods. --- .../Microsoft.AspNet.Owin.kproj | 1 + .../OwinEnvironmentFeature.cs | 12 ++++++ src/Microsoft.AspNet.Owin/OwinExtensions.cs | 41 ++++++++++++++++--- .../OwinFeatureCollection.cs | 3 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 14 +++++++ .../WebSockets/OwinWebSocketAcceptContext.cs | 4 +- .../WebSockets/WebSocketAcceptAdapter.cs | 6 ++- 7 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 931181cfd8..822be75de7 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -23,6 +23,7 @@ + diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs new file mode 100644 index 0000000000..1675852e5f --- /dev/null +++ b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Owin +{ + public class OwinEnvironmentFeature : IOwinEnvironmentFeature + { + public IDictionary Environment { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index d48462c16e..674befa4f9 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Builder { public static AddMiddleware UseOwin(this IBuilder builder) { - return middleware => + AddMiddleware add = middleware => { Func middleware1 = next1 => { @@ -36,11 +36,26 @@ namespace Microsoft.AspNet.Builder var app = middleware(exitMiddlware); return httpContext => { - return app.Invoke(new OwinEnvironment(httpContext)); + // Use the existing OWIN env if there is one. + IDictionary env; + var owinEnvFeature = httpContext.GetFeature(); + if (owinEnvFeature != null) + { + env = owinEnvFeature.Environment; + env[typeof(HttpContext).FullName] = httpContext; + } + else + { + env = new OwinEnvironment(httpContext); + } + return app.Invoke(env); }; }; builder.Use(middleware1); }; + // Adapt WebSockets by default. + add(WebSocketAcceptAdapter.AdaptWebSockets); + return add; } public static IBuilder UseOwin(this IBuilder builder, Action pipeline) @@ -51,6 +66,8 @@ namespace Microsoft.AspNet.Builder public static IBuilder UseBuilder(this AddMiddleware app) { + // Adapt WebSockets by default. + app(OwinWebSocketAcceptAdapter.AdaptWebSockets); var builder = new Builder(serviceProvider: null); CreateMiddleware middleware = CreateMiddlewareFactory(exit => @@ -74,10 +91,22 @@ namespace Microsoft.AspNet.Builder return env => { - return app.Invoke( - new DefaultHttpContext( - new FeatureCollection( - new OwinFeatureCollection(env)))); + // Use the existing HttpContext if there is one. + HttpContext context; + object obj; + if (env.TryGetValue(typeof(HttpContext).FullName, out obj)) + { + context = (HttpContext)obj; + context.SetFeature(new OwinEnvironmentFeature() { Environment = env }); + } + else + { + context = new DefaultHttpContext( + new FeatureCollection( + new OwinFeatureCollection(env))); + } + + return app.Invoke(context); }; }; } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index bec1cd1292..7478a81e68 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -39,6 +39,7 @@ namespace Microsoft.AspNet.Owin public OwinFeatureCollection(IDictionary environment) { Environment = environment; + SupportsWebSockets = true; } T Prop(string key) @@ -239,7 +240,7 @@ namespace Microsoft.AspNet.Owin IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } /// - /// Gets or sets if the underlying server supports WebSockets. This is disabled by default. + /// Gets or sets if the underlying server supports WebSockets. This is enabled by default. /// The value should be consistant across requests. /// public bool SupportsWebSockets { get; set; } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index ce45e4fc4f..15ec0a01f8 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -27,6 +27,10 @@ namespace Microsoft.AspNet.Owin Task >; + /// + /// This adapts the OWIN WebSocket accept flow to match the ASP.NET WebSocket Accept flow. + /// This enables ASP.NET components to use WebSockets on OWIN based servers. + /// public class OwinWebSocketAcceptAdapter { private WebSocketAccept _owinWebSocketAccept; @@ -94,6 +98,16 @@ namespace Microsoft.AspNet.Owin } } + // Order of operations: + // 1. A WebSocket handshake request is received by the middleware. + // 2. The middleware inserts an alternate Accept signature into the OWIN environment. + // 3. The middleware invokes Next and stores Next's Task locally. It then returns an alternate Task to the server. + // 4. The OwinFeatureCollection adapts the alternate Accept signature to IHttpWebSocketFeature.AcceptAsync. + // 5. A component later in the pipleline invokes IHttpWebSocketFeature.AcceptAsync (mapped to AcceptWebSocketAsync). + // 6. The middleware calls the OWIN Accept, providing a local callback, and returns an incomplete Task. + // 7. The middleware completes the alternate Task it returned from Invoke, telling the server that the request pipeline has completed. + // 8. The server invokes the middleware's callback, which creats a WebSocket adapter complete's the orriginal Accept Task with it. + // 9. The middleware waits while the application uses the WebSocket, where the end is signaled by the Next's Task completion. public static AppFunc AdaptWebSockets(AppFunc next) { return environment => diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index d67be74199..1e847e6264 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -10,8 +10,8 @@ namespace Microsoft.AspNet.Owin { private IDictionary _options; - public OwinWebSocketAcceptContext() : this(new Dictionary(1)) - { + public OwinWebSocketAcceptContext() : this(new Dictionary(1)) + { } public OwinWebSocketAcceptContext(IDictionary options) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 5d5b4a5f3b..9660a5d00e 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -28,6 +28,10 @@ namespace Microsoft.AspNet.Owin Task >; + /// + /// This adapts the ASP.NET WebSocket Accept flow to match the OWIN WebSocket accept flow. + /// This enables OWIN based components to use WebSockets on ASP.NET servers. + /// public class WebSocketAcceptAdapter { private IDictionary _env; @@ -63,7 +67,7 @@ namespace Microsoft.AspNet.Owin { IWebSocketAcceptContext acceptContext = null; object obj; - if (adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) + if (adapter._options != null && adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) { acceptContext = obj as IWebSocketAcceptContext; } From fbd2c4a08ea86ab1374e2668c1a881f7d9d577f4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 10 Jul 2014 10:00:14 -0700 Subject: [PATCH 0234/1838] Added Configuration to TestApplicationEnvironment --- .../TestApplicationEnvironment.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index 14495b9fdb..800570f20a 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -38,6 +38,14 @@ namespace Microsoft.AspNet.TestHost.Tests get { return Environment.CurrentDirectory; } } + public string Configuration + { + get + { + return "debug"; + } + } + public FrameworkName TargetFramework { get { return new FrameworkName(".NETFramework", new Version(4, 5)); } From 5208421ad59c64997e0c7f1f4102ae9d36058106 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 10 Jul 2014 10:16:24 -0700 Subject: [PATCH 0235/1838] Fixed dependencies to get the right version of IApplicationEnvironment --- test/Microsoft.AspNet.TestHost.Tests/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 5f960dc372..3f762eda5f 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.TestHost": "", + "Microsoft.Framework.Runtime.Interfaces":"1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { From b6243326c3d43844ef22c17d19542789091876c4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 13 Jul 2014 21:50:14 -0700 Subject: [PATCH 0236/1838] Renamed configurations to frameworks in project.json --- src/Microsoft.AspNet.Hosting/project.json | 6 +++--- src/Microsoft.AspNet.RequestContainer/project.json | 6 +++--- src/Microsoft.AspNet.TestHost/project.json | 6 +++--- test/Microsoft.AspNet.Hosting.Tests/project.json | 6 +++--- test/Microsoft.AspNet.TestHost.Tests/project.json | 6 +++--- 5 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 333585a93c..6ae4213509 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", @@ -10,7 +10,7 @@ "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -28,4 +28,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index cb4dec51ef..eb0b844d0f 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*" }, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -23,4 +23,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 8002f95317..9d38c71bfe 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,9 +1,9 @@ -{ +{ "version" : "1.0.0-*", "dependencies": { "Microsoft.AspNet.Hosting": "" }, - "configurations": { + "frameworks": { "net45": { }, "k10" : { "dependencies": { @@ -21,4 +21,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 5218599846..f106512168 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,10 +1,10 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.RequestContainer": "", "Xunit.KRunner": "1.0.0-*" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "System.Runtime" : "" @@ -14,4 +14,4 @@ "commands": { "test": "Xunit.KRunner" } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 3f762eda5f..e4f8d10796 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.TestHost": "", @@ -8,11 +8,11 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "System.Runtime": "" } } } -} \ No newline at end of file +} From 8f39f6d4b54a4724f6234536eff0867242e89e31 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 13 Jul 2014 21:50:53 -0700 Subject: [PATCH 0237/1838] Renamed configurations to frameworks in project.json --- src/Microsoft.AspNet.FeatureModel/project.json | 6 +++--- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 6 +++--- src/Microsoft.AspNet.HttpFeature/project.json | 6 +++--- src/Microsoft.AspNet.Owin/project.json | 6 +++--- src/Microsoft.AspNet.PipelineCore/project.json | 6 +++--- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 6 +++--- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 6 +++--- test/Microsoft.AspNet.Owin.Tests/project.json | 6 +++--- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 6 +++--- 11 files changed, 30 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 04c5fa7e3a..9e7153c202 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,7 +1,7 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -15,4 +15,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 6faa246274..05084820d7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,7 @@ "dependencies": { "Microsoft.AspNet.Http": "" }, - "configurations" : { + "frameworks" : { "net45" : { }, "k10" : { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index def3e11e29..ff2288af08 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,7 +1,7 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -22,4 +22,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 96bece8d27..88d1a45513 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,6 +1,6 @@ -{ +{ "version": "1.0.0-*", - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -16,4 +16,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 70e5093a74..03fac148ca 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "", @@ -6,7 +6,7 @@ "Microsoft.AspNet.PipelineCore": "", "Microsoft.AspNet.HttpFeature": "" }, - "configurations": { + "frameworks": { "net45": { }, "k10": { "dependencies": { @@ -27,4 +27,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index a90c55474e..d8d4da1ec8 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "dependencies": { @@ -6,7 +6,7 @@ "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "" }, - "configurations": { + "frameworks": { "net45": {}, "k10": { "dependencies": { @@ -28,4 +28,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index deec853dae..edd64952a5 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -8,7 +8,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -16,4 +16,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 701d09c188..d4f878c1ae 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -9,7 +9,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -17,4 +17,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 1c00f87e1d..3b3a2b30f5 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", @@ -9,7 +9,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -17,4 +17,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 8d59b446c6..ab327d0772 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -10,7 +10,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Shouldly": "1.1.1.1", @@ -18,4 +18,4 @@ } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 4b282a0a4b..d83574ead1 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", @@ -9,7 +9,7 @@ "commands": { "test": "Xunit.KRunner" }, - "configurations": { + "frameworks": { "net45": { "dependencies": { "Moq": "4.2.1312.1622", @@ -18,4 +18,4 @@ } } } -} \ No newline at end of file +} From 6c94e0317b29415d3848cee9959c8971c1a21448 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 15:07:44 -0700 Subject: [PATCH 0238/1838] Reacting to System.Collections version change --- src/Microsoft.AspNet.Owin/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 03fac148ca..014ce61ad1 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -10,7 +10,7 @@ "net45": { }, "k10": { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", From ccbf458f71ba6bf074380901aa045c86d896273f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 15:27:24 -0700 Subject: [PATCH 0239/1838] Reacting to System.Collections version change --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 9e7153c202..935bd582a9 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -5,7 +5,7 @@ "net45": {}, "k10": { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Reflection.TypeExtensions": "4.0.0.0", diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index ff2288af08..4a641d3f1e 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,7 @@ "k10": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 014ce61ad1..0b5a236f1d 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -11,7 +11,7 @@ "k10": { "dependencies": { "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", + "System.ComponentModel": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index d8d4da1ec8..1d116f7302 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -11,7 +11,7 @@ "k10": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", From 8ab566e049eadd730144822909ae3695f877f5fc Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 15:35:04 -0700 Subject: [PATCH 0240/1838] Reverting version change to ComponentModel --- src/Microsoft.AspNet.Owin/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 0b5a236f1d..014ce61ad1 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -11,7 +11,7 @@ "k10": { "dependencies": { "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.10.0", + "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.IO": "4.0.0.0", From 0385438ed0a3808fbef282cda560b2b6d6f61e29 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 16:51:46 -0700 Subject: [PATCH 0241/1838] Reacting to System.Collections versioning change --- src/Microsoft.AspNet.Hosting/project.json | 4 ++-- src/Microsoft.AspNet.RequestContainer/project.json | 4 ++-- src/Microsoft.AspNet.TestHost/project.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 6ae4213509..d77f6393d3 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", @@ -14,7 +14,7 @@ "net45": {}, "k10": { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Console": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index eb0b844d0f..7c3a92c05e 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", @@ -9,7 +9,7 @@ "net45": {}, "k10": { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", "System.Linq": "4.0.0.0", diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 9d38c71bfe..1592b1a2c3 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,4 +1,4 @@ -{ +{ "version" : "1.0.0-*", "dependencies": { "Microsoft.AspNet.Hosting": "" @@ -7,7 +7,7 @@ "net45": { }, "k10" : { "dependencies": { - "System.Collections": "4.0.0.0", + "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.Linq": "4.0.0.0", From dd7537de4a4519aeb441a74761d46561898bfae4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 12:11:51 -0700 Subject: [PATCH 0242/1838] #103 Fix ambigious Keys property on IHeaderDictionary. --- .../IHeaderDictionary.cs | 6 ++++ .../HeaderDictionaryTests.cs | 31 +++++++++++++++++++ .../Microsoft.AspNet.PipelineCore.Tests.kproj | 3 +- 3 files changed, 39 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs index fecac4a0f4..e1304b5e5f 100644 --- a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/IHeaderDictionary.cs @@ -24,6 +24,12 @@ namespace Microsoft.AspNet.Http /// new int Count { get; } + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys + /// + /// Gets a collection containing the keys. + /// + new ICollection Keys { get; } + /// /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs new file mode 100644 index 0000000000..667f2dcb8a --- /dev/null +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.PipelineCore.Collections; +using Xunit; + +namespace Microsoft.AspNet.PipelineCore.Tests +{ + public class HeaderDictionaryTests + { + [Fact] + public void PropertiesAreAccessible() + { + var headers = new HeaderDictionary( + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "Header1", new[] { "Value1" } } + }); + + Assert.Equal(1, headers.Count); + Assert.Equal(new[] { "Headers1" }, headers.Keys); + Assert.True(headers.ContainsKey("headers1")); + Assert.False(headers.ContainsKey("headers2")); + Assert.Equal("Value1", headers["header1"]); + Assert.Equal("Value1", headers.Get("header1")); + Assert.Equal(new[] { "Value1" }, headers.GetValues("header1")); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 13a5649e18..09ea94747b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -23,10 +23,11 @@ + - + \ No newline at end of file From fe5202b3d2ad7dbd0606b6e83e9e11fd80c1b251 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 12:17:36 -0700 Subject: [PATCH 0243/1838] Fix test. --- .../HeaderDictionaryTests.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs index 667f2dcb8a..e182890112 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -20,9 +20,9 @@ namespace Microsoft.AspNet.PipelineCore.Tests }); Assert.Equal(1, headers.Count); - Assert.Equal(new[] { "Headers1" }, headers.Keys); - Assert.True(headers.ContainsKey("headers1")); - Assert.False(headers.ContainsKey("headers2")); + Assert.Equal(new[] { "Header1" }, headers.Keys); + Assert.True(headers.ContainsKey("header1")); + Assert.False(headers.ContainsKey("header2")); Assert.Equal("Value1", headers["header1"]); Assert.Equal("Value1", headers.Get("header1")); Assert.Equal(new[] { "Value1" }, headers.GetValues("header1")); From de1017e0108484278f57cf44f702d1d2f81d5d61 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 12:20:57 -0700 Subject: [PATCH 0244/1838] Fix test... --- .../HeaderDictionaryTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs index e182890112..74667bbeb0 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.PipelineCore.Tests }); Assert.Equal(1, headers.Count); - Assert.Equal(new[] { "Header1" }, headers.Keys); + Assert.Equal(new[] { "Header1" }, headers.Keys); Assert.True(headers.ContainsKey("header1")); Assert.False(headers.ContainsKey("header2")); Assert.Equal("Value1", headers["header1"]); From dc055f783a8634bfe46f4765699b0c8c7e55d807 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 16 Jul 2014 16:12:46 -0700 Subject: [PATCH 0245/1838] #91 Add constructors to Form, Query, and Cookie features for testing. --- src/Microsoft.AspNet.Http/HostString.cs | 2 -- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 12 +++++++++++- .../Infrastructure/ParsingHelpers.cs | 2 -- .../Microsoft.AspNet.PipelineCore.kproj | 1 + .../NotNullAttribute.cs | 12 ++++++++++++ .../QueryFeature.cs | 15 ++++++++++++--- .../RequestCookiesFeature.cs | 16 +++++++++++++--- 7 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 1786a7c338..7e4381f9f1 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -136,9 +136,7 @@ namespace Microsoft.AspNet.Http throw new ArgumentNullException("uri"); } return new HostString(uri.GetComponents( -#if !NET40 UriComponents.NormalizedHost | // Always convert punycode to Unicode. -#endif UriComponents.HostAndPort, UriFormat.Unescaped)); } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 25472d4057..e695b460a3 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -20,13 +20,23 @@ namespace Microsoft.AspNet.PipelineCore private Stream _bodyStream; private IReadableStringCollection _form; - public FormFeature(IFeatureCollection features) + public FormFeature([NotNull] IReadableStringCollection form) + { + _form = form; + } + + public FormFeature([NotNull] IFeatureCollection features) { _features = features; } public async Task GetFormAsync(CancellationToken cancellationToken) { + if (_features == null) + { + return _form; + } + var body = _request.Fetch(_features).Body; if (_bodyStream == null || _bodyStream != body) diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 8dc89e6063..a545a1dac7 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -818,7 +818,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure StringComparer.OrdinalIgnoreCase); } -#if !NET40 internal static IFormCollection GetForm(string text) { IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); @@ -830,7 +829,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } return new FormCollection(form); } -#endif internal static string GetJoinedValue(IDictionary store, string key) { diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 358e55cca5..8caa5a4f61 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -31,6 +31,7 @@ + diff --git a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs new file mode 100644 index 0000000000..33fc2e3070 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.PipelineCore +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 71e75e5031..a2c7df5fe3 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -1,9 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -17,7 +16,12 @@ namespace Microsoft.AspNet.PipelineCore private string _queryString; private IReadableStringCollection _query; - public QueryFeature(IFeatureCollection features) + public QueryFeature([NotNull] IReadableStringCollection query) + { + _query = query; + } + + public QueryFeature([NotNull] IFeatureCollection features) { _features = features; } @@ -26,6 +30,11 @@ namespace Microsoft.AspNet.PipelineCore { get { + if (_features == null) + { + return _query; + } + var queryString = _request.Fetch(_features).QueryString; if (_query == null || _queryString != queryString) { diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 6af65fa206..5507708ea6 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -17,9 +17,14 @@ namespace Microsoft.AspNet.PipelineCore private readonly FeatureReference _request = FeatureReference.Default; private string _cookiesHeader; private RequestCookiesCollection _cookiesCollection; - private static readonly string[] ZeroHeaders = new string[0]; + private IReadableStringCollection _cookies; - public RequestCookiesFeature(IFeatureCollection features) + public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) + { + _cookies = cookies; + } + + public RequestCookiesFeature([NotNull] IFeatureCollection features) { _features = features; } @@ -28,8 +33,13 @@ namespace Microsoft.AspNet.PipelineCore { get { + if (_features == null) + { + return _cookies; + } + var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? ""; + string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? string.Empty; if (_cookiesCollection == null) { From 0ba1731928bef68cb74f47c67dceef0f8334e1b3 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 17 Jul 2014 09:57:27 -0700 Subject: [PATCH 0246/1838] Add more feature constructors. --- src/Microsoft.AspNet.PipelineCore/FormFeature.cs | 6 ++++++ src/Microsoft.AspNet.PipelineCore/QueryFeature.cs | 6 ++++++ .../RequestCookiesFeature.cs | 8 +++++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index e695b460a3..c2b90a6574 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; @@ -20,6 +21,11 @@ namespace Microsoft.AspNet.PipelineCore private Stream _bodyStream; private IReadableStringCollection _form; + public FormFeature([NotNull] IDictionary form) + : this (new ReadableStringCollection(form)) + { + } + public FormFeature([NotNull] IReadableStringCollection form) { _form = form; diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index a2c7df5fe3..1cf25622df 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; @@ -16,6 +17,11 @@ namespace Microsoft.AspNet.PipelineCore private string _queryString; private IReadableStringCollection _query; + public QueryFeature([NotNull] IDictionary query) + : this (new ReadableStringCollection(query)) + { + } + public QueryFeature([NotNull] IReadableStringCollection query) { _query = query; diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 5507708ea6..952bfed0f6 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -2,9 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -19,6 +20,11 @@ namespace Microsoft.AspNet.PipelineCore private RequestCookiesCollection _cookiesCollection; private IReadableStringCollection _cookies; + public RequestCookiesFeature([NotNull] IDictionary cookies) + : this (new ReadableStringCollection(cookies)) + { + } + public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) { _cookies = cookies; From 384d54577e9b148788b51c91eee1ef064d6c33a3 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 23 Jul 2014 09:14:34 -0700 Subject: [PATCH 0247/1838] Remove unused field. --- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 245157b6c1..79f8c0bf2e 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -37,7 +37,6 @@ namespace Microsoft.AspNet.Owin private readonly WebSocket _webSocket; private readonly IDictionary _environment; private readonly CancellationToken _cancellationToken; - private readonly WebSocket _context; internal WebSocketAdapter(WebSocket webSocket, CancellationToken ct) { From 80ffd26465afebfc4eacc68299ff56a5807207b1 Mon Sep 17 00:00:00 2001 From: harshgMSFT Date: Tue, 15 Jul 2014 17:57:44 -0700 Subject: [PATCH 0248/1838] Adding abstractions for request headers viz. Accept, Accept-Charset and Content-Type. --- HttpAbstractions.sln | 2 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 12 +++- .../DefaultHttpRequest.cs | 18 ++++++ .../Infrastructure/Constants.cs | 1 + .../DefaultHttpRequestTests.cs | 56 ++++++++++++++++++- 5 files changed, 83 insertions(+), 6 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 5158aff09e..46b9267189 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21813.0 +VisualStudioVersion = 14.0.21806.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 4d1aa1a9db..be5e1e14b1 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; +using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -95,7 +97,7 @@ namespace Microsoft.AspNet.Http /// Gets or sets the Content-Type header. /// /// The Content-Type header. - // (TODO header conventions?) public abstract string ContentType { get; set; } + public abstract string ContentType { get; set; } /// /// Gets or sets the Cache-Control header. @@ -113,7 +115,13 @@ namespace Microsoft.AspNet.Http /// Gets or set the Accept header. /// /// The Accept header. - // (TODO header conventions?) public abstract string Accept { get; set; } + public abstract string Accept { get; set; } + + /// + /// Gets or set the Accept-Charset header. + /// + /// The Accept-Charset header. + public abstract string AcceptCharset { get; set; } /// /// Gets or set the owin.RequestBody Stream. diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index efdda560d1..eac94536d6 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -149,5 +149,23 @@ namespace Microsoft.AspNet.PipelineCore { get { return RequestCookiesFeature.Cookies; } } + + public override string ContentType + { + get { return Headers[Constants.Headers.ContentType]; } + set { Headers[Constants.Headers.ContentType] = value; } + } + + public override string Accept + { + get { return Headers[Constants.Headers.Accept]; } + set { Headers[Constants.Headers.Accept] = value; } + } + + public override string AcceptCharset + { + get { return Headers[Constants.Headers.AcceptCharset]; } + set { Headers[Constants.Headers.AcceptCharset] = value; } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 1f440b0bf1..9404c79c70 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.Http.Infrastructure internal const string CacheControl = "Cache-Control"; internal const string MediaType = "Media-Type"; internal const string Accept = "Accept"; + internal const string AcceptCharset = "Accept-Charset"; internal const string Host = "Host"; internal const string ETag = "ETag"; internal const string Location = "Location"; diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index baa1c6c4ed..c82bfd67b7 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -49,6 +49,36 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Null(request.ContentLength); } + [Fact] + public void GetContentType_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequestWithContentType(contentType: null); + + // Act and Assert + Assert.Null(request.ContentType); + } + + [Fact] + public void GetAcceptHeader_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequestWithAcceptHeader(acceptHeader: null); + + // Act and Assert + Assert.Null(request.Accept); + } + + [Fact] + public void GetAcceptCharsetHeader_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var request = GetRequestWithAcceptCharsetHeader(acceptCharset: null); + + // Act and Assert + Assert.Null(request.AcceptCharset); + } + [Fact] public void Host_GetsHostFromHeaders() { @@ -114,14 +144,34 @@ namespace Microsoft.AspNet.PipelineCore.Tests } private static HttpRequest GetRequestWithContentLength(string contentLength = null) + { + return GetRequestWithHeader("Content-Length", contentLength); + } + + private static HttpRequest GetRequestWithContentType(string contentType = null) + { + return GetRequestWithHeader("Content-Type", contentType); + } + + private static HttpRequest GetRequestWithAcceptHeader(string acceptHeader = null) + { + return GetRequestWithHeader("Accept", acceptHeader); + } + + private static HttpRequest GetRequestWithAcceptCharsetHeader(string acceptCharset = null) + { + return GetRequestWithHeader("Accept-Charset", acceptCharset); + } + + private static HttpRequest GetRequestWithHeader(string headerName, string headerValue) { var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); - if (contentLength != null) + if (headerValue != null) { - headers.Add("Content-Length", new[] { contentLength }); + headers.Add(headerName, new[] { headerValue }); } - return CreateRequest(headers); + return CreateRequest(headers); } } } From af279f6d2b6cdae9a8dde676a8494ef730aa47a6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Jul 2014 09:08:13 -0700 Subject: [PATCH 0249/1838] #65 Add a QueryBuilder. --- HttpAbstractions.sln | 28 ++++++- .../Microsoft.AspNet.WebUtilities.kproj | 35 +++++++++ .../QueryBuilder.cs | 74 ++++++++++++++++++ .../project.json | 14 ++++ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 35 +++++++++ .../QueryBuilderTests.cs | 77 +++++++++++++++++++ .../project.json | 17 ++++ 7 files changed, 279 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj create mode 100644 src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/project.json create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 46b9267189..cdea46535d 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21806.0 +VisualStudioVersion = 14.0.21916.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -29,6 +29,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Exten EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.kproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.kproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.kproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -149,6 +153,26 @@ Global {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|Mixed Platforms.Build.0 = Release|Any CPU {AE25EF21-7F91-4B86-B73E-AF746821D339}.Release|x86.ActiveCfg = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Debug|x86.ActiveCfg = Debug|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Any CPU.Build.0 = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406}.Release|x86.ActiveCfg = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Debug|x86.ActiveCfg = Debug|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Any CPU.Build.0 = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -165,5 +189,7 @@ Global {16219571-3268-4D12-8689-12B7163DBA13} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {CCC4363E-81E2-4058-94DD-00494E9E992A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {A2FB7838-0031-4FAD-BA3E-83C30B3AF406} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj new file mode 100644 index 0000000000..0e877575d0 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + a2fb7838-0031-4fad-ba3e-83c30b3af406 + Library + Microsoft.AspNet.WebUtilities + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs new file mode 100644 index 0000000000..a719db536d --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Text; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.WebUtilities +{ + // The IEnumerable interface is required for the collection initialization syntax: new QueryBuilder() { { "key", "value" } }; + public class QueryBuilder : IEnumerable> + { + private IList> _params; + + public QueryBuilder() + { + _params = new List>(); + } + + public QueryBuilder(IEnumerable> parameters) + { + _params = new List>(parameters); + } + + public void Add(string key, string value) + { + _params.Add(new KeyValuePair(key, value)); + } + + public override string ToString() + { + var builder = new StringBuilder(); + bool first = true; + for (int i = 0; i < _params.Count; i++) + { + var pair = _params[i]; + builder.Append(first ? "?" : "&"); + first = false; + builder.Append(Uri.EscapeDataString(pair.Key)); + builder.Append("="); + builder.Append(Uri.EscapeDataString(pair.Value)); + } + + return builder.ToString(); + } + + public QueryString ToQueryString() + { + return new QueryString(ToString()); + } + + public override int GetHashCode() + { + return ToQueryString().GetHashCode(); + } + + public override bool Equals(object obj) + { + return ToQueryString().Equals(obj); + } + + public IEnumerator> GetEnumerator() + { + return _params.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _params.GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json new file mode 100644 index 0000000000..2c127c9880 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -0,0 +1,14 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + "frameworks": { + "net45": {}, + "k10": { + "dependencies": { + "System.Runtime": "4.0.20.0" + } + } + } +} diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj new file mode 100644 index 0000000000..a909df627d --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -0,0 +1,35 @@ + + + + 12.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + Debug + AnyCPU + + + + 93c10e50-bcbb-4d8e-9492-d46e1396225b + Library + Microsoft.AspNet.WebUtilities.Tests + + + ConsoleDebugger + + + WebDebugger + + + + + 2.0 + + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs new file mode 100644 index 0000000000..2de60d8a46 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs @@ -0,0 +1,77 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class QueryBuilderTests + { + [Fact] + public void EmptyQuery_NoQuestionMark() + { + var builder = new QueryBuilder(); + Assert.Equal(string.Empty, builder.ToString()); + } + + [Fact] + public void AddSimple_NoEncoding() + { + var builder = new QueryBuilder(); + builder.Add("key", "value"); + Assert.Equal("?key=value", builder.ToString()); + } + + [Fact] + public void AddSpace_PercentEncoded() + { + var builder = new QueryBuilder(); + builder.Add("key", "value 1"); + Assert.Equal("?key=value%201", builder.ToString()); + } + + [Fact] + public void AddReservedCharacters_PercentEncoded() + { + var builder = new QueryBuilder(); + builder.Add("key&", "value#"); + Assert.Equal("?key%26=value%23", builder.ToString()); + } + + [Fact] + public void AddMultipleValues_AddedInOrder() + { + var builder = new QueryBuilder(); + builder.Add("key1", "value1"); + builder.Add("key2", "value2"); + builder.Add("key3", "value3"); + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); + } + + [Fact] + public void AddMultipleValuesViaConstructor_AddedInOrder() + { + var builder = new QueryBuilder(new[] + { + new KeyValuePair("key1", "value1"), + new KeyValuePair("key2", "value2"), + new KeyValuePair("key3", "value3"), + }); + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); + } + + [Fact] + public void AddMultipleValuesViaInitializer_AddedInOrder() + { + var builder = new QueryBuilder() + { + { "key1", "value1" }, + { "key2", "value2" }, + { "key3", "value3" }, + }; + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json new file mode 100644 index 0000000000..b7217ebcea --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -0,0 +1,17 @@ +{ + "dependencies": { + "Microsoft.AspNet.Http": "", + "Microsoft.AspNet.WebUtilities": "", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "net45": { + "dependencies": { + "System.Runtime": "" + } + } + } +} From 7be9cefc4c7671caba7d8fe538ba6a0ad308fdad Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 24 Jul 2014 16:24:44 -0700 Subject: [PATCH 0250/1838] QueryBuilder Add overload for IEnumerable. --- .../QueryBuilder.cs | 14 ++++++++++--- .../QueryBuilderTests.cs | 21 +++++++++++++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs index a719db536d..28cdfa85fe 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs @@ -14,16 +14,24 @@ namespace Microsoft.AspNet.WebUtilities { private IList> _params; - public QueryBuilder() - { + public QueryBuilder() + { _params = new List>(); - } + } public QueryBuilder(IEnumerable> parameters) { _params = new List>(parameters); } + public void Add(string key, IEnumerable values) + { + foreach (var value in values) + { + _params.Add(new KeyValuePair(key, value)); + } + } + public void Add(string key, string value) { _params.Add(new KeyValuePair(key, value)); diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs index 2de60d8a46..76d3ac977d 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs @@ -50,6 +50,14 @@ namespace Microsoft.AspNet.WebUtilities Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); } + [Fact] + public void AddIEnumerableValues_AddedInOrder() + { + var builder = new QueryBuilder(); + builder.Add("key", new[] { "value1", "value2", "value3" }); + Assert.Equal("?key=value1&key=value2&key=value3", builder.ToString()); + } + [Fact] public void AddMultipleValuesViaConstructor_AddedInOrder() { @@ -73,5 +81,18 @@ namespace Microsoft.AspNet.WebUtilities }; Assert.Equal("?key1=value1&key2=value2&key3=value3", builder.ToString()); } + + [Fact] + public void CopyViaConstructor_AddedInOrder() + { + var builder = new QueryBuilder() + { + { "key1", "value1" }, + { "key2", "value2" }, + { "key3", "value3" }, + }; + var builder1 = new QueryBuilder(builder); + Assert.Equal("?key1=value1&key2=value2&key3=value3", builder1.ToString()); + } } } \ No newline at end of file From ed38d28db44460d172376f003797eccd7df14f72 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 31 Jul 2014 11:37:27 -0700 Subject: [PATCH 0251/1838] #65 - Port more TestHost funcationality. --- Hosting.sln | 7 +- .../ClientHandler.cs | 207 ++++++++++ .../Microsoft.AspNet.TestHost.kproj | 9 +- .../RequestBuilder.cs | 111 +++++ .../RequestFeature.cs | 41 ++ .../RequestInformation.cs | 51 --- .../ResponseFeature.cs | 48 +++ .../ResponseInformation.cs | 50 --- .../ResponseStream.cs | 380 ++++++++++++++++++ src/Microsoft.AspNet.TestHost/TestClient.cs | 22 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 89 ++-- src/Microsoft.AspNet.TestHost/project.json | 3 +- .../ClientHandlerTests.cs | 231 +++++++++++ .../Microsoft.AspNet.TestHost.Tests.kproj | 6 +- .../RequestBuilderTests.cs | 35 ++ .../ResponseFeatureTests.cs | 20 + .../ResponseInformationTests.cs | 34 -- .../TestApplicationEnvironment.cs | 20 +- .../TestClientTests.cs | 20 +- .../TestServerTests.cs | 107 +++-- 20 files changed, 1223 insertions(+), 268 deletions(-) create mode 100644 src/Microsoft.AspNet.TestHost/ClientHandler.cs create mode 100644 src/Microsoft.AspNet.TestHost/RequestBuilder.cs create mode 100644 src/Microsoft.AspNet.TestHost/RequestFeature.cs delete mode 100644 src/Microsoft.AspNet.TestHost/RequestInformation.cs create mode 100644 src/Microsoft.AspNet.TestHost/ResponseFeature.cs delete mode 100644 src/Microsoft.AspNet.TestHost/ResponseInformation.cs create mode 100644 src/Microsoft.AspNet.TestHost/ResponseStream.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs create mode 100644 test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs delete mode 100644 test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs diff --git a/Hosting.sln b/Hosting.sln index a1be8041c3..52888aa65a 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21730.1 +VisualStudioVersion = 14.0.21916.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -17,6 +17,11 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Te EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.RequestContainer", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.kproj", "{374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A66E3673-3976-4152-B902-2D0EC1428EA2}" + ProjectSection(SolutionItems) = preProject + global.json = global.json + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs new file mode 100644 index 0000000000..d92eaffdda --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -0,0 +1,207 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.IO; +using System.Linq; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; + +namespace Microsoft.AspNet.TestHost +{ + /// + /// This adapts HttpRequestMessages to ASP.NET requests, dispatches them through the pipeline, and returns the + /// associated HttpResponseMessage. + /// + public class ClientHandler : HttpMessageHandler + { + private readonly Func _next; + + /// + /// Create a new handler. + /// + /// The pipeline entry point. + public ClientHandler(Func next) + { + if (next == null) + { + throw new ArgumentNullException("next"); + } + + _next = next; + } + + /// + /// This adapts HttpRequestMessages to ASP.NET requests, dispatches them through the pipeline, and returns the + /// associated HttpResponseMessage. + /// + /// + /// + /// + protected override async Task SendAsync( + HttpRequestMessage request, + CancellationToken cancellationToken) + { + if (request == null) + { + throw new ArgumentNullException("request"); + } + + var state = new RequestState(request, cancellationToken); + HttpContent requestContent = request.Content ?? new StreamContent(Stream.Null); + Stream body = await requestContent.ReadAsStreamAsync(); + if (body.CanSeek) + { + // This body may have been consumed before, rewind it. + body.Seek(0, SeekOrigin.Begin); + } + state.HttpContext.Request.Body = body; + CancellationTokenRegistration registration = cancellationToken.Register(state.Abort); + + // Async offload, don't let the test code block the caller. + Task offload = Task.Factory.StartNew(async () => + { + try + { + await _next(state.FeatureCollection); + state.CompleteResponse(); + } + catch (Exception ex) + { + state.Abort(ex); + } + finally + { + registration.Dispose(); + state.Dispose(); + } + }); + + return await state.ResponseTask; + } + + private class RequestState : IDisposable + { + private readonly HttpRequestMessage _request; + private TaskCompletionSource _responseTcs; + private ResponseStream _responseStream; + private ResponseFeature _responseFeature; + + internal RequestState(HttpRequestMessage request, CancellationToken cancellationToken) + { + _request = request; + _responseTcs = new TaskCompletionSource(); + + if (request.RequestUri.IsDefaultPort) + { + request.Headers.Host = request.RequestUri.Host; + } + else + { + request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); + } + + FeatureCollection = new FeatureCollection(); + HttpContext = new DefaultHttpContext(FeatureCollection); + HttpContext.SetFeature(new RequestFeature()); + _responseFeature = new ResponseFeature(); + HttpContext.SetFeature(_responseFeature); + var serverRequest = HttpContext.Request; + serverRequest.Protocol = "HTTP/" + request.Version.ToString(2); + serverRequest.Scheme = request.RequestUri.Scheme; + serverRequest.Method = request.Method.ToString(); + serverRequest.Path = PathString.FromUriComponent(request.RequestUri); + serverRequest.PathBase = PathString.Empty; + serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri); + // TODO: serverRequest.CallCancelled = cancellationToken; + + foreach (var header in request.Headers) + { + serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); + } + HttpContent requestContent = request.Content; + if (requestContent != null) + { + foreach (var header in request.Content.Headers) + { + serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); + } + } + + _responseStream = new ResponseStream(CompleteResponse); + HttpContext.Response.Body = _responseStream; + HttpContext.Response.StatusCode = 200; + } + + public HttpContext HttpContext { get; private set; } + + public IFeatureCollection FeatureCollection { get; private set; } + + public Task ResponseTask + { + get { return _responseTcs.Task; } + } + + internal void CompleteResponse() + { + if (!_responseTcs.Task.IsCompleted) + { + HttpResponseMessage response = GenerateResponse(); + // Dispatch, as TrySetResult will synchronously execute the waiters callback and block our Write. + Task.Factory.StartNew(() => _responseTcs.TrySetResult(response)); + } + } + + [SuppressMessage("Microsoft.Reliability", "CA2000:DisposeObjectsBeforeLosingScope", + Justification = "HttpResposneMessage must be returned to the caller.")] + internal HttpResponseMessage GenerateResponse() + { + _responseFeature.FireOnSendingHeaders(); + + var response = new HttpResponseMessage(); + response.StatusCode = (HttpStatusCode)HttpContext.Response.StatusCode; + response.ReasonPhrase = HttpContext.GetFeature().ReasonPhrase; + response.RequestMessage = _request; + // response.Version = owinResponse.Protocol; + + response.Content = new StreamContent(_responseStream); + + foreach (var header in HttpContext.Response.Headers) + { + if (!response.Headers.TryAddWithoutValidation(header.Key, header.Value)) + { + bool success = response.Content.Headers.TryAddWithoutValidation(header.Key, header.Value); + Contract.Assert(success, "Bad header"); + } + } + return response; + } + + internal void Abort() + { + Abort(new OperationCanceledException()); + } + + internal void Abort(Exception exception) + { + _responseStream.Abort(exception); + _responseTcs.TrySetException(exception); + } + + public void Dispose() + { + _responseStream.Dispose(); + // Do not dispose the request, that will be disposed by the caller. + } + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index 882610a036..4bba9328cc 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -20,11 +20,14 @@ + - - + + + + - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs new file mode 100644 index 0000000000..57422b4b33 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs @@ -0,0 +1,111 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.IO; +using System.Net.Http; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.TestHost +{ + /// + /// Used to construct a HttpRequestMessage object. + /// + [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", + Justification = "HttpRequestMessage is disposed by HttpClient in SendAsync")] + public class RequestBuilder + { + private readonly TestServer _server; + private readonly HttpRequestMessage _req; + + /// + /// Construct a new HttpRequestMessage with the given path. + /// + /// + /// + [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings", Justification = "Not a full URI")] + public RequestBuilder(TestServer server, string path) + { + if (server == null) + { + throw new ArgumentNullException("server"); + } + + _server = server; + _req = new HttpRequestMessage(HttpMethod.Get, path); + } + + /// + /// Configure any HttpRequestMessage properties. + /// + /// + /// + public RequestBuilder And(Action configure) + { + if (configure == null) + { + throw new ArgumentNullException("configure"); + } + + configure(_req); + return this; + } + + /// + /// Add the given header and value to the request or request content. + /// + /// + /// + /// + public RequestBuilder AddHeader(string name, string value) + { + if (!_req.Headers.TryAddWithoutValidation(name, value)) + { + if (_req.Content == null) + { + _req.Content = new StreamContent(Stream.Null); + } + if (!_req.Content.Headers.TryAddWithoutValidation(name, value)) + { + // TODO: throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, Resources.InvalidHeaderName, name), "name"); + throw new ArgumentException("Invalid header name: " + name, "name"); + } + } + return this; + } + + /// + /// Set the request method and start processing the request. + /// + /// + /// + public Task SendAsync(string method) + { + _req.Method = new HttpMethod(method); + return _server.CreateClient().SendAsync(_req); + } + + /// + /// Set the request method to GET and start processing the request. + /// + /// + [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "GET is an HTTP verb.")] + public Task GetAsync() + { + _req.Method = HttpMethod.Get; + return _server.CreateClient().SendAsync(_req); + } + + /// + /// Set the request method to POST and start processing the request. + /// + /// + public Task PostAsync() + { + _req.Method = HttpMethod.Post; + return _server.CreateClient().SendAsync(_req); + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs new file mode 100644 index 0000000000..2ea5ae5127 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -0,0 +1,41 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.TestHost +{ + internal class RequestFeature : IHttpRequestFeature + { + public RequestFeature() + { + Body = Stream.Null; + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Method = "GET"; + Path = ""; + PathBase = ""; + Protocol = "HTTP/1.1"; + QueryString = ""; + Scheme = "http"; + } + + public Stream Body { get; set; } + + public IDictionary Headers { get; set; } + + public string Method { get; set; } + + public string Path { get; set; } + + public string PathBase { get; set; } + + public string Protocol { get; set; } + + public string QueryString { get; set; } + + public string Scheme { get; set; } + } +} diff --git a/src/Microsoft.AspNet.TestHost/RequestInformation.cs b/src/Microsoft.AspNet.TestHost/RequestInformation.cs deleted file mode 100644 index d5815ee993..0000000000 --- a/src/Microsoft.AspNet.TestHost/RequestInformation.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. - -using System; -using System.Collections.Generic; -using System.IO; -using Microsoft.AspNet.HttpFeature; - -namespace Microsoft.AspNet.TestHost -{ - internal class RequestInformation : IHttpRequestFeature - { - public RequestInformation() - { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); - PathBase = ""; - Body = Stream.Null; - Protocol = "HTTP/1.1"; - } - - public Stream Body { get; set; } - - public IDictionary Headers { get; set; } - - public string Method { get; set; } - - public string Path { get; set; } - - public string PathBase { get; set; } - - public string Protocol { get; set; } - - public string QueryString { get; set; } - - public string Scheme { get; set; } - } -} diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs new file mode 100644 index 0000000000..5b7d230a13 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.TestHost +{ + internal class ResponseFeature : IHttpResponseFeature + { + private Action _sendingHeaders = () => { }; + + public ResponseFeature() + { + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Body = new MemoryStream(); + + // 200 is the default status code all the way down to the host, so we set it + // here to be consistent with the rest of the hosts when writing tests. + StatusCode = 200; + } + + public int StatusCode { get; set; } + + public string ReasonPhrase { get; set; } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + public void OnSendingHeaders(Action callback, object state) + { + var prior = _sendingHeaders; + _sendingHeaders = () => + { + callback(state); + prior(); + }; + } + + public void FireOnSendingHeaders() + { + _sendingHeaders(); + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs b/src/Microsoft.AspNet.TestHost/ResponseInformation.cs deleted file mode 100644 index 7cccbafc53..0000000000 --- a/src/Microsoft.AspNet.TestHost/ResponseInformation.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. - -using System; -using System.Collections.Generic; -using System.IO; -using Microsoft.AspNet.HttpFeature; - -namespace Microsoft.AspNet.TestHost -{ - internal class ResponseInformation : IHttpResponseFeature - { - public ResponseInformation() - { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); - Body = new MemoryStream(); - - // 200 is the default status code all the way down to the host, so we set it - // here to be consistent with the rest of the hosts when writing tests. - StatusCode = 200; - } - - public int StatusCode { get; set; } - - public string ReasonPhrase { get; set; } - - public IDictionary Headers { get; set; } - - public Stream Body { get; set; } - - public void OnSendingHeaders(Action callback, object state) - { - // TODO: Figure out how to implement this thing. - } - } -} diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs new file mode 100644 index 0000000000..cae4eba46f --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -0,0 +1,380 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Concurrent; +using System.Diagnostics.CodeAnalysis; +using System.Diagnostics.Contracts; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.TestHost +{ + // This steam accepts writes from the server/app, buffers them internally, and returns the data via Reads + // when requested by the client. + internal class ResponseStream : Stream + { + private bool _disposed; + private bool _aborted; + private Exception _abortException; + private ConcurrentQueue _bufferedData; + private ArraySegment _topBuffer; + private SemaphoreSlim _readLock; + private SemaphoreSlim _writeLock; + private TaskCompletionSource _readWaitingForData; + private object _signalReadLock; + + private Action _onFirstWrite; + private bool _firstWrite; + + internal ResponseStream(Action onFirstWrite) + { + if (onFirstWrite == null) + { + throw new ArgumentNullException("onFirstWrite"); + } + _onFirstWrite = onFirstWrite; + _firstWrite = true; + + _readLock = new SemaphoreSlim(1, 1); + _writeLock = new SemaphoreSlim(1, 1); + _bufferedData = new ConcurrentQueue(); + _readWaitingForData = new TaskCompletionSource(); + _signalReadLock = new object(); + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return false; } + } + + public override bool CanWrite + { + get { return true; } + } + + #region NotSupported + + public override long Length + { + get { throw new NotSupportedException(); } + } + + public override long Position + { + get { throw new NotSupportedException(); } + set { throw new NotSupportedException(); } + } + + public override long Seek(long offset, SeekOrigin origin) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + #endregion NotSupported + + public override void Flush() + { + CheckDisposed(); + + _writeLock.Wait(); + try + { + FirstWrite(); + } + finally + { + _writeLock.Release(); + } + + // TODO: Wait for data to drain? + } + + public override Task FlushAsync(CancellationToken cancellationToken) + { + if (cancellationToken.IsCancellationRequested) + { + TaskCompletionSource tcs = new TaskCompletionSource(); + tcs.TrySetCanceled(); + return tcs.Task; + } + + Flush(); + + // TODO: Wait for data to drain? + + return Task.FromResult(null); + } + + public override int Read(byte[] buffer, int offset, int count) + { + VerifyBuffer(buffer, offset, count, allowEmpty: false); + _readLock.Wait(); + try + { + int totalRead = 0; + do + { + // Don't drain buffered data when signaling an abort. + CheckAborted(); + if (_topBuffer.Count <= 0) + { + byte[] topBuffer = null; + while (!_bufferedData.TryDequeue(out topBuffer)) + { + if (_disposed) + { + CheckAborted(); + // Graceful close + return totalRead; + } + WaitForDataAsync().Wait(); + } + _topBuffer = new ArraySegment(topBuffer); + } + int actualCount = Math.Min(count, _topBuffer.Count); + Buffer.BlockCopy(_topBuffer.Array, _topBuffer.Offset, buffer, offset, actualCount); + _topBuffer = new ArraySegment(_topBuffer.Array, + _topBuffer.Offset + actualCount, + _topBuffer.Count - actualCount); + totalRead += actualCount; + offset += actualCount; + count -= actualCount; + } + while (count > 0 && (_topBuffer.Count > 0 || _bufferedData.Count > 0)); + // Keep reading while there is more data available and we have more space to put it in. + return totalRead; + } + finally + { + _readLock.Release(); + } + } +#if NET45 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + // TODO: This option doesn't preserve the state object. + // return ReadAsync(buffer, offset, count); + return base.BeginRead(buffer, offset, count, callback, state); + } + + public override int EndRead(IAsyncResult asyncResult) + { + // return ((Task)asyncResult).Result; + return base.EndRead(asyncResult); + } +#endif + public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + VerifyBuffer(buffer, offset, count, allowEmpty: false); + CancellationTokenRegistration registration = cancellationToken.Register(Abort); + await _readLock.WaitAsync(cancellationToken); + try + { + int totalRead = 0; + do + { + // Don't drained buffered data on abort. + CheckAborted(); + if (_topBuffer.Count <= 0) + { + byte[] topBuffer = null; + while (!_bufferedData.TryDequeue(out topBuffer)) + { + if (_disposed) + { + CheckAborted(); + // Graceful close + return totalRead; + } + await WaitForDataAsync(); + } + _topBuffer = new ArraySegment(topBuffer); + } + int actualCount = Math.Min(count, _topBuffer.Count); + Buffer.BlockCopy(_topBuffer.Array, _topBuffer.Offset, buffer, offset, actualCount); + _topBuffer = new ArraySegment(_topBuffer.Array, + _topBuffer.Offset + actualCount, + _topBuffer.Count - actualCount); + totalRead += actualCount; + offset += actualCount; + count -= actualCount; + } + while (count > 0 && (_topBuffer.Count > 0 || _bufferedData.Count > 0)); + // Keep reading while there is more data available and we have more space to put it in. + return totalRead; + } + finally + { + registration.Dispose(); + _readLock.Release(); + } + } + + // Called under write-lock. + private void FirstWrite() + { + if (_firstWrite) + { + _firstWrite = false; + _onFirstWrite(); + } + } + + // Write with count 0 will still trigger OnFirstWrite + public override void Write(byte[] buffer, int offset, int count) + { + VerifyBuffer(buffer, offset, count, allowEmpty: true); + CheckDisposed(); + + _writeLock.Wait(); + try + { + FirstWrite(); + if (count == 0) + { + return; + } + // Copies are necessary because we don't know what the caller is going to do with the buffer afterwards. + byte[] internalBuffer = new byte[count]; + Buffer.BlockCopy(buffer, offset, internalBuffer, 0, count); + _bufferedData.Enqueue(internalBuffer); + + SignalDataAvailable(); + } + finally + { + _writeLock.Release(); + } + } +#if NET45 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + Write(buffer, offset, count); + TaskCompletionSource tcs = new TaskCompletionSource(state); + tcs.TrySetResult(null); + IAsyncResult result = tcs.Task; + if (callback != null) + { + callback(result); + } + return result; + } + + public override void EndWrite(IAsyncResult asyncResult) + { + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + VerifyBuffer(buffer, offset, count, allowEmpty: true); + if (cancellationToken.IsCancellationRequested) + { + TaskCompletionSource tcs = new TaskCompletionSource(); + tcs.TrySetCanceled(); + return tcs.Task; + } + + Write(buffer, offset, count); + return Task.FromResult(null); + } + + private static void VerifyBuffer(byte[] buffer, int offset, int count, bool allowEmpty) + { + if (buffer == null) + { + throw new ArgumentNullException("buffer"); + } + if (offset < 0 || offset > buffer.Length) + { + throw new ArgumentOutOfRangeException("offset", offset, string.Empty); + } + if (count < 0 || count > buffer.Length - offset + || (!allowEmpty && count == 0)) + { + throw new ArgumentOutOfRangeException("count", count, string.Empty); + } + } + + private void SignalDataAvailable() + { + // Dispatch, as TrySetResult will synchronously execute the waiters callback and block our Write. + Task.Factory.StartNew(() => _readWaitingForData.TrySetResult(null)); + } + + private Task WaitForDataAsync() + { + // Prevent race with Dispose + lock (_signalReadLock) + { + _readWaitingForData = new TaskCompletionSource(); + + if (!_bufferedData.IsEmpty || _disposed) + { + // Race, data could have arrived before we created the TCS. + _readWaitingForData.TrySetResult(null); + } + + return _readWaitingForData.Task; + } + } + + internal void Abort() + { + Abort(new OperationCanceledException()); + } + + internal void Abort(Exception innerException) + { + Contract.Requires(innerException != null); + _aborted = true; + _abortException = innerException; + Dispose(); + } + + private void CheckAborted() + { + if (_aborted) + { + throw new IOException(string.Empty, _abortException); + } + } + + [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "_writeLock", Justification = "ODEs from the locks would mask IOEs from abort.")] + [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "_readLock", Justification = "Data can still be read unless we get aborted.")] + protected override void Dispose(bool disposing) + { + if (disposing) + { + // Prevent race with WaitForDataAsync + lock (_signalReadLock) + { + // Throw for further writes, but not reads. Allow reads to drain the buffered data and then return 0 for further reads. + _disposed = true; + _readWaitingForData.TrySetResult(null); + } + } + + base.Dispose(disposing); + } + + private void CheckDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(GetType().FullName); + } + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/TestClient.cs b/src/Microsoft.AspNet.TestHost/TestClient.cs index 7f9d7e8219..57886e56f9 100644 --- a/src/Microsoft.AspNet.TestHost/TestClient.cs +++ b/src/Microsoft.AspNet.TestHost/TestClient.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; @@ -53,7 +39,7 @@ namespace Microsoft.AspNet.TestHost Action onSendingRequest = null) { var request = CreateRequest(method, uri, headers, body); - var response = new ResponseInformation(); + var response = new ResponseFeature(); var features = new FeatureCollection(); features.Add(typeof(IHttpRequestFeature), request); @@ -76,7 +62,7 @@ namespace Microsoft.AspNet.TestHost IDictionary headers, Stream body) { - var request = new RequestInformation(); + var request = new RequestFeature(); request.Method = method; request.Scheme = uri.Scheme; request.Path = PathString.FromUriComponent(uri).Value; diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 48f1679f05..88f25d083f 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -1,31 +1,17 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; +using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; +using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.TestHost { @@ -35,6 +21,8 @@ namespace Microsoft.AspNet.TestHost private static readonly ServerInformation ServerInfo = new ServerInformation(); private Func _appDelegate; private TestClient _handler; + private IDisposable _appInstance; + private bool _disposed = false; public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { @@ -54,16 +42,26 @@ namespace Microsoft.AspNet.TestHost }; var engine = serviceProvider.GetService(); - var disposable = engine.Start(hostContext); + _appInstance = engine.Start(hostContext); } - //public static TestServer Create(IServiceProvider provider) - //{ - // var startupLoader = new StartupLoader(provider, new NullStartupLoader()); - // var name = typeof(TStartup).AssemblyQualifiedName; - // var diagnosticMessages = new List(); - // return Create(provider, startupLoader.LoadStartup(name, "Test", diagnosticMessages)); - //} + public TestClient Handler + { + get + { + if (_handler == null) + { + _handler = new TestClient(Invoke); + } + + return _handler; + } + } + + public static TestServer Create(Action app) + { + return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app); + } public static TestServer Create(IServiceProvider provider, Action app) { @@ -77,17 +75,24 @@ namespace Microsoft.AspNet.TestHost return new TestServer(config, serviceProvider, app); } - public TestClient Handler + public HttpMessageHandler CreateHandler() { - get - { - if (_handler == null) - { - _handler = new TestClient(_appDelegate); - } + return new ClientHandler(Invoke); + } - return _handler; - } + public HttpClient CreateClient() + { + return new HttpClient(CreateHandler()) { BaseAddress = new Uri("http://localhost/") }; + } + + /// + /// Begins constructing a request message for submission. + /// + /// + /// to use in constructing additional request details. + public RequestBuilder CreateRequest(string path) + { + return new RequestBuilder(this, path); } public IServerInformation Initialize(IConfiguration configuration) @@ -107,11 +112,19 @@ namespace Microsoft.AspNet.TestHost return this; } + public Task Invoke(object env) + { + if (_disposed) + { + throw new ObjectDisposedException(GetType().FullName); + } + return _appDelegate(env); + } + public void Dispose() { - // IServerFactory.Start needs to return an IDisposable. Typically this IDisposable instance is used to - // clear any server resources when tearing down the host. In our case we don't have anything to clear - // so we just implement IDisposable and do nothing. + _disposed = true; + _appInstance.Dispose(); } private class ServerInformation : IServerInformation diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 1592b1a2c3..0effba0b63 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,7 +1,8 @@ { "version" : "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Hosting": "" + "Microsoft.AspNet.Hosting": "", + "System.Net.Http": "4.0.0.0" }, "frameworks": { "net45": { }, diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs new file mode 100644 index 0000000000..623a0bc395 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -0,0 +1,231 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore; +using Xunit; + +namespace Microsoft.AspNet.TestHost +{ + public class ClientHandlerTests + { + [Fact] + public Task ExpectedKeysAreAvailable() + { + var handler = new ClientHandler(env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + + // TODO: Assert.True(context.RequestAborted.CanBeCanceled); + Assert.Equal("HTTP/1.1", context.Request.Protocol); + Assert.Equal("GET", context.Request.Method); + Assert.Equal("https", context.Request.Scheme); + Assert.Equal(string.Empty, context.Request.PathBase.Value); + Assert.Equal("/A/Path/and/file.txt", context.Request.Path.Value); + Assert.Equal("?and=query", context.Request.QueryString.Value); + Assert.NotNull(context.Request.Body); + Assert.NotNull(context.Request.Headers); + Assert.NotNull(context.Response.Headers); + Assert.NotNull(context.Response.Body); + Assert.Equal(200, context.Response.StatusCode); + Assert.Null(context.GetFeature().ReasonPhrase); + Assert.Equal("example.com", context.Request.Host.Value); + + return Task.FromResult(0); + }); + var httpClient = new HttpClient(handler); + return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query"); + } + + [Fact] + public async Task ResubmitRequestWorks() + { + int requestCount = 1; + var handler = new ClientHandler(env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + int read = context.Request.Body.Read(new byte[100], 0, 100); + Assert.Equal(11, read); + + context.Response.Headers["TestHeader"] = "TestValue:" + requestCount++; + return Task.FromResult(0); + }); + + HttpMessageInvoker invoker = new HttpMessageInvoker(handler); + HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/"); + message.Content = new StringContent("Hello World"); + + HttpResponseMessage response = await invoker.SendAsync(message, CancellationToken.None); + Assert.Equal("TestValue:1", response.Headers.GetValues("TestHeader").First()); + + response = await invoker.SendAsync(message, CancellationToken.None); + Assert.Equal("TestValue:2", response.Headers.GetValues("TestHeader").First()); + } + + [Fact] + public async Task MiddlewareOnlySetsHeaders() + { + var handler = new ClientHandler(env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + + context.Response.Headers["TestHeader"] = "TestValue"; + return Task.FromResult(0); + }); + var httpClient = new HttpClient(handler); + HttpResponseMessage response = await httpClient.GetAsync("https://example.com/"); + Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); + } + + [Fact] + public async Task BlockingMiddlewareShouldNotBlockClient() + { + ManualResetEvent block = new ManualResetEvent(false); + var handler = new ClientHandler(env => + { + block.WaitOne(); + return Task.FromResult(0); + }); + var httpClient = new HttpClient(handler); + Task task = httpClient.GetAsync("https://example.com/"); + Assert.False(task.IsCompleted); + Assert.False(task.Wait(50)); + block.Set(); + HttpResponseMessage response = await task; + } + + [Fact] + public async Task HeadersAvailableBeforeBodyFinished() + { + ManualResetEvent block = new ManualResetEvent(false); + var handler = new ClientHandler(async env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + context.Response.Headers["TestHeader"] = "TestValue"; + await context.Response.WriteAsync("BodyStarted,"); + block.WaitOne(); + await context.Response.WriteAsync("BodyFinished"); + }); + var httpClient = new HttpClient(handler); + HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", + HttpCompletionOption.ResponseHeadersRead); + Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); + block.Set(); + Assert.Equal("BodyStarted,BodyFinished", await response.Content.ReadAsStringAsync()); + } + + [Fact] + public async Task FlushSendsHeaders() + { + ManualResetEvent block = new ManualResetEvent(false); + var handler = new ClientHandler(async env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + context.Response.Headers["TestHeader"] = "TestValue"; + context.Response.Body.Flush(); + block.WaitOne(); + await context.Response.WriteAsync("BodyFinished"); + }); + var httpClient = new HttpClient(handler); + HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", + HttpCompletionOption.ResponseHeadersRead); + Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); + block.Set(); + Assert.Equal("BodyFinished", await response.Content.ReadAsStringAsync()); + } + + [Fact] + public async Task ClientDisposalCloses() + { + ManualResetEvent block = new ManualResetEvent(false); + var handler = new ClientHandler(env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + context.Response.Headers["TestHeader"] = "TestValue"; + context.Response.Body.Flush(); + block.WaitOne(); + return Task.FromResult(0); + }); + var httpClient = new HttpClient(handler); + HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", + HttpCompletionOption.ResponseHeadersRead); + Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); + Stream responseStream = await response.Content.ReadAsStreamAsync(); + Task readTask = responseStream.ReadAsync(new byte[100], 0, 100); + Assert.False(readTask.IsCompleted); + responseStream.Dispose(); + Thread.Sleep(50); + Assert.True(readTask.IsCompleted); + Assert.Equal(0, readTask.Result); + block.Set(); + } + + [Fact] + public async Task ClientCancellationAborts() + { + ManualResetEvent block = new ManualResetEvent(false); + var handler = new ClientHandler(env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + context.Response.Headers["TestHeader"] = "TestValue"; + context.Response.Body.Flush(); + block.WaitOne(); + return Task.FromResult(0); + }); + var httpClient = new HttpClient(handler); + HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", + HttpCompletionOption.ResponseHeadersRead); + Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); + Stream responseStream = await response.Content.ReadAsStreamAsync(); + CancellationTokenSource cts = new CancellationTokenSource(); + Task readTask = responseStream.ReadAsync(new byte[100], 0, 100, cts.Token); + Assert.False(readTask.IsCompleted); + cts.Cancel(); + Thread.Sleep(50); + Assert.True(readTask.IsCompleted); + Assert.True(readTask.IsFaulted); + block.Set(); + } + + [Fact] + public Task ExceptionBeforeFirstWriteIsReported() + { + var handler = new ClientHandler(env => + { + throw new InvalidOperationException("Test Exception"); + }); + var httpClient = new HttpClient(handler); + return Assert.ThrowsAsync(() => httpClient.GetAsync("https://example.com/", + HttpCompletionOption.ResponseHeadersRead)); + } + + [Fact] + public async Task ExceptionAfterFirstWriteIsReported() + { + ManualResetEvent block = new ManualResetEvent(false); + var handler = new ClientHandler(async env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + context.Response.Headers["TestHeader"] = "TestValue"; + await context.Response.WriteAsync("BodyStarted"); + block.WaitOne(); + throw new InvalidOperationException("Test Exception"); + }); + var httpClient = new HttpClient(handler); + HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", + HttpCompletionOption.ResponseHeadersRead); + Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); + block.Set(); + var ex = await Assert.ThrowsAsync(() => response.Content.ReadAsStringAsync()); + Assert.IsType(ex.GetBaseException()); + } + } +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 0ce16dcb3d..7ec4a03d46 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -21,11 +21,13 @@ + - + + - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs new file mode 100644 index 0000000000..0f637c7d24 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNet.TestHost +{ + public class RequestBuilderTests + { + [Fact] + public void AddRequestHeader() + { + TestServer server = TestServer.Create(app => { }); + server.CreateRequest("/") + .AddHeader("Host", "MyHost:90") + .And(request => + { + Assert.Equal("MyHost:90", request.Headers.Host.ToString()); + }); + } + + [Fact] + public void AddContentHeaders() + { + TestServer server = TestServer.Create(app => { }); + server.CreateRequest("/") + .AddHeader("Content-Type", "Test/Value") + .And(request => + { + Assert.NotNull(request.Content); + Assert.Equal("Test/Value", request.Content.Headers.ContentType.ToString()); + }); + } + } +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs new file mode 100644 index 0000000000..ebf601cb82 --- /dev/null +++ b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNet.TestHost +{ + public class ResponseFeatureTests + { + [Fact] + public void StatusCode_DefaultsTo200() + { + // Arrange & Act + var responseInformation = new ResponseFeature(); + + // Assert + Assert.Equal(200, responseInformation.StatusCode); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs deleted file mode 100644 index 1717152773..0000000000 --- a/test/Microsoft.AspNet.TestHost.Tests/ResponseInformationTests.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. - -using Xunit; - -namespace Microsoft.AspNet.TestHost.Tests -{ - public class ResponseInformationTests - { - [Fact] - public void StatusCode_DefaultsTo200() - { - // Arrange & Act - var responseInformation = new ResponseInformation(); - - // Assert - Assert.Equal(200, responseInformation.StatusCode); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index 800570f20a..417a903d0d 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -1,25 +1,11 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Runtime.Versioning; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.TestHost.Tests +namespace Microsoft.AspNet.TestHost { public class TestApplicationEnvironment : IApplicationEnvironment { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 48d416b266..96fbfc04b0 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; @@ -26,7 +12,7 @@ using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; using Xunit; -namespace Microsoft.AspNet.TestHost.Tests +namespace Microsoft.AspNet.TestHost { public class TestClientTests { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 13793b8cea..5f27cc89f1 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -1,22 +1,9 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.IO; +using System.Net; +using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; @@ -25,7 +12,7 @@ using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; using Xunit; -namespace Microsoft.AspNet.TestHost.Tests +namespace Microsoft.AspNet.TestHost { public class TestServerTests { @@ -41,24 +28,6 @@ namespace Microsoft.AspNet.TestHost.Tests Assert.DoesNotThrow(() => TestServer.Create(services, app => { })); } - //[Fact] - //public async Task CreateWithGeneric() - //{ - // // Arrange - // var services = new ServiceCollection() - // .AddSingleton() - // .BuildServiceProvider(); - - // var server = TestServer.Create(services); - // var client = server.Handler; - - // // Act - // var response = await client.GetAsync("http://any"); - - // // Assert - // Assert.Equal("Startup", new StreamReader(response.Body).ReadToEnd()); - //} - [Fact] public void ThrowsIfNoApplicationEnvironmentIsRegisteredWithTheProvider() { @@ -70,6 +39,72 @@ namespace Microsoft.AspNet.TestHost.Tests Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); } + [Fact] + public async Task CreateInvokesApp() + { + TestServer server = TestServer.Create(app => + { + app.Run(context => + { + return context.Response.WriteAsync("CreateInvokesApp"); + }); + }); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("CreateInvokesApp", result); + } + + [Fact] + public async Task DisposeStreamIgnored() + { + TestServer server = TestServer.Create(app => + { + app.Run(async context => + { + await context.Response.WriteAsync("Response"); + context.Response.Body.Dispose(); + }); + }); + + HttpResponseMessage result = await server.CreateClient().GetAsync("/"); + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal("Response", await result.Content.ReadAsStringAsync()); + } + + [Fact] + public async Task DisposedServerThrows() + { + TestServer server = TestServer.Create(app => + { + app.Run(async context => + { + await context.Response.WriteAsync("Response"); + context.Response.Body.Dispose(); + }); + }); + + HttpResponseMessage result = await server.CreateClient().GetAsync("/"); + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + server.Dispose(); + await Assert.ThrowsAsync(() => server.CreateClient().GetAsync("/")); + } + + [Fact] + public void CancelAborts() + { + TestServer server = TestServer.Create(app => + { + app.Run(context => + { + TaskCompletionSource tcs = new TaskCompletionSource(); + tcs.SetCanceled(); + return tcs.Task; + }); + }); + + Assert.Throws(() => { string result = server.CreateClient().GetStringAsync("/path").Result; }); + } + public class Startup { public void Configuration(IBuilder builder) From 9e950fba270d92e790fb56971e29ec535789232e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 4 Aug 2014 12:28:20 -0700 Subject: [PATCH 0252/1838] More var. --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index d92eaffdda..29400083e8 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using System.IO; @@ -57,18 +56,18 @@ namespace Microsoft.AspNet.TestHost } var state = new RequestState(request, cancellationToken); - HttpContent requestContent = request.Content ?? new StreamContent(Stream.Null); - Stream body = await requestContent.ReadAsStreamAsync(); + var requestContent = request.Content ?? new StreamContent(Stream.Null); + var body = await requestContent.ReadAsStreamAsync(); if (body.CanSeek) { // This body may have been consumed before, rewind it. body.Seek(0, SeekOrigin.Begin); } state.HttpContext.Request.Body = body; - CancellationTokenRegistration registration = cancellationToken.Register(state.Abort); + var registration = cancellationToken.Register(state.Abort); // Async offload, don't let the test code block the caller. - Task offload = Task.Factory.StartNew(async () => + var offload = Task.Factory.StartNew(async () => { try { @@ -128,7 +127,7 @@ namespace Microsoft.AspNet.TestHost { serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); } - HttpContent requestContent = request.Content; + var requestContent = request.Content; if (requestContent != null) { foreach (var header in request.Content.Headers) @@ -155,7 +154,7 @@ namespace Microsoft.AspNet.TestHost { if (!_responseTcs.Task.IsCompleted) { - HttpResponseMessage response = GenerateResponse(); + var response = GenerateResponse(); // Dispatch, as TrySetResult will synchronously execute the waiters callback and block our Write. Task.Factory.StartNew(() => _responseTcs.TrySetResult(response)); } From 10cbe6bab3ac88cf20bc179cd1759a5ce6817e55 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 5 Aug 2014 15:49:35 -0700 Subject: [PATCH 0253/1838] Updating release Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 0c3afe95f56a87174591ac1edd5942ee745a8f1e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 5 Aug 2014 15:49:41 -0700 Subject: [PATCH 0254/1838] Updating release Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From cd78e115d4193c380afd366f9060bc1410450610 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 6 Aug 2014 12:30:43 -0700 Subject: [PATCH 0255/1838] Updating dev Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From faf406736d9c96d8a827381e4948f862d5b616be Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 6 Aug 2014 12:30:43 -0700 Subject: [PATCH 0256/1838] Updating dev Nuget.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 22f3d52762143243c9764a742f550016526770fc Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 6 Aug 2014 15:07:53 -0700 Subject: [PATCH 0257/1838] #111 - Change Challenge, SignIn parameter order to support params. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 40 ++++++++++++++----- .../DefaultHttpResponse.cs | 5 ++- 2 files changed, 33 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index a404c17c94..33fbd0a954 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Http public virtual void Challenge(AuthenticationProperties properties) { - Challenge(new string[0], properties); + Challenge(properties, new string[0]); } public virtual void Challenge(string authenticationType) @@ -48,34 +48,54 @@ namespace Microsoft.AspNet.Http Challenge(new[] { authenticationType }); } - public virtual void Challenge(string authenticationType, AuthenticationProperties properties) + public virtual void Challenge(AuthenticationProperties properties, string authenticationType) { - Challenge(new[] { authenticationType }, properties); + Challenge(properties, new[] { authenticationType }); + } + + public void Challenge(params string[] authenticationTypes) + { + Challenge((IEnumerable)authenticationTypes); } public virtual void Challenge(IEnumerable authenticationTypes) { - Challenge(authenticationTypes, properties: null); + Challenge(properties: null, authenticationTypes: authenticationTypes); } - public abstract void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties); + public void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) + { + Challenge(properties, (IEnumerable)authenticationTypes); + } + + public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes); public virtual void SignIn(ClaimsIdentity identity) { - SignIn(identity, properties: null); + SignIn(properties: null, identity: identity); } - public virtual void SignIn(ClaimsIdentity identity, AuthenticationProperties properties) + public virtual void SignIn(AuthenticationProperties properties, ClaimsIdentity identity) { - SignIn(new[] { identity }, properties); + SignIn(properties, new[] { identity }); + } + + public virtual void SignIn(params ClaimsIdentity[] identities) + { + SignIn(properties: null, identities: (IEnumerable)identities); } public virtual void SignIn(IEnumerable identities) { - SignIn(identities, properties: null); + SignIn(properties: null, identities: identities); } - public abstract void SignIn(IEnumerable identities, AuthenticationProperties properties); + public void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) + { + SignIn(properties, (IEnumerable)identities); + } + + public abstract void SignIn(AuthenticationProperties properties, IEnumerable identities); public virtual void SignOut() { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 5af0f9b5fe..3b50493b58 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.PipelineCore Headers.Set(Constants.Headers.Location, location); } - public override void Challenge(IEnumerable authenticationTypes, AuthenticationProperties properties) + public override void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes) { if (authenticationTypes == null) { @@ -147,12 +147,13 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignIn(IEnumerable identities, AuthenticationProperties properties) + public override void SignIn(AuthenticationProperties properties, IEnumerable identities) { if (identities == null) { throw new ArgumentNullException(); } + var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); From 6d45f817f9b3c6978bf76869829b76e2cc17c932 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 7 Aug 2014 15:58:26 -0700 Subject: [PATCH 0258/1838] Make new overloads virtual. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 33fbd0a954..010d159ab8 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Http Challenge(properties, new[] { authenticationType }); } - public void Challenge(params string[] authenticationTypes) + public virtual void Challenge(params string[] authenticationTypes) { Challenge((IEnumerable)authenticationTypes); } @@ -63,7 +63,7 @@ namespace Microsoft.AspNet.Http Challenge(properties: null, authenticationTypes: authenticationTypes); } - public void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) + public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) { Challenge(properties, (IEnumerable)authenticationTypes); } @@ -90,7 +90,7 @@ namespace Microsoft.AspNet.Http SignIn(properties: null, identities: identities); } - public void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) + public virtual void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) { SignIn(properties, (IEnumerable)identities); } From 58468e9509a914368c6ca65bce43d96cdbae3763 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 15 Aug 2014 08:13:03 -0700 Subject: [PATCH 0259/1838] Removed source files from the project --- .../Microsoft.AspNet.Hosting.kproj | 30 ------------------- .../Microsoft.AspNet.RequestContainer.kproj | 9 +----- .../Microsoft.AspNet.TestHost.kproj | 13 -------- .../Microsoft.AspNet.Hosting.Tests.kproj | 11 ------- .../Microsoft.AspNet.TestHost.Tests.kproj | 12 -------- 5 files changed, 1 insertion(+), 74 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index c58f27a50a..c677b192d6 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -16,35 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj index dbadd459f2..e3e12065f7 100644 --- a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj +++ b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj @@ -16,12 +16,5 @@ 2.0 - - - - - - - - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index 4bba9328cc..f68105749b 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -16,18 +16,5 @@ 2.0 - - - - - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 412181c036..d20ea65b15 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -17,16 +17,5 @@ 2.0 - - - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 7ec4a03d46..777a4d4460 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -17,17 +17,5 @@ 2.0 - - - - - - - - - - - - \ No newline at end of file From 274f20a383ffbdb8eef231c8c9665c97ff34f65d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 15 Aug 2014 08:14:48 -0700 Subject: [PATCH 0260/1838] Removed source files from the project --- .../Microsoft.AspNet.FeatureModel.kproj | 10 +---- .../Microsoft.AspNet.Http.Extensions.kproj | 7 ---- .../Microsoft.AspNet.Http.kproj | 32 --------------- .../Microsoft.AspNet.HttpFeature.kproj | 24 ----------- .../Microsoft.AspNet.Owin.kproj | 17 -------- .../Microsoft.AspNet.PipelineCore.kproj | 40 ------------------- .../Microsoft.AspNet.WebUtilities.kproj | 6 --- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 11 +---- ...crosoft.AspNet.Http.Extensions.Tests.kproj | 6 --- .../Microsoft.AspNet.Http.Tests.kproj | 9 ----- .../Microsoft.AspNet.Owin.Tests.kproj | 9 +---- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 12 ------ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 6 --- 13 files changed, 3 insertions(+), 186 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 1938d81a2f..3ee51e0df8 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -16,13 +16,5 @@ 2.0 - - - - - - - - - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index 7ca2e89f22..b8536c1d7e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -25,12 +25,5 @@ 2.0 - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 0e326800f8..1daab236cd 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -16,37 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 5ee49bef8e..f14cfaec40 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -16,29 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 822be75de7..e7f58555b1 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -16,22 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 8caa5a4f61..bd57805ae6 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -16,45 +16,5 @@ 2.0 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index 0e877575d0..9759976da3 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -25,11 +25,5 @@ 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index dddeb54073..0925c220ef 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -17,14 +17,5 @@ 2.0 - - - - - - - - - - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index 6223e75396..9bad335404 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -25,11 +25,5 @@ 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 754a812c15..787a78ff26 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -17,14 +17,5 @@ 2.0 - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index e0adddc849..050b89712d 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -16,12 +16,5 @@ 2.0 - - - - - - - - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index 09ea94747b..d7a5995f6b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -17,17 +17,5 @@ 2.0 - - - - - - - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index a909df627d..cbfdfe1f3d 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -25,11 +25,5 @@ 2.0 - - - - - - \ No newline at end of file From c720364d0e0baed836ba5ecc3335ea4f36a49723 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 15 Aug 2014 15:42:01 -0700 Subject: [PATCH 0261/1838] Registering standard LoggerFactory : ILoggerFactory implementation --- .../HostingServices.cs | 37 +------------------ .../TestApplicationEnvironment.cs | 5 +++ 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 0a0950d559..91e1ef5f31 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -51,8 +51,8 @@ namespace Microsoft.AspNet.Hosting yield return describer.Instance(new ApplicationLifetime()); - // TODO: We expect this to be provide by the runtime eventually. - yield return describer.Instance(new NullLoggerFactory()); + // TODO: Do we expect this to be provide by the runtime eventually? + yield return describer.Singleton(); yield return new ServiceDescriptor { @@ -76,38 +76,5 @@ namespace Microsoft.AspNet.Hosting yield return describer.Instance(DataProtectionProvider.CreateFromDpapi()); } } - - // TODO: Temp workaround until the runtime reliably provides logging. - // If ILoggerFactory is never guaranteed, move this fallback into Microsoft.AspNet.Logging. - private class NullLoggerFactory : ILoggerFactory - { - public ILogger Create(string name) - { - return new NullLogger(); - } - } - - private class NullLogger : ILogger - { - public bool WriteCore(TraceType eventType, int eventId, object state, Exception exception, Func formatter) - { - return false; - } - - public IDisposable BeginScope(object state) - { - return NullScope.Instance; - } - } - - private class NullScope : IDisposable - { - public static NullScope Instance = new NullScope(); - - public void Dispose() - { - // intentionally does nothing - } - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index 417a903d0d..28d5ba7b24 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -36,5 +36,10 @@ namespace Microsoft.AspNet.TestHost { get { return new FrameworkName(".NETFramework", new Version(4, 5)); } } + + public string Configuration + { + get { return "Test"; } + } } } From 70972fb7a19ec9728b97a98cb4a7ac36fa0b0aae Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Fri, 15 Aug 2014 16:08:47 -0700 Subject: [PATCH 0262/1838] Rebase cleanup --- .../TestApplicationEnvironment.cs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index 28d5ba7b24..a81d1da0e8 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -26,20 +26,12 @@ namespace Microsoft.AspNet.TestHost public string Configuration { - get - { - return "debug"; - } + get { return "Test"; } } - + public FrameworkName TargetFramework { get { return new FrameworkName(".NETFramework", new Version(4, 5)); } } - - public string Configuration - { - get { return "Test"; } - } } } From 6551a30391af922551fd070a36b69e5ec992f5ce Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Aug 2014 06:56:32 -0700 Subject: [PATCH 0263/1838] Reacting to System.IO package version change --- src/Microsoft.AspNet.Hosting/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index d77f6393d3..40bc831099 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -18,7 +18,7 @@ "System.ComponentModel": "4.0.0.0", "System.Console": "4.0.0.0", "System.Diagnostics.Debug": "4.0.10.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Reflection": "4.0.10.0", "System.Runtime": "4.0.20.0", From e2a3f1455b09ca92a87199f794b72f208e789af9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Aug 2014 06:56:33 -0700 Subject: [PATCH 0264/1838] Reacting to System.IO package version change --- src/Microsoft.AspNet.Http/project.json | 4 ++-- src/Microsoft.AspNet.HttpFeature/project.json | 4 ++-- src/Microsoft.AspNet.Owin/project.json | 4 ++-- src/Microsoft.AspNet.PipelineCore/project.json | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 4a641d3f1e..3de806f0c7 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, "frameworks": { @@ -11,7 +11,7 @@ "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", "System.Globalization.Extensions": "4.0.0.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 88d1a45513..6eb8e1aef3 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "frameworks": { "net45": {}, "k10": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", "System.Runtime.InteropServices": "4.0.20.0", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 014ce61ad1..aed0aa1fd5 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "", @@ -14,7 +14,7 @@ "System.ComponentModel": "4.0.0.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Net.Primitives": "4.0.10.0", "System.Runtime": "4.0.20.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 1d116f7302..316aaadbe0 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "dependencies": { @@ -16,7 +16,7 @@ "System.Diagnostics.Debug": "4.0.10.0", "System.Diagnostics.Tools": "4.0.0.0", "System.Globalization": "4.0.10.0", - "System.IO": "4.0.0.0", + "System.IO": "4.0.10.0", "System.Linq": "4.0.0.0", "System.Runtime": "4.0.20.0", "System.Runtime.Extensions": "4.0.10.0", From 7230a3d78e8c369b2acf4cb2f835a186900cd49e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 7 Aug 2014 15:19:47 -0700 Subject: [PATCH 0265/1838] Add form and query helpers needed for Facebook auth. --- .../FormFeature.cs | 7 +- .../Infrastructure/ParsingHelpers.cs | 12 --- .../QueryFeature.cs | 2 +- .../RequestCookiesFeature.cs | 1 + .../project.json | 3 +- .../Collections/FormCollection.cs | 4 +- .../Collections/ReadableStringCollection.cs | 4 +- .../FormHelpers.cs | 18 ++++ .../NotNullAttribute.cs | 12 +++ .../ParsingHelpers.cs | 94 +++++++++++++++++++ .../QueryHelpers.cs | 20 ++++ 11 files changed, 155 insertions(+), 22 deletions(-) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.WebUtilities}/Collections/FormCollection.cs (87%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.WebUtilities}/Collections/ReadableStringCollection.cs (95%) create mode 100644 src/Microsoft.AspNet.WebUtilities/FormHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index c2b90a6574..271264b870 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -9,8 +9,9 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { @@ -60,8 +61,8 @@ namespace Microsoft.AspNet.PipelineCore detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { - string formQuery = await streamReader.ReadToEndAsync(); - _form = new ReadableStringCollection(ParsingHelpers.GetQuery(formQuery)); + string form = await streamReader.ReadToEndAsync(); + _form = FormHelpers.ParseForm(form); } } return _form; diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index a545a1dac7..2ede1ab15c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -818,18 +818,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure StringComparer.OrdinalIgnoreCase); } - internal static IFormCollection GetForm(string text) - { - IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); - foreach (var kv in accumulator) - { - form.Add(kv.Key, kv.Value.ToArray()); - } - return new FormCollection(form); - } - internal static string GetJoinedValue(IDictionary store, string key) { string[] values = GetUnmodifiedValues(store, key); diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 1cf25622df..ab5ea5157a 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -5,8 +5,8 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 952bfed0f6..8a3ae99e72 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -9,6 +9,7 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 316aaadbe0..81d5f9a326 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -4,7 +4,8 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "" + "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.WebUtilities": "" }, "frameworks": { "net45": {}, diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs similarity index 87% rename from src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs rename to src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs index b1da4f6c3c..a9d1df8529 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.Http; using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.WebUtilities.Collections { /// /// Contains the parsed form values. @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.PipelineCore.Collections public class FormCollection : ReadableStringCollection, IFormCollection { /// - /// Initializes a new instance of the class. + /// Initializes a new instance of the class. /// /// The store for the form. public FormCollection(IDictionary store) diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs similarity index 95% rename from src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs index 139d8d1c78..97c03b0df2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs @@ -4,11 +4,9 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.WebUtilities.Collections { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs new file mode 100644 index 0000000000..17f8135465 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs @@ -0,0 +1,18 @@ +using System; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class FormHelpers + { + /// + /// Parses an HTTP form body. + /// + /// The HTTP form body to parse. + /// The object containing the parsed HTTP form body. + public static IFormCollection ParseForm(string text) + { + return ParsingHelpers.GetForm(text); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs b/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs new file mode 100644 index 0000000000..d489cf36b3 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs new file mode 100644 index 0000000000..c9f4e6f544 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -0,0 +1,94 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities.Collections; + +namespace Microsoft.AspNet.WebUtilities +{ + internal static partial class ParsingHelpers + { + internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) + { + int textLength = text.Length; + int equalIndex = text.IndexOf('='); + if (equalIndex == -1) + { + equalIndex = textLength; + } + int scanIndex = 0; + while (scanIndex < textLength) + { + int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); + if (delimiterIndex == -1) + { + delimiterIndex = textLength; + } + if (equalIndex < delimiterIndex) + { + while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) + { + ++scanIndex; + } + string name = text.Substring(scanIndex, equalIndex - scanIndex); + string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); + callback( + Uri.UnescapeDataString(name.Replace('+', ' ')), + Uri.UnescapeDataString(value.Replace('+', ' ')), + state); + equalIndex = text.IndexOf('=', delimiterIndex); + if (equalIndex == -1) + { + equalIndex = textLength; + } + } + scanIndex = delimiterIndex + 1; + } + } + + private static readonly Action AppendItemCallback = (name, value, state) => + { + var dictionary = (IDictionary>)state; + + List existing; + if (!dictionary.TryGetValue(name, out existing)) + { + dictionary.Add(name, new List(1) { value }); + } + else + { + existing.Add(value); + } + }; + + internal static IFormCollection GetForm(string text) + { + IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); + foreach (var kv in accumulator) + { + form.Add(kv.Key, kv.Value.ToArray()); + } + return new FormCollection(form); + } + + internal static string GetJoinedValue(IDictionary store, string key) + { + string[] values = GetUnmodifiedValues(store, key); + return values == null ? null : string.Join(",", values); + } + + internal static string[] GetUnmodifiedValues(IDictionary store, string key) + { + if (store == null) + { + throw new ArgumentNullException("store"); + } + string[] values; + return store.TryGetValue(key, out values) ? values : null; + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs new file mode 100644 index 0000000000..27b8a96ded --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -0,0 +1,20 @@ +using System; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class QueryHelpers + { + /// + /// Append the given query key and value to the uri. + /// + /// The base uri. + /// The name of the query key. + /// The query value. + /// The combine result. + public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) + { + bool hasQuery = uri.IndexOf('?') != -1; + return uri + (hasQuery ? "&" : "?") + Uri.EscapeDataString(name) + "=" + Uri.EscapeDataString(value); + } + } +} \ No newline at end of file From ddc7f0895706004f715d4942a491cc5418ee1869 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 20 Aug 2014 12:38:04 -0700 Subject: [PATCH 0266/1838] #116 - Add IBuilder.Properties collection. --- src/Microsoft.AspNet.Http/IBuilder.cs | 5 +++ src/Microsoft.AspNet.PipelineCore/Builder.cs | 43 +++++++++++++++++-- .../Infrastructure/Constants.cs | 6 +++ 3 files changed, 50 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IBuilder.cs index 6a2c1b3197..1673390e07 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IBuilder.cs @@ -2,17 +2,22 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; namespace Microsoft.AspNet.Builder { public interface IBuilder { IServiceProvider ApplicationServices { get; set; } + IServerInformation Server { get; set; } + IDictionary Properties { get; set; } + IBuilder Use(Func middleware); IBuilder New(); + RequestDelegate Build(); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/Builder.cs index fae10cf6a2..12a95ebd8f 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/Builder.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.Builder { @@ -15,17 +16,51 @@ namespace Microsoft.AspNet.Builder public Builder(IServiceProvider serviceProvider) { + Properties = new Dictionary(); ApplicationServices = serviceProvider; } private Builder(Builder builder) { - ApplicationServices = builder.ApplicationServices; - Server = builder.Server; + Properties = builder.Properties; } - public IServiceProvider ApplicationServices { get; set; } - public IServerInformation Server { get; set; } + public IServiceProvider ApplicationServices + { + get + { + return GetProperty(Constants.BuilderProperties.ApplicationServices); + } + set + { + SetProperty(Constants.BuilderProperties.ApplicationServices, value); + } + } + + public IServerInformation Server + { + get + { + return GetProperty(Constants.BuilderProperties.ServerInformation); + } + set + { + SetProperty(Constants.BuilderProperties.ServerInformation, value); + } + } + + public IDictionary Properties { get; set; } + + private T GetProperty(string key) + { + object value; + return Properties.TryGetValue(key, out value) ? (T)value : default(T); + } + + private void SetProperty(string key, T value) + { + Properties[key] = value; + } public IBuilder Use(Func middleware) { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs index 9404c79c70..c918c4de33 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs @@ -25,5 +25,11 @@ namespace Microsoft.AspNet.Http.Infrastructure internal const string Expires = "Expires"; internal const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; } + + internal static class BuilderProperties + { + internal static string ServerInformation = "server.Information"; + internal static string ApplicationServices = "application.Services"; + } } } From bc0732f9007f8e2c2e1feb8904c0e4779cfe8a37 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 21 Aug 2014 12:13:26 -0700 Subject: [PATCH 0267/1838] Code cleanup. --- src/Microsoft.AspNet.Http/HostString.cs | 8 ++++---- src/Microsoft.AspNet.Http/PathString.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 12 +----------- src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs | 2 +- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 6 +++--- 5 files changed, 10 insertions(+), 20 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 7e4381f9f1..67af893b19 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -8,7 +8,7 @@ using System.Globalization; namespace Microsoft.AspNet.Http { /// - /// Represents the host portion of a Uri can be used to construct Uri's properly formatted and encoded for use in + /// Represents the host portion of a URI can be used to construct URI's properly formatted and encoded for use in /// HTTP headers. /// public struct HostString : IEquatable @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Http /// Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. /// /// - [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a uri is returned.")] + [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a URI is returned.")] public string ToUriComponent() { int index; @@ -82,12 +82,12 @@ namespace Microsoft.AspNet.Http } /// - /// Creates a new HostString from the given uri component. + /// Creates a new HostString from the given URI component. /// Any punycode will be converted to Unicode. /// /// /// - [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a uri is provided.")] + [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a URI is provided.")] public static HostString FromUriComponent(string uriComponent) { if (!string.IsNullOrEmpty(uriComponent)) diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index a6cf0c85b3..05dfa6d816 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Http /// /// The escaped path as it appears in the URI format. /// The resulting PathString - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with Uri processing")] + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with URI processing")] public static PathString FromUriComponent(string uriComponent) { // REVIEW: what is the exactly correct thing to do? diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 2ede1ab15c..f1db7fe748 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -8,7 +8,6 @@ using System.Globalization; using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.PipelineCore.Collections; namespace Microsoft.AspNet.PipelineCore.Infrastructure { @@ -507,7 +506,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - internal static partial class ParsingHelpers + internal static class ParsingHelpers { private static readonly Action AddCookieCallback = (name, value, state) => { @@ -592,10 +591,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure scanIndex = delimiterIndex + 1; } } - } - internal static partial class ParsingHelpers - { public static string GetHeader(IDictionary headers, string key) { string[] values = GetHeaderUnmodified(headers, key); @@ -783,10 +779,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure SetHeaderUnmodified(headers, key, existing.Concat(values)); } } - } - internal static partial class ParsingHelpers - { private static readonly Action AppendItemCallback = (name, value, state) => { var dictionary = (IDictionary>)state; @@ -833,10 +826,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure string[] values; return store.TryGetValue(key, out values) ? values : null; } - } - internal static partial class ParsingHelpers - { //internal static string GetHost(HttpRequest request) //{ // IHeaderDictionary headers = request.Headers; diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs index c9f4e6f544..e5dbd65a9c 100644 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -8,7 +8,7 @@ using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.WebUtilities { - internal static partial class ParsingHelpers + internal static class ParsingHelpers { internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) { diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 27b8a96ded..0b4de851bc 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -5,12 +5,12 @@ namespace Microsoft.AspNet.WebUtilities public static class QueryHelpers { /// - /// Append the given query key and value to the uri. + /// Append the given query key and value to the URI. /// - /// The base uri. + /// The base URI. /// The name of the query key. /// The query value. - /// The combine result. + /// The combined result. public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { bool hasQuery = uri.IndexOf('?') != -1; From 1aed739edb6a8fef1830fb86748a1334ae7f6b35 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 22 Aug 2014 09:04:30 -0700 Subject: [PATCH 0268/1838] WebUtilities: Add more query helpers. --- .../FormHelpers.cs | 5 +++- .../QueryHelpers.cs | 29 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs index 17f8135465..4c16485eb0 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.WebUtilities diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 0b4de851bc..d31a250fdb 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -1,4 +1,9 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Text; namespace Microsoft.AspNet.WebUtilities { @@ -16,5 +21,27 @@ namespace Microsoft.AspNet.WebUtilities bool hasQuery = uri.IndexOf('?') != -1; return uri + (hasQuery ? "&" : "?") + Uri.EscapeDataString(name) + "=" + Uri.EscapeDataString(value); } + + /// + /// Append the given query keys and values to the uri. + /// + /// The base uri. + /// A collection of name value query pairs to append. + /// The combine result. + public static string AddQueryString([NotNull] string uri, [NotNull] IDictionary queryString) + { + var sb = new StringBuilder(); + sb.Append(uri); + bool hasQuery = uri.IndexOf('?') != -1; + foreach (var parameter in queryString) + { + sb.Append(hasQuery ? '&' : '?'); + sb.Append(Uri.EscapeDataString(parameter.Key)); + sb.Append('='); + sb.Append(Uri.EscapeDataString(parameter.Value)); + hasQuery = true; + } + return sb.ToString(); + } } } \ No newline at end of file From 630abe6a5d329de11cd28058dede8fe365640ebe Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 28 Aug 2014 23:29:57 -0700 Subject: [PATCH 0269/1838] Updated to use the new target framework in project.json --- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.RequestContainer/project.json | 2 +- src/Microsoft.AspNet.TestHost/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- test/Microsoft.AspNet.TestHost.Tests/project.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 40bc831099..4415b2a039 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -12,7 +12,7 @@ }, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 7c3a92c05e..de23d763da 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -7,7 +7,7 @@ }, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 0effba0b63..5386ddc409 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -6,7 +6,7 @@ }, "frameworks": { "net45": { }, - "k10" : { + "aspnetcore50" : { "dependencies": { "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index f106512168..d60b8d2cb8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.RequestContainer": "", diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index e4f8d10796..60d12ad07b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Hosting": "", "Microsoft.AspNet.TestHost": "", From aac0ce134cf1e76f001dcfd3b4f2187140dc3d9d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 28 Aug 2014 23:31:29 -0700 Subject: [PATCH 0270/1838] Updated to use the new target framework in project.json --- src/Microsoft.AspNet.FeatureModel/project.json | 4 ++-- src/Microsoft.AspNet.Http.Extensions/project.json | 4 ++-- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 4 ++-- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- 13 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 935bd582a9..1fba2b6443 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,9 +1,9 @@ -{ +{ "version": "1.0.0-*", "dependencies": {}, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", "System.Linq": "4.0.0.0", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 05084820d7..d6d882dcf9 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "" @@ -6,7 +6,7 @@ "frameworks" : { "net45" : { }, - "k10" : { + "aspnetcore50" : { "dependencies": { "System.Runtime": "4.0.20.0" } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3de806f0c7..8b4e4847ae 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -3,7 +3,7 @@ "dependencies": {}, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 6eb8e1aef3..09e2ecaa34 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.IO": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index aed0aa1fd5..ab619d0ecd 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -8,7 +8,7 @@ }, "frameworks": { "net45": { }, - "k10": { + "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", "System.ComponentModel": "4.0.0.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 81d5f9a326..de5729dbe5 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -9,7 +9,7 @@ }, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 2c127c9880..c7db47e2cf 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { "net45": {}, - "k10": { + "aspnetcore50": { "dependencies": { "System.Runtime": "4.0.20.0" } diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index edd64952a5..6eb916901e 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index d4f878c1ae..606939399a 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.Http.Extensions": "", diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 3b3a2b30f5..e492a87bf0 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.HttpFeature": "", diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index ab327d0772..805a5b0b16 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index d83574ead1..335e9dc68e 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "", "Microsoft.AspNet.Http": "", diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index b7217ebcea..68ed3039db 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "", "Microsoft.AspNet.WebUtilities": "", From 904eeb76f91c8629538689280155ea8bffeaefee Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 1 Sep 2014 11:56:11 -0700 Subject: [PATCH 0271/1838] Removing TestClient from TestServer --- src/Microsoft.AspNet.TestHost/TestClient.cs | 209 ------------------ src/Microsoft.AspNet.TestHost/TestServer.cs | 14 -- .../TestClientTests.cs | 116 ++-------- 3 files changed, 21 insertions(+), 318 deletions(-) delete mode 100644 src/Microsoft.AspNet.TestHost/TestClient.cs diff --git a/src/Microsoft.AspNet.TestHost/TestClient.cs b/src/Microsoft.AspNet.TestHost/TestClient.cs deleted file mode 100644 index 57886e56f9..0000000000 --- a/src/Microsoft.AspNet.TestHost/TestClient.cs +++ /dev/null @@ -1,209 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; - -namespace Microsoft.AspNet.TestHost -{ - public class TestClient - { - private readonly Func _pipeline; - - public TestClient(Func pipeline) - { - _pipeline = pipeline; - } - - public async Task SendAsync(string method, - string url, - IDictionary headers = null, - Stream body = null, - Action onSendingRequest = null) - { - return await SendAsync(method, new Uri(url), headers, body, onSendingRequest); - } - - public async Task SendAsync(string method, - Uri uri, - IDictionary headers = null, - Stream body = null, - Action onSendingRequest = null) - { - var request = CreateRequest(method, uri, headers, body); - var response = new ResponseFeature(); - - var features = new FeatureCollection(); - features.Add(typeof(IHttpRequestFeature), request); - features.Add(typeof(IHttpResponseFeature), response); - var httpContext = new DefaultHttpContext(features); - - if (onSendingRequest != null) - { - onSendingRequest(httpContext.Request); - } - await _pipeline(features); - - response.Body.Seek(0, SeekOrigin.Begin); - return httpContext.Response; - } - - private static IHttpRequestFeature CreateRequest( - string method, - Uri uri, - IDictionary headers, - Stream body) - { - var request = new RequestFeature(); - request.Method = method; - request.Scheme = uri.Scheme; - request.Path = PathString.FromUriComponent(uri).Value; - request.QueryString = QueryString.FromUriComponent(uri).Value; - request.Headers = headers ?? request.Headers; - if (!request.Headers.ContainsKey("Host")) - { - var host = new string[1]; - if (uri.IsDefaultPort) - { - host[0] = uri.Host; - } - else - { - host[0] = uri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); - } - request.Headers["Host"] = host; - } - - if (body != null) - { - EnsureContentLength(request.Headers, body); - request.Body = body; - } - else - { - request.Body = Stream.Null; - } - return request; - } - - public async Task GetAsync(string url) - { - var uri = new Uri(url); - return await GetAsync(uri); - } - - public async Task GetAsync(Uri uri) - { - return await SendAsync("GET", uri); - } - - public async Task GetStringAsync(string url) - { - var uri = new Uri(url); - return await GetStringAsync(uri); - } - - public async Task GetStringAsync(Uri uri) - { - var response = await GetAsync(uri); - return await new StreamReader(response.Body).ReadToEndAsync(); - } - - public async Task GetStreamAsync(string url) - { - var uri = new Uri(url); - return await GetStreamAsync(uri); - } - - public async Task GetStreamAsync(Uri uri) - { - var response = await GetAsync(uri); - return response.Body; - } - - public async Task PostAsync( - string url, - string content, - string contentType, - Action onSendingRequest = null) - { - return await PostAsync(new Uri(url), content, contentType, onSendingRequest); - } - - public async Task PostAsync( - Uri url, - string content, - string contentType, - Action onSendingRequest = null) - { - var bytes = GetBytes(content); - var headers = CreateContentHeaders(contentType, bytes.Length); - var body = new MemoryStream(bytes); - - return await SendAsync("POST", url, headers, body, onSendingRequest); - } - - public async Task PutAsync( - string url, - string content, - string contentType, - Action onSendingRequest = null) - { - return await PutAsync(new Uri(url), content, contentType, onSendingRequest); - } - - public async Task PutAsync( - Uri url, - string content, - string contentType, - Action onSendingRequest = null) - { - var bytes = GetBytes(content); - var headers = CreateContentHeaders(contentType, bytes.Length); - var body = new MemoryStream(bytes); - - return await SendAsync("PUT", url, headers, body, onSendingRequest); - } - - public async Task DeleteAsync(string url) - { - return await DeleteAsync(new Uri(url)); - } - - public async Task DeleteAsync(Uri uri) - { - return await SendAsync("DELETE", uri); - } - - private static void EnsureContentLength(IDictionary dictionary, Stream body) - { - if (!dictionary.ContainsKey("Content-Length")) - { - dictionary["Content-Length"] = new[] { body.Length.ToString(CultureInfo.InvariantCulture) }; - } - } - - private static byte[] GetBytes(string content) - { - var bytes = Encoding.UTF8.GetBytes(content); - return bytes; - } - - private static Dictionary CreateContentHeaders(string contentType, int contentLength) - { - return new Dictionary(StringComparer.OrdinalIgnoreCase) - { - { "Content-Type", new [] { contentType } }, - { "Content-Length", new [] { contentLength.ToString(CultureInfo.InvariantCulture) } } - }; - } - } -} diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 88f25d083f..b8df467d80 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -20,7 +20,6 @@ namespace Microsoft.AspNet.TestHost private static readonly string ServerName = typeof(TestServer).FullName; private static readonly ServerInformation ServerInfo = new ServerInformation(); private Func _appDelegate; - private TestClient _handler; private IDisposable _appInstance; private bool _disposed = false; @@ -45,19 +44,6 @@ namespace Microsoft.AspNet.TestHost _appInstance = engine.Start(hostContext); } - public TestClient Handler - { - get - { - if (_handler == null) - { - _handler = new TestClient(Invoke); - } - - return _handler; - } - } - public static TestServer Create(Action app) { return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 96fbfc04b0..d9843657dd 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -2,8 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; +using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; @@ -25,114 +25,41 @@ namespace Microsoft.AspNet.TestHost .AddSingleton() .BuildServiceProvider(); - _server = TestServer.Create(_services, app => app.Run(async ctx => { })); + _server = TestServer.Create(_services, app => app.Run(ctx => Task.FromResult(0))); } [Fact] - public async Task SendAsync_ConfiguresRequestProperly() + public async Task GetAsyncWorks() { // Arrange - var client = _server.Handler; + var expected = "GET Response"; + RequestDelegate appDelegate = ctx => + ctx.Response.WriteAsync(expected); + var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var client = server.CreateClient(); // Act - var response = await client.SendAsync("GET", "http://localhost:12345/Home/Index?id=3&name=peter#fragment"); - var request = response.HttpContext.Request; + var actual = await client.GetStringAsync("http://localhost:12345"); // Assert - Assert.NotNull(request); - Assert.Equal("HTTP/1.1", request.Protocol); - Assert.Equal("GET", request.Method); - Assert.Equal("http", request.Scheme); - Assert.Equal("localhost:12345", request.Host.Value); - Assert.Equal("", request.PathBase.Value); - Assert.True(request.Path.HasValue); - Assert.Equal("/Home/Index", request.Path.Value); - Assert.Equal("?id=3&name=peter", request.QueryString.Value); - Assert.Null(request.ContentLength); - Assert.Equal(1, request.Headers.Count); - Assert.True(request.Headers.ContainsKey("Host")); - } - - [Fact] - public async Task SendAsync_InvokesCallbackWhenPassed() - { - // Arrange - var client = _server.Handler; - var invoked = false; - - // Act - var response = await client.SendAsync("GET", "http://localhost:12345/", null, null, _ => invoked = true); - - // Assert - Assert.True(invoked); - } - - [Fact] - public async Task SendAsync_RespectsExistingHost() - { - // Arrange - var client = _server.Handler; - var headers = new Dictionary { { "Host", new string[] { "server:12345" } } }; - - // Act - var response = await client.SendAsync("GET", "http://localhost:12345/Home/", headers); - var request = response.HttpContext.Request; - - // Assert - Assert.Equal("server:12345", request.Host.Value); - } - - [Fact] - public async Task SendAsync_RespectsArgumentBody() - { - // Arrange - var client = _server.Handler; - var headers = new Dictionary { { "Content-Type", new string[] { "text/plain" } } }; - var body = new MemoryStream(); - new StreamWriter(body).Write("Hello world"); - body.Position = 0; - - // Act - var response = await client.SendAsync("POST", "http://host/", headers, body); - var request = response.HttpContext.Request; - - // Assert - Assert.Same(body, request.Body); - Assert.Equal(0, request.Body.Position); - Assert.Equal(body.Length, request.ContentLength); - } - - [Fact] - public async Task SendAsync_RewindsTheResponseStream() - { - // Arrange - var server = TestServer.Create(_services, app => app.Run(ctx => ctx.Response.WriteAsync("Hello world"))); - var client = server.Handler; - - // Act - var response = await client.SendAsync("GET", "http://localhost"); - - // Assert - Assert.Equal(0, response.Body.Position); - Assert.Equal("Hello world", new StreamReader(response.Body).ReadToEnd()); + Assert.Equal(expected, actual); } [Fact] public async Task PutAsyncWorks() { // Arrange - RequestDelegate appDelegate = async ctx => - await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd()); + RequestDelegate appDelegate = ctx => + ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " PUT Response"); var server = TestServer.Create(_services, app => app.Run(appDelegate)); - var client = server.Handler; + var client = server.CreateClient(); // Act - var response = await client.PutAsync("http://localhost:12345", "Hello world", "text/plain"); - var request = response.HttpContext.Request; + var content = new StringContent("Hello world"); + var response = await client.PutAsync("http://localhost:12345", content); // Assert - Assert.Equal("PUT", request.Method); - Assert.Equal("Hello world", new StreamReader(response.Body).ReadToEnd()); + Assert.Equal("Hello world PUT Response", await response.Content.ReadAsStringAsync()); } [Fact] @@ -140,17 +67,16 @@ namespace Microsoft.AspNet.TestHost { // Arrange RequestDelegate appDelegate = async ctx => - await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd()); + await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " POST Response"); var server = TestServer.Create(_services, app => app.Run(appDelegate)); - var client = server.Handler; + var client = server.CreateClient(); // Act - var response = await client.PostAsync("http://localhost:12345", "Hello world", "text/plain"); - var request = response.HttpContext.Request; + var content = new StringContent("Hello world"); + var response = await client.PostAsync("http://localhost:12345", content); // Assert - Assert.Equal("POST", request.Method); - Assert.Equal("Hello world", new StreamReader(response.Body).ReadToEnd()); + Assert.Equal("Hello world POST Response", await response.Content.ReadAsStringAsync()); } } } From a9ec7cfb62586ae0d0d999133695c64a4c0e5741 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 4 Sep 2014 01:22:48 -0700 Subject: [PATCH 0272/1838] Changing net45 to aspnet50 --- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.RequestContainer/project.json | 2 +- src/Microsoft.AspNet.TestHost/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- test/Microsoft.AspNet.TestHost.Tests/project.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 4415b2a039..34fc3ef4fe 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -11,7 +11,7 @@ "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index de23d763da..d381b0bb3d 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -6,7 +6,7 @@ "Microsoft.Framework.OptionsModel": "1.0.0-*" }, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 5386ddc409..53b6d1f466 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -5,7 +5,7 @@ "System.Net.Http": "4.0.0.0" }, "frameworks": { - "net45": { }, + "aspnet50": { }, "aspnetcore50" : { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index d60b8d2cb8..7ec2873fb0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -5,7 +5,7 @@ "Xunit.KRunner": "1.0.0-*" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "System.Runtime" : "" } diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 60d12ad07b..61635fd5d9 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -9,7 +9,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "System.Runtime": "" } From 90dad400299eedb37ff65eaf5f923e9823dcf1e0 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 4 Sep 2014 01:27:14 -0700 Subject: [PATCH 0273/1838] Updated to use the new target framework in project.json --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- 13 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 1fba2b6443..1c37fbed40 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": {}, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index d6d882dcf9..ebdbd9b391 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Http": "" }, "frameworks" : { - "net45" : { + "aspnet50" : { }, "aspnetcore50" : { "dependencies": { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 8b4e4847ae..4e4141ca40 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": {}, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 09e2ecaa34..0c685167ae 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index ab619d0ecd..3959a57492 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -7,7 +7,7 @@ "Microsoft.AspNet.HttpFeature": "" }, "frameworks": { - "net45": { }, + "aspnet50": { }, "aspnetcore50": { "dependencies": { "System.Collections": "4.0.10.0", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index de5729dbe5..796736153e 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -8,7 +8,7 @@ "Microsoft.AspNet.WebUtilities": "" }, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index c7db47e2cf..e4f394f360 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { - "net45": {}, + "aspnet50": {}, "aspnetcore50": { "dependencies": { "System.Runtime": "4.0.20.0" diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 6eb916901e..0140f1b937 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -9,7 +9,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 606939399a..da1a1aee7f 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -10,7 +10,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index e492a87bf0..eb6a78191d 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -10,7 +10,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 805a5b0b16..dec714b7e4 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -11,7 +11,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Shouldly": "1.1.1.1", "System.Runtime": "" diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 335e9dc68e..d1179f1b2b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -10,7 +10,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "Moq": "4.2.1312.1622", "System.Net.Http": "", diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 68ed3039db..f20bb8d0b0 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -8,7 +8,7 @@ "test": "Xunit.KRunner" }, "frameworks": { - "net45": { + "aspnet50": { "dependencies": { "System.Runtime": "" } From 4b1c1f35528d24cf60bc37448bf4a55d58bb8f7e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 5 Sep 2014 01:48:12 -0700 Subject: [PATCH 0274/1838] Updated build.cmd --- build.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 3aaf957583..86ca5bbbf1 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 -CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 +CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -svr50 -x86 +CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From ba4f44c4ea653334d9895aa05686246151379649 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 5 Sep 2014 01:48:46 -0700 Subject: [PATCH 0275/1838] Updated build.cmd --- build.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 3aaf957583..86ca5bbbf1 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -svr50 -x86 -CALL packages\KoreBuild\build\kvm install default -svrc50 -x86 +CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -svr50 -x86 +CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From f4953a0b29d373406178b53c1b922628f217cb1a Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 5 Sep 2014 09:06:01 -0700 Subject: [PATCH 0276/1838] Updated to use the new target framework in project.json --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 4 ++-- .../ContainerMiddleware.cs | 8 ++++---- src/Microsoft.AspNet.TestHost/ResponseStream.cs | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 91e1ef5f31..29a46304ac 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -63,7 +63,7 @@ namespace Microsoft.AspNet.Hosting if (PlatformHelper.IsMono) { -#if NET45 +#if ASPNET50 yield return describer.Instance(DataProtectionProvider.CreateFromLegacyDpapi()); #endif } @@ -77,4 +77,4 @@ namespace Microsoft.AspNet.Hosting } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 38398d3889..518eac189c 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -16,14 +16,14 @@ // permissions and limitations under the License. using System; -#if NET45 +#if ASPNET50 using System.Runtime.Remoting.Messaging; #endif using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -#if NET45 +#if ASPNET50 using System.Runtime.Remoting; #endif namespace Microsoft.AspNet.RequestContainer @@ -65,7 +65,7 @@ namespace Microsoft.AspNet.RequestContainer private HttpContext AccessRootHttpContext() { -#if NET45 +#if ASPNET50 var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; return handle != null ? handle.Unwrap() as HttpContext : null; #else @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.RequestContainer private HttpContext ExchangeRootHttpContext(HttpContext httpContext) { -#if NET45 +#if ASPNET50 var prior = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(httpContext)); return prior != null ? prior.Unwrap() as HttpContext : null; diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index cae4eba46f..64e64c0c64 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.TestHost _readLock.Release(); } } -#if NET45 +#if ASPNET50 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { // TODO: This option doesn't preserve the state object. @@ -258,7 +258,7 @@ namespace Microsoft.AspNet.TestHost _writeLock.Release(); } } -#if NET45 +#if ASPNET50 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { Write(buffer, offset, count); From 200f894b5b74788e0b620e774a577a0de77c0138 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 10 Sep 2014 10:25:41 -0700 Subject: [PATCH 0277/1838] Handle IBuilder rename to IApplicationBuilder. --- ...lderFactory.cs => ApplicationBuilderFactory.cs} | 9 ++++----- ...derFactory.cs => IApplicationBuilderFactory.cs} | 5 ++--- src/Microsoft.AspNet.Hosting/HostingContext.cs | 4 ++-- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 4 ++-- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- .../Startup/IStartupLoader.cs | 2 +- .../Startup/IStartupManager.cs | 2 +- .../Startup/NullStartupLoader.cs | 2 +- .../Startup/StartupLoader.cs | 4 ++-- .../Startup/StartupManager.cs | 2 +- .../ContainerExtensions.cs | 14 +++++++------- src/Microsoft.AspNet.TestHost/TestServer.cs | 6 +++--- .../Fakes/Startup.cs | 2 +- .../Fakes/StartupWithServices.cs | 2 +- .../HostingEngineTests.cs | 2 +- .../UseServicesFacts.cs | 4 ++-- .../TestServerTests.cs | 4 ++-- 17 files changed, 34 insertions(+), 36 deletions(-) rename src/Microsoft.AspNet.Hosting/Builder/{BuilderFactory.cs => ApplicationBuilderFactory.cs} (78%) rename src/Microsoft.AspNet.Hosting/Builder/{IBuilderFactory.cs => IApplicationBuilderFactory.cs} (88%) diff --git a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs similarity index 78% rename from src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs rename to src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs index 01a04d5df5..7b17e587f8 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/BuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs @@ -17,22 +17,21 @@ using System; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder { - public class BuilderFactory : IBuilderFactory + public class ApplicationBuilderFactory : IApplicationBuilderFactory { private readonly IServiceProvider _serviceProvider; - public BuilderFactory(IServiceProvider serviceProvider) + public ApplicationBuilderFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } - public IBuilder CreateBuilder() + public IApplicationBuilder CreateBuilder() { - return new Microsoft.AspNet.Builder.Builder(_serviceProvider); + return new ApplicationBuilder(_serviceProvider); } } } diff --git a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs similarity index 88% rename from src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs rename to src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs index ab9c2d3ba3..dd60b0693a 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs @@ -16,12 +16,11 @@ // permissions and limitations under the License. using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder { - public interface IBuilderFactory + public interface IApplicationBuilderFactory { - IBuilder CreateBuilder(); + IApplicationBuilder CreateBuilder(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index ea5685e6bb..b3bc2e550c 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -28,11 +28,11 @@ namespace Microsoft.AspNet.Hosting public IServiceProvider Services { get; set; } public IConfiguration Configuration { get; set; } - public IBuilder Builder { get; set; } + public IApplicationBuilder Builder { get; set; } public string ApplicationName { get; set; } public string EnvironmentName { get; set; } - public Action ApplicationStartup { get; set; } + public Action ApplicationStartup { get; set; } public RequestDelegate ApplicationDelegate { get; set; } public string ServerName { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index f921780c8e..7f75c88e5e 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -29,13 +29,13 @@ namespace Microsoft.AspNet.Hosting { private readonly IServerManager _serverManager; private readonly IStartupManager _startupManager; - private readonly IBuilderFactory _builderFactory; + private readonly IApplicationBuilderFactory _builderFactory; private readonly IHttpContextFactory _httpContextFactory; public HostingEngine( IServerManager serverManager, IStartupManager startupManager, - IBuilderFactory builderFactory, + IApplicationBuilderFactory builderFactory, IHttpContextFactory httpContextFactory) { _serverManager = serverManager; diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 29a46304ac..ec932efaff 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Hosting yield return describer.Transient(); yield return describer.Transient(); - yield return describer.Transient(); + yield return describer.Transient(); yield return describer.Transient(); yield return describer.Transient(); diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index a6a0741ad7..faba106da5 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupLoader { - Action LoadStartup( + Action LoadStartup( string applicationName, string environmentName, IList diagnosticMessages); diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs index 1b8b9f19cc..8cdd089054 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupManager { - Action LoadStartup( + Action LoadStartup( string applicationName, string environmentName); } diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs index 559d44d5e2..c40983087a 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Hosting.Startup public static IStartupLoader Instance { get; private set; } - public Action LoadStartup( + public Action LoadStartup( string applicationName, string environmentName, IList diagnosticMessages) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 98aec36c67..cce003a648 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Hosting.Startup _next = next; } - public Action LoadStartup( + public Action LoadStartup( string applicationName, string environmentName, IList diagnosticMessages) @@ -120,7 +120,7 @@ namespace Microsoft.AspNet.Hosting.Startup for (var index = 0; index != parameterInfos.Length; ++index) { var parameterInfo = parameterInfos[index]; - if (parameterInfo.ParameterType == typeof(IBuilder)) + if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) { parameters[index] = builder; } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs index 8c4bc7b1ff..cc722eafb5 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Hosting.Startup _providers = providers; } - public Action LoadStartup( + public Action LoadStartup( string applicationName, string environmentName) { diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 45b7375683..3ae3541481 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -28,12 +28,12 @@ namespace Microsoft.AspNet.Builder { public static class ContainerExtensions { - public static IBuilder UseMiddleware(this IBuilder builder, params object[] args) + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) { return builder.UseMiddleware(typeof(T), args); } - public static IBuilder UseMiddleware(this IBuilder builder, Type middleware, params object[] args) + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) { // TODO: move this ext method someplace nice return builder.Use(next => @@ -45,24 +45,24 @@ namespace Microsoft.AspNet.Builder }); } - public static IBuilder UseServices(this IBuilder builder) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder) { return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IBuilder UseServices(this IBuilder builder, IServiceProvider applicationServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IServiceProvider applicationServices) { builder.ApplicationServices = applicationServices; return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IBuilder UseServices(this IBuilder builder, IEnumerable applicationServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IEnumerable applicationServices) { return builder.UseServices(services => services.Add(applicationServices)); } - public static IBuilder UseServices(this IBuilder builder, Action configureServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Action configureServices) { return builder.UseServices(serviceCollection => { @@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Builder }); } - public static IBuilder UseServices(this IBuilder builder, Func configureServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) { var serviceCollection = new ServiceCollection(); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index b8df467d80..e1e3ac37dd 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.TestHost private IDisposable _appInstance; private bool _disposed = false; - public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) + public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { var env = serviceProvider.GetService(); if (env == null) @@ -44,12 +44,12 @@ namespace Microsoft.AspNet.TestHost _appInstance = engine.Start(hostContext); } - public static TestServer Create(Action app) + public static TestServer Create(Action app) { return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app); } - public static TestServer Create(IServiceProvider provider, Action app) + public static TestServer Create(IServiceProvider provider, Action app) { var collection = new ServiceCollection(); var hostingServices = HostingServices.GetDefaultServices(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index da91cbeca0..fb05a63b60 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Hosting.Fakes { } - public void Configure(IBuilder builder) + public void Configure(IApplicationBuilder builder) { } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs index 166b4ff5c5..c13ec7eb7f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Hosting.Fakes _fakeStartupCallback = fakeStartupCallback; } - public void Configure(IBuilder builder, IFakeStartupCallback fakeStartupCallback2) + public void Configure(IApplicationBuilder builder, IFakeStartupCallback fakeStartupCallback2) { _fakeStartupCallback.ConfigurationMethodCalled(this); fakeStartupCallback2.ConfigurationMethodCalled(this); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 96915f09fd..6091c7ae12 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } - public void Initialize(IBuilder builder) + public void Initialize(IApplicationBuilder builder) { } diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs index df88e1e855..3da2beebdb 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithAction() { var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); - var builder = new Microsoft.AspNet.Builder.Builder(baseServiceProvider); + var builder = new ApplicationBuilder(baseServiceProvider); builder.UseServices(serviceCollection => { }); @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithFunc() { var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); - var builder = new Microsoft.AspNet.Builder.Builder(baseServiceProvider); + var builder = new ApplicationBuilder(baseServiceProvider); IServiceProvider serviceProvider = null; builder.UseServices(serviceCollection => diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 5f27cc89f1..2a5ee973d2 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -107,7 +107,7 @@ namespace Microsoft.AspNet.TestHost public class Startup { - public void Configuration(IBuilder builder) + public void Configuration(IApplicationBuilder builder) { builder.Run(ctx => ctx.Response.WriteAsync("Startup")); } @@ -115,7 +115,7 @@ namespace Microsoft.AspNet.TestHost public class AnotherStartup { - public void Configuration(IBuilder builder) + public void Configuration(IApplicationBuilder builder) { builder.Run(ctx => ctx.Response.WriteAsync("Another Startup")); } From 335895d9b49042312eca12a089340adf3ca0a219 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 10 Sep 2014 11:45:02 -0700 Subject: [PATCH 0278/1838] #122 - Rename IBuilder to IApplicationBuilder. --- .../Extensions/MapExtensions.cs | 6 ++--- .../Extensions/MapWhenExtensions.cs | 8 +++---- .../Extensions/RunExtensions.cs | 2 +- .../Extensions/UseExtensions.cs | 2 +- .../{IBuilder.cs => IApplicationBuilder.cs} | 6 ++--- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 10 ++++----- .../{Builder.cs => ApplicationBuilder.cs} | 13 +++++------ .../MapPathMiddlewareTests.cs | 22 +++++++++---------- .../MapPredicateMiddlewareTests.cs | 22 +++++++++---------- ...derTests.cs => ApplicationBuilderTests.cs} | 4 ++-- 10 files changed, 47 insertions(+), 48 deletions(-) rename src/Microsoft.AspNet.Http/{IBuilder.cs => IApplicationBuilder.cs} (75%) rename src/Microsoft.AspNet.PipelineCore/{Builder.cs => ApplicationBuilder.cs} (86%) rename test/Microsoft.AspNet.PipelineCore.Tests/{BuilderTests.cs => ApplicationBuilderTests.cs} (89%) diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index b4a44adddf..9696b99da7 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Builder /// The path to match /// The branch to take for positive path matches /// - public static IBuilder Map([NotNull] this IBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) + public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) { return Map(app, new PathString(pathMatch), configuration); } @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Builder /// The path to match /// The branch to take for positive path matches /// - public static IBuilder Map([NotNull] this IBuilder app, PathString pathMatch, [NotNull] Action configuration) + public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, PathString pathMatch, [NotNull] Action configuration) { if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) { @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Builder } // create branch - IBuilder branchBuilder = app.New(); + var branchBuilder = app.New(); configuration(branchBuilder); var branch = branchBuilder.Build(); diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index b46bbbe0e9..63e65a0a11 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -23,10 +23,10 @@ namespace Microsoft.AspNet.Builder /// Invoked with the request environment to determine if the branch should be taken /// Configures a branch to take /// - public static IBuilder MapWhen([NotNull] this IBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) + public static IApplicationBuilder MapWhen([NotNull] this IApplicationBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) { // create branch - IBuilder branchBuilder = app.New(); + var branchBuilder = app.New(); configuration(branchBuilder); var branch = branchBuilder.Build(); @@ -46,10 +46,10 @@ namespace Microsoft.AspNet.Builder /// Invoked asynchronously with the request environment to determine if the branch should be taken /// Configures a branch to take /// - public static IBuilder MapWhenAsync([NotNull] this IBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) + public static IApplicationBuilder MapWhenAsync([NotNull] this IApplicationBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) { // create branch - IBuilder branchBuilder = app.New(); + var branchBuilder = app.New(); configuration(branchBuilder); var branch = branchBuilder.Build(); diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index de565c2e3d..694dd3ec0f 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Builder { public static class RunExtensions { - public static void Run([NotNull] this IBuilder app, [NotNull] RequestDelegate handler) + public static void Run([NotNull] this IApplicationBuilder app, [NotNull] RequestDelegate handler) { app.Use(_ => handler); } diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 3f0f8f51c3..038b14e03e 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Builder /// /// A function that handles the request or calls the given next function. /// - public static IBuilder Use(this IBuilder app, Func, Task> middleware) + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, Task> middleware) { return app.Use(next => { diff --git a/src/Microsoft.AspNet.Http/IBuilder.cs b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs similarity index 75% rename from src/Microsoft.AspNet.Http/IBuilder.cs rename to src/Microsoft.AspNet.Http/IApplicationBuilder.cs index 1673390e07..bed7c50f0d 100644 --- a/src/Microsoft.AspNet.Http/IBuilder.cs +++ b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Builder { - public interface IBuilder + public interface IApplicationBuilder { IServiceProvider ApplicationServices { get; set; } @@ -14,9 +14,9 @@ namespace Microsoft.AspNet.Builder IDictionary Properties { get; set; } - IBuilder Use(Func middleware); + IApplicationBuilder Use(Func middleware); - IBuilder New(); + IApplicationBuilder New(); RequestDelegate Build(); } diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 674befa4f9..5bd2e0a9fa 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Builder public static class OwinExtensions { - public static AddMiddleware UseOwin(this IBuilder builder) + public static AddMiddleware UseOwin(this IApplicationBuilder builder) { AddMiddleware add = middleware => { @@ -58,17 +58,17 @@ namespace Microsoft.AspNet.Builder return add; } - public static IBuilder UseOwin(this IBuilder builder, Action pipeline) + public static IApplicationBuilder UseOwin(this IApplicationBuilder builder, Action pipeline) { pipeline(builder.UseOwin()); return builder; } - public static IBuilder UseBuilder(this AddMiddleware app) + public static IApplicationBuilder UseBuilder(this AddMiddleware app) { // Adapt WebSockets by default. app(OwinWebSocketAcceptAdapter.AdaptWebSockets); - var builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); CreateMiddleware middleware = CreateMiddlewareFactory(exit => { @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Builder }; } - public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) + public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) { var builder = app.UseBuilder(); pipeline(builder); diff --git a/src/Microsoft.AspNet.PipelineCore/Builder.cs b/src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs similarity index 86% rename from src/Microsoft.AspNet.PipelineCore/Builder.cs rename to src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs index 12a95ebd8f..71f6ef267b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Builder.cs +++ b/src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs @@ -5,22 +5,21 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.Builder { - public class Builder : IBuilder + public class ApplicationBuilder : IApplicationBuilder { private readonly IList> _components = new List>(); - public Builder(IServiceProvider serviceProvider) + public ApplicationBuilder(IServiceProvider serviceProvider) { Properties = new Dictionary(); ApplicationServices = serviceProvider; } - private Builder(Builder builder) + private ApplicationBuilder(ApplicationBuilder builder) { Properties = builder.Properties; } @@ -62,15 +61,15 @@ namespace Microsoft.AspNet.Builder Properties[key] = value; } - public IBuilder Use(Func middleware) + public IApplicationBuilder Use(Func middleware) { _components.Add(middleware); return this; } - public IBuilder New() + public IApplicationBuilder New() { - return new Builder(this); + return new ApplicationBuilder(this); } public RequestDelegate Build() diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index 4a9d68dd45..bdaa1eeedb 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Builder.Extensions { public class MapPathMiddlewareTests { - private static readonly Action ActionNotImplemented = new Action(_ => { throw new NotImplementedException(); }); + private static readonly Action ActionNotImplemented = new Action(_ => { throw new NotImplementedException(); }); private static Task Success(HttpContext context) { @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Builder.Extensions return Task.FromResult(null); } - private static void UseSuccess(IBuilder app) + private static void UseSuccess(IApplicationBuilder app) { app.Run(Success); } @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Builder.Extensions throw new NotImplementedException(); } - private static void UseNotImplemented(IBuilder app) + private static void UseNotImplemented(IApplicationBuilder app) { app.Run(NotImplemented); } @@ -41,8 +41,8 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void NullArguments_ArgumentNullException() { - var builder = new Builder(serviceProvider: null); - var noMiddleware = new Builder(serviceProvider: null).Build(); + var builder = new ApplicationBuilder(serviceProvider: null); + var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapOptions(); // TODO: [NotNull] Assert.Throws(() => builder.Map(null, ActionNotImplemented)); // TODO: [NotNull] Assert.Throws(() => builder.Map("/foo", (Action)null)); @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMatchFunc_BranchTaken(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -82,7 +82,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMatchAction_BranchTaken(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); var app = builder.Build(); app.Invoke(context).Wait(); @@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new Builder(serviceProvider: null).Map(matchPath, map => { }).Build()); + Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); } [Theory] @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMismatchFunc_PassedThrough(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PathMismatchAction_PassedThrough(string matchPath, string basePath, string requestPath) { HttpContext context = CreateRequest(basePath, requestPath); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -148,7 +148,7 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void ChainedRoutes_Success() { - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.Map("/route1", map => { map.Map((string)"/subroute1", UseSuccess); diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index eb8ee8be9c..c5016f3064 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Builder.Extensions return Task.FromResult(null); } - private static void UseSuccess(IBuilder app) + private static void UseSuccess(IApplicationBuilder app) { app.Run(Success); } @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Builder.Extensions throw new NotImplementedException(); } - private static void UseNotImplemented(IBuilder app) + private static void UseNotImplemented(IApplicationBuilder app) { app.Run(NotImplemented); } @@ -64,8 +64,8 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void NullArguments_ArgumentNullException() { - var builder = new Builder(serviceProvider: null); - var noMiddleware = new Builder(serviceProvider: null).Build(); + var builder = new ApplicationBuilder(serviceProvider: null); + var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapWhenOptions(); // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, (Action)null)); @@ -82,7 +82,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateTrue_BranchTaken() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(TruePredicate, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateTrueAction_BranchTaken() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(TruePredicate, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -106,7 +106,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateFalseAction_PassThrough() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(FalsePredicate, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateAsyncTrueAction_BranchTaken() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhenAsync(TruePredicateAsync, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -131,7 +131,7 @@ namespace Microsoft.AspNet.Builder.Extensions public void PredicateAsyncFalseAction_PassThrough() { HttpContext context = CreateRequest(); - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhenAsync(FalsePredicateAsync, UseNotImplemented); builder.Run(Success); var app = builder.Build(); @@ -143,7 +143,7 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void ChainedPredicates_Success() { - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhen(TruePredicate, map1 => { map1.MapWhen((Predicate)FalsePredicate, UseNotImplemented); @@ -160,7 +160,7 @@ namespace Microsoft.AspNet.Builder.Extensions [Fact] public void ChainedPredicatesAsync_Success() { - IBuilder builder = new Builder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: null); builder.MapWhenAsync(TruePredicateAsync, map1 => { map1.MapWhenAsync((PredicateAsync)FalsePredicateAsync, UseNotImplemented); diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs similarity index 89% rename from test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs rename to test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs index 1fab0f3938..755eee5f76 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/BuilderTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs @@ -6,12 +6,12 @@ using Xunit; namespace Microsoft.AspNet.Builder.Tests { - public class BuilderTests + public class ApplicationBuilderTests { [Fact] public void BuildReturnsCallableDelegate() { - var builder = new Builder(null); + var builder = new ApplicationBuilder(null); var app = builder.Build(); var mockHttpContext = new Moq.Mock(); From 64455620a02bcf972e729a3f78f4716cbf033b90 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 10 Sep 2014 12:31:50 -0700 Subject: [PATCH 0279/1838] React to renaming TargetFramework to RuntimeFramework --- .../TestApplicationEnvironment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs index a81d1da0e8..de715c253c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.TestHost get { return "Test"; } } - public FrameworkName TargetFramework + public FrameworkName RuntimeFramework { get { return new FrameworkName(".NETFramework", new Version(4, 5)); } } From 547d77778e7f28a70cec96655a760c80035f257b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 11 Sep 2014 10:06:46 -0700 Subject: [PATCH 0280/1838] Reacting to System.Text.Encoding package version change --- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 796736153e..ea2ee32856 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -24,7 +24,7 @@ "System.Runtime.InteropServices": "4.0.20.0", "System.Security.Claims": "1.0.0-*", "System.Security.Principal" : "4.0.0.0", - "System.Text.Encoding": "4.0.20.0", + "System.Text.Encoding": "4.0.10.0", "System.Threading.Tasks": "4.0.10.0" } } From 8a66871139d19b999c4bd07f2f14685c141119cb Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 11 Sep 2014 12:32:24 -0700 Subject: [PATCH 0281/1838] #71 - Create IHostingEnvironment. --- .../HostingEnvironment.cs | 12 ++++++++ .../{Utilities.cs => HostingUtilities.cs} | 19 +++++++++++- .../IHostingEnvironment.cs | 15 ++++++++++ src/Microsoft.AspNet.Hosting/Program.cs | 26 ++++++++--------- .../Server/ServerManager.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 1 + src/Microsoft.AspNet.TestHost/TestServer.cs | 29 +++++++++++-------- .../HostingUtilitiesTests.cs | 17 +++++++++++ .../project.json | 3 +- .../TestServerTests.cs | 12 ++++++++ .../project.json | 3 +- 11 files changed, 110 insertions(+), 29 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/HostingEnvironment.cs rename src/Microsoft.AspNet.Hosting/{Utilities.cs => HostingUtilities.cs} (66%) create mode 100644 src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs new file mode 100644 index 0000000000..3881faa333 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting +{ + public class HostingEnvironment : IHostingEnvironment + { + public string EnvironmentName { get; set; } + + public string WebRoot { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Utilities.cs b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs similarity index 66% rename from src/Microsoft.AspNet.Hosting/Utilities.cs rename to src/Microsoft.AspNet.Hosting/HostingUtilities.cs index c1795d0ab1..873fd87f8c 100644 --- a/src/Microsoft.AspNet.Hosting/Utilities.cs +++ b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs @@ -16,10 +16,12 @@ // permissions and limitations under the License. using System; +using System.IO; +using Microsoft.Framework.ConfigurationModel; namespace Microsoft.AspNet.Hosting { - internal static class Utilities + public static class HostingUtilities { internal static Tuple SplitTypeName(string identifier) { @@ -33,5 +35,20 @@ namespace Microsoft.AspNet.Hosting } return new Tuple(typeName, assemblyName); } + + public static string GetWebRoot(string applicationBasePath) + { + try + { + var config = new Configuration(); + config.AddJsonFile(Path.Combine(applicationBasePath, "project.json")); + var webroot = config.Get("webroot") ?? string.Empty; + return Path.GetFullPath(Path.Combine(applicationBasePath, webroot)); + } + catch (Exception) + { + return applicationBasePath; + } + } } } diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs new file mode 100644 index 0000000000..d510d0ba23 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + [AssemblyNeutral] + public interface IHostingEnvironment + { + string EnvironmentName { get; } + + string WebRoot { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index b1f694e018..6afeacd0ee 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -29,6 +29,8 @@ namespace Microsoft.AspNet.Hosting public class Program { private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini"; + private const string DefaultEnvironmentName = "Development"; + private const string EnvironmentKey = "KRE_ENV"; private readonly IServiceProvider _serviceProvider; @@ -47,33 +49,31 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); + var appEnv = _serviceProvider.GetService(); + + var hostingEnv = new HostingEnvironment() + { + EnvironmentName = config.Get(EnvironmentKey) ?? DefaultEnvironmentName, + WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath), + }; + var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); + serviceCollection.AddInstance(hostingEnv); var services = serviceCollection.BuildServiceProvider(_serviceProvider); - var appEnvironment = _serviceProvider.GetService(); - var context = new HostingContext() { Services = services, Configuration = config, ServerName = config.Get("server"), // TODO: Key names ApplicationName = config.Get("app") // TODO: Key names - ?? appEnvironment.ApplicationName, - EnvironmentName = config.Get("env") ?? "Development" + ?? appEnv.ApplicationName, + EnvironmentName = hostingEnv.EnvironmentName, }; var engine = services.GetService(); - if (engine == null) - { - throw new Exception("TODO: IHostingEngine service not available exception"); - } - var appShutdownService = _serviceProvider.GetService(); - if (appShutdownService == null) - { - throw new Exception("TODO: IApplicationShutdown service not available"); - } var shutdownHandle = new ManualResetEvent(false); var serverShutdown = engine.Start(context); diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index 899e695fc0..726e6746cc 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Hosting.Server throw new ArgumentException(string.Empty, "serverFactoryIdentifier"); } - var nameParts = Utilities.SplitTypeName(serverFactoryIdentifier); + var nameParts = HostingUtilities.SplitTypeName(serverFactoryIdentifier); string typeName = nameParts.Item1; string assemblyName = nameParts.Item2; diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 34fc3ef4fe..de0e1d5305 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,6 +6,7 @@ "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index e1e3ac37dd..dee516dd2d 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -17,7 +17,8 @@ namespace Microsoft.AspNet.TestHost { public class TestServer : IServerFactory, IDisposable { - private static readonly string ServerName = typeof(TestServer).FullName; + private const string DefaultEnvironmentName = "Development"; + private const string ServerName = nameof(TestServer); private static readonly ServerInformation ServerInfo = new ServerInformation(); private Func _appDelegate; private IDisposable _appInstance; @@ -25,15 +26,11 @@ namespace Microsoft.AspNet.TestHost public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { - var env = serviceProvider.GetService(); - if (env == null) - { - throw new ArgumentException("IApplicationEnvironment couldn't be resolved.", "serviceProvider"); - } + var appEnv = serviceProvider.GetService(); HostingContext hostContext = new HostingContext() { - ApplicationName = env.ApplicationName, + ApplicationName = appEnv.ApplicationName, Configuration = config, ServerFactory = this, Services = serviceProvider, @@ -51,14 +48,22 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(IServiceProvider provider, Action app) { + var appEnv = provider.GetService(); + + var hostingEnv = new HostingEnvironment() + { + EnvironmentName = DefaultEnvironmentName, + WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath), + }; + var collection = new ServiceCollection(); - var hostingServices = HostingServices.GetDefaultServices(); + collection.Add(HostingServices.GetDefaultServices()); + collection.AddInstance(hostingEnv); + + var appServices = collection.BuildServiceProvider(provider); var config = new Configuration(); - collection.Add(hostingServices); - - var serviceProvider = collection.BuildServiceProvider(provider); - return new TestServer(config, serviceProvider, app); + return new TestServer(config, appServices, app); } public HttpMessageHandler CreateHandler() diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs new file mode 100644 index 0000000000..08daee6c9b --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class HostingUtilitiesTests + { + [Fact] + public void ReadWebRootFromProjectJson() + { + var root = HostingUtilities.GetWebRoot("."); + Assert.True(root.EndsWith("testroot")); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 7ec2873fb0..2233a0fa4c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -13,5 +13,6 @@ }, "commands": { "test": "Xunit.KRunner" - } + }, + "webroot" : "testroot" } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 2a5ee973d2..025d3a7a21 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -2,10 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using System.Net; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; @@ -54,6 +56,16 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("CreateInvokesApp", result); } + [Fact] + public void WebRootCanBeResolvedFromProjectJson() + { + TestServer server = TestServer.Create(app => + { + var env = app.ApplicationServices.GetService(); + Assert.Equal(Path.GetFullPath("testroot"), env.WebRoot); + }); + } + [Fact] public async Task DisposeStreamIgnored() { diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 61635fd5d9..d071d1486b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -14,5 +14,6 @@ "System.Runtime": "" } } - } + }, + "webroot" : "testroot" } From 0bfe3c14db560f79d1bfe151db4363dc97c06733 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 10 Sep 2014 08:54:27 -0700 Subject: [PATCH 0282/1838] Port AuthProperties.AllowRefresh from Katana. --- .../Security/AuthenticationProperties.cs | 35 +++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index 6a6fb4fadf..afb9aca66a 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -17,6 +17,7 @@ namespace Microsoft.AspNet.Http.Security internal const string ExpiresUtcKey = ".expires"; internal const string IsPersistentKey = ".persistent"; internal const string RedirectUriKey = ".redirect"; + internal const string RefreshKey = ".refresh"; internal const string UtcDateTimeFormat = "r"; /// @@ -160,5 +161,39 @@ namespace Microsoft.AspNet.Http.Security } } } + + /// + /// Gets or sets if refreshing the authentication session should be allowed. + /// + public bool? AllowRefresh + { + get + { + string value; + if (Dictionary.TryGetValue(RefreshKey, out value)) + { + bool refresh; + if (bool.TryParse(value, out refresh)) + { + return refresh; + } + } + return null; + } + set + { + if (value.HasValue) + { + Dictionary[RefreshKey] = value.Value.ToString(); + } + else + { + if (Dictionary.ContainsKey(RefreshKey)) + { + Dictionary.Remove(RefreshKey); + } + } + } + } } } From 3811f47b23f05fd85ef4693d13381e285e79d647 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 15 Sep 2014 09:13:27 -0700 Subject: [PATCH 0283/1838] Use out var syntax. --- .../Security/AuthenticationProperties.cs | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index afb9aca66a..1ba80d02a6 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -75,8 +75,7 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; + return Dictionary.TryGetValue(RedirectUriKey, out var value) ? value : null; } set { @@ -101,11 +100,9 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - if (Dictionary.TryGetValue(IssuedUtcKey, out value)) + if (Dictionary.TryGetValue(IssuedUtcKey, out var value)) { - DateTimeOffset dateTimeOffset; - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) { return dateTimeOffset; } @@ -135,11 +132,9 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) + if (Dictionary.TryGetValue(ExpiresUtcKey, out var value)) { - DateTimeOffset dateTimeOffset; - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) { return dateTimeOffset; } @@ -169,11 +164,9 @@ namespace Microsoft.AspNet.Http.Security { get { - string value; - if (Dictionary.TryGetValue(RefreshKey, out value)) + if (Dictionary.TryGetValue(RefreshKey, out var value)) { - bool refresh; - if (bool.TryParse(value, out refresh)) + if (bool.TryParse(value, out var refresh)) { return refresh; } From c47d6d0c78520ec04c1e5b5cc35ee2afb851e5c2 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 15 Sep 2014 14:54:56 -0700 Subject: [PATCH 0284/1838] #74 - Parse the project.json file with Newtonsoft directly. --- .../HostingUtilities.cs | 23 +++++++++++-------- src/Microsoft.AspNet.Hosting/project.json | 4 ++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs index 873fd87f8c..2f1eeb6826 100644 --- a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs @@ -17,7 +17,8 @@ using System; using System.IO; -using Microsoft.Framework.ConfigurationModel; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; namespace Microsoft.AspNet.Hosting { @@ -38,17 +39,19 @@ namespace Microsoft.AspNet.Hosting public static string GetWebRoot(string applicationBasePath) { - try + var webroot = applicationBasePath; + using (var stream = File.OpenRead(Path.Combine(applicationBasePath, "project.json"))) { - var config = new Configuration(); - config.AddJsonFile(Path.Combine(applicationBasePath, "project.json")); - var webroot = config.Get("webroot") ?? string.Empty; - return Path.GetFullPath(Path.Combine(applicationBasePath, webroot)); - } - catch (Exception) - { - return applicationBasePath; + using (var reader = new JsonTextReader(new StreamReader(stream))) + { + var project = JObject.Load(reader); + if (project.TryGetValue("webroot", out var token)) + { + webroot = Path.Combine(applicationBasePath, token.ToString()); + } + } } + return Path.GetFullPath(webroot); } } } diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index de0e1d5305..bcf21cbd0b 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,10 +6,10 @@ "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel.Json": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Newtonsoft.Json": "6.0.4" }, "frameworks": { "aspnet50": {}, From ae0a44a0e1a15d7e013dc48fe0b0c87926e5cfb7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 17 Sep 2014 09:57:44 -0700 Subject: [PATCH 0285/1838] Updating release NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From d61b6835498be7484ea9bd33423238f66eba2d41 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 17 Sep 2014 09:57:46 -0700 Subject: [PATCH 0286/1838] Updating dev NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 425e2c55274744df7b5d83a39da4a1e0da916852 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 17 Sep 2014 09:57:51 -0700 Subject: [PATCH 0287/1838] Updating release NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..1ce6b9e257 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From 0c6dd83ac27d661f057db8460837605e99ebadca Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 17 Sep 2014 09:57:53 -0700 Subject: [PATCH 0288/1838] Updating dev NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index 1ce6b9e257..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + From c2934912af7667947c43c94599fead54eb0cf9fe Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 16 Sep 2014 10:30:45 -0700 Subject: [PATCH 0289/1838] #121 - Make the query parsing API public. --- .../Infrastructure/ParsingHelpers.cs | 16 ----- .../QueryFeature.cs | 3 +- .../ParsingHelpers.cs | 17 +++++ .../QueryHelpers.cs | 11 ++++ .../QueryHelpersTests.cs | 64 +++++++++++++++++++ 5 files changed, 94 insertions(+), 17 deletions(-) create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index f1db7fe748..10c9ef3672 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -795,22 +795,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } }; - private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; - - internal static IDictionary GetQuery(string queryString) - { - if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') - { - queryString = queryString.Substring(1); - } - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); - return accumulator.ToDictionary( - item => item.Key, - item => item.Value.ToArray(), - StringComparer.OrdinalIgnoreCase); - } - internal static string GetJoinedValue(IDictionary store, string key) { string[] values = GetUnmodifiedValues(store, key); diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index ab5ea5157a..5106808d03 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -6,6 +6,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.WebUtilities; using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore @@ -45,7 +46,7 @@ namespace Microsoft.AspNet.PipelineCore if (_query == null || _queryString != queryString) { _queryString = queryString; - _query = new ReadableStringCollection(ParsingHelpers.GetQuery(queryString)); + _query = QueryHelpers.ParseQuery(queryString); } return _query; } diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs index e5dbd65a9c..79f9d22ebd 100644 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.WebUtilities.Collections; @@ -90,5 +91,21 @@ namespace Microsoft.AspNet.WebUtilities string[] values; return store.TryGetValue(key, out values) ? values : null; } + + private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; + + internal static IReadableStringCollection GetQuery(string queryString) + { + if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } + var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); + return new ReadableStringCollection(accumulator.ToDictionary( + item => item.Key, + item => item.Value.ToArray(), + StringComparer.OrdinalIgnoreCase)); + } } } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index d31a250fdb..f54ff50dea 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.WebUtilities { @@ -43,5 +44,15 @@ namespace Microsoft.AspNet.WebUtilities } return sb.ToString(); } + + /// + /// Parse a query string into its component key and value parts. + /// + /// The raw query string value, with or without the leading '?'. + /// A collection of parsed keys and values. + public static IReadableStringCollection ParseQuery(string text) + { + return ParsingHelpers.GetQuery(text); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs new file mode 100644 index 0000000000..3c81820e3e --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class QueryHelperTests + { + [Fact] + public void ParseQueryWithUniqueKeysWorks() + { + var collection = QueryHelpers.ParseQuery("?key1=value1&key2=value2"); + Assert.Equal(2, collection.Count); + Assert.Equal("value1", collection["key1"]); + Assert.Equal("value2", collection["key2"]); + } + + [Fact] + public void ParseQueryWithoutQuestionmarkWorks() + { + var collection = QueryHelpers.ParseQuery("key1=value1&key2=value2"); + Assert.Equal(2, collection.Count); + Assert.Equal("value1", collection["key1"]); + Assert.Equal("value2", collection["key2"]); + } + + [Fact] + public void ParseQueryWithDuplicateKeysGroups() + { + var collection = QueryHelpers.ParseQuery("?key1=valueA&key2=valueB&key1=valueC"); + Assert.Equal(2, collection.Count); + Assert.Equal("valueA,valueC", collection["key1"]); + Assert.Equal("valueB", collection["key2"]); + } + + [Fact] + public void ParseQueryWithSemicolonWorks() + { + var collection = QueryHelpers.ParseQuery("?key1=value1;key2=value2"); + Assert.Equal(2, collection.Count); + Assert.Equal("value1", collection["key1"]); + Assert.Equal("value2", collection["key2"]); + } + + [Fact] + public void ParseQueryWithEmptyValuesWorks() + { + var collection = QueryHelpers.ParseQuery("?key1=;key2="); + Assert.Equal(2, collection.Count); + Assert.Equal(string.Empty, collection["key1"]); + Assert.Equal(string.Empty, collection["key2"]); + } + + [Fact] + public void ParseQueryWithEmptyKeyWorks() + { + var collection = QueryHelpers.ParseQuery("?=value1;="); + Assert.Equal(1, collection.Count); + Assert.Equal("value1,", collection[""]); + } + } +} \ No newline at end of file From 38e085e3eff7165a2b63970726aa1c9f6e4e468a Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 1 Oct 2014 14:26:20 -0700 Subject: [PATCH 0290/1838] Removing out var usage --- .../Security/AuthenticationProperties.cs | 21 ++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs index 1ba80d02a6..afb9aca66a 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs @@ -75,7 +75,8 @@ namespace Microsoft.AspNet.Http.Security { get { - return Dictionary.TryGetValue(RedirectUriKey, out var value) ? value : null; + string value; + return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; } set { @@ -100,9 +101,11 @@ namespace Microsoft.AspNet.Http.Security { get { - if (Dictionary.TryGetValue(IssuedUtcKey, out var value)) + string value; + if (Dictionary.TryGetValue(IssuedUtcKey, out value)) { - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) { return dateTimeOffset; } @@ -132,9 +135,11 @@ namespace Microsoft.AspNet.Http.Security { get { - if (Dictionary.TryGetValue(ExpiresUtcKey, out var value)) + string value; + if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) { - if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out var dateTimeOffset)) + DateTimeOffset dateTimeOffset; + if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) { return dateTimeOffset; } @@ -164,9 +169,11 @@ namespace Microsoft.AspNet.Http.Security { get { - if (Dictionary.TryGetValue(RefreshKey, out var value)) + string value; + if (Dictionary.TryGetValue(RefreshKey, out value)) { - if (bool.TryParse(value, out var refresh)) + bool refresh; + if (bool.TryParse(value, out refresh)) { return refresh; } From 7574378d37891d1be753f99e79ccead0dc3c5788 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 1 Oct 2014 14:45:04 -0700 Subject: [PATCH 0291/1838] Removing declaration expressions --- src/Microsoft.AspNet.Hosting/HostingUtilities.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs index 2f1eeb6826..946e3c9613 100644 --- a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs @@ -45,7 +45,8 @@ namespace Microsoft.AspNet.Hosting using (var reader = new JsonTextReader(new StreamReader(stream))) { var project = JObject.Load(reader); - if (project.TryGetValue("webroot", out var token)) + JToken token; + if (project.TryGetValue("webroot", out token)) { webroot = Path.Combine(applicationBasePath, token.ToString()); } From 07ccfe880bc2933a9e1c87e797469a95f83a4268 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 5 Oct 2014 04:59:24 -0700 Subject: [PATCH 0292/1838] Fixup references --- src/Microsoft.AspNet.Hosting/project.json | 58 +++++++++---------- src/Microsoft.AspNet.TestHost/project.json | 46 ++++++++------- .../project.json | 28 ++++----- .../project.json | 30 +++++----- 4 files changed, 79 insertions(+), 83 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index bcf21cbd0b..143ab70d0f 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,32 +1,32 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", - "Newtonsoft.Json": "6.0.4" - }, - "frameworks": { - "aspnet50": {}, - "aspnetcore50": { - "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Console": "4.0.0.0", - "System.Diagnostics.Debug": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" - } + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", + "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, + "Newtonsoft.Json": "6.0.4" + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Collections": "4.0.10.0", + "System.ComponentModel": "4.0.0.0", + "System.Console": "4.0.0.0", + "System.Diagnostics.Debug": "4.0.10.0", + "System.IO": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0" + } + } } - } } diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 53b6d1f466..0364f0bf2c 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,25 +1,29 @@ { - "version" : "1.0.0-*", - "dependencies": { - "Microsoft.AspNet.Hosting": "", - "System.Net.Http": "4.0.0.0" - }, - "frameworks": { - "aspnet50": { }, - "aspnetcore50" : { - "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.Serialization.Primitives": "4.0.0.0", - "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0", - "System.Threading.Thread": "4.0.0.0" + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*" + }, + "frameworks": { + "aspnet50": { + "frameworkAssemblies": { + "System.Net.Http": "4.0.0.0" + } + }, + "aspnetcore50": { + "dependencies": { + "System.Collections": "4.0.10.0", + "System.ComponentModel": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Reflection": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.Serialization.Primitives": "4.0.0.0", + "System.Threading": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0", + "System.Threading.Thread": "4.0.0.0", + "System.Net.Http": "4.0.0.0" + } } } - } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 2233a0fa4c..5c8c65cacf 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,18 +1,14 @@ { - "dependencies": { - "Microsoft.AspNet.Hosting": "", - "Microsoft.AspNet.RequestContainer": "", - "Xunit.KRunner": "1.0.0-*" - }, - "frameworks": { - "aspnet50": { - "dependencies": { - "System.Runtime" : "" - } - } - }, - "commands": { - "test": "Xunit.KRunner" - }, - "webroot" : "testroot" + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*", + "Microsoft.AspNet.RequestContainer": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" + }, + "frameworks": { + "aspnet50": { } + }, + "commands": { + "test": "Xunit.KRunner" + }, + "webroot": "testroot" } diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index d071d1486b..b9d539b2fa 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,19 +1,15 @@ { - "dependencies": { - "Microsoft.AspNet.Hosting": "", - "Microsoft.AspNet.TestHost": "", - "Microsoft.Framework.Runtime.Interfaces":"1.0.0-*", - "Xunit.KRunner": "1.0.0-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "frameworks": { - "aspnet50": { - "dependencies": { - "System.Runtime": "" - } - } - }, - "webroot" : "testroot" + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*", + "Microsoft.AspNet.TestHost": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "aspnet50": { } + }, + "webroot": "testroot" } From 20de1d0597fa8a12887f5478b7c4f54cc0d10b4b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 5 Oct 2014 05:08:07 -0700 Subject: [PATCH 0293/1838] Fix up references --- .../project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 54 +++++++++---------- .../project.json | 8 +-- .../project.json | 9 ++-- .../project.json | 11 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 9 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 13 +++-- .../project.json | 37 ++++++------- .../project.json | 24 ++++----- 9 files changed, 80 insertions(+), 87 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index ebdbd9b391..b19b3871c4 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "" + "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks" : { "aspnet50" : { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 3959a57492..4bd0555d65 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,30 +1,30 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.PipelineCore": "", - "Microsoft.AspNet.HttpFeature": "" - }, - "frameworks": { - "aspnet50": { }, - "aspnetcore50": { - "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Net.Primitives": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", - "System.Security.Claims": "1.0.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0.0", - "System.Security.Principal" : "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" - } + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" } + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Collections": "4.0.10.0", + "System.ComponentModel": "4.0.0.0", + "System.Diagnostics.Tools": "4.0.0.0", + "System.Globalization": "4.0.10.0", + "System.IO": "4.0.10.0", + "System.Linq": "4.0.0.0", + "System.Net.Primitives": "4.0.10.0", + "System.Runtime": "4.0.20.0", + "System.Runtime.Extensions": "4.0.10.0", + "System.Runtime.InteropServices": "4.0.20.0", + "System.Security.Claims": "1.0.0-*", + "System.Security.Cryptography.X509Certificates": "4.0.0.0", + "System.Security.Principal": "4.0.0.0", + "System.Threading.Tasks": "4.0.10.0" + } + } } - } } diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index ea2ee32856..41392e7cec 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -2,10 +2,10 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.WebUtilities": "" + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*" }, "frameworks": { "aspnet50": {}, diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 0140f1b937..bf587219ea 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { @@ -11,8 +11,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index da1a1aee7f..1e7c64bbe6 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,9 +1,9 @@ { "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.Http.Extensions": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { @@ -12,8 +12,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index eb6a78191d..e85c177c16 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,8 +1,8 @@ { "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, @@ -12,8 +12,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index dec714b7e4..9893f86030 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,10 +1,10 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.Owin": "", - "Microsoft.AspNet.PipelineCore": "", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { @@ -13,8 +13,7 @@ "frameworks": { "aspnet50": { "dependencies": { - "Shouldly": "1.1.1.1", - "System.Runtime": "" + "Shouldly": "1.1.1.1" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index d1179f1b2b..3eb49d4bed 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -1,21 +1,22 @@ { - "dependencies": { - "Microsoft.AspNet.FeatureModel": "", - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.HttpFeature": "", - "Microsoft.AspNet.PipelineCore": "", - "Xunit.KRunner": "1.0.0-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "frameworks": { - "aspnet50": { - "dependencies": { - "Moq": "4.2.1312.1622", - "System.Net.Http": "", - "System.Runtime": "" - } + "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "aspnet50": { + "dependencies": { + "Moq": "4.2.1312.1622" + }, + "frameworkAssemblies": { + "System.Net.Http": "4.0.0.0" + } + } } - } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index f20bb8d0b0..868b37110c 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,17 +1,13 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "", - "Microsoft.AspNet.WebUtilities": "", - "Xunit.KRunner": "1.0.0-*" - }, - "commands": { - "test": "Xunit.KRunner" - }, - "frameworks": { - "aspnet50": { - "dependencies": { - "System.Runtime": "" - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Xunit.KRunner": "1.0.0-*" + }, + "commands": { + "test": "Xunit.KRunner" + }, + "frameworks": { + "aspnet50": { } } - } } From 78cb314dd2073516d2337d94adae01f10e06d2c2 Mon Sep 17 00:00:00 2001 From: shhsu Date: Mon, 6 Oct 2014 09:28:18 -0700 Subject: [PATCH 0294/1838] Activator change requires TypeActivator to be singlton --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index ec932efaff..a90b3232bc 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Hosting yield return describer.Transient(); yield return describer.Transient(); - yield return describer.Transient(); + yield return describer.Singleton(); yield return describer.Instance(new ApplicationLifetime()); From 53eea70c067e47763f3cbf3f9039116f77ed62fa Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 3 Oct 2014 18:23:50 -0700 Subject: [PATCH 0295/1838] Startup: Call ConfigureServices if exists --- .../Startup/StartupLoader.cs | 118 +++++++++++------- src/Microsoft.AspNet.Hosting/project.json | 1 + .../Fakes/FakeOptions.cs | 25 ++++ .../Fakes/Startup.cs | 34 +++++ .../Fakes/StartupNoServices.cs | 34 +++++ .../StartupManagerTests.cs | 46 +++++++ 6 files changed, 214 insertions(+), 44 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index cce003a648..c87a47cafc 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -20,8 +20,9 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Hosting.Startup { @@ -38,6 +39,66 @@ namespace Microsoft.AspNet.Hosting.Startup _next = next; } + private MethodInfo FindMethod(Type startupType, string methodName, string environmentName, Type returnType = null, bool required = true) + { + var methodNameWithEnv = methodName + environmentName; + var methodInfo = startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithEnv) + ?? startupType.GetTypeInfo().GetDeclaredMethod(methodName); + if (methodInfo == null) + { + if (required) + { + throw new Exception(string.Format("TODO: {0} or {1} method not found", + methodNameWithEnv, + methodName)); + + } + return null; + } + + if (returnType != null && methodInfo.ReturnType != returnType) + { + throw new Exception(string.Format("TODO: {0} method does not return " + returnType.Name, + methodInfo.Name)); + } + + return methodInfo; + } + + private void Invoke(MethodInfo methodInfo, object instance, IApplicationBuilder builder, IServiceCollection services = null) + { + var parameterInfos = methodInfo.GetParameters(); + var parameters = new object[parameterInfos.Length]; + for (var index = 0; index != parameterInfos.Length; ++index) + { + var parameterInfo = parameterInfos[index]; + if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) + { + parameters[index] = builder; + } + else if (services != null && parameterInfo.ParameterType == typeof(IServiceCollection)) + { + parameters[index] = services; + } + else + { + try + { + parameters[index] = _services.GetService(parameterInfo.ParameterType); + } + catch (Exception) + { + throw new Exception(string.Format( + "TODO: Unable to resolve service for {0} method {1} {2}", + methodInfo.Name, + parameterInfo.Name, + parameterInfo.ParameterType.FullName)); + } + } + } + methodInfo.Invoke(instance, parameters); + } + public Action LoadStartup( string applicationName, string environmentName, @@ -81,65 +142,34 @@ namespace Microsoft.AspNet.Hosting.Startup if (type == null) { - throw new Exception(String.Format("TODO: {0} or {1} class not found in assembly {2}", + throw new Exception(String.Format("TODO: {0} or {1} class not found in assembly {2}", startupName1, startupName2, applicationName)); } - var configureMethod1 = "Configure" + environmentName; - var configureMethod2 = "Configure"; - var methodInfo = type.GetTypeInfo().GetDeclaredMethod(configureMethod1); - if (methodInfo == null) - { - methodInfo = type.GetTypeInfo().GetDeclaredMethod(configureMethod2); - } - if (methodInfo == null) - { - throw new Exception(string.Format("TODO: {0} or {1} method not found", - configureMethod1, - configureMethod2)); - } - - if (methodInfo.ReturnType != typeof(void)) - { - throw new Exception(string.Format("TODO: {0} method isn't void-returning.", - methodInfo.Name)); - } + var configureMethod = FindMethod(type, "Configure", environmentName, typeof(void), required: true); + // TODO: accept IServiceProvider method as well? + var servicesMethod = FindMethod(type, "ConfigureServices", environmentName, typeof(void), required: false); object instance = null; - if (!methodInfo.IsStatic) + if (!configureMethod.IsStatic || (servicesMethod != null && !servicesMethod.IsStatic)) { instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); } - return builder => { - var parameterInfos = methodInfo.GetParameters(); - var parameters = new object[parameterInfos.Length]; - for (var index = 0; index != parameterInfos.Length; ++index) + if (servicesMethod != null) { - var parameterInfo = parameterInfos[index]; - if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) + var services = new ServiceCollection(); + services.Add(OptionsServices.GetDefaultServices()); + Invoke(servicesMethod, instance, builder, services); + if (builder != null) { - parameters[index] = builder; - } - else - { - try - { - parameters[index] = _services.GetService(parameterInfo.ParameterType); - } - catch (Exception ex) - { - throw new Exception(string.Format( - "TODO: Unable to resolve service for startup method {0} {1}", - parameterInfo.Name, - parameterInfo.ParameterType.FullName)); - } + builder.ApplicationServices = services.BuildServiceProvider(builder.ApplicationServices); } } - methodInfo.Invoke(instance, parameters); + Invoke(configureMethod, instance, builder); }; } } diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 143ab70d0f..3bc77a7eb6 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -8,6 +8,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, "Newtonsoft.Json": "6.0.4" }, diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs new file mode 100644 index 0000000000..6d6d2c0982 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class FakeOptions + { + public bool Configured { get; set; } + public string Environment { get; set; } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index fb05a63b60..1421544258 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -17,6 +17,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { @@ -26,6 +27,39 @@ namespace Microsoft.AspNet.Hosting.Fakes { } + public void ConfigureServices(IServiceCollection services) + { + services.ConfigureOptions(o => o.Configured = true); + } + + public void ConfigureServicesDev(IServiceCollection services) + { + services.ConfigureOptions(o => + { + o.Configured = true; + o.Environment = "Dev"; + }); + } + + public void ConfigureServicesRetail(IServiceCollection services) + { + services.ConfigureOptions(o => + { + o.Configured = true; + o.Environment = "Retail"; + }); + } + + public static void ConfigureServicesStatic(IServiceCollection services) + { + services.ConfigureOptions(o => + { + o.Configured = true; + o.Environment = "Static"; + }); + } + + public void Configure(IApplicationBuilder builder) { } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs new file mode 100644 index 0000000000..24a329073a --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Open Technologies, Inc. +// All Rights Reserved +// +// 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 +// +// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR +// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING +// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF +// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR +// NON-INFRINGEMENT. +// See the Apache 2 License for the specific language governing +// permissions and limitations under the License. + +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupNoServices + { + public StartupNoServices() + { + } + + public void Configure(IApplicationBuilder builder) + { + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 6684a56205..97248b78c6 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -21,6 +21,9 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Xunit; +using Microsoft.Framework.OptionsModel; +using Microsoft.AspNet.Builder; +using System; namespace Microsoft.AspNet.Hosting { @@ -46,6 +49,49 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(2, _configurationMethodCalledList.Count); } + [Theory] + [InlineData(null)] + [InlineData("Dev")] + [InlineData("Retail")] + [InlineData("Static")] + public void StartupClassAddsConfigureServicesToApplicationServices(string environment) + { + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var services = serviceCollection.BuildServiceProvider(); + var manager = services.GetService(); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", environment ?? ""); + + var app = new ApplicationBuilder(services); + + startup.Invoke(app); + + var options = app.ApplicationServices.GetService>().Options; + Assert.NotNull(options); + Assert.True(options.Configured); + Assert.Equal(environment, options.Environment); + } + + [Fact] + public void StartupClassDoesNotRegisterOptionsWithNoConfigureServices() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + serviceCollection.AddInstance(this); + var services = serviceCollection.BuildServiceProvider(); + var manager = services.GetService(); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "NoServices"); + + var app = new ApplicationBuilder(services); + + startup.Invoke(app); + + var ex = Assert.Throws(() => app.ApplicationServices.GetService>()); + Assert.True(ex.Message.Contains("No service for type 'Microsoft.Framework.OptionsModel.IOptionsAccessor")); + } + public void ConfigurationMethodCalled(object instance) { _configurationMethodCalledList.Add(instance); From f5577c589ef7a7f82fe2842860e5ca936689320d Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 8 Oct 2014 14:25:59 -0700 Subject: [PATCH 0296/1838] #130 - Remove semi-colon support from query parsing. --- src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs | 6 +++--- .../QueryHelpersTests.cs | 13 ++----------- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs index 79f9d22ebd..257b206c6b 100644 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs @@ -68,7 +68,7 @@ namespace Microsoft.AspNet.WebUtilities { IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, new[] { '&' }, AppendItemCallback, accumulator); + ParseDelimited(text, Ampersand, AppendItemCallback, accumulator); foreach (var kv in accumulator) { form.Add(kv.Key, kv.Value.ToArray()); @@ -92,7 +92,7 @@ namespace Microsoft.AspNet.WebUtilities return store.TryGetValue(key, out values) ? values : null; } - private static readonly char[] AmpersandAndSemicolon = new[] { '&', ';' }; + private static readonly char[] Ampersand = new[] { '&' }; internal static IReadableStringCollection GetQuery(string queryString) { @@ -101,7 +101,7 @@ namespace Microsoft.AspNet.WebUtilities queryString = queryString.Substring(1); } var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(queryString, AmpersandAndSemicolon, AppendItemCallback, accumulator); + ParseDelimited(queryString, Ampersand, AppendItemCallback, accumulator); return new ReadableStringCollection(accumulator.ToDictionary( item => item.Key, item => item.Value.ToArray(), diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index 3c81820e3e..fea33d497a 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -35,19 +35,10 @@ namespace Microsoft.AspNet.WebUtilities Assert.Equal("valueB", collection["key2"]); } - [Fact] - public void ParseQueryWithSemicolonWorks() - { - var collection = QueryHelpers.ParseQuery("?key1=value1;key2=value2"); - Assert.Equal(2, collection.Count); - Assert.Equal("value1", collection["key1"]); - Assert.Equal("value2", collection["key2"]); - } - [Fact] public void ParseQueryWithEmptyValuesWorks() { - var collection = QueryHelpers.ParseQuery("?key1=;key2="); + var collection = QueryHelpers.ParseQuery("?key1=&key2="); Assert.Equal(2, collection.Count); Assert.Equal(string.Empty, collection["key1"]); Assert.Equal(string.Empty, collection["key2"]); @@ -56,7 +47,7 @@ namespace Microsoft.AspNet.WebUtilities [Fact] public void ParseQueryWithEmptyKeyWorks() { - var collection = QueryHelpers.ParseQuery("?=value1;="); + var collection = QueryHelpers.ParseQuery("?=value1&="); Assert.Equal(1, collection.Count); Assert.Equal("value1,", collection[""]); } From da102032b5dd3e4f8acaee1412a1ff38a87ad871 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 8 Oct 2014 19:28:37 -0700 Subject: [PATCH 0297/1838] Reacting to Dependency Injection changes --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index a90b3232bc..ed8ac10442 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -54,12 +54,7 @@ namespace Microsoft.AspNet.Hosting // TODO: Do we expect this to be provide by the runtime eventually? yield return describer.Singleton(); - yield return new ServiceDescriptor - { - ServiceType = typeof(IContextAccessor<>), - ImplementationType = typeof(ContextAccessor<>), - Lifecycle = LifecycleKind.Scoped - }; + yield return describer.Scoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); if (PlatformHelper.IsMono) { From 684aaed9bdade5c44964ab5ef89427c28463f39a Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 8 Oct 2014 13:23:12 -0700 Subject: [PATCH 0298/1838] Cleanup headers --- .../Builder/ApplicationBuilderFactory.cs | 18 ++--------------- .../Builder/HttpContextFactory.cs | 19 ++---------------- .../Builder/IApplicationBuilderFactory.cs | 18 ++--------------- .../Builder/IHttpContextFactory.cs | 18 ++--------------- .../HostingContext.cs | 18 ++--------------- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 18 ++--------------- .../HostingServices.cs | 19 ++---------------- .../HostingUtilities.cs | 18 ++--------------- .../IHostingEngine.cs | 18 ++--------------- .../PipelineInstance.cs | 18 ++--------------- .../PlatformHelper.cs | 18 ++--------------- src/Microsoft.AspNet.Hosting/Program.cs | 18 ++--------------- .../Server/IServerFactory.cs | 18 ++--------------- .../Server/IServerManager.cs | 18 ++--------------- .../Server/ServerManager.cs | 18 ++--------------- .../Startup/IStartupLoader.cs | 19 ++---------------- .../Startup/IStartupLoaderProvider.cs | 18 ++--------------- .../Startup/IStartupManager.cs | 18 ++--------------- .../Startup/NullStartupLoader.cs | 18 ++--------------- .../Startup/StartupLoader.cs | 18 ++--------------- .../Startup/StartupLoaderProvider.cs | 18 ++--------------- .../Startup/StartupManager.cs | 18 ++--------------- .../WebApplication.cs | 18 ++--------------- .../ContainerExtensions.cs | 18 ++--------------- .../ContainerMiddleware.cs | 18 ++--------------- .../Fakes/FakeOptions.cs | 18 ++--------------- .../Fakes/IFakeStartupCallback.cs | 18 ++--------------- .../Fakes/Startup.cs | 20 ++----------------- .../Fakes/StartupNoServices.cs | 20 ++----------------- .../Fakes/StartupWithServices.cs | 19 ++---------------- .../HostingEngineTests.cs | 18 ++--------------- .../StartupManagerTests.cs | 18 ++--------------- .../UseServicesFacts.cs | 5 ++++- 33 files changed, 68 insertions(+), 521 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs index 7b17e587f8..7bf1f59c23 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Builder; diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 288dea101d..1b01ed6b17 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -1,23 +1,8 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.PipelineCore; namespace Microsoft.AspNet.Hosting.Builder diff --git a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs index dd60b0693a..45194717bc 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs index 6621c4b605..cdd6be9fac 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index b3bc2e550c..e7ddd9b863 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Builder; diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 7f75c88e5e..f7642f14f8 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading; diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index ed8ac10442..6bedf61f50 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -1,21 +1,6 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; diff --git a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs index 946e3c9613..5b90b251a2 100644 --- a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/HostingUtilities.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.IO; diff --git a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs index 324e9beba8..ba6c74ecd1 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index ec3a8f5284..2efe3d6b24 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs index 0581162444..1309a18786 100644 --- a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs +++ b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 6afeacd0ee..d96fb4f131 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.IO; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs index 0b75dbe5e9..94cb26ece7 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs index 169ce54cf5..92aa79dfd2 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Server { diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs index 726e6746cc..d59cb979fc 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Linq; diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index faba106da5..24667a0c42 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -1,24 +1,9 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs index 3a2f9561c2..a134f501e5 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs index 8cdd089054..15932fb21b 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.AspNet.Builder; diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs index c40983087a..ae672d4598 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index c87a47cafc..fd4756cb54 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs index a5e962786e..22cfe0872a 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs index cc722eafb5..8f7249899f 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index ccd679476d..b891a0b5a7 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.Framework.DependencyInjection; diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 3ae3541481..7a6f2bd54f 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 518eac189c..706b14294a 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; #if ASPNET50 diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs index 6d6d2c0982..d3c7ee2b0b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs index 708dac5281..5a5ca0341b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 1421544258..2fa43ea158 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -1,22 +1,7 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes @@ -59,7 +44,6 @@ namespace Microsoft.AspNet.Hosting.Fakes }); } - public void Configure(IApplicationBuilder builder) { } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs index 24a329073a..16e73e3d9c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs @@ -1,23 +1,7 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs index c13ec7eb7f..c7d4050481 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs @@ -1,22 +1,7 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 6091c7ae12..6f79dc1eab 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 97248b78c6..9771926b7a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -1,19 +1,5 @@ -// Copyright (c) Microsoft Open Technologies, Inc. -// All Rights Reserved -// -// 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 -// -// THIS CODE IS PROVIDED *AS IS* BASIS, WITHOUT WARRANTIES OR -// CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING -// WITHOUT LIMITATION ANY IMPLIED WARRANTIES OR CONDITIONS OF -// TITLE, FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABLITY OR -// NON-INFRINGEMENT. -// See the Apache 2 License for the specific language governing -// permissions and limitations under the License. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.AspNet.Hosting.Fakes; diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs index 3da2beebdb..5e67d5bd4e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -1,4 +1,7 @@ -using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; From babb296f35c3784b0b11dc702c230803e5e1a150 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 9 Oct 2014 14:05:59 -0700 Subject: [PATCH 0299/1838] Rename UseServices -> UsePerRequestServices --- .../ContainerExtensions.cs | 14 +++++++------- .../UseServicesFacts.cs | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 7a6f2bd54f..5494e86edc 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -31,33 +31,33 @@ namespace Microsoft.AspNet.Builder }); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder) + public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder) { return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IServiceProvider applicationServices) + public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, IServiceProvider applicationServices) { builder.ApplicationServices = applicationServices; return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IEnumerable applicationServices) + public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, IEnumerable applicationServices) { - return builder.UseServices(services => services.Add(applicationServices)); + return builder.UsePerRequestServices(services => services.Add(applicationServices)); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Action configureServices) + public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, Action configureServices) { - return builder.UseServices(serviceCollection => + return builder.UsePerRequestServices(serviceCollection => { configureServices(serviceCollection); return serviceCollection.BuildServiceProvider(builder.ApplicationServices); }); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) + public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, Func configureServices) { var serviceCollection = new ServiceCollection(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs index 5e67d5bd4e..2dae3babea 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Hosting.Tests var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); var builder = new ApplicationBuilder(baseServiceProvider); - builder.UseServices(serviceCollection => { }); + builder.UsePerRequestServices(serviceCollection => { }); var optionsAccessor = builder.ApplicationServices.GetService>(); Assert.NotNull(optionsAccessor); @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Hosting.Tests var builder = new ApplicationBuilder(baseServiceProvider); IServiceProvider serviceProvider = null; - builder.UseServices(serviceCollection => + builder.UsePerRequestServices(serviceCollection => { serviceProvider = serviceCollection.BuildServiceProvider(builder.ApplicationServices); return serviceProvider; From e094c1a71d0e71ca842092e793bd2a8999c1baff Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 10 Oct 2014 10:32:44 -0700 Subject: [PATCH 0300/1838] Reacting to CLR package versioning changes --- src/Microsoft.AspNet.Hosting/project.json | 22 ++++++++-------- .../project.json | 22 ++++++++-------- src/Microsoft.AspNet.TestHost/project.json | 26 +++++++++---------- 3 files changed, 35 insertions(+), 35 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 3bc77a7eb6..562e25d619 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -16,17 +16,17 @@ "aspnet50": { }, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Console": "4.0.0.0", - "System.Diagnostics.Debug": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Console": "4.0.0-beta-*", + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Threading": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index d381b0bb3d..2f81f60c6c 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -9,17 +9,17 @@ "aspnet50": {}, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Debug": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Reflection.Extensions": "4.0.0.0", - "System.Reflection.TypeExtensions": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Reflection.Extensions": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Threading": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 0364f0bf2c..97cfef7de5 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -6,23 +6,23 @@ "frameworks": { "aspnet50": { "frameworkAssemblies": { - "System.Net.Http": "4.0.0.0" + "System.Net.Http": "4.0.0-beta-*" } }, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.Serialization.Primitives": "4.0.0.0", - "System.Threading": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0", - "System.Threading.Thread": "4.0.0.0", - "System.Net.Http": "4.0.0.0" + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.Serialization.Primitives": "4.0.0-beta-*", + "System.Threading": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*", + "System.Threading.Thread": "4.0.0-beta-*", + "System.Net.Http": "4.0.0-beta-*" } } } From dc04ff843cb35e4a917258efd93c0a97ae51fa8b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 10 Oct 2014 10:32:48 -0700 Subject: [PATCH 0301/1838] Reacting to CLR package versioning changes --- .../project.json | 14 +++++----- .../project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 24 ++++++++--------- src/Microsoft.AspNet.HttpFeature/project.json | 14 +++++----- src/Microsoft.AspNet.Owin/project.json | 26 +++++++++---------- .../project.json | 26 +++++++++---------- .../project.json | 2 +- .../project.json | 2 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 1c37fbed40..595978bef8 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -5,13 +5,13 @@ "aspnet50": {}, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Reflection": "4.0.10.0", - "System.Reflection.TypeExtensions": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.20.0", - "System.Threading": "4.0.0.0" + "System.Collections": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Threading": "4.0.0-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index b19b3871c4..e4d49e2085 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -8,7 +8,7 @@ }, "aspnetcore50" : { "dependencies": { - "System.Runtime": "4.0.20.0" + "System.Runtime": "4.0.20-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 4e4141ca40..fa763b1edb 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,19 +6,19 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.Globalization.Extensions": "4.0.0.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Principal" : "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Principal" : "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 0c685167ae..2706610f3e 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -5,14 +5,14 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.IO": "4.0.10.0", - "System.Net.Primitives": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.IO": "4.0.10-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0.0", - "System.Security.Principal": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 4bd0555d65..d1104b22ac 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -10,20 +10,20 @@ "aspnet50": { }, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Net.Primitives": "4.0.10.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Cryptography.X509Certificates": "4.0.0.0", - "System.Security.Principal": "4.0.0.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 41392e7cec..a2b0abf71f 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -12,20 +12,20 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10.0", - "System.ComponentModel": "4.0.0.0", - "System.Diagnostics.Debug": "4.0.10.0", - "System.Diagnostics.Tools": "4.0.0.0", - "System.Globalization": "4.0.10.0", - "System.IO": "4.0.10.0", - "System.Linq": "4.0.0.0", - "System.Runtime": "4.0.20.0", - "System.Runtime.Extensions": "4.0.10.0", - "System.Runtime.InteropServices": "4.0.20.0", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "1.0.0-*", - "System.Security.Principal" : "4.0.0.0", - "System.Text.Encoding": "4.0.10.0", - "System.Threading.Tasks": "4.0.10.0" + "System.Security.Principal" : "4.0.0-beta-*", + "System.Text.Encoding": "4.0.10-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index e4f394f360..fcb9fea61d 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -7,7 +7,7 @@ "aspnet50": {}, "aspnetcore50": { "dependencies": { - "System.Runtime": "4.0.20.0" + "System.Runtime": "4.0.20-beta-*" } } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 3eb49d4bed..a175d93546 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -15,7 +15,7 @@ "Moq": "4.2.1312.1622" }, "frameworkAssemblies": { - "System.Net.Http": "4.0.0.0" + "System.Net.Http": "4.0.0-beta-*" } } } From fafc191d056c8f163e8c01c5638b370d06db720c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 10 Oct 2014 10:57:58 -0700 Subject: [PATCH 0302/1838] Removing version from framework assemblies node --- src/Microsoft.AspNet.TestHost/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 97cfef7de5..69ffdf1d4e 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -6,7 +6,7 @@ "frameworks": { "aspnet50": { "frameworkAssemblies": { - "System.Net.Http": "4.0.0-beta-*" + "System.Net.Http": "" } }, "aspnetcore50": { From 821e13a1a7526b719a2c680e742781b36cfd4b02 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 10 Oct 2014 12:13:58 -0700 Subject: [PATCH 0303/1838] Update Hosting to account for DataProtection API changes. --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 6bedf61f50..dbf5c26adc 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -41,19 +41,9 @@ namespace Microsoft.AspNet.Hosting yield return describer.Scoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); - if (PlatformHelper.IsMono) + foreach (var service in DataProtectionServices.GetDefaultServices()) { -#if ASPNET50 - yield return describer.Instance(DataProtectionProvider.CreateFromLegacyDpapi()); -#endif - } - else - { - // The default IDataProtectionProvider is a singleton. - // Note: DPAPI isn't usable in IIS where the user profile hasn't been loaded, but loading DPAPI - // is deferred until the first call to Protect / Unprotect. It's up to an IIS-based host to - // replace this service as part of application initialization. - yield return describer.Instance(DataProtectionProvider.CreateFromDpapi()); + yield return service; } } } From 0d27849c143531d1f3399fe64de8352eac96a2cb Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 10 Oct 2014 12:19:24 -0700 Subject: [PATCH 0304/1838] Removing version token from framework assemblies node --- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index a175d93546..1c3bc620fe 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -15,7 +15,7 @@ "Moq": "4.2.1312.1622" }, "frameworkAssemblies": { - "System.Net.Http": "4.0.0-beta-*" + "System.Net.Http": "" } } } From c859c3dad51ff751ee07d20c8f148bccc292d36f Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 10 Oct 2014 12:27:14 -0700 Subject: [PATCH 0305/1838] Skip failing test due to DataProtection changes. --- test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 9771926b7a..d84773ad76 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -59,7 +59,7 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(environment, options.Environment); } - [Fact] + [Fact(Skip = "DataProtection registers default Options services; need to figure out what to do with this test.")] public void StartupClassDoesNotRegisterOptionsWithNoConfigureServices() { var serviceCollection = new ServiceCollection(); From ebe4948a3eb9106d3a8da0252c1cc9b53203f70d Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 10 Oct 2014 15:00:09 -0700 Subject: [PATCH 0306/1838] Add a discriminator so that DataProtection doesn't use the same subkey across apps by default. --- src/Microsoft.AspNet.Hosting/Program.cs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index d96fb4f131..801041bdc0 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; @@ -46,6 +47,14 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); serviceCollection.AddInstance(hostingEnv); + // The application name is a "good enough" mechanism to identify this application + // on the machine and to prevent subkeys from being shared across multiple applications + // by default. + serviceCollection.ConfigureOptions(options => + { + options.ApplicationDiscriminator = appEnv.ApplicationName; + }); + var services = serviceCollection.BuildServiceProvider(_serviceProvider); var context = new HostingContext() From 0f2b9b3701eab7e4bb651b4e95b04354828e0a93 Mon Sep 17 00:00:00 2001 From: Levi B Date: Mon, 13 Oct 2014 17:09:52 -0700 Subject: [PATCH 0307/1838] Add Base64UrlEncode / Base64UrlDecode. --- .../WebEncoders.cs | 183 ++++++++++++++++++ .../project.json | 23 +-- .../WebEncodersTests.cs | 78 ++++++++ 3 files changed, 273 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/WebEncoders.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs new file mode 100644 index 0000000000..f73c3c249f --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// Contains utility APIs to assist with common encoding and decoding operations. + /// + public static class WebEncoders + { + /// + /// Decodes a base64url-encoded string. + /// + /// The base64url-encoded input to decode. + /// The base64url-decoded form of the input. + /// + /// The input must not contain any whitespace or padding characters. + /// Throws FormatException if the input is malformed. + /// + public static byte[] Base64UrlDecode([NotNull] string input) + { + return Base64UrlDecode(input, 0, input.Length); + } + + /// + /// Decodes a base64url-encoded substring of a given string. + /// + /// A string containing the base64url-encoded input to decode. + /// The position in at which decoding should begin. + /// The number of characters in to decode. + /// The base64url-decoded form of the input. + /// + /// The input must not contain any whitespace or padding characters. + /// Throws FormatException if the input is malformed. + /// + public static byte[] Base64UrlDecode([NotNull] string input, int offset, int count) + { + ValidateParameters(input.Length, offset, count); + + // Assumption: input is base64url encoded without padding and contains no whitespace. + + // First, we need to add the padding characters back. + int numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + char[] completeBase64Array = new char[checked(count + numPaddingCharsToAdd)]; + Debug.Assert(completeBase64Array.Length % 4 == 0, "Invariant: Array length must be a multiple of 4."); + input.CopyTo(offset, completeBase64Array, 0, count); + for (int i = 1; i <= numPaddingCharsToAdd; i++) + { + completeBase64Array[completeBase64Array.Length - i] = '='; + } + + // Next, fix up '-' -> '+' and '_' -> '/' + for (int i = 0; i < completeBase64Array.Length; i++) + { + char c = completeBase64Array[i]; + if (c == '-') + { + completeBase64Array[i] = '+'; + } + else if (c == '_') + { + completeBase64Array[i] = '/'; + } + } + + // Finally, decode. + // If the caller provided invalid base64 chars, they'll be caught here. + return Convert.FromBase64CharArray(completeBase64Array, 0, completeBase64Array.Length); + } + + /// + /// Encodes an input using base64url encoding. + /// + /// The binary input to encode. + /// The base64url-encoded form of the input. + public static string Base64UrlEncode([NotNull] byte[] input) + { + return Base64UrlEncode(input, 0, input.Length); + } + + /// + /// Encodes an input using base64url encoding. + /// + /// The binary input to encode. + /// The offset into at which to begin encoding. + /// The number of bytes of to encode. + /// The base64url-encoded form of the input. + public static string Base64UrlEncode([NotNull] byte[] input, int offset, int count) + { + ValidateParameters(input.Length, offset, count); + + // Special-case empty input + if (count == 0) + { + return String.Empty; + } + + // We're going to use base64url encoding with no padding characters. + // See RFC 4648, Sec. 5. + char[] buffer = new char[GetNumBase64CharsRequiredForInput(count)]; + int numBase64Chars = Convert.ToBase64CharArray(input, offset, count, buffer, 0); + + // Fix up '+' -> '-' and '/' -> '_' + for (int i = 0; i < numBase64Chars; i++) + { + char ch = buffer[i]; + if (ch == '+') + { + buffer[i] = '-'; + } + else if (ch == '/') + { + buffer[i] = '_'; + } + else if (ch == '=') + { + // We've reached a padding character: truncate the string from this point + return new String(buffer, 0, i); + } + } + + // If we got this far, the buffer didn't contain any padding chars, so turn + // it directly into a string. + return new String(buffer, 0, numBase64Chars); + } + + private static int GetNumBase64CharsRequiredForInput(int inputLength) + { + int numWholeOrPartialInputBlocks = checked(inputLength + 2) / 3; + return checked(numWholeOrPartialInputBlocks * 4); + } + + private static int GetNumBase64PaddingCharsInString(string str) + { + // Assumption: input contains a well-formed base64 string with no whitespace. + + // base64 guaranteed have 0 - 2 padding characters. + if (str[str.Length - 1] == '=') + { + if (str[str.Length - 2] == '=') + { + return 2; + } + return 1; + } + return 0; + } + + private static int GetNumBase64PaddingCharsToAddForDecode(int inputLength) + { + switch (inputLength % 4) + { + case 0: + return 0; + case 2: + return 2; + case 3: + return 1; + default: + throw new FormatException("TODO: Malformed input."); + } + } + + private static void ValidateParameters(int bufferLength, int offset, int count) + { + if (offset < 0) + { + throw new ArgumentOutOfRangeException("offset"); + } + if (count < 0) + { + throw new ArgumentOutOfRangeException("count"); + } + if (bufferLength - offset < count) + { + throw new ArgumentException("Invalid offset / length."); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index fcb9fea61d..74757f774a 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,14 +1,15 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" - }, - "frameworks": { - "aspnet50": {}, - "aspnetcore50": { - "dependencies": { - "System.Runtime": "4.0.20-beta-*" - } + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*" + } + } } - } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs new file mode 100644 index 0000000000..9813a780c3 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs @@ -0,0 +1,78 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class WebEncodersTests + { + [Theory] + [InlineData("", 1, 0)] + [InlineData("", 0, 1)] + [InlineData("0123456789", 9, 2)] + [InlineData("0123456789", Int32.MaxValue, 2)] + [InlineData("0123456789", 9, -1)] + public void Base64UrlDecode_BadOffsets(string input, int offset, int count) + { + // Act & assert + Assert.ThrowsAny(() => + { + var retVal = WebEncoders.Base64UrlDecode(input, offset, count); + }); + } + + [Theory] + [InlineData("x")] + [InlineData("(x)")] + public void Base64UrlDecode_MalformedInput(string input) + { + // Act & assert + Assert.Throws(() => + { + var retVal = WebEncoders.Base64UrlDecode(input); + }); + } + + [Theory] + [InlineData("", "")] + [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] + [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] + [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] + public void Base64UrlEncode_And_Decode(string base64Input, string expectedBase64Url) + { + // Arrange + byte[] input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); + + // Act & assert - 1 + string actualBase64Url = WebEncoders.Base64UrlEncode(input, 3, input.Length - 5); // also helps test offsets + Assert.Equal(expectedBase64Url, actualBase64Url); + + // Act & assert - 2 + // Verify that values round-trip + byte[] roundTripped = WebEncoders.Base64UrlDecode("xx" + actualBase64Url + "yyy", 2, actualBase64Url.Length); // also helps test offsets + string roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); + Assert.Equal(roundTrippedAsBase64, base64Input); + } + + [Theory] + [InlineData(0, 1, 0)] + [InlineData(0, 0, 1)] + [InlineData(10, 9, 2)] + [InlineData(10, Int32.MaxValue, 2)] + [InlineData(10, 9, -1)] + public void Base64UrlEncode_BadOffsets(int inputLength, int offset, int count) + { + // Arrange + byte[] input = new byte[inputLength]; + + // Act & assert + Assert.ThrowsAny(() => + { + var retVal = WebEncoders.Base64UrlEncode(input, offset, count); + }); + } + } +} From 6466d1061e6053dcdfc277c1cf59dc02a3a6d8e2 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 14 Oct 2014 19:01:01 -0700 Subject: [PATCH 0308/1838] Use/EnsureRequestServices changes - Split UseServices overloads into UseRequestServices and UseServices - Add RequestServicesContainer class which contains the old ContainerMiddleware logic and exposes a new EnsureRequestServices(HttpContext) method which can be called to populate RequestServices - ConfigureServices now scans for Configure{Env}Services instead of ConfigureServices{Env} - Add OptionsServices as part of default HostingServices --- .../HostingServices.cs | 6 + src/Microsoft.AspNet.Hosting/Program.cs | 2 +- .../Startup/StartupLoader.cs | 12 +- .../ContainerExtensions.cs | 14 +- .../ContainerMiddleware.cs | 28 +--- .../RequestServicesContainer.cs | 142 ++++++++++++++++++ .../Fakes/FakeOptions.cs | 1 + .../Fakes/IFakeService.cs | 8 + .../Fakes/Startup.cs | 16 +- .../Fakes/StartupBoom.cs | 12 ++ .../Fakes/StartupUseServices.cs | 30 ++++ .../Microsoft.AspNet.Hosting.Tests.kproj | 1 + .../StartupManagerTests.cs | 39 +++-- .../UseRequestServicesFacts.cs | 79 ++++++++++ .../UseServicesFacts.cs | 10 +- .../Microsoft.AspNet.TestHost.Tests.kproj | 1 + 16 files changed, 341 insertions(+), 60 deletions(-) create mode 100644 src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index dbf5c26adc..f1ce9b3cd2 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -9,6 +9,7 @@ using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; +using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Hosting { @@ -41,6 +42,11 @@ namespace Microsoft.AspNet.Hosting yield return describer.Scoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); + foreach (var service in OptionsServices.GetDefaultServices()) + { + yield return service; + } + foreach (var service in DataProtectionServices.GetDefaultServices()) { yield return service; diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 801041bdc0..5d83450f4d 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Hosting // The application name is a "good enough" mechanism to identify this application // on the machine and to prevent subkeys from being shared across multiple applications // by default. - serviceCollection.ConfigureOptions(options => + serviceCollection.Configure(options => { options.ApplicationDiscriminator = appEnv.ApplicationName; }); diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index fd4756cb54..7658009466 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.Linq; using System.Reflection; using Microsoft.AspNet.Builder; @@ -27,16 +28,17 @@ namespace Microsoft.AspNet.Hosting.Startup private MethodInfo FindMethod(Type startupType, string methodName, string environmentName, Type returnType = null, bool required = true) { - var methodNameWithEnv = methodName + environmentName; + var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); + var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); var methodInfo = startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithEnv) - ?? startupType.GetTypeInfo().GetDeclaredMethod(methodName); + ?? startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithNoEnv); if (methodInfo == null) { if (required) { throw new Exception(string.Format("TODO: {0} or {1} method not found", methodNameWithEnv, - methodName)); + methodNameWithNoEnv)); } return null; @@ -134,9 +136,9 @@ namespace Microsoft.AspNet.Hosting.Startup applicationName)); } - var configureMethod = FindMethod(type, "Configure", environmentName, typeof(void), required: true); + var configureMethod = FindMethod(type, "Configure{0}", environmentName, typeof(void), required: true); // TODO: accept IServiceProvider method as well? - var servicesMethod = FindMethod(type, "ConfigureServices", environmentName, typeof(void), required: false); + var servicesMethod = FindMethod(type, "Configure{0}Services", environmentName, typeof(void), required: false); object instance = null; if (!configureMethod.IsStatic || (servicesMethod != null && !servicesMethod.IsStatic)) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 5494e86edc..fbd5f08ea4 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -31,33 +31,33 @@ namespace Microsoft.AspNet.Builder }); } - public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder) + public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder) { return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, IServiceProvider applicationServices) + public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder, IServiceProvider applicationServices) { builder.ApplicationServices = applicationServices; return builder.UseMiddleware(typeof(ContainerMiddleware)); } - public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, IEnumerable applicationServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IEnumerable applicationServices) { - return builder.UsePerRequestServices(services => services.Add(applicationServices)); + return builder.UseServices(services => services.Add(applicationServices)); } - public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, Action configureServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Action configureServices) { - return builder.UsePerRequestServices(serviceCollection => + return builder.UseServices(serviceCollection => { configureServices(serviceCollection); return serviceCollection.BuildServiceProvider(builder.ApplicationServices); }); } - public static IApplicationBuilder UsePerRequestServices(this IApplicationBuilder builder, Func configureServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) { var serviceCollection = new ServiceCollection(); diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 706b14294a..3c1e5e52c9 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -49,7 +49,7 @@ namespace Microsoft.AspNet.RequestContainer _rootHttpContextAccessor.SetContextSource(AccessRootHttpContext, ExchangeRootHttpContext); } - private HttpContext AccessRootHttpContext() + internal static HttpContext AccessRootHttpContext() { #if ASPNET50 var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; @@ -59,7 +59,7 @@ namespace Microsoft.AspNet.RequestContainer #endif } - private HttpContext ExchangeRootHttpContext(HttpContext httpContext) + internal static HttpContext ExchangeRootHttpContext(HttpContext httpContext) { #if ASPNET50 var prior = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; @@ -92,29 +92,9 @@ namespace Microsoft.AspNet.RequestContainer appHttpContextAccessor = priorApplicationServices.GetService>(); } - using (var scope = appServiceScopeFactory.CreateScope()) + using (var container = new RequestServicesContainer(httpContext, appServiceScopeFactory, appHttpContextAccessor, appServiceProvider)) { - var scopeServiceProvider = scope.ServiceProvider; - var scopeHttpContextAccessor = scopeServiceProvider.GetService>(); - - httpContext.ApplicationServices = appServiceProvider; - httpContext.RequestServices = scopeServiceProvider; - - var priorAppHttpContext = appHttpContextAccessor.SetValue(httpContext); - var priorScopeHttpContext = scopeHttpContextAccessor.SetValue(httpContext); - - try - { - await _next.Invoke(httpContext); - } - finally - { - scopeHttpContextAccessor.SetValue(priorScopeHttpContext); - appHttpContextAccessor.SetValue(priorAppHttpContext); - - httpContext.RequestServices = priorRequestServices; - httpContext.ApplicationServices = priorApplicationServices; - } + await _next.Invoke(httpContext); } } } diff --git a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs new file mode 100644 index 0000000000..c4bbf142c2 --- /dev/null +++ b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs @@ -0,0 +1,142 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.RequestContainer +{ + public class RequestServicesContainer : IDisposable + { + public RequestServicesContainer( + HttpContext context, + IServiceScopeFactory scopeFactory, + IContextAccessor appContextAccessor, + IServiceProvider appServiceProvider) + { + if (scopeFactory == null) + { + throw new ArgumentNullException(nameof(scopeFactory)); + } + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + if (appContextAccessor == null) + { + throw new ArgumentNullException(nameof(appContextAccessor)); + } + + AppContextAccessor = appContextAccessor; + + Context = context; + PriorAppServices = context.ApplicationServices; + PriorRequestServices = context.RequestServices; + + // Begin the scope + Scope = scopeFactory.CreateScope(); + ScopeContextAccessor = Scope.ServiceProvider.GetService>(); + + Context.ApplicationServices = appServiceProvider; + Context.RequestServices = Scope.ServiceProvider; + + PriorAppHttpContext = AppContextAccessor.SetValue(context); + PriorScopeHttpContext = ScopeContextAccessor.SetValue(context); + } + + private HttpContext Context { get; set; } + private IServiceProvider PriorAppServices { get; set; } + private IServiceProvider PriorRequestServices { get; set; } + private HttpContext PriorAppHttpContext { get; set; } + private HttpContext PriorScopeHttpContext { get; set; } + private IServiceScope Scope { get; set; } + private IContextAccessor ScopeContextAccessor { get; set; } + private IContextAccessor AppContextAccessor { get; set; } + + // CONSIDER: this could be an extension method on HttpContext instead + public static RequestServicesContainer EnsureRequestServices(HttpContext httpContext) + { + // All done if we already have a request services + if (httpContext.RequestServices != null) + { + return null; + } + + if (httpContext.ApplicationServices == null) + { + throw new InvalidOperationException("TODO: httpContext.ApplicationServices is null!"); + } + + // Matches constructor of RequestContainer + var rootServiceProvider = httpContext.ApplicationServices.GetService(); + var rootHttpContextAccessor = httpContext.ApplicationServices.GetService>(); + var rootServiceScopeFactory = httpContext.ApplicationServices.GetService(); + + rootHttpContextAccessor.SetContextSource(ContainerMiddleware.AccessRootHttpContext, ContainerMiddleware.ExchangeRootHttpContext); + + // Pre Scope setup + var priorApplicationServices = httpContext.ApplicationServices; + var priorRequestServices = httpContext.RequestServices; + + var appServiceProvider = rootServiceProvider; + var appServiceScopeFactory = rootServiceScopeFactory; + var appHttpContextAccessor = rootHttpContextAccessor; + + if (priorApplicationServices != null && + priorApplicationServices != appServiceProvider) + { + appServiceProvider = priorApplicationServices; + appServiceScopeFactory = priorApplicationServices.GetService(); + appHttpContextAccessor = priorApplicationServices.GetService>(); + } + + // Creates the scope and does the service swaps + return new RequestServicesContainer(httpContext, appServiceScopeFactory, appHttpContextAccessor, appServiceProvider); + } + + #region IDisposable Support + private bool disposedValue = false; // To detect redundant calls + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + ScopeContextAccessor.SetValue(PriorScopeHttpContext); + AppContextAccessor.SetValue(PriorAppHttpContext); + + Context.RequestServices = PriorRequestServices; + Context.ApplicationServices = PriorAppServices; + } + + if (Scope != null) + { + Scope.Dispose(); + Scope = null; + } + + Context = null; + PriorAppServices = null; + PriorRequestServices = null; + ScopeContextAccessor = null; + AppContextAccessor = null; + PriorAppHttpContext = null; + PriorScopeHttpContext = null; + + disposedValue = true; + } + } + + // This code added to correctly implement the disposable pattern. + public void Dispose() + { + // Do not change this code. Put cleanup code in Dispose(bool disposing) above. + Dispose(true); + } + #endregion + + } + +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs index d3c7ee2b0b..a955ed377e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs @@ -7,5 +7,6 @@ namespace Microsoft.AspNet.Hosting.Fakes { public bool Configured { get; set; } public string Environment { get; set; } + public string Message { get; set; } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs new file mode 100644 index 0000000000..e183e13eb2 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public interface IFakeService { } + public class FakeService : IFakeService { } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 2fa43ea158..6f97e4ceda 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -14,37 +14,37 @@ namespace Microsoft.AspNet.Hosting.Fakes public void ConfigureServices(IServiceCollection services) { - services.ConfigureOptions(o => o.Configured = true); + services.Configure(o => o.Configured = true); } - public void ConfigureServicesDev(IServiceCollection services) + public void ConfigureDevServices(IServiceCollection services) { - services.ConfigureOptions(o => + services.Configure(o => { o.Configured = true; o.Environment = "Dev"; }); } - public void ConfigureServicesRetail(IServiceCollection services) + public void ConfigureRetailServices(IServiceCollection services) { - services.ConfigureOptions(o => + services.Configure(o => { o.Configured = true; o.Environment = "Retail"; }); } - public static void ConfigureServicesStatic(IServiceCollection services) + public static void ConfigureStaticServices(IServiceCollection services) { - services.ConfigureOptions(o => + services.Configure(o => { o.Configured = true; o.Environment = "Static"; }); } - public void Configure(IApplicationBuilder builder) + public virtual void Configure(IApplicationBuilder builder) { } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs new file mode 100644 index 0000000000..6fb647a489 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupBoom + { + public StartupBoom() + { + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs new file mode 100644 index 0000000000..bfd85da550 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupUseServices + { + public StartupUseServices() + { + } + + public void ConfigureUseServicesServices(IServiceCollection services) + { + services.Configure(o => o.Configured = true); + services.AddTransient(); + } + + public void Configure(IApplicationBuilder builder) + { + builder.UseServices(services => + { + services.AddTransient(); + services.Configure(o => o.Message = "Configured"); + }); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index d20ea65b15..0b04b9270d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -16,6 +16,7 @@ 2.0 + 29216 \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index d84773ad76..2d73f17c22 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -53,14 +53,37 @@ namespace Microsoft.AspNet.Hosting startup.Invoke(app); - var options = app.ApplicationServices.GetService>().Options; + var options = app.ApplicationServices.GetService>().Options; Assert.NotNull(options); Assert.True(options.Configured); Assert.Equal(environment, options.Environment); } - [Fact(Skip = "DataProtection registers default Options services; need to figure out what to do with this test.")] - public void StartupClassDoesNotRegisterOptionsWithNoConfigureServices() + [Fact] + public void StartupClassWithConfigureServicesAndUseServicesAddsBothToServices() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var services = serviceCollection.BuildServiceProvider(); + var manager = services.GetService(); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "UseServices"); + + var app = new ApplicationBuilder(services); + + startup.Invoke(app); + + Assert.NotNull(app.ApplicationServices.GetService()); + Assert.NotNull(app.ApplicationServices.GetService()); + + var options = app.ApplicationServices.GetService>().Options; + Assert.NotNull(options); + Assert.Equal("Configured", options.Message); + Assert.False(options.Configured); // REVIEW: why doesn't the ConfigureServices ConfigureOptions get run? + } + + [Fact] + public void StartupWithNoConfigureThrows() { var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices()); @@ -68,14 +91,8 @@ namespace Microsoft.AspNet.Hosting var services = serviceCollection.BuildServiceProvider(); var manager = services.GetService(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "NoServices"); - - var app = new ApplicationBuilder(services); - - startup.Invoke(app); - - var ex = Assert.Throws(() => app.ApplicationServices.GetService>()); - Assert.True(ex.Message.Contains("No service for type 'Microsoft.Framework.OptionsModel.IOptionsAccessor")); + var ex = Assert.Throws(() => manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "Boom")); + Assert.True(ex.Message.Contains("ConfigureBoom or Configure method not found")); } public void ConfigurationMethodCalled(object instance) diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs new file mode 100644 index 0000000000..597c286054 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -0,0 +1,79 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Xunit; +using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.RequestContainer; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class RequestServicesContainerFacts + { + [Fact] + public void RequestServicesAvailableOnlyAfterRequestServices() + { + var baseServiceProvider = new ServiceCollection() + .Add(HostingServices.GetDefaultServices()) + .BuildServiceProvider(); + var builder = new ApplicationBuilder(baseServiceProvider); + + bool foundRequestServicesBefore = false; + builder.Use(next => async c => + { + foundRequestServicesBefore = c.RequestServices != null; + await next.Invoke(c); + }); + builder.UseRequestServices(); + bool foundRequestServicesAfter = false; + builder.Use(next => async c => + { + foundRequestServicesAfter = c.RequestServices != null; + await next.Invoke(c); + }); + + var context = new DefaultHttpContext(); + builder.Build().Invoke(context); + Assert.False(foundRequestServicesBefore); + Assert.True(foundRequestServicesAfter); + } + + [Fact] + public void EnsureRequestServicesSetsRequestServices() + { + var baseServiceProvider = new ServiceCollection() + .Add(HostingServices.GetDefaultServices()) + .BuildServiceProvider(); + var builder = new ApplicationBuilder(baseServiceProvider); + + bool foundRequestServicesBefore = false; + builder.Use(next => async c => + { + foundRequestServicesBefore = c.RequestServices != null; + await next.Invoke(c); + }); + builder.Use(next => async c => + { + using (var container = RequestServicesContainer.EnsureRequestServices(c)) + { + await next.Invoke(c); + } + }); + bool foundRequestServicesAfter = false; + builder.Use(next => async c => + { + foundRequestServicesAfter = c.RequestServices != null; + await next.Invoke(c); + }); + + var context = new DefaultHttpContext(); + context.ApplicationServices = baseServiceProvider; + builder.Build().Invoke(context); + Assert.False(foundRequestServicesBefore); + Assert.True(foundRequestServicesAfter); + } + + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs index 2dae3babea..f32a45af49 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -7,6 +7,8 @@ using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.OptionsModel; using Xunit; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.PipelineCore; namespace Microsoft.AspNet.Hosting.Tests { @@ -18,9 +20,9 @@ namespace Microsoft.AspNet.Hosting.Tests var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); var builder = new ApplicationBuilder(baseServiceProvider); - builder.UsePerRequestServices(serviceCollection => { }); + builder.UseServices(serviceCollection => { }); - var optionsAccessor = builder.ApplicationServices.GetService>(); + var optionsAccessor = builder.ApplicationServices.GetService>(); Assert.NotNull(optionsAccessor); } @@ -32,14 +34,14 @@ namespace Microsoft.AspNet.Hosting.Tests var builder = new ApplicationBuilder(baseServiceProvider); IServiceProvider serviceProvider = null; - builder.UsePerRequestServices(serviceCollection => + builder.UseServices(serviceCollection => { serviceProvider = serviceCollection.BuildServiceProvider(builder.ApplicationServices); return serviceProvider; }); Assert.Same(serviceProvider, builder.ApplicationServices); - var optionsAccessor = builder.ApplicationServices.GetService>(); + var optionsAccessor = builder.ApplicationServices.GetService>(); Assert.NotNull(optionsAccessor); } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 777a4d4460..53d92fe14b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -16,6 +16,7 @@ 2.0 + 29215 \ No newline at end of file From 16fee38c957c131bf1fcf86c4135c8d0e3179cc0 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 14 Oct 2014 21:02:33 -0700 Subject: [PATCH 0309/1838] Handle null httpContext.ApplicationServices --- .../RequestServicesContainer.cs | 18 ++++++++++-------- .../UseRequestServicesFacts.cs | 13 +++++++++---- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs index c4bbf142c2..921cfcc425 100644 --- a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.RequestContainer private IContextAccessor AppContextAccessor { get; set; } // CONSIDER: this could be an extension method on HttpContext instead - public static RequestServicesContainer EnsureRequestServices(HttpContext httpContext) + public static RequestServicesContainer EnsureRequestServices(HttpContext httpContext, IServiceProvider services) { // All done if we already have a request services if (httpContext.RequestServices != null) @@ -63,21 +63,23 @@ namespace Microsoft.AspNet.RequestContainer return null; } - if (httpContext.ApplicationServices == null) + var serviceProvider = httpContext.ApplicationServices ?? services; + + if (serviceProvider == null) { - throw new InvalidOperationException("TODO: httpContext.ApplicationServices is null!"); + throw new InvalidOperationException("TODO: services and httpContext.ApplicationServices are both null!"); } // Matches constructor of RequestContainer - var rootServiceProvider = httpContext.ApplicationServices.GetService(); - var rootHttpContextAccessor = httpContext.ApplicationServices.GetService>(); - var rootServiceScopeFactory = httpContext.ApplicationServices.GetService(); + var rootServiceProvider = serviceProvider.GetService(); + var rootHttpContextAccessor = serviceProvider.GetService>(); + var rootServiceScopeFactory = serviceProvider.GetService(); rootHttpContextAccessor.SetContextSource(ContainerMiddleware.AccessRootHttpContext, ContainerMiddleware.ExchangeRootHttpContext); // Pre Scope setup - var priorApplicationServices = httpContext.ApplicationServices; - var priorRequestServices = httpContext.RequestServices; + var priorApplicationServices = serviceProvider; + var priorRequestServices = serviceProvider; var appServiceProvider = rootServiceProvider; var appServiceScopeFactory = rootServiceScopeFactory; diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 597c286054..1229df1bb4 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -40,8 +40,10 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.True(foundRequestServicesAfter); } - [Fact] - public void EnsureRequestServicesSetsRequestServices() + [Theory] + [InlineData(true)] + [InlineData(false)] + public void EnsureRequestServicesSetsRequestServices(bool initializeApplicationServices) { var baseServiceProvider = new ServiceCollection() .Add(HostingServices.GetDefaultServices()) @@ -56,7 +58,7 @@ namespace Microsoft.AspNet.Hosting.Tests }); builder.Use(next => async c => { - using (var container = RequestServicesContainer.EnsureRequestServices(c)) + using (var container = RequestServicesContainer.EnsureRequestServices(c, baseServiceProvider)) { await next.Invoke(c); } @@ -69,7 +71,10 @@ namespace Microsoft.AspNet.Hosting.Tests }); var context = new DefaultHttpContext(); - context.ApplicationServices = baseServiceProvider; + if (initializeApplicationServices) + { + context.ApplicationServices = baseServiceProvider; + } builder.Build().Invoke(context); Assert.False(foundRequestServicesBefore); Assert.True(foundRequestServicesAfter); From 8bd068f4a6ff2693e95eefec51a2fb63dab3e01d Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 09:39:12 -0700 Subject: [PATCH 0310/1838] Move UseMiddleware from RequestContainer to Http.Extensions. --- .../UseMiddlewareExtensions.cs | 29 +++++++++++++++++++ .../project.json | 6 +++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs new file mode 100644 index 0000000000..bea600af4b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Reflection; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Builder +{ + public static class UseMiddlewareExtensions + { + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) + { + return builder.UseMiddleware(typeof(T), args); + } + + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) + { + return builder.Use(next => + { + var typeActivator = builder.ApplicationServices.GetService(); + var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); + return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); + }); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index e4d49e2085..d8391b0906 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,13 +1,17 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*" }, "frameworks" : { "aspnet50" : { }, "aspnetcore50" : { "dependencies": { + "System.Reflection": "4.0.10-beta-*", + "System.Reflection.Extensions": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } } From 33dd087e0ff07ca8f685a82f31ed931e331048ea Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 15:35:29 -0700 Subject: [PATCH 0311/1838] Move UseMiddleware from RequestContainer to Http.Extensions. --- .../ContainerExtensions.cs | 25 +++---------------- .../project.json | 5 +--- 2 files changed, 4 insertions(+), 26 deletions(-) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index fbd5f08ea4..fe822f5820 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -3,8 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Reflection; using Microsoft.AspNet.RequestContainer; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; @@ -14,33 +12,16 @@ namespace Microsoft.AspNet.Builder { public static class ContainerExtensions { - public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) - { - return builder.UseMiddleware(typeof(T), args); - } - - public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) - { - // TODO: move this ext method someplace nice - return builder.Use(next => - { - var typeActivator = builder.ApplicationServices.GetService(); - var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); - var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); - return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); - }); - } - public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder) { - return builder.UseMiddleware(typeof(ContainerMiddleware)); + return builder.UseMiddleware(); } public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder, IServiceProvider applicationServices) { builder.ApplicationServices = applicationServices; - return builder.UseMiddleware(typeof(ContainerMiddleware)); + return builder.UseMiddleware(); } public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IEnumerable applicationServices) @@ -64,7 +45,7 @@ namespace Microsoft.AspNet.Builder serviceCollection.Add(OptionsServices.GetDefaultServices()); builder.ApplicationServices = configureServices(serviceCollection); - return builder.UseMiddleware(typeof(ContainerMiddleware)); + return builder.UseMiddleware(); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 2f81f60c6c..fc73a32d6a 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*" }, @@ -12,10 +13,6 @@ "System.Collections": "4.0.10-beta-*", "System.ComponentModel": "4.0.0-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Reflection.Extensions": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Threading": "4.0.0-beta-*", From 4efa6a428b0872820e70e086813cf891212f1469 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 16 Oct 2014 11:44:52 -0700 Subject: [PATCH 0312/1838] Support IServiceProvider ConfigureServices() --- .../Startup/StartupLoader.cs | 38 +++++++++----- .../Fakes/Startup.cs | 49 +++++++++++++++++++ .../StartupManagerTests.cs | 22 +++++++++ 3 files changed, 96 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 7658009466..6e9591949b 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -43,17 +43,19 @@ namespace Microsoft.AspNet.Hosting.Startup } return null; } - if (returnType != null && methodInfo.ReturnType != returnType) { - throw new Exception(string.Format("TODO: {0} method does not return " + returnType.Name, - methodInfo.Name)); + if (required) + { + throw new Exception(string.Format("TODO: {0} method does not return " + returnType.Name, + methodInfo.Name)); + } + return null; } - return methodInfo; } - private void Invoke(MethodInfo methodInfo, object instance, IApplicationBuilder builder, IServiceCollection services = null) + private object Invoke(MethodInfo methodInfo, object instance, IApplicationBuilder builder, IServiceCollection services = null) { var parameterInfos = methodInfo.GetParameters(); var parameters = new object[parameterInfos.Length]; @@ -84,7 +86,7 @@ namespace Microsoft.AspNet.Hosting.Startup } } } - methodInfo.Invoke(instance, parameters); + return methodInfo.Invoke(instance, parameters); } public Action LoadStartup( @@ -137,8 +139,8 @@ namespace Microsoft.AspNet.Hosting.Startup } var configureMethod = FindMethod(type, "Configure{0}", environmentName, typeof(void), required: true); - // TODO: accept IServiceProvider method as well? - var servicesMethod = FindMethod(type, "Configure{0}Services", environmentName, typeof(void), required: false); + var servicesMethod = FindMethod(type, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) + ?? FindMethod(type, "Configure{0}Services", environmentName, typeof(void), required: false); object instance = null; if (!configureMethod.IsStatic || (servicesMethod != null && !servicesMethod.IsStatic)) @@ -149,12 +151,22 @@ namespace Microsoft.AspNet.Hosting.Startup { if (servicesMethod != null) { - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); - Invoke(servicesMethod, instance, builder, services); - if (builder != null) + if (servicesMethod.ReturnType == typeof(IServiceProvider)) { - builder.ApplicationServices = services.BuildServiceProvider(builder.ApplicationServices); + // IServiceProvider ConfigureServices() + builder.ApplicationServices = (Invoke(servicesMethod, instance, builder) as IServiceProvider) + ?? builder.ApplicationServices; + } + else + { + // void ConfigureServices(IServiceCollection) + var services = new ServiceCollection(); + services.Add(OptionsServices.GetDefaultServices()); + Invoke(servicesMethod, instance, builder, services); + if (builder != null) + { + builder.ApplicationServices = services.BuildServiceProvider(builder.ApplicationServices); + } } } Invoke(configureMethod, instance, builder); diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 6f97e4ceda..dab52127bd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -3,6 +3,9 @@ using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.OptionsModel; +using System; namespace Microsoft.AspNet.Hosting.Fakes { @@ -44,6 +47,52 @@ namespace Microsoft.AspNet.Hosting.Fakes }); } + public static IServiceProvider ConfigureStaticProviderServices() + { + var services = new ServiceCollection(); + services.Add(OptionsServices.GetDefaultServices()); + services.Configure(o => + { + o.Configured = true; + o.Environment = "StaticProvider"; + }); + return services.BuildServiceProvider(); + } + + public static IServiceProvider ConfigureFallbackProviderServices(IServiceProvider fallback) + { + return fallback; + } + + public static IServiceProvider ConfigureNullServices() + { + return null; + } + + public IServiceProvider ConfigureProviderServices() + { + var services = new ServiceCollection(); + services.Add(OptionsServices.GetDefaultServices()); + services.Configure(o => + { + o.Configured = true; + o.Environment = "Provider"; + }); + return services.BuildServiceProvider(); + } + + public IServiceProvider ConfigureProviderArgsServices(IApplicationBuilder me) + { + var services = new ServiceCollection(); + services.Add(OptionsServices.GetDefaultServices()); + services.Configure(o => + { + o.Configured = true; + o.Environment = "ProviderArgs"; + }); + return services.BuildServiceProvider(); + } + public virtual void Configure(IApplicationBuilder builder) { } diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 2d73f17c22..6a7527e749 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -40,6 +40,9 @@ namespace Microsoft.AspNet.Hosting [InlineData("Dev")] [InlineData("Retail")] [InlineData("Static")] + [InlineData("StaticProvider")] + [InlineData("Provider")] + [InlineData("ProviderArgs")] public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { var serviceCollection = new ServiceCollection(); @@ -59,6 +62,25 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(environment, options.Environment); } + [Theory] + [InlineData("Null")] + [InlineData("FallbackProvider")] + public void StartupClassConfigureServicesThatFallsbackToApplicationServices(string env) + { + var serviceCollection = new ServiceCollection(); + serviceCollection.Add(HostingServices.GetDefaultServices()); + var services = serviceCollection.BuildServiceProvider(); + var manager = services.GetService(); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", env); + + var app = new ApplicationBuilder(services); + + startup.Invoke(app); + + Assert.Equal(services, app.ApplicationServices); + } + [Fact] public void StartupClassWithConfigureServicesAndUseServicesAddsBothToServices() { From cd90a337eeda518ab47d709c506ba42757746bab Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Thu, 16 Oct 2014 16:20:52 -0700 Subject: [PATCH 0313/1838] Change GetService calls to GetRequiredService GetRequiredService throws for missing services like GetService used to. --- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 6 +++--- .../Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/WebApplication.cs | 2 +- .../ContainerMiddleware.cs | 4 ++-- .../RequestServicesContainer.cs | 12 ++++++------ src/Microsoft.AspNet.TestHost/TestServer.cs | 6 +++--- .../HostingEngineTests.cs | 4 ++-- .../StartupManagerTests.cs | 18 +++++++++--------- .../UseServicesFacts.cs | 4 ++-- .../TestServerTests.cs | 2 +- 11 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index f7642f14f8..4eb09ab00d 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.Hosting InitalizeServerFactory(context); EnsureApplicationDelegate(context); - var applicationLifetime = (ApplicationLifetime)context.Services.GetService(); + var applicationLifetime = (ApplicationLifetime)context.Services.GetRequiredService(); var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate); var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 5d83450f4d..a339fa9de9 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var appEnv = _serviceProvider.GetService(); + var appEnv = _serviceProvider.GetRequiredService(); var hostingEnv = new HostingEnvironment() { @@ -67,8 +67,8 @@ namespace Microsoft.AspNet.Hosting EnvironmentName = hostingEnv.EnvironmentName, }; - var engine = services.GetService(); - var appShutdownService = _serviceProvider.GetService(); + var engine = services.GetRequiredService(); + var appShutdownService = _serviceProvider.GetRequiredService(); var shutdownHandle = new ManualResetEvent(false); var serverShutdown = engine.Start(context); diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 6e9591949b..376ba3a07f 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Hosting.Startup { try { - parameters[index] = _services.GetService(parameterInfo.ParameterType); + parameters[index] = _services.GetRequiredService(parameterInfo.ParameterType); } catch (Exception) { diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index b891a0b5a7..054f90d6d4 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Hosting Services = serviceCollection.BuildServiceProvider() }; - var engine = context.Services.GetService(); + var engine = context.Services.GetRequiredService(); if (engine == null) { throw new Exception("TODO: IHostingEngine service not available exception"); diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 3c1e5e52c9..4145525ab8 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -88,8 +88,8 @@ namespace Microsoft.AspNet.RequestContainer priorApplicationServices != appServiceProvider) { appServiceProvider = priorApplicationServices; - appServiceScopeFactory = priorApplicationServices.GetService(); - appHttpContextAccessor = priorApplicationServices.GetService>(); + appServiceScopeFactory = priorApplicationServices.GetRequiredService(); + appHttpContextAccessor = priorApplicationServices.GetRequiredService>(); } using (var container = new RequestServicesContainer(httpContext, appServiceScopeFactory, appHttpContextAccessor, appServiceProvider)) diff --git a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs index 921cfcc425..a7c646321e 100644 --- a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.RequestContainer // Begin the scope Scope = scopeFactory.CreateScope(); - ScopeContextAccessor = Scope.ServiceProvider.GetService>(); + ScopeContextAccessor = Scope.ServiceProvider.GetRequiredService>(); Context.ApplicationServices = appServiceProvider; Context.RequestServices = Scope.ServiceProvider; @@ -71,9 +71,9 @@ namespace Microsoft.AspNet.RequestContainer } // Matches constructor of RequestContainer - var rootServiceProvider = serviceProvider.GetService(); - var rootHttpContextAccessor = serviceProvider.GetService>(); - var rootServiceScopeFactory = serviceProvider.GetService(); + var rootServiceProvider = serviceProvider.GetRequiredService(); + var rootHttpContextAccessor = serviceProvider.GetRequiredService>(); + var rootServiceScopeFactory = serviceProvider.GetRequiredService(); rootHttpContextAccessor.SetContextSource(ContainerMiddleware.AccessRootHttpContext, ContainerMiddleware.ExchangeRootHttpContext); @@ -89,8 +89,8 @@ namespace Microsoft.AspNet.RequestContainer priorApplicationServices != appServiceProvider) { appServiceProvider = priorApplicationServices; - appServiceScopeFactory = priorApplicationServices.GetService(); - appHttpContextAccessor = priorApplicationServices.GetService>(); + appServiceScopeFactory = priorApplicationServices.GetRequiredService(); + appHttpContextAccessor = priorApplicationServices.GetRequiredService>(); } // Creates the scope and does the service swaps diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index dee516dd2d..977623c3d0 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.TestHost public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { - var appEnv = serviceProvider.GetService(); + var appEnv = serviceProvider.GetRequiredService(); HostingContext hostContext = new HostingContext() { @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.TestHost ApplicationStartup = appStartup }; - var engine = serviceProvider.GetService(); + var engine = serviceProvider.GetRequiredService(); _appInstance = engine.Start(hostContext); } @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(IServiceProvider provider, Action app) { - var appEnv = provider.GetService(); + var appEnv = provider.GetRequiredService(); var hostingEnv = new HostingEnvironment() { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 6f79dc1eab..01ec585067 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Hosting serviceCollection.Add(HostingServices.GetDefaultServices()); var services = serviceCollection.BuildServiceProvider(); - var engine = services.GetService(); + var engine = services.GetRequiredService(); Assert.NotNull(engine); } @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Hosting serviceCollection.Add(HostingServices.GetDefaultServices()); var services = serviceCollection.BuildServiceProvider(); - var engine = services.GetService(); + var engine = services.GetRequiredService(); var context = new HostingContext { diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 6a7527e749..764d0f9ff9 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Hosting serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetService(); + var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithServices"); @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices()); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetService(); + var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", environment ?? ""); @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Hosting startup.Invoke(app); - var options = app.ApplicationServices.GetService>().Options; + var options = app.ApplicationServices.GetRequiredService>().Options; Assert.NotNull(options); Assert.True(options.Configured); Assert.Equal(environment, options.Environment); @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices()); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetService(); + var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", env); @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices()); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetService(); + var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "UseServices"); @@ -95,10 +95,10 @@ namespace Microsoft.AspNet.Hosting startup.Invoke(app); - Assert.NotNull(app.ApplicationServices.GetService()); - Assert.NotNull(app.ApplicationServices.GetService()); + Assert.NotNull(app.ApplicationServices.GetRequiredService()); + Assert.NotNull(app.ApplicationServices.GetRequiredService()); - var options = app.ApplicationServices.GetService>().Options; + var options = app.ApplicationServices.GetRequiredService>().Options; Assert.NotNull(options); Assert.Equal("Configured", options.Message); Assert.False(options.Configured); // REVIEW: why doesn't the ConfigureServices ConfigureOptions get run? @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Hosting serviceCollection.Add(HostingServices.GetDefaultServices()); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetService(); + var manager = services.GetRequiredService(); var ex = Assert.Throws(() => manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "Boom")); Assert.True(ex.Message.Contains("ConfigureBoom or Configure method not found")); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs index f32a45af49..d556e2b4fe 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Hosting.Tests builder.UseServices(serviceCollection => { }); - var optionsAccessor = builder.ApplicationServices.GetService>(); + var optionsAccessor = builder.ApplicationServices.GetRequiredService>(); Assert.NotNull(optionsAccessor); } @@ -41,7 +41,7 @@ namespace Microsoft.AspNet.Hosting.Tests }); Assert.Same(serviceProvider, builder.ApplicationServices); - var optionsAccessor = builder.ApplicationServices.GetService>(); + var optionsAccessor = builder.ApplicationServices.GetRequiredService>(); Assert.NotNull(optionsAccessor); } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 025d3a7a21..8a9bacf97b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.TestHost { TestServer server = TestServer.Create(app => { - var env = app.ApplicationServices.GetService(); + var env = app.ApplicationServices.GetRequiredService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRoot); }); } From dcb710cfbe20b3d8ba0e475245c39b8930461e85 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Oct 2014 09:47:52 -0700 Subject: [PATCH 0314/1838] Update Claims dependency. --- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.HttpFeature/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.PipelineCore/project.json | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index fa763b1edb..60649251d8 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -16,7 +16,7 @@ "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Principal" : "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" } diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index 2706610f3e..d8b391950d 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -9,7 +9,7 @@ "System.Net.Primitives": "4.0.10-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index d1104b22ac..86bc6e3f81 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -20,7 +20,7 @@ "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index a2b0abf71f..955572d6fc 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -22,7 +22,7 @@ "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "1.0.0-*", + "System.Security.Claims": "4.0.0-beta-*", "System.Security.Principal" : "4.0.0-beta-*", "System.Text.Encoding": "4.0.10-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" From d4778e1ad1026a4ee8cbcc1efb53a29694932a34 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Oct 2014 10:01:13 -0700 Subject: [PATCH 0315/1838] Add missing Contracts dependency. --- src/Microsoft.AspNet.Hosting/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 562e25d619..0165011fdb 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -19,6 +19,7 @@ "System.Collections": "4.0.10-beta-*", "System.ComponentModel": "4.0.0-beta-*", "System.Console": "4.0.0-beta-*", + "System.Diagnostics.Contracts": "4.0.0-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.Linq": "4.0.0-beta-*", From 2352bd7ca33712b9f144d3f6cf83cd1d97754662 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Fri, 17 Oct 2014 15:09:27 -0700 Subject: [PATCH 0316/1838] Change GetService calls to GetRequiredService GetRequiredService throws for missing services like GetService used to. --- src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index bea600af4b..1e61139153 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Builder { return builder.Use(next => { - var typeActivator = builder.ApplicationServices.GetService(); + var typeActivator = builder.ApplicationServices.GetRequiredService(); var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); From dc600a636a1f01b27493e6e122d7179e320310aa Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 14:13:34 -0700 Subject: [PATCH 0317/1838] Support removing features from FeatureCollection. --- .../FeatureCollection.cs | 22 +++++++++++-- .../InterfaceDictionaryTests.cs | 31 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 222dc181f0..3b3f05b2b2 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -66,7 +66,12 @@ namespace Microsoft.AspNet.FeatureModel void SetInterface(Type type, object feature) { if (type == null) throw new ArgumentNullException("type"); - if (feature == null) throw new ArgumentNullException("feature"); + + if (feature == null) + { + Remove(type); + return; + } lock (_containerSync) { @@ -167,7 +172,20 @@ namespace Microsoft.AspNet.FeatureModel public bool Remove(Type key) { - throw new NotImplementedException(); + if (key == null) throw new ArgumentNullException("key"); + + lock (_containerSync) + { + Type priorFeatureType; + if (_featureTypeByName.TryGetValue(key.FullName, out priorFeatureType)) + { + _featureTypeByName.Remove(key.FullName); + _featureByFeatureType.Remove(priorFeatureType); + Interlocked.Increment(ref _containerRevision); + return true; + } + return false; + } } public bool TryGetValue(Type key, out object value) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index 37eac34813..9309814aa7 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -48,5 +48,36 @@ namespace Microsoft.AspNet.FeatureModel.Tests Assert.Throws(() => interfaces.Add(typeof(IThing), thing)); } + + [Fact] + public void RemovedInterfaceIsRemoved() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + + Assert.Equal(interfaces[typeof(IThing)], thing); + + Assert.True(interfaces.Remove(typeof(IThing))); + + object thing2; + Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); + } + + [Fact] + public void SetNullValueRemoves() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces.Add(typeof(IThing), thing); + Assert.Equal(interfaces[typeof(IThing)], thing); + + interfaces[typeof(IThing)] = null; + + object thing2; + Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); + } } } From 114d834876d91fffb42ea643044b434e85363411 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 15 Oct 2014 15:17:58 -0700 Subject: [PATCH 0318/1838] Add Session feature, object model, etc.. --- .../FeatureCollection.cs | 20 ++--- .../NotNullAttribute.cs | 12 +++ .../project.json | 4 +- .../SessionCollectionExtensions.cs | 60 +++++++++++++++ .../project.json | 2 - src/Microsoft.AspNet.Http/HttpContext.cs | 2 + .../ISessionCollection.cs | 21 ++++++ src/Microsoft.AspNet.HttpFeature/ISession.cs | 27 +++++++ .../ISessionFactory.cs | 16 ++++ .../ISessionFeature.cs | 16 ++++ .../Collections/SessionCollection.cs | 75 +++++++++++++++++++ .../DefaultHttpContext.cs | 29 +++++++ 12 files changed, 267 insertions(+), 17 deletions(-) create mode 100644 src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs create mode 100644 src/Microsoft.AspNet.Http/ISessionCollection.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/ISession.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs create mode 100644 src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 3b3f05b2b2..b86a3832b1 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -31,9 +31,8 @@ namespace Microsoft.AspNet.FeatureModel return GetInterface(null); } - public object GetInterface(Type type) + public object GetInterface([NotNull] Type type) { - if (type == null) throw new ArgumentNullException("type"); object feature; if (_featureByFeatureType.TryGetValue(type, out feature)) { @@ -63,10 +62,8 @@ namespace Microsoft.AspNet.FeatureModel return null; } - void SetInterface(Type type, object feature) + void SetInterface([NotNull] Type type, object feature) { - if (type == null) throw new ArgumentNullException("type"); - if (feature == null) { Remove(type); @@ -153,16 +150,13 @@ namespace Microsoft.AspNet.FeatureModel get { return false; } } - public bool ContainsKey(Type key) + public bool ContainsKey([NotNull] Type key) { - if (key == null) throw new ArgumentNullException("key"); return GetInterface(key) != null; } - public void Add(Type key, object value) + public void Add([NotNull] Type key, [NotNull] object value) { - if (key == null) throw new ArgumentNullException("key"); - if (value == null) throw new ArgumentNullException("value"); if (ContainsKey(key)) { throw new ArgumentException(); @@ -170,10 +164,8 @@ namespace Microsoft.AspNet.FeatureModel SetInterface(key, value); } - public bool Remove(Type key) + public bool Remove([NotNull] Type key) { - if (key == null) throw new ArgumentNullException("key"); - lock (_containerSync) { Type priorFeatureType; @@ -188,7 +180,7 @@ namespace Microsoft.AspNet.FeatureModel } } - public bool TryGetValue(Type key, out object value) + public bool TryGetValue([NotNull] Type key, out object value) { value = GetInterface(key); return value != null; diff --git a/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs b/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs new file mode 100644 index 0000000000..3869edda12 --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.FeatureModel +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 595978bef8..5e0b3bc67f 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,6 +1,8 @@ { "version": "1.0.0-*", - "dependencies": {}, + "dependencies": { + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + }, "frameworks": { "aspnet50": {}, "aspnetcore50": { diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs new file mode 100644 index 0000000000..d13f34be02 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Text; + +namespace Microsoft.AspNet.Http +{ + public static class SessionCollectionExtensions + { + public static void SetInt(this ISessionCollection session, string key, int value) + { + var bytes = new byte[] + { + (byte)(value >> 24), + (byte)(0xFF & (value >> 16)), + (byte)(0xFF & (value >> 8)), + (byte)(0xFF & value) + }; + session.Set(key, bytes); + } + + public static int? GetInt(this ISessionCollection session, string key) + { + var data = session.Get(key); + if (data == null || data.Length < 4) + { + return null; + } + return data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; + } + + public static void SetString(this ISessionCollection session, string key, string value) + { + session.Set(key, Encoding.UTF8.GetBytes(value)); + } + + public static string GetString(this ISessionCollection session, string key) + { + var data = session.Get(key); + if (data == null) + { + return null; + } + return Encoding.UTF8.GetString(data); + } + + public static byte[] Get(this ISessionCollection session, string key) + { + byte[] value = null; + session.TryGetValue(key, out value); + return value; + } + + public static void Set(this ISessionCollection session, string key, byte[] value) + { + session.Set(key, new ArraySegment(value)); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index d8391b0906..eb0b74711f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -9,8 +9,6 @@ }, "aspnetcore50" : { "dependencies": { - "System.Reflection": "4.0.10-beta-*", - "System.Reflection.Extensions": "4.0.0-beta-*", "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 191c3f02a6..094b6671eb 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -28,6 +28,8 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken RequestAborted { get; } + public abstract ISessionCollection Session { get; } + public abstract bool IsWebSocketRequest { get; } public abstract IList WebSocketRequestedProtocols { get; } diff --git a/src/Microsoft.AspNet.Http/ISessionCollection.cs b/src/Microsoft.AspNet.Http/ISessionCollection.cs new file mode 100644 index 0000000000..5dd3029c78 --- /dev/null +++ b/src/Microsoft.AspNet.Http/ISessionCollection.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.Http +{ + public interface ISessionCollection : IEnumerable> + { + byte[] this[string key] { get; set; } + + bool TryGetValue(string key, out byte[] value); + + void Set(string key, ArraySegment value); + + void Remove(string key); + + void Clear(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/ISession.cs b/src/Microsoft.AspNet.HttpFeature/ISession.cs new file mode 100644 index 0000000000..6a0fe4035a --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/ISession.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface ISession + { + void Load(); + + void Commit(); + + bool TryGetValue(string key, out byte[] value); + + void Set(string key, ArraySegment value); + + void Remove(string key); + + void Clear(); + + IEnumerable Keys { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs b/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs new file mode 100644 index 0000000000..1187696726 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + [AssemblyNeutral] + public interface ISessionFactory + { + bool IsAvailable { get; } + + ISession Create(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs b/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs new file mode 100644 index 0000000000..400f365b68 --- /dev/null +++ b/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.HttpFeature +{ + // TODO: Is there any reason not to flatten the Factory down into the Feature? + [AssemblyNeutral] + public interface ISessionFeature + { + ISessionFactory Factory { get; set; } + + ISession Session { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs new file mode 100644 index 0000000000..261b401cdb --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs @@ -0,0 +1,75 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + public class SessionCollection : ISessionCollection + { + private readonly ISession _session; + + public SessionCollection(ISession session) + { + _session = session; + } + + public byte[] this[string key] + { + get + { + byte[] value; + TryGetValue(key, out value); + return value; + } + set + { + if (value == null) + { + Remove(key); + } + else + { + Set(key, new ArraySegment(value)); + } + } + } + + public bool TryGetValue(string key, out byte[] value) + { + return _session.TryGetValue(key, out value); + } + + public void Set(string key, ArraySegment value) + { + _session.Set(key, value); + } + + public void Remove(string key) + { + _session.Remove(key); + } + + public void Clear() + { + _session.Clear(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + public IEnumerator> GetEnumerator() + { + foreach (var key in _session.Keys) + { + yield return new KeyValuePair(key, this[key]); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 148ef84e19..308d896564 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -14,6 +14,7 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; using Microsoft.AspNet.PipelineCore.Security; @@ -31,6 +32,7 @@ namespace Microsoft.AspNet.PipelineCore private FeatureReference _authentication; private FeatureReference _lifetime; private FeatureReference _webSockets; + private FeatureReference _session; private IFeatureCollection _features; public DefaultHttpContext() @@ -51,6 +53,7 @@ namespace Microsoft.AspNet.PipelineCore _authentication = FeatureReference.Default; _lifetime = FeatureReference.Default; _webSockets = FeatureReference.Default; + _session = FeatureReference.Default; } IItemsFeature ItemsFeature @@ -78,6 +81,11 @@ namespace Microsoft.AspNet.PipelineCore get { return _webSockets.Fetch(_features); } } + private ISessionFeature SessionFeature + { + get { return _session.Fetch(_features); } + } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } @@ -129,6 +137,27 @@ namespace Microsoft.AspNet.PipelineCore } } + public override ISessionCollection Session + { + get + { + var feature = SessionFeature; + if (feature == null) + { + throw new InvalidOperationException("Session has not been configured for this application or request."); + } + if (feature.Session == null) + { + if (feature.Factory == null) + { + throw new InvalidOperationException("No ISessionFactory available to create the ISession."); + } + feature.Session = feature.Factory.Create(); + } + return new SessionCollection(feature.Session); + } + } + public override bool IsWebSocketRequest { get From 941344bdc39dde9d6599693cdde1edbec673700e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 21 Oct 2014 12:43:13 -0700 Subject: [PATCH 0319/1838] Updating build.sh to work on Mono --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 4323aefc48..c7873ef58e 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild @@ -28,7 +28,7 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source setup/kvm.sh + source packages/KoreBuild/build/kvm.sh fi if ! type k > /dev/null 2>&1; then From fee220569aa108078ab0e231080724eb74ec8b2d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 21 Oct 2014 12:43:28 -0700 Subject: [PATCH 0320/1838] Updating build.sh to work on Mono --- build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 4323aefc48..c7873ef58e 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/sh +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild @@ -28,7 +28,7 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source setup/kvm.sh + source packages/KoreBuild/build/kvm.sh fi if ! type k > /dev/null 2>&1; then From c9fbaccde1f67d4ec976d16d6c0c93574ba1b03d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 24 Oct 2014 00:45:27 -0700 Subject: [PATCH 0321/1838] Cleaning up project.json Updating Newtonsoft.Json version to 6.0.6 --- src/Microsoft.AspNet.Hosting/project.json | 19 ++----------------- .../project.json | 14 +------------- src/Microsoft.AspNet.TestHost/project.json | 12 +----------- .../project.json | 2 -- 4 files changed, 4 insertions(+), 43 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 0165011fdb..5346ba2067 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,33 +1,18 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, - "Newtonsoft.Json": "6.0.4" + "Newtonsoft.Json": "6.0.6" }, "frameworks": { "aspnet50": { }, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Console": "4.0.0-beta-*", - "System.Diagnostics.Contracts": "4.0.0-beta-*", - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Threading": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Console": "4.0.0-beta-*" } } } diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index fc73a32d6a..e9d11e207f 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,23 +1,11 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*" }, "frameworks": { "aspnet50": {}, - "aspnetcore50": { - "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Threading": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } - } + "aspnetcore50": {} } } diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 69ffdf1d4e..ee0ffcfd3f 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -11,17 +11,7 @@ }, "aspnetcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.Serialization.Primitives": "4.0.0-beta-*", - "System.Threading": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*", - "System.Threading.Thread": "4.0.0-beta-*", + "System.Diagnostics.Contracts": "4.0.0-beta", "System.Net.Http": "4.0.0-beta-*" } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index b9d539b2fa..ef0573cbe7 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,8 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Xunit.KRunner": "1.0.0-*" }, "commands": { From 9309765ffa6cdef562616d354212346d22868c37 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 24 Oct 2014 08:01:10 -0700 Subject: [PATCH 0322/1838] Fixing System.Diagnostics.Contracts reference --- src/Microsoft.AspNet.TestHost/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index ee0ffcfd3f..86f2d33e78 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -11,7 +11,7 @@ }, "aspnetcore50": { "dependencies": { - "System.Diagnostics.Contracts": "4.0.0-beta", + "System.Diagnostics.Contracts": "4.0.0-beta-*", "System.Net.Http": "4.0.0-beta-*" } } From 5b515fd13241801d547f497f8da66d6d8010953f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 29 Oct 2014 10:22:19 -0700 Subject: [PATCH 0323/1838] Updated JSON.NET to 6.0.6 --- src/Microsoft.AspNet.Hosting/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 0165011fdb..29c8cb1083 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -10,7 +10,7 @@ "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, - "Newtonsoft.Json": "6.0.4" + "Newtonsoft.Json": "6.0.6" }, "frameworks": { "aspnet50": { }, From c9e0f9beb16b489e34586d38ccfcdd01ee4c33a1 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 31 Oct 2014 01:06:50 -0700 Subject: [PATCH 0324/1838] Added package descriptions --- src/Microsoft.AspNet.Hosting/project.json | 1 + src/Microsoft.AspNet.RequestContainer/project.json | 1 + src/Microsoft.AspNet.TestHost/project.json | 1 + 3 files changed, 3 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 29c8cb1083..0ce52748d1 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index fc73a32d6a..fe61e42058 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 enables per-request scoping of services.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 69ffdf1d4e..74e19b6e44 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 web server for writing and running tests.", "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*" }, From 3bbdce3511a2062b3c51c39c82e6ad80b7527d39 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 31 Oct 2014 01:38:05 -0700 Subject: [PATCH 0325/1838] Added package descriptions --- src/Microsoft.AspNet.FeatureModel/project.json | 1 + src/Microsoft.AspNet.Http.Extensions/project.json | 1 + src/Microsoft.AspNet.Http/project.json | 1 + src/Microsoft.AspNet.HttpFeature/project.json | 1 + src/Microsoft.AspNet.Owin/project.json | 1 + src/Microsoft.AspNet.PipelineCore/project.json | 1 + src/Microsoft.AspNet.WebUtilities/project.json | 1 + 7 files changed, 7 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 5e0b3bc67f..20e2fae042 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index eb0b74711f..0254711dd8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 60649251d8..3adb7472e8 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": {}, "frameworks": { "aspnet50": {}, diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.HttpFeature/project.json index d8b391950d..b2d2d6f3e0 100644 --- a/src/Microsoft.AspNet.HttpFeature/project.json +++ b/src/Microsoft.AspNet.HttpFeature/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature interface definitions.", "frameworks": { "aspnet50": {}, "aspnetcore50": { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 86bc6e3f81..d8dac9991b 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 955572d6fc..6b1a0de735 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -1,6 +1,7 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature implementations.", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 74757f774a..0fb71d0a56 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 common helper methods such as URL encoding.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*" }, From 7f1024aac0174e353b50624b5ece845805d1e115 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 4 Nov 2014 12:32:24 -0800 Subject: [PATCH 0326/1838] Unify ConfigureServices to take IServiceCollection with Options --- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 8 ++++---- test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs | 4 +--- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 376ba3a07f..1c6b2eb98a 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -151,17 +151,17 @@ namespace Microsoft.AspNet.Hosting.Startup { if (servicesMethod != null) { + var services = new ServiceCollection(); + services.Add(OptionsServices.GetDefaultServices()); if (servicesMethod.ReturnType == typeof(IServiceProvider)) { - // IServiceProvider ConfigureServices() - builder.ApplicationServices = (Invoke(servicesMethod, instance, builder) as IServiceProvider) + // IServiceProvider ConfigureServices(IServiceCollection) + builder.ApplicationServices = (Invoke(servicesMethod, instance, builder, services) as IServiceProvider) ?? builder.ApplicationServices; } else { // void ConfigureServices(IServiceCollection) - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); Invoke(servicesMethod, instance, builder, services); if (builder != null) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index dab52127bd..5a85b82357 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -69,10 +69,8 @@ namespace Microsoft.AspNet.Hosting.Fakes return null; } - public IServiceProvider ConfigureProviderServices() + public IServiceProvider ConfigureProviderServices(IServiceCollection services) { - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); services.Configure(o => { o.Configured = true; From 02aa1c50fffa386cb94112e353e9b0eb6e6a3d80 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 29 Oct 2014 14:28:40 -0700 Subject: [PATCH 0327/1838] #28 - Add Helper for building Uris. --- src/Microsoft.AspNet.Http/FragmentString.cs | 136 ++++++++++++++++++ src/Microsoft.AspNet.Http/HostString.cs | 5 + .../UriHelper.cs | 102 +++++++++++++ 3 files changed, 243 insertions(+) create mode 100644 src/Microsoft.AspNet.Http/FragmentString.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/UriHelper.cs diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http/FragmentString.cs new file mode 100644 index 0000000000..1d725e742c --- /dev/null +++ b/src/Microsoft.AspNet.Http/FragmentString.cs @@ -0,0 +1,136 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http +{ + /// + /// Provides correct handling for FragmentString value when needed to generate a URI string + /// + public struct FragmentString : IEquatable + { + /// + /// Represents the empty fragment string. This field is read-only. + /// + public static readonly FragmentString Empty = new FragmentString(string.Empty); + + private readonly string _value; + + /// + /// Initialize the fragment string with a given value. This value must be in escaped and delimited format with + /// a leading '#' character. + /// + /// The fragment string to be assigned to the Value property. + public FragmentString(string value) + { + if (!string.IsNullOrEmpty(value) && value[0] != '#') + { + throw new ArgumentException("The leading '#' must be included for a non-empty fragment.", "value"); + } + _value = value; + } + + /// + /// The escaped fragment string with the leading '#' character + /// + public string Value + { + get { return _value; } + } + + /// + /// True if the fragment string is not empty + /// + public bool HasValue + { + get { return !string.IsNullOrEmpty(_value); } + } + + /// + /// Provides the fragment string escaped in a way which is correct for combining into the URI representation. + /// A leading '#' character will be included unless the Value is null or empty. Characters which are potentially + /// dangerous are escaped. + /// + /// The fragment string value + public override string ToString() + { + return ToUriComponent(); + } + + /// + /// Provides the fragment string escaped in a way which is correct for combining into the URI representation. + /// A leading '#' character will be included unless the Value is null or empty. Characters which are potentially + /// dangerous are escaped. + /// + /// The fragment string value + public string ToUriComponent() + { + // Escape things properly so System.Uri doesn't mis-interpret the data. + return HasValue ? _value : string.Empty; + } + + /// + /// Returns an FragmentString given the fragment as it is escaped in the URI format. The string MUST NOT contain any + /// value that is not a fragment. + /// + /// The escaped fragment as it appears in the URI format. + /// The resulting FragmentString + public static FragmentString FromUriComponent(string uriComponent) + { + if (String.IsNullOrEmpty(uriComponent)) + { + return Empty; + } + return new FragmentString(uriComponent); + } + + /// + /// Returns an FragmentString given the fragment as from a Uri object. Relative Uri objects are not supported. + /// + /// The Uri object + /// The resulting FragmentString + public static FragmentString FromUriComponent(Uri uri) + { + if (uri == null) + { + throw new ArgumentNullException("uri"); + } + string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); + if (!string.IsNullOrEmpty(fragmentValue)) + { + fragmentValue = "#" + fragmentValue; + } + return new FragmentString(fragmentValue); + } + + public bool Equals(FragmentString other) + { + return string.Equals(_value, other._value); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + return obj is FragmentString && Equals((FragmentString)obj); + } + + public override int GetHashCode() + { + return (_value != null ? _value.GetHashCode() : 0); + } + + public static bool operator ==(FragmentString left, FragmentString right) + { + return left.Equals(right); + } + + public static bool operator !=(FragmentString left, FragmentString right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index 67af893b19..ae72f819cc 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -33,6 +33,11 @@ namespace Microsoft.AspNet.Http get { return _value; } } + public bool HasValue + { + get { return !string.IsNullOrEmpty(_value); } + } + /// /// Returns the value as normalized by ToUriComponent(). /// diff --git a/src/Microsoft.AspNet.WebUtilities/UriHelper.cs b/src/Microsoft.AspNet.WebUtilities/UriHelper.cs new file mode 100644 index 0000000000..491c599d20 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/UriHelper.cs @@ -0,0 +1,102 @@ +using System; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// A helper class for constructing encoded Uris for use in headers and other Uris. + /// + public class UriHelper + { + public UriHelper() + { + } + + public UriHelper(HttpRequest request) + { + Scheme = request.Scheme; + Host = request.Host; + PathBase = request.PathBase; + Path = request.Path; + Query = request.QueryString; + // Fragment is not a valid request field. + } + + public UriHelper(Uri uri) + { + Scheme = uri.Scheme; + Host = HostString.FromUriComponent(uri); + // Assume nothing is being put in PathBase + Path = PathString.FromUriComponent(uri); + Query = QueryString.FromUriComponent(uri); + Fragment = FragmentString.FromUriComponent(uri); + } + + public string Scheme { get; set; } + + public HostString Host { get; set; } + + public PathString PathBase { get; set; } + + public PathString Path { get; set; } + + public QueryString Query { get; set; } + + public FragmentString Fragment { get; set; } + + // Always returns at least '/' + public string GetPartialUri() + { + string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; + return path + Query + Fragment; + } + + // Always returns at least 'scheme://host/' + public string GetFullUri() + { + if (string.IsNullOrEmpty(Scheme)) + { + throw new InvalidOperationException("Missing Scheme"); + } + if (!Host.HasValue) + { + throw new InvalidOperationException("Missing Host"); + } + + string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; + return Scheme + "://" + Host + path + Query + Fragment; + } + + public static string Create(PathString pathBase, + PathString path = new PathString(), + QueryString query = new QueryString(), + FragmentString fragment = new FragmentString()) + { + return new UriHelper() + { + PathBase = pathBase, + Path = path, + Query = query, + Fragment = fragment + }.GetPartialUri(); + } + + public static string Create(string scheme, + HostString host, + PathString pathBase = new PathString(), + PathString path = new PathString(), + QueryString query = new QueryString(), + FragmentString fragment = new FragmentString()) + { + return new UriHelper() + { + Scheme = scheme, + Host = host, + PathBase = pathBase, + Path = path, + Query = query, + Fragment = fragment + }.GetFullUri(); + } + } +} \ No newline at end of file From b7d9e11a8442994cf5c4b8292d72b1efbd7e5a42 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Sun, 2 Nov 2014 18:46:44 -0800 Subject: [PATCH 0328/1838] Middleware invokation with per-request services * Extension methods for .Use and .Run add service parameters to lambda * Middleware class .Invoke method may take services as additional parameters --- .../UseMiddlewareExtensions.cs | 35 ++++- .../Extensions/RunExtensions.cs | 21 +++ .../Extensions/UseExtensions.cs | 120 +++++++++++++++ .../UseWithServicesTests.cs | 141 ++++++++++++++++++ 4 files changed, 315 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index 1e61139153..8a9de346ab 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -5,6 +5,8 @@ using System; using System.Linq; using System.Reflection; using Microsoft.Framework.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { @@ -17,12 +19,41 @@ namespace Microsoft.AspNet.Builder public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) { + var applicationServices = builder.ApplicationServices; return builder.Use(next => { - var typeActivator = builder.ApplicationServices.GetRequiredService(); + var typeActivator = applicationServices.GetRequiredService(); var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); - return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); + var parameters = methodinfo.GetParameters(); + if (parameters[0].ParameterType != typeof(HttpContext)) + { + throw new Exception("TODO: Middleware Invoke method must take first argument of HttpContext"); + } + if (parameters.Length == 1) + { + return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); + } + return context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + var arguments = new object[parameters.Length]; + arguments[0] = context; + for(var index = 1; index != parameters.Length; ++index) + { + var serviceType = parameters[index].ParameterType; + arguments[index] = serviceProvider.GetService(serviceType); + if (arguments[index] == null) + { + throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", serviceType)); + } + } + return (Task)methodinfo.Invoke(instance, arguments); + }; }); } } diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 694dd3ec0f..4b74158aae 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -3,6 +3,7 @@ using System; using Microsoft.AspNet.Http; +using System.Threading.Tasks; namespace Microsoft.AspNet.Builder { @@ -12,5 +13,25 @@ namespace Microsoft.AspNet.Builder { app.Use(_ => handler); } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1) => handler(ctx, s1)); + } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1, s2) => handler(ctx, s1, s2)); + } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1, s2, s3) => handler(ctx, s1, s2, s3)); + } + + public static void Run(this IApplicationBuilder app, Func handler) + { + app.Use((ctx, _, s1, s2, s3, s4) => handler(ctx, s1, s2, s3, s4)); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs index 038b14e03e..4be750be47 100644 --- a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs @@ -26,5 +26,125 @@ namespace Microsoft.AspNet.Builder }; }); } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider)); + }); + } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider)); + }); + } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// Per-request service required by middleware + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider)); + }); + } + + /// + /// Use middleware defined in-line + /// + /// Per-request service required by middleware + /// Per-request service required by middleware + /// Per-request service required by middleware + /// Per-request service required by middleware + /// + /// A function that handles the request or calls the given next function. + /// + public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, TService4, Task> middleware) + { + var applicationServices = app.ApplicationServices; + return app.Use(next => context => + { + var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + if (serviceProvider == null) + { + throw new Exception("TODO: IServiceProvider is not available"); + } + return middleware( + context, + () => next(context), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider), + GetRequiredService(serviceProvider)); + }); + } + + private static TService GetRequiredService(IServiceProvider serviceProvider) + { + var service = (TService)serviceProvider.GetService(typeof(TService)); + + if (service == null) + { + throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", typeof(TService))); + } + + return service; + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs new file mode 100644 index 0000000000..9dc54ab09e --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.AspNet.PipelineCore; +using System.Collections.Generic; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http.Extensions.Tests +{ + public class UseWithServicesTests + { + [Fact] + public async Task CallingUseThatAlsoTakesServices() + { + var builder = new ApplicationBuilder(new ServiceCollection() + .AddScoped() + .BuildServiceProvider()); + + ITestService theService = null; + builder.Use(async (ctx, next, testService) => + { + theService = testService; + await next(); + }); + + var app = builder.Build(); + await app(new DefaultHttpContext()); + + Assert.IsType(theService); + } + + [Fact] + public async Task ServicesArePerRequest() + { + var services = new ServiceCollection() + .AddScoped() + .AddTransient() + .BuildServiceProvider(); + var builder = new ApplicationBuilder(services); + + builder.Use(async (ctx, next) => + { + var serviceScopeFactory = services.GetRequiredService(); + using (var serviceScope = serviceScopeFactory.CreateScope()) + { + var priorApplicationServices = ctx.ApplicationServices; + var priorRequestServices = ctx.ApplicationServices; + ctx.ApplicationServices = services; + ctx.RequestServices = serviceScope.ServiceProvider; + try + { + await next(); + } + finally + { + ctx.ApplicationServices = priorApplicationServices; + ctx.RequestServices = priorRequestServices; + } + } + }); + + var testServicesA = new List(); + builder.Use(async (HttpContext ctx, Func next, ITestService testService) => + { + testServicesA.Add(testService); + await next(); + }); + + var testServicesB = new List(); + builder.Use(async (ctx, next, testService) => + { + testServicesB.Add(testService); + await next(); + }); + + var app = builder.Build(); + await app(new DefaultHttpContext()); + await app(new DefaultHttpContext()); + + Assert.Equal(2, testServicesA.Count); + Assert.IsType(testServicesA[0]); + Assert.IsType(testServicesA[1]); + + Assert.Equal(2, testServicesB.Count); + Assert.IsType(testServicesB[0]); + Assert.IsType(testServicesB[1]); + + Assert.Same(testServicesA[0], testServicesB[0]); + Assert.Same(testServicesA[1], testServicesB[1]); + + Assert.NotSame(testServicesA[0], testServicesA[1]); + Assert.NotSame(testServicesB[0], testServicesB[1]); + } + + [Fact] + public async Task InvokeMethodWillAllowPerRequestServices() + { + var services = new ServiceCollection() + .AddScoped() + .AddTransient() + .BuildServiceProvider(); + var builder = new ApplicationBuilder(services); + builder.UseMiddleware(); + var app = builder.Build(); + + var ctx1 = new DefaultHttpContext(); + await app(ctx1); + + var testService = ctx1.Items[typeof(ITestService)]; + Assert.IsType(testService); + } + } + + public interface ITestService + { + } + + public class TestService : ITestService + { + } + + public class TestMiddleware + { + RequestDelegate _next; + + public TestMiddleware(RequestDelegate next) + { + _next = next; + } + + public async Task Invoke(HttpContext context, ITestService testService) + { + context.Items[typeof(ITestService)] = testService; + } + } +} \ No newline at end of file From 75d8a8138643e4474319daab8066ce259b849976 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 6 Nov 2014 10:47:59 -0800 Subject: [PATCH 0329/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 5a55767162f6ff67fa84d05da72262f1e54946a1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 6 Nov 2014 10:48:08 -0800 Subject: [PATCH 0330/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 389e27e46055a95648efe48a512614fc4f8ff08e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 29 Oct 2014 16:32:50 -0700 Subject: [PATCH 0331/1838] #134 - Add HeadersSent api. --- src/Microsoft.AspNet.Http/HttpResponse.cs | 3 ++- .../IHttpResponseFeature.cs | 1 + .../OwinFeatureCollection.cs | 16 ++++++++++++++++ .../DefaultHttpResponse.cs | 5 +++++ .../DefaultHttpResponseFeature.cs | 5 +++++ 5 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 010d159ab8..d0156b4ee9 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; -using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; namespace Microsoft.AspNet.Http @@ -24,6 +23,8 @@ namespace Microsoft.AspNet.Http public abstract IResponseCookies Cookies { get; } + public abstract bool HeadersSent { get; } + public abstract void OnSendingHeaders(Action callback, object state); public virtual void Redirect(string location) diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs index cf322f6747..aa7603be03 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs @@ -15,6 +15,7 @@ namespace Microsoft.AspNet.HttpFeature string ReasonPhrase { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } + bool HeadersSent { get; } void OnSendingHeaders(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7478a81e68..23ca6df7bf 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -35,11 +35,22 @@ namespace Microsoft.AspNet.Owin IOwinEnvironmentFeature { public IDictionary Environment { get; set; } + private bool _headersSent; public OwinFeatureCollection(IDictionary environment) { Environment = environment; SupportsWebSockets = true; + + var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); + if (register != null) + { + register(state => + { + var collection = (OwinFeatureCollection)state; + collection._headersSent = true; + }, this); + } } T Prop(string key) @@ -129,6 +140,11 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseBody, value); } } + bool IHttpResponseFeature.HeadersSent + { + get { return _headersSent; } + } + void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 3b50493b58..03841751ec 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -105,6 +105,11 @@ namespace Microsoft.AspNet.PipelineCore get { return ResponseCookiesFeature.Cookies; } } + public override bool HeadersSent + { + get { return HttpResponseFeature.HeadersSent; } + } + public override void OnSendingHeaders(Action callback, object state) { HttpResponseFeature.OnSendingHeaders(callback, state); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs index 819ff17421..c3b933bb8a 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs @@ -25,6 +25,11 @@ namespace Microsoft.AspNet.PipelineCore public Stream Body { get; set; } + public bool HeadersSent + { + get { return false; } + } + public void OnSendingHeaders(Action callback, object state) { throw new NotSupportedException(); From 65f595ca02744a10e95e7738c39502ac93bee654 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 30 Oct 2014 14:39:43 -0700 Subject: [PATCH 0332/1838] Add new HeadersSent API. --- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 3 +++ test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs | 5 +++++ 2 files changed, 8 insertions(+) diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 5b7d230a13..9f2ebfd081 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -30,6 +30,8 @@ namespace Microsoft.AspNet.TestHost public Stream Body { get; set; } + public bool HeadersSent { get; set; } + public void OnSendingHeaders(Action callback, object state) { var prior = _sendingHeaders; @@ -43,6 +45,7 @@ namespace Microsoft.AspNet.TestHost public void FireOnSendingHeaders() { _sendingHeaders(); + HeadersSent = true; } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs index ebf601cb82..2564ee7112 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs @@ -15,6 +15,11 @@ namespace Microsoft.AspNet.TestHost // Assert Assert.Equal(200, responseInformation.StatusCode); + Assert.False(responseInformation.HeadersSent); + + responseInformation.FireOnSendingHeaders(); + + Assert.True(responseInformation.HeadersSent); } } } \ No newline at end of file From cd184e3e33e3f3138deb7476af223e0bec8c037f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 6 Nov 2014 10:48:08 -0800 Subject: [PATCH 0333/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 8f16060f941b71551be09015d76efb86770d84d7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 6 Nov 2014 22:17:09 -0800 Subject: [PATCH 0334/1838] Fixing dev NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From d25ffec65582695eeb3a17dd59e207565885f914 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 12 Nov 2014 15:06:43 -0800 Subject: [PATCH 0335/1838] Update KProj to latest version --- .../Microsoft.AspNet.Hosting.kproj | 18 ++++++----------- .../Microsoft.AspNet.RequestContainer.kproj | 18 ++++++----------- .../Microsoft.AspNet.TestHost.kproj | 18 ++++++----------- .../Microsoft.AspNet.Hosting.Tests.kproj | 20 ++++++------------- .../Microsoft.AspNet.TestHost.Tests.kproj | 20 ++++++------------- 5 files changed, 30 insertions(+), 64 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index c677b192d6..28467979c0 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 3944f036-7e75-47e8-aa52-c4b89a64ec3a - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj index e3e12065f7..43376819b1 100644 --- a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj +++ b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 374a5b0c-3e93-4a23-a4a0-ee2ab6df7814 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index f68105749b..0ec30b643d 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 1a415a3f-1081-45db-809b-ee19cea02dc0 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 0b04b9270d..95b1cc35f3 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -1,22 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) d4f18d58-52b1-435d-a012-10f2cdf158c4 - Library - net45 - - - - - - - 2.0 - 29216 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 53d92fe14b..259cc5243d 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -1,22 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 0acb2719-9484-49b5-b8e3-117091192511 - Library - net45 - - - - - - - 2.0 - 29215 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + From 76bb27e5d3eb46c3e8676a688bf3f5d7a06ad284 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 12 Nov 2014 15:09:59 -0800 Subject: [PATCH 0336/1838] Update KProj to the latest format --- .../Microsoft.AspNet.FeatureModel.kproj | 18 +++++-------- .../Microsoft.AspNet.Http.Extensions.kproj | 27 +++++-------------- .../Microsoft.AspNet.Http.kproj | 18 +++++-------- .../Microsoft.AspNet.HttpFeature.kproj | 18 +++++-------- .../Microsoft.AspNet.Owin.kproj | 18 +++++-------- .../Microsoft.AspNet.PipelineCore.kproj | 18 +++++-------- .../Microsoft.AspNet.WebUtilities.kproj | 27 +++++-------------- .../Microsoft.AspNet.FeatureModel.Tests.kproj | 19 +++++-------- ...crosoft.AspNet.Http.Extensions.Tests.kproj | 27 +++++-------------- .../Microsoft.AspNet.Http.Tests.kproj | 19 +++++-------- .../Microsoft.AspNet.Owin.Tests.kproj | 18 +++++-------- .../Microsoft.AspNet.PipelineCore.Tests.kproj | 19 +++++-------- .../Microsoft.AspNet.WebUtilities.Tests.kproj | 27 +++++-------------- 13 files changed, 78 insertions(+), 195 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 3ee51e0df8..c155c5e1aa 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 32a4c918-30ee-41db-8e26-8a3bb88ed231 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index b8536c1d7e..2f956b8741 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - ccc4363e-81e2-4058-94dd-00494e9e992a - Library - Microsoft.AspNet.Http.Extensions - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 1daab236cd..c99a5537ec 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 22071333-15ba-4d16-a1d5-4d5b1a83fbdd - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index f14cfaec40..d1cd481026 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) d9128247-8f97-48b8-a863-f1f21a029fce - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index e7f58555b1..975d5aab4a 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 59bed991-f207-48ed-b24c-0a1d9c986c01 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index bd57805ae6..6a7b9e0bc5 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) bcf0f967-8753-4438-bd07-aadca9ce509a - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index 9759976da3..ab15d3d1bd 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - a2fb7838-0031-4fad-ba3e-83c30b3af406 - Library - Microsoft.AspNet.WebUtilities - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index 0925c220ef..546c32e745 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -1,21 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) c5d2bae1-e182-48a0-aa74-1af14b782bf7 - Library - net45 - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index 9bad335404..6718966d19 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - ae25ef21-7f91-4b86-b73e-af746821d339 - Library - Microsoft.AspNet.Http.Extensions.Tests - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index 787a78ff26..ee16369726 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -1,21 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) f16692b8-9f38-4dca-a582-e43172b989c6 - Library - net45 - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index 050b89712d..7214982973 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -1,20 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) 16219571-3268-4d12-8689-12b7163dba13 - Library - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index d7a5995f6b..e8e0464bee 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -1,21 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) aa99af26-f7b1-4a6b-a922-5c25539f6391 - Library - net45 - - - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index cbfdfe1f3d..8dc5e1a1c4 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -1,29 +1,14 @@ - - + + - 12.0 + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - Debug - AnyCPU - 93c10e50-bcbb-4d8e-9492-d46e1396225b - Library - Microsoft.AspNet.WebUtilities.Tests - - - ConsoleDebugger - - - WebDebugger - - - - - 2.0 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ - \ No newline at end of file + From bf5d14f4770353ad63797afde0099a6eb38063c6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 5 Nov 2014 09:39:03 -0800 Subject: [PATCH 0337/1838] #78 - Enable TestServer to populate the PathBase. --- .../ClientHandler.cs | 24 +++++++++++++++---- src/Microsoft.AspNet.TestHost/TestServer.cs | 8 +++++-- .../ClientHandlerTests.cs | 24 +++++++++---------- 3 files changed, 37 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 29400083e8..b23dffbe70 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -24,12 +24,13 @@ namespace Microsoft.AspNet.TestHost public class ClientHandler : HttpMessageHandler { private readonly Func _next; + private readonly PathString _pathBase; /// /// Create a new handler. /// /// The pipeline entry point. - public ClientHandler(Func next) + public ClientHandler(Func next, PathString pathBase) { if (next == null) { @@ -37,6 +38,7 @@ namespace Microsoft.AspNet.TestHost } _next = next; + _pathBase = pathBase; } /// @@ -55,7 +57,7 @@ namespace Microsoft.AspNet.TestHost throw new ArgumentNullException("request"); } - var state = new RequestState(request, cancellationToken); + var state = new RequestState(request, _pathBase, cancellationToken); var requestContent = request.Content ?? new StreamContent(Stream.Null); var body = await requestContent.ReadAsStreamAsync(); if (body.CanSeek) @@ -95,7 +97,7 @@ namespace Microsoft.AspNet.TestHost private ResponseStream _responseStream; private ResponseFeature _responseFeature; - internal RequestState(HttpRequestMessage request, CancellationToken cancellationToken) + internal RequestState(HttpRequestMessage request, PathString pathBase, CancellationToken cancellationToken) { _request = request; _responseTcs = new TaskCompletionSource(); @@ -118,8 +120,20 @@ namespace Microsoft.AspNet.TestHost serverRequest.Protocol = "HTTP/" + request.Version.ToString(2); serverRequest.Scheme = request.RequestUri.Scheme; serverRequest.Method = request.Method.ToString(); - serverRequest.Path = PathString.FromUriComponent(request.RequestUri); - serverRequest.PathBase = PathString.Empty; + + var fullPath = PathString.FromUriComponent(request.RequestUri); + PathString remainder; + if (fullPath.StartsWithSegments(pathBase, out remainder)) + { + serverRequest.PathBase = pathBase; + serverRequest.Path = remainder; + } + else + { + serverRequest.PathBase = PathString.Empty; + serverRequest.Path = fullPath; + } + serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri); // TODO: serverRequest.CallCancelled = cancellationToken; diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 977623c3d0..8a98adb5ad 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -7,6 +7,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; @@ -41,6 +42,8 @@ namespace Microsoft.AspNet.TestHost _appInstance = engine.Start(hostContext); } + public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); + public static TestServer Create(Action app) { return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app); @@ -68,12 +71,13 @@ namespace Microsoft.AspNet.TestHost public HttpMessageHandler CreateHandler() { - return new ClientHandler(Invoke); + var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); + return new ClientHandler(Invoke, pathBase); } public HttpClient CreateClient() { - return new HttpClient(CreateHandler()) { BaseAddress = new Uri("http://localhost/") }; + return new HttpClient(CreateHandler()) { BaseAddress = BaseAddress }; } /// diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 623a0bc395..13b6f085c7 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -28,8 +28,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("HTTP/1.1", context.Request.Protocol); Assert.Equal("GET", context.Request.Method); Assert.Equal("https", context.Request.Scheme); - Assert.Equal(string.Empty, context.Request.PathBase.Value); - Assert.Equal("/A/Path/and/file.txt", context.Request.Path.Value); + Assert.Equal("/A/Path", context.Request.PathBase.Value); + Assert.Equal("/and/file.txt", context.Request.Path.Value); Assert.Equal("?and=query", context.Request.QueryString.Value); Assert.NotNull(context.Request.Body); Assert.NotNull(context.Request.Headers); @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("example.com", context.Request.Host.Value); return Task.FromResult(0); - }); + }, new PathString("/A/Path")); var httpClient = new HttpClient(handler); return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query"); } @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Headers["TestHeader"] = "TestValue:" + requestCount++; return Task.FromResult(0); - }); + }, PathString.Empty); HttpMessageInvoker invoker = new HttpMessageInvoker(handler); HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/"); @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Headers["TestHeader"] = "TestValue"; return Task.FromResult(0); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/"); Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); @@ -93,7 +93,7 @@ namespace Microsoft.AspNet.TestHost { block.WaitOne(); return Task.FromResult(0); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); Task task = httpClient.GetAsync("https://example.com/"); Assert.False(task.IsCompleted); @@ -113,7 +113,7 @@ namespace Microsoft.AspNet.TestHost await context.Response.WriteAsync("BodyStarted,"); block.WaitOne(); await context.Response.WriteAsync("BodyFinished"); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Body.Flush(); block.WaitOne(); await context.Response.WriteAsync("BodyFinished"); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -153,7 +153,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Body.Flush(); block.WaitOne(); return Task.FromResult(0); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -179,7 +179,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Body.Flush(); block.WaitOne(); return Task.FromResult(0); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -201,7 +201,7 @@ namespace Microsoft.AspNet.TestHost var handler = new ClientHandler(env => { throw new InvalidOperationException("Test Exception"); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); return Assert.ThrowsAsync(() => httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead)); @@ -218,7 +218,7 @@ namespace Microsoft.AspNet.TestHost await context.Response.WriteAsync("BodyStarted"); block.WaitOne(); throw new InvalidOperationException("Test Exception"); - }); + }, PathString.Empty); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); From b7bb7f8fcfb62418d1e124c3197dfb7939bdf905 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 14 Nov 2014 09:43:33 -0800 Subject: [PATCH 0338/1838] Fix issue with empty path. --- src/Microsoft.AspNet.TestHost/TestServer.cs | 5 +++ .../ClientHandlerTests.cs | 15 +++++++ .../TestClientTests.cs | 42 +++++++++++++++++++ 3 files changed, 62 insertions(+) diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 8a98adb5ad..496fc9da94 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -72,6 +72,11 @@ namespace Microsoft.AspNet.TestHost public HttpMessageHandler CreateHandler() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); + if (pathBase.Equals(new PathString("/"))) + { + // When we just have http://host/ the trailing slash is really part of the Path, not the PathBase. + pathBase = PathString.Empty; + } return new ClientHandler(Invoke, pathBase); } diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 13b6f085c7..23f65bce8b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -45,6 +45,21 @@ namespace Microsoft.AspNet.TestHost return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query"); } + [Fact] + public Task SingleSlashNotMovedToPathBase() + { + var handler = new ClientHandler(env => + { + var context = new DefaultHttpContext((IFeatureCollection)env); + Assert.Equal("", context.Request.PathBase.Value); + Assert.Equal("/", context.Request.Path.Value); + + return Task.FromResult(0); + }, new PathString("")); + var httpClient = new HttpClient(handler); + return httpClient.GetAsync("https://example.com/"); + } + [Fact] public async Task ResubmitRequestWorks() { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index d9843657dd..c1ba2d9f59 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -45,6 +45,48 @@ namespace Microsoft.AspNet.TestHost Assert.Equal(expected, actual); } + [Fact] + public async Task NoTrailingSlash_NoPathBase() + { + // Arrange + var expected = "GET Response"; + RequestDelegate appDelegate = ctx => + { + Assert.Equal("", ctx.Request.PathBase.Value); + Assert.Equal("/", ctx.Request.Path.Value); + return ctx.Response.WriteAsync(expected); + }; + var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var client = server.CreateClient(); + + // Act + var actual = await client.GetStringAsync("http://localhost:12345"); + + // Assert + Assert.Equal(expected, actual); + } + + [Fact] + public async Task SingleTrailingSlash_NoPathBase() + { + // Arrange + var expected = "GET Response"; + RequestDelegate appDelegate = ctx => + { + Assert.Equal("", ctx.Request.PathBase.Value); + Assert.Equal("/", ctx.Request.Path.Value); + return ctx.Response.WriteAsync(expected); + }; + var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var client = server.CreateClient(); + + // Act + var actual = await client.GetStringAsync("http://localhost:12345/"); + + // Assert + Assert.Equal(expected, actual); + } + [Fact] public async Task PutAsyncWorks() { From 1dd3a2ee1f74abb314adad4897093135e662888e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 7 Nov 2014 14:08:43 -0800 Subject: [PATCH 0339/1838] #147 - OWIN: Throw KeyNotFoundException if the underlying Feature is missing. Return defaults for required entries. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 114 +++++++++++++----- .../OwinEnvironmentTests.cs | 32 +++++ 2 files changed, 118 insertions(+), 28 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 781ba621e2..2db8489a44 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -35,24 +35,32 @@ namespace Microsoft.AspNet.Owin public OwinEnvironment(HttpContext context) { + if (context.GetFeature() == null) + { + throw new ArgumentException("Missing required IHttpRequestFeature", "context"); + } + if (context.GetFeature() == null) + { + throw new ArgumentException("Missing required IHttpResponseFeature", "context"); + } + _context = context; _entries = new Dictionary() { - { OwinConstants.CallCancelled, new FeatureMap(feature => feature.RequestAborted) }, - { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, (feature, value) => feature.Protocol = Convert.ToString(value)) }, - { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, (feature, value) => feature.Scheme = Convert.ToString(value)) }, - { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, (feature, value) => feature.Method = Convert.ToString(value)) }, - { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, (feature, value) => feature.PathBase = Convert.ToString(value)) }, - { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, (feature, value) => feature.Path = Convert.ToString(value)) }, - { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), + { OwinConstants.RequestProtocol, new FeatureMap(feature => feature.Protocol, () => string.Empty, (feature, value) => feature.Protocol = Convert.ToString(value)) }, + { OwinConstants.RequestScheme, new FeatureMap(feature => feature.Scheme, () => string.Empty, (feature, value) => feature.Scheme = Convert.ToString(value)) }, + { OwinConstants.RequestMethod, new FeatureMap(feature => feature.Method, () => string.Empty, (feature, value) => feature.Method = Convert.ToString(value)) }, + { OwinConstants.RequestPathBase, new FeatureMap(feature => feature.PathBase, () => string.Empty, (feature, value) => feature.PathBase = Convert.ToString(value)) }, + { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, () => string.Empty, (feature, value) => feature.Path = Convert.ToString(value)) }, + { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), () => string.Empty, (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, + { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, - { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), @@ -70,11 +78,28 @@ namespace Microsoft.AspNet.Owin { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, { OwinConstants.Security.User, new FeatureMap(feature => feature.User, - (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), + ()=> null, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), () => new HttpAuthenticationFeature()) }, }; + // owin.CallCancelled is required but the feature may not be present. + object ignored; + if (context.GetFeature() != null) + { + _entries[OwinConstants.CallCancelled] = new FeatureMap(feature => feature.RequestAborted); + } + else if (!_context.Items.TryGetValue(OwinConstants.CallCancelled, out ignored)) + { + _context.Items[OwinConstants.CallCancelled] = CancellationToken.None; + } + + // owin.Version is required. + if (!context.Items.TryGetValue(OwinConstants.OwinVersion, out ignored)) + { + _context.Items[OwinConstants.OwinVersion] = "1.0"; + } + if (context.Request.IsSecure) { _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, @@ -108,14 +133,17 @@ namespace Microsoft.AspNet.Owin bool IDictionary.ContainsKey(string key) { - return _entries.ContainsKey(key) || _context.Items.ContainsKey(key); + object value; + return ((IDictionary)this).TryGetValue(key, out value); } ICollection IDictionary.Keys { get { - return _entries.Keys.Concat(_context.Items.Keys.Select(key => Convert.ToString(key))).ToList(); + object value; + return _entries.Where(pair => pair.Value.TryGet(_context, out value)) + .Select(pair => pair.Key).Concat(_context.Items.Keys.Select(key => Convert.ToString(key))).ToList(); } } @@ -131,9 +159,8 @@ namespace Microsoft.AspNet.Owin bool IDictionary.TryGetValue(string key, out object value) { FeatureMap entry; - if (_entries.TryGetValue(key, out entry)) + if (_entries.TryGetValue(key, out entry) && entry.TryGet(_context, out value)) { - value = entry.Get(_context); return true; } return _context.Items.TryGetValue(key, out value); @@ -149,11 +176,11 @@ namespace Microsoft.AspNet.Owin get { FeatureMap entry; - if (_entries.TryGetValue(key, out entry)) - { - return entry.Get(_context); - } object value; + if (_entries.TryGetValue(key, out entry) && entry.TryGet(_context, out value)) + { + return value; + } if (_context.Items.TryGetValue(key, out value)) { return value; @@ -232,7 +259,11 @@ namespace Microsoft.AspNet.Owin { foreach (var entryPair in _entries) { - yield return new KeyValuePair(entryPair.Key, entryPair.Value.Get(_context)); + object value; + if (entryPair.Value.TryGet(_context, out value)) + { + yield return new KeyValuePair(entryPair.Key, value); + } } foreach (var entryPair in _context.Items) { @@ -248,26 +279,37 @@ namespace Microsoft.AspNet.Owin public class FeatureMap { public FeatureMap(Type featureInterface, Func getter) - : this(featureInterface, getter, setter: null) + : this(featureInterface, getter, defaultFactory: null) + { + } + public FeatureMap(Type featureInterface, Func getter, Func defaultFactory) + : this(featureInterface, getter, defaultFactory, setter: null) { } public FeatureMap(Type featureInterface, Func getter, Action setter) - : this(featureInterface, getter, setter, featureFactory: null) + : this(featureInterface, getter, defaultFactory: null, setter: setter) { } - public FeatureMap(Type featureInterface, Func getter, Action setter, Func featureFactory) + public FeatureMap(Type featureInterface, Func getter, Func defaultFactory, Action setter) + : this(featureInterface, getter, defaultFactory, setter, featureFactory: null) + { + } + + public FeatureMap(Type featureInterface, Func getter, Func defaultFactory, Action setter, Func featureFactory) { FeatureInterface = featureInterface; Getter = getter; Setter = setter; + DefaultFactory = defaultFactory; FeatureFactory = featureFactory; } private Type FeatureInterface { get; set; } private Func Getter { get; set; } private Action Setter { get; set; } + private Func DefaultFactory { get; set; } private Func FeatureFactory { get; set; } public bool CanSet @@ -275,14 +317,20 @@ namespace Microsoft.AspNet.Owin get { return Setter != null; } } - internal object Get(HttpContext context) + internal bool TryGet(HttpContext context, out object value) { object featureInstance = context.GetFeature(FeatureInterface); if (featureInstance == null) { - return null; + value = null; + return false; } - return Getter(featureInstance); + value = Getter(featureInstance); + if (value == null && DefaultFactory != null) + { + value = DefaultFactory(); + } + return true; } internal void Set(HttpContext context, object value) @@ -311,13 +359,23 @@ namespace Microsoft.AspNet.Owin { } + public FeatureMap(Func getter, Func defaultFactory) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory) + { + } + public FeatureMap(Func getter, Action setter) : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value)) { } - public FeatureMap(Func getter, Action setter, Func featureFactory) - : base(typeof(TFeature), feature => getter((TFeature)feature), (feature, value) => setter((TFeature)feature, value), () => featureFactory()) + public FeatureMap(Func getter, Func defaultFactory, Action setter) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory,(feature, value) => setter((TFeature)feature, value)) + { + } + + public FeatureMap(Func getter, Func defaultFactory, Action setter, Func featureFactory) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory, (feature, value) => setter((TFeature)feature, value), () => featureFactory()) { } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index cdc5eb680f..88fd2f7174 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -5,7 +5,9 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; +using System.Threading; using Microsoft.AspNet.Http; +using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore; using Xunit; @@ -94,6 +96,36 @@ namespace Microsoft.AspNet.Owin Assert.Equal(201, context.Response.StatusCode); } + [Theory] + [InlineData("server.LocalPort")] + public void OwinEnvironmentDoesNotContainEntriesForMissingFeatures(string key) + { + HttpContext context = CreateContext(); + IDictionary env = new OwinEnvironment(context); + + object value; + Assert.False(env.TryGetValue(key, out value)); + + Assert.Throws(() => env[key]); + + Assert.False(env.Keys.Contains(key)); + Assert.False(env.ContainsKey(key)); + } + + [Fact] + public void OwinEnvironmentSuppliesDefaultsForMissingRequiredEntries() + { + HttpContext context = CreateContext(); + IDictionary env = new OwinEnvironment(context); + + object value; + Assert.True(env.TryGetValue("owin.CallCancelled", out value), "owin.CallCancelled"); + Assert.True(env.TryGetValue("owin.Version", out value), "owin.Version"); + + Assert.Equal(CancellationToken.None, env["owin.CallCancelled"]); + Assert.Equal("1.0", env["owin.Version"]); + } + private HttpContext CreateContext() { var context = new DefaultHttpContext(); From ba693dd38302945d5f4dcf9d40318f366a5e7168 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 10 Nov 2014 09:17:17 -0800 Subject: [PATCH 0340/1838] Code cleanup. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 2db8489a44..6e132e632f 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -84,18 +84,17 @@ namespace Microsoft.AspNet.Owin }; // owin.CallCancelled is required but the feature may not be present. - object ignored; if (context.GetFeature() != null) { _entries[OwinConstants.CallCancelled] = new FeatureMap(feature => feature.RequestAborted); } - else if (!_context.Items.TryGetValue(OwinConstants.CallCancelled, out ignored)) + else if (!_context.Items.ContainsKey(OwinConstants.CallCancelled)) { _context.Items[OwinConstants.CallCancelled] = CancellationToken.None; } // owin.Version is required. - if (!context.Items.TryGetValue(OwinConstants.OwinVersion, out ignored)) + if (!context.Items.ContainsKey(OwinConstants.OwinVersion)) { _context.Items[OwinConstants.OwinVersion] = "1.0"; } From b5156a00b3621838d38473071a1b565d2ceb976f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 14 Nov 2014 15:14:16 -0800 Subject: [PATCH 0341/1838] Argument validation cleanup. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 6e132e632f..8a0e7cbcfd 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,11 +37,11 @@ namespace Microsoft.AspNet.Owin { if (context.GetFeature() == null) { - throw new ArgumentException("Missing required IHttpRequestFeature", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", "context"); } if (context.GetFeature() == null) { - throw new ArgumentException("Missing required IHttpResponseFeature", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", "context"); } _context = context; From b44ffdb745aa227b311a6f0ec3d178db33fd8c70 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 12 Nov 2014 15:54:28 -0800 Subject: [PATCH 0342/1838] #111 - Remove DataProtectionOptions from the service collection. --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 6 ------ src/Microsoft.AspNet.Hosting/Program.cs | 8 -------- src/Microsoft.AspNet.Hosting/project.json | 1 - 3 files changed, 15 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index f1ce9b3cd2..52d5e978ca 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -5,7 +5,6 @@ using System.Collections.Generic; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; -using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; @@ -46,11 +45,6 @@ namespace Microsoft.AspNet.Hosting { yield return service; } - - foreach (var service in DataProtectionServices.GetDefaultServices()) - { - yield return service; - } } } } diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index a339fa9de9..03e470620c 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Security.DataProtection; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; @@ -47,13 +46,6 @@ namespace Microsoft.AspNet.Hosting var serviceCollection = new ServiceCollection(); serviceCollection.Add(HostingServices.GetDefaultServices(config)); serviceCollection.AddInstance(hostingEnv); - // The application name is a "good enough" mechanism to identify this application - // on the machine and to prevent subkeys from being shared across multiple applications - // by default. - serviceCollection.Configure(options => - { - options.ApplicationDiscriminator = appEnv.ApplicationName; - }); var services = serviceCollection.BuildServiceProvider(_serviceProvider); diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 7bd0c8398b..e39c50689a 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -3,7 +3,6 @@ "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Microsoft.AspNet.Security.DataProtection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, From ac6f1223df1ee4564ec799bd70365d6d9976aa8c Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 20 Nov 2014 17:23:31 -0800 Subject: [PATCH 0343/1838] Hosting changes reacting to fallback being removed - HostingServices.Create() is the supported way to create a service collection with kre services imported - IHostingEnvironment is now a normal service - IConfigureHostingEnvironment is how you configure it --- .../ConfigureHostingEnvironment.cs | 22 ++++ src/Microsoft.AspNet.Hosting/HostingEngine.cs | 1 - .../HostingEnvironment.cs | 12 ++ .../HostingServices.cs | 51 +++++++- .../IConfigureHostingEnvironment.cs | 13 ++ .../IHostingEnvironment.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 18 +-- .../Startup/StartupLoader.cs | 7 +- .../WebApplication.cs | 31 ----- .../ContainerExtensions.cs | 19 ++- .../project.json | 1 + src/Microsoft.AspNet.TestHost/TestServer.cs | 29 +++-- .../Fakes/FakeService.cs | 7 ++ .../Fakes/IFactoryService.cs | 12 ++ .../Fakes/IFakeEveryService.cs | 12 ++ .../Fakes/IFakeScopedService.cs | 9 ++ .../Fakes/IFakeService.cs | 1 - .../Fakes/IFakeServiceInstance.cs | 9 ++ .../Fakes/IFakeSingletonService.cs | 9 ++ .../Fakes/INonexistentService.cs | 9 ++ .../HostingEngineTests.cs | 8 +- .../HostingServicesFacts.cs | 116 ++++++++++++++++++ .../StartupManagerTests.cs | 33 +++-- .../UseRequestServicesFacts.cs | 39 ++++-- .../UseServicesFacts.cs | 11 +- .../TestClientTests.cs | 7 +- .../TestServerTests.cs | 8 +- 27 files changed, 372 insertions(+), 124 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs create mode 100644 src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs delete mode 100644 src/Microsoft.AspNet.Hosting/WebApplication.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs new file mode 100644 index 0000000000..399054f2cd --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Hosting +{ + public class ConfigureHostingEnvironment : IConfigureHostingEnvironment + { + private readonly Action _action; + + public ConfigureHostingEnvironment(Action configure) + { + _action = configure; + } + + public void Configure(IHostingEnvironment hostingEnv) + { + _action.Invoke(hostingEnv); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 4eb09ab00d..0dc426b1a4 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -7,7 +7,6 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 3881faa333..0b0550d888 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -1,10 +1,22 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; +using Microsoft.Framework.Runtime; + namespace Microsoft.AspNet.Hosting { public class HostingEnvironment : IHostingEnvironment { + public HostingEnvironment(IApplicationEnvironment appEnv, IEnumerable configures) + { + WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath); + foreach (var configure in configures) + { + configure.Configure(this); + } + } + public string EnvironmentName { get; set; } public string WebRoot { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 52d5e978ca..9ec27a1f83 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -1,26 +1,52 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.ServiceLookup; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; +using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.Hosting { public static class HostingServices { - public static IEnumerable GetDefaultServices() + private static IServiceCollection Import(IServiceProvider fallbackProvider) { - return GetDefaultServices(new Configuration()); + var services = new ServiceCollection(); + var manifest = fallbackProvider.GetRequiredService(); + foreach (var service in manifest.Services) + { + // REVIEW: should this be Singleton instead? + services.AddTransient(service, sp => fallbackProvider.GetService(service)); + } + return services; } - public static IEnumerable GetDefaultServices(IConfiguration configuration) + public static IServiceCollection Create(IConfiguration configuration = null) { + return Create(CallContextServiceLocator.Locator.ServiceProvider); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration = null) + { + var services = Import(fallbackServices); + services.Add(GetDefaultServices(configuration)); + services.AddSingleton(sp => new HostingManifest(fallbackServices)); + return services; + } + + // REVIEW: make this private? + public static IEnumerable GetDefaultServices(IConfiguration configuration = null) + { + configuration = configuration ?? new Configuration(); var describer = new ServiceDescriber(configuration); yield return describer.Transient(); @@ -32,13 +58,16 @@ namespace Microsoft.AspNet.Hosting yield return describer.Transient(); yield return describer.Transient(); - yield return describer.Singleton(); - yield return describer.Instance(new ApplicationLifetime()); + // These three services as exported in the manifest + yield return describer.Singleton(); + yield return describer.Singleton(); // TODO: Do we expect this to be provide by the runtime eventually? yield return describer.Singleton(); + // TODO: Remove the below services and push the responsibility to frameworks to add + yield return describer.Scoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); foreach (var service in OptionsServices.GetDefaultServices()) @@ -46,5 +75,17 @@ namespace Microsoft.AspNet.Hosting yield return service; } } + + private class HostingManifest : IServiceManifest + { + public HostingManifest(IServiceProvider fallback) + { + var manifest = fallback.GetRequiredService(); + Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory) } + .Concat(manifest.Services).Distinct(); + } + + public IEnumerable Services { get; private set; } + } } } diff --git a/src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs new file mode 100644 index 0000000000..715d55b687 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs @@ -0,0 +1,13 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + [AssemblyNeutral] + public interface IConfigureHostingEnvironment + { + void Configure(IHostingEnvironment hostingEnv); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs index d510d0ba23..3760c17799 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Hosting [AssemblyNeutral] public interface IHostingEnvironment { - string EnvironmentName { get; } + string EnvironmentName { get; set; } string WebRoot { get; } } diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 03e470620c..b8bd4a2d7f 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -25,6 +25,8 @@ namespace Microsoft.AspNet.Hosting _serviceProvider = serviceProvider; } + + public void Main(string[] args) { var config = new Configuration(); @@ -35,19 +37,11 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var appEnv = _serviceProvider.GetRequiredService(); + var serviceCollection = HostingServices.Create(_serviceProvider, config); + var services = serviceCollection.BuildServiceProvider(); - var hostingEnv = new HostingEnvironment() - { - EnvironmentName = config.Get(EnvironmentKey) ?? DefaultEnvironmentName, - WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath), - }; - - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices(config)); - serviceCollection.AddInstance(hostingEnv); - - var services = serviceCollection.BuildServiceProvider(_serviceProvider); + var appEnv = services.GetRequiredService(); + var hostingEnv = services.GetRequiredService(); var context = new HostingContext() { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 1c6b2eb98a..cf41930701 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -151,8 +151,11 @@ namespace Microsoft.AspNet.Hosting.Startup { if (servicesMethod != null) { - var services = new ServiceCollection(); + var services = HostingServices.Create(builder.ApplicationServices); + // TODO: remove adding options services.Add(OptionsServices.GetDefaultServices()); + services.AddScoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); + if (servicesMethod.ReturnType == typeof(IServiceProvider)) { // IServiceProvider ConfigureServices(IServiceCollection) @@ -165,7 +168,7 @@ namespace Microsoft.AspNet.Hosting.Startup Invoke(servicesMethod, instance, builder, services); if (builder != null) { - builder.ApplicationServices = services.BuildServiceProvider(builder.ApplicationServices); + builder.ApplicationServices = services.BuildServiceProvider(); } } } diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs deleted file mode 100644 index 054f90d6d4..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; - -namespace Microsoft.AspNet.Hosting -{ - public static class WebApplication - { - public static IDisposable Start() - { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - - var context = new HostingContext - { - Services = serviceCollection.BuildServiceProvider() - }; - - var engine = context.Services.GetRequiredService(); - if (engine == null) - { - throw new Exception("TODO: IHostingEngine service not available exception"); - } - - return engine.Start(context); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index fe822f5820..31c6f51b09 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.RequestContainer; +using Microsoft.AspNet.Hosting; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.OptionsModel; @@ -17,32 +18,42 @@ namespace Microsoft.AspNet.Builder return builder.UseMiddleware(); } + // Review: what do we use these for? + public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder, IServiceProvider applicationServices) { + // REVIEW: should this be doing fallback? builder.ApplicationServices = applicationServices; return builder.UseMiddleware(); } + // Note: Manifests are lost after UseServices, services are flattened into ApplicationServices + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IEnumerable applicationServices) { return builder.UseServices(services => services.Add(applicationServices)); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Action configureServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Action configureServices) { return builder.UseServices(serviceCollection => { configureServices(serviceCollection); - return serviceCollection.BuildServiceProvider(builder.ApplicationServices); + return serviceCollection.BuildServiceProvider(); }); } - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) { - var serviceCollection = new ServiceCollection(); + // Import services from hosting/KRE as fallback + var serviceCollection = HostingServices.Create(builder.ApplicationServices); + // TODO: should remove OptionServices here soon... serviceCollection.Add(OptionsServices.GetDefaultServices()); + serviceCollection.AddScoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); + + // REVIEW: serviceCollection has the merged services, manifests are lost after this builder.ApplicationServices = configureServices(serviceCollection); return builder.UseMiddleware(); diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 31d710c78c..d8f3cef5a9 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -3,6 +3,7 @@ "description": "ASP.NET 5 enables per-request scoping of services.", "dependencies": { "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 496fc9da94..17a8dde680 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -2,7 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Linq; using System.Net.Http; +using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; @@ -46,25 +49,16 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(Action app) { - return Create(provider: CallContextServiceLocator.Locator.ServiceProvider, app: app); + return Create(CallContextServiceLocator.Locator.ServiceProvider, app); } - public static TestServer Create(IServiceProvider provider, Action app) + public static TestServer Create(IServiceProvider serviceProvider, Action app) { - var appEnv = provider.GetRequiredService(); - - var hostingEnv = new HostingEnvironment() - { - EnvironmentName = DefaultEnvironmentName, - WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath), - }; - - var collection = new ServiceCollection(); - collection.Add(HostingServices.GetDefaultServices()); - collection.AddInstance(hostingEnv); - - var appServices = collection.BuildServiceProvider(provider); + var services = HostingServices.Create(serviceProvider); + services.AddSingleton(); + //var appServices = BuildFallbackServiceProvider(services, serviceProvider); + var appServices = services.BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); } @@ -134,5 +128,10 @@ namespace Microsoft.AspNet.TestHost get { return TestServer.ServerName; } } } + + private class ConfigureTestHostingEnvironment : ConfigureHostingEnvironment + { + public ConfigureTestHostingEnvironment() : base(env => env.EnvironmentName = DefaultEnvironmentName) { } + } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs new file mode 100644 index 0000000000..75e8b53216 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class FakeService : IFakeEveryService { } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs new file mode 100644 index 0000000000..e67809bb83 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public interface IFactoryService + { + IFakeService FakeService { get; } + + int Value { get; } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs new file mode 100644 index 0000000000..9fadf70efa --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + interface IFakeEveryService : + IFakeService, + IFakeServiceInstance, + IFakeSingletonService + { + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs new file mode 100644 index 0000000000..0e5ca63193 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public interface IFakeScopedService : IFakeService + { + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs index e183e13eb2..22e1837513 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs @@ -4,5 +4,4 @@ namespace Microsoft.AspNet.Hosting.Fakes { public interface IFakeService { } - public class FakeService : IFakeService { } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs new file mode 100644 index 0000000000..e9d8bc0f47 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + interface IFakeServiceInstance : IFakeService + { + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs new file mode 100644 index 0000000000..844ad72395 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + interface IFakeSingletonService : IFakeService + { + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs new file mode 100644 index 0000000000..0e64d75641 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs @@ -0,0 +1,9 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public interface INonexistentService + { + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 01ec585067..7fa4a9a289 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -20,9 +20,7 @@ namespace Microsoft.AspNet.Hosting [Fact] public void HostingEngineCanBeResolvedWithDefaultServices() { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - var services = serviceCollection.BuildServiceProvider(); + var services = HostingServices.Create().BuildServiceProvider(); var engine = services.GetRequiredService(); @@ -32,9 +30,7 @@ namespace Microsoft.AspNet.Hosting [Fact] public void HostingEngineCanBeStarted() { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - var services = serviceCollection.BuildServiceProvider(); + var services = HostingServices.Create().BuildServiceProvider(); var engine = services.GetRequiredService(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs new file mode 100644 index 0000000000..4b2e7ae14e --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -0,0 +1,116 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Hosting.Fakes; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.DependencyInjection.ServiceLookup; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class HostingServicesFacts + { + [Fact] + public void CreateImportsServices() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddSingleton(); + var instance = new FakeService(); + var factoryInstance = new FakeFactoryService(instance); + fallbackServices.AddInstance(instance); + fallbackServices.AddTransient(); + fallbackServices.AddSingleton(serviceProvider => factoryInstance); + fallbackServices.AddTransient(); // Don't register in manifest + + fallbackServices.AddInstance(new ServiceManifest( + new Type[] { + typeof(IFakeServiceInstance), + typeof(IFakeService), + typeof(IFakeSingletonService), + typeof(IFactoryService), + typeof(INonexistentService) + })); + + var services = HostingServices.Create(fallbackServices.BuildServiceProvider()); + + // Act + var provider = services.BuildServiceProvider(); + var singleton = provider.GetRequiredService(); + var transient = provider.GetRequiredService(); + var factory = provider.GetRequiredService(); + + // Assert + Assert.Same(singleton, provider.GetRequiredService()); + Assert.NotSame(transient, provider.GetRequiredService()); + Assert.Same(instance, provider.GetRequiredService()); + Assert.Same(factoryInstance, factory); + Assert.Same(factory.FakeService, instance); + Assert.Null(provider.GetService()); + Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services + } + + [Fact] + public void CanHideImportedServices() + { + // Arrange + var fallbackServices = new ServiceCollection(); + var fallbackInstance = new FakeService(); + fallbackServices.AddInstance(fallbackInstance); + fallbackServices.AddInstance(new ServiceManifest(new Type[] { typeof(IFakeService) })); + + var services = HostingServices.Create(fallbackServices.BuildServiceProvider()); + var realInstance = new FakeService(); + services.AddInstance(realInstance); + + // Act + var provider = services.BuildServiceProvider(); + + // Assert + Assert.Equal(realInstance, provider.GetRequiredService()); + } + + [Fact] + public void CreateThrowsWithNoManifest() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddSingleton(); + var instance = new FakeService(); + fallbackServices.AddInstance(instance); + fallbackServices.AddTransient(); + + // Act + var exp = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); + + + // Assert + Assert.True(exp.Message.Contains("No service for type 'Microsoft.Framework.DependencyInjection.ServiceLookup.IServiceManifest'")); + } + + private class ServiceManifest : IServiceManifest + { + public ServiceManifest(IEnumerable services) + { + Services = services; + } + + public IEnumerable Services { get; private set; } + } + + private class FakeFactoryService : IFactoryService + { + public FakeFactoryService(FakeService service) + { + FakeService = service; + } + + public IFakeService FakeService { get; private set; } + + public int Value { get; private set; } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 764d0f9ff9..a1e083864c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -1,17 +1,17 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Xunit; using Microsoft.Framework.OptionsModel; -using Microsoft.AspNet.Builder; -using System; +using Xunit; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNet.Hosting.Tests { public class StartupManagerTests : IFakeStartupCallback @@ -45,9 +45,7 @@ namespace Microsoft.AspNet.Hosting [InlineData("ProviderArgs")] public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - var services = serviceCollection.BuildServiceProvider(); + var services = HostingServices.Create().BuildServiceProvider(); var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", environment ?? ""); @@ -67,9 +65,7 @@ namespace Microsoft.AspNet.Hosting [InlineData("FallbackProvider")] public void StartupClassConfigureServicesThatFallsbackToApplicationServices(string env) { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - var services = serviceCollection.BuildServiceProvider(); + var services = HostingServices.Create().BuildServiceProvider(); var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", env); @@ -81,12 +77,12 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(services, app.ApplicationServices); } - [Fact] - public void StartupClassWithConfigureServicesAndUseServicesAddsBothToServices() + // REVIEW: With the manifest change, Since the ConfigureServices are not imported, UseServices will mask what's in ConfigureServices + // This will throw since ConfigureServices consumes manifest and then UseServices will blow up + [Fact(Skip = "Review Failure")] + public void StartupClassWithConfigureServicesAndUseServicesHidesConfigureServices() { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); - var services = serviceCollection.BuildServiceProvider(); + var services = HostingServices.Create().BuildServiceProvider(); var manager = services.GetRequiredService(); var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "UseServices"); @@ -96,19 +92,18 @@ namespace Microsoft.AspNet.Hosting startup.Invoke(app); Assert.NotNull(app.ApplicationServices.GetRequiredService()); - Assert.NotNull(app.ApplicationServices.GetRequiredService()); + Assert.Null(app.ApplicationServices.GetService()); var options = app.ApplicationServices.GetRequiredService>().Options; Assert.NotNull(options); Assert.Equal("Configured", options.Message); - Assert.False(options.Configured); // REVIEW: why doesn't the ConfigureServices ConfigureOptions get run? + Assert.False(options.Configured); // Options never resolved from inner containers } [Fact] public void StartupWithNoConfigureThrows() { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); + var serviceCollection = HostingServices.Create(); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); var manager = services.GetRequiredService(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 1229df1bb4..7b01e54c6f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -1,12 +1,17 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; -using Xunit; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.PipelineCore; using Microsoft.AspNet.RequestContainer; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.Logging; +using Xunit; namespace Microsoft.AspNet.Hosting.Tests { @@ -15,9 +20,7 @@ namespace Microsoft.AspNet.Hosting.Tests [Fact] public void RequestServicesAvailableOnlyAfterRequestServices() { - var baseServiceProvider = new ServiceCollection() - .Add(HostingServices.GetDefaultServices()) - .BuildServiceProvider(); + var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); var builder = new ApplicationBuilder(baseServiceProvider); bool foundRequestServicesBefore = false; @@ -45,9 +48,7 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(false)] public void EnsureRequestServicesSetsRequestServices(bool initializeApplicationServices) { - var baseServiceProvider = new ServiceCollection() - .Add(HostingServices.GetDefaultServices()) - .BuildServiceProvider(); + var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); var builder = new ApplicationBuilder(baseServiceProvider); bool foundRequestServicesBefore = false; @@ -80,5 +81,25 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.True(foundRequestServicesAfter); } + [Theory] + [InlineData(typeof(IHostingEngine))] + [InlineData(typeof(IServerManager))] + [InlineData(typeof(IStartupManager))] + [InlineData(typeof(IStartupLoaderProvider))] + [InlineData(typeof(IApplicationBuilderFactory))] + [InlineData(typeof(IStartupLoaderProvider))] + [InlineData(typeof(IHttpContextFactory))] + [InlineData(typeof(ITypeActivator))] + [InlineData(typeof(IApplicationLifetime))] + [InlineData(typeof(ILoggerFactory))] + public void UseRequestServicesHostingImportedServicesAreDefined(Type service) + { + var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); + var builder = new ApplicationBuilder(baseServiceProvider); + + builder.UseRequestServices(); + + Assert.NotNull(builder.ApplicationServices.GetRequiredService(service)); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs index d556e2b4fe..54b9b50eeb 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs @@ -6,9 +6,8 @@ using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.OptionsModel; +using Microsoft.Framework.Runtime.Infrastructure; using Xunit; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore; namespace Microsoft.AspNet.Hosting.Tests { @@ -17,8 +16,7 @@ namespace Microsoft.AspNet.Hosting.Tests [Fact] public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithAction() { - var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); - var builder = new ApplicationBuilder(baseServiceProvider); + var builder = new ApplicationBuilder(CallContextServiceLocator.Locator.ServiceProvider); builder.UseServices(serviceCollection => { }); @@ -30,13 +28,12 @@ namespace Microsoft.AspNet.Hosting.Tests [Fact] public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithFunc() { - var baseServiceProvider = new ServiceCollection().BuildServiceProvider(); - var builder = new ApplicationBuilder(baseServiceProvider); + var builder = new ApplicationBuilder(CallContextServiceLocator.Locator.ServiceProvider); IServiceProvider serviceProvider = null; builder.UseServices(serviceCollection => { - serviceProvider = serviceCollection.BuildServiceProvider(builder.ApplicationServices); + serviceProvider = serviceCollection.BuildServiceProvider(); return serviceProvider; }); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index c1ba2d9f59..467aca2005 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -6,10 +6,9 @@ using System.IO; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.Runtime; using Xunit; namespace Microsoft.AspNet.TestHost @@ -21,9 +20,7 @@ namespace Microsoft.AspNet.TestHost public TestClientTests() { - _services = new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); + _services = HostingServices.Create().BuildServiceProvider(); _server = TestServer.Create(_services, app => app.Run(ctx => Task.FromResult(0))); } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 8a9bacf97b..52267bba35 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -11,7 +11,6 @@ using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.Runtime; using Xunit; namespace Microsoft.AspNet.TestHost @@ -22,9 +21,7 @@ namespace Microsoft.AspNet.TestHost public void CreateWithDelegate() { // Arrange - var services = new ServiceCollection() - .AddSingleton() - .BuildServiceProvider(); + var services = HostingServices.Create().BuildServiceProvider(); // Act & Assert Assert.DoesNotThrow(() => TestServer.Create(services, app => { })); @@ -34,8 +31,7 @@ namespace Microsoft.AspNet.TestHost public void ThrowsIfNoApplicationEnvironmentIsRegisteredWithTheProvider() { // Arrange - var services = new ServiceCollection() - .BuildServiceProvider(); + var services = new ServiceCollection().BuildServiceProvider(); // Act & Assert Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); From 63c8e1889bafcb709f11b49a97a8170137d431eb Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 20 Nov 2014 17:37:35 -0800 Subject: [PATCH 0344/1838] Add IServiceManifest --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- src/Microsoft.AspNet.Hosting/IServiceManifest.cs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Hosting/IServiceManifest.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 9ec27a1f83..8d2d015ea5 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -88,4 +88,4 @@ namespace Microsoft.AspNet.Hosting public IEnumerable Services { get; private set; } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IServiceManifest.cs b/src/Microsoft.AspNet.Hosting/IServiceManifest.cs new file mode 100644 index 0000000000..3810fdc06c --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IServiceManifest.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Framework.DependencyInjection.ServiceLookup +{ +#if ASPNET50 || ASPNETCORE50 + [Microsoft.Framework.Runtime.AssemblyNeutral] +#endif + public interface IServiceManifest + { + IEnumerable Services { get; } + } +} From 2f02fc6091fcac25ffe0f2bc4f50cdc25f72ffd8 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 21 Nov 2014 15:01:52 -0800 Subject: [PATCH 0345/1838] Fix SelfHost to default to config environment Fixes MusicStore --- src/Microsoft.AspNet.Hosting/Program.cs | 4 ++++ src/Microsoft.AspNet.TestHost/TestServer.cs | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index b8bd4a2d7f..ba69bab638 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -38,6 +38,10 @@ namespace Microsoft.AspNet.Hosting config.AddCommandLine(args); var serviceCollection = HostingServices.Create(_serviceProvider, config); + serviceCollection.AddInstance(new ConfigureHostingEnvironment(env => + { + env.EnvironmentName = config.Get(EnvironmentKey) ?? DefaultEnvironmentName; + })); var services = serviceCollection.BuildServiceProvider(); var appEnv = services.GetRequiredService(); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 17a8dde680..9e88b16b58 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -57,7 +57,6 @@ namespace Microsoft.AspNet.TestHost var services = HostingServices.Create(serviceProvider); services.AddSingleton(); - //var appServices = BuildFallbackServiceProvider(services, serviceProvider); var appServices = services.BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); From bd5c07d66a48770efe0499d4356c8217af94858d Mon Sep 17 00:00:00 2001 From: Glenn Condron Date: Fri, 21 Nov 2014 17:04:04 -0800 Subject: [PATCH 0346/1838] Move default hosting environment code --- .../ConfigureHostingEnvironment.cs | 13 +++++---- .../HostingEnvironment.cs | 3 ++ .../HostingServices.cs | 1 + src/Microsoft.AspNet.Hosting/Program.cs | 10 ++----- src/Microsoft.AspNet.TestHost/TestServer.cs | 10 +------ .../Microsoft.AspNet.Hosting.Tests.kproj | 29 ++++++++++--------- .../Microsoft.AspNet.TestHost.Tests.kproj | 29 ++++++++++--------- 7 files changed, 44 insertions(+), 51 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs index 399054f2cd..420b731122 100644 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -1,22 +1,23 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - using System; +using Microsoft.Framework.ConfigurationModel; namespace Microsoft.AspNet.Hosting { - public class ConfigureHostingEnvironment : IConfigureHostingEnvironment + internal class ConfigureHostingEnvironment : IConfigureHostingEnvironment { - private readonly Action _action; + private IConfiguration _config; + private const string EnvironmentKey = "KRE_ENV"; - public ConfigureHostingEnvironment(Action configure) + public ConfigureHostingEnvironment(IConfiguration config) { - _action = configure; + _config = config; } public void Configure(IHostingEnvironment hostingEnv) { - _action.Invoke(hostingEnv); + hostingEnv.EnvironmentName = _config.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 0b0550d888..f137f2ae5b 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -8,9 +8,12 @@ namespace Microsoft.AspNet.Hosting { public class HostingEnvironment : IHostingEnvironment { + private const string DefaultEnvironmentName = "Development"; + public HostingEnvironment(IApplicationEnvironment appEnv, IEnumerable configures) { WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath); + EnvironmentName = DefaultEnvironmentName; foreach (var configure in configures) { configure.Configure(this); diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 8d2d015ea5..605453f2e9 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -40,6 +40,7 @@ namespace Microsoft.AspNet.Hosting var services = Import(fallbackServices); services.Add(GetDefaultServices(configuration)); services.AddSingleton(sp => new HostingManifest(fallbackServices)); + services.AddInstance(new ConfigureHostingEnvironment(configuration)); return services; } diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index ba69bab638..4776c41223 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -15,8 +15,6 @@ namespace Microsoft.AspNet.Hosting public class Program { private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini"; - private const string DefaultEnvironmentName = "Development"; - private const string EnvironmentKey = "KRE_ENV"; private readonly IServiceProvider _serviceProvider; @@ -37,12 +35,8 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var serviceCollection = HostingServices.Create(_serviceProvider, config); - serviceCollection.AddInstance(new ConfigureHostingEnvironment(env => - { - env.EnvironmentName = config.Get(EnvironmentKey) ?? DefaultEnvironmentName; - })); - var services = serviceCollection.BuildServiceProvider(); + var services = HostingServices.Create(_serviceProvider, config) + .BuildServiceProvider(); var appEnv = services.GetRequiredService(); var hostingEnv = services.GetRequiredService(); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 9e88b16b58..97e848033a 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -54,10 +54,7 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(IServiceProvider serviceProvider, Action app) { - var services = HostingServices.Create(serviceProvider); - services.AddSingleton(); - - var appServices = services.BuildServiceProvider(); + var appServices = HostingServices.Create(serviceProvider).BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); } @@ -127,10 +124,5 @@ namespace Microsoft.AspNet.TestHost get { return TestServer.ServerName; } } } - - private class ConfigureTestHostingEnvironment : ConfigureHostingEnvironment - { - public ConfigureTestHostingEnvironment() : base(env => env.EnvironmentName = DefaultEnvironmentName) { } - } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 95b1cc35f3..247779b53f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -1,14 +1,15 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - d4f18d58-52b1-435d-a012-10f2cdf158c4 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + 50390 + + + + d4f18d58-52b1-435d-a012-10f2cdf158c4 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index 259cc5243d..be290d126c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -1,14 +1,15 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 0acb2719-9484-49b5-b8e3-117091192511 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + 50389 + + + + 0acb2719-9484-49b5-b8e3-117091192511 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + \ No newline at end of file From 075edc516c5b65432f605ae9fbb5080289863127 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 23 Nov 2014 22:48:28 -0800 Subject: [PATCH 0347/1838] Handle null configuration in HostingServices.Create --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 605453f2e9..e2372db87d 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -32,11 +32,12 @@ namespace Microsoft.AspNet.Hosting public static IServiceCollection Create(IConfiguration configuration = null) { - return Create(CallContextServiceLocator.Locator.ServiceProvider); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configuration); } public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration = null) { + configuration = configuration ?? new Configuration(); var services = Import(fallbackServices); services.Add(GetDefaultServices(configuration)); services.AddSingleton(sp => new HostingManifest(fallbackServices)); From aebfecdf87023dd1d39fe74b9bc9e3e6755884d1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 24 Nov 2014 10:10:51 -0800 Subject: [PATCH 0348/1838] Reacting to DI changes --- test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs index 9fadf70efa..6e279051e2 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs @@ -4,7 +4,7 @@ namespace Microsoft.AspNet.Hosting.Fakes { interface IFakeEveryService : - IFakeService, + IFakeScopedService, IFakeServiceInstance, IFakeSingletonService { From a9827a43105f97ec8ff6e1c4aa6f3f1f59d59b1e Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 24 Nov 2014 17:33:11 -0800 Subject: [PATCH 0349/1838] GetDefaultServices -> AddHosting Also stop adding options --- .../HostingServices.cs | 42 +-------------- .../HostingServicesCollectionExtensions.cs | 53 +++++++++++++++++++ .../Startup/StartupLoader.cs | 6 +-- .../ContainerExtensions.cs | 6 +-- .../Fakes/Startup.cs | 11 ++-- .../StartupManagerTests.cs | 3 +- .../UseServicesFacts.cs | 45 ---------------- 7 files changed, 67 insertions(+), 99 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index e2372db87d..3ff28e403f 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -4,14 +4,10 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.ServiceLookup; using Microsoft.Framework.Logging; -using Microsoft.Framework.OptionsModel; using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.Hosting @@ -24,7 +20,6 @@ namespace Microsoft.AspNet.Hosting var manifest = fallbackProvider.GetRequiredService(); foreach (var service in manifest.Services) { - // REVIEW: should this be Singleton instead? services.AddTransient(service, sp => fallbackProvider.GetService(service)); } return services; @@ -39,45 +34,12 @@ namespace Microsoft.AspNet.Hosting { configuration = configuration ?? new Configuration(); var services = Import(fallbackServices); - services.Add(GetDefaultServices(configuration)); + services.AddHosting(configuration); services.AddSingleton(sp => new HostingManifest(fallbackServices)); - services.AddInstance(new ConfigureHostingEnvironment(configuration)); return services; } - // REVIEW: make this private? - public static IEnumerable GetDefaultServices(IConfiguration configuration = null) - { - configuration = configuration ?? new Configuration(); - var describer = new ServiceDescriber(configuration); - - yield return describer.Transient(); - yield return describer.Transient(); - - yield return describer.Transient(); - yield return describer.Transient(); - - yield return describer.Transient(); - yield return describer.Transient(); - - yield return describer.Instance(new ApplicationLifetime()); - - // These three services as exported in the manifest - yield return describer.Singleton(); - yield return describer.Singleton(); - // TODO: Do we expect this to be provide by the runtime eventually? - yield return describer.Singleton(); - - // TODO: Remove the below services and push the responsibility to frameworks to add - - yield return describer.Scoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); - - foreach (var service in OptionsServices.GetDefaultServices()) - { - yield return service; - } - } - + // Manifest exposes the fallback manifest in addition to ITypeActivator, IHostingEnvironment, and ILoggerFactory private class HostingManifest : IServiceManifest { public HostingManifest(IServiceProvider fallback) diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs new file mode 100644 index 0000000000..ac661999b2 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Logging; + +namespace Microsoft.Framework.DependencyInjection +{ + public static class HostingServicesExtensions + { + // REVIEW: Logging doesn't depend on DI, where should this live? + public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config = null) + { + var describe = new ServiceDescriber(config); + services.TryAdd(describe.Singleton()); + return services; + } + + public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) + { + var describer = new ServiceDescriber(configuration); + + services.TryAdd(describer.Transient()); + services.TryAdd(describer.Transient()); + + services.TryAdd(describer.Transient()); + services.TryAdd(describer.Transient()); + + services.TryAdd(describer.Transient()); + services.TryAdd(describer.Transient()); + + services.TryAdd(describer.Instance(new ApplicationLifetime())); + + services.AddTypeActivator(configuration); + // TODO: Do we expect this to be provide by the runtime eventually? + services.AddLogging(configuration); + // REVIEW: okay to use existing hosting environment/httpcontext if specified? + services.TryAdd(describer.Singleton()); + + // TODO: Remove this once we have IHttpContextAccessor + services.AddContextAccessor(configuration); + + // REVIEW: don't try add because we pull out IEnumerable? + services.AddInstance(new ConfigureHostingEnvironment(configuration)); + + return services; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index cf41930701..c76153e9d0 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -152,10 +152,8 @@ namespace Microsoft.AspNet.Hosting.Startup if (servicesMethod != null) { var services = HostingServices.Create(builder.ApplicationServices); - // TODO: remove adding options - services.Add(OptionsServices.GetDefaultServices()); - services.AddScoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); - + // TODO: remove this once IHttpContextAccessor service is added + services.AddContextAccessor(); if (servicesMethod.ReturnType == typeof(IServiceProvider)) { // IServiceProvider ConfigureServices(IServiceCollection) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 31c6f51b09..9813e9164f 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -7,7 +7,6 @@ using Microsoft.AspNet.RequestContainer; using Microsoft.AspNet.Hosting; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Builder { @@ -49,9 +48,8 @@ namespace Microsoft.AspNet.Builder // Import services from hosting/KRE as fallback var serviceCollection = HostingServices.Create(builder.ApplicationServices); - // TODO: should remove OptionServices here soon... - serviceCollection.Add(OptionsServices.GetDefaultServices()); - serviceCollection.AddScoped(typeof(IContextAccessor<>), typeof(ContextAccessor<>)); + // TODO: remove this once IHttpContextAccessor service is added + serviceCollection.AddContextAccessor(); // REVIEW: serviceCollection has the merged services, manifests are lost after this builder.ApplicationServices = configureServices(serviceCollection); diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 5a85b82357..e657841566 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -17,11 +17,13 @@ namespace Microsoft.AspNet.Hosting.Fakes public void ConfigureServices(IServiceCollection services) { + services.AddOptions(); services.Configure(o => o.Configured = true); } public void ConfigureDevServices(IServiceCollection services) { + services.AddOptions(); services.Configure(o => { o.Configured = true; @@ -31,6 +33,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public void ConfigureRetailServices(IServiceCollection services) { + services.AddOptions(); services.Configure(o => { o.Configured = true; @@ -40,6 +43,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public static void ConfigureStaticServices(IServiceCollection services) { + services.AddOptions(); services.Configure(o => { o.Configured = true; @@ -49,8 +53,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public static IServiceProvider ConfigureStaticProviderServices() { - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); + var services = new ServiceCollection().AddOptions(); services.Configure(o => { o.Configured = true; @@ -71,6 +74,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public IServiceProvider ConfigureProviderServices(IServiceCollection services) { + services.AddOptions(); services.Configure(o => { o.Configured = true; @@ -81,8 +85,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public IServiceProvider ConfigureProviderArgsServices(IApplicationBuilder me) { - var services = new ServiceCollection(); - services.Add(OptionsServices.GetDefaultServices()); + var services = new ServiceCollection().AddOptions(); services.Configure(o => { o.Configured = true; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index a1e083864c..10016cdd1b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -21,8 +21,7 @@ namespace Microsoft.AspNet.Hosting.Tests [Fact] public void StartupClassMayHaveHostingServicesInjected() { - var serviceCollection = new ServiceCollection(); - serviceCollection.Add(HostingServices.GetDefaultServices()); + var serviceCollection = new ServiceCollection().AddHosting(); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs deleted file mode 100644 index 54b9b50eeb..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/UseServicesFacts.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.OptionsModel; -using Microsoft.Framework.Runtime.Infrastructure; -using Xunit; - -namespace Microsoft.AspNet.Hosting.Tests -{ - public class UseServicesFacts - { - [Fact] - public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithAction() - { - var builder = new ApplicationBuilder(CallContextServiceLocator.Locator.ServiceProvider); - - builder.UseServices(serviceCollection => { }); - - var optionsAccessor = builder.ApplicationServices.GetRequiredService>(); - Assert.NotNull(optionsAccessor); - } - - - [Fact] - public void OptionsAccessorCanBeResolvedAfterCallingUseServicesWithFunc() - { - var builder = new ApplicationBuilder(CallContextServiceLocator.Locator.ServiceProvider); - IServiceProvider serviceProvider = null; - - builder.UseServices(serviceCollection => - { - serviceProvider = serviceCollection.BuildServiceProvider(); - return serviceProvider; - }); - - Assert.Same(serviceProvider, builder.ApplicationServices); - var optionsAccessor = builder.ApplicationServices.GetRequiredService>(); - Assert.NotNull(optionsAccessor); - } - } -} \ No newline at end of file From bf0c8c95b0b2517708079ea783235a19b7108c4a Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Tue, 25 Nov 2014 10:47:58 -0800 Subject: [PATCH 0350/1838] Add schema version to kproj files --- .../Microsoft.AspNet.Hosting.kproj | 3 +++ .../Microsoft.AspNet.RequestContainer.kproj | 3 +++ .../Microsoft.AspNet.TestHost.kproj | 3 +++ .../Microsoft.AspNet.Hosting.Tests.kproj | 8 +++++--- .../Microsoft.AspNet.TestHost.Tests.kproj | 8 +++++--- 5 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj index 28467979c0..e98519ce8c 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj index 43376819b1..9740be9106 100644 --- a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj +++ b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj index 0ec30b643d..67078fd3b5 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 247779b53f..e82e9b32a2 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -1,9 +1,8 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - 50390 @@ -11,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj index be290d126c..04d1606ca3 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj @@ -1,9 +1,8 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - 50389 @@ -11,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + - \ No newline at end of file + From 756970390688ceaca7bc26fb956723a0e1e8b6d7 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Tue, 25 Nov 2014 10:49:23 -0800 Subject: [PATCH 0351/1838] Add schema version to kproj files --- .../Microsoft.AspNet.FeatureModel.kproj | 3 +++ .../Microsoft.AspNet.Http.Extensions.kproj | 3 +++ src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 3 +++ .../Microsoft.AspNet.HttpFeature.kproj | 3 +++ src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 3 +++ .../Microsoft.AspNet.PipelineCore.kproj | 3 +++ .../Microsoft.AspNet.WebUtilities.kproj | 3 +++ .../Microsoft.AspNet.FeatureModel.Tests.kproj | 3 +++ .../Microsoft.AspNet.Http.Extensions.Tests.kproj | 3 +++ .../Microsoft.AspNet.Http.Tests.kproj | 3 +++ .../Microsoft.AspNet.Owin.Tests.kproj | 3 +++ .../Microsoft.AspNet.PipelineCore.Tests.kproj | 3 +++ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 3 +++ 13 files changed, 39 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index c155c5e1aa..561cd372d7 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index 2f956b8741..a9b64e3c08 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index c99a5537ec..1ccadbc30a 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index d1cd481026..25a0e7caf2 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 975d5aab4a..b0acecf075 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 6a7b9e0bc5..3a0556def8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index ab15d3d1bd..75dd8975e7 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj index 546c32e745..048ee0ea9b 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index 6718966d19..cf6c82e1bb 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj index ee16369726..f307eafd3c 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj index 7214982973..135f58392d 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj index e8e0464bee..1e73261367 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj +++ b/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index 8dc5e1a1c4..1a6f3883fd 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -10,5 +10,8 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ + + 2.0 + From d85580649f4b6ef870168f1baec14a88810c403a Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 3 Dec 2014 11:38:31 -0800 Subject: [PATCH 0352/1838] Update the expected exception from DI --- test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 4b2e7ae14e..65aa6faecd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -84,7 +84,7 @@ namespace Microsoft.AspNet.Hosting.Tests fallbackServices.AddTransient(); // Act - var exp = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); + var exp = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); // Assert diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 52267bba35..4f8b619dd7 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.TestHost var services = new ServiceCollection().BuildServiceProvider(); // Act & Assert - Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); + Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); } [Fact] From 99c566cac1cd6ea1ea6c3613602d980fb04925ba Mon Sep 17 00:00:00 2001 From: aidan casey Date: Fri, 5 Dec 2014 04:54:58 +1100 Subject: [PATCH 0353/1838] NDC London bug fix! , changing environment variable name --- src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs index 420b731122..a714c2cfef 100644 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Hosting internal class ConfigureHostingEnvironment : IConfigureHostingEnvironment { private IConfiguration _config; - private const string EnvironmentKey = "KRE_ENV"; + private const string EnvironmentKey = "ASPNET_ENV"; public ConfigureHostingEnvironment(IConfiguration config) { From b883968eefa73f7b546c681e5135f515ff666a13 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 4 Dec 2014 14:44:16 -0800 Subject: [PATCH 0354/1838] #86 - Implement IWebRootFileSystemProvider --- .../HostingEnvironment.cs | 5 +- .../HostingServicesCollectionExtensions.cs | 2 + .../IHostingEnvironment.cs | 2 - .../IWebRootFileSystemProvider.cs | 18 +++++++ .../WebRootFileSystemProvider.cs | 50 +++++++++++++++++++ src/Microsoft.AspNet.Hosting/project.json | 1 + .../HostingEngineTests.cs | 10 ++++ .../testroot/TextFile.txt | 1 + .../TestServerTests.cs | 6 +-- .../project.json | 3 +- 10 files changed, 87 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs create mode 100644 src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/testroot/TextFile.txt diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index f137f2ae5b..acafebc789 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -10,9 +10,8 @@ namespace Microsoft.AspNet.Hosting { private const string DefaultEnvironmentName = "Development"; - public HostingEnvironment(IApplicationEnvironment appEnv, IEnumerable configures) + public HostingEnvironment(IEnumerable configures) { - WebRoot = HostingUtilities.GetWebRoot(appEnv.ApplicationBasePath); EnvironmentName = DefaultEnvironmentName; foreach (var configure in configures) { @@ -21,7 +20,5 @@ namespace Microsoft.AspNet.Hosting } public string EnvironmentName { get; set; } - - public string WebRoot { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index ac661999b2..ee9fea15aa 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -35,6 +35,8 @@ namespace Microsoft.Framework.DependencyInjection services.TryAdd(describer.Instance(new ApplicationLifetime())); + services.TryAdd(describer.Singleton()); + services.AddTypeActivator(configuration); // TODO: Do we expect this to be provide by the runtime eventually? services.AddLogging(configuration); diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs index 3760c17799..380c72550e 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs @@ -9,7 +9,5 @@ namespace Microsoft.AspNet.Hosting public interface IHostingEnvironment { string EnvironmentName { get; set; } - - string WebRoot { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs b/src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs new file mode 100644 index 0000000000..8f65cff6e4 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.FileSystems; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + [AssemblyNeutral] + public interface IWebRootFileSystemProvider + { + string WebRoot { get; } + + IFileSystem GetFileSystem(); + + string MapPath(string path); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs b/src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs new file mode 100644 index 0000000000..79fefaab5e --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.AspNet.FileSystems; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + public class WebRootFileSystemProvider : IWebRootFileSystemProvider + { + private readonly IFileSystem _fileSystem; + + public WebRootFileSystemProvider(IApplicationEnvironment appEnvironment) + { + var root = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); + + if (!string.IsNullOrEmpty(root) && + root[root.Length - 1] != Path.DirectorySeparatorChar) + { + root += Path.DirectorySeparatorChar; + } + + WebRoot = root; + + _fileSystem = new PhysicalFileSystem(WebRoot); + } + + public string WebRoot { get; private set; } + + public IFileSystem GetFileSystem() + { + return _fileSystem; + } + + public string MapPath(string path) + { + var fullPath = Path.GetFullPath(Path.Combine(WebRoot, path)); + + // Don't allow MapPath to escape the base root directory + if (!fullPath.StartsWith(WebRoot, StringComparison.OrdinalIgnoreCase)) + { + throw new ArgumentException("Invalid path: " + path, nameof(path)); + } + + return fullPath; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index e39c50689a..63dd7c6c7d 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { + "Microsoft.AspNet.FileSystems": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 7fa4a9a289..3677b8041d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Server; @@ -52,6 +53,15 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void WebRootCanBeResolvedFromTheProjectJson() + { + var services = HostingServices.Create().BuildServiceProvider(); + var provider = services.GetRequiredService(); + Assert.Equal(Path.GetFullPath("testroot") + Path.DirectorySeparatorChar, provider.WebRoot); + Assert.True(provider.GetFileSystem().GetFileInfo("TextFile.txt").Exists); + } + public void Initialize(IApplicationBuilder builder) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/testroot/TextFile.txt b/test/Microsoft.AspNet.Hosting.Tests/testroot/TextFile.txt new file mode 100644 index 0000000000..d5669ad838 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/testroot/TextFile.txt @@ -0,0 +1 @@ +A text file. \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 4f8b619dd7..c64c0af3fc 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -53,12 +53,12 @@ namespace Microsoft.AspNet.TestHost } [Fact] - public void WebRootCanBeResolvedFromProjectJson() + public void WebRootCanBeResolvedWhenNotInTheProjectJson() { TestServer server = TestServer.Create(app => { - var env = app.ApplicationServices.GetRequiredService(); - Assert.Equal(Path.GetFullPath("testroot"), env.WebRoot); + var provider = app.ApplicationServices.GetRequiredService(); + Assert.Equal(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar, provider.WebRoot); }); } diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index ef0573cbe7..996af770f3 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -8,6 +8,5 @@ }, "frameworks": { "aspnet50": { } - }, - "webroot": "testroot" + } } From 03e4739a3f608822ed3202634eb3412c291dd82d Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 4 Dec 2014 17:23:21 -0800 Subject: [PATCH 0355/1838] Re-merge IWebRoot & IHostingEnv. --- .../HostingEnvironment.cs | 9 +++- .../HostingServicesCollectionExtensions.cs | 2 - .../IHostingEnvironment.cs | 5 ++ .../IWebRootFileSystemProvider.cs | 18 ------- .../WebRootFileSystemProvider.cs | 50 ------------------- .../HostingEngineTests.cs | 6 +-- .../TestServerTests.cs | 4 +- 7 files changed, 18 insertions(+), 76 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs delete mode 100644 src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index acafebc789..7644d5f38b 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.AspNet.FileSystems; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -10,9 +11,11 @@ namespace Microsoft.AspNet.Hosting { private const string DefaultEnvironmentName = "Development"; - public HostingEnvironment(IEnumerable configures) + public HostingEnvironment(IApplicationEnvironment appEnvironment, IEnumerable configures) { EnvironmentName = DefaultEnvironmentName; + WebRoot = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); + WebRootFileSystem = new PhysicalFileSystem(WebRoot); foreach (var configure in configures) { configure.Configure(this); @@ -20,5 +23,9 @@ namespace Microsoft.AspNet.Hosting } public string EnvironmentName { get; set; } + + public string WebRoot { get; private set; } + + public IFileSystem WebRootFileSystem { get; private set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index ee9fea15aa..ac661999b2 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -35,8 +35,6 @@ namespace Microsoft.Framework.DependencyInjection services.TryAdd(describer.Instance(new ApplicationLifetime())); - services.TryAdd(describer.Singleton()); - services.AddTypeActivator(configuration); // TODO: Do we expect this to be provide by the runtime eventually? services.AddLogging(configuration); diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs index 380c72550e..6505f1cf57 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.AspNet.FileSystems; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -9,5 +10,9 @@ namespace Microsoft.AspNet.Hosting public interface IHostingEnvironment { string EnvironmentName { get; set; } + + string WebRoot { get; } + + IFileSystem WebRootFileSystem { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs b/src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs deleted file mode 100644 index 8f65cff6e4..0000000000 --- a/src/Microsoft.AspNet.Hosting/IWebRootFileSystemProvider.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.FileSystems; -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.Hosting -{ - [AssemblyNeutral] - public interface IWebRootFileSystemProvider - { - string WebRoot { get; } - - IFileSystem GetFileSystem(); - - string MapPath(string path); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs b/src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs deleted file mode 100644 index 79fefaab5e..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebRootFileSystemProvider.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using Microsoft.AspNet.FileSystems; -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.Hosting -{ - public class WebRootFileSystemProvider : IWebRootFileSystemProvider - { - private readonly IFileSystem _fileSystem; - - public WebRootFileSystemProvider(IApplicationEnvironment appEnvironment) - { - var root = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); - - if (!string.IsNullOrEmpty(root) && - root[root.Length - 1] != Path.DirectorySeparatorChar) - { - root += Path.DirectorySeparatorChar; - } - - WebRoot = root; - - _fileSystem = new PhysicalFileSystem(WebRoot); - } - - public string WebRoot { get; private set; } - - public IFileSystem GetFileSystem() - { - return _fileSystem; - } - - public string MapPath(string path) - { - var fullPath = Path.GetFullPath(Path.Combine(WebRoot, path)); - - // Don't allow MapPath to escape the base root directory - if (!fullPath.StartsWith(WebRoot, StringComparison.OrdinalIgnoreCase)) - { - throw new ArgumentException("Invalid path: " + path, nameof(path)); - } - - return fullPath; - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 3677b8041d..e2e0ba6852 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -57,9 +57,9 @@ namespace Microsoft.AspNet.Hosting public void WebRootCanBeResolvedFromTheProjectJson() { var services = HostingServices.Create().BuildServiceProvider(); - var provider = services.GetRequiredService(); - Assert.Equal(Path.GetFullPath("testroot") + Path.DirectorySeparatorChar, provider.WebRoot); - Assert.True(provider.GetFileSystem().GetFileInfo("TextFile.txt").Exists); + var env = services.GetRequiredService(); + Assert.Equal(Path.GetFullPath("testroot"), env.WebRoot); + Assert.True(env.WebRootFileSystem.GetFileInfo("TextFile.txt").Exists); } public void Initialize(IApplicationBuilder builder) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index c64c0af3fc..9a1a2c7b19 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -57,8 +57,8 @@ namespace Microsoft.AspNet.TestHost { TestServer server = TestServer.Create(app => { - var provider = app.ApplicationServices.GetRequiredService(); - Assert.Equal(Directory.GetCurrentDirectory() + Path.DirectorySeparatorChar, provider.WebRoot); + var env = app.ApplicationServices.GetRequiredService(); + Assert.Equal(Directory.GetCurrentDirectory(), env.WebRoot); }); } From 2155c08e7684dc2dd3f4872ba1ac2b59670fcb00 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 5 Dec 2014 09:24:06 -0800 Subject: [PATCH 0356/1838] Make WebRootFileSystem settable. --- src/Microsoft.AspNet.Hosting/HostingEnvironment.cs | 2 +- src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 7644d5f38b..181aa6aac8 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -26,6 +26,6 @@ namespace Microsoft.AspNet.Hosting public string WebRoot { get; private set; } - public IFileSystem WebRootFileSystem { get; private set; } + public IFileSystem WebRootFileSystem { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs index 6505f1cf57..bcf0e6b812 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs @@ -13,6 +13,6 @@ namespace Microsoft.AspNet.Hosting string WebRoot { get; } - IFileSystem WebRootFileSystem { get; } + IFileSystem WebRootFileSystem { get; set; } } } \ No newline at end of file From 559f5491d41b257608e5cd79633498cdf6b9335e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 5 Dec 2014 06:20:23 -0800 Subject: [PATCH 0357/1838] Make services registered in ConfigureServices work in Configure - Added a test #114 --- .../Startup/StartupLoader.cs | 3 +- .../Fakes/StartupWithConfigureServices.cs | 35 +++++++++++++++++++ .../StartupManagerTests.cs | 17 +++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index c76153e9d0..8063d48c44 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -57,6 +57,7 @@ namespace Microsoft.AspNet.Hosting.Startup private object Invoke(MethodInfo methodInfo, object instance, IApplicationBuilder builder, IServiceCollection services = null) { + var serviceProvider = builder?.ApplicationServices ?? _services; var parameterInfos = methodInfo.GetParameters(); var parameters = new object[parameterInfos.Length]; for (var index = 0; index != parameterInfos.Length; ++index) @@ -74,7 +75,7 @@ namespace Microsoft.AspNet.Hosting.Startup { try { - parameters[index] = _services.GetRequiredService(parameterInfo.ParameterType); + parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); } catch (Exception) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs new file mode 100644 index 0000000000..8c580bb13b --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs @@ -0,0 +1,35 @@ +using System; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupWithConfigureServices + { + public void ConfigureServices(IServiceCollection services) + { + services.AddSingleton(); + } + + public void Configure(IApplicationBuilder app, IFoo foo) + { + foo.Bar(); + } + + public interface IFoo + { + bool Invoked { get; } + void Bar(); + } + + public class Foo : IFoo + { + public bool Invoked { get; private set; } + + public void Bar() + { + Invoked = true; + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 10016cdd1b..d9789bfccf 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -111,6 +111,23 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.True(ex.Message.Contains("ConfigureBoom or Configure method not found")); } + [Fact] + public void StartupClassWithConfigureServicesShouldMakeServiceAvailableInConfigure() + { + var serviceCollection = HostingServices.Create(); + var services = serviceCollection.BuildServiceProvider(); + var manager = services.GetRequiredService(); + + var app = new ApplicationBuilder(services); + + var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithConfigureServices"); + + startup.Invoke(app); + + var foo = app.ApplicationServices.GetRequiredService(); + Assert.True(foo.Invoked); + } + public void ConfigurationMethodCalled(object instance) { _configurationMethodCalledList.Add(instance); From a5ab6149379d360dce679a88cd4ee334dcea580e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 6 Dec 2014 10:35:37 -0800 Subject: [PATCH 0358/1838] Removed the null check for IApplicationBuilder --- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 8063d48c44..3b300a1eca 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Hosting.Startup private object Invoke(MethodInfo methodInfo, object instance, IApplicationBuilder builder, IServiceCollection services = null) { - var serviceProvider = builder?.ApplicationServices ?? _services; + var serviceProvider = builder.ApplicationServices ?? _services; var parameterInfos = methodInfo.GetParameters(); var parameters = new object[parameterInfos.Length]; for (var index = 0; index != parameterInfos.Length; ++index) diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index d9789bfccf..f3323b978a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Hosting.Tests var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithServices"); - startup.Invoke(null); + startup.Invoke(new ApplicationBuilder(services)); Assert.Equal(2, _configurationMethodCalledList.Count); } From d75e4c87ba3ff7179826b79db5f3d11808449c29 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Mon, 8 Dec 2014 15:14:08 -0800 Subject: [PATCH 0359/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 9c28fc93c3b1e85ed227599491875d6fb207b03c Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Mon, 8 Dec 2014 15:14:17 -0800 Subject: [PATCH 0360/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From fd45ff532c7b11657269a8bbd889274f3d4e6426 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Mon, 8 Dec 2014 15:24:38 -0800 Subject: [PATCH 0361/1838] Updating to dev NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From f958bbf7744452478eb8dce17c3d52d8e2e699ba Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Mon, 8 Dec 2014 15:24:40 -0800 Subject: [PATCH 0362/1838] Updating to dev NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..f41e9c631d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From ae169aa794a3ddc10449020043fb71d6a8b880b1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 15 Dec 2014 14:42:21 -0800 Subject: [PATCH 0363/1838] Reacting to System.Threading version changes --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 20e2fae042..6845cd91a4 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -14,7 +14,7 @@ "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Threading": "4.0.0-beta-*" + "System.Threading": "4.0.10-beta-*" } } } From b7eb1a92bb567e4efa9dc485a2252023f2cdb947 Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 15 Dec 2014 15:09:59 -0800 Subject: [PATCH 0364/1838] Update tests to use official xunit --- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 4 ++-- test/Microsoft.AspNet.PipelineCore.Tests/project.json | 4 ++-- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index bf587219ea..867e8889e6 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -3,10 +3,10 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 1e7c64bbe6..85c20ce28b 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index e85c177c16..ff303ab74d 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 9893f86030..16f501140e 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -5,10 +5,10 @@ "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.PipelineCore.Tests/project.json index 1c3bc620fe..fda938bb96 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.PipelineCore.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.PipelineCore": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 868b37110c..c3fcb3e97c 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -2,10 +2,10 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { } From 4ad0f41eeab3131ff17feb2d619722c0fb81bf5c Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 15 Dec 2014 15:17:07 -0800 Subject: [PATCH 0365/1838] Update tests to use official xunit --- test/Microsoft.AspNet.Hosting.Tests/project.json | 4 ++-- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 4 ++-- test/Microsoft.AspNet.TestHost.Tests/project.json | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 5c8c65cacf..8adf1a1d0e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,13 +2,13 @@ "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.RequestContainer": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "frameworks": { "aspnet50": { } }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "webroot": "testroot" } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 9a1a2c7b19..47cd1d1403 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -23,8 +23,8 @@ namespace Microsoft.AspNet.TestHost // Arrange var services = HostingServices.Create().BuildServiceProvider(); - // Act & Assert - Assert.DoesNotThrow(() => TestServer.Create(services, app => { })); + // Act & Assert (Does not throw) + TestServer.Create(services, app => { }); } [Fact] diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 996af770f3..cf98630c3f 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,10 +1,10 @@ { "dependencies": { "Microsoft.AspNet.TestHost": "1.0.0-*", - "Xunit.KRunner": "1.0.0-*" + "xunit.runner.kre": "1.0.0-*" }, "commands": { - "test": "Xunit.KRunner" + "test": "xunit.runner.kre" }, "frameworks": { "aspnet50": { } From 4333003df0c5f2ad0a1dc3047fd2a5ae862a6c16 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 18 Dec 2014 15:30:43 -0800 Subject: [PATCH 0366/1838] Generalize BasePath logic. --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 6 ++++++ src/Microsoft.AspNet.TestHost/TestServer.cs | 5 ----- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index b23dffbe70..d108874bdd 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -38,6 +38,12 @@ namespace Microsoft.AspNet.TestHost } _next = next; + + // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. + if (pathBase.HasValue && pathBase.Value.EndsWith("/")) + { + pathBase = new PathString(pathBase.Value.Substring(0, pathBase.Value.Length - 1)); + } _pathBase = pathBase; } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 97e848033a..54b908133e 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -62,11 +62,6 @@ namespace Microsoft.AspNet.TestHost public HttpMessageHandler CreateHandler() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); - if (pathBase.Equals(new PathString("/"))) - { - // When we just have http://host/ the trailing slash is really part of the Path, not the PathBase. - pathBase = PathString.Empty; - } return new ClientHandler(Invoke, pathBase); } diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 23f65bce8b..a536114e57 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("example.com", context.Request.Host.Value); return Task.FromResult(0); - }, new PathString("/A/Path")); + }, new PathString("/A/Path/")); var httpClient = new HttpClient(handler); return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query"); } From 6cd5744383f0793ae45bec90e1943848ff16c637 Mon Sep 17 00:00:00 2001 From: Kai Ruhnau Date: Sat, 27 Dec 2014 12:13:26 +0100 Subject: [PATCH 0367/1838] Catch exceptions while disposing --- src/Microsoft.AspNet.Hosting/Program.cs | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 4776c41223..8376913626 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.Logging; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -52,6 +53,7 @@ namespace Microsoft.AspNet.Hosting }; var engine = services.GetRequiredService(); + var loggerFactory = services.GetRequiredService(); var appShutdownService = _serviceProvider.GetRequiredService(); var shutdownHandle = new ManualResetEvent(false); @@ -59,7 +61,15 @@ namespace Microsoft.AspNet.Hosting appShutdownService.ShutdownRequested.Register(() => { - serverShutdown.Dispose(); + try + { + serverShutdown.Dispose(); + } + catch (Exception ex) + { + var logger = loggerFactory.Create(); + logger.WriteError("TODO: Dispose threw an exception", ex); + } shutdownHandle.Set(); }); From 5872feb224f731f2d64af0b1e6c8193b583031b1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 4 Nov 2014 16:31:18 -0800 Subject: [PATCH 0368/1838] #139 - Mime multipart request parsing. --- .../project.json | 2 +- src/Microsoft.AspNet.Http/FragmentString.cs | 6 +- src/Microsoft.AspNet.Http/HostString.cs | 6 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 22 +- src/Microsoft.AspNet.Http/IFormCollection.cs | 3 + src/Microsoft.AspNet.Http/IFormFile.cs | 20 + .../IFormFileCollection.cs | 16 + src/Microsoft.AspNet.Http/PathString.cs | 6 +- src/Microsoft.AspNet.Http/QueryString.cs | 6 +- .../Security/AuthenticateResult.cs | 10 +- .../Security/AuthenticationDescription.cs | 6 +- src/Microsoft.AspNet.Owin/NotNullAttribute.cs | 12 + .../OwinFeatureCollection.cs | 6 +- .../WebSockets/WebSocketAdapter.cs | 6 +- .../BufferingHelper.cs | 47 +++ .../Collections/FormCollection.cs | 20 +- .../Collections/FormFileCollection.cs | 36 ++ .../Collections/HeaderDictionary.cs | 7 +- .../Collections/ItemsDictionary.cs | 1 - .../Collections/ReadableStringCollection.cs | 21 +- .../Collections/ResponseCookies.cs | 21 +- .../DefaultHttpContext.cs | 12 +- .../DefaultHttpRequest.cs | 28 +- .../DefaultHttpResponse.cs | 19 +- .../FormFeature.cs | 193 +++++++-- src/Microsoft.AspNet.PipelineCore/FormFile.cs | 46 ++ .../IFormFeature.cs | 24 +- .../Infrastructure/ParsingHelpers.cs | 70 +--- .../QueryFeature.cs | 4 +- .../ReferenceReadStream.cs | 199 +++++++++ .../RequestCookiesFeature.cs | 1 - .../Security/AuthenticateContext.cs | 6 +- .../Security/ChallengeContext.cs | 8 +- .../Security/SignInContext.cs | 6 +- .../Security/SignOutContext.cs | 6 +- .../BufferedReadStream.cs | 396 ++++++++++++++++++ .../FileBufferingReadStream.cs | 248 +++++++++++ .../FormHelpers.cs | 21 - .../FormReader.cs | 188 +++++++++ .../KeyValueAccumulator.cs | 42 ++ .../MultipartReader.cs | 92 ++++ .../MultipartReaderStream.cs | 320 ++++++++++++++ .../MultipartSection.cs | 47 +++ .../ParsingHelpers.cs | 111 ----- .../QueryHelpers.cs | 45 +- .../StreamHelperExtensions.cs | 23 + .../project.json | 1 + .../FormFeatureTests.cs | 266 ++++++++++-- .../MultipartReaderTests.cs | 185 ++++++++ .../QueryHelpersTests.cs | 19 +- 50 files changed, 2487 insertions(+), 419 deletions(-) create mode 100644 src/Microsoft.AspNet.Http/IFormFile.cs create mode 100644 src/Microsoft.AspNet.Http/IFormFileCollection.cs create mode 100644 src/Microsoft.AspNet.Owin/NotNullAttribute.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.PipelineCore}/Collections/FormCollection.cs (53%) create mode 100644 src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.PipelineCore}/Collections/ReadableStringCollection.cs (86%) create mode 100644 src/Microsoft.AspNet.PipelineCore/FormFile.cs create mode 100644 src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs delete mode 100644 src/Microsoft.AspNet.WebUtilities/FormHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/FormReader.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/MultipartReader.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/MultipartSection.cs delete mode 100644 src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 0254711dd8..cbc45a6ddc 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -8,7 +8,7 @@ "frameworks" : { "aspnet50" : { }, - "aspnetcore50" : { + "aspnetcore50" : { "dependencies": { "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http/FragmentString.cs index 1d725e742c..f40ba626a1 100644 --- a/src/Microsoft.AspNet.Http/FragmentString.cs +++ b/src/Microsoft.AspNet.Http/FragmentString.cs @@ -90,12 +90,8 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting FragmentString - public static FragmentString FromUriComponent(Uri uri) + public static FragmentString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index ae72f819cc..c91ce65a5b 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -134,12 +134,8 @@ namespace Microsoft.AspNet.Http /// /// /// - public static HostString FromUriComponent(Uri uri) + public static HostString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } return new HostString(uri.GetComponents( UriComponents.NormalizedHost | // Always convert punycode to Unicode. UriComponents.HostAndPort, UriFormat.Unescaped)); diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index be5e1e14b1..8048152a08 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -64,12 +64,6 @@ namespace Microsoft.AspNet.Http /// The query value collection parsed from owin.RequestQueryString. public abstract IReadableStringCollection Query { get; } - /// - /// Gets the form collection. - /// - /// The form collection parsed from the request body. - public abstract Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)); - /// /// Gets or set the owin.RequestProtocol. /// @@ -128,5 +122,21 @@ namespace Microsoft.AspNet.Http /// /// The owin.RequestBody Stream. public abstract Stream Body { get; set; } + + /// + /// Checks the content-type header for form types. + /// + public abstract bool HasFormContentType { get; } + + /// + /// Gets or sets the request body as a form. + /// + public abstract IFormCollection Form { get; set; } + + /// + /// Reads the request body if it is a form. + /// + /// + public abstract Task ReadFormAsync(CancellationToken cancellationToken = new CancellationToken()); } } diff --git a/src/Microsoft.AspNet.Http/IFormCollection.cs b/src/Microsoft.AspNet.Http/IFormCollection.cs index a69162fa4d..4ec7437877 100644 --- a/src/Microsoft.AspNet.Http/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http/IFormCollection.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; + namespace Microsoft.AspNet.Http { /// @@ -8,5 +10,6 @@ namespace Microsoft.AspNet.Http /// public interface IFormCollection : IReadableStringCollection { + IFormFileCollection Files { get; } } } diff --git a/src/Microsoft.AspNet.Http/IFormFile.cs b/src/Microsoft.AspNet.Http/IFormFile.cs new file mode 100644 index 0000000000..a77a495d5e --- /dev/null +++ b/src/Microsoft.AspNet.Http/IFormFile.cs @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; + +namespace Microsoft.AspNet.Http +{ + public interface IFormFile + { + string ContentType { get; } + + string ContentDisposition { get; } + + IHeaderDictionary Headers { get; } + + long Length { get; } + + Stream OpenReadStream(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/IFormFileCollection.cs b/src/Microsoft.AspNet.Http/IFormFileCollection.cs new file mode 100644 index 0000000000..56f1d5879d --- /dev/null +++ b/src/Microsoft.AspNet.Http/IFormFileCollection.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Http +{ + public interface IFormFileCollection : IList + { + IFormFile this[string name] { get; } + + IFormFile GetFile(string name); + + IList GetFiles(string name); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index 05dfa6d816..2963c64d8f 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -86,12 +86,8 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting PathString - public static PathString FromUriComponent(Uri uri) + public static PathString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } // REVIEW: what is the exactly correct thing to do? return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); } diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index 5ba16151c7..c32e3bb037 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -102,12 +102,8 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting QueryString - public static QueryString FromUriComponent(Uri uri) + public static QueryString FromUriComponent([NotNull] Uri uri) { - if (uri == null) - { - throw new ArgumentNullException("uri"); - } string queryValue = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(queryValue)) { diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs index 5a1998f336..38b48dcf0e 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs @@ -18,16 +18,8 @@ namespace Microsoft.AspNet.Http.Security /// Assigned to Identity. May be null. /// Assigned to Properties. Contains extra information carried along with the identity. /// Assigned to Description. Contains information describing the authentication provider. - public AuthenticationResult(IIdentity identity, AuthenticationProperties properties, AuthenticationDescription description) + public AuthenticationResult(IIdentity identity, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) { - if (properties == null) - { - throw new ArgumentNullException("properties"); - } - if (description == null) - { - throw new ArgumentNullException("description"); - } if (identity != null) { Identity = identity as ClaimsIdentity ?? new ClaimsIdentity(identity); diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs index d6423f34fd..2d7d4f0c73 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs @@ -27,12 +27,8 @@ namespace Microsoft.AspNet.Http.Security /// Initializes a new instance of the class /// /// - public AuthenticationDescription(IDictionary properties) + public AuthenticationDescription([NotNull] IDictionary properties) { - if (properties == null) - { - throw new ArgumentNullException("properties"); - } Dictionary = properties; } diff --git a/src/Microsoft.AspNet.Owin/NotNullAttribute.cs b/src/Microsoft.AspNet.Owin/NotNullAttribute.cs new file mode 100644 index 0000000000..a42aa58d4a --- /dev/null +++ b/src/Microsoft.AspNet.Owin/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Owin +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 23ca6df7bf..434817129d 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -399,12 +399,8 @@ namespace Microsoft.AspNet.Owin return TryGetValue(item.Key, out result) && result.Equals(item.Value); } - public void CopyTo(KeyValuePair[] array, int arrayIndex) + public void CopyTo([NotNull] KeyValuePair[] array, int arrayIndex) { - if (array == null) - { - throw new ArgumentNullException("array"); - } if (arrayIndex < 0 || arrayIndex > array.Length) { throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 79f8c0bf2e..9577785639 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -113,7 +113,7 @@ namespace Microsoft.AspNet.Owin } else { - throw new ArgumentOutOfRangeException("buffer"); + throw new ArgumentOutOfRangeException(nameof(buffer)); } } @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Owin case 0x8: return WebSocketMessageType.Close; default: - throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(messageType), messageType, string.Empty); } } @@ -164,7 +164,7 @@ namespace Microsoft.AspNet.Owin case WebSocketMessageType.Close: return 0x8; default: - throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(webSocketMessageType), webSocketMessageType, string.Empty); } } } diff --git a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs new file mode 100644 index 0000000000..b10c017c36 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities; + +namespace Microsoft.AspNet.PipelineCore +{ + public static class BufferingHelper + { + internal const int DefaultBufferThreshold = 1024 * 30; + + public static string TempDirectory + { + get + { + var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP"); + if (string.IsNullOrEmpty(temp)) + { + temp = Environment.GetEnvironmentVariable("TEMP"); + } + + if (!Directory.Exists(temp)) + { + // TODO: ??? + throw new DirectoryNotFoundException(temp); + } + + return temp; + } + } + + public static HttpRequest EnableRewind([NotNull] this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) + { + var body = request.Body; + if (!body.CanSeek) + { + // TODO: Register this buffer for disposal at the end of the request to ensure the temp file is deleted. + // Otherwise it won't get deleted until GC closes the stream. + request.Body = new FileBufferingReadStream(body, bufferThreshold, TempDirectory); + } + return request; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs similarity index 53% rename from src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index a9d1df8529..a80fea12d1 100644 --- a/src/Microsoft.AspNet.WebUtilities/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -1,23 +1,27 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; using System.Collections.Generic; +using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.WebUtilities.Collections +namespace Microsoft.AspNet.PipelineCore.Collections { /// /// Contains the parsed form values. /// public class FormCollection : ReadableStringCollection, IFormCollection { - /// - /// Initializes a new instance of the class. - /// - /// The store for the form. - public FormCollection(IDictionary store) - : base(store) + public FormCollection([NotNull] IDictionary store) + : this(store, new FormFileCollection()) { } + + public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) + : base(store) + { + Files = files; + } + + public IFormFileCollection Files { get; private set; } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs new file mode 100644 index 0000000000..10aad2bfa2 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs @@ -0,0 +1,36 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.PipelineCore.Collections +{ + public class FormFileCollection : List, IFormFileCollection + { + public IFormFile this[string name] + { + get { return GetFile(name); } + } + + public IFormFile GetFile(string name) + { + return Find(file => string.Equals(name, GetName(file.ContentDisposition))); + } + + public IList GetFiles(string name) + { + return FindAll(file => string.Equals(name, GetName(file.ContentDisposition))); + } + + private static string GetName(string contentDisposition) + { + // TODO: Strongly typed headers will take care of this + // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" + var offset = contentDisposition.IndexOf("name=\"") + "name=\"".Length; + var key = contentDisposition.Substring(offset, contentDisposition.IndexOf("\"", offset) - offset); // Remove quotes + return key; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index 22d62c5989..dfd54393cc 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -20,13 +20,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// Initializes a new instance of the class. /// /// The underlying data store. - public HeaderDictionary(IDictionary store) + public HeaderDictionary([NotNull] IDictionary store) { - if (store == null) - { - throw new ArgumentNullException("store"); - } - Store = store; } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index e9c21c835d..dc5216d117 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -3,7 +3,6 @@ using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs similarity index 86% rename from src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index 97c03b0df2..1e12bb6dc1 100644 --- a/src/Microsoft.AspNet.WebUtilities/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.WebUtilities.Collections +namespace Microsoft.AspNet.PipelineCore.Collections { /// /// Accessors for query, forms, etc. @@ -17,13 +17,8 @@ namespace Microsoft.AspNet.WebUtilities.Collections /// Create a new wrapper /// /// - public ReadableStringCollection(IDictionary store) + public ReadableStringCollection([NotNull] IDictionary store) { - if (store == null) - { - throw new ArgumentNullException("store"); - } - Store = store; } @@ -75,7 +70,7 @@ namespace Microsoft.AspNet.WebUtilities.Collections /// public string Get(string key) { - return ParsingHelpers.GetJoinedValue(Store, key); + return GetJoinedValue(Store, key); } /// @@ -108,5 +103,15 @@ namespace Microsoft.AspNet.WebUtilities.Collections { return GetEnumerator(); } + + private static string GetJoinedValue(IDictionary store, string key) + { + string[] values; + if (store.TryGetValue(key, out values)) + { + return string.Join(",", values); + } + return null; + } } } diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 27bfbbd38e..2412b54a83 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -19,13 +19,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// Create a new wrapper /// /// - public ResponseCookies(IHeaderDictionary headers) + public ResponseCookies([NotNull] IHeaderDictionary headers) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } - Headers = headers; } @@ -47,13 +42,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// /// /// - public void Append(string key, string value, CookieOptions options) + public void Append(string key, string value, [NotNull] CookieOptions options) { - if (options == null) - { - throw new ArgumentNullException("options"); - } - bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); bool expiresHasValue = options.Expires.HasValue; @@ -98,13 +88,8 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// /// /// - public void Delete(string key, CookieOptions options) + public void Delete(string key, [NotNull] CookieOptions options) { - if (options == null) - { - throw new ArgumentNullException("options"); - } - bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 308d896564..3b445fefbe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -214,12 +214,8 @@ namespace Microsoft.AspNet.PipelineCore return authTypeContext.Results; } - public override IEnumerable Authenticate(IEnumerable authenticationTypes) + public override IEnumerable Authenticate([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); @@ -238,12 +234,8 @@ namespace Microsoft.AspNet.PipelineCore return authenticateContext.Results; } - public override async Task> AuthenticateAsync(IEnumerable authenticationTypes) + public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } var handler = HttpAuthenticationFeature.Handler; var authenticateContext = new AuthenticateContext(authenticationTypes); diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index eac94536d6..da839c1f16 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -2,13 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Globalization; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; @@ -55,7 +54,7 @@ namespace Microsoft.AspNet.PipelineCore private IFormFeature FormFeature { - get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(_features)); } + get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); } } private IRequestCookiesFeature RequestCookiesFeature @@ -83,7 +82,7 @@ namespace Microsoft.AspNet.PipelineCore set { HttpRequestFeature.QueryString = value.Value; } } - public override long? ContentLength + public override long? ContentLength { get { @@ -129,11 +128,6 @@ namespace Microsoft.AspNet.PipelineCore get { return QueryFeature.Query; } } - public override Task GetFormAsync(CancellationToken cancellationToken = default(CancellationToken)) - { - return FormFeature.GetFormAsync(cancellationToken); - } - public override string Protocol { get { return HttpRequestFeature.Protocol; } @@ -167,5 +161,21 @@ namespace Microsoft.AspNet.PipelineCore get { return Headers[Constants.Headers.AcceptCharset]; } set { Headers[Constants.Headers.AcceptCharset] = value; } } + + public override bool HasFormContentType + { + get { return FormFeature.HasFormContentType; } + } + + public override IFormCollection Form + { + get { return FormFeature.ReadForm(); } + set { FormFeature.Form = value; } + } + + public override Task ReadFormAsync(CancellationToken cancellationToken) + { + return FormFeature.ReadFormAsync(cancellationToken); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 03841751ec..16d187450d 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -129,12 +129,8 @@ namespace Microsoft.AspNet.PipelineCore Headers.Set(Constants.Headers.Location, location); } - public override void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes) + public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; @@ -152,13 +148,8 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignIn(AuthenticationProperties properties, IEnumerable identities) + public override void SignIn(AuthenticationProperties properties, [NotNull] IEnumerable identities) { - if (identities == null) - { - throw new ArgumentNullException(); - } - var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); @@ -175,12 +166,8 @@ namespace Microsoft.AspNet.PipelineCore } } - public override void SignOut(IEnumerable authenticationTypes) + public override void SignOut([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationTypes); diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 271264b870..8d20871688 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -1,71 +1,192 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.WebUtilities; -using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { public class FormFeature : IFormFeature { - private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; - private Stream _bodyStream; - private IReadableStringCollection _form; + private readonly HttpRequest _request; - public FormFeature([NotNull] IDictionary form) - : this (new ReadableStringCollection(form)) + public FormFeature([NotNull] IFormCollection form) { + Form = form; } - public FormFeature([NotNull] IReadableStringCollection form) + public FormFeature([NotNull] HttpRequest request) { - _form = form; + _request = request; } - public FormFeature([NotNull] IFeatureCollection features) + public bool HasFormContentType { - _features = features; - } - - public async Task GetFormAsync(CancellationToken cancellationToken) - { - if (_features == null) + get { - return _form; + // Set directly + if (Form != null) + { + return true; + } + + return HasApplicationFormContentType() || HasMultipartFormContentType(); + } + } + + public IFormCollection Form { get; set; } + + public IFormCollection ReadForm() + { + if (Form != null) + { + return Form; } - var body = _request.Fetch(_features).Body; - - if (_bodyStream == null || _bodyStream != body) + if (!HasFormContentType) { - _bodyStream = body; - if (!_bodyStream.CanSeek) + throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); + } + + // TODO: How do we prevent thread exhaustion? + return ReadFormAsync(CancellationToken.None).GetAwaiter().GetResult(); + } + + public async Task ReadFormAsync(CancellationToken cancellationToken) + { + if (Form != null) + { + return Form; + } + + if (!HasFormContentType) + { + throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); + } + + cancellationToken.ThrowIfCancellationRequested(); + + _request.EnableRewind(); + + IDictionary formFields = null; + var files = new FormFileCollection(); + + // Some of these code paths use StreamReader which does not support cancellation tokens. + using (cancellationToken.Register(_request.HttpContext.Abort)) + { + // Check the content-type + if (HasApplicationFormContentType()) { - var buffer = new MemoryStream(); - await _bodyStream.CopyToAsync(buffer, 4096, cancellationToken); - _bodyStream = buffer; - _request.Fetch(_features).Body = _bodyStream; - _bodyStream.Seek(0, SeekOrigin.Begin); + // TODO: Read the charset from the content-type header after we get strongly typed headers + formFields = await FormReader.ReadFormAsync(_request.Body, cancellationToken); } - using (var streamReader = new StreamReader(_bodyStream, Encoding.UTF8, - detectEncodingFromByteOrderMarks: true, - bufferSize: 1024, leaveOpen: true)) + else if (HasMultipartFormContentType()) { - string form = await streamReader.ReadToEndAsync(); - _form = FormHelpers.ParseForm(form); + var formAccumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + + var boundary = GetBoundary(_request.ContentType); + var multipartReader = new MultipartReader(boundary, _request.Body); + var section = await multipartReader.ReadNextSectionAsync(cancellationToken); + while (section != null) + { + var headers = new HeaderDictionary(section.Headers); + var contentDisposition = headers["Content-Disposition"]; + if (HasFileContentDisposition(contentDisposition)) + { + // Find the end + await section.Body.DrainAsync(cancellationToken); + + var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) + { + Headers = headers, + }; + files.Add(file); + } + else if (HasFormDataContentDisposition(contentDisposition)) + { + // Content-Disposition: form-data; name="key" + // + // value + + // TODO: Strongly typed headers will take care of this + var offset = contentDisposition.IndexOf("name=") + "name=".Length; + var key = contentDisposition.Substring(offset + 1, contentDisposition.Length - offset - 2); // Remove quotes + + // TODO: Read the charset from the content-disposition header after we get strongly typed headers + using (var reader = new StreamReader(section.Body, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) + { + var value = await reader.ReadToEndAsync(); + formAccumulator.Append(key, value); + } + } + else + { + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + contentDisposition); + } + + section = await multipartReader.ReadNextSectionAsync(cancellationToken); + } + + formFields = formAccumulator.GetResults(); } } - return _form; + + Form = new FormCollection(formFields, files); + return Form; + } + + private bool HasApplicationFormContentType() + { + // TODO: Strongly typed headers will take care of this for us + // Content-Type: application/x-www-form-urlencoded; charset=utf-8 + var contentType = _request.ContentType; + return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private bool HasMultipartFormContentType() + { + // TODO: Strongly typed headers will take care of this for us + // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq + var contentType = _request.ContentType; + return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("multipart/form-data", StringComparison.OrdinalIgnoreCase) >= 0; + } + + private bool HasFormDataContentDisposition(string contentDisposition) + { + // TODO: Strongly typed headers will take care of this for us + // Content-Disposition: form-data; name="key"; + return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && !contentDisposition.Contains("filename="); + } + + private bool HasFileContentDisposition(string contentDisposition) + { + // TODO: Strongly typed headers will take care of this for us + // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" + return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && contentDisposition.Contains("filename="); + } + + // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq + private static string GetBoundary(string contentType) + { + // TODO: Strongly typed headers will take care of this for us + // TODO: Limit the length of boundary we accept. The spec says ~70 chars. + var elements = contentType.Split(' '); + var element = elements.Where(entry => entry.StartsWith("boundary=")).First(); + var boundary = element.Substring("boundary=".Length); + // Remove quotes + if (boundary.Length >= 2 && boundary[0] == '"' && boundary[boundary.Length - 1] == '"') + { + boundary = boundary.Substring(1, boundary.Length - 2); + } + return boundary; } } } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFile.cs b/src/Microsoft.AspNet.PipelineCore/FormFile.cs new file mode 100644 index 0000000000..19ea07466f --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/FormFile.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.PipelineCore +{ + public class FormFile : IFormFile + { + private Stream _baseStream; + private long _baseStreamOffset; + private long _length; + + public FormFile(Stream baseStream, long baseStreamOffset, long length) + { + _baseStream = baseStream; + _baseStreamOffset = baseStreamOffset; + _length = length; + } + + public string ContentDisposition + { + get { return Headers["Content-Disposition"]; } + set { Headers["Content-Disposition"] = value; } + } + + public string ContentType + { + get { return Headers["Content-Type"]; } + set { Headers["Content-Type"] = value; } + } + + public IHeaderDictionary Headers { get; set; } + + public long Length + { + get { return _length; } + } + + public Stream OpenReadStream() + { + return new ReferenceReadStream(_baseStream, _baseStreamOffset, _length); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index 07debf7870..cc84d32a4b 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -4,11 +4,33 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.PipelineCore { public interface IFormFeature { - Task GetFormAsync(CancellationToken cancellationToken); + /// + /// Indicates if the request has a supported form content-type. + /// + bool HasFormContentType { get; } + + /// + /// The parsed form, if any. + /// + IFormCollection Form { get; set; } + + /// + /// Parses the request body as a form. + /// + /// + IFormCollection ReadForm(); + + /// + /// Parses the request body as a form. + /// + /// + /// + Task ReadFormAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 10c9ef3672..e0ed2c7333 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -445,12 +445,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure #endregion - public bool StartsWith(string text, StringComparison comparisonType) + public bool StartsWith([NotNull] string text, StringComparison comparisonType) { - if (text == null) - { - throw new ArgumentNullException("text"); - } int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -460,12 +456,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; } - public bool EndsWith(string text, StringComparison comparisonType) + public bool EndsWith([NotNull] string text, StringComparison comparisonType) { - if (text == null) - { - throw new ArgumentNullException("text"); - } int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -475,12 +467,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; } - public bool Equals(string text, StringComparison comparisonType) + public bool Equals([NotNull] string text, StringComparison comparisonType) { - if (text == null) - { - throw new ArgumentNullException("text"); - } int textLength = text.Length; if (!HasValue || _count != textLength) { @@ -615,25 +603,17 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static string[] GetHeaderUnmodified(IDictionary headers, string key) + public static string[] GetHeaderUnmodified([NotNull] IDictionary headers, string key) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } string[] values; return headers.TryGetValue(key, out values) ? values : null; } - public static void SetHeader(IDictionary headers, string key, string value) + public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, string value) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } if (string.IsNullOrWhiteSpace(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (string.IsNullOrWhiteSpace(value)) { @@ -645,15 +625,11 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void SetHeaderJoined(IDictionary headers, string key, params string[] values) + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } if (string.IsNullOrWhiteSpace(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (values == null || values.Length == 0) { @@ -697,15 +673,11 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return value; } - public static void SetHeaderUnmodified(IDictionary headers, string key, params string[] values) + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } if (string.IsNullOrWhiteSpace(key)) { - throw new ArgumentNullException("key"); + throw new ArgumentNullException(nameof(key)); } if (values == null || values.Length == 0) { @@ -717,16 +689,12 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void SetHeaderUnmodified(IDictionary headers, string key, IEnumerable values) + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, [NotNull] IEnumerable values) { - if (headers == null) - { - throw new ArgumentNullException("headers"); - } headers[key] = values.ToArray(); } - public static void AppendHeader(IDictionary headers, string key, string values) + public static void AppendHeader([NotNull] IDictionary headers, [NotNull] string key, string values) { if (string.IsNullOrWhiteSpace(values)) { @@ -744,7 +712,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { if (values == null || values.Length == 0) { @@ -762,7 +730,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure } } - public static void AppendHeaderUnmodified(IDictionary headers, string key, params string[] values) + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { if (values == null || values.Length == 0) { @@ -801,12 +769,8 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return values == null ? null : string.Join(",", values); } - internal static string[] GetUnmodifiedValues(IDictionary store, string key) + internal static string[] GetUnmodifiedValues([NotNull] IDictionary store, string key) { - if (store == null) - { - throw new ArgumentNullException("store"); - } string[] values; return store.TryGetValue(key, out values) ? values : null; } @@ -826,7 +790,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure // return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); //} - public static long? GetContentLength(IHeaderDictionary headers) + public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; @@ -840,7 +804,7 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure return null; } - public static void SetContentLength(IHeaderDictionary headers, long? value) + public static void SetContentLength([NotNull] IHeaderDictionary headers, long? value) { if (value.HasValue) { diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index 5106808d03..e57b406153 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -5,9 +5,9 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; using Microsoft.AspNet.WebUtilities; -using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.PipelineCore if (_query == null || _queryString != queryString) { _queryString = queryString; - _query = QueryHelpers.ParseQuery(queryString); + _query = new ReadableStringCollection(QueryHelpers.ParseQuery(queryString)); } return _query; } diff --git a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs new file mode 100644 index 0000000000..aaad97ae92 --- /dev/null +++ b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs @@ -0,0 +1,199 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.PipelineCore +{ + /// + /// A Stream that wraps another stream starting at a certain offset and reading for the given length. + /// + internal class ReferenceReadStream : Stream + { + private readonly Stream _inner; + private readonly long _innerOffset; + private readonly long _length; + private long _position; + + private bool _disposed; + + public ReferenceReadStream([NotNull] Stream inner, long offset, long length) + { + _inner = inner; + _innerOffset = offset; + _length = length; + _inner.Position = offset; + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return _inner.CanSeek; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override long Length + { + get { return _length; } + } + + public override long Position + { + get { return _position; } + set + { + ThrowIfDisposed(); + if (value < 0 || value > Length) + { + throw new ArgumentOutOfRangeException("value", value, "The Position must be within the length of the Stream: " + Length); + } + VerifyPosition(); + _position = value; + _inner.Position = _innerOffset + _position; + } + } + + // Throws if the position in the underlying stream has changed without our knowledge, indicating someone else is trying + // to use the stream at the same time which could lead to data corruption. + private void VerifyPosition() + { + if (_inner.Position != _innerOffset + _position) + { + throw new InvalidOperationException("The inner stream position has changed unexpectedly."); + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (origin == SeekOrigin.Begin) + { + Position = offset; + } + else if (origin == SeekOrigin.End) + { + Position = Length + offset; + } + else // if (origin == SeekOrigin.Current) + { + Position = Position + offset; + } + return Position; + } + + public override int Read(byte[] buffer, int offset, int count) + { + ThrowIfDisposed(); + VerifyPosition(); + var toRead = Math.Min(count, _length - _position); + var read = _inner.Read(buffer, offset, (int)toRead); + _position += read; + return read; + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + VerifyPosition(); + var toRead = Math.Min(count, _length - _position); + var read = await _inner.ReadAsync(buffer, offset, (int)toRead, cancellationToken); + _position += read; + return read; + } +#if ASPNET50 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + ThrowIfDisposed(); + VerifyPosition(); + var tcs = new TaskCompletionSource(state); + BeginRead(buffer, offset, count, callback, tcs); + return tcs.Task; + } + + private async void BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, TaskCompletionSource tcs) + { + try + { + var read = await ReadAsync(buffer, offset, count); + tcs.TrySetResult(read); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + if (callback != null) + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + var task = (Task)asyncResult; + return task.GetAwaiter().GetResult(); + } +#endif + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#endif + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + _disposed = true; + } + } + + private void ThrowIfDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(ReferenceReadStream)); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 8a3ae99e72..952bfed0f6 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -9,7 +9,6 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.PipelineCore.Infrastructure; -using Microsoft.AspNet.WebUtilities.Collections; namespace Microsoft.AspNet.PipelineCore { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index d975333fdf..1e27a006c4 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -17,12 +17,8 @@ namespace Microsoft.AspNet.PipelineCore.Security private List _results; private List _accepted; - public AuthenticateContext(IEnumerable authenticationTypes) + public AuthenticateContext([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException("authenticationType"); - } AuthenticationTypes = authenticationTypes; _results = new List(); _accepted = new List(); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index 45afd34594..ea87d06599 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -14,12 +14,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { private List _accepted; - public ChallengeContext(IEnumerable authenticationTypes, IDictionary properties) + public ChallengeContext([NotNull] IEnumerable authenticationTypes, IDictionary properties) { - if (authenticationTypes == null) - { - throw new ArgumentNullException(); - } AuthenticationTypes = authenticationTypes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); _accepted = new List(); @@ -33,7 +29,7 @@ namespace Microsoft.AspNet.PipelineCore.Security { get { return _accepted; } } - + public void Accept(string authenticationType, IDictionary description) { _accepted.Add(authenticationType); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index b24a14758a..43a88a82de 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -12,12 +12,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { private List _accepted; - public SignInContext(IEnumerable identities, IDictionary dictionary) + public SignInContext([NotNull] IEnumerable identities, IDictionary dictionary) { - if (identities == null) - { - throw new ArgumentNullException("identities"); - } Identities = identities; Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); _accepted = new List(); diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 6ce2a64fa5..546c5bca83 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -11,12 +11,8 @@ namespace Microsoft.AspNet.PipelineCore.Security { private List _accepted; - public SignOutContext(IEnumerable authenticationTypes) + public SignOutContext([NotNull] IEnumerable authenticationTypes) { - if (authenticationTypes == null) - { - throw new ArgumentNullException("authenticationTypes"); - } AuthenticationTypes = authenticationTypes; _accepted = new List(); } diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs new file mode 100644 index 0000000000..944f126b93 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -0,0 +1,396 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + internal class BufferedReadStream : Stream + { + private const char CR = '\r'; + private const char LF = '\n'; + + private readonly Stream _inner; + private readonly byte[] _buffer; + private int _bufferOffset = 0; + private int _bufferCount = 0; + private bool _disposed; + + public BufferedReadStream([NotNull] Stream inner, int bufferSize) + { + _inner = inner; + _buffer = new byte[bufferSize]; + } + + public ArraySegment BufferedData + { + get { return new ArraySegment(_buffer, _bufferOffset, _bufferCount); } + } + + public override bool CanRead + { + get { return _inner.CanRead || _bufferCount > 0; } + } + + public override bool CanSeek + { + get { return _inner.CanSeek; } + } + + public override bool CanTimeout + { + get { return _inner.CanTimeout; } + } + + public override bool CanWrite + { + get { return _inner.CanWrite; } + } + + public override long Length + { + get { return _inner.Length; } + } + + public override long Position + { + get { return _inner.Position - _bufferCount; } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException("value", value, "Position must be positive."); + } + if (value == Position) + { + return; + } + + // Backwards? + if (value <= _inner.Position) + { + // Forward within the buffer? + var innerOffset = (int)(_inner.Position - value); + if (innerOffset <= _bufferCount) + { + // Yes, just skip some of the buffered data + _bufferOffset += innerOffset; + _bufferCount -= innerOffset; + } + else + { + // No, reset the buffer + _bufferOffset = 0; + _bufferCount = 0; + _inner.Position = value; + } + } + else + { + // Forward, reset the buffer + _bufferOffset = 0; + _bufferCount = 0; + _inner.Position = value; + } + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (origin == SeekOrigin.Begin) + { + Position = offset; + } + else if (origin == SeekOrigin.Current) + { + Position = Position + offset; + } + else // if (origin == SeekOrigin.End) + { + Position = Length + offset; + } + return Position; + } + + public override void SetLength(long value) + { + _inner.SetLength(value); + } + + protected override void Dispose(bool disposing) + { + _disposed = true; + if (disposing) + { + _inner.Dispose(); + } + } + + public override void Flush() + { + _inner.Flush(); + } + + public override Task FlushAsync(CancellationToken cancellationToken) + { + return _inner.FlushAsync(cancellationToken); + } + + public override void Write(byte[] buffer, int offset, int count) + { + _inner.Write(buffer, offset, count); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + return _inner.BeginWrite(buffer, offset, count, callback, state); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + _inner.EndWrite(asyncResult); + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + return _inner.WriteAsync(buffer, offset, count, cancellationToken); + } + + public override int Read(byte[] buffer, int offset, int count) + { + ValidateBuffer(buffer, offset, count); + + // Drain buffer + if (_bufferCount > 0) + { + int toCopy = Math.Min(_bufferCount, count); + Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); + _bufferOffset += toCopy; + _bufferCount -= toCopy; + return toCopy; + } + + return _inner.Read(buffer, offset, count); + } + + public async override Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + ValidateBuffer(buffer, offset, count); + + // Drain buffer + if (_bufferCount > 0) + { + int toCopy = Math.Min(_bufferCount, count); + Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); + _bufferOffset += toCopy; + _bufferCount -= toCopy; + return toCopy; + } + + return await _inner.ReadAsync(buffer, offset, count, cancellationToken); + } +#if ASPNET50 + // We only anticipate using ReadAsync + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + ValidateBuffer(buffer, offset, count); + + // Drain buffer + if (_bufferCount > 0) + { + int toCopy = Math.Min(_bufferCount, count); + Buffer.BlockCopy(_buffer, _bufferOffset, buffer, offset, toCopy); + _bufferOffset += toCopy; + _bufferCount -= toCopy; + + TaskCompletionSource tcs = new TaskCompletionSource(state); + tcs.TrySetResult(toCopy); + if (callback != null) + { + callback(tcs.Task); + } + return tcs.Task; + } + + return _inner.BeginRead(buffer, offset, count, callback, state); + } + + public override int EndRead(IAsyncResult asyncResult) + { + Task task = asyncResult as Task; + if (task != null) + { + return task.GetAwaiter().GetResult(); + } + return _inner.EndRead(asyncResult); + } +#endif + public bool EnsureBuffered() + { + if (_bufferCount > 0) + { + return true; + } + // Downshift to make room + _bufferOffset = 0; + _bufferCount = _inner.Read(_buffer, 0, _buffer.Length); + return _bufferCount > 0; + } + + public async Task EnsureBufferedAsync(CancellationToken cancellationToken) + { + if (_bufferCount > 0) + { + return true; + } + // Downshift to make room + _bufferOffset = 0; + _bufferCount = await _inner.ReadAsync(_buffer, 0, _buffer.Length, cancellationToken); + return _bufferCount > 0; + } + + public bool EnsureBuffered(int minCount) + { + if (minCount > _buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + } + while (_bufferCount < minCount) + { + // Downshift to make room + if (_bufferOffset > 0) + { + if (_bufferCount > 0) + { + Buffer.BlockCopy(_buffer, _bufferOffset, _buffer, 0, _bufferCount); + } + _bufferOffset = 0; + } + int read = _inner.Read(_buffer, _bufferOffset + _bufferCount, _buffer.Length - _bufferCount - _bufferOffset); + _bufferCount += read; + if (read == 0) + { + return false; + } + } + return true; + } + + public async Task EnsureBufferedAsync(int minCount, CancellationToken cancellationToken) + { + if (minCount > _buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + } + while (_bufferCount < minCount) + { + // Downshift to make room + if (_bufferOffset > 0) + { + if (_bufferCount > 0) + { + Buffer.BlockCopy(_buffer, _bufferOffset, _buffer, 0, _bufferCount); + } + _bufferOffset = 0; + } + int read = await _inner.ReadAsync(_buffer, _bufferOffset + _bufferCount, _buffer.Length - _bufferCount - _bufferOffset, cancellationToken); + _bufferCount += read; + if (read == 0) + { + return false; + } + } + return true; + } + + public string ReadLine(int lengthLimit) + { + CheckDisposed(); + StringBuilder builder = new StringBuilder(); + bool foundCR = false, foundCRLF = false; + while (!foundCRLF && EnsureBuffered()) + { + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); + } + ProcessLineChar(builder, ref foundCR, ref foundCRLF); + } + + if (foundCRLF) + { + return builder.ToString(0, builder.Length - 2); // Drop the CRLF + } + // Stream ended with no CRLF. + return builder.ToString(); + } + + public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) + { + CheckDisposed(); + StringBuilder builder = new StringBuilder(); + bool foundCR = false, foundCRLF = false; + while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) + { + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); + } + + ProcessLineChar(builder, ref foundCR, ref foundCRLF); + } + + if (foundCRLF) + { + return builder.ToString(0, builder.Length - 2); // Drop the CRLF + } + // Stream ended with no CRLF. + return builder.ToString(); + } + + private void ProcessLineChar(StringBuilder builder, ref bool foundCR, ref bool foundCRLF) + { + char ch = (char)_buffer[_bufferOffset]; // TODO: Encoding enforcement + builder.Append(ch); + _bufferOffset++; + _bufferCount--; + if (ch == CR) + { + foundCR = true; + } + else if (ch == LF) + { + if (foundCR) + { + foundCRLF = true; + } + else + { + foundCR = false; + } + } + } + + private void CheckDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(BufferedReadStream)); + } + } + + private void ValidateBuffer(byte[] buffer, int offset, int count) + { + // Delegate most of our validation. + var ignored = new ArraySegment(buffer, offset, count); + if (count == 0) + { + throw new ArgumentOutOfRangeException(nameof(count), "The value must be greater than zero."); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs new file mode 100644 index 0000000000..2f23ab5247 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -0,0 +1,248 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// A Stream that wraps another stream and enables rewinding by buffering the content as it is read. + /// The content is buffered in memory up to a certain size and then spooled to a temp file on disk. + /// The temp file will be deleted on Dispose. + /// + public class FileBufferingReadStream : Stream + { + private readonly Stream _inner; + private readonly int _memoryThreshold; + private readonly string _tempFileDirectory; + + private Stream _buffer = new MemoryStream(); // TODO: We could have a more efficiently expanding buffer stream. + private bool _inMemory = true; + private bool _completelyBuffered; + + private bool _disposed; + + // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? + public FileBufferingReadStream([NotNull] Stream inner, int memoryThreshold, [NotNull] string tempFileDirectory) + { + _inner = inner; + _memoryThreshold = memoryThreshold; + _tempFileDirectory = tempFileDirectory; + } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return true; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override long Length + { + get { return _buffer.Length; } + } + + public override long Position + { + get { return _buffer.Position; } + // Note this will not allow seeking forward beyond the end of the buffer. + set + { + ThrowIfDisposed(); + _buffer.Position = value; + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + ThrowIfDisposed(); + if (!_completelyBuffered && origin == SeekOrigin.End) + { + // Can't seek from the end until we've finished consuming the inner stream + throw new NotSupportedException("The content has not been fully buffered yet."); + } + else if (!_completelyBuffered && origin == SeekOrigin.Current && offset + Position > Length) + { + // Can't seek past the end of the buffer until we've finished consuming the inner stream + throw new NotSupportedException("The content has not been fully buffered yet."); + } + else if (!_completelyBuffered && origin == SeekOrigin.Begin && offset > Length) + { + // Can't seek past the end of the buffer until we've finished consuming the inner stream + throw new NotSupportedException("The content has not been fully buffered yet."); + } + return _buffer.Seek(offset, origin); + } + + private Stream CreateTempFile() + { + var fileName = Path.Combine(_tempFileDirectory, "ASPNET_" + Guid.NewGuid().ToString() + ".tmp"); + return new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete, 1024 * 16, + FileOptions.Asynchronous | FileOptions.DeleteOnClose | FileOptions.SequentialScan); + } + + public override int Read(byte[] buffer, int offset, int count) + { + ThrowIfDisposed(); + if (_buffer.Position < _buffer.Length || _completelyBuffered) + { + // Just read from the buffer + return _buffer.Read(buffer, offset, (int)Math.Min(count, _buffer.Length - _buffer.Position)); + } + + int read = _inner.Read(buffer, offset, count); + + if (_inMemory && _buffer.Length + read > _memoryThreshold) + { + var oldBuffer = _buffer; + _buffer = CreateTempFile(); + _inMemory = false; + oldBuffer.Position = 0; + oldBuffer.CopyTo(_buffer, 1024 * 16); + } + + if (read > 0) + { + _buffer.Write(buffer, offset, read); + } + else + { + _completelyBuffered = true; + } + + return read; + } +#if ASPNET50 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + ThrowIfDisposed(); + var tcs = new TaskCompletionSource(state); + BeginRead(buffer, offset, count, callback, tcs); + return tcs.Task; + } + + private async void BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, TaskCompletionSource tcs) + { + try + { + var read = await ReadAsync(buffer, offset, count); + tcs.TrySetResult(read); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + if (callback != null) + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + var task = (Task)asyncResult; + return task.GetAwaiter().GetResult(); + } +#endif + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + if (_buffer.Position < _buffer.Length || _completelyBuffered) + { + // Just read from the buffer + return await _buffer.ReadAsync(buffer, offset, (int)Math.Min(count, _buffer.Length - _buffer.Position), cancellationToken); + } + + int read = await _inner.ReadAsync(buffer, offset, count, cancellationToken); + + if (_inMemory && _buffer.Length + read > _memoryThreshold) + { + var oldBuffer = _buffer; + _buffer = CreateTempFile(); + _inMemory = false; + oldBuffer.Position = 0; + await oldBuffer.CopyToAsync(_buffer, 1024 * 16, cancellationToken); + } + + if (read > 0) + { + await _buffer.WriteAsync(buffer, offset, read, cancellationToken); + } + else + { + _completelyBuffered = true; + } + + return read; + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } + + protected override void Dispose(bool disposing) + { + if (!_disposed) + { + _disposed = true; + if (disposing) + { + _buffer.Dispose(); + } + } + } + + private void ThrowIfDisposed() + { + if (_disposed) + { + throw new ObjectDisposedException(nameof(FileBufferingReadStream)); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs b/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs deleted file mode 100644 index 4c16485eb0..0000000000 --- a/src/Microsoft.AspNet.WebUtilities/FormHelpers.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.WebUtilities -{ - public static class FormHelpers - { - /// - /// Parses an HTTP form body. - /// - /// The HTTP form body to parse. - /// The object containing the parsed HTTP form body. - public static IFormCollection ParseForm(string text) - { - return ParsingHelpers.GetForm(text); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs new file mode 100644 index 0000000000..7c6a034f78 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -0,0 +1,188 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// Used to read an 'application/x-www-form-urlencoded' form. + /// + public class FormReader + { + private readonly TextReader _reader; + private readonly char[] _buffer = new char[1024]; + private readonly StringBuilder _builder = new StringBuilder(); + private int _bufferOffset; + private int _bufferCount; + + public FormReader([NotNull] string data) + { + _reader = new StringReader(data); + } + + // TODO: Encoding + public FormReader([NotNull] Stream stream) + { + _reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); + } + + // Format: key1=value1&key2=value2 + /// + /// Reads the next key value pair from the form. + /// For unbuffered data use the async overload instead. + /// + /// The next key value pair, or null when the end of the form is reached. + public KeyValuePair? ReadNextPair() + { + var key = ReadWord('='); + if (string.IsNullOrEmpty(key) && _bufferCount == 0) + { + return null; + } + var value = ReadWord('&'); + return new KeyValuePair(key, value); + } + + // Format: key1=value1&key2=value2 + /// + /// Asynchronously reads the next key value pair from the form. + /// + /// + /// The next key value pair, or null when the end of the form is reached. + public async Task?> ReadNextPairAsync(CancellationToken cancellationToken) + { + var key = await ReadWordAsync('=', cancellationToken); + if (string.IsNullOrEmpty(key) && _bufferCount == 0) + { + return null; + } + var value = await ReadWordAsync('&', cancellationToken); + return new KeyValuePair(key, value); + } + + private string ReadWord(char seperator) + { + // TODO: Configurable value size limit + while (true) + { + // Empty + if (_bufferCount == 0) + { + Buffer(); + } + + // End + if (_bufferCount == 0) + { + return BuildWord(); + } + + var c = _buffer[_bufferOffset++]; + _bufferCount--; + + if (c == seperator) + { + return BuildWord(); + } + _builder.Append(c); + } + } + + private async Task ReadWordAsync(char seperator, CancellationToken cancellationToken) + { + // TODO: Configurable value size limit + while (true) + { + // Empty + if (_bufferCount == 0) + { + await BufferAsync(cancellationToken); + } + + // End + if (_bufferCount == 0) + { + return BuildWord(); + } + + var c = _buffer[_bufferOffset++]; + _bufferCount--; + + if (c == seperator) + { + return BuildWord(); + } + _builder.Append(c); + } + } + + // '+' un-escapes to ' ', %HH un-escapes as ASCII (or utf-8?) + private string BuildWord() + { + _builder.Replace('+', ' '); + var result = _builder.ToString(); + _builder.Clear(); + return Uri.UnescapeDataString(result); // TODO: Replace this, it's not completely accurate. + } + + private void Buffer() + { + _bufferOffset = 0; + _bufferCount = _reader.Read(_buffer, 0, _buffer.Length); + } + + private async Task BufferAsync(CancellationToken cancellationToken) + { + // TODO: StreamReader doesn't support cancellation? + cancellationToken.ThrowIfCancellationRequested(); + _bufferOffset = 0; + _bufferCount = await _reader.ReadAsync(_buffer, 0, _buffer.Length); + } + + /// + /// Parses text from an HTTP form body. + /// + /// The HTTP form body to parse. + /// The collection containing the parsed HTTP form body. + public static IDictionary ReadForm(string text) + { + var reader = new FormReader(text); + + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var pair = reader.ReadNextPair(); + while (pair.HasValue) + { + accumulator.Append(pair.Value.Key, pair.Value.Value); + pair = reader.ReadNextPair(); + } + + return accumulator.GetResults(); + } + + /// + /// Parses an HTTP form body. + /// + /// The HTTP form body to parse. + /// The collection containing the parsed HTTP form body. + public static async Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + { + var reader = new FormReader(stream); + + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var pair = await reader.ReadNextPairAsync(cancellationToken); + while (pair.HasValue) + { + accumulator.Append(pair.Value.Key, pair.Value.Value); + pair = await reader.ReadNextPairAsync(cancellationToken); + } + + return accumulator.GetResults(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs new file mode 100644 index 0000000000..4c9d629a47 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -0,0 +1,42 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.WebUtilities +{ + public class KeyValueAccumulator + { + private Dictionary> _accumulator; + IEqualityComparer _comparer; + + public KeyValueAccumulator([NotNull] IEqualityComparer comparer) + { + _comparer = comparer; + _accumulator = new Dictionary>(comparer); + } + + public void Append(TKey key, TValue value) + { + List values; + if (_accumulator.TryGetValue(key, out values)) + { + values.Add(value); + } + else + { + _accumulator[key] = new List(1) { value }; + } + } + + public IDictionary GetResults() + { + var results = new Dictionary(_comparer); + foreach (var kv in _accumulator) + { + results.Add(kv.Key, kv.Value.ToArray()); + } + return results; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs new file mode 100644 index 0000000000..766e5361dc --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -0,0 +1,92 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + // https://www.ietf.org/rfc/rfc2046.txt + public class MultipartReader + { + private const int DefaultBufferSize = 1024 * 4; + + private readonly BufferedReadStream _stream; + private readonly string _boundary; + private MultipartReaderStream _currentStream; + + public MultipartReader([NotNull] string boundary, [NotNull] Stream stream) + : this(boundary, stream, DefaultBufferSize) + { + } + + public MultipartReader([NotNull] string boundary, [NotNull] Stream stream, int bufferSize) + { + if (bufferSize < boundary.Length + 8) // Size of the boundary + leading and trailing CRLF + leading and trailing '--' markers. + { + throw new ArgumentOutOfRangeException(nameof(bufferSize), bufferSize, "Insufficient buffer space, the buffer must be larger than the boundary: " + boundary); + } + _stream = new BufferedReadStream(stream, bufferSize); + _boundary = boundary; + // This stream will drain any preamble data and remove the first boundary marker. + _currentStream = new MultipartReaderStream(_stream, _boundary, expectLeadingCrlf: false); + } + + /// + /// The limit for individual header lines inside a multipart section. + /// + public int HeaderLengthLimit { get; set; } = 1024 * 4; + + /// + /// The combined size limit for headers per multipart section. + /// + public int TotalHeaderSizeLimit { get; set; } = 1024 * 16; + + public async Task ReadNextSectionAsync(CancellationToken cancellationToken = new CancellationToken()) + { + // Drain the prior section. + await _currentStream.DrainAsync(cancellationToken); + // If we're at the end return null + if (_currentStream.FinalBoundaryFound) + { + // There may be trailer data after the last boundary. + await _stream.DrainAsync(cancellationToken); + return null; + } + var headers = await ReadHeadersAsync(cancellationToken); + _currentStream = new MultipartReaderStream(_stream, _boundary); + long? baseStreamOffset = _stream.CanSeek ? (long?)_stream.Position : null; + return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; + } + + private async Task> ReadHeadersAsync(CancellationToken cancellationToken) + { + int totalSize = 0; + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); + while (!string.IsNullOrEmpty(line)) + { + totalSize += line.Length; + if (totalSize > TotalHeaderSizeLimit) + { + throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit); + } + int splitIndex = line.IndexOf(':'); + Debug.Assert(splitIndex > 0, "Invalid header line: " + line); + if (splitIndex >= 0) + { + var name = line.Substring(0, splitIndex); + var value = line.Substring(splitIndex + 1, line.Length - splitIndex - 1).Trim(); + accumulator.Append(name, value); + } + line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); + } + + return accumulator.GetResults(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs new file mode 100644 index 0000000000..d72809ef81 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -0,0 +1,320 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + internal class MultipartReaderStream : Stream + { + private readonly BufferedReadStream _innerStream; + private readonly byte[] _boundaryBytes; + private readonly int _finalBoundaryLength; + private readonly long _innerOffset; + private long _position; + private long _observedLength; + private bool _finished; + + /// + /// Creates a stream that reads until it reaches the given boundary pattern. + /// + /// + /// + public MultipartReaderStream([NotNull] BufferedReadStream stream, [NotNull] string boundary, bool expectLeadingCrlf = true) + { + _innerStream = stream; + _innerOffset = _innerStream.CanSeek ? _innerStream.Position : 0; + if (expectLeadingCrlf) + { + _boundaryBytes = Encoding.UTF8.GetBytes("\r\n--" + boundary); + } + else + { + _boundaryBytes = Encoding.UTF8.GetBytes("--" + boundary); + } + _finalBoundaryLength = _boundaryBytes.Length + 2; // Include the final '--' terminator. + } + + public bool FinalBoundaryFound { get; private set; } + + public override bool CanRead + { + get { return true; } + } + + public override bool CanSeek + { + get { return _innerStream.CanSeek; } + } + + public override bool CanWrite + { + get { return false; } + } + + public override long Length + { + get { return _observedLength; } + } + + public override long Position + { + get { return _position; } + set + { + if (value < 0) + { + throw new ArgumentOutOfRangeException("value", value, "The Position must be positive."); + } + if (value > _observedLength) + { + throw new ArgumentOutOfRangeException("value", value, "The Position must be less than length."); + } + _position = value; + if (_position < _observedLength) + { + _finished = false; + } + } + } + + public override long Seek(long offset, SeekOrigin origin) + { + if (origin == SeekOrigin.Begin) + { + Position = offset; + } + else if (origin == SeekOrigin.Current) + { + Position = Position + offset; + } + else // if (origin == SeekOrigin.End) + { + Position = Length + offset; + } + return Position; + } + + public override void SetLength(long value) + { + throw new NotSupportedException(); + } + + public override void Write(byte[] buffer, int offset, int count) + { + throw new NotSupportedException(); + } +#if ASPNET50 + public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) + { + throw new NotSupportedException(); + } + + public override void EndWrite(IAsyncResult asyncResult) + { + throw new NotSupportedException(); + } +#endif + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + throw new NotSupportedException(); + } + + public override void Flush() + { + throw new NotSupportedException(); + } + + private void PositionInnerStream() + { + if (_innerStream.CanSeek && _innerStream.Position != (_innerOffset + _position)) + { + _innerStream.Position = _innerOffset + _position; + } + } + + private int UpdatePosition(int read) + { + _position += read; + if (_observedLength < _position) + { + _observedLength = _position; + } + return read; + } +#if ASPNET50 + public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) + { + var tcs = new TaskCompletionSource(state); + InternalReadAsync(buffer, offset, size, callback, tcs); + return tcs.Task; + } + + private async void InternalReadAsync(byte[] buffer, int offset, int size, AsyncCallback callback, TaskCompletionSource tcs) + { + try + { + int read = await ReadAsync(buffer, offset, size); + tcs.TrySetResult(read); + } + catch (Exception ex) + { + tcs.TrySetException(ex); + } + + if (callback != null) + { + try + { + callback(tcs.Task); + } + catch (Exception) + { + // Suppress exceptions on background threads. + } + } + } + + public override int EndRead(IAsyncResult asyncResult) + { + var task = (Task)asyncResult; + return task.GetAwaiter().GetResult(); + } +#endif + public override int Read(byte[] buffer, int offset, int count) + { + if (_finished) + { + return 0; + } + + PositionInnerStream(); + if (!_innerStream.EnsureBuffered(_finalBoundaryLength)) + { + throw new IOException("Unexpected end of stream."); + } + var bufferedData = _innerStream.BufferedData; + + // scan for a boundary match, full or partial. + int matchOffset; + int matchCount; + int read; + if (SubMatch(bufferedData, _boundaryBytes, out matchOffset, out matchCount)) + { + // We found a possible match, return any data before it. + if (matchOffset > bufferedData.Offset) + { + read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); + return UpdatePosition(read); + } + Debug.Assert(matchCount == _boundaryBytes.Length); + + // "The boundary may be followed by zero or more characters of + // linear whitespace. It is then terminated by either another CRLF" + // or -- for the final boundary. + byte[] boundary = new byte[_boundaryBytes.Length]; + read = _innerStream.Read(boundary, 0, boundary.Length); + Debug.Assert(read == boundary.Length); // It should have all been buffered + var remainder = _innerStream.ReadLine(lengthLimit: 100); // Whitespace may exceed the buffer. + remainder = remainder.Trim(); + if (string.Equals("--", remainder, StringComparison.Ordinal)) + { + FinalBoundaryFound = true; + } + Debug.Assert(FinalBoundaryFound || string.Equals(string.Empty, remainder, StringComparison.Ordinal), "Un-expected data found on the boundary line: " + remainder); + + _finished = true; + return 0; + } + + // No possible boundary match within the buffered data, return the data from the buffer. + read = _innerStream.Read(buffer, offset, Math.Min(count, bufferedData.Count)); + return UpdatePosition(read); + } + + public override async Task ReadAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + if (_finished) + { + return 0; + } + + PositionInnerStream(); + if (!await _innerStream.EnsureBufferedAsync(_finalBoundaryLength, cancellationToken)) + { + throw new IOException("Unexpected end of stream."); + } + var bufferedData = _innerStream.BufferedData; + + // scan for a boundary match, full or partial. + int matchOffset; + int matchCount; + int read; + if (SubMatch(bufferedData, _boundaryBytes, out matchOffset, out matchCount)) + { + // We found a possible match, return any data before it. + if (matchOffset > bufferedData.Offset) + { + // Sync, it's already buffered + read = _innerStream.Read(buffer, offset, Math.Min(count, matchOffset - bufferedData.Offset)); + return UpdatePosition(read); + } + Debug.Assert(matchCount == _boundaryBytes.Length); + + // "The boundary may be followed by zero or more characters of + // linear whitespace. It is then terminated by either another CRLF" + // or -- for the final boundary. + byte[] boundary = new byte[_boundaryBytes.Length]; + read = _innerStream.Read(boundary, 0, boundary.Length); + Debug.Assert(read == boundary.Length); // It should have all been buffered + var remainder = await _innerStream.ReadLineAsync(lengthLimit: 100, cancellationToken: cancellationToken); // Whitespace may exceed the buffer. + remainder = remainder.Trim(); + if (string.Equals("--", remainder, StringComparison.Ordinal)) + { + FinalBoundaryFound = true; + } + Debug.Assert(FinalBoundaryFound || string.Equals(string.Empty, remainder, StringComparison.Ordinal), "Un-expected data found on the boundary line: " + remainder); + + _finished = true; + return 0; + } + + // No possible boundary match within the buffered data, return the data from the buffer. + read = _innerStream.Read(buffer, offset, Math.Min(count, bufferedData.Count)); + return UpdatePosition(read); + } + + // Does Segment1 contain all of segment2, or does it end with the start of segment2? + // 1: AAAAABBBBBCCCCC + // 2: BBBBB + // Or: + // 1: AAAAABBB + // 2: BBBBB + private static bool SubMatch(ArraySegment segment1, byte[] matchBytes, out int matchOffset, out int matchCount) + { + matchCount = 0; + for (matchOffset = segment1.Offset; matchOffset < segment1.Offset + segment1.Count; matchOffset++) + { + int countLimit = segment1.Offset - matchOffset + segment1.Count; + for (matchCount = 0; matchCount < matchBytes.Length && matchCount < countLimit; matchCount++) + { + if (matchBytes[matchCount] != segment1.Array[matchOffset + matchCount]) + { + matchCount = 0; + break; + } + } + if (matchCount > 0) + { + break; + } + } + return matchCount > 0; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs new file mode 100644 index 0000000000..b35bcfee2a --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.WebUtilities +{ + public class MultipartSection + { + public string ContentType + { + get + { + string[] values; + if (Headers.TryGetValue("Content-Type", out values)) + { + return string.Join(", ", values); + } + return null; + } + } + + public string ContentDisposition + { + get + { + string[] values; + if (Headers.TryGetValue("Content-Disposition", out values)) + { + return string.Join(", ", values); + } + return null; + } + } + + public IDictionary Headers { get; set; } + + public Stream Body { get; set; } + + /// + /// The position where the body starts in the total multipart body. + /// This may not be available if the total multipart body is not seekable. + /// + public long? BaseStreamOffset { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs b/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs deleted file mode 100644 index 257b206c6b..0000000000 --- a/src/Microsoft.AspNet.WebUtilities/ParsingHelpers.cs +++ /dev/null @@ -1,111 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.WebUtilities.Collections; - -namespace Microsoft.AspNet.WebUtilities -{ - internal static class ParsingHelpers - { - internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) - { - int textLength = text.Length; - int equalIndex = text.IndexOf('='); - if (equalIndex == -1) - { - equalIndex = textLength; - } - int scanIndex = 0; - while (scanIndex < textLength) - { - int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); - if (delimiterIndex == -1) - { - delimiterIndex = textLength; - } - if (equalIndex < delimiterIndex) - { - while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) - { - ++scanIndex; - } - string name = text.Substring(scanIndex, equalIndex - scanIndex); - string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); - callback( - Uri.UnescapeDataString(name.Replace('+', ' ')), - Uri.UnescapeDataString(value.Replace('+', ' ')), - state); - equalIndex = text.IndexOf('=', delimiterIndex); - if (equalIndex == -1) - { - equalIndex = textLength; - } - } - scanIndex = delimiterIndex + 1; - } - } - - private static readonly Action AppendItemCallback = (name, value, state) => - { - var dictionary = (IDictionary>)state; - - List existing; - if (!dictionary.TryGetValue(name, out existing)) - { - dictionary.Add(name, new List(1) { value }); - } - else - { - existing.Add(value); - } - }; - - internal static IFormCollection GetForm(string text) - { - IDictionary form = new Dictionary(StringComparer.OrdinalIgnoreCase); - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(text, Ampersand, AppendItemCallback, accumulator); - foreach (var kv in accumulator) - { - form.Add(kv.Key, kv.Value.ToArray()); - } - return new FormCollection(form); - } - - internal static string GetJoinedValue(IDictionary store, string key) - { - string[] values = GetUnmodifiedValues(store, key); - return values == null ? null : string.Join(",", values); - } - - internal static string[] GetUnmodifiedValues(IDictionary store, string key) - { - if (store == null) - { - throw new ArgumentNullException("store"); - } - string[] values; - return store.TryGetValue(key, out values) ? values : null; - } - - private static readonly char[] Ampersand = new[] { '&' }; - - internal static IReadableStringCollection GetQuery(string queryString) - { - if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') - { - queryString = queryString.Substring(1); - } - var accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - ParseDelimited(queryString, Ampersand, AppendItemCallback, accumulator); - return new ReadableStringCollection(accumulator.ToDictionary( - item => item.Key, - item => item.Value.ToArray(), - StringComparer.OrdinalIgnoreCase)); - } - } -} diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index f54ff50dea..1414ef8f17 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.WebUtilities { @@ -50,9 +49,49 @@ namespace Microsoft.AspNet.WebUtilities /// /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. - public static IReadableStringCollection ParseQuery(string text) + public static IDictionary ParseQuery(string queryString) { - return ParsingHelpers.GetQuery(text); + if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + { + queryString = queryString.Substring(1); + } + var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + + int textLength = queryString.Length; + int equalIndex = queryString.IndexOf('='); + if (equalIndex == -1) + { + equalIndex = textLength; + } + int scanIndex = 0; + while (scanIndex < textLength) + { + int delimiterIndex = queryString.IndexOf('&', scanIndex); + if (delimiterIndex == -1) + { + delimiterIndex = textLength; + } + if (equalIndex < delimiterIndex) + { + while (scanIndex != equalIndex && char.IsWhiteSpace(queryString[scanIndex])) + { + ++scanIndex; + } + string name = queryString.Substring(scanIndex, equalIndex - scanIndex); + string value = queryString.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); + accumulator.Append( + Uri.UnescapeDataString(name.Replace('+', ' ')), + Uri.UnescapeDataString(value.Replace('+', ' '))); + equalIndex = queryString.IndexOf('=', delimiterIndex); + if (equalIndex == -1) + { + equalIndex = textLength; + } + } + scanIndex = delimiterIndex + 1; + } + + return accumulator.GetResults(); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs new file mode 100644 index 0000000000..c5a2432db6 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class StreamHelperExtensions + { + public static async Task DrainAsync(this Stream stream, CancellationToken cancellationToken) + { + byte[] buffer = new byte[1024]; + cancellationToken.ThrowIfCancellationRequested(); + while (await stream.ReadAsync(buffer, 0, buffer.Length, cancellationToken) > 0) + { + // Not all streams support cancellation directly. + cancellationToken.ThrowIfCancellationRequested(); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 0fb71d0a56..963fcc3178 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -9,6 +9,7 @@ "aspnetcore50": { "dependencies": { "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO.FileSystem": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } } diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index b7fdc8f563..b129adc0e1 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -1,72 +1,266 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; +using System.Linq; using System.Text; -using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Moq; +using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.PipelineCore { public class FormFeatureTests { [Fact] - public async Task GetFormAsync_ReturnsParsedFormCollection() + public async Task ReadFormAsync_SimpleData_ReturnsParsedFormCollection() { // Arrange var formContent = Encoding.UTF8.GetBytes("foo=bar&baz=2"); - var features = new Mock(); - var request = new Mock(); - request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent)); + var context = new DefaultHttpContext(); + context.Request.ContentType = "application/x-www-form-urlencoded; charset=utf-8"; + context.Request.Body = new MemoryStream(formContent); - object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) - .Returns(true); - - var provider = new FormFeature(features.Object); + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); // Act - var formCollection = await provider.GetFormAsync(CancellationToken.None); + var formCollection = await context.Request.ReadFormAsync(); // Assert Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); } [Fact] - public async Task GetFormAsync_CachesFormCollectionPerBodyStream() + public async Task ReadFormAsync_EmptyKeyAtEndAllowed() { // Arrange - var formContent1 = Encoding.UTF8.GetBytes("foo=bar&baz=2"); - var formContent2 = Encoding.UTF8.GetBytes("collection2=value"); - var features = new Mock(); - var request = new Mock(); - request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent1)); + var formContent = Encoding.UTF8.GetBytes("=bar"); + var body = new MemoryStream(formContent); - object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) - .Returns(true); + var formCollection = await FormReader.ReadFormAsync(body); - var provider = new FormFeature(features.Object); + // Assert + Assert.Equal("bar", formCollection[""].FirstOrDefault()); + } - // Act - 1 - var formCollection = await provider.GetFormAsync(CancellationToken.None); + [Fact] + public async Task ReadFormAsync_EmptyKeyWithAdditionalEntryAllowed() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("=bar&baz=2"); + var body = new MemoryStream(formContent); - // Assert - 1 - Assert.Equal("bar", formCollection["foo"]); - Assert.Equal("2", formCollection["baz"]); - Assert.Same(formCollection, await provider.GetFormAsync(CancellationToken.None)); + var formCollection = await FormReader.ReadFormAsync(body); - // Act - 2 - request.SetupGet(r => r.Body).Returns(new MemoryStream(formContent2)); - formCollection = await provider.GetFormAsync(CancellationToken.None); + // Assert + Assert.Equal("bar", formCollection[""].FirstOrDefault()); + Assert.Equal("2", formCollection["baz"].FirstOrDefault()); + } - // Assert - 2 - Assert.Equal("value", formCollection["collection2"]); + [Fact] + public async Task ReadFormAsync_EmptyValuedAtEndAllowed() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("foo="); + var body = new MemoryStream(formContent); + + var formCollection = await FormReader.ReadFormAsync(body); + + // Assert + Assert.Equal("", formCollection["foo"].FirstOrDefault()); + } + + [Fact] + public async Task ReadFormAsync_EmptyValuedWithAdditionalEntryAllowed() + { + // Arrange + var formContent = Encoding.UTF8.GetBytes("foo=&baz=2"); + var body = new MemoryStream(formContent); + + var formCollection = await FormReader.ReadFormAsync(body); + + // Assert + Assert.Equal("", formCollection["foo"].FirstOrDefault()); + Assert.Equal("2", formCollection["baz"].FirstOrDefault()); + } + + private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; + private const string EmptyMultipartForm = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + private const string MultipartFormWithField = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""description"" + +Foo +--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + private const string MultipartFormWithFile = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" +Content-Type: text/html + +Hello World +--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + private const string MultipartFormWithFieldAndFile = +@"--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""description"" + +Foo +--WebKitFormBoundary5pDRpGheQXaM8k3T +Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" +Content-Type: text/html + +Hello World +--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + + [Fact] + public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(EmptyMultipartForm); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = context.Request.Form; + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formCollection, formFeature.Form); + Assert.Same(formCollection, await context.Request.ReadFormAsync()); + + // Content + Assert.Equal(0, formCollection.Count); + Assert.NotNull(formCollection.Files); + Assert.Equal(0, formCollection.Files.Count); + } + + [Fact] + public async Task ReadForm_MultipartWithField_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithField); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = context.Request.Form; + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formCollection, formFeature.Form); + Assert.Same(formCollection, await context.Request.ReadFormAsync()); + + // Content + Assert.Equal(1, formCollection.Count); + Assert.Equal("Foo", formCollection["description"]); + + Assert.NotNull(formCollection.Files); + Assert.Equal(0, formCollection.Files.Count); + } + + [Fact] + public async Task ReadFormAsync_MultipartWithFile_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithFile); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); + Assert.Same(formCollection, context.Request.Form); + + // Content + Assert.Equal(0, formCollection.Count); + + Assert.NotNull(formCollection.Files); + Assert.Equal(1, formCollection.Files.Count); + + var file = formCollection.Files["myfile1"]; + Assert.Equal("text/html", file.ContentType); + Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); + var body = file.OpenReadStream(); + using (var reader = new StreamReader(body)) + { + var content = reader.ReadToEnd(); + Assert.Equal(content, "Hello World"); + } + } + + [Fact] + public async Task ReadFormAsync_MultipartWithFieldAndFile_ReturnsParsedFormCollection() + { + var formContent = Encoding.UTF8.GetBytes(MultipartFormWithFieldAndFile); + var context = new DefaultHttpContext(); + context.Request.ContentType = MultipartContentType; + context.Request.Body = new MemoryStream(formContent); + + // Not cached yet + var formFeature = context.GetFeature(); + Assert.Null(formFeature); + + var formCollection = await context.Request.ReadFormAsync(); + + Assert.NotNull(formCollection); + + // Cached + formFeature = context.GetFeature(); + Assert.NotNull(formFeature); + Assert.NotNull(formFeature.Form); + Assert.Same(formFeature.Form, formCollection); + Assert.Same(formCollection, context.Request.Form); + + // Content + Assert.Equal(1, formCollection.Count); + Assert.Equal("Foo", formCollection["description"]); + + Assert.NotNull(formCollection.Files); + Assert.Equal(1, formCollection.Files.Count); + + var file = formCollection.Files["myfile1"]; + Assert.Equal("text/html", file.ContentType); + Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); + var body = file.OpenReadStream(); + using (var reader = new StreamReader(body)) + { + var content = reader.ReadToEnd(); + Assert.Equal(content, "Hello World"); + } } } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs new file mode 100644 index 0000000000..a642511a86 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -0,0 +1,185 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities +{ + public class MultipartReaderTests + { + private const string Boundary = "9051914041544843365972754266"; + private const string OnePartBody = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266-- +"; + private const string OnePartBodyWithTrailingWhitespace = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266-- +"; + // It's non-compliant but common to leave off the last CRLF. + private const string OnePartBodyWithoutFinalCRLF = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266--"; + private const string TwoPartBody = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file1""; filename=""a.txt"" +Content-Type: text/plain + +Content of a.txt. + +--9051914041544843365972754266-- +"; + private const string ThreePartBody = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file1""; filename=""a.txt"" +Content-Type: text/plain + +Content of a.txt. + +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file2""; filename=""a.html"" +Content-Type: text/html + +Content of a.html. + +--9051914041544843365972754266-- +"; + + private static MemoryStream MakeStream(string text) + { + return new MemoryStream(Encoding.UTF8.GetBytes(text)); + } + + [Fact] + public async Task MutipartReader_ReadSinglePartBody_Success() + { + var stream = MakeStream(OnePartBody); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadSinglePartBodyWithTrailingWhitespace_Success() + { + var stream = MakeStream(OnePartBodyWithTrailingWhitespace); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadSinglePartBodyWithoutLastCRLF_Success() + { + var stream = MakeStream(OnePartBodyWithoutFinalCRLF); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadTwoPartBody_Success() + { + var stream = MakeStream(TwoPartBody); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ThreePartBody_Success() + { + var stream = MakeStream(ThreePartBody); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file2\"; filename=\"a.html\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/html", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.html.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index fea33d497a..e90c78305a 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using Xunit; namespace Microsoft.AspNet.WebUtilities @@ -13,8 +14,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?key1=value1&key2=value2"); Assert.Equal(2, collection.Count); - Assert.Equal("value1", collection["key1"]); - Assert.Equal("value2", collection["key2"]); + Assert.Equal("value1", collection["key1"].FirstOrDefault()); + Assert.Equal("value2", collection["key2"].FirstOrDefault()); } [Fact] @@ -22,8 +23,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("key1=value1&key2=value2"); Assert.Equal(2, collection.Count); - Assert.Equal("value1", collection["key1"]); - Assert.Equal("value2", collection["key2"]); + Assert.Equal("value1", collection["key1"].FirstOrDefault()); + Assert.Equal("value2", collection["key2"].FirstOrDefault()); } [Fact] @@ -31,8 +32,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?key1=valueA&key2=valueB&key1=valueC"); Assert.Equal(2, collection.Count); - Assert.Equal("valueA,valueC", collection["key1"]); - Assert.Equal("valueB", collection["key2"]); + Assert.Equal(new[] { "valueA", "valueC" }, collection["key1"]); + Assert.Equal("valueB", collection["key2"].FirstOrDefault()); } [Fact] @@ -40,8 +41,8 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?key1=&key2="); Assert.Equal(2, collection.Count); - Assert.Equal(string.Empty, collection["key1"]); - Assert.Equal(string.Empty, collection["key2"]); + Assert.Equal(string.Empty, collection["key1"].FirstOrDefault()); + Assert.Equal(string.Empty, collection["key2"].FirstOrDefault()); } [Fact] @@ -49,7 +50,7 @@ namespace Microsoft.AspNet.WebUtilities { var collection = QueryHelpers.ParseQuery("?=value1&="); Assert.Equal(1, collection.Count); - Assert.Equal("value1,", collection[""]); + Assert.Equal(new[] { "value1", "" }, collection[""]); } } } \ No newline at end of file From f786fb7bd0b60c1551774235a4954830760e6c2e Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 12 Jan 2015 10:22:15 -0800 Subject: [PATCH 0369/1838] Add HttpContextAccessor --- .../HostingServices.cs | 2 +- .../HostingServicesCollectionExtensions.cs | 5 +- .../HttpContextAccessor.cs | 73 ++++++++++++++++++ .../IHttpContextAccessor.cs | 15 ++++ .../Startup/StartupLoader.cs | 3 - .../ContainerExtensions.cs | 4 - .../ContainerMiddleware.cs | 76 ++----------------- .../RequestServicesContainer.cs | 23 +++--- .../project.json | 6 +- .../UseRequestServicesFacts.cs | 1 + 10 files changed, 112 insertions(+), 96 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs create mode 100644 src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 3ff28e403f..b717bb7050 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -45,7 +45,7 @@ namespace Microsoft.AspNet.Hosting public HostingManifest(IServiceProvider fallback) { var manifest = fallback.GetRequiredService(); - Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory) } + Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor) } .Concat(manifest.Services).Distinct(); } diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index ac661999b2..5122ca73da 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -38,11 +38,8 @@ namespace Microsoft.Framework.DependencyInjection services.AddTypeActivator(configuration); // TODO: Do we expect this to be provide by the runtime eventually? services.AddLogging(configuration); - // REVIEW: okay to use existing hosting environment/httpcontext if specified? services.TryAdd(describer.Singleton()); - - // TODO: Remove this once we have IHttpContextAccessor - services.AddContextAccessor(configuration); + services.TryAdd(describer.Scoped()); // REVIEW: don't try add because we pull out IEnumerable? services.AddInstance(new ConfigureHostingEnvironment(configuration)); diff --git a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs new file mode 100644 index 0000000000..c811d4bfef --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs @@ -0,0 +1,73 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +#if ASPNET50 +using System.Runtime.Remoting.Messaging; +using System.Runtime.Remoting; +#elif ASPNETCORE50 +using System.Threading; +#endif +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.Hosting +{ + public class HttpContextAccessor : IHttpContextAccessor + { + private HttpContext _value; + + public bool IsRootContext { get; set; } + + public HttpContext Value + { + get + { + return IsRootContext ? AccessRootHttpContext() : _value; + } + } + + public HttpContext SetValue(HttpContext value) + { + if (IsRootContext) + { + return ExchangeRootHttpContext(value); + } + var prior = _value; + _value = value; + return prior; + } + +#if ASPNET50 + private const string LogicalDataKey = "__HttpContext_Current__"; +#elif ASPNETCORE50 + private static AsyncLocal _httpContextCurrent = new AsyncLocal(); +#endif + + private static HttpContext AccessRootHttpContext() + { +#if ASPNET50 + var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + return handle != null ? handle.Unwrap() as HttpContext : null; +#elif ASPNETCORE50 + return _httpContextCurrent.Value; +#else + throw new Exception("TODO: CallContext not available"); +#endif + } + + private static HttpContext ExchangeRootHttpContext(HttpContext httpContext) + { +#if ASPNET50 + var prior = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(httpContext)); + return prior != null ? prior.Unwrap() as HttpContext : null; +#elif ASPNETCORE50 + var prior = _httpContextCurrent.Value; + _httpContextCurrent.Value = httpContext; + return prior; +#else + return null; +#endif + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs new file mode 100644 index 0000000000..01656f4cd7 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.Hosting +{ + public interface IHttpContextAccessor + { + bool IsRootContext { get; set; } + HttpContext Value { get; } + + HttpContext SetValue(HttpContext value); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 3b300a1eca..a7e85283bf 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -9,7 +9,6 @@ using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.OptionsModel; namespace Microsoft.AspNet.Hosting.Startup { @@ -153,8 +152,6 @@ namespace Microsoft.AspNet.Hosting.Startup if (servicesMethod != null) { var services = HostingServices.Create(builder.ApplicationServices); - // TODO: remove this once IHttpContextAccessor service is added - services.AddContextAccessor(); if (servicesMethod.ReturnType == typeof(IServiceProvider)) { // IServiceProvider ConfigureServices(IServiceCollection) diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 9813e9164f..06d89995f2 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -48,10 +48,6 @@ namespace Microsoft.AspNet.Builder // Import services from hosting/KRE as fallback var serviceCollection = HostingServices.Create(builder.ApplicationServices); - // TODO: remove this once IHttpContextAccessor service is added - serviceCollection.AddContextAccessor(); - - // REVIEW: serviceCollection has the merged services, manifests are lost after this builder.ApplicationServices = configureServices(serviceCollection); return builder.UseMiddleware(); diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs index 4145525ab8..097acf6d1b 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs @@ -2,72 +2,21 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -#if ASPNET50 -using System.Runtime.Remoting.Messaging; -#endif using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection; -#if ASPNET50 -using System.Runtime.Remoting; -#endif + namespace Microsoft.AspNet.RequestContainer { public class ContainerMiddleware { - private const string LogicalDataKey = "__HttpContext_Current__"; private readonly RequestDelegate _next; - private readonly IServiceProvider _rootServiceProvider; - private readonly IContextAccessor _rootHttpContextAccessor; - private readonly IServiceScopeFactory _rootServiceScopeFactory; + private readonly IServiceProvider _services; - public ContainerMiddleware( - RequestDelegate next, - IServiceProvider rootServiceProvider, - IContextAccessor rootHttpContextAccessor, - IServiceScopeFactory rootServiceScopeFactory) + public ContainerMiddleware(RequestDelegate next, IServiceProvider services) { - if (rootServiceProvider == null) - { - throw new ArgumentNullException("rootServiceProvider"); - } - if (rootHttpContextAccessor == null) - { - throw new ArgumentNullException("rootHttpContextAccessor"); - } - if (rootServiceScopeFactory == null) - { - throw new ArgumentNullException("rootServiceScopeFactory"); - } - + _services = services; _next = next; - _rootServiceProvider = rootServiceProvider; - _rootServiceScopeFactory = rootServiceScopeFactory; - _rootHttpContextAccessor = rootHttpContextAccessor; - - _rootHttpContextAccessor.SetContextSource(AccessRootHttpContext, ExchangeRootHttpContext); - } - - internal static HttpContext AccessRootHttpContext() - { -#if ASPNET50 - var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - return handle != null ? handle.Unwrap() as HttpContext : null; -#else - throw new Exception("TODO: CallContext not available"); -#endif - } - - internal static HttpContext ExchangeRootHttpContext(HttpContext httpContext) - { -#if ASPNET50 - var prior = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(httpContext)); - return prior != null ? prior.Unwrap() as HttpContext : null; -#else - return null; -#endif } public async Task Invoke(HttpContext httpContext) @@ -77,22 +26,7 @@ namespace Microsoft.AspNet.RequestContainer throw new Exception("TODO: nested request container scope? this is probably a mistake on your part?"); } - var priorApplicationServices = httpContext.ApplicationServices; - var priorRequestServices = httpContext.RequestServices; - - var appServiceProvider = _rootServiceProvider; - var appServiceScopeFactory = _rootServiceScopeFactory; - var appHttpContextAccessor = _rootHttpContextAccessor; - - if (priorApplicationServices != null && - priorApplicationServices != appServiceProvider) - { - appServiceProvider = priorApplicationServices; - appServiceScopeFactory = priorApplicationServices.GetRequiredService(); - appHttpContextAccessor = priorApplicationServices.GetRequiredService>(); - } - - using (var container = new RequestServicesContainer(httpContext, appServiceScopeFactory, appHttpContextAccessor, appServiceProvider)) + using (var container = RequestServicesContainer.EnsureRequestServices(httpContext, _services)) { await _next.Invoke(httpContext); } diff --git a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs index a7c646321e..8b3d32316d 100644 --- a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; @@ -12,7 +13,7 @@ namespace Microsoft.AspNet.RequestContainer public RequestServicesContainer( HttpContext context, IServiceScopeFactory scopeFactory, - IContextAccessor appContextAccessor, + IHttpContextAccessor appContextAccessor, IServiceProvider appServiceProvider) { if (scopeFactory == null) @@ -36,7 +37,7 @@ namespace Microsoft.AspNet.RequestContainer // Begin the scope Scope = scopeFactory.CreateScope(); - ScopeContextAccessor = Scope.ServiceProvider.GetRequiredService>(); + ScopeContextAccessor = Scope.ServiceProvider.GetRequiredService(); Context.ApplicationServices = appServiceProvider; Context.RequestServices = Scope.ServiceProvider; @@ -51,8 +52,9 @@ namespace Microsoft.AspNet.RequestContainer private HttpContext PriorAppHttpContext { get; set; } private HttpContext PriorScopeHttpContext { get; set; } private IServiceScope Scope { get; set; } - private IContextAccessor ScopeContextAccessor { get; set; } - private IContextAccessor AppContextAccessor { get; set; } + private IHttpContextAccessor ScopeContextAccessor { get; set; } + private IHttpContextAccessor AppContextAccessor { get; set; } + // CONSIDER: this could be an extension method on HttpContext instead public static RequestServicesContainer EnsureRequestServices(HttpContext httpContext, IServiceProvider services) @@ -64,7 +66,6 @@ namespace Microsoft.AspNet.RequestContainer } var serviceProvider = httpContext.ApplicationServices ?? services; - if (serviceProvider == null) { throw new InvalidOperationException("TODO: services and httpContext.ApplicationServices are both null!"); @@ -72,10 +73,10 @@ namespace Microsoft.AspNet.RequestContainer // Matches constructor of RequestContainer var rootServiceProvider = serviceProvider.GetRequiredService(); - var rootHttpContextAccessor = serviceProvider.GetRequiredService>(); + var rootHttpContextAccessor = serviceProvider.GetRequiredService(); var rootServiceScopeFactory = serviceProvider.GetRequiredService(); - rootHttpContextAccessor.SetContextSource(ContainerMiddleware.AccessRootHttpContext, ContainerMiddleware.ExchangeRootHttpContext); + rootHttpContextAccessor.IsRootContext = true; // Pre Scope setup var priorApplicationServices = serviceProvider; @@ -90,14 +91,14 @@ namespace Microsoft.AspNet.RequestContainer { appServiceProvider = priorApplicationServices; appServiceScopeFactory = priorApplicationServices.GetRequiredService(); - appHttpContextAccessor = priorApplicationServices.GetRequiredService>(); + appHttpContextAccessor = priorApplicationServices.GetRequiredService(); } // Creates the scope and does the service swaps return new RequestServicesContainer(httpContext, appServiceScopeFactory, appHttpContextAccessor, appServiceProvider); } - #region IDisposable Support +#region IDisposable Support private bool disposedValue = false; // To detect redundant calls protected virtual void Dispose(bool disposing) @@ -137,8 +138,6 @@ namespace Microsoft.AspNet.RequestContainer // Do not change this code. Put cleanup code in Dispose(bool disposing) above. Dispose(true); } - #endregion - +#endregion } - } \ No newline at end of file diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index d8f3cef5a9..076064ad98 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -8,6 +8,10 @@ }, "frameworks": { "aspnet50": {}, - "aspnetcore50": {} + "aspnetcore50": { + "dependencies": { + "System.Threading": "4.0.10-beta-*" + } + }, } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 7b01e54c6f..0e00d492ef 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -92,6 +92,7 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(typeof(ITypeActivator))] [InlineData(typeof(IApplicationLifetime))] [InlineData(typeof(ILoggerFactory))] + [InlineData(typeof(IHttpContextAccessor))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) { var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); From 4377bb24ce59bc25d346fe5bc84e5fc0cfe97617 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Fri, 9 Jan 2015 12:53:23 -0800 Subject: [PATCH 0370/1838] Added extension methods for FormFile --- .../FormFileExtensions.cs | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs new file mode 100644 index 0000000000..a0c78ead9e --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -0,0 +1,47 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + /// + /// Extension methods for . + /// + public static class FormFileExtensions + { + private static int DefaultBufferSize = 81920; + + /// + /// Saves the contents of an uploaded file. + /// + /// The . + /// The name of the file to create. + public static void SaveAs([NotNull] this IFormFile formFile, string filename) + { + using (var fileStream = new FileStream(filename, FileMode.Create)) + { + var inputStream = formFile.OpenReadStream(); + inputStream.CopyTo(fileStream); + } + } + + /// + /// Asynchronously saves the contents of an uploaded file. + /// + /// The . + /// The name of the file to create. + public async static Task SaveAsAsync([NotNull] this IFormFile formFile, + string filename, + CancellationToken cancellationToken = default(CancellationToken)) + { + using (var fileStream = new FileStream(filename, FileMode.Create)) + { + var inputStream = formFile.OpenReadStream(); + await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); + } + } + } +} \ No newline at end of file From 4fb21644fc3b2387e07e3622f2361652d4598c1f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 14 Jan 2015 15:41:09 -0800 Subject: [PATCH 0371/1838] Implement strongly typed headers. --- HttpAbstractions.sln | 32 +- .../Microsoft.AspNet.FeatureModel.kproj | 9 +- .../HeaderDictionaryTypeExtensions.cs | 202 +++++ .../Microsoft.AspNet.Http.Extensions.kproj | 9 +- .../QueryBuilder.cs | 3 +- .../RequestHeaders.cs | 259 +++++++ .../ResponseHeaders.cs | 156 ++++ .../UriHelper.cs | 18 +- .../project.json | 3 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 24 - .../Microsoft.AspNet.Http.kproj | 9 +- .../Microsoft.AspNet.HttpFeature.kproj | 9 +- .../Microsoft.AspNet.Owin.kproj | 9 +- .../OwinFeatureCollection.cs | 2 +- .../Collections/FormFileCollection.cs | 9 +- .../Collections/HeaderDictionary.cs | 4 + .../DefaultHttpRequest.cs | 12 - .../FormFeature.cs | 123 +-- .../Infrastructure/ParsingHelpers.cs | 19 - .../Microsoft.AspNet.PipelineCore.kproj | 9 +- .../project.json | 4 +- .../FormReader.cs | 21 +- .../Microsoft.AspNet.WebUtilities.kproj | 9 +- .../project.json | 6 +- .../BaseHeaderParser.cs | 70 ++ .../CacheControlHeaderValue.cs | 603 +++++++++++++++ .../ContentDispositionHeaderValue.cs | 702 ++++++++++++++++++ .../ContentRangeHeaderValue.cs | 397 ++++++++++ .../CookieHeaderParser.cs | 104 +++ .../CookieHeaderValue.cs | 256 +++++++ .../EntityTagHeaderValue.cs | 204 +++++ .../GenericHeaderParser.cs | 23 + src/Microsoft.Net.Http.Headers/HeaderNames.cs | 59 ++ .../HeaderQuality.cs | 18 + .../HeaderUtilities.cs | 232 ++++++ .../HttpHeaderParser.cs | 137 ++++ .../HttpParseResult.cs | 12 + .../HttpRuleParser.cs | 352 +++++++++ .../MediaTypeHeaderValue.cs | 408 ++++++++++ .../MediaTypeHeaderValueComparer.cs | 100 +++ .../Microsoft.Net.Http.Headers.kproj | 23 + .../NameValueHeaderValue.cs | 347 +++++++++ .../NotNullAttribute.cs | 12 + .../ObjectCollection.cs | 56 ++ .../RangeConditionHeaderValue.cs | 166 +++++ .../RangeHeaderValue.cs | 161 ++++ .../RangeItemHeaderValue.cs | 226 ++++++ .../SetCookieHeaderValue.cs | 364 +++++++++ .../StringWithQualityHeaderValue.cs | 225 ++++++ .../StringWithQualityHeaderValueComparer.cs | 71 ++ src/Microsoft.Net.Http.Headers/project.json | 19 + .../HeaderDictionaryTypeExtensionsTest.cs | 206 +++++ ...crosoft.AspNet.Http.Extensions.Tests.kproj | 9 +- .../QueryBuilderTests.cs | 2 +- .../UseWithServicesTests.cs | 5 +- .../DefaultHttpRequestTests.cs | 20 - .../Microsoft.AspNet.WebUtilities.Tests.kproj | 9 +- .../project.json | 4 +- .../CacheControlHeaderValueTest.cs | 599 +++++++++++++++ .../ContentDispositionHeaderValueTest.cs | 609 +++++++++++++++ .../ContentRangeHeaderValueTest.cs | 272 +++++++ .../CookieHeaderValueTest.cs | 229 ++++++ .../DateParserTest.cs | 58 ++ .../EntityTagHeaderValueTest.cs | 315 ++++++++ .../MediaTypeHeaderValueComparerTests.cs | 69 ++ .../MediaTypeHeaderValueTest.cs | 520 +++++++++++++ .../Microsoft.Net.Http.Headers.Tests.kproj | 23 + .../NameValueHeaderValueTest.cs | 394 ++++++++++ .../RangeConditionHeaderValueTest.cs | 174 +++++ .../RangeHeaderValueTest.cs | 183 +++++ .../RangeItemHeaderValueTest.cs | 162 ++++ .../SetCookieHeaderValueTest.cs | 259 +++++++ ...tringWithQualityHeaderValueComparerTest.cs | 64 ++ .../StringWithQualityHeaderValueTest.cs | 339 +++++++++ .../project.json | 18 + 75 files changed, 10676 insertions(+), 173 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.Http.Extensions}/QueryBuilder.cs (97%) create mode 100644 src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.Http.Extensions}/UriHelper.cs (85%) create mode 100644 src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/HeaderNames.cs create mode 100644 src/Microsoft.Net.Http.Headers/HeaderQuality.cs create mode 100644 src/Microsoft.Net.Http.Headers/HeaderUtilities.cs create mode 100644 src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/HttpParseResult.cs create mode 100644 src/Microsoft.Net.Http.Headers/HttpRuleParser.cs create mode 100644 src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs create mode 100644 src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj create mode 100644 src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/NotNullAttribute.cs create mode 100644 src/Microsoft.Net.Http.Headers/ObjectCollection.cs create mode 100644 src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs create mode 100644 src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs create mode 100644 src/Microsoft.Net.Http.Headers/project.json create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNet.Http.Extensions.Tests}/QueryBuilderTests.cs (98%) create mode 100644 test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj create mode 100644 test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs create mode 100644 test/Microsoft.Net.Http.Headers.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index cdea46535d..8ae65bd225 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21916.0 +VisualStudioVersion = 14.0.22410.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -33,6 +33,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtiliti EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.kproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.kproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.kproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -173,6 +177,30 @@ Global {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {93C10E50-BCBB-4D8E-9492-D46E1396225B}.Release|x86.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|x86.ActiveCfg = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Debug|x86.Build.0 = Debug|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Any CPU.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Any CPU.Build.0 = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|x86.ActiveCfg = Release|Any CPU + {60AA2FDB-8121-4826-8D00-9A143FEFAF66}.Release|x86.Build.0 = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Debug|x86.Build.0 = Debug|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Any CPU.Build.0 = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -191,5 +219,7 @@ Global {AE25EF21-7F91-4B86-B73E-AF746821D339} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {A2FB7838-0031-4FAD-BA3E-83C30B3AF406} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 561cd372d7..5484c20589 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs new file mode 100644 index 0000000000..fc4438c018 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -0,0 +1,202 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Microsoft.AspNet.Http.Headers; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http +{ + public static class HeaderDictionaryTypeExtensions + { + public static RequestHeaders GetTypedHeaders(this HttpRequest request) + { + return new RequestHeaders(request.Headers); + } + + public static ResponseHeaders GetTypedHeaders(this HttpResponse response) + { + return new ResponseHeaders(response.Headers); + } + + public static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) + { + return headers.Get(name); + } + + public static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) + { + if (value == null) + { + headers.Remove(name); + } + else + { + headers[name] = value.ToString(); + } + } + + public static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) + { + if (values == null || values.Count == 0) + { + headers.Remove(name); + } + else + { + headers.SetValues(name, values.Select(value => value.ToString()).ToArray()); + } + } + + public static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) + { + if (value.HasValue) + { + headers[name] = HeaderUtilities.FormatDate(value.Value); + } + else + { + headers.Remove(name); + } + } + + public static void Append([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] object value) + { + headers.Append(name, value.ToString()); + } + + public static void AppendList([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] IList values) + { + headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + } + + private static IDictionary KnownParsers = new Dictionary() + { + { typeof(CacheControlHeaderValue), new Func(value => { CacheControlHeaderValue result; return CacheControlHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(ContentDispositionHeaderValue), new Func(value => { ContentDispositionHeaderValue result; return ContentDispositionHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(ContentRangeHeaderValue), new Func(value => { ContentRangeHeaderValue result; return ContentRangeHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(MediaTypeHeaderValue), new Func(value => { MediaTypeHeaderValue result; return MediaTypeHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(RangeConditionHeaderValue), new Func(value => { RangeConditionHeaderValue result; return RangeConditionHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(RangeHeaderValue), new Func(value => { RangeHeaderValue result; return RangeHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(EntityTagHeaderValue), new Func(value => { EntityTagHeaderValue result; return EntityTagHeaderValue.TryParse(value, out result) ? result : null; }) }, + { typeof(DateTimeOffset?), new Func(value => { DateTimeOffset result; return HeaderUtilities.TryParseDate(value, out result) ? result : (DateTimeOffset?)null; }) }, + { typeof(long?), new Func(value => { long result; return HeaderUtilities.TryParseInt64(value, out result) ? result : (long?)null; }) }, + }; + + private static IDictionary KnownListParsers = new Dictionary() + { + { typeof(MediaTypeHeaderValue), new Func, IList>(value => { IList result; return MediaTypeHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(StringWithQualityHeaderValue), new Func, IList>(value => { IList result; return StringWithQualityHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(CookieHeaderValue), new Func, IList>(value => { IList result; return CookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(EntityTagHeaderValue), new Func, IList>(value => { IList result; return EntityTagHeaderValue.TryParseList(value, out result) ? result : null; }) }, + { typeof(SetCookieHeaderValue), new Func, IList>(value => { IList result; return SetCookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, + }; + + public static T Get([NotNull] this IHeaderDictionary headers, string name) + { + object temp; + if (KnownParsers.TryGetValue(typeof(T), out temp)) + { + var func = (Func)temp; + return func(headers[name]); + } + + var value = headers[name]; + if (string.IsNullOrWhiteSpace(value)) + { + return default(T); + } + + return GetViaReflection(value); + } + + public static IList GetList([NotNull] this IHeaderDictionary headers, string name) + { + object temp; + if (KnownListParsers.TryGetValue(typeof(T), out temp)) + { + var func = (Func, IList>)temp; + return func(headers.GetValues(name)); + } + + var values = headers.GetValues(name); + if (values == null || !values.Any()) + { + return null; + } + + return GetListViaReflection(values); + } + + private static T GetViaReflection(string value) + { + // TODO: Cache the reflected type for later? Only if success? + var type = typeof(T); + var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(methodInfo => + { + if (string.Equals("TryParse", methodInfo.Name, StringComparison.Ordinal) + && methodInfo.ReturnParameter.ParameterType.Equals(typeof(bool))) + { + var methodParams = methodInfo.GetParameters(); + return methodParams.Length == 2 + && methodParams[0].ParameterType.Equals(typeof(string)) + && methodParams[1].IsOut + && methodParams[1].ParameterType.Equals(type.MakeByRefType()); + } + return false; + }).FirstOrDefault(); + + if (method == null) + { + throw new NotSupportedException(string.Format( + "The given type '{0}' does not have a TryParse method with the required signature 'public static bool TryParse(string, out {0}).", nameof(T))); + } + + var parameters = new object[] { value, null }; + var success = (bool)method.Invoke(null, parameters); + if (success) + { + return (T)parameters[1]; + } + return default(T); + } + + private static IList GetListViaReflection(IList values) + { + // TODO: Cache the reflected type for later? Only if success? + var type = typeof(T); + var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) + .Where(methodInfo => + { + if (string.Equals("TryParseList", methodInfo.Name, StringComparison.Ordinal) + && methodInfo.ReturnParameter.ParameterType.Equals(typeof(Boolean))) + { + var methodParams = methodInfo.GetParameters(); + return methodParams.Length == 2 + && methodParams[0].ParameterType.Equals(typeof(IList)) + && methodParams[1].IsOut + && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); + } + return false; + }).FirstOrDefault(); + + if (method == null) + { + throw new NotSupportedException(string.Format( + "The given type '{0}' does not have a TryParseList method with the required signature 'public static bool TryParseList(IList, out IList<{0}>).", nameof(T))); + } + + var parameters = new object[] { values, null }; + var success = (bool)method.Invoke(null, parameters); + if (success) + { + return (IList)parameters[1]; + } + return null; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index a9b64e3c08..b431b00760 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs similarity index 97% rename from src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs rename to src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index 28cdfa85fe..a4afbba272 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -5,9 +5,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Text; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNet.Http.Extensions { // The IEnumerable interface is required for the collection initialization syntax: new QueryBuilder() { { "key", "value" } }; public class QueryBuilder : IEnumerable> diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs new file mode 100644 index 0000000000..eeeef90b24 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -0,0 +1,259 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http.Headers +{ + public class RequestHeaders + { + public RequestHeaders([NotNull] IHeaderDictionary headers) + { + Headers = headers; + } + + public IHeaderDictionary Headers { get; private set; } + + public IList Accept + { + get + { + return Headers.GetList(HeaderNames.Accept); + } + set + { + Headers.SetList(HeaderNames.Accept, value); + } + } + + public IList AcceptCharset + { + get + { + return Headers.GetList(HeaderNames.AcceptCharset); + } + set + { + Headers.SetList(HeaderNames.AcceptCharset, value); + } + } + + public IList AcceptEncoding + { + get + { + return Headers.GetList(HeaderNames.AcceptEncoding); + } + set + { + Headers.SetList(HeaderNames.AcceptEncoding, value); + } + } + + public IList AcceptLanguage + { + get + { + return Headers.GetList(HeaderNames.AcceptLanguage); + } + set + { + Headers.SetList(HeaderNames.AcceptLanguage, value); + } + } + + public CacheControlHeaderValue CacheControl + { + get + { + return Headers.Get(HeaderNames.CacheControl); + } + set + { + Headers.Set(HeaderNames.CacheControl, value); + } + } + + public ContentDispositionHeaderValue ContentDisposition + { + get + { + return Headers.Get(HeaderNames.ContentDisposition); + } + set + { + Headers.Set(HeaderNames.ContentDisposition, value); + } + } + + public long? ContentLength + { + get + { + return Headers.Get(HeaderNames.ContentLength); + } + set + { + Headers.Set(HeaderNames.ContentLength, value.HasValue ? HeaderUtilities.FormatInt64(value.Value) : null); + } + } + + public ContentRangeHeaderValue ContentRange + { + get + { + return Headers.Get(HeaderNames.ContentRange); + } + set + { + Headers.Set(HeaderNames.ContentRange, value); + } + } + + public MediaTypeHeaderValue ContentType + { + get + { + return Headers.Get(HeaderNames.ContentType); + } + set + { + Headers.Set(HeaderNames.ContentType, value); + } + } + + public IList Cookie + { + get + { + return Headers.GetList(HeaderNames.Cookie); + } + set + { + Headers.SetList(HeaderNames.Cookie, value); + } + } + + public DateTimeOffset? Date + { + get + { + return Headers.GetDate(HeaderNames.Date); + } + set + { + Headers.SetDate(HeaderNames.Date, value); + } + } + + public DateTimeOffset? Expires + { + get + { + return Headers.GetDate(HeaderNames.Expires); + } + set + { + Headers.SetDate(HeaderNames.Expires, value); + } + } + + public HostString Host + { + get + { + return HostString.FromUriComponent(Headers[HeaderNames.Host]); + } + set + { + Headers[HeaderNames.Host] = value.ToUriComponent(); + } + } + + public IList IfMatch + { + get + { + return Headers.GetList(HeaderNames.IfMatch); + } + set + { + Headers.SetList(HeaderNames.IfMatch, value); + } + } + + public DateTimeOffset? IfModifiedSince + { + get + { + return Headers.GetDate(HeaderNames.IfModifiedSince); + } + set + { + Headers.SetDate(HeaderNames.IfModifiedSince, value); + } + } + + public IList IfNoneMatch + { + get + { + return Headers.GetList(HeaderNames.IfNoneMatch); + } + set + { + Headers.SetList(HeaderNames.IfNoneMatch, value); + } + } + + public RangeConditionHeaderValue IfRange + { + get + { + return Headers.Get(HeaderNames.IfRange); + } + set + { + Headers.Set(HeaderNames.IfRange, value); + } + } + + public DateTimeOffset? IfUnmodifiedSince + { + get + { + return Headers.GetDate(HeaderNames.IfUnmodifiedSince); + } + set + { + Headers.SetDate(HeaderNames.IfUnmodifiedSince, value); + } + } + + public DateTimeOffset? LastModified + { + get + { + return Headers.GetDate(HeaderNames.LastModified); + } + set + { + Headers.SetDate(HeaderNames.LastModified, value); + } + } + + public RangeHeaderValue Range + { + get + { + return Headers.Get(HeaderNames.Range); + } + set + { + Headers.Set(HeaderNames.Range, value); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs new file mode 100644 index 0000000000..4169f237a7 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -0,0 +1,156 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http.Extensions; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http.Headers +{ + public class ResponseHeaders + { + public ResponseHeaders([NotNull] IHeaderDictionary headers) + { + Headers = headers; + } + + public IHeaderDictionary Headers { get; private set; } + + public CacheControlHeaderValue CacheControl + { + get + { + return Headers.Get(HeaderNames.CacheControl); + } + set + { + Headers.Set(HeaderNames.CacheControl, value); + } + } + + public ContentDispositionHeaderValue ContentDisposition + { + get + { + return Headers.Get(HeaderNames.ContentDisposition); + } + set + { + Headers.Set(HeaderNames.ContentDisposition, value); + } + } + + public long? ContentLength + { + get + { + return Headers.Get(HeaderNames.ContentLength); + } + set + { + Headers.Set(HeaderNames.ContentLength, value.HasValue ? HeaderUtilities.FormatInt64(value.Value) : null); + } + } + + public ContentRangeHeaderValue ContentRange + { + get + { + return Headers.Get(HeaderNames.ContentRange); + } + set + { + Headers.Set(HeaderNames.ContentRange, value); + } + } + + public MediaTypeHeaderValue ContentType + { + get + { + return Headers.Get(HeaderNames.ContentType); + } + set + { + Headers.Set(HeaderNames.ContentType, value); + } + } + + public DateTimeOffset? Date + { + get + { + return Headers.GetDate(HeaderNames.Date); + } + set + { + Headers.SetDate(HeaderNames.Date, value); + } + } + + public EntityTagHeaderValue ETag + { + get + { + return Headers.Get(HeaderNames.ETag); + } + set + { + Headers.Set(HeaderNames.ETag, value); + } + } + public DateTimeOffset? Expires + { + get + { + return Headers.GetDate(HeaderNames.Expires); + } + set + { + Headers.SetDate(HeaderNames.Expires, value); + } + } + + public DateTimeOffset? LastModified + { + get + { + return Headers.GetDate(HeaderNames.LastModified); + } + set + { + Headers.SetDate(HeaderNames.LastModified, value); + } + } + + public UriHelper Location + { + get + { + Uri uri; + if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) + { + return new UriHelper(uri); + } + return null; + } + set + { + Headers.Set(HeaderNames.Location, value); + } + } + + public IList SetCookie + { + get + { + return Headers.GetList(HeaderNames.SetCookie); + } + set + { + Headers.SetList(HeaderNames.SetCookie, value); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs similarity index 85% rename from src/Microsoft.AspNet.WebUtilities/UriHelper.cs rename to src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 491c599d20..e271d41380 100644 --- a/src/Microsoft.AspNet.WebUtilities/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -1,7 +1,9 @@ -using System; -using Microsoft.AspNet.Http; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.WebUtilities +using System; + +namespace Microsoft.AspNet.Http.Extensions { /// /// A helper class for constructing encoded Uris for use in headers and other Uris. @@ -44,6 +46,11 @@ namespace Microsoft.AspNet.WebUtilities public FragmentString Fragment { get; set; } + public bool IsFullUri + { + get { return !string.IsNullOrEmpty(Scheme) && Host.HasValue; } + } + // Always returns at least '/' public string GetPartialUri() { @@ -67,6 +74,11 @@ namespace Microsoft.AspNet.WebUtilities return Scheme + "://" + Host + path + Query + Fragment; } + public override string ToString() + { + return IsFullUri ? GetFullUri() : GetPartialUri(); + } + public static string Create(PathString pathBase, PathString path = new PathString(), QueryString query = new QueryString(), diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index cbc45a6ddc..be234399ec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,8 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*" + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { "aspnet50" : { diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 8048152a08..5ab2010a59 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -93,30 +93,6 @@ namespace Microsoft.AspNet.Http /// The Content-Type header. public abstract string ContentType { get; set; } - /// - /// Gets or sets the Cache-Control header. - /// - /// The Cache-Control header. - // (TODO header conventions?) public abstract string CacheControl { get; set; } - - /// - /// Gets or sets the Media-Type header. - /// - /// The Media-Type header. - // (TODO header conventions?) public abstract string MediaType { get; set; } - - /// - /// Gets or set the Accept header. - /// - /// The Accept header. - public abstract string Accept { get; set; } - - /// - /// Gets or set the Accept-Charset header. - /// - /// The Accept-Charset header. - public abstract string AcceptCharset { get; set; } - /// /// Gets or set the owin.RequestBody Stream. /// diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 1ccadbc30a..3a68cce3bc 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj index 25a0e7caf2..90f93a0f7b 100644 --- a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj +++ b/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index b0acecf075..4c7801eada 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 434817129d..3332221be8 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -294,7 +294,7 @@ namespace Microsoft.AspNet.Owin public bool ContainsKey(Type key) { // Does this type implement the requested interface? - if (key.GetTypeInfo().IsAssignableFrom(this.GetType().GetTypeInfo())) + if (key.GetTypeInfo().IsAssignableFrom(GetType().GetTypeInfo())) { // Check for conditional features if (key == typeof(IHttpSendFileFeature)) diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs index 10aad2bfa2..2ef4d29476 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using Microsoft.AspNet.Http; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.PipelineCore.Collections { @@ -26,11 +26,10 @@ namespace Microsoft.AspNet.PipelineCore.Collections private static string GetName(string contentDisposition) { - // TODO: Strongly typed headers will take care of this // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" - var offset = contentDisposition.IndexOf("name=\"") + "name=\"".Length; - var key = contentDisposition.Substring(offset, contentDisposition.IndexOf("\"", offset) - offset); // Remove quotes - return key; + ContentDispositionHeaderValue cd; + ContentDispositionHeaderValue.TryParse(contentDisposition, out cd); + return HeaderUtilities.RemoveQuotes(cd?.Name); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index dfd54393cc..bf362c94ed 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -16,6 +16,10 @@ namespace Microsoft.AspNet.PipelineCore.Collections /// public class HeaderDictionary : IHeaderDictionary { + public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) + { + } + /// /// Initializes a new instance of the class. /// diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index da839c1f16..d95c37b9c3 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -150,18 +150,6 @@ namespace Microsoft.AspNet.PipelineCore set { Headers[Constants.Headers.ContentType] = value; } } - public override string Accept - { - get { return Headers[Constants.Headers.Accept]; } - set { Headers[Constants.Headers.Accept] = value; } - } - - public override string AcceptCharset - { - get { return Headers[Constants.Headers.AcceptCharset]; } - set { Headers[Constants.Headers.AcceptCharset] = value; } - } - public override bool HasFormContentType { get { return FormFeature.HasFormContentType; } diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 8d20871688..0180728be2 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -11,6 +11,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.PipelineCore.Collections; using Microsoft.AspNet.WebUtilities; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.PipelineCore { @@ -28,6 +29,16 @@ namespace Microsoft.AspNet.PipelineCore _request = request; } + private MediaTypeHeaderValue ContentType + { + get + { + MediaTypeHeaderValue mt; + MediaTypeHeaderValue.TryParse(_request.ContentType, out mt); + return mt; + } + } + public bool HasFormContentType { get @@ -38,7 +49,8 @@ namespace Microsoft.AspNet.PipelineCore return true; } - return HasApplicationFormContentType() || HasMultipartFormContentType(); + var conentType = ContentType; + return HasApplicationFormContentType(conentType) || HasMultipartFormContentType(conentType); } } @@ -82,23 +94,25 @@ namespace Microsoft.AspNet.PipelineCore // Some of these code paths use StreamReader which does not support cancellation tokens. using (cancellationToken.Register(_request.HttpContext.Abort)) { + var contentType = ContentType; // Check the content-type - if (HasApplicationFormContentType()) + if (HasApplicationFormContentType(contentType)) { - // TODO: Read the charset from the content-type header after we get strongly typed headers - formFields = await FormReader.ReadFormAsync(_request.Body, cancellationToken); + var encoding = FilterEncoding(contentType.Encoding); + formFields = await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken); } - else if (HasMultipartFormContentType()) + else if (HasMultipartFormContentType(contentType)) { var formAccumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); - var boundary = GetBoundary(_request.ContentType); + var boundary = GetBoundary(contentType); var multipartReader = new MultipartReader(boundary, _request.Body); var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { var headers = new HeaderDictionary(section.Headers); - var contentDisposition = headers["Content-Disposition"]; + ContentDispositionHeaderValue contentDisposition; + ContentDispositionHeaderValue.TryParse(headers.Get(HeaderNames.ContentDisposition), out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end @@ -116,12 +130,11 @@ namespace Microsoft.AspNet.PipelineCore // // value - // TODO: Strongly typed headers will take care of this - var offset = contentDisposition.IndexOf("name=") + "name=".Length; - var key = contentDisposition.Substring(offset + 1, contentDisposition.Length - offset - 2); // Remove quotes - - // TODO: Read the charset from the content-disposition header after we get strongly typed headers - using (var reader = new StreamReader(section.Body, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) + var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); + MediaTypeHeaderValue mediaType; + MediaTypeHeaderValue.TryParse(headers.Get(HeaderNames.ContentType), out mediaType); + var encoding = FilterEncoding(mediaType?.Encoding); + using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { var value = await reader.ReadToEndAsync(); formAccumulator.Append(key, value); @@ -129,7 +142,7 @@ namespace Microsoft.AspNet.PipelineCore } else { - System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + contentDisposition); + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers.Get(HeaderNames.ContentDisposition)); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); @@ -143,48 +156,50 @@ namespace Microsoft.AspNet.PipelineCore return Form; } - private bool HasApplicationFormContentType() + private Encoding FilterEncoding(Encoding encoding) { - // TODO: Strongly typed headers will take care of this for us - // Content-Type: application/x-www-form-urlencoded; charset=utf-8 - var contentType = _request.ContentType; - return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase) >= 0; - } - - private bool HasMultipartFormContentType() - { - // TODO: Strongly typed headers will take care of this for us - // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq - var contentType = _request.ContentType; - return !string.IsNullOrEmpty(contentType) && contentType.IndexOf("multipart/form-data", StringComparison.OrdinalIgnoreCase) >= 0; - } - - private bool HasFormDataContentDisposition(string contentDisposition) - { - // TODO: Strongly typed headers will take care of this for us - // Content-Disposition: form-data; name="key"; - return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && !contentDisposition.Contains("filename="); - } - - private bool HasFileContentDisposition(string contentDisposition) - { - // TODO: Strongly typed headers will take care of this for us - // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" - return !string.IsNullOrEmpty(contentDisposition) && contentDisposition.Contains("form-data") && contentDisposition.Contains("filename="); - } - - // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq - private static string GetBoundary(string contentType) - { - // TODO: Strongly typed headers will take care of this for us - // TODO: Limit the length of boundary we accept. The spec says ~70 chars. - var elements = contentType.Split(' '); - var element = elements.Where(entry => entry.StartsWith("boundary=")).First(); - var boundary = element.Substring("boundary=".Length); - // Remove quotes - if (boundary.Length >= 2 && boundary[0] == '"' && boundary[boundary.Length - 1] == '"') + // UTF-7 is insecure and should not be honored. UTF-8 will succeed for most cases. + if (encoding == null || Encoding.UTF7.Equals(encoding)) { - boundary = boundary.Substring(1, boundary.Length - 2); + return Encoding.UTF8; + } + return encoding; + } + + private bool HasApplicationFormContentType(MediaTypeHeaderValue contentType) + { + // Content-Type: application/x-www-form-urlencoded; charset=utf-8 + return contentType != null && contentType.MediaType.Equals("application/x-www-form-urlencoded", StringComparison.OrdinalIgnoreCase); + } + + private bool HasMultipartFormContentType(MediaTypeHeaderValue contentType) + { + // Content-Type: multipart/form-data; boundary=----WebKitFormBoundarymx2fSWqWSd0OxQqq + return contentType != null && contentType.MediaType.Equals("multipart/form-data", StringComparison.OrdinalIgnoreCase); + } + + private bool HasFormDataContentDisposition(ContentDispositionHeaderValue contentDisposition) + { + // Content-Disposition: form-data; name="key"; + return contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") + && string.IsNullOrEmpty(contentDisposition.FileName) && string.IsNullOrEmpty(contentDisposition.FileNameStar); + } + + private bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition) + { + // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" + return contentDisposition != null && contentDisposition.DispositionType.Equals("form-data") + && (!string.IsNullOrEmpty(contentDisposition.FileName) || !string.IsNullOrEmpty(contentDisposition.FileNameStar)); + } + + // Content-Type: multipart/form-data; boundary="----WebKitFormBoundarymx2fSWqWSd0OxQqq" + // TODO: Limit the length of boundary we accept. The spec says ~70 chars. + private static string GetBoundary(MediaTypeHeaderValue contentType) + { + var boundary = HeaderUtilities.RemoveQuotes(contentType.Boundary); + if (string.IsNullOrWhiteSpace(boundary)) + { + throw new InvalidOperationException("Missing content-type boundary."); } return boundary; } diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index e0ed2c7333..48dab300ac 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -518,25 +518,6 @@ namespace Microsoft.AspNet.PipelineCore.Infrastructure request.HttpContext.Items[key] = value; } - internal static IDictionary GetCookies(HttpRequest request) - { - var cookies = GetItem>(request, "Microsoft.Owin.Cookies#dictionary"); - if (cookies == null) - { - cookies = new Dictionary(StringComparer.Ordinal); - SetItem(request, "Microsoft.Owin.Cookies#dictionary", cookies); - } - - string text = GetHeader(request.Headers, "Cookie"); - if (GetItem(request, "Microsoft.Owin.Cookies#text") != text) - { - cookies.Clear(); - ParseDelimited(text, SemicolonAndComma, AddCookieCallback, cookies); - SetItem(request, "Microsoft.Owin.Cookies#text", text); - } - return cookies; - } - internal static void ParseCookies(string cookiesHeader, IDictionary cookiesCollection) { ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, cookiesCollection); diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj index 3a0556def8..96b305e9b6 100644 --- a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj +++ b/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.PipelineCore/project.json index 6b1a0de735..8eaabc9a33 100644 --- a/src/Microsoft.AspNet.PipelineCore/project.json +++ b/src/Microsoft.AspNet.PipelineCore/project.json @@ -6,7 +6,9 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*" + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, "frameworks": { "aspnet50": {}, diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 7c6a034f78..1682e7c5b2 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -26,10 +26,9 @@ namespace Microsoft.AspNet.WebUtilities _reader = new StringReader(data); } - // TODO: Encoding - public FormReader([NotNull] Stream stream) + public FormReader([NotNull] Stream stream, [NotNull] Encoding encoding) { - _reader = new StreamReader(stream, Encoding.UTF8, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); + _reader = new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); } // Format: key1=value1&key2=value2 @@ -168,11 +167,21 @@ namespace Microsoft.AspNet.WebUtilities /// /// Parses an HTTP form body. /// - /// The HTTP form body to parse. + /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { - var reader = new FormReader(stream); + return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); + } + + /// + /// Parses an HTTP form body. + /// + /// The HTTP form body to parse. + /// The collection containing the parsed HTTP form body. + public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) + { + var reader = new FormReader(stream, encoding); var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); var pair = await reader.ReadNextPairAsync(cancellationToken); diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index 75dd8975e7..efc8a50504 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 963fcc3178..e4e0e0cb08 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,15 +2,17 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods such as URL encoding.", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { "aspnet50": { }, "aspnetcore50": { "dependencies": { + "System.Collections": "4.0.10-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*" + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs new file mode 100644 index 0000000000..679394e42d --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -0,0 +1,70 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + internal abstract class BaseHeaderParser : HttpHeaderParser + { + protected BaseHeaderParser(bool supportsMultipleValues) + : base(supportsMultipleValues) + { + } + + protected abstract int GetParsedValueLength(string value, int startIndex, out T parsedValue); + + public sealed override bool TryParseValue(string value, ref int index, out T parsedValue) + { + parsedValue = default(T); + + // If multiple values are supported (i.e. list of values), then accept an empty string: The header may + // be added multiple times to the request/response message. E.g. + // Accept: text/xml; q=1 + // Accept: + // Accept: text/plain; q=0.2 + if (string.IsNullOrEmpty(value) || (index == value.Length)) + { + return SupportsMultipleValues; + } + + var separatorFound = false; + var current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(value, index, SupportsMultipleValues, + out separatorFound); + + if (separatorFound && !SupportsMultipleValues) + { + return false; // leading separators not allowed if we don't support multiple values. + } + + if (current == value.Length) + { + if (SupportsMultipleValues) + { + index = current; + } + return SupportsMultipleValues; + } + + T result = default(T); + var length = GetParsedValueLength(value, current, out result); + + if (length == 0) + { + return false; + } + + current = current + length; + current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(value, current, SupportsMultipleValues, + out separatorFound); + + // If we support multiple values and we've not reached the end of the string, then we must have a separator. + if ((separatorFound && !SupportsMultipleValues) || (!separatorFound && (current < value.Length))) + { + return false; + } + + index = current; + parsedValue = result; + return true; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs new file mode 100644 index 0000000000..1de23f206f --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -0,0 +1,603 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class CacheControlHeaderValue + { + private const string MaxAgeString = "max-age"; + private const string MaxStaleString = "max-stale"; + private const string MinFreshString = "min-fresh"; + private const string MustRevalidateString = "must-revalidate"; + private const string NoCacheString = "no-cache"; + private const string NoStoreString = "no-store"; + private const string NoTransformString = "no-transform"; + private const string OnlyIfCachedString = "only-if-cached"; + private const string PrivateString = "private"; + private const string ProxyRevalidateString = "proxy-revalidate"; + private const string PublicString = "public"; + private const string SharedMaxAgeString = "s-maxage"; + + // The Cache-Control header is special: It is a header supporting a list of values, but we represent the list + // as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is + // OK to have multiple Cache-Control headers in a request/response message. However, after parsing all + // Cache-Control headers, only one instance of CacheControlHeaderValue is created (if all headers contain valid + // values, otherwise we may have multiple strings containing the invalid values). + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(true, GetCacheControlLength); + + private static readonly Action CheckIsValidTokenAction = CheckIsValidToken; + + private bool _noCache; + private ICollection _noCacheHeaders; + private bool _noStore; + private TimeSpan? _maxAge; + private TimeSpan? _sharedMaxAge; + private bool _maxStale; + private TimeSpan? _maxStaleLimit; + private TimeSpan? _minFresh; + private bool _noTransform; + private bool _onlyIfCached; + private bool _public; + private bool _private; + private ICollection _privateHeaders; + private bool _mustRevalidate; + private bool _proxyRevalidate; + private ICollection _extensions; + + public CacheControlHeaderValue() + { + // This type is unique in that there is no single required parameter. + } + + public bool NoCache + { + get { return _noCache; } + set { _noCache = value; } + } + + public ICollection NoCacheHeaders + { + get + { + if (_noCacheHeaders == null) + { + _noCacheHeaders = new ObjectCollection(CheckIsValidTokenAction); + } + return _noCacheHeaders; + } + } + + public bool NoStore + { + get { return _noStore; } + set { _noStore = value; } + } + + public TimeSpan? MaxAge + { + get { return _maxAge; } + set { _maxAge = value; } + } + + public TimeSpan? SharedMaxAge + { + get { return _sharedMaxAge; } + set { _sharedMaxAge = value; } + } + + public bool MaxStale + { + get { return _maxStale; } + set { _maxStale = value; } + } + + public TimeSpan? MaxStaleLimit + { + get { return _maxStaleLimit; } + set { _maxStaleLimit = value; } + } + + public TimeSpan? MinFresh + { + get { return _minFresh; } + set { _minFresh = value; } + } + + public bool NoTransform + { + get { return _noTransform; } + set { _noTransform = value; } + } + + public bool OnlyIfCached + { + get { return _onlyIfCached; } + set { _onlyIfCached = value; } + } + + public bool Public + { + get { return _public; } + set { _public = value; } + } + + public bool Private + { + get { return _private; } + set { _private = value; } + } + + public ICollection PrivateHeaders + { + get + { + if (_privateHeaders == null) + { + _privateHeaders = new ObjectCollection(CheckIsValidTokenAction); + } + return _privateHeaders; + } + } + + public bool MustRevalidate + { + get { return _mustRevalidate; } + set { _mustRevalidate = value; } + } + + public bool ProxyRevalidate + { + get { return _proxyRevalidate; } + set { _proxyRevalidate = value; } + } + + public ICollection Extensions + { + get + { + if (_extensions == null) + { + _extensions = new ObjectCollection(); + } + return _extensions; + } + } + + public override string ToString() + { + var sb = new StringBuilder(); + + AppendValueIfRequired(sb, _noStore, NoStoreString); + AppendValueIfRequired(sb, _noTransform, NoTransformString); + AppendValueIfRequired(sb, _onlyIfCached, OnlyIfCachedString); + AppendValueIfRequired(sb, _public, PublicString); + AppendValueIfRequired(sb, _mustRevalidate, MustRevalidateString); + AppendValueIfRequired(sb, _proxyRevalidate, ProxyRevalidateString); + + if (_noCache) + { + AppendValueWithSeparatorIfRequired(sb, NoCacheString); + if ((_noCacheHeaders != null) && (_noCacheHeaders.Count > 0)) + { + sb.Append("=\""); + AppendValues(sb, _noCacheHeaders); + sb.Append('\"'); + } + } + + if (_maxAge.HasValue) + { + AppendValueWithSeparatorIfRequired(sb, MaxAgeString); + sb.Append('='); + sb.Append(((int)_maxAge.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + + if (_sharedMaxAge.HasValue) + { + AppendValueWithSeparatorIfRequired(sb, SharedMaxAgeString); + sb.Append('='); + sb.Append(((int)_sharedMaxAge.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + + if (_maxStale) + { + AppendValueWithSeparatorIfRequired(sb, MaxStaleString); + if (_maxStaleLimit.HasValue) + { + sb.Append('='); + sb.Append(((int)_maxStaleLimit.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + } + + if (_minFresh.HasValue) + { + AppendValueWithSeparatorIfRequired(sb, MinFreshString); + sb.Append('='); + sb.Append(((int)_minFresh.Value.TotalSeconds).ToString(NumberFormatInfo.InvariantInfo)); + } + + if (_private) + { + AppendValueWithSeparatorIfRequired(sb, PrivateString); + if ((_privateHeaders != null) && (_privateHeaders.Count > 0)) + { + sb.Append("=\""); + AppendValues(sb, _privateHeaders); + sb.Append('\"'); + } + } + + NameValueHeaderValue.ToString(_extensions, ',', false, sb); + + return sb.ToString(); + } + + public override bool Equals(object obj) + { + var other = obj as CacheControlHeaderValue; + + if (other == null) + { + return false; + } + + if ((_noCache != other._noCache) || (_noStore != other._noStore) || (_maxAge != other._maxAge) || + (_sharedMaxAge != other._sharedMaxAge) || (_maxStale != other._maxStale) || + (_maxStaleLimit != other._maxStaleLimit) || (_minFresh != other._minFresh) || + (_noTransform != other._noTransform) || (_onlyIfCached != other._onlyIfCached) || + (_public != other._public) || (_private != other._private) || + (_mustRevalidate != other._mustRevalidate) || (_proxyRevalidate != other._proxyRevalidate)) + { + return false; + } + + if (!HeaderUtilities.AreEqualCollections(_noCacheHeaders, other._noCacheHeaders, + StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (!HeaderUtilities.AreEqualCollections(_privateHeaders, other._privateHeaders, + StringComparer.OrdinalIgnoreCase)) + { + return false; + } + + if (!HeaderUtilities.AreEqualCollections(_extensions, other._extensions)) + { + return false; + } + + return true; + } + + public override int GetHashCode() + { + // Use a different bit for bool fields: bool.GetHashCode() will return 0 (false) or 1 (true). So we would + // end up having the same hash code for e.g. two instances where one has only noCache set and the other + // only noStore. + int result = _noCache.GetHashCode() ^ (_noStore.GetHashCode() << 1) ^ (_maxStale.GetHashCode() << 2) ^ + (_noTransform.GetHashCode() << 3) ^ (_onlyIfCached.GetHashCode() << 4) ^ + (_public.GetHashCode() << 5) ^ (_private.GetHashCode() << 6) ^ + (_mustRevalidate.GetHashCode() << 7) ^ (_proxyRevalidate.GetHashCode() << 8); + + // XOR the hashcode of timespan values with different numbers to make sure two instances with the same + // timespan set on different fields result in different hashcodes. + result = result ^ (_maxAge.HasValue ? _maxAge.Value.GetHashCode() ^ 1 : 0) ^ + (_sharedMaxAge.HasValue ? _sharedMaxAge.Value.GetHashCode() ^ 2 : 0) ^ + (_maxStaleLimit.HasValue ? _maxStaleLimit.Value.GetHashCode() ^ 4 : 0) ^ + (_minFresh.HasValue ? _minFresh.Value.GetHashCode() ^ 8 : 0); + + if ((_noCacheHeaders != null) && (_noCacheHeaders.Count > 0)) + { + foreach (var noCacheHeader in _noCacheHeaders) + { + result = result ^ StringComparer.OrdinalIgnoreCase.GetHashCode(noCacheHeader); + } + } + + if ((_privateHeaders != null) && (_privateHeaders.Count > 0)) + { + foreach (var privateHeader in _privateHeaders) + { + result = result ^ StringComparer.OrdinalIgnoreCase.GetHashCode(privateHeader); + } + } + + if ((_extensions != null) && (_extensions.Count > 0)) + { + foreach (var extension in _extensions) + { + result = result ^ extension.GetHashCode(); + } + } + + return result; + } + + public static CacheControlHeaderValue Parse(string input) + { + int index = 0; + // Cache-Control is unusual because there are no required values so the parser will succeed for an empty string, but still return null. + var result = Parser.ParseValue(input, ref index); + if (result == null) + { + throw new FormatException("No cache directives found."); + } + return result; + } + + public static bool TryParse(string input, out CacheControlHeaderValue parsedValue) + { + int index = 0; + // Cache-Control is unusual because there are no required values so the parser will succeed for an empty string, but still return null. + if (Parser.TryParseValue(input, ref index, out parsedValue) && parsedValue != null) + { + return true; + } + parsedValue = null; + return false; + } + + private static int GetCacheControlLength(string input, int startIndex, out CacheControlHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Cache-Control header consists of a list of name/value pairs, where the value is optional. So use an + // instance of NameValueHeaderParser to parse the string. + var current = startIndex; + NameValueHeaderValue nameValue = null; + var nameValueList = new List(); + while (current < input.Length) + { + if (!NameValueHeaderValue.MultipleValueParser.TryParseValue(input, ref current, out nameValue)) + { + return 0; + } + + nameValueList.Add(nameValue as NameValueHeaderValue); + } + + // If we get here, we were able to successfully parse the string as list of name/value pairs. Now analyze + // the name/value pairs. + + // Cache-Control is a header supporting lists of values. However, expose the header as an instance of + // CacheControlHeaderValue. + var result = new CacheControlHeaderValue(); + + if (!TrySetCacheControlValues(result, nameValueList)) + { + return 0; + } + + parsedValue = result; + + // If we get here we successfully parsed the whole string. + return input.Length - startIndex; + } + + private static bool TrySetCacheControlValues(CacheControlHeaderValue cc, + List nameValueList) + { + foreach (NameValueHeaderValue nameValue in nameValueList) + { + var success = true; + string name = nameValue.Name.ToLowerInvariant(); + + switch (name) + { + case NoCacheString: + success = TrySetOptionalTokenList(nameValue, ref cc._noCache, ref cc._noCacheHeaders); + break; + + case NoStoreString: + success = TrySetTokenOnlyValue(nameValue, ref cc._noStore); + break; + + case MaxAgeString: + success = TrySetTimeSpan(nameValue, ref cc._maxAge); + break; + + case MaxStaleString: + success = ((nameValue.Value == null) || TrySetTimeSpan(nameValue, ref cc._maxStaleLimit)); + if (success) + { + cc._maxStale = true; + } + break; + + case MinFreshString: + success = TrySetTimeSpan(nameValue, ref cc._minFresh); + break; + + case NoTransformString: + success = TrySetTokenOnlyValue(nameValue, ref cc._noTransform); + break; + + case OnlyIfCachedString: + success = TrySetTokenOnlyValue(nameValue, ref cc._onlyIfCached); + break; + + case PublicString: + success = TrySetTokenOnlyValue(nameValue, ref cc._public); + break; + + case PrivateString: + success = TrySetOptionalTokenList(nameValue, ref cc._private, ref cc._privateHeaders); + break; + + case MustRevalidateString: + success = TrySetTokenOnlyValue(nameValue, ref cc._mustRevalidate); + break; + + case ProxyRevalidateString: + success = TrySetTokenOnlyValue(nameValue, ref cc._proxyRevalidate); + break; + + case SharedMaxAgeString: + success = TrySetTimeSpan(nameValue, ref cc._sharedMaxAge); + break; + + default: + cc.Extensions.Add(nameValue); // success is always true + break; + } + + if (!success) + { + return false; + } + } + + return true; + } + + private static bool TrySetTokenOnlyValue(NameValueHeaderValue nameValue, ref bool boolField) + { + if (nameValue.Value != null) + { + return false; + } + + boolField = true; + return true; + } + + private static bool TrySetOptionalTokenList(NameValueHeaderValue nameValue, ref bool boolField, + ref ICollection destination) + { + Contract.Requires(nameValue != null); + + if (nameValue.Value == null) + { + boolField = true; + return true; + } + + // We need the string to be at least 3 chars long: 2x quotes and at least 1 character. Also make sure we + // have a quoted string. Note that NameValueHeaderValue will never have leading/trailing whitespaces. + var valueString = nameValue.Value; + if ((valueString.Length < 3) || (valueString[0] != '\"') || (valueString[valueString.Length - 1] != '\"')) + { + return false; + } + + // We have a quoted string. Now verify that the string contains a list of valid tokens separated by ','. + var current = 1; // skip the initial '"' character. + var maxLength = valueString.Length - 1; // -1 because we don't want to parse the final '"'. + var separatorFound = false; + var originalValueCount = destination == null ? 0 : destination.Count; + while (current < maxLength) + { + current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(valueString, current, true, + out separatorFound); + + if (current == maxLength) + { + break; + } + + var tokenLength = HttpRuleParser.GetTokenLength(valueString, current); + + if (tokenLength == 0) + { + // We already skipped whitespaces and separators. If we don't have a token it must be an invalid + // character. + return false; + } + + if (destination == null) + { + destination = new ObjectCollection(CheckIsValidTokenAction); + } + + destination.Add(valueString.Substring(current, tokenLength)); + + current = current + tokenLength; + } + + // After parsing a valid token list, we expect to have at least one value + if ((destination != null) && (destination.Count > originalValueCount)) + { + boolField = true; + return true; + } + + return false; + } + + private static bool TrySetTimeSpan(NameValueHeaderValue nameValue, ref TimeSpan? timeSpan) + { + Contract.Requires(nameValue != null); + + if (nameValue.Value == null) + { + return false; + } + + int seconds; + if (!HeaderUtilities.TryParseInt32(nameValue.Value, out seconds)) + { + return false; + } + + timeSpan = new TimeSpan(0, 0, seconds); + + return true; + } + + private static void AppendValueIfRequired(StringBuilder sb, bool appendValue, string value) + { + if (appendValue) + { + AppendValueWithSeparatorIfRequired(sb, value); + } + } + + private static void AppendValueWithSeparatorIfRequired(StringBuilder sb, string value) + { + if (sb.Length > 0) + { + sb.Append(", "); + } + sb.Append(value); + } + + private static void AppendValues(StringBuilder sb, IEnumerable values) + { + var first = true; + foreach (string value in values) + { + if (first) + { + first = false; + } + else + { + sb.Append(", "); + } + + sb.Append(value); + } + } + + private static void CheckIsValidToken(string item) + { + HeaderUtilities.CheckValidToken(item, "item"); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs new file mode 100644 index 0000000000..8a96da2efd --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -0,0 +1,702 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // Note this is for use both in HTTP (https://tools.ietf.org/html/rfc6266) and MIME (https://tools.ietf.org/html/rfc2183) + public class ContentDispositionHeaderValue + { + private const string FileNameString = "filename"; + private const string NameString = "name"; + private const string FileNameStarString = "filename*"; + private const string CreationDateString = "creation-date"; + private const string ModificationDateString = "modification-date"; + private const string ReadDateString = "read-date"; + private const string SizeString = "size"; + + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetDispositionTypeLength); + + // Use list instead of dictionary since we may have multiple parameters with the same name. + private ICollection _parameters; + private string _dispositionType; + + private ContentDispositionHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public ContentDispositionHeaderValue(string dispositionType) + { + CheckDispositionTypeFormat(dispositionType, "dispositionType"); + _dispositionType = dispositionType; + } + + public string DispositionType + { + get { return _dispositionType; } + set + { + CheckDispositionTypeFormat(value, "value"); + _dispositionType = value; + } + } + + public ICollection Parameters + { + get + { + if (_parameters == null) + { + _parameters = new ObjectCollection(); + } + return _parameters; + } + } + + // Helpers to access specific parameters in the list + + public string Name + { + get { return GetName(NameString); } + set { SetName(NameString, value); } + } + + public string FileName + { + get { return GetName(FileNameString); } + set { SetName(FileNameString, value); } + } + + public string FileNameStar + { + get { return GetName(FileNameStarString); } + set { SetName(FileNameStarString, value); } + } + + public DateTimeOffset? CreationDate + { + get { return GetDate(CreationDateString); } + set { SetDate(CreationDateString, value); } + } + + public DateTimeOffset? ModificationDate + { + get { return GetDate(ModificationDateString); } + set { SetDate(ModificationDateString, value); } + } + + public DateTimeOffset? ReadDate + { + get { return GetDate(ReadDateString); } + set { SetDate(ReadDateString, value); } + } + + public long? Size + { + get + { + var sizeParameter = NameValueHeaderValue.Find(_parameters, SizeString); + ulong value; + if (sizeParameter != null) + { + string sizeString = sizeParameter.Value; + if (UInt64.TryParse(sizeString, NumberStyles.Integer, CultureInfo.InvariantCulture, out value)) + { + return (long)value; + } + } + return null; + } + set + { + var sizeParameter = NameValueHeaderValue.Find(_parameters, SizeString); + if (value == null) + { + // Remove parameter + if (sizeParameter != null) + { + _parameters.Remove(sizeParameter); + } + } + else if (value < 0) + { + throw new ArgumentOutOfRangeException("value"); + } + else if (sizeParameter != null) + { + sizeParameter.Value = value.Value.ToString(CultureInfo.InvariantCulture); + } + else + { + string sizeString = value.Value.ToString(CultureInfo.InvariantCulture); + _parameters.Add(new NameValueHeaderValue(SizeString, sizeString)); + } + } + } + + /// + /// Sets both FileName and FileNameStar using encodings appropriate for HTTP headers. + /// + /// + public void SetHttpFileName(string fileName) + { + if (!string.IsNullOrEmpty(fileName)) + { + FileName = Sanatize(fileName); + } + else + { + FileName = fileName; + } + FileNameStar = fileName; + } + + /// + /// Sets the FileName parameter using encodings appropriate for MIME headers. + /// The FileNameStar paraemter is removed. + /// + /// + public void SetMimeFileName(string fileName) + { + FileNameStar = null; + FileName = fileName; + } + + public override string ToString() + { + return _dispositionType + NameValueHeaderValue.ToString(_parameters, ';', true); + } + + public override bool Equals(object obj) + { + var other = obj as ContentDispositionHeaderValue; + + if (other == null) + { + return false; + } + + return (string.Compare(_dispositionType, other._dispositionType, StringComparison.OrdinalIgnoreCase) == 0) && + HeaderUtilities.AreEqualCollections(_parameters, other._parameters); + } + + public override int GetHashCode() + { + // The dispositionType string is case-insensitive. + return StringComparer.OrdinalIgnoreCase.GetHashCode(_dispositionType) ^ NameValueHeaderValue.GetHashCode(_parameters); + } + + public static ContentDispositionHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out ContentDispositionHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetDispositionTypeLength(string input, int startIndex, out ContentDispositionHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + string dispositionType = null; + var dispositionTypeLength = GetDispositionTypeExpressionLength(input, startIndex, out dispositionType); + + if (dispositionTypeLength == 0) + { + return 0; + } + + var current = startIndex + dispositionTypeLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + var contentDispositionHeader = new ContentDispositionHeaderValue(); + contentDispositionHeader._dispositionType = dispositionType; + + // If we're not done and we have a parameter delimiter, then we have a list of parameters. + if ((current < input.Length) && (input[current] == ';')) + { + current++; // skip delimiter. + int parameterLength = NameValueHeaderValue.GetNameValueListLength(input, current, ';', + contentDispositionHeader.Parameters); + + parsedValue = contentDispositionHeader; + return current + parameterLength - startIndex; + } + + // We have a ContentDisposition header without parameters. + parsedValue = contentDispositionHeader; + return current - startIndex; + } + + private static int GetDispositionTypeExpressionLength(string input, int startIndex, out string dispositionType) + { + Contract.Requires((input != null) && (input.Length > 0) && (startIndex < input.Length)); + + // This method just parses the disposition type string, it does not parse parameters. + dispositionType = null; + + // Parse the disposition type, i.e. in content-disposition string + // "; param1=value1; param2=value2" + var typeLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (typeLength == 0) + { + return 0; + } + + dispositionType = input.Substring(startIndex, typeLength); + return typeLength; + } + + private static void CheckDispositionTypeFormat(string dispositionType, string parameterName) + { + if (string.IsNullOrEmpty(dispositionType)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + string tempDispositionType; + var dispositionTypeLength = GetDispositionTypeExpressionLength(dispositionType, 0, out tempDispositionType); + if ((dispositionTypeLength == 0) || (tempDispositionType.Length != dispositionType.Length)) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, + "Invalid disposition type '{0}'.", dispositionType)); + } + } + + // Gets a parameter of the given name and attempts to extract a date. + // Returns null if the parameter is not present or the format is incorrect. + private DateTimeOffset? GetDate(string parameter) + { + var dateParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (dateParameter != null) + { + string dateString = dateParameter.Value; + // Should have quotes, remove them. + if (IsQuoted(dateString)) + { + dateString = dateString.Substring(1, dateString.Length - 2); + } + DateTimeOffset date; + if (HttpRuleParser.TryStringToDate(dateString, out date)) + { + return date; + } + } + return null; + } + + // Add the given parameter to the list. Remove if date is null. + private void SetDate(string parameter, DateTimeOffset? date) + { + var dateParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (date == null) + { + // Remove parameter + if (dateParameter != null) + { + _parameters.Remove(dateParameter); + } + } + else + { + // Must always be quoted + var dateString = string.Format(CultureInfo.InvariantCulture, "\"{0}\"", HttpRuleParser.DateToString(date.Value)); + if (dateParameter != null) + { + dateParameter.Value = dateString; + } + else + { + Parameters.Add(new NameValueHeaderValue(parameter, dateString)); + } + } + } + + // Gets a parameter of the given name and attempts to decode it if necessary. + // Returns null if the parameter is not present or the raw value if the encoding is incorrect. + private string GetName(string parameter) + { + var nameParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (nameParameter != null) + { + string result; + // filename*=utf-8'lang'%7FMyString + if (parameter.EndsWith("*", StringComparison.Ordinal)) + { + if (TryDecode5987(nameParameter.Value, out result)) + { + return result; + } + return null; // Unrecognized encoding + } + + // filename="=?utf-8?B?BDFSDFasdfasdc==?=" + if (TryDecodeMime(nameParameter.Value, out result)) + { + return result; + } + // May not have been encoded + return nameParameter.Value; + } + return null; + } + + // Add/update the given parameter in the list, encoding if necessary. + // Remove if value is null/Empty + private void SetName(string parameter, string value) + { + var nameParameter = NameValueHeaderValue.Find(_parameters, parameter); + if (string.IsNullOrEmpty(value)) + { + // Remove parameter + if (nameParameter != null) + { + _parameters.Remove(nameParameter); + } + } + else + { + var processedValue = string.Empty; + if (parameter.EndsWith("*", StringComparison.Ordinal)) + { + processedValue = Encode5987(value); + } + else + { + processedValue = EncodeAndQuoteMime(value); + } + + if (nameParameter != null) + { + nameParameter.Value = processedValue; + } + else + { + Parameters.Add(new NameValueHeaderValue(parameter, processedValue)); + } + } + } + + // Returns input for decoding failures, as the content might not be encoded + private string EncodeAndQuoteMime(string input) + { + var result = input; + var needsQuotes = false; + // Remove bounding quotes, they'll get re-added later + if (IsQuoted(result)) + { + result = result.Substring(1, result.Length - 2); + needsQuotes = true; + } + + if (RequiresEncoding(result)) + { + needsQuotes = true; // Encoded data must always be quoted, the equals signs are invalid in tokens + result = EncodeMime(result); // =?utf-8?B?asdfasdfaesdf?= + } + else if (!needsQuotes && HttpRuleParser.GetTokenLength(result, 0) != result.Length) + { + needsQuotes = true; + } + + if (needsQuotes) + { + // '\' and '"' must be escaped in a quoted string + result = result.Replace(@"\", @"\\"); + result = result.Replace(@"""", @"\"""); + // Re-add quotes "value" + result = string.Format(CultureInfo.InvariantCulture, "\"{0}\"", result); + } + return result; + } + + // Replaces characters not suitable for HTTP headers with '_' rather than MIME encoding them. + private string Sanatize(string input) + { + var result = input; + + if (RequiresEncoding(result)) + { + var builder = new StringBuilder(result.Length); + for (int i = 0; i < result.Length; i++) + { + var c = result[i]; + if ((int)c > 0x7f) + { + c = '_'; // Replace out-of-range characters + } + builder.Append(c); + } + result = builder.ToString(); + } + + return result; + } + + // Returns true if the value starts and ends with a quote + private bool IsQuoted(string value) + { + Contract.Assert(value != null); + + return value.Length > 1 && value.StartsWith("\"", StringComparison.Ordinal) + && value.EndsWith("\"", StringComparison.Ordinal); + } + + // tspecials are required to be in a quoted string. Only non-ascii needs to be encoded. + private bool RequiresEncoding(string input) + { + Contract.Assert(input != null); + + foreach (char c in input) + { + if ((int)c > 0x7f) + { + return true; + } + } + return false; + } + + // Encode using MIME encoding + private string EncodeMime(string input) + { + var buffer = Encoding.UTF8.GetBytes(input); + var encodedName = Convert.ToBase64String(buffer); + return string.Format(CultureInfo.InvariantCulture, "=?utf-8?B?{0}?=", encodedName); + } + + // Attempt to decode MIME encoded strings + private bool TryDecodeMime(string input, out string output) + { + Contract.Assert(input != null); + + output = null; + var processedInput = input; + // Require quotes, min of "=?e?b??=" + if (!IsQuoted(processedInput) || processedInput.Length < 10) + { + return false; + } + var parts = processedInput.Split('?'); + // "=, encodingName, encodingType, encodedData, =" + if (parts.Length != 5 || parts[0] != "\"=" || parts[4] != "=\"" || parts[2].ToLowerInvariant() != "b") + { + // Not encoded. + // This does not support multi-line encoding. + // Only base64 encoding is supported, not quoted printable + return false; + } + + try + { + var encoding = Encoding.GetEncoding(parts[1]); + var bytes = Convert.FromBase64String(parts[3]); + output = encoding.GetString(bytes); + return true; + } + catch (ArgumentException) + { + // Unknown encoding or bad characters + } + catch (FormatException) + { + // Bad base64 decoding + } + return false; + } + + // Encode a string using RFC 5987 encoding + // encoding'lang'PercentEncodedSpecials + private string Encode5987(string input) + { + var builder = new StringBuilder("UTF-8\'\'"); + foreach (char c in input) + { + // attr-char = ALPHA / DIGIT / "!" / "#" / "$" / "&" / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + // ; token except ( "*" / "'" / "%" ) + if (c > 0x7F) // Encodes as multiple utf-8 bytes + { + var bytes = Encoding.UTF8.GetBytes(c.ToString()); + foreach (byte b in bytes) + { + HexEscape(builder, (char)b); + } + } + else if (!HttpRuleParser.IsTokenChar(c) || c == '*' || c == '\'' || c == '%') + { + // ASCII - Only one encoded byte + HexEscape(builder, c); + } + else + { + builder.Append(c); + } + } + return builder.ToString(); + } + + private static readonly char[] HexUpperChars = { + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' }; + + private static void HexEscape(StringBuilder builder, char c) + { + builder.Append('%'); + builder.Append(HexUpperChars[(c & 0xf0) >> 4]); + builder.Append(HexUpperChars[c & 0xf]); + } + + // Attempt to decode using RFC 5987 encoding. + // encoding'language'my%20string + private bool TryDecode5987(string input, out string output) + { + output = null; + var parts = input.Split('\''); + if (parts.Length != 3) + { + return false; + } + + var decoded = new StringBuilder(); + try + { + var encoding = Encoding.GetEncoding(parts[0]); + + var dataString = parts[2]; + var unescapedBytes = new byte[dataString.Length]; + var unescapedBytesCount = 0; + for (var index = 0; index < dataString.Length; index++) + { + if (IsHexEncoding(dataString, index)) // %FF + { + // Unescape and cache bytes, multi-byte characters must be decoded all at once + unescapedBytes[unescapedBytesCount++] = HexUnescape(dataString, ref index); + index--; // HexUnescape did +=3; Offset the for loop's ++ + } + else + { + if (unescapedBytesCount > 0) + { + // Decode any previously cached bytes + decoded.Append(encoding.GetString(unescapedBytes, 0, unescapedBytesCount)); + unescapedBytesCount = 0; + } + decoded.Append(dataString[index]); // Normal safe character + } + } + + if (unescapedBytesCount > 0) + { + // Decode any previously cached bytes + decoded.Append(encoding.GetString(unescapedBytes, 0, unescapedBytesCount)); + } + } + catch (ArgumentException) + { + return false; // Unknown encoding or bad characters + } + + output = decoded.ToString(); + return true; + } + + private static bool IsHexEncoding(string pattern, int index) + { + if ((pattern.Length - index) < 3) + { + return false; + } + if ((pattern[index] == '%') && IsEscapedAscii(pattern[index + 1], pattern[index + 2])) + { + return true; + } + return false; + } + + private static bool IsEscapedAscii(char digit, char next) + { + if (!(((digit >= '0') && (digit <= '9')) + || ((digit >= 'A') && (digit <= 'F')) + || ((digit >= 'a') && (digit <= 'f')))) + { + return false; + } + + if (!(((next >= '0') && (next <= '9')) + || ((next >= 'A') && (next <= 'F')) + || ((next >= 'a') && (next <= 'f')))) + { + return false; + } + + return true; + } + + private static byte HexUnescape(string pattern, ref int index) + { + if ((index < 0) || (index >= pattern.Length)) + { + throw new ArgumentOutOfRangeException("index"); + } + if ((pattern[index] == '%') + && (pattern.Length - index >= 3)) + { + var ret = UnEscapeAscii(pattern[index + 1], pattern[index + 2]); + index += 3; + return ret; + } + return (byte)pattern[index++]; + } + + internal static byte UnEscapeAscii(char digit, char next) + { + if (!(((digit >= '0') && (digit <= '9')) + || ((digit >= 'A') && (digit <= 'F')) + || ((digit >= 'a') && (digit <= 'f')))) + { + throw new ArgumentException(); + } + + var res = (digit <= '9') + ? ((int)digit - (int)'0') + : (((digit <= 'F') + ? ((int)digit - (int)'A') + : ((int)digit - (int)'a')) + + 10); + + if (!(((next >= '0') && (next <= '9')) + || ((next >= 'A') && (next <= 'F')) + || ((next >= 'a') && (next <= 'f')))) + { + throw new ArgumentException(); + } + + return (byte)((res << 4) + ((next <= '9') + ? ((int)next - (int)'0') + : (((next <= 'F') + ? ((int)next - (int)'A') + : ((int)next - (int)'a')) + + 10))); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs new file mode 100644 index 0000000000..53fd996b9f --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -0,0 +1,397 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class ContentRangeHeaderValue + { + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetContentRangeLength); + + private string _unit; + private long? _from; + private long? _to; + private long? _length; + + private ContentRangeHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public ContentRangeHeaderValue(long from, long to, long length) + { + // Scenario: "Content-Range: bytes 12-34/5678" + + if (length < 0) + { + throw new ArgumentOutOfRangeException("length"); + } + if ((to < 0) || (to > length)) + { + throw new ArgumentOutOfRangeException("to"); + } + if ((from < 0) || (from > to)) + { + throw new ArgumentOutOfRangeException("from"); + } + + _from = from; + _to = to; + _length = length; + _unit = HeaderUtilities.BytesUnit; + } + + public ContentRangeHeaderValue(long length) + { + // Scenario: "Content-Range: bytes */1234" + + if (length < 0) + { + throw new ArgumentOutOfRangeException("length"); + } + + _length = length; + _unit = HeaderUtilities.BytesUnit; + } + + public ContentRangeHeaderValue(long from, long to) + { + // Scenario: "Content-Range: bytes 12-34/*" + + if (to < 0) + { + throw new ArgumentOutOfRangeException("to"); + } + if ((from < 0) || (from > to)) + { + throw new ArgumentOutOfRangeException("from"); + } + + _from = from; + _to = to; + _unit = HeaderUtilities.BytesUnit; + } + + public string Unit + { + get { return _unit; } + set + { + HeaderUtilities.CheckValidToken(value, "value"); + _unit = value; + } + } + + public long? From + { + get { return _from; } + } + + public long? To + { + get { return _to; } + } + + public long? Length + { + get { return _length; } + } + + public bool HasLength // e.g. "Content-Range: bytes 12-34/*" + { + get { return _length != null; } + } + + public bool HasRange // e.g. "Content-Range: bytes */1234" + { + get { return _from != null; } + } + + public override bool Equals(object obj) + { + var other = obj as ContentRangeHeaderValue; + + if (other == null) + { + return false; + } + + return ((_from == other._from) && (_to == other._to) && (_length == other._length) && + (string.Compare(_unit, other._unit, StringComparison.OrdinalIgnoreCase) == 0)); + } + + public override int GetHashCode() + { + var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit); + + if (HasRange) + { + result = result ^ _from.GetHashCode() ^ _to.GetHashCode(); + } + + if (HasLength) + { + result = result ^ _length.GetHashCode(); + } + + return result; + } + + public override string ToString() + { + var sb = new StringBuilder(_unit); + sb.Append(' '); + + if (HasRange) + { + sb.Append(_from.Value.ToString(NumberFormatInfo.InvariantInfo)); + sb.Append('-'); + sb.Append(_to.Value.ToString(NumberFormatInfo.InvariantInfo)); + } + else + { + sb.Append('*'); + } + + sb.Append('/'); + if (HasLength) + { + sb.Append(_length.Value.ToString(NumberFormatInfo.InvariantInfo)); + } + else + { + sb.Append('*'); + } + + return sb.ToString(); + } + + public static ContentRangeHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out ContentRangeHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetContentRangeLength(string input, int startIndex, out ContentRangeHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the unit string: in ' -/' + var unitLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (unitLength == 0) + { + return 0; + } + + var unit = input.Substring(startIndex, unitLength); + var current = startIndex + unitLength; + var separatorLength = HttpRuleParser.GetWhitespaceLength(input, current); + + if (separatorLength == 0) + { + return 0; + } + + current = current + separatorLength; + + if (current == input.Length) + { + return 0; + } + + // Read range values and in ' -/' + var fromStartIndex = current; + var fromLength = 0; + var toStartIndex = 0; + var toLength = 0; + if (!TryGetRangeLength(input, ref current, out fromLength, out toStartIndex, out toLength)) + { + return 0; + } + + // After the range is read we expect the length separator '/' + if ((current == input.Length) || (input[current] != '/')) + { + return 0; + } + + current++; // Skip '/' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (current == input.Length) + { + return 0; + } + + // We may not have a length (e.g. 'bytes 1-2/*'). But if we do, parse the length now. + var lengthStartIndex = current; + var lengthLength = 0; + if (!TryGetLengthLength(input, ref current, out lengthLength)) + { + return 0; + } + + if (!TryCreateContentRange(input, unit, fromStartIndex, fromLength, toStartIndex, toLength, + lengthStartIndex, lengthLength, out parsedValue)) + { + return 0; + } + + return current - startIndex; + } + + private static bool TryGetLengthLength(string input, ref int current, out int lengthLength) + { + lengthLength = 0; + + if (input[current] == '*') + { + current++; + } + else + { + // Parse length value: in ' -/' + lengthLength = HttpRuleParser.GetNumberLength(input, current, false); + + if ((lengthLength == 0) || (lengthLength > HttpRuleParser.MaxInt64Digits)) + { + return false; + } + + current = current + lengthLength; + } + + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + return true; + } + + private static bool TryGetRangeLength(string input, ref int current, out int fromLength, out int toStartIndex, out int toLength) + { + fromLength = 0; + toStartIndex = 0; + toLength = 0; + + // Check if we have a value like 'bytes */133'. If yes, skip the range part and continue parsing the + // length separator '/'. + if (input[current] == '*') + { + current++; + } + else + { + // Parse first range value: in ' -/' + fromLength = HttpRuleParser.GetNumberLength(input, current, false); + + if ((fromLength == 0) || (fromLength > HttpRuleParser.MaxInt64Digits)) + { + return false; + } + + current = current + fromLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // After the first value, the '-' character must follow. + if ((current == input.Length) || (input[current] != '-')) + { + // We need a '-' character otherwise this can't be a valid range. + return false; + } + + current++; // skip the '-' character + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (current == input.Length) + { + return false; + } + + // Parse second range value: in ' -/' + toStartIndex = current; + toLength = HttpRuleParser.GetNumberLength(input, current, false); + + if ((toLength == 0) || (toLength > HttpRuleParser.MaxInt64Digits)) + { + return false; + } + + current = current + toLength; + } + + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + return true; + } + + private static bool TryCreateContentRange(string input, string unit, int fromStartIndex, int fromLength, + int toStartIndex, int toLength, int lengthStartIndex, int lengthLength, out ContentRangeHeaderValue parsedValue) + { + parsedValue = null; + + long from = 0; + if ((fromLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(fromStartIndex, fromLength), out from)) + { + return false; + } + + long to = 0; + if ((toLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(toStartIndex, toLength), out to)) + { + return false; + } + + // 'from' must not be greater than 'to' + if ((fromLength > 0) && (toLength > 0) && (from > to)) + { + return false; + } + + long length = 0; + if ((lengthLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(lengthStartIndex, lengthLength), + out length)) + { + return false; + } + + // 'from' and 'to' must be less than 'length' + if ((toLength > 0) && (lengthLength > 0) && (to >= length)) + { + return false; + } + + var result = new ContentRangeHeaderValue(); + result._unit = unit; + + if (fromLength > 0) + { + result._from = from; + result._to = to; + } + + if (lengthLength > 0) + { + result._length = length; + } + + parsedValue = result; + return true; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs new file mode 100644 index 0000000000..7c5be8753c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -0,0 +1,104 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Diagnostics.Contracts; + +namespace Microsoft.Net.Http.Headers +{ + internal class CookieHeaderParser : HttpHeaderParser + { + // The Cache-Control header is special: It is a header supporting a list of values, but we represent the list + // as _one_ instance of CacheControlHeaderValue. I.e we set 'SupportsMultipleValues' to 'true' since it is + // OK to have multiple Cache-Control headers in a request/response message. However, after parsing all + // Cache-Control headers, only one instance of CacheControlHeaderValue is created (if all headers contain valid + // values, otherwise we may have multiple strings containing the invalid values). + internal CookieHeaderParser(bool supportsMultipleValues) + : base(supportsMultipleValues) + { + } + + public sealed override bool TryParseValue(string value, ref int index, out CookieHeaderValue parsedValue) + { + parsedValue = null; + + // If multiple values are supported (i.e. list of values), then accept an empty string: The header may + // be added multiple times to the request/response message. E.g. + // Accept: text/xml; q=1 + // Accept: + // Accept: text/plain; q=0.2 + if (string.IsNullOrEmpty(value) || (index == value.Length)) + { + return SupportsMultipleValues; + } + + var separatorFound = false; + var current = GetNextNonEmptyOrWhitespaceIndex(value, index, SupportsMultipleValues, out separatorFound); + + if (separatorFound && !SupportsMultipleValues) + { + return false; // leading separators not allowed if we don't support multiple values. + } + + if (current == value.Length) + { + if (SupportsMultipleValues) + { + index = current; + } + return SupportsMultipleValues; + } + + CookieHeaderValue result = null; + int length = CookieHeaderValue.GetCookieLength(value, current, out result); + + if (length == 0) + { + return false; + } + + current = current + length; + current = GetNextNonEmptyOrWhitespaceIndex(value, current, SupportsMultipleValues, out separatorFound); + + // If we support multiple values and we've not reached the end of the string, then we must have a separator. + if ((separatorFound && !SupportsMultipleValues) || (!separatorFound && (current < value.Length))) + { + return false; + } + + index = current; + parsedValue = result; + return true; + } + + private static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, out bool separatorFound) + { + Contract.Requires(input != null); + Contract.Requires(startIndex <= input.Length); // it's OK if index == value.Length. + + separatorFound = false; + var current = startIndex + HttpRuleParser.GetWhitespaceLength(input, startIndex); + + if ((current == input.Length) || (input[current] != ',' && input[current] != ';')) + { + return current; + } + + // If we have a separator, skip the separator and all following whitespaces. If we support + // empty values, continue until the current character is neither a separator nor a whitespace. + separatorFound = true; + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (skipEmptyValues) + { + while ((current < input.Length) && (input[current] == ',') && (input[current] == ';')) + { + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + } + + return current; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs new file mode 100644 index 0000000000..c4c1207380 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -0,0 +1,256 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // http://tools.ietf.org/html/rfc6265 + public class CookieHeaderValue + { + private static readonly CookieHeaderParser SingleValueParser = new CookieHeaderParser(supportsMultipleValues: false); + private static readonly CookieHeaderParser MultipleValueParser = new CookieHeaderParser(supportsMultipleValues: true); + + private string _name; + private string _value; + + private CookieHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public CookieHeaderValue([NotNull] string name) + : this(name, string.Empty) + { + } + + public CookieHeaderValue([NotNull] string name, [NotNull] string value) + { + Name = name; + Value = value; + } + + public string Name + { + get { return _name; } + set + { + CheckNameFormat(value, "name"); + _name = value; + } + } + + public string Value + { + get { return _value; } + set + { + CheckValueFormat(value, "value"); + _value = value; + } + } + + // name="val ue"; + public override string ToString() + { + var header = new StringBuilder(); + + header.Append(_name); + header.Append("="); + header.Append(_value); + + return header.ToString(); + } + + private static void AppendSegment(StringBuilder builder, string name, string value) + { + builder.Append("; "); + builder.Append(name); + if (value != null) + { + builder.Append("="); + builder.Append(value); + } + } + + public static CookieHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out CookieHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + // name=value; name="value" + internal static int GetCookieLength(string input, int startIndex, out CookieHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + var offset = startIndex; + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (offset >= input.Length)) + { + return 0; + } + + var result = new CookieHeaderValue(); + + // The caller should have already consumed any leading whitespace, commas, etc.. + + // Name=value; + + // Name + var itemLength = HttpRuleParser.GetTokenLength(input, offset); + if (itemLength == 0) + { + return 0; + } + result._name = input.Substring(offset, itemLength); + offset += itemLength; + + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + + string value; + // value or "quoted value" + itemLength = GetCookieValueLength(input, offset, out value); + // The value may be empty + result._value = input.Substring(offset, itemLength); + offset += itemLength; + + parsedValue = result; + return offset - startIndex; + } + + // cookie-value = *cookie-octet / ( DQUOTE* cookie-octet DQUOTE ) + // cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + // ; US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash + internal static int GetCookieValueLength(string input, int startIndex, out string value) + { + Contract.Requires(input != null); + Contract.Requires(startIndex >= 0); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + value = null; + if (startIndex >= input.Length) + { + return 0; + } + var inQuotes = false; + var offset = startIndex; + + if (input[offset] == '"') + { + inQuotes = true; + offset++; + } + + while (offset < input.Length) + { + var c = input[offset]; + if (!IsCookieValueChar(c)) + { + break; + } + + offset++; + } + + if (inQuotes) + { + if (offset == input.Length || input[offset] != '"') + { + return 0; // Missing final quote + } + offset++; + } + + int length = offset - startIndex; + if (length == 0) + { + return 0; + } + + value = input.Substring(startIndex, length); + return length; + } + + private static bool ReadEqualsSign(string input, ref int offset) + { + // = (no spaces) + if (offset >= input.Length || input[offset] != '=') + { + return false; + } + offset++; + return true; + } + + // cookie-octet = %x21 / %x23-2B / %x2D-3A / %x3C-5B / %x5D-7E + // ; US-ASCII characters excluding CTLs, whitespace DQUOTE, comma, semicolon, and backslash + private static bool IsCookieValueChar(char c) + { + if (c < 0x21 || c > 0x7E) + { + return false; + } + return !(c == '"' || c == ',' || c == ';' || c == '\\'); + } + + internal static void CheckNameFormat([NotNull] string name, string parameterName) + { + if (HttpRuleParser.GetTokenLength(name, 0) != name.Length) + { + throw new ArgumentException("Invalid cookie name: " + name, parameterName); + } + } + + internal static void CheckValueFormat([NotNull] string value, string parameterName) + { + string temp; + if (GetCookieValueLength(value, 0, out temp) != value.Length) + { + throw new ArgumentException("Invalid cookie value: " + value, parameterName); + } + } + + public override bool Equals(object obj) + { + var other = obj as CookieHeaderValue; + + if (other == null) + { + return false; + } + + return string.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) + && string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase); + } + + public override int GetHashCode() + { + return _name.GetHashCode() ^ _value.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs new file mode 100644 index 0000000000..af10ff345e --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -0,0 +1,204 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; + +namespace Microsoft.Net.Http.Headers +{ + public class EntityTagHeaderValue + { + // Note that the ETag header does not allow a * but we're not that strict: We allow both '*' and ETag values in a single value. + // We can't guarantee that a single parsed value will be used directly in an ETag header. + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetEntityTagLength); + // Note that if multiple ETag values are allowed (e.g. 'If-Match', 'If-None-Match'), according to the RFC + // the value must either be '*' or a list of ETag values. It's not allowed to have both '*' and a list of + // ETag values. We're not that strict: We allow both '*' and ETag values in a list. If the server sends such + // an invalid list, we want to be able to represent it using the corresponding header property. + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetEntityTagLength); + + private static EntityTagHeaderValue AnyType; + + private string _tag; + private bool _isWeak; + + private EntityTagHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public EntityTagHeaderValue(string tag) + : this(tag, false) + { + } + + public EntityTagHeaderValue(string tag, bool isWeak) + { + if (string.IsNullOrEmpty(tag)) + { + throw new ArgumentException("An empty string is not allowed.", "tag"); + } + + int length = 0; + if (!isWeak && string.Equals(tag, "*", StringComparison.Ordinal)) + { + // * is valid, but W/* isn't. + _tag = tag; + } + else if ((HttpRuleParser.GetQuotedStringLength(tag, 0, out length) != HttpParseResult.Parsed) || + (length != tag.Length)) + { + // Note that we don't allow 'W/' prefixes for weak ETags in the 'tag' parameter. If the user wants to + // add a weak ETag, he can set 'isWeak' to true. + throw new FormatException("Invalid ETag name"); + } + + _tag = tag; + _isWeak = isWeak; + } + + public static EntityTagHeaderValue Any + { + get + { + if (AnyType == null) + { + AnyType = new EntityTagHeaderValue(); + AnyType._tag = "*"; + AnyType._isWeak = false; + } + return AnyType; + } + } + + public string Tag + { + get { return _tag; } + } + + public bool IsWeak + { + get { return _isWeak; } + } + + public override string ToString() + { + if (_isWeak) + { + return "W/" + _tag; + } + return _tag; + } + + public override bool Equals(object obj) + { + var other = obj as EntityTagHeaderValue; + + if (other == null) + { + return false; + } + + // Since the tag is a quoted-string we treat it case-sensitive. + return ((_isWeak == other._isWeak) && (string.CompareOrdinal(_tag, other._tag) == 0)); + } + + public override int GetHashCode() + { + // Since the tag is a quoted-string we treat it case-sensitive. + return _tag.GetHashCode() ^ _isWeak.GetHashCode(); + } + + public static EntityTagHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out EntityTagHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + internal static int GetEntityTagLength(string input, int startIndex, out EntityTagHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + var isWeak = false; + var current = startIndex; + + var firstChar = input[startIndex]; + if (firstChar == '*') + { + // We have '*' value, indicating "any" ETag. + parsedValue = Any; + current++; + } + else + { + // The RFC defines 'W/' as prefix, but we'll be flexible and also accept lower-case 'w'. + if ((firstChar == 'W') || (firstChar == 'w')) + { + current++; + // We need at least 3 more chars: the '/' character followed by two quotes. + if ((current + 2 >= input.Length) || (input[current] != '/')) + { + return 0; + } + isWeak = true; + current++; // we have a weak-entity tag. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + + var tagStartIndex = current; + var tagLength = 0; + if (HttpRuleParser.GetQuotedStringLength(input, current, out tagLength) != HttpParseResult.Parsed) + { + return 0; + } + + parsedValue = new EntityTagHeaderValue(); + if (tagLength == input.Length) + { + // Most of the time we'll have strong ETags without leading/trailing whitespaces. + Contract.Assert(startIndex == 0); + Contract.Assert(!isWeak); + parsedValue._tag = input; + parsedValue._isWeak = false; + } + else + { + parsedValue._tag = input.Substring(tagStartIndex, tagLength); + parsedValue._isWeak = isWeak; + } + + current = current + tagLength; + } + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + return current - startIndex; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs new file mode 100644 index 0000000000..c8e5f933e2 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + internal sealed class GenericHeaderParser : BaseHeaderParser + { + internal delegate int GetParsedValueLengthDelegate(string value, int startIndex, out T parsedValue); + + private GetParsedValueLengthDelegate _getParsedValueLength; + + internal GenericHeaderParser(bool supportsMultipleValues, [NotNull] GetParsedValueLengthDelegate getParsedValueLength) + : base(supportsMultipleValues) + { + _getParsedValueLength = getParsedValueLength; + } + + protected override int GetParsedValueLength(string value, int startIndex, out T parsedValue) + { + return _getParsedValueLength(value, startIndex, out parsedValue); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs new file mode 100644 index 0000000000..53f1d53dc9 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -0,0 +1,59 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderNames + { + public const string Accept = "Accept"; + public const string AcceptCharset = "Accept-Charset"; + public const string AcceptEncoding = "Accept-Encoding"; + public const string AcceptLanguage = "Accept-Language"; + public const string AcceptRanges = "Accept-Ranges"; + public const string Age = "Age"; + public const string Allow = "Allow"; + public const string Authorization = "Authorization"; + public const string CacheControl = "Cache-Control"; + public const string Connection = "Connection"; + public const string ContentDisposition = "Content-Disposition"; + public const string ContentEncoding = "Content-Encoding"; + public const string ContentLanguage = "Content-Language"; + public const string ContentLength = "Content-Length"; + public const string ContentLocation = "Content-Location"; + public const string ContentMD5 = "ContentMD5"; + public const string ContentRange = "Content-Range"; + public const string ContentType = "Content-Type"; + public const string Cookie = "Cookie"; + public const string Date = "Date"; + public const string ETag = "ETag"; + public const string Expires = "Expires"; + public const string Expect = "Expect"; + public const string From = "From"; + public const string Host = "Host"; + public const string IfMatch = "If-Match"; + public const string IfModifiedSince = "If-Modified-Since"; + public const string IfNoneMatch = "If-None-Match"; + public const string IfRange = "If-Range"; + public const string IfUnmodifiedSince = "If-Unmodified-Since"; + public const string LastModified = "Last-Modified"; + public const string Location = "Location"; + public const string MaxForwards = "Max-Forwards"; + public const string Pragma = "Pragma"; + public const string ProxyAuthenticate = "Proxy-Authenticate"; + public const string ProxyAuthorization = "Proxy-Authorization"; + public const string Range = "Range"; + public const string Referer = "Referer"; + public const string RetryAfter = "Retry-After"; + public const string Server = "Server"; + public const string SetCookie = "Set-Cookie"; + public const string TE = "TE"; + public const string Trailer = "Trailer"; + public const string TransferEncoding = "Transfer-Encoding"; + public const string Upgrade = "Upgrade"; + public const string UserAgent = "User-Agent"; + public const string Vary = "Vary"; + public const string Via = "Via"; + public const string Warning = "Warning"; + public const string WWWAuthenticate = "WWW-Authenticate"; + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs new file mode 100644 index 0000000000..c5247e1aca --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderQuality + { + /// + /// Quality factor to indicate a perfect match. + /// + public const double Match = 1.0; + + /// + /// Quality factor to indicate no match. + /// + public const double NoMatch = 0.0; + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs new file mode 100644 index 0000000000..aaf2d57470 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -0,0 +1,232 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + public static class HeaderUtilities + { + private const string QualityName = "q"; + internal const string BytesUnit = "bytes"; + + internal static void SetQuality(ICollection parameters, double? value) + { + Contract.Requires(parameters != null); + + var qualityParameter = NameValueHeaderValue.Find(parameters, QualityName); + if (value.HasValue) + { + // Note that even if we check the value here, we can't prevent a user from adding an invalid quality + // value using Parameters.Add(). Even if we would prevent the user from adding an invalid value + // using Parameters.Add() he could always add invalid values using HttpHeaders.AddWithoutValidation(). + // So this check is really for convenience to show users that they're trying to add an invalid + // value. + if ((value < 0) || (value > 1)) + { + throw new ArgumentOutOfRangeException("value"); + } + + var qualityString = ((double)value).ToString("0.0##", NumberFormatInfo.InvariantInfo); + if (qualityParameter != null) + { + qualityParameter.Value = qualityString; + } + else + { + parameters.Add(new NameValueHeaderValue(QualityName, qualityString)); + } + } + else + { + // Remove quality parameter + if (qualityParameter != null) + { + parameters.Remove(qualityParameter); + } + } + } + + internal static double? GetQuality(ICollection parameters) + { + Contract.Requires(parameters != null); + + var qualityParameter = NameValueHeaderValue.Find(parameters, QualityName); + if (qualityParameter != null) + { + // Note that the RFC requires decimal '.' regardless of the culture. I.e. using ',' as decimal + // separator is considered invalid (even if the current culture would allow it). + double qualityValue; + if (double.TryParse(qualityParameter.Value, NumberStyles.AllowDecimalPoint, + NumberFormatInfo.InvariantInfo, out qualityValue)) + { + return qualityValue; + } + } + return null; + } + + internal static void CheckValidToken(string value, string parameterName) + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + if (HttpRuleParser.GetTokenLength(value, 0) != value.Length) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid token '{0}.", value)); + } + } + + internal static void CheckValidQuotedString(string value, string parameterName) + { + if (string.IsNullOrEmpty(value)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + int length; + if ((HttpRuleParser.GetQuotedStringLength(value, 0, out length) != HttpParseResult.Parsed) || + (length != value.Length)) // no trailing spaces allowed + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid quoted string '{0}'.", value)); + } + } + + internal static bool AreEqualCollections(ICollection x, ICollection y) + { + return AreEqualCollections(x, y, null); + } + + internal static bool AreEqualCollections(ICollection x, ICollection y, IEqualityComparer comparer) + { + if (x == null) + { + return (y == null) || (y.Count == 0); + } + + if (y == null) + { + return (x.Count == 0); + } + + if (x.Count != y.Count) + { + return false; + } + + if (x.Count == 0) + { + return true; + } + + // We have two unordered lists. So comparison is an O(n*m) operation which is expensive. Usually + // headers have 1-2 parameters (if any), so this comparison shouldn't be too expensive. + var alreadyFound = new bool[x.Count]; + var i = 0; + foreach (var xItem in x) + { + Contract.Assert(xItem != null); + + i = 0; + var found = false; + foreach (var yItem in y) + { + if (!alreadyFound[i]) + { + if (((comparer == null) && xItem.Equals(yItem)) || + ((comparer != null) && comparer.Equals(xItem, yItem))) + { + alreadyFound[i] = true; + found = true; + break; + } + } + i++; + } + + if (!found) + { + return false; + } + } + + // Since we never re-use a "found" value in 'y', we expecte 'alreadyFound' to have all fields set to 'true'. + // Otherwise the two collections can't be equal and we should not get here. + Contract.Assert(Contract.ForAll(alreadyFound, value => { return value; }), + "Expected all values in 'alreadyFound' to be true since collections are considered equal."); + + return true; + } + + internal static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, + out bool separatorFound) + { + Contract.Requires(input != null); + Contract.Requires(startIndex <= input.Length); // it's OK if index == value.Length. + + separatorFound = false; + var current = startIndex + HttpRuleParser.GetWhitespaceLength(input, startIndex); + + if ((current == input.Length) || (input[current] != ',')) + { + return current; + } + + // If we have a separator, skip the separator and all following whitespaces. If we support + // empty values, continue until the current character is neither a separator nor a whitespace. + separatorFound = true; + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (skipEmptyValues) + { + while ((current < input.Length) && (input[current] == ',')) + { + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + } + + return current; + } + + internal static bool TryParseInt32(string value, out int result) + { + return int.TryParse(value, NumberStyles.None, NumberFormatInfo.InvariantInfo, out result); + } + + public static bool TryParseInt64(string value, out long result) + { + return long.TryParse(value, NumberStyles.None, NumberFormatInfo.InvariantInfo, out result); + } + + public static string FormatInt64(long value) + { + return value.ToString(CultureInfo.InvariantCulture); + } + + public static bool TryParseDate(string input, out DateTimeOffset result) + { + return HttpRuleParser.TryStringToDate(input, out result); + } + + public static string FormatDate(DateTimeOffset dateTime) + { + return HttpRuleParser.DateToString(dateTime); + } + + public static string RemoveQuotes(string input) + { + if (!string.IsNullOrEmpty(input) && input.Length >= 2 && input[0] == '"' && input[input.Length - 1] == '"') + { + input = input.Substring(1, input.Length - 2); + } + return input; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs new file mode 100644 index 0000000000..af19f3421c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -0,0 +1,137 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + internal abstract class HttpHeaderParser + { + private bool _supportsMultipleValues; + + protected HttpHeaderParser(bool supportsMultipleValues) + { + _supportsMultipleValues = supportsMultipleValues; + } + + public bool SupportsMultipleValues + { + get { return _supportsMultipleValues; } + } + + // If a parser supports multiple values, a call to ParseValue/TryParseValue should return a value for 'index' + // pointing to the next non-whitespace character after a delimiter. E.g. if called with a start index of 0 + // for string "value , second_value", then after the call completes, 'index' must point to 's', i.e. the first + // non-whitespace after the separator ','. + public abstract bool TryParseValue(string value, ref int index, out T parsedValue); + + public T ParseValue(string value, ref int index) + { + // Index may be value.Length (e.g. both 0). This may be allowed for some headers (e.g. Accept but not + // allowed by others (e.g. Content-Length). The parser has to decide if this is valid or not. + Contract.Requires((value == null) || ((index >= 0) && (index <= value.Length))); + + // If a parser returns 'null', it means there was no value, but that's valid (e.g. "Accept: "). The caller + // can ignore the value. + T result = default(T); + if (!TryParseValue(value, ref index, out result)) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid value '{0}'.", + value == null ? "" : value.Substring(index))); + } + return result; + } + + public virtual bool TryParseValues(IList values, out IList parsedValues) + { + Contract.Assert(_supportsMultipleValues); + // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller + // can ignore the value. + parsedValues = null; + var results = new List(); + if (values == null) + { + return false; + } + foreach (var value in values) + { + int index = 0; + + while (!string.IsNullOrEmpty(value) && index < value.Length) + { + T output; + if (TryParseValue(value, ref index, out output)) + { + // The entry may not contain an actual value, like " , " + if (output != null) + { + results.Add(output); + } + } + else + { + return false; + } + } + } + if (results.Count > 0) + { + parsedValues = results; + return true; + } + return false; + } + + public IList ParseValues(IList values) + { + Contract.Assert(_supportsMultipleValues); + // If a parser returns an empty list, it means there was no value, but that's valid (e.g. "Accept: "). The caller + // can ignore the value. + var parsedValues = new List(); + if (values == null) + { + return parsedValues; + } + foreach (var value in values) + { + int index = 0; + + while (!string.IsNullOrEmpty(value) && index < value.Length) + { + T output; + if (TryParseValue(value, ref index, out output)) + { + // The entry may not contain an actual value, like " , " + if (output != null) + { + parsedValues.Add(output); + } + } + else + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid values '{0}'.", + values == null ? "" : value.Substring(index))); + } + } + } + return parsedValues; + } + + // If ValueType is a custom header value type (e.g. NameValueHeaderValue) it implements ToString() correctly. + // However for existing types like int, byte[], DateTimeOffset we can't override ToString(). Therefore the + // parser provides a ToString() virtual method that can be overridden by derived types to correctly serialize + // values (e.g. byte[] to Base64 encoded string). + // The default implementation is to just call ToString() on the value itself which is the right thing to do + // for most headers (custom types, string, etc.). + public virtual string ToString(object value) + { + Contract.Requires(value != null); + + return value.ToString(); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs new file mode 100644 index 0000000000..76713cf1cc --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.Net.Http.Headers +{ + internal enum HttpParseResult + { + Parsed, + NotParsed, + InvalidFormat, + } +} diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs new file mode 100644 index 0000000000..66f6361da7 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -0,0 +1,352 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + internal static class HttpRuleParser + { + private static readonly bool[] TokenChars; + private const int MaxNestedCount = 5; + private static readonly string[] DateFormats = new string[] { + // "r", // RFC 1123, required output format but too strict for input + "ddd, d MMM yyyy H:m:s 'GMT'", // RFC 1123 (r, except it allows both 1 and 01 for date and time) + "ddd, d MMM yyyy H:m:s", // RFC 1123, no zone - assume GMT + "d MMM yyyy H:m:s 'GMT'", // RFC 1123, no day-of-week + "d MMM yyyy H:m:s", // RFC 1123, no day-of-week, no zone + "ddd, d MMM yy H:m:s 'GMT'", // RFC 1123, short year + "ddd, d MMM yy H:m:s", // RFC 1123, short year, no zone + "d MMM yy H:m:s 'GMT'", // RFC 1123, no day-of-week, short year + "d MMM yy H:m:s", // RFC 1123, no day-of-week, short year, no zone + + "dddd, d'-'MMM'-'yy H:m:s 'GMT'", // RFC 850 + "dddd, d'-'MMM'-'yy H:m:s", // RFC 850 no zone + "ddd MMM d H:m:s yyyy", // ANSI C's asctime() format + + "ddd, d MMM yyyy H:m:s zzz", // RFC 5322 + "ddd, d MMM yyyy H:m:s", // RFC 5322 no zone + "d MMM yyyy H:m:s zzz", // RFC 5322 no day-of-week + "d MMM yyyy H:m:s", // RFC 5322 no day-of-week, no zone + }; + + internal const char CR = '\r'; + internal const char LF = '\n'; + internal const char SP = ' '; + internal const char Tab = '\t'; + internal const int MaxInt64Digits = 19; + internal const int MaxInt32Digits = 10; + + // iso-8859-1, Western European (ISO) + internal static readonly Encoding DefaultHttpEncoding = Encoding.GetEncoding(28591); + + static HttpRuleParser() + { + // token = 1* + // CTL = + + TokenChars = new bool[128]; // everything is false + + for (int i = 33; i < 127; i++) // skip Space (32) & DEL (127) + { + TokenChars[i] = true; + } + + // remove separators: these are not valid token characters + TokenChars[(byte)'('] = false; + TokenChars[(byte)')'] = false; + TokenChars[(byte)'<'] = false; + TokenChars[(byte)'>'] = false; + TokenChars[(byte)'@'] = false; + TokenChars[(byte)','] = false; + TokenChars[(byte)';'] = false; + TokenChars[(byte)':'] = false; + TokenChars[(byte)'\\'] = false; + TokenChars[(byte)'"'] = false; + TokenChars[(byte)'/'] = false; + TokenChars[(byte)'['] = false; + TokenChars[(byte)']'] = false; + TokenChars[(byte)'?'] = false; + TokenChars[(byte)'='] = false; + TokenChars[(byte)'{'] = false; + TokenChars[(byte)'}'] = false; + } + + internal static bool IsTokenChar(char character) + { + // Must be between 'space' (32) and 'DEL' (127) + if (character > 127) + { + return false; + } + + return TokenChars[character]; + } + + [Pure] + internal static int GetTokenLength(string input, int startIndex) + { + Contract.Requires(input != null); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + if (startIndex >= input.Length) + { + return 0; + } + + var current = startIndex; + + while (current < input.Length) + { + if (!IsTokenChar(input[current])) + { + return current - startIndex; + } + current++; + } + return input.Length - startIndex; + } + + internal static int GetWhitespaceLength(string input, int startIndex) + { + Contract.Requires(input != null); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + if (startIndex >= input.Length) + { + return 0; + } + + var current = startIndex; + + char c; + while (current < input.Length) + { + c = input[current]; + + if ((c == SP) || (c == Tab)) + { + current++; + continue; + } + + if (c == CR) + { + // If we have a #13 char, it must be followed by #10 and then at least one SP or HT. + if ((current + 2 < input.Length) && (input[current + 1] == LF)) + { + char spaceOrTab = input[current + 2]; + if ((spaceOrTab == SP) || (spaceOrTab == Tab)) + { + current += 3; + continue; + } + } + } + + return current - startIndex; + } + + // All characters between startIndex and the end of the string are LWS characters. + return input.Length - startIndex; + } + + internal static int GetNumberLength(string input, int startIndex, bool allowDecimal) + { + Contract.Requires(input != null); + Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); + Contract.Ensures((Contract.Result() >= 0) && (Contract.Result() <= (input.Length - startIndex))); + + var current = startIndex; + char c; + + // If decimal values are not allowed, we pretend to have read the '.' character already. I.e. if a dot is + // found in the string, parsing will be aborted. + var haveDot = !allowDecimal; + + // The RFC doesn't allow decimal values starting with dot. I.e. value ".123" is invalid. It must be in the + // form "0.123". Also, there are no negative values defined in the RFC. So we'll just parse non-negative + // values. + // The RFC only allows decimal dots not ',' characters as decimal separators. Therefore value "1,23" is + // considered invalid and must be represented as "1.23". + if (input[current] == '.') + { + return 0; + } + + while (current < input.Length) + { + c = input[current]; + if ((c >= '0') && (c <= '9')) + { + current++; + } + else if (!haveDot && (c == '.')) + { + // Note that value "1." is valid. + haveDot = true; + current++; + } + else + { + break; + } + } + + return current - startIndex; + } + + internal static HttpParseResult GetQuotedStringLength(string input, int startIndex, out int length) + { + var nestedCount = 0; + return GetExpressionLength(input, startIndex, '"', '"', false, ref nestedCount, out length); + } + + // quoted-pair = "\" CHAR + // CHAR = + internal static HttpParseResult GetQuotedPairLength(string input, int startIndex, out int length) + { + Contract.Requires(input != null); + Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); + Contract.Ensures((Contract.ValueAtReturn(out length) >= 0) && + (Contract.ValueAtReturn(out length) <= (input.Length - startIndex))); + + length = 0; + + if (input[startIndex] != '\\') + { + return HttpParseResult.NotParsed; + } + + // Quoted-char has 2 characters. Check wheter there are 2 chars left ('\' + char) + // If so, check whether the character is in the range 0-127. If not, it's an invalid value. + if ((startIndex + 2 > input.Length) || (input[startIndex + 1] > 127)) + { + return HttpParseResult.InvalidFormat; + } + + // We don't care what the char next to '\' is. + length = 2; + return HttpParseResult.Parsed; + } + + internal static string DateToString(DateTimeOffset dateTime) + { + // Format according to RFC1123; 'r' uses invariant info (DateTimeFormatInfo.InvariantInfo) + return dateTime.ToUniversalTime().ToString("r", CultureInfo.InvariantCulture); + } + + internal static bool TryStringToDate(string input, out DateTimeOffset result) + { + // Try the various date formats in the order listed above. + // We should accept a wide verity of common formats, but only output RFC 1123 style dates. + if (DateTimeOffset.TryParseExact(input, DateFormats, DateTimeFormatInfo.InvariantInfo, + DateTimeStyles.AllowWhiteSpaces | DateTimeStyles.AssumeUniversal, out result)) + { + return true; + } + + return false; + } + + // TEXT = + // LWS = [CRLF] 1*( SP | HT ) + // CTL = + // + // Since we don't really care about the content of a quoted string or comment, we're more tolerant and + // allow these characters. We only want to find the delimiters ('"' for quoted string and '(', ')' for comment). + // + // 'nestedCount': Comments can be nested. We allow a depth of up to 5 nested comments, i.e. something like + // "(((((comment)))))". If we wouldn't define a limit an attacker could send a comment with hundreds of nested + // comments, resulting in a stack overflow exception. In addition having more than 1 nested comment (if any) + // is unusual. + private static HttpParseResult GetExpressionLength(string input, int startIndex, char openChar, + char closeChar, bool supportsNesting, ref int nestedCount, out int length) + { + Contract.Requires(input != null); + Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); + Contract.Ensures((Contract.Result() != HttpParseResult.Parsed) || + (Contract.ValueAtReturn(out length) > 0)); + + length = 0; + + if (input[startIndex] != openChar) + { + return HttpParseResult.NotParsed; + } + + var current = startIndex + 1; // Start parsing with the character next to the first open-char + while (current < input.Length) + { + // Only check whether we have a quoted char, if we have at least 3 characters left to read (i.e. + // quoted char + closing char). Otherwise the closing char may be considered part of the quoted char. + var quotedPairLength = 0; + if ((current + 2 < input.Length) && + (GetQuotedPairLength(input, current, out quotedPairLength) == HttpParseResult.Parsed)) + { + // We ignore invalid quoted-pairs. Invalid quoted-pairs may mean that it looked like a quoted pair, + // but we actually have a quoted-string: e.g. "\ü" ('\' followed by a char >127 - quoted-pair only + // allows ASCII chars after '\'; qdtext allows both '\' and >127 chars). + current = current + quotedPairLength; + continue; + } + + // If we support nested expressions and we find an open-char, then parse the nested expressions. + if (supportsNesting && (input[current] == openChar)) + { + nestedCount++; + try + { + // Check if we exceeded the number of nested calls. + if (nestedCount > MaxNestedCount) + { + return HttpParseResult.InvalidFormat; + } + + var nestedLength = 0; + HttpParseResult nestedResult = GetExpressionLength(input, current, openChar, closeChar, + supportsNesting, ref nestedCount, out nestedLength); + + switch (nestedResult) + { + case HttpParseResult.Parsed: + current += nestedLength; // add the length of the nested expression and continue. + break; + + case HttpParseResult.NotParsed: + Contract.Assert(false, "'NotParsed' is unexpected: We started nested expression " + + "parsing, because we found the open-char. So either it's a valid nested " + + "expression or it has invalid format."); + break; + + case HttpParseResult.InvalidFormat: + // If the nested expression is invalid, we can't continue, so we fail with invalid format. + return HttpParseResult.InvalidFormat; + + default: + Contract.Assert(false, "Unknown enum result: " + nestedResult); + break; + } + } + finally + { + nestedCount--; + } + } + + if (input[current] == closeChar) + { + length = current - startIndex + 1; + return HttpParseResult.Parsed; + } + current++; + } + + // We didn't see the final quote, therefore we have an invalid expression string. + return HttpParseResult.InvalidFormat; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs new file mode 100644 index 0000000000..1fa7535452 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -0,0 +1,408 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class MediaTypeHeaderValue + { + private const string CharsetString = "charset"; + private const string BoundaryString = "boundary"; + + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetMediaTypeLength); + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetMediaTypeLength); + + // Use list instead of dictionary since we may have multiple parameters with the same name. + private ICollection _parameters; + private string _mediaType; + + private MediaTypeHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public MediaTypeHeaderValue(string mediaType) + { + CheckMediaTypeFormat(mediaType, "mediaType"); + _mediaType = mediaType; + } + + public MediaTypeHeaderValue(string mediaType, double quality) + : this(mediaType) + { + Quality = quality; + } + + public string Charset + { + get + { + return NameValueHeaderValue.Find(_parameters, CharsetString)?.Value; + } + set + { + // We don't prevent a user from setting whitespace-only charsets. Like we can't prevent a user from + // setting a non-existing charset. + var charsetParameter = NameValueHeaderValue.Find(_parameters, CharsetString); + if (string.IsNullOrEmpty(value)) + { + // Remove charset parameter + if (charsetParameter != null) + { + _parameters.Remove(charsetParameter); + } + } + else + { + if (charsetParameter != null) + { + charsetParameter.Value = value; + } + else + { + Parameters.Add(new NameValueHeaderValue(CharsetString, value)); + } + } + } + } + + public Encoding Encoding + { + get + { + var charset = Charset; + if (!string.IsNullOrWhiteSpace(charset)) + { + try + { + return Encoding.GetEncoding(charset); + } + catch (ArgumentException) + { + // Invalid or not supported + } + } + return null; + } + set + { + if (value == null) + { + Charset = null; + } + else + { + Charset = value.WebName; + } + } + } + + public string Boundary + { + get + { + return NameValueHeaderValue.Find(_parameters, BoundaryString)?.Value; + } + set + { + var boundaryParameter = NameValueHeaderValue.Find(_parameters, BoundaryString); + if (string.IsNullOrEmpty(value)) + { + // Remove charset parameter + if (boundaryParameter != null) + { + _parameters.Remove(boundaryParameter); + } + } + else + { + if (boundaryParameter != null) + { + boundaryParameter.Value = value; + } + else + { + Parameters.Add(new NameValueHeaderValue(BoundaryString, value)); + } + } + } + } + + public ICollection Parameters + { + get + { + if (_parameters == null) + { + _parameters = new ObjectCollection(); + } + return _parameters; + } + } + + public double? Quality + { + get { return HeaderUtilities.GetQuality(Parameters); } + set { HeaderUtilities.SetQuality(Parameters, value); } + } + + public string MediaType + { + get { return _mediaType; } + set + { + CheckMediaTypeFormat(value, "value"); + _mediaType = value; + } + } + + public string Type + { + get + { + return _mediaType.Substring(0, _mediaType.IndexOf('/')); + } + } + + public string SubType + { + get + { + return _mediaType.Substring(_mediaType.IndexOf('/') + 1); + } + } + + /// + /// MediaType = "*/*" + /// + public bool MatchesAllTypes + { + get + { + return MediaType.Equals("*/*", StringComparison.Ordinal); + } + } + + /// + /// SubType = "*" + /// + public bool MatchesAllSubTypes + { + get + { + return SubType.Equals("*", StringComparison.Ordinal); + } + } + + public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType) + { + if (otherMediaType == null) + { + return false; + } + + if (!Type.Equals(otherMediaType.Type, StringComparison.OrdinalIgnoreCase)) + { + if (!otherMediaType.MatchesAllTypes) + { + return false; + } + } + else if (!SubType.Equals(otherMediaType.SubType, StringComparison.OrdinalIgnoreCase)) + { + if (!otherMediaType.MatchesAllSubTypes) + { + return false; + } + } + + if (Parameters != null) + { + if (Parameters.Count != 0 && (otherMediaType.Parameters == null || otherMediaType.Parameters.Count == 0)) + { + return false; + } + + // Make sure all parameters listed locally are listed in the other one. The other one may have additional parameters. + foreach (var param in _parameters) + { + var otherParam = NameValueHeaderValue.Find(otherMediaType._parameters, param.Name); + if (otherParam == null) + { + return false; + } + if (!string.Equals(param.Value, otherParam.Value, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + } + } + + return true; + } + + public override string ToString() + { + return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); + } + + public override bool Equals(object obj) + { + var other = obj as MediaTypeHeaderValue; + + if (other == null) + { + return false; + } + + return (string.Compare(_mediaType, other._mediaType, StringComparison.OrdinalIgnoreCase) == 0) && + HeaderUtilities.AreEqualCollections(_parameters, other._parameters); + } + + public override int GetHashCode() + { + // The media-type string is case-insensitive. + return StringComparer.OrdinalIgnoreCase.GetHashCode(_mediaType) ^ NameValueHeaderValue.GetHashCode(_parameters); + } + + public static MediaTypeHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out MediaTypeHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + private static int GetMediaTypeLength(string input, int startIndex, out MediaTypeHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + string mediaType = null; + var mediaTypeLength = MediaTypeHeaderValue.GetMediaTypeExpressionLength(input, startIndex, out mediaType); + + if (mediaTypeLength == 0) + { + return 0; + } + + var current = startIndex + mediaTypeLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + MediaTypeHeaderValue mediaTypeHeader = null; + + // If we're not done and we have a parameter delimiter, then we have a list of parameters. + if ((current < input.Length) && (input[current] == ';')) + { + mediaTypeHeader = new MediaTypeHeaderValue(); + mediaTypeHeader._mediaType = mediaType; + + current++; // skip delimiter. + var parameterLength = NameValueHeaderValue.GetNameValueListLength(input, current, ';', + mediaTypeHeader.Parameters); + + parsedValue = mediaTypeHeader; + return current + parameterLength - startIndex; + } + + // We have a media type without parameters. + mediaTypeHeader = new MediaTypeHeaderValue(); + mediaTypeHeader._mediaType = mediaType; + parsedValue = mediaTypeHeader; + return current - startIndex; + } + + private static int GetMediaTypeExpressionLength(string input, int startIndex, out string mediaType) + { + Contract.Requires((input != null) && (input.Length > 0) && (startIndex < input.Length)); + + // This method just parses the "type/subtype" string, it does not parse parameters. + mediaType = null; + + // Parse the type, i.e. in media type string "/; param1=value1; param2=value2" + var typeLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (typeLength == 0) + { + return 0; + } + + var current = startIndex + typeLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the separator between type and subtype + if ((current >= input.Length) || (input[current] != '/')) + { + return 0; + } + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the subtype, i.e. in media type string "/; param1=value1; param2=value2" + var subtypeLength = HttpRuleParser.GetTokenLength(input, current); + + if (subtypeLength == 0) + { + return 0; + } + + // If there are no whitespaces between and in / get the media type using + // one Substring call. Otherwise get substrings for and and combine them. + var mediatTypeLength = current + subtypeLength - startIndex; + if (typeLength + subtypeLength + 1 == mediatTypeLength) + { + mediaType = input.Substring(startIndex, mediatTypeLength); + } + else + { + mediaType = input.Substring(startIndex, typeLength) + "/" + input.Substring(current, subtypeLength); + } + + return mediatTypeLength; + } + + private static void CheckMediaTypeFormat(string mediaType, string parameterName) + { + if (string.IsNullOrEmpty(mediaType)) + { + throw new ArgumentException("An empty string is not allowed.", parameterName); + } + + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + // Also no LWS between type and subtype are allowed. + string tempMediaType; + var mediaTypeLength = GetMediaTypeExpressionLength(mediaType, 0, out tempMediaType); + if ((mediaTypeLength == 0) || (tempMediaType.Length != mediaType.Length)) + { + throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid media type '{0}'.", mediaType)); + } + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs new file mode 100644 index 0000000000..0125b2dbc4 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -0,0 +1,100 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Net.Http.Headers +{ + /// + /// Implementation of that can compare accept media type header fields + /// based on their quality values (a.k.a q-values). + /// + public class MediaTypeHeaderValueComparer : IComparer + { + private static readonly MediaTypeHeaderValueComparer _mediaTypeComparer = + new MediaTypeHeaderValueComparer(); + + private MediaTypeHeaderValueComparer() + { + } + + public static MediaTypeHeaderValueComparer QualityComparer + { + get { return _mediaTypeComparer; } + } + + /// + /// + /// Performs comparisons based on the arguments' quality values + /// (aka their "q-value"). Values with identical q-values are considered equal (i.e. the result is 0) + /// with the exception that subtype wildcards are considered less than specific media types and full + /// wildcards are considered less than subtype wildcards. This allows callers to sort a sequence of + /// following their q-values in the order of specific + /// media types, subtype wildcards, and last any full wildcards. + /// + public int Compare(MediaTypeHeaderValue mediaType1, MediaTypeHeaderValue mediaType2) + { + if (object.ReferenceEquals(mediaType1, mediaType2)) + { + return 0; + } + + var returnValue = CompareBasedOnQualityFactor(mediaType1, mediaType2); + + if (returnValue == 0) + { + if (!mediaType1.Type.Equals(mediaType2.Type, StringComparison.OrdinalIgnoreCase)) + { + if (mediaType1.MatchesAllTypes) + { + return -1; + } + else if (mediaType2.MatchesAllTypes) + { + return 1; + } + else if (mediaType1.MatchesAllSubTypes && !mediaType2.MatchesAllSubTypes) + { + return -1; + } + else if (!mediaType1.MatchesAllSubTypes && mediaType2.MatchesAllSubTypes) + { + return 1; + } + } + else if (!mediaType1.SubType.Equals(mediaType2.SubType, StringComparison.OrdinalIgnoreCase)) + { + if (mediaType1.MatchesAllSubTypes) + { + return -1; + } + else if (mediaType2.MatchesAllSubTypes) + { + return 1; + } + } + } + + return returnValue; + } + + private static int CompareBasedOnQualityFactor(MediaTypeHeaderValue mediaType1, + MediaTypeHeaderValue mediaType2) + { + var mediaType1Quality = mediaType1.Quality ?? HeaderQuality.Match; + var mediaType2Quality = mediaType2.Quality ?? HeaderQuality.Match; + var qualityDifference = mediaType1Quality - mediaType2Quality; + if (qualityDifference < 0) + { + return -1; + } + else if (qualityDifference > 0) + { + return 1; + } + + return 0; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj new file mode 100644 index 0000000000..f6e3ec7676 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj @@ -0,0 +1,23 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 60aa2fdb-8121-4826-8d00-9a143fefaf66 + Microsoft.Net.Http.Headers + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + + + \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs new file mode 100644 index 0000000000..fc943f7822 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -0,0 +1,347 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // According to the RFC, in places where a "parameter" is required, the value is mandatory + // (e.g. Media-Type, Accept). However, we don't introduce a dedicated type for it. So NameValueHeaderValue supports + // name-only values in addition to name/value pairs. + public class NameValueHeaderValue + { + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetNameValueLength); + internal static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetNameValueLength); + + private string _name; + private string _value; + + private NameValueHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public NameValueHeaderValue(string name) + : this(name, null) + { + } + + public NameValueHeaderValue(string name, string value) + { + CheckNameValueFormat(name, value); + + _name = name; + _value = value; + } + + public string Name + { + get { return _name; } + } + + public string Value + { + get { return _value; } + set + { + CheckValueFormat(value); + _value = value; + } + } + + public override int GetHashCode() + { + Contract.Assert(_name != null); + + var nameHashCode = StringComparer.OrdinalIgnoreCase.GetHashCode(_name); + + if (!string.IsNullOrEmpty(_value)) + { + // If we have a quoted-string, then just use the hash code. If we have a token, convert to lowercase + // and retrieve the hash code. + if (_value[0] == '"') + { + return nameHashCode ^ _value.GetHashCode(); + } + + return nameHashCode ^ StringComparer.OrdinalIgnoreCase.GetHashCode(_value); + } + + return nameHashCode; + } + + public override bool Equals(object obj) + { + var other = obj as NameValueHeaderValue; + + if (other == null) + { + return false; + } + + if (string.Compare(_name, other._name, StringComparison.OrdinalIgnoreCase) != 0) + { + return false; + } + + // RFC2616: 14.20: unquoted tokens should use case-INsensitive comparison; quoted-strings should use + // case-sensitive comparison. The RFC doesn't mention how to compare quoted-strings outside the "Expect" + // header. We treat all quoted-strings the same: case-sensitive comparison. + + if (string.IsNullOrEmpty(_value)) + { + return string.IsNullOrEmpty(other._value); + } + + if (_value[0] == '"') + { + // We have a quoted string, so we need to do case-sensitive comparison. + return (string.CompareOrdinal(_value, other._value) == 0); + } + else + { + return (string.Compare(_value, other._value, StringComparison.OrdinalIgnoreCase) == 0); + } + } + + public static NameValueHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out NameValueHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList input) + { + return MultipleValueParser.ParseValues(input); + } + + public static bool TryParseList(IList input, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(input, out parsedValues); + } + + public override string ToString() + { + if (!string.IsNullOrEmpty(_value)) + { + return _name + "=" + _value; + } + return _name; + } + + internal static void ToString(ICollection values, char separator, bool leadingSeparator, + StringBuilder destination) + { + Contract.Assert(destination != null); + + if ((values == null) || (values.Count == 0)) + { + return; + } + + foreach (var value in values) + { + if (leadingSeparator || (destination.Length > 0)) + { + destination.Append(separator); + destination.Append(' '); + } + destination.Append(value.ToString()); + } + } + + internal static string ToString(ICollection values, char separator, bool leadingSeparator) + { + if ((values == null) || (values.Count == 0)) + { + return null; + } + + var sb = new StringBuilder(); + + ToString(values, separator, leadingSeparator, sb); + + return sb.ToString(); + } + + internal static int GetHashCode(ICollection values) + { + if ((values == null) || (values.Count == 0)) + { + return 0; + } + + var result = 0; + foreach (var value in values) + { + result = result ^ value.GetHashCode(); + } + return result; + } + + private static int GetNameValueLength(string input, int startIndex, out NameValueHeaderValue parsedValue) + { + Contract.Requires(input != null); + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the name, i.e. in name/value string "=". Caller must remove + // leading whitespaces. + var nameLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (nameLength == 0) + { + return 0; + } + + var name = input.Substring(startIndex, nameLength); + var current = startIndex + nameLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the separator between name and value + if ((current == input.Length) || (input[current] != '=')) + { + // We only have a name and that's OK. Return. + parsedValue = new NameValueHeaderValue(); + parsedValue._name = name; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces + return current - startIndex; + } + + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Parse the value, i.e. in name/value string "=" + int valueLength = GetValueLength(input, current); + + // Value after the '=' may be empty + // Use parameterless ctor to avoid double-parsing of name and value, i.e. skip public ctor validation. + parsedValue = new NameValueHeaderValue(); + parsedValue._name = name; + parsedValue._value = input.Substring(current, valueLength); + current = current + valueLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); // skip whitespaces + return current - startIndex; + } + + // Returns the length of a name/value list, separated by 'delimiter'. E.g. "a=b, c=d, e=f" adds 3 + // name/value pairs to 'nameValueCollection' if 'delimiter' equals ','. + internal static int GetNameValueListLength(string input, int startIndex, char delimiter, + ICollection nameValueCollection) + { + Contract.Requires(nameValueCollection != null); + Contract.Requires(startIndex >= 0); + + if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) + { + return 0; + } + + var current = startIndex + HttpRuleParser.GetWhitespaceLength(input, startIndex); + while (true) + { + NameValueHeaderValue parameter = null; + var nameValueLength = GetNameValueLength(input, current, out parameter); + + if (nameValueLength == 0) + { + // There may be a trailing ';' + return current - startIndex; + } + + nameValueCollection.Add(parameter); + current = current + nameValueLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if ((current == input.Length) || (input[current] != delimiter)) + { + // We're done and we have at least one valid name/value pair. + return current - startIndex; + } + + // input[current] is 'delimiter'. Skip the delimiter and whitespaces and try to parse again. + current++; // skip delimiter. + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + } + + public static NameValueHeaderValue Find(ICollection values, string name) + { + Contract.Requires((name != null) && (name.Length > 0)); + + if ((values == null) || (values.Count == 0)) + { + return null; + } + + foreach (var value in values) + { + if (string.Compare(value.Name, name, StringComparison.OrdinalIgnoreCase) == 0) + { + return value; + } + } + return null; + } + + internal static int GetValueLength(string input, int startIndex) + { + Contract.Requires(input != null); + + if (startIndex >= input.Length) + { + return 0; + } + + var valueLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (valueLength == 0) + { + // A value can either be a token or a quoted string. Check if it is a quoted string. + if (HttpRuleParser.GetQuotedStringLength(input, startIndex, out valueLength) != HttpParseResult.Parsed) + { + // We have an invalid value. Reset the name and return. + return 0; + } + } + return valueLength; + } + + private static void CheckNameValueFormat(string name, string value) + { + HeaderUtilities.CheckValidToken(name, "name"); + CheckValueFormat(value); + } + + private static void CheckValueFormat(string value) + { + // Either value is null/empty or a valid token/quoted string + if (!(string.IsNullOrEmpty(value) || (GetValueLength(value, 0) == value.Length))) + { + throw new FormatException(string.Format(System.Globalization.CultureInfo.InvariantCulture, "The header value is invalid: '{0}'", value)); + } + } + + private static NameValueHeaderValue CreateNameValue() + { + return new NameValueHeaderValue(); + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs b/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs new file mode 100644 index 0000000000..a725ce11fe --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Net.Http.Headers +{ + [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] + internal sealed class NotNullAttribute : Attribute + { + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs new file mode 100644 index 0000000000..f6746df140 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -0,0 +1,56 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.ObjectModel; + +namespace Microsoft.Net.Http.Headers +{ + // List allows 'null' values to be added. This is not what we want so we use a custom Collection derived + // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition + // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). + // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. + internal class ObjectCollection : Collection where T : class + { + private static readonly Action DefaultValidator = CheckNotNull; + + private Action _validator; + + public ObjectCollection() + : this(DefaultValidator) + { + } + + public ObjectCollection(Action validator) + { + _validator = validator; + } + + protected override void InsertItem(int index, T item) + { + if (_validator != null) + { + _validator(item); + } + base.InsertItem(index, item); + } + + protected override void SetItem(int index, T item) + { + if (_validator != null) + { + _validator(item); + } + base.SetItem(index, item); + } + + private static void CheckNotNull(T item) + { + // null values cannot be added to the collection. + if (item == null) + { + throw new ArgumentNullException("item"); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs new file mode 100644 index 0000000000..65f976a21c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -0,0 +1,166 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics.Contracts; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeConditionHeaderValue + { + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetRangeConditionLength); + + private DateTimeOffset? _lastModified; + private EntityTagHeaderValue _entityTag; + + private RangeConditionHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public RangeConditionHeaderValue(DateTimeOffset lastModified) + { + _lastModified = lastModified; + } + + public RangeConditionHeaderValue(EntityTagHeaderValue entityTag) + { + if (entityTag == null) + { + throw new ArgumentNullException("entityTag"); + } + + _entityTag = entityTag; + } + + public RangeConditionHeaderValue(string entityTag) + : this(new EntityTagHeaderValue(entityTag)) + { + } + + public DateTimeOffset? LastModified + { + get { return _lastModified; } + } + + public EntityTagHeaderValue EntityTag + { + get { return _entityTag; } + } + + public override string ToString() + { + if (_entityTag == null) + { + return HttpRuleParser.DateToString(_lastModified.Value); + } + return _entityTag.ToString(); + } + + public override bool Equals(object obj) + { + var other = obj as RangeConditionHeaderValue; + + if (other == null) + { + return false; + } + + if (_entityTag == null) + { + return (other._lastModified != null) && (_lastModified.Value == other._lastModified.Value); + } + + return _entityTag.Equals(other._entityTag); + } + + public override int GetHashCode() + { + if (_entityTag == null) + { + return _lastModified.Value.GetHashCode(); + } + + return _entityTag.GetHashCode(); + } + + public static RangeConditionHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out RangeConditionHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetRangeConditionLength(string input, int startIndex, out RangeConditionHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + // Make sure we have at least 2 characters + if (string.IsNullOrEmpty(input) || (startIndex + 1 >= input.Length)) + { + return 0; + } + + var current = startIndex; + + // Caller must remove leading whitespaces. + DateTimeOffset date = DateTimeOffset.MinValue; + EntityTagHeaderValue entityTag = null; + + // Entity tags are quoted strings optionally preceded by "W/". By looking at the first two character we + // can determine whether the string is en entity tag or a date. + var firstChar = input[current]; + var secondChar = input[current + 1]; + + if ((firstChar == '\"') || (((firstChar == 'w') || (firstChar == 'W')) && (secondChar == '/'))) + { + // trailing whitespaces are removed by GetEntityTagLength() + var entityTagLength = EntityTagHeaderValue.GetEntityTagLength(input, current, out entityTag); + + if (entityTagLength == 0) + { + return 0; + } + + current = current + entityTagLength; + + // RangeConditionHeaderValue only allows 1 value. There must be no delimiter/other chars after an + // entity tag. + if (current != input.Length) + { + return 0; + } + } + else + { + if (!HttpRuleParser.TryStringToDate(input.Substring(current), out date)) + { + return 0; + } + + // If we got a valid date, then the parser consumed the whole string (incl. trailing whitespaces). + current = input.Length; + } + + parsedValue = new RangeConditionHeaderValue(); + if (entityTag == null) + { + parsedValue._lastModified = date; + } + else + { + parsedValue._entityTag = entityTag; + } + + return current - startIndex; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs new file mode 100644 index 0000000000..3045a8b387 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -0,0 +1,161 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeHeaderValue + { + private static readonly HttpHeaderParser Parser + = new GenericHeaderParser(false, GetRangeLength); + + private string _unit; + private ICollection _ranges; + + public RangeHeaderValue() + { + _unit = HeaderUtilities.BytesUnit; + } + + public RangeHeaderValue(long? from, long? to) + { + // convenience ctor: "Range: bytes=from-to" + _unit = HeaderUtilities.BytesUnit; + Ranges.Add(new RangeItemHeaderValue(from, to)); + } + + public string Unit + { + get { return _unit; } + set + { + HeaderUtilities.CheckValidToken(value, "value"); + _unit = value; + } + } + + public ICollection Ranges + { + get + { + if (_ranges == null) + { + _ranges = new ObjectCollection(); + } + return _ranges; + } + } + + public override string ToString() + { + var sb = new StringBuilder(_unit); + sb.Append('='); + + var first = true; + foreach (var range in Ranges) + { + if (first) + { + first = false; + } + else + { + sb.Append(", "); + } + + sb.Append(range.From); + sb.Append('-'); + sb.Append(range.To); + } + + return sb.ToString(); + } + + public override bool Equals(object obj) + { + var other = obj as RangeHeaderValue; + + if (other == null) + { + return false; + } + + return (string.Compare(_unit, other._unit, StringComparison.OrdinalIgnoreCase) == 0) && + HeaderUtilities.AreEqualCollections(Ranges, other.Ranges); + } + + public override int GetHashCode() + { + var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_unit); + + foreach (var range in Ranges) + { + result = result ^ range.GetHashCode(); + } + + return result; + } + + public static RangeHeaderValue Parse(string input) + { + var index = 0; + return Parser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out RangeHeaderValue parsedValue) + { + var index = 0; + return Parser.TryParseValue(input, ref index, out parsedValue); + } + + private static int GetRangeLength(string input, int startIndex, out RangeHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the unit string: in '=-, -' + var unitLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (unitLength == 0) + { + return 0; + } + + RangeHeaderValue result = new RangeHeaderValue(); + result._unit = input.Substring(startIndex, unitLength); + var current = startIndex + unitLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if ((current == input.Length) || (input[current] != '=')) + { + return 0; + } + + current++; // skip '=' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + var rangesLength = RangeItemHeaderValue.GetRangeItemListLength(input, current, result.Ranges); + + if (rangesLength == 0) + { + return 0; + } + + current = current + rangesLength; + Contract.Assert(current == input.Length, "GetRangeItemListLength() should consume the whole string or fail."); + + parsedValue = result; + return current - startIndex; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs new file mode 100644 index 0000000000..21c46f004c --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -0,0 +1,226 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeItemHeaderValue + { + private long? _from; + private long? _to; + + public RangeItemHeaderValue(long? from, long? to) + { + if (!from.HasValue && !to.HasValue) + { + throw new ArgumentException("Invalid header range."); + } + if (from.HasValue && (from.Value < 0)) + { + throw new ArgumentOutOfRangeException("from"); + } + if (to.HasValue && (to.Value < 0)) + { + throw new ArgumentOutOfRangeException("to"); + } + if (from.HasValue && to.HasValue && (from.Value > to.Value)) + { + throw new ArgumentOutOfRangeException("from"); + } + + _from = from; + _to = to; + } + + public long? From + { + get { return _from; } + } + + public long? To + { + get { return _to; } + } + + public override string ToString() + { + if (!_from.HasValue) + { + return "-" + _to.Value.ToString(NumberFormatInfo.InvariantInfo); + } + else if (!_to.HasValue) + { + return _from.Value.ToString(NumberFormatInfo.InvariantInfo) + "-"; + } + return _from.Value.ToString(NumberFormatInfo.InvariantInfo) + "-" + + _to.Value.ToString(NumberFormatInfo.InvariantInfo); + } + + public override bool Equals(object obj) + { + var other = obj as RangeItemHeaderValue; + + if (other == null) + { + return false; + } + return ((_from == other._from) && (_to == other._to)); + } + + public override int GetHashCode() + { + if (!_from.HasValue) + { + return _to.GetHashCode(); + } + else if (!_to.HasValue) + { + return _from.GetHashCode(); + } + return _from.GetHashCode() ^ _to.GetHashCode(); + } + + // Returns the length of a range list. E.g. "1-2, 3-4, 5-6" adds 3 ranges to 'rangeCollection'. Note that empty + // list segments are allowed, e.g. ",1-2, , 3-4,,". + internal static int GetRangeItemListLength(string input, int startIndex, + ICollection rangeCollection) + { + Contract.Requires(rangeCollection != null); + Contract.Requires(startIndex >= 0); + Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), + "If we can parse the string, then we expect to have at least one range item."); + + if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) + { + return 0; + } + + // Empty segments are allowed, so skip all delimiter-only segments (e.g. ", ,"). + var separatorFound = false; + var current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(input, startIndex, true, out separatorFound); + // It's OK if we didn't find leading separator characters. Ignore 'separatorFound'. + + if (current == input.Length) + { + return 0; + } + + RangeItemHeaderValue range = null; + while (true) + { + var rangeLength = GetRangeItemLength(input, current, out range); + + if (rangeLength == 0) + { + return 0; + } + + rangeCollection.Add(range); + + current = current + rangeLength; + current = HeaderUtilities.GetNextNonEmptyOrWhitespaceIndex(input, current, true, out separatorFound); + + // If the string is not consumed, we must have a delimiter, otherwise the string is not a valid + // range list. + if ((current < input.Length) && !separatorFound) + { + return 0; + } + + if (current == input.Length) + { + return current - startIndex; + } + } + } + + internal static int GetRangeItemLength(string input, int startIndex, out RangeItemHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + // This parser parses number ranges: e.g. '1-2', '1-', '-2'. + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Caller must remove leading whitespaces. If not, we'll return 0. + var current = startIndex; + + // Try parse the first value of a value pair. + var fromStartIndex = current; + var fromLength = HttpRuleParser.GetNumberLength(input, current, false); + + if (fromLength > HttpRuleParser.MaxInt64Digits) + { + return 0; + } + + current = current + fromLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // Afer the first value, the '-' character must follow. + if ((current == input.Length) || (input[current] != '-')) + { + // We need a '-' character otherwise this can't be a valid range. + return 0; + } + + current++; // skip the '-' character + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + var toStartIndex = current; + var toLength = 0; + + // If we didn't reach the end of the string, try parse the second value of the range. + if (current < input.Length) + { + toLength = HttpRuleParser.GetNumberLength(input, current, false); + + if (toLength > HttpRuleParser.MaxInt64Digits) + { + return 0; + } + + current = current + toLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + } + + if ((fromLength == 0) && (toLength == 0)) + { + return 0; // At least one value must be provided in order to be a valid range. + } + + // Try convert first value to int64 + long from = 0; + if ((fromLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(fromStartIndex, fromLength), out from)) + { + return 0; + } + + // Try convert second value to int64 + long to = 0; + if ((toLength > 0) && !HeaderUtilities.TryParseInt64(input.Substring(toStartIndex, toLength), out to)) + { + return 0; + } + + // 'from' must not be greater than 'to' + if ((fromLength > 0) && (toLength > 0) && (from > to)) + { + return 0; + } + + parsedValue = new RangeItemHeaderValue((fromLength == 0 ? (long?)null : (long?)from), + (toLength == 0 ? (long?)null : (long?)to)); + return current - startIndex; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs new file mode 100644 index 0000000000..3556454156 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -0,0 +1,364 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Text; + +namespace Microsoft.Net.Http.Headers +{ + // http://tools.ietf.org/html/rfc6265 + public class SetCookieHeaderValue + { + private const string ExpiresToken = "expires"; + private const string MaxAgeToken = "max-age"; + private const string DomainToken = "domain"; + private const string PathToken = "path"; + private const string SecureToken = "secure"; + private const string HttpOnlyToken = "httponly"; + private const string DefaultPath = "/"; // TODO: Used? + + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetSetCookieLength); + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetSetCookieLength); + + private string _name; + private string _value; + + private SetCookieHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public SetCookieHeaderValue([NotNull] string name) + : this(name, string.Empty) + { + } + + public SetCookieHeaderValue([NotNull] string name, [NotNull] string value) + { + Name = name; + Value = value; + } + + public string Name + { + get { return _name; } + set + { + CookieHeaderValue.CheckNameFormat(value, "name"); + _name = value; + } + } + + public string Value + { + get { return _value; } + set + { + CookieHeaderValue.CheckValueFormat(value, "value"); + _value = value; + } + } + + public DateTimeOffset? Expires { get; set; } + + public TimeSpan? MaxAge { get; set; } + + public string Domain { get; set; } + + // TODO: PathString? + public string Path { get; set; } + + public bool Secure { get; set; } + + public bool HttpOnly { get; set; } + + // name="val ue"; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly + public override string ToString() + { + StringBuilder header = new StringBuilder(); + + header.Append(_name); + header.Append("="); + header.Append(_value); + + if (Expires.HasValue) + { + AppendSegment(header, ExpiresToken, HeaderUtilities.FormatDate(Expires.Value)); + } + + if (MaxAge.HasValue) + { + AppendSegment(header, MaxAgeToken, HeaderUtilities.FormatInt64((long)MaxAge.Value.TotalSeconds)); + } + + if (Domain != null) + { + AppendSegment(header, DomainToken, Domain); + } + + if (Path != null) + { + AppendSegment(header, PathToken, Path); + } + + if (Secure) + { + AppendSegment(header, SecureToken, null); + } + + if (HttpOnly) + { + AppendSegment(header, HttpOnlyToken, null); + } + + return header.ToString(); + } + + private static void AppendSegment(StringBuilder builder, string name, string value) + { + builder.Append("; "); + builder.Append(name); + if (value != null) + { + builder.Append("="); + builder.Append(value); + } + } + + public static SetCookieHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out SetCookieHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList inputs) + { + return MultipleValueParser.ParseValues(inputs); + } + + public static bool TryParseList(IList inputs, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(inputs, out parsedValues); + } + + // name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly + private static int GetSetCookieLength(string input, int startIndex, out SetCookieHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + var offset = startIndex; + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (offset >= input.Length)) + { + return 0; + } + + var result = new SetCookieHeaderValue(); + + // The caller should have already consumed any leading whitespace, commas, etc.. + + // Name=value; + + // Name + var itemLength = HttpRuleParser.GetTokenLength(input, offset); + if (itemLength == 0) + { + return 0; + } + result._name = input.Substring(offset, itemLength); + offset += itemLength; + + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + + string value; + // value or "quoted value" + itemLength = CookieHeaderValue.GetCookieValueLength(input, offset, out value); + // The value may be empty + result._value = input.Substring(offset, itemLength); + offset += itemLength; + + // *(';' SP cookie-av) + while (offset < input.Length) + { + if (input[offset] == ',') + { + // Divider between headers + break; + } + if (input[offset] != ';') + { + // Expecting a ';' between parameters + return 0; + } + offset++; + + offset += HttpRuleParser.GetWhitespaceLength(input, offset); + + // cookie-av = expires-av / max-age-av / domain-av / path-av / secure-av / httponly-av / extension-av + itemLength = HttpRuleParser.GetTokenLength(input, offset); + if (itemLength == 0) + { + // Trailing ';' or leading into garbage. Let the next parser fail. + break; + } + var token = input.Substring(offset, itemLength); + offset += itemLength; + + // expires-av = "Expires=" sane-cookie-date + if (string.Equals(token, ExpiresToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + var dateString = ReadToSemicolonOrEnd(input, ref offset); + DateTimeOffset expirationDate; + if (!HttpRuleParser.TryStringToDate(dateString, out expirationDate)) + { + // Invalid expiration date, abort + return 0; + } + result.Expires = expirationDate; + } + // max-age-av = "Max-Age=" non-zero-digit *DIGIT + else if (string.Equals(token, MaxAgeToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + + itemLength = HttpRuleParser.GetNumberLength(input, offset, allowDecimal: false); + if (itemLength == 0) + { + return 0; + } + var numberString = input.Substring(offset, itemLength); + long maxAge; + if (!HeaderUtilities.TryParseInt64(numberString, out maxAge)) + { + // Invalid expiration date, abort + return 0; + } + result.MaxAge = TimeSpan.FromSeconds(maxAge); + offset += itemLength; + } + // domain-av = "Domain=" domain-value + // domain-value = ; defined in [RFC1034], Section 3.5, as enhanced by [RFC1123], Section 2.1 + else if (string.Equals(token, DomainToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + // We don't do any detailed validation on the domain. + result.Domain = ReadToSemicolonOrEnd(input, ref offset); + } + // path-av = "Path=" path-value + // path-value = + else if (string.Equals(token, PathToken, StringComparison.OrdinalIgnoreCase)) + { + // = (no spaces) + if (!ReadEqualsSign(input, ref offset)) + { + return 0; + } + // We don't do any detailed validation on the path. + result.Path = ReadToSemicolonOrEnd(input, ref offset); + } + // secure-av = "Secure" + else if (string.Equals(token, SecureToken, StringComparison.OrdinalIgnoreCase)) + { + result.Secure = true; + } + // httponly-av = "HttpOnly" + else if (string.Equals(token, HttpOnlyToken, StringComparison.OrdinalIgnoreCase)) + { + result.HttpOnly = true; + } + // extension-av = + else + { + // TODO: skip it? Store it in a list? + } + } + + parsedValue = result; + return offset - startIndex; + } + + private static bool ReadEqualsSign(string input, ref int offset) + { + // = (no spaces) + if (offset >= input.Length || input[offset] != '=') + { + return false; + } + offset++; + return true; + } + + private static string ReadToSemicolonOrEnd(string input, ref int offset) + { + var end = input.IndexOf(';', offset); + if (end < 0) + { + // Remainder of the string + end = input.Length; + } + var itemLength = end - offset; + var result = input.Substring(offset, itemLength); + offset += itemLength; + return result; + } + + public override bool Equals(object obj) + { + var other = obj as SetCookieHeaderValue; + + if (other == null) + { + return false; + } + + return string.Equals(_name, other._name, StringComparison.OrdinalIgnoreCase) + && string.Equals(_value, other._value, StringComparison.OrdinalIgnoreCase) + && Expires.Equals(other.Expires) + && MaxAge.Equals(other.MaxAge) + && string.Equals(Domain, other.Domain, StringComparison.OrdinalIgnoreCase) + && string.Equals(Path, other.Path, StringComparison.OrdinalIgnoreCase) + && Secure == other.Secure + && HttpOnly == other.HttpOnly; + } + + public override int GetHashCode() + { + return StringComparer.OrdinalIgnoreCase.GetHashCode(_name) + ^ StringComparer.OrdinalIgnoreCase.GetHashCode(_value) + ^ (Expires.HasValue ? Expires.GetHashCode() : 0) + ^ (MaxAge.HasValue ? MaxAge.GetHashCode() : 0) + ^ (Domain != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Domain) : 0) + ^ (Path != null ? StringComparer.OrdinalIgnoreCase.GetHashCode(Path) : 0) + ^ Secure.GetHashCode() + ^ HttpOnly.GetHashCode(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs new file mode 100644 index 0000000000..41cacc9380 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -0,0 +1,225 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics.Contracts; +using System.Globalization; + +namespace Microsoft.Net.Http.Headers +{ + public class StringWithQualityHeaderValue + { + private static readonly HttpHeaderParser SingleValueParser + = new GenericHeaderParser(false, GetStringWithQualityLength); + private static readonly HttpHeaderParser MultipleValueParser + = new GenericHeaderParser(true, GetStringWithQualityLength); + + private string _value; + private double? _quality; + + private StringWithQualityHeaderValue() + { + // Used by the parser to create a new instance of this type. + } + + public StringWithQualityHeaderValue(string value) + { + HeaderUtilities.CheckValidToken(value, "value"); + + _value = value; + } + + public StringWithQualityHeaderValue(string value, double quality) + { + HeaderUtilities.CheckValidToken(value, "value"); + + if ((quality < 0) || (quality > 1)) + { + throw new ArgumentOutOfRangeException("quality"); + } + + _value = value; + _quality = quality; + } + + public string Value + { + get { return _value; } + } + + public double? Quality + { + get { return _quality; } + } + + public override string ToString() + { + if (_quality.HasValue) + { + return _value + "; q=" + _quality.Value.ToString("0.0##", NumberFormatInfo.InvariantInfo); + } + + return _value; + } + + public override bool Equals(object obj) + { + var other = obj as StringWithQualityHeaderValue; + + if (other == null) + { + return false; + } + + if (string.Compare(_value, other._value, StringComparison.OrdinalIgnoreCase) != 0) + { + return false; + } + + if (_quality.HasValue) + { + // Note that we don't consider double.Epsilon here. We really consider two values equal if they're + // actually equal. This makes sure that we also get the same hashcode for two values considered equal + // by Equals(). + return other._quality.HasValue && (_quality.Value == other._quality.Value); + } + + // If we don't have a quality value, then 'other' must also have no quality assigned in order to be + // considered equal. + return !other._quality.HasValue; + } + + public override int GetHashCode() + { + var result = StringComparer.OrdinalIgnoreCase.GetHashCode(_value); + + if (_quality.HasValue) + { + result = result ^ _quality.Value.GetHashCode(); + } + + return result; + } + + public static StringWithQualityHeaderValue Parse(string input) + { + var index = 0; + return SingleValueParser.ParseValue(input, ref index); + } + + public static bool TryParse(string input, out StringWithQualityHeaderValue parsedValue) + { + var index = 0; + return SingleValueParser.TryParseValue(input, ref index, out parsedValue); + } + + public static IList ParseList(IList input) + { + return MultipleValueParser.ParseValues(input); + } + + public static bool TryParseList(IList input, out IList parsedValues) + { + return MultipleValueParser.TryParseValues(input, out parsedValues); + } + + private static int GetStringWithQualityLength(string input, int startIndex, out StringWithQualityHeaderValue parsedValue) + { + Contract.Requires(startIndex >= 0); + + parsedValue = null; + + if (string.IsNullOrEmpty(input) || (startIndex >= input.Length)) + { + return 0; + } + + // Parse the value string: in '; q=' + var valueLength = HttpRuleParser.GetTokenLength(input, startIndex); + + if (valueLength == 0) + { + return 0; + } + + StringWithQualityHeaderValue result = new StringWithQualityHeaderValue(); + result._value = input.Substring(startIndex, valueLength); + var current = startIndex + valueLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if ((current == input.Length) || (input[current] != ';')) + { + parsedValue = result; + return current - startIndex; // we have a valid token, but no quality. + } + + current++; // skip ';' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // If we found a ';' separator, it must be followed by a quality information + if (!TryReadQuality(input, result, ref current)) + { + return 0; + } + + parsedValue = result; + return current - startIndex; + } + + private static bool TryReadQuality(string input, StringWithQualityHeaderValue result, ref int index) + { + var current = index; + + // See if we have a quality value by looking for "q" + if ((current == input.Length) || ((input[current] != 'q') && (input[current] != 'Q'))) + { + return false; + } + + current++; // skip 'q' identifier + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + // If we found "q" it must be followed by "=" + if ((current == input.Length) || (input[current] != '=')) + { + return false; + } + + current++; // skip '=' separator + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + if (current == input.Length) + { + return false; + } + + int qualityLength = HttpRuleParser.GetNumberLength(input, current, true); + + if (qualityLength == 0) + { + return false; + } + + double quality; + if (!double.TryParse(input.Substring(current, qualityLength), NumberStyles.AllowDecimalPoint, + NumberFormatInfo.InvariantInfo, out quality)) + { + return false; + } + + if ((quality < 0) || (quality > 1)) + { + return false; + } + + result._quality = quality; + + current = current + qualityLength; + current = current + HttpRuleParser.GetWhitespaceLength(input, current); + + index = current; + return true; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs new file mode 100644 index 0000000000..d7a3def9e1 --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Net.Http.Headers +{ + /// + /// Implementation of that can compare content negotiation header fields + /// based on their quality values (a.k.a q-values). This applies to values used in accept-charset, + /// accept-encoding, accept-language and related header fields with similar syntax rules. See + /// for a comparer for media type + /// q-values. + /// + public class StringWithQualityHeaderValueComparer : IComparer + { + private static readonly StringWithQualityHeaderValueComparer _qualityComparer = + new StringWithQualityHeaderValueComparer(); + + private StringWithQualityHeaderValueComparer() + { + } + + public static StringWithQualityHeaderValueComparer QualityComparer + { + get { return _qualityComparer; } + } + + /// + /// Compares two based on their quality value + /// (a.k.a their "q-value"). + /// Values with identical q-values are considered equal (i.e the result is 0) with the exception of wild-card + /// values (i.e. a value of "*") which are considered less than non-wild-card values. This allows to sort + /// a sequence of following their q-values ending up with any + /// wild-cards at the end. + /// + /// The first value to compare. + /// The second value to compare + /// The result of the comparison. + public int Compare([NotNull] StringWithQualityHeaderValue stringWithQuality1, + [NotNull] StringWithQualityHeaderValue stringWithQuality2) + { + var quality1 = stringWithQuality1.Quality ?? HeaderQuality.Match; + var quality2 = stringWithQuality2.Quality ?? HeaderQuality.Match; + var qualityDifference = quality1 - quality2; + if (qualityDifference < 0) + { + return -1; + } + else if (qualityDifference > 0) + { + return 1; + } + + if (!String.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) + { + if (String.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) + { + return -1; + } + else if (String.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) + { + return 1; + } + } + + return 0; + } + } +} diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json new file mode 100644 index 0000000000..c0c551004b --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -0,0 +1,19 @@ +{ + "version": "1.0.0-*", + "dependencies": { + }, + "frameworks" : { + "net45" : { }, + "aspnet50" : { }, + "aspnetcore50" : { + "dependencies": { + "System.Collections": "4.0.10-beta-*", + "System.Diagnostics.Contracts": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Text.Encoding": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*" + } + } + } +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs new file mode 100644 index 0000000000..6b437d8925 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -0,0 +1,206 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.Net.Http.Headers; +using Xunit; + +namespace Microsoft.AspNet.Http.Headers +{ + public class HeaderDictionaryTypeExtensionsTest + { + [Fact] + public void GetT_KnownTypeWithValidValue_Success() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.ContentType] = "text/plain"; + + var result = headers.Get(HeaderNames.ContentType); + + var expected = new MediaTypeHeaderValue("text/plain"); + Assert.Equal(expected, result); + } + + [Fact] + public void GetT_KnownTypeWithMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var result = headers.Get(HeaderNames.ContentType); + + Assert.Null(result); + } + + [Fact] + public void GetT_KnownTypeWithInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.ContentType] = "invalid"; + + var result = headers.Get(HeaderNames.ContentType); + + Assert.Null(result); + } + + [Fact] + public void GetT_UnknownTypeWithTryParseAndValidValue_Success() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + var result = headers.Get("custom"); + Assert.NotNull(result); + } + + [Fact] + public void GetT_UnknownTypeWithTryParseAndInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers["custom"] = "invalid"; + + var result = headers.Get("custom"); + Assert.Null(result); + } + + [Fact] + public void GetT_UnknownTypeWithTryParseAndMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var result = headers.Get("custom"); + Assert.Null(result); + } + + [Fact] + public void GetT_UnknownTypeWithoutTryParse_Throws() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + Assert.Throws(() => headers.Get("custom")); + } + + [Fact] + public void GetListT_KnownTypeWithValidValue_Success() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.Accept] = "text/plain; q=0.9, text/other, */*"; + + var result = headers.GetList(HeaderNames.Accept); + + var expected = new[] { + new MediaTypeHeaderValue("text/plain", 0.9), + new MediaTypeHeaderValue("text/other"), + new MediaTypeHeaderValue("*/*"), + }.ToList(); + Assert.Equal(expected, result); + } + + [Fact] + public void GetListT_KnownTypeWithMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var result = headers.GetList(HeaderNames.Accept); + + Assert.Null(result); + } + + [Fact] + public void GetListT_KnownTypeWithInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers[HeaderNames.Accept] = "invalid"; + + var result = headers.GetList(HeaderNames.Accept); + + Assert.Null(result); + } + + [Fact] + public void GetListT_UnknownTypeWithTryParseListAndValidValue_Success() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + var results = headers.GetList("custom"); + Assert.NotNull(results); + Assert.Equal(new[] { new TestHeaderValue() }.ToList(), results); + } + + [Fact] + public void GetListT_UnknownTypeWithTryParseListAndInvalidValue_Null() + { + var headers = new HeaderDictionary(); + headers["custom"] = "invalid"; + + var results = headers.GetList("custom"); + Assert.Null(results); + } + + [Fact] + public void GetListT_UnknownTypeWithTryParseListAndMissingValue_Null() + { + var headers = new HeaderDictionary(); + + var results = headers.GetList("custom"); + Assert.Null(results); + } + + [Fact] + public void GetListT_UnknownTypeWithoutTryParseList_Throws() + { + var headers = new HeaderDictionary(); + headers["custom"] = "valid"; + + Assert.Throws(() => headers.GetList("custom")); + } + + public class TestHeaderValue + { + public static bool TryParse(string value, out TestHeaderValue result) + { + if (string.Equals("valid", value)) + { + result = new TestHeaderValue(); + return true; + } + result = null; + return false; + } + + public static bool TryParseList(IList values, out IList result) + { + var results = new List(); + foreach (var value in values) + { + if (string.Equals("valid", value)) + { + results.Add(new TestHeaderValue()); + } + } + if (results.Count > 0) + { + result = results; + return true; + } + result = null; + return false; + } + + public override bool Equals(object obj) + { + var other = obj as TestHeaderValue; + return other != null; + } + + public override int GetHashCode() + { + return 0; + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index cf6c82e1bb..b3dbf90a69 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs similarity index 98% rename from test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs rename to test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs index 76d3ac977d..2f52599c83 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNet.Http.Extensions { public class QueryBuilderTests { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 9dc54ab09e..1ed29d112e 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Http.Extensions.Tests { } - public class TestMiddleware + public class TestMiddleware { RequestDelegate _next; @@ -133,9 +133,10 @@ namespace Microsoft.AspNet.Http.Extensions.Tests _next = next; } - public async Task Invoke(HttpContext context, ITestService testService) + public Task Invoke(HttpContext context, ITestService testService) { context.Items[typeof(ITestService)] = testService; + return Task.FromResult(0); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index c82bfd67b7..397d480580 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -59,26 +59,6 @@ namespace Microsoft.AspNet.PipelineCore.Tests Assert.Null(request.ContentType); } - [Fact] - public void GetAcceptHeader_ReturnsNullIfHeaderDoesNotExist() - { - // Arrange - var request = GetRequestWithAcceptHeader(acceptHeader: null); - - // Act and Assert - Assert.Null(request.Accept); - } - - [Fact] - public void GetAcceptCharsetHeader_ReturnsNullIfHeaderDoesNotExist() - { - // Arrange - var request = GetRequestWithAcceptCharsetHeader(acceptCharset: null); - - // Act and Assert - Assert.Null(request.AcceptCharset); - } - [Fact] public void Host_GetsHostFromHeaders() { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index 1a6f3883fd..098750fe14 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -14,4 +14,9 @@ 2.0 - + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index c3fcb3e97c..a445ee721d 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -2,12 +2,14 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.AspNet.PipelineCore": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { } + "aspnet50": { }, + "aspnetcore50": { } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs new file mode 100644 index 0000000000..0ac0fe3d2c --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs @@ -0,0 +1,599 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class CacheControlHeaderValueTest + { + [Fact] + public void Properties_SetAndGetAllProperties_SetValueReturnedInGetter() + { + var cacheControl = new CacheControlHeaderValue(); + + // Bool properties + cacheControl.NoCache = true; + Assert.True(cacheControl.NoCache, "NoCache"); + cacheControl.NoStore = true; + Assert.True(cacheControl.NoStore, "NoStore"); + cacheControl.MaxStale = true; + Assert.True(cacheControl.MaxStale, "MaxStale"); + cacheControl.NoTransform = true; + Assert.True(cacheControl.NoTransform, "NoTransform"); + cacheControl.OnlyIfCached = true; + Assert.True(cacheControl.OnlyIfCached, "OnlyIfCached"); + cacheControl.Public = true; + Assert.True(cacheControl.Public, "Public"); + cacheControl.Private = true; + Assert.True(cacheControl.Private, "Private"); + cacheControl.MustRevalidate = true; + Assert.True(cacheControl.MustRevalidate, "MustRevalidate"); + cacheControl.ProxyRevalidate = true; + Assert.True(cacheControl.ProxyRevalidate, "ProxyRevalidate"); + + // TimeSpan properties + TimeSpan timeSpan = new TimeSpan(1, 2, 3); + cacheControl.MaxAge = timeSpan; + Assert.Equal(timeSpan, cacheControl.MaxAge); + cacheControl.SharedMaxAge = timeSpan; + Assert.Equal(timeSpan, cacheControl.SharedMaxAge); + cacheControl.MaxStaleLimit = timeSpan; + Assert.Equal(timeSpan, cacheControl.MaxStaleLimit); + cacheControl.MinFresh = timeSpan; + Assert.Equal(timeSpan, cacheControl.MinFresh); + + // String collection properties + Assert.NotNull(cacheControl.NoCacheHeaders); + Assert.Throws(() => cacheControl.NoCacheHeaders.Add(null)); + Assert.Throws(() => cacheControl.NoCacheHeaders.Add("invalid token")); + cacheControl.NoCacheHeaders.Add("token"); + Assert.Equal(1, cacheControl.NoCacheHeaders.Count); + Assert.Equal("token", cacheControl.NoCacheHeaders.First()); + + Assert.NotNull(cacheControl.PrivateHeaders); + Assert.Throws(() => cacheControl.PrivateHeaders.Add(null)); + Assert.Throws(() => cacheControl.PrivateHeaders.Add("invalid token")); + cacheControl.PrivateHeaders.Add("token"); + Assert.Equal(1, cacheControl.PrivateHeaders.Count); + Assert.Equal("token", cacheControl.PrivateHeaders.First()); + + // NameValueHeaderValue collection property + Assert.NotNull(cacheControl.Extensions); + Assert.Throws(() => cacheControl.Extensions.Add(null)); + cacheControl.Extensions.Add(new NameValueHeaderValue("name", "value")); + Assert.Equal(1, cacheControl.Extensions.Count); + Assert.Equal(new NameValueHeaderValue("name", "value"), cacheControl.Extensions.First()); + } + + [Fact] + public void ToString_UseRequestDirectiveValues_AllSerializedCorrectly() + { + var cacheControl = new CacheControlHeaderValue(); + Assert.Equal("", cacheControl.ToString()); + + // Note that we allow all combinations of all properties even though the RFC specifies rules what value + // can be used together. + // Also for property pairs (bool property + collection property) like 'NoCache' and 'NoCacheHeaders' the + // caller needs to set the bool property in order for the collection to be populated as string. + + // Cache Request Directive sample + cacheControl.NoStore = true; + Assert.Equal("no-store", cacheControl.ToString()); + cacheControl.NoCache = true; + Assert.Equal("no-store, no-cache", cacheControl.ToString()); + cacheControl.MaxAge = new TimeSpan(0, 1, 10); + Assert.Equal("no-store, no-cache, max-age=70", cacheControl.ToString()); + cacheControl.MaxStale = true; + Assert.Equal("no-store, no-cache, max-age=70, max-stale", cacheControl.ToString()); + cacheControl.MaxStaleLimit = new TimeSpan(0, 2, 5); + Assert.Equal("no-store, no-cache, max-age=70, max-stale=125", cacheControl.ToString()); + cacheControl.MinFresh = new TimeSpan(0, 3, 0); + Assert.Equal("no-store, no-cache, max-age=70, max-stale=125, min-fresh=180", cacheControl.ToString()); + + cacheControl = new CacheControlHeaderValue(); + cacheControl.NoTransform = true; + Assert.Equal("no-transform", cacheControl.ToString()); + cacheControl.OnlyIfCached = true; + Assert.Equal("no-transform, only-if-cached", cacheControl.ToString()); + cacheControl.Extensions.Add(new NameValueHeaderValue("custom")); + cacheControl.Extensions.Add(new NameValueHeaderValue("customName", "customValue")); + Assert.Equal("no-transform, only-if-cached, custom, customName=customValue", cacheControl.ToString()); + + cacheControl = new CacheControlHeaderValue(); + cacheControl.Extensions.Add(new NameValueHeaderValue("custom")); + Assert.Equal("custom", cacheControl.ToString()); + } + + [Fact] + public void ToString_UseResponseDirectiveValues_AllSerializedCorrectly() + { + var cacheControl = new CacheControlHeaderValue(); + Assert.Equal("", cacheControl.ToString()); + + cacheControl.NoCache = true; + Assert.Equal("no-cache", cacheControl.ToString()); + cacheControl.NoCacheHeaders.Add("token1"); + Assert.Equal("no-cache=\"token1\"", cacheControl.ToString()); + cacheControl.Public = true; + Assert.Equal("public, no-cache=\"token1\"", cacheControl.ToString()); + + cacheControl = new CacheControlHeaderValue(); + cacheControl.Private = true; + Assert.Equal("private", cacheControl.ToString()); + cacheControl.PrivateHeaders.Add("token2"); + cacheControl.PrivateHeaders.Add("token3"); + Assert.Equal("private=\"token2, token3\"", cacheControl.ToString()); + cacheControl.MustRevalidate = true; + Assert.Equal("must-revalidate, private=\"token2, token3\"", cacheControl.ToString()); + cacheControl.ProxyRevalidate = true; + Assert.Equal("must-revalidate, proxy-revalidate, private=\"token2, token3\"", cacheControl.ToString()); + } + + [Fact] + public void GetHashCode_CompareValuesWithBoolFieldsSet_MatchExpectation() + { + // Verify that different bool fields return different hash values. + var values = new CacheControlHeaderValue[9]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].ProxyRevalidate = true; + values[1].NoCache = true; + values[2].NoStore = true; + values[3].MaxStale = true; + values[4].NoTransform = true; + values[5].OnlyIfCached = true; + values[6].Public = true; + values[7].Private = true; + values[8].MustRevalidate = true; + + // Only one bool field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareHashCodes(values[i], values[j], false); + } + } + } + + // Validate that two instances with the same bool fields set are equal. + values[0].NoCache = true; + CompareHashCodes(values[0], values[1], false); + values[1].ProxyRevalidate = true; + CompareHashCodes(values[0], values[1], true); + } + + [Fact] + public void GetHashCode_CompareValuesWithTimeSpanFieldsSet_MatchExpectation() + { + // Verify that different timespan fields return different hash values. + var values = new CacheControlHeaderValue[4]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 1); + values[2].MinFresh = new TimeSpan(0, 1, 1); + values[3].SharedMaxAge = new TimeSpan(0, 1, 1); + + // Only one timespan field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareHashCodes(values[i], values[j], false); + } + } + } + + values[0].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareHashCodes(values[0], values[1], false); + + values[1].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareHashCodes(values[0], values[1], true); + } + + [Fact] + public void GetHashCode_CompareCollectionFieldsSet_MatchExpectation() + { + var cacheControl1 = new CacheControlHeaderValue(); + var cacheControl2 = new CacheControlHeaderValue(); + var cacheControl3 = new CacheControlHeaderValue(); + var cacheControl4 = new CacheControlHeaderValue(); + var cacheControl5 = new CacheControlHeaderValue(); + + cacheControl1.NoCache = true; + cacheControl1.NoCacheHeaders.Add("token2"); + + cacheControl2.NoCache = true; + cacheControl2.NoCacheHeaders.Add("token1"); + cacheControl2.NoCacheHeaders.Add("token2"); + + CompareHashCodes(cacheControl1, cacheControl2, false); + + cacheControl1.NoCacheHeaders.Add("token1"); + CompareHashCodes(cacheControl1, cacheControl2, true); + + // Since NoCache and Private generate different hash codes, even if NoCacheHeaders and PrivateHeaders + // have the same values, the hash code will be different. + cacheControl3.Private = true; + cacheControl3.PrivateHeaders.Add("token2"); + CompareHashCodes(cacheControl1, cacheControl3, false); + + + cacheControl4.Extensions.Add(new NameValueHeaderValue("custom")); + CompareHashCodes(cacheControl1, cacheControl4, false); + + cacheControl5.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + cacheControl5.Extensions.Add(new NameValueHeaderValue("custom")); + CompareHashCodes(cacheControl4, cacheControl5, false); + + cacheControl4.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + CompareHashCodes(cacheControl4, cacheControl5, true); + } + + [Fact] + public void Equals_CompareValuesWithBoolFieldsSet_MatchExpectation() + { + // Verify that different bool fields return different hash values. + var values = new CacheControlHeaderValue[9]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].ProxyRevalidate = true; + values[1].NoCache = true; + values[2].NoStore = true; + values[3].MaxStale = true; + values[4].NoTransform = true; + values[5].OnlyIfCached = true; + values[6].Public = true; + values[7].Private = true; + values[8].MustRevalidate = true; + + // Only one bool field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareValues(values[i], values[j], false); + } + } + } + + // Validate that two instances with the same bool fields set are equal. + values[0].NoCache = true; + CompareValues(values[0], values[1], false); + values[1].ProxyRevalidate = true; + CompareValues(values[0], values[1], true); + } + + [Fact] + public void Equals_CompareValuesWithTimeSpanFieldsSet_MatchExpectation() + { + // Verify that different timespan fields return different hash values. + var values = new CacheControlHeaderValue[4]; + + for (int i = 0; i < values.Length; i++) + { + values[i] = new CacheControlHeaderValue(); + } + + values[0].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 1); + values[2].MinFresh = new TimeSpan(0, 1, 1); + values[3].SharedMaxAge = new TimeSpan(0, 1, 1); + + // Only one timespan field set. All hash codes should differ + for (int i = 0; i < values.Length; i++) + { + for (int j = 0; j < values.Length; j++) + { + if (i != j) + { + CompareValues(values[i], values[j], false); + } + } + } + + values[0].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareValues(values[0], values[1], false); + + values[1].MaxAge = new TimeSpan(0, 1, 1); + values[1].MaxStaleLimit = new TimeSpan(0, 1, 2); + CompareValues(values[0], values[1], true); + + var value1 = new CacheControlHeaderValue(); + value1.MaxStale = true; + var value2 = new CacheControlHeaderValue(); + value2.MaxStale = true; + CompareValues(value1, value2, true); + + value2.MaxStaleLimit = new TimeSpan(1, 2, 3); + CompareValues(value1, value2, false); + } + + [Fact] + public void Equals_CompareCollectionFieldsSet_MatchExpectation() + { + var cacheControl1 = new CacheControlHeaderValue(); + var cacheControl2 = new CacheControlHeaderValue(); + var cacheControl3 = new CacheControlHeaderValue(); + var cacheControl4 = new CacheControlHeaderValue(); + var cacheControl5 = new CacheControlHeaderValue(); + var cacheControl6 = new CacheControlHeaderValue(); + + cacheControl1.NoCache = true; + cacheControl1.NoCacheHeaders.Add("token2"); + + Assert.False(cacheControl1.Equals(null), "Compare with 'null'"); + + cacheControl2.NoCache = true; + cacheControl2.NoCacheHeaders.Add("token1"); + cacheControl2.NoCacheHeaders.Add("token2"); + + CompareValues(cacheControl1, cacheControl2, false); + + cacheControl1.NoCacheHeaders.Add("token1"); + CompareValues(cacheControl1, cacheControl2, true); + + // Since NoCache and Private generate different hash codes, even if NoCacheHeaders and PrivateHeaders + // have the same values, the hash code will be different. + cacheControl3.Private = true; + cacheControl3.PrivateHeaders.Add("token2"); + CompareValues(cacheControl1, cacheControl3, false); + + cacheControl4.Private = true; + cacheControl4.PrivateHeaders.Add("token3"); + CompareValues(cacheControl3, cacheControl4, false); + + cacheControl5.Extensions.Add(new NameValueHeaderValue("custom")); + CompareValues(cacheControl1, cacheControl5, false); + + cacheControl6.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + cacheControl6.Extensions.Add(new NameValueHeaderValue("custom")); + CompareValues(cacheControl5, cacheControl6, false); + + cacheControl5.Extensions.Add(new NameValueHeaderValue("customN", "customV")); + CompareValues(cacheControl5, cacheControl6, true); + } + + [Fact] + public void TryParse_DifferentValidScenarios_AllReturnTrue() + { + var expected = new CacheControlHeaderValue(); + expected.NoCache = true; + CheckValidTryParse(" , no-cache ,,", expected); + + expected = new CacheControlHeaderValue(); + expected.NoCache = true; + expected.NoCacheHeaders.Add("token1"); + expected.NoCacheHeaders.Add("token2"); + CheckValidTryParse("no-cache=\"token1, token2\"", expected); + + expected = new CacheControlHeaderValue(); + expected.NoStore = true; + expected.MaxAge = new TimeSpan(0, 0, 125); + expected.MaxStale = true; + CheckValidTryParse(" no-store , max-age = 125, max-stale,", expected); + + expected = new CacheControlHeaderValue(); + expected.MinFresh = new TimeSpan(0, 0, 123); + expected.NoTransform = true; + expected.OnlyIfCached = true; + expected.Extensions.Add(new NameValueHeaderValue("custom")); + CheckValidTryParse("min-fresh=123, no-transform, only-if-cached, custom", expected); + + expected = new CacheControlHeaderValue(); + expected.Public = true; + expected.Private = true; + expected.PrivateHeaders.Add("token1"); + expected.MustRevalidate = true; + expected.ProxyRevalidate = true; + expected.Extensions.Add(new NameValueHeaderValue("c", "d")); + expected.Extensions.Add(new NameValueHeaderValue("a", "b")); + CheckValidTryParse(",public, , private=\"token1\", must-revalidate, c=d, proxy-revalidate, a=b", expected); + + expected = new CacheControlHeaderValue(); + expected.Private = true; + expected.SharedMaxAge = new TimeSpan(0, 0, 1234567890); + expected.MaxAge = new TimeSpan(0, 0, 987654321); + CheckValidTryParse("s-maxage=1234567890, private, max-age = 987654321,", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom", "")); + CheckValidTryParse("custom=", expected); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + // Token-only values + [InlineData("no-store=15")] + [InlineData("no-store=")] + [InlineData("no-transform=a")] + [InlineData("no-transform=")] + [InlineData("only-if-cached=\"x\"")] + [InlineData("only-if-cached=")] + [InlineData("public=\"x\"")] + [InlineData("public=")] + [InlineData("must-revalidate=\"1\"")] + [InlineData("must-revalidate=")] + [InlineData("proxy-revalidate=x")] + [InlineData("proxy-revalidate=")] + // Token with optional field-name list + [InlineData("no-cache=")] + [InlineData("no-cache=token")] + [InlineData("no-cache=\"token")] + [InlineData("no-cache=\"\"")] // at least one token expected as value + [InlineData("private=")] + [InlineData("private=token")] + [InlineData("private=\"token")] + [InlineData("private=\",\"")] // at least one token expected as value + [InlineData("private=\"=\"")] + // Token with delta-seconds value + [InlineData("max-age")] + [InlineData("max-age=")] + [InlineData("max-age=a")] + [InlineData("max-age=\"1\"")] + [InlineData("max-age=1.5")] + [InlineData("max-stale=")] + [InlineData("max-stale=a")] + [InlineData("max-stale=\"1\"")] + [InlineData("max-stale=1.5")] + [InlineData("min-fresh")] + [InlineData("min-fresh=")] + [InlineData("min-fresh=a")] + [InlineData("min-fresh=\"1\"")] + [InlineData("min-fresh=1.5")] + [InlineData("s-maxage")] + [InlineData("s-maxage=")] + [InlineData("s-maxage=a")] + [InlineData("s-maxage=\"1\"")] + [InlineData("s-maxage=1.5")] + // Invalid Extension values + [InlineData("custom value")] + public void TryParse_DifferentInvalidScenarios_ReturnsFalse(string input) + { + CheckInvalidTryParse(input); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + // Just verify parser is implemented correctly. Don't try to test syntax parsed by CacheControlHeaderValue. + var expected = new CacheControlHeaderValue(); + expected.NoStore = true; + expected.MinFresh = new TimeSpan(0, 2, 3); + CheckValidParse(" , no-store, min-fresh=123", expected); + + expected = new CacheControlHeaderValue(); + expected.MaxStale = true; + expected.NoCache = true; + expected.NoCacheHeaders.Add("t"); + CheckValidParse("max-stale, no-cache=\"t\", ,,", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom")); + CheckValidParse("custom =", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom", "")); + CheckValidParse("custom =", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(null); + CheckInvalidParse(""); + CheckInvalidParse(" "); + CheckInvalidParse("no-cache,="); + CheckInvalidParse("max-age=123x"); + CheckInvalidParse("=no-cache"); + CheckInvalidParse("no-cache no-store"); + CheckInvalidParse("会"); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + // Just verify parser is implemented correctly. Don't try to test syntax parsed by CacheControlHeaderValue. + var expected = new CacheControlHeaderValue(); + expected.NoStore = true; + expected.MinFresh = new TimeSpan(0, 2, 3); + CheckValidTryParse(" , no-store, min-fresh=123", expected); + + expected = new CacheControlHeaderValue(); + expected.MaxStale = true; + expected.NoCache = true; + expected.NoCacheHeaders.Add("t"); + CheckValidTryParse("max-stale, no-cache=\"t\", ,,", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom")); + CheckValidTryParse("custom = ", expected); + + expected = new CacheControlHeaderValue(); + expected.Extensions.Add(new NameValueHeaderValue("custom", "")); + CheckValidTryParse("custom =", expected); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("no-cache,="); + CheckInvalidTryParse("max-age=123x"); + CheckInvalidTryParse("=no-cache"); + CheckInvalidTryParse("no-cache no-store"); + CheckInvalidTryParse("会"); + } + + #region Helper methods + + private void CompareHashCodes(CacheControlHeaderValue x, CacheControlHeaderValue y, bool areEqual) + { + if (areEqual) + { + Assert.Equal(x.GetHashCode(), y.GetHashCode()); + } + else + { + Assert.NotEqual(x.GetHashCode(), y.GetHashCode()); + } + } + + private void CompareValues(CacheControlHeaderValue x, CacheControlHeaderValue y, bool areEqual) + { + Assert.Equal(areEqual, x.Equals(y)); + Assert.Equal(areEqual, y.Equals(x)); + } + + private void CheckValidParse(string input, CacheControlHeaderValue expectedResult) + { + var result = CacheControlHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => CacheControlHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, CacheControlHeaderValue expectedResult) + { + CacheControlHeaderValue result = null; + Assert.True(CacheControlHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + CacheControlHeaderValue result = null; + Assert.False(CacheControlHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs new file mode 100644 index 0000000000..41bb2bdaae --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -0,0 +1,609 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class ContentDispositionHeaderValueTest + { + [Fact] + public void Ctor_ContentDispositionNull_Throw() + { + Assert.Throws(() => new ContentDispositionHeaderValue(null)); + } + + [Fact] + public void Ctor_ContentDispositionEmpty_Throw() + { + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new ContentDispositionHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_ContentDispositionInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException(" inline "); + AssertFormatException(" inline"); + AssertFormatException("inline "); + AssertFormatException("\"inline\""); + AssertFormatException("te xt"); + AssertFormatException("te=xt"); + AssertFormatException("teäxt"); + AssertFormatException("text;"); + AssertFormatException("te/xt;"); + AssertFormatException("inline; name=someName; "); + AssertFormatException("text;name=someName"); // ctor takes only disposition-type name, no parameters + } + + [Fact] + public void Ctor_ContentDispositionValidFormat_SuccessfullyCreated() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Equal("inline", contentDisposition.DispositionType); + Assert.Equal(0, contentDisposition.Parameters.Count); + Assert.Null(contentDisposition.Name); + Assert.Null(contentDisposition.FileName); + Assert.Null(contentDisposition.CreationDate); + Assert.Null(contentDisposition.ModificationDate); + Assert.Null(contentDisposition.ReadDate); + Assert.Null(contentDisposition.Size); + } + + [Fact] + public void Parameters_AddNull_Throw() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Throws(() => contentDisposition.Parameters.Add(null)); + } + + [Fact] + public void ContentDisposition_SetAndGetContentDisposition_MatchExpectations() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Equal("inline", contentDisposition.DispositionType); + + contentDisposition.DispositionType = "attachment"; + Assert.Equal("attachment", contentDisposition.DispositionType); + } + + [Fact] + public void Name_SetNameAndValidateObject_ParametersEntryForNameAdded() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + contentDisposition.Name = "myname"; + Assert.Equal("myname", contentDisposition.Name); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("name", contentDisposition.Parameters.First().Name); + + contentDisposition.Name = null; + Assert.Null(contentDisposition.Name); + Assert.Equal(0, contentDisposition.Parameters.Count); + contentDisposition.Name = null; // It's OK to set it again to null; no exception. + } + + [Fact] + public void Name_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + NameValueHeaderValue name = new NameValueHeaderValue("NAME", "old_name"); + contentDisposition.Parameters.Add(name); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("NAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Name = "new_name"; + Assert.Equal("new_name", contentDisposition.Name); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("NAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(name); + Assert.Null(contentDisposition.Name); + } + + [Fact] + public void FileName_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileName = new NameValueHeaderValue("FILENAME", "old_name"); + contentDisposition.Parameters.Add(fileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + + contentDisposition.FileName = "new_name"; + Assert.Equal("new_name", contentDisposition.FileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(fileName); + Assert.Null(contentDisposition.FileName); + } + + [Fact] + public void FileName_NeedsEncoding_EncodedAndDecodedCorrectly() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + contentDisposition.FileName = "FileÃName.bat"; + Assert.Equal("FileÃName.bat", contentDisposition.FileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("filename", contentDisposition.Parameters.First().Name); + Assert.Equal("\"=?utf-8?B?RmlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(contentDisposition.Parameters.First()); + Assert.Null(contentDisposition.FileName); + } + + [Fact] + public void FileName_UnknownOrBadEncoding_PropertyFails() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileName = new NameValueHeaderValue("FILENAME", "\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\""); + contentDisposition.Parameters.Add(fileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.Parameters.First().Value); + Assert.Equal("\"=?utf-99?Q?R=mlsZcODTmFtZS5iYXQ=?=\"", contentDisposition.FileName); + + contentDisposition.FileName = "new_name"; + Assert.Equal("new_name", contentDisposition.FileName); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(fileName); + Assert.Null(contentDisposition.FileName); + } + + [Fact] + public void FileNameStar_AddNameParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileNameStar = new NameValueHeaderValue("FILENAME*", "old_name"); + contentDisposition.Parameters.Add(fileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + Assert.Null(contentDisposition.FileNameStar); // Decode failure + + contentDisposition.FileNameStar = "new_name"; + Assert.Equal("new_name", contentDisposition.FileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + Assert.Equal("UTF-8\'\'new_name", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(fileNameStar); + Assert.Null(contentDisposition.FileNameStar); + } + + [Fact] + public void FileNameStar_NeedsEncoding_EncodedAndDecodedCorrectly() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + contentDisposition.FileNameStar = "FileÃName.bat"; + Assert.Equal("FileÃName.bat", contentDisposition.FileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("filename*", contentDisposition.Parameters.First().Name); + Assert.Equal("UTF-8\'\'File%C3%83Name.bat", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(contentDisposition.Parameters.First()); + Assert.Null(contentDisposition.FileNameStar); + } + + [Fact] + public void FileNameStar_UnknownOrBadEncoding_PropertyFails() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var fileNameStar = new NameValueHeaderValue("FILENAME*", "utf-99'lang'File%CZName.bat"); + contentDisposition.Parameters.Add(fileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + Assert.Equal("utf-99'lang'File%CZName.bat", contentDisposition.Parameters.First().Value); + Assert.Null(contentDisposition.FileNameStar); // Decode failure + + contentDisposition.FileNameStar = "new_name"; + Assert.Equal("new_name", contentDisposition.FileNameStar); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("FILENAME*", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(fileNameStar); + Assert.Null(contentDisposition.FileNameStar); + } + + [Fact] + public void Dates_AddDateParameterThenUseProperty_ParametersEntryIsOverwritten() + { + string validDateString = "\"Tue, 15 Nov 1994 08:12:31 GMT\""; + DateTimeOffset validDate = DateTimeOffset.Parse("Tue, 15 Nov 1994 08:12:31 GMT"); + + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var dateParameter = new NameValueHeaderValue("Creation-DATE", validDateString); + contentDisposition.Parameters.Add(dateParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("Creation-DATE", contentDisposition.Parameters.First().Name); + + Assert.Equal(validDate, contentDisposition.CreationDate); + + var newDate = validDate.AddSeconds(1); + contentDisposition.CreationDate = newDate; + Assert.Equal(newDate, contentDisposition.CreationDate); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("Creation-DATE", contentDisposition.Parameters.First().Name); + Assert.Equal("\"Tue, 15 Nov 1994 08:12:32 GMT\"", contentDisposition.Parameters.First().Value); + + contentDisposition.Parameters.Remove(dateParameter); + Assert.Null(contentDisposition.CreationDate); + } + + [Fact] + public void Dates_InvalidDates_PropertyFails() + { + string invalidDateString = "\"Tue, 15 Nov 94 08:12 GMT\""; + + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var dateParameter = new NameValueHeaderValue("read-DATE", invalidDateString); + contentDisposition.Parameters.Add(dateParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("read-DATE", contentDisposition.Parameters.First().Name); + + Assert.Null(contentDisposition.ReadDate); + + contentDisposition.ReadDate = null; + Assert.Null(contentDisposition.ReadDate); + Assert.Equal(0, contentDisposition.Parameters.Count); + } + + [Fact] + public void Size_AddSizeParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var sizeParameter = new NameValueHeaderValue("SIZE", "279172874239"); + contentDisposition.Parameters.Add(sizeParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + Assert.Equal(279172874239, contentDisposition.Size); + + contentDisposition.Size = 279172874240; + Assert.Equal(279172874240, contentDisposition.Size); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(sizeParameter); + Assert.Null(contentDisposition.Size); + } + + [Fact] + public void Size_InvalidSizes_PropertyFails() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var sizeParameter = new NameValueHeaderValue("SIZE", "-279172874239"); + contentDisposition.Parameters.Add(sizeParameter); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + Assert.Null(contentDisposition.Size); + + // Negatives not allowed + Assert.Throws(() => contentDisposition.Size = -279172874240); + Assert.Null(contentDisposition.Size); + Assert.Equal(1, contentDisposition.Parameters.Count); + Assert.Equal("SIZE", contentDisposition.Parameters.First().Name); + + contentDisposition.Parameters.Remove(sizeParameter); + Assert.Null(contentDisposition.Size); + } + + [Fact] + public void ToString_UseDifferentContentDispositions_AllSerializedCorrectly() + { + var contentDisposition = new ContentDispositionHeaderValue("inline"); + Assert.Equal("inline", contentDisposition.ToString()); + + contentDisposition.Name = "myname"; + Assert.Equal("inline; name=myname", contentDisposition.ToString()); + + contentDisposition.FileName = "my File Name"; + Assert.Equal("inline; name=myname; filename=\"my File Name\"", contentDisposition.ToString()); + + contentDisposition.CreationDate = new DateTimeOffset(new DateTime(2011, 2, 15)); + Assert.Equal("inline; name=myname; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"", contentDisposition.ToString()); + + contentDisposition.Parameters.Add(new NameValueHeaderValue("custom", "\"custom value\"")); + Assert.Equal("inline; name=myname; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\"", contentDisposition.ToString()); + + contentDisposition.Name = null; + Assert.Equal("inline; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\"", contentDisposition.ToString()); + + contentDisposition.FileNameStar = "File%Name"; + Assert.Equal("inline; filename=\"my File Name\"; creation-date=" + + "\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\"; filename*=UTF-8\'\'File%25Name", + contentDisposition.ToString()); + + contentDisposition.FileName = null; + Assert.Equal("inline; creation-date=\"Tue, 15 Feb 2011 08:00:00 GMT\"; custom=\"custom value\";" + + " filename*=UTF-8\'\'File%25Name", contentDisposition.ToString()); + + contentDisposition.CreationDate = null; + Assert.Equal("inline; custom=\"custom value\"; filename*=UTF-8\'\'File%25Name", + contentDisposition.ToString()); + } + + [Fact] + public void GetHashCode_UseContentDispositionWithAndWithoutParameters_SameOrDifferentHashCodes() + { + var contentDisposition1 = new ContentDispositionHeaderValue("inline"); + var contentDisposition2 = new ContentDispositionHeaderValue("inline"); + contentDisposition2.Name = "myname"; + var contentDisposition3 = new ContentDispositionHeaderValue("inline"); + contentDisposition3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var contentDisposition4 = new ContentDispositionHeaderValue("INLINE"); + var contentDisposition5 = new ContentDispositionHeaderValue("INLINE"); + contentDisposition5.Parameters.Add(new NameValueHeaderValue("NAME", "MYNAME")); + + Assert.NotEqual(contentDisposition1.GetHashCode(), contentDisposition2.GetHashCode()); + Assert.NotEqual(contentDisposition1.GetHashCode(), contentDisposition3.GetHashCode()); + Assert.NotEqual(contentDisposition2.GetHashCode(), contentDisposition3.GetHashCode()); + Assert.Equal(contentDisposition1.GetHashCode(), contentDisposition4.GetHashCode()); + Assert.Equal(contentDisposition2.GetHashCode(), contentDisposition5.GetHashCode()); + } + + [Fact] + public void Equals_UseContentDispositionWithAndWithoutParameters_EqualOrNotEqualNoExceptions() + { + var contentDisposition1 = new ContentDispositionHeaderValue("inline"); + var contentDisposition2 = new ContentDispositionHeaderValue("inline"); + contentDisposition2.Name = "myName"; + var contentDisposition3 = new ContentDispositionHeaderValue("inline"); + contentDisposition3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var contentDisposition4 = new ContentDispositionHeaderValue("INLINE"); + var contentDisposition5 = new ContentDispositionHeaderValue("INLINE"); + contentDisposition5.Parameters.Add(new NameValueHeaderValue("NAME", "MYNAME")); + var contentDisposition6 = new ContentDispositionHeaderValue("INLINE"); + contentDisposition6.Parameters.Add(new NameValueHeaderValue("NAME", "MYNAME")); + contentDisposition6.Parameters.Add(new NameValueHeaderValue("custom", "value")); + var contentDisposition7 = new ContentDispositionHeaderValue("attachment"); + + Assert.False(contentDisposition1.Equals(contentDisposition2), "No params vs. name."); + Assert.False(contentDisposition2.Equals(contentDisposition1), "name vs. no params."); + Assert.False(contentDisposition1.Equals(null), "No params vs. ."); + Assert.False(contentDisposition1.Equals(contentDisposition3), "No params vs. custom param."); + Assert.False(contentDisposition2.Equals(contentDisposition3), "name vs. custom param."); + Assert.True(contentDisposition1.Equals(contentDisposition4), "Different casing."); + Assert.True(contentDisposition2.Equals(contentDisposition5), "Different casing in name."); + Assert.False(contentDisposition5.Equals(contentDisposition6), "name vs. custom param."); + Assert.False(contentDisposition1.Equals(contentDisposition7), "inline vs. text/other."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + var expected = new ContentDispositionHeaderValue("inline"); + CheckValidParse("\r\n inline ", expected); + CheckValidParse("inline", expected); + + // We don't have to test all possible input strings, since most of the pieces are handled by other parsers. + // The purpose of this test is to verify that these other parsers are combined correctly to build a + // Content-Disposition parser. + expected.Name = "myName"; + CheckValidParse("\r\n inline ; name = myName ", expected); + CheckValidParse(" inline;name=myName", expected); + + expected.Name = null; + expected.DispositionType = "attachment"; + expected.FileName = "foo-ae.html"; + expected.Parameters.Add(new NameValueHeaderValue("filename*", "UTF-8''foo-%c3%a4.html")); + CheckValidParse(@"attachment; filename*=UTF-8''foo-%c3%a4.html; filename=foo-ae.html", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(""); + CheckInvalidParse(" "); + CheckInvalidParse(null); + CheckInvalidParse("inline会"); + CheckInvalidParse("inline ,"); + CheckInvalidParse("inline,"); + CheckInvalidParse("inline; name=myName ,"); + CheckInvalidParse("inline; name=myName,"); + CheckInvalidParse("inline; name=my会Name"); + CheckInvalidParse("inline/"); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + var expected = new ContentDispositionHeaderValue("inline"); + CheckValidTryParse("\r\n inline ", expected); + CheckValidTryParse("inline", expected); + + // We don't have to test all possible input strings, since most of the pieces are handled by other parsers. + // The purpose of this test is to verify that these other parsers are combined correctly to build a + // Content-Disposition parser. + expected.Name = "myName"; + CheckValidTryParse("\r\n inline ; name = myName ", expected); + CheckValidTryParse(" inline;name=myName", expected); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse(""); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(null); + CheckInvalidTryParse("inline会"); + CheckInvalidTryParse("inline ,"); + CheckInvalidTryParse("inline,"); + CheckInvalidTryParse("inline; name=myName ,"); + CheckInvalidTryParse("inline; name=myName,"); + CheckInvalidTryParse("text/"); + } + + public static TheoryData ValidContentDispositionTestCases = new TheoryData() + { + { "inline", new ContentDispositionHeaderValue("inline") }, // @"This should be equivalent to not including the header at all." + { "inline;", new ContentDispositionHeaderValue("inline") }, + { "inline;name=", new ContentDispositionHeaderValue("inline") { Parameters = { new NameValueHeaderValue("name", "") } } }, // TODO: passing in a null value causes a strange assert on CoreCLR before the test even starts. Not reproducable in the body of a test. + { "inline;name=value", new ContentDispositionHeaderValue("inline") { Name = "value" } }, + { "inline;name=value;", new ContentDispositionHeaderValue("inline") { Name = "value" } }, + { "inline;name=value;", new ContentDispositionHeaderValue("inline") { Name = "value" } }, + { @"inline; filename=""foo.html""", new ContentDispositionHeaderValue("inline") { FileName = @"""foo.html""" } }, + { @"inline; filename=""Not an attachment!""", new ContentDispositionHeaderValue("inline") { FileName = @"""Not an attachment!""" } }, // 'inline', specifying a filename of Not an attachment! - this checks for proper parsing for disposition types. + { @"inline; filename=""foo.pdf""", new ContentDispositionHeaderValue("inline") { FileName = @"""foo.pdf""" } }, + { "attachment", new ContentDispositionHeaderValue("attachment") }, + { "ATTACHMENT", new ContentDispositionHeaderValue("ATTACHMENT") }, + { @"attachment; filename=""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""" } }, + { @"attachment; filename=""\""quoting\"" tested.html""", new ContentDispositionHeaderValue("attachment") { FileName = "\"\"quoting\" tested.html\"" } }, // 'attachment', specifying a filename of \"quoting\" tested.html (using double quotes around "quoting" to test... quoting) + { @"attachment; filename=""Here's a semicolon;.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""Here's a semicolon;.html""" } }, // , 'attachment', specifying a filename of Here's a semicolon;.html - this checks for proper parsing for parameters. + { @"attachment; foo=""bar""; filename=""foo.html""", new ContentDispositionHeaderValue(@"attachment") { FileName = @"""foo.html""", Parameters = { new NameValueHeaderValue("foo", @"""bar""") } } }, // 'attachment', specifying a filename of foo.html and an extension parameter "foo" which should be ignored (see Section 2.8 of RFC 2183.). + { @"attachment; foo=""\""\\"";filename=""foo.html""", new ContentDispositionHeaderValue(@"attachment") { FileName = @"""foo.html""", Parameters = { new NameValueHeaderValue("foo", @"""\""\\""") } } }, // 'attachment', specifying a filename of foo.html and an extension parameter "foo" which should be ignored (see Section 2.8 of RFC 2183.). The extension parameter actually uses backslash-escapes. This tests whether the UA properly skips the parameter. + { @"attachment; FILENAME=""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""" } }, + { @"attachment; filename=foo.html", new ContentDispositionHeaderValue("attachment") { FileName = "foo.html" } }, // 'attachment', specifying a filename of foo.html using a token instead of a quoted-string. + { @"attachment; filename='foo.bar'", new ContentDispositionHeaderValue("attachment") { FileName = "'foo.bar'" } }, // 'attachment', specifying a filename of 'foo.bar' using single quotes. + { @"attachment; filename=""foo-ä.html""", new ContentDispositionHeaderValue("attachment" ) { Parameters = { new NameValueHeaderValue("filename", @"""foo-ä.html""") } } }, // 'attachment', specifying a filename of foo-ä.html, using plain ISO-8859-1 + { @"attachment; filename=""foo-ä.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo-ä.html""" } }, // 'attachment', specifying a filename of foo-ä.html, which happens to be foo-ä.html using UTF-8 encoding. + { @"attachment; filename=""foo-%41.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""foo-%41.html""") } } }, + { @"attachment; filename=""50%.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""50%.html""") } } }, + { @"attachment; filename=""foo-%\41.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""foo-%\41.html""") } } }, // 'attachment', specifying a filename of foo-%41.html, using an escape character (this tests whether adding an escape character inside a %xx sequence can be used to disable the non-conformant %xx-unescaping). + { @"attachment; name=""foo-%41.html""", new ContentDispositionHeaderValue("attachment") { Name = @"""foo-%41.html""" } }, // 'attachment', specifying a name parameter of foo-%41.html. (this test was added to observe the behavior of the (unspecified) treatment of ""name"" as synonym for ""filename""; see Ned Freed's summary where this comes from in MIME messages) + { @"attachment; filename=""ä-%41.html""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename", @"""ä-%41.html""") } } }, // 'attachment', specifying a filename parameter of ä-%41.html. (this test was added to observe the behavior when non-ASCII characters and percent-hexdig sequences are combined) + { @"attachment; filename=""foo-%c3%a4-%e2%82%ac.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo-%c3%a4-%e2%82%ac.html""" } }, // 'attachment', specifying a filename of foo-%c3%a4-%e2%82%ac.html, using raw percent encoded UTF-8 to represent foo-ä-€.html + { @"attachment; filename =""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""" } }, + { @"attachment; xfilename=foo.html", new ContentDispositionHeaderValue("attachment" ) { Parameters = { new NameValueHeaderValue("xfilename", "foo.html") } } }, + { @"attachment; filename=""/foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""/foo.html""" } }, + { @"attachment; creation-date=""Wed, 12 Feb 1997 16:29:51 -0500""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("creation-date", @"""Wed, 12 Feb 1997 16:29:51 -0500""") } } }, + { @"attachment; modification-date=""Wed, 12 Feb 1997 16:29:51 -0500""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("modification-date", @"""Wed, 12 Feb 1997 16:29:51 -0500""") } } }, + { @"foobar", new ContentDispositionHeaderValue("foobar") }, // @"This should be equivalent to using ""attachment""." + { @"attachment; example=""filename=example.txt""", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("example", @"""filename=example.txt""") } } }, + { @"attachment; filename*=iso-8859-1''foo-%E4.html", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename*", "iso-8859-1''foo-%E4.html") } } }, // 'attachment', specifying a filename of foo-ä.html, using RFC2231 encoded ISO-8859-1 + { @"attachment; filename*=UTF-8''foo-%c3%a4-%e2%82%ac.html", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename*", "UTF-8''foo-%c3%a4-%e2%82%ac.html") } } }, // 'attachment', specifying a filename of foo-ä-€.html, using RFC2231 encoded UTF-8 + { @"attachment; filename*=''foo-%c3%a4-%e2%82%ac.html", new ContentDispositionHeaderValue("attachment") { Parameters = { new NameValueHeaderValue("filename*", "''foo-%c3%a4-%e2%82%ac.html") } } }, // Behavior is undefined in RFC 2231, the charset part is missing, although UTF-8 was used. + { @"attachment; filename*=UTF-8''foo-a%22.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = @"foo-a"".html" } }, + { @"attachment; filename*= UTF-8''foo-%c3%a4.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = "foo-ä.html" } }, + { @"attachment; filename* =UTF-8''foo-%c3%a4.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = "foo-ä.html" } }, + { @"attachment; filename*=UTF-8''A-%2541.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = "A-%41.html" } }, + { @"attachment; filename*=UTF-8''%5cfoo.html", new ContentDispositionHeaderValue("attachment") { FileNameStar = @"\foo.html" } }, + { @"attachment; filename=""foo-ae.html""; filename*=UTF-8''foo-%c3%a4.html", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo-ae.html""", FileNameStar = "foo-ä.html" } }, + { @"attachment; filename*=UTF-8''foo-%c3%a4.html; filename=""foo-ae.html""", new ContentDispositionHeaderValue("attachment") { FileNameStar = "foo-ä.html", FileName = @"""foo-ae.html""" } }, + { @"attachment; foobar=x; filename=""foo.html""", new ContentDispositionHeaderValue("attachment") { FileName = @"""foo.html""", Parameters = { new NameValueHeaderValue("foobar", "x") } } }, + { @"attachment; filename=""=?ISO-8859-1?Q?foo-=E4.html?=""", new ContentDispositionHeaderValue("attachment") { FileName = @"""=?ISO-8859-1?Q?foo-=E4.html?=""" } }, // attachment; filename="=?ISO-8859-1?Q?foo-=E4.html?=" + { @"attachment; filename=""=?utf-8?B?Zm9vLeQuaHRtbA==?=""", new ContentDispositionHeaderValue("attachment") { FileName = @"""=?utf-8?B?Zm9vLeQuaHRtbA==?=""" } }, // attachment; filename="=?utf-8?B?Zm9vLeQuaHRtbA==?=" + { @"attachment; filename=foo.html ;", new ContentDispositionHeaderValue("attachment") { FileName="foo.html" } }, // 'attachment', specifying a filename of foo.html using a token instead of a quoted-string, and adding a trailing semicolon., + }; + + [Theory] + [MemberData(nameof(ValidContentDispositionTestCases))] + public void ContentDispositionHeaderValue_ParseValid_Success(string input, ContentDispositionHeaderValue expected) + { + // System.Diagnostics.Debugger.Launch(); + var result = ContentDispositionHeaderValue.Parse(input); + Assert.Equal(expected, result); + } + + [Theory] + // Invalid values + [InlineData(@"""inline""")] // @"'inline' only, using double quotes", false) }, + [InlineData(@"""attachment""")] // @"'attachment' only, using double quotes", false) }, + [InlineData(@"attachment; filename=foo bar.html")] // @"'attachment', specifying a filename of foo bar.html without using quoting.", false) }, + // Duplicate file name parameter + // @"attachment; filename=""foo.html""; // filename=""bar.html""", @"'attachment', specifying two filename parameters. This is invalid syntax.", false) }, + [InlineData(@"attachment; filename=foo[1](2).html")] // @"'attachment', specifying a filename of foo[1](2).html, but missing the quotes. Also, ""["", ""]"", ""("" and "")"" are not allowed in the HTTP token production.", false) }, + [InlineData(@"attachment; filename=foo-ä.html")] // @"'attachment', specifying a filename of foo-ä.html, but missing the quotes.", false) }, + // HTML escaping, not supported + // @"attachment; filename=foo-ä.html", // "'attachment', specifying a filename of foo-ä.html (which happens to be foo-ä.html using UTF-8 encoding) but missing the quotes.", false) }, + [InlineData(@"filename=foo.html")] // @"Disposition type missing, filename specified.", false) }, + [InlineData(@"x=y; filename=foo.html")] // @"Disposition type missing, filename specified after extension parameter.", false) }, + [InlineData(@"""foo; filename=bar;baz""; filename=qux")] // @"Disposition type missing, filename ""qux"". Can it be more broken? (Probably)", false) }, + [InlineData(@"filename=foo.html, filename=bar.html")] // @"Disposition type missing, two filenames specified separated by a comma (this is syntactically equivalent to have two instances of the header with one filename parameter each).", false) }, + [InlineData(@"; filename=foo.html")] // @"Disposition type missing (but delimiter present), filename specified.", false) }, + // This is permitted as a parameter without a value + // @"inline; attachment; filename=foo.html", // @"Both disposition types specified.", false) }, + // This is permitted as a parameter without a value + // @"inline; attachment; filename=foo.html", // @"Both disposition types specified.", false) }, + [InlineData(@"attachment; filename=""foo.html"".txt")] // @"'attachment', specifying a filename parameter that is broken (quoted-string followed by more characters). This is invalid syntax. ", false) }, + [InlineData(@"attachment; filename=""bar")] // @"'attachment', specifying a filename parameter that is broken (missing ending double quote). This is invalid syntax.", false) }, + [InlineData(@"attachment; filename=foo""bar;baz""qux")] // @"'attachment', specifying a filename parameter that is broken (disallowed characters in token syntax). This is invalid syntax.", false) }, + [InlineData(@"attachment; filename=foo.html, attachment; filename=bar.html")] // @"'attachment', two comma-separated instances of the header field. As Content-Disposition doesn't use a list-style syntax, this is invalid syntax and, according to RFC 2616, Section 4.2, roughly equivalent to having two separate header field instances.", false) }, + [InlineData(@"filename=foo.html; attachment")] // @"filename parameter and disposition type reversed.", false) }, + // Escaping is not verified + // @"attachment; filename*=iso-8859-1''foo-%c3%a4-%e2%82%ac.html", // @"'attachment', specifying a filename of foo-ä-€.html, using RFC2231 encoded UTF-8, but declaring ISO-8859-1", false) }, + // Escaping is not verified + // @"attachment; filename *=UTF-8''foo-%c3%a4.html", // @"'attachment', specifying a filename of foo-ä.html, using RFC2231 encoded UTF-8, with whitespace before ""*=""", false) }, + // Escaping is not verified + // @"attachment; filename*=""UTF-8''foo-%c3%a4.html""", // @"'attachment', specifying a filename of foo-ä.html, using RFC2231 encoded UTF-8, with double quotes around the parameter value.", false) }, + [InlineData(@"attachment; filename==?ISO-8859-1?Q?foo-=E4.html?=")] // @"Uses RFC 2047 style encoded word. ""="" is invalid inside the token production, so this is invalid.", false) }, + [InlineData(@"attachment; filename==?utf-8?B?Zm9vLeQuaHRtbA==?=")] // @"Uses RFC 2047 style encoded word. ""="" is invalid inside the token production, so this is invalid.", false) }, + public void ContentDispositionHeaderValue_ParseInvalid_Throws(string input) + { + Assert.Throws(() => ContentDispositionHeaderValue.Parse(input)); + } + + public class ContentDispositionValue + { + public ContentDispositionValue(string value, string description, bool valid) + { + Value = value; + Description = description; + Valid = valid; + } + + public string Value { get; private set; } + + public string Description { get; private set; } + + public bool Valid { get; private set; } + } + + private void CheckValidParse(string input, ContentDispositionHeaderValue expectedResult) + { + var result = ContentDispositionHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => ContentDispositionHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, ContentDispositionHeaderValue expectedResult) + { + ContentDispositionHeaderValue result = null; + Assert.True(ContentDispositionHeaderValue.TryParse(input, out result), input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + ContentDispositionHeaderValue result = null; + Assert.False(ContentDispositionHeaderValue.TryParse(input, out result), input); + Assert.Null(result); + } + + private static void AssertFormatException(string contentDisposition) + { + Assert.Throws(() => new ContentDispositionHeaderValue(contentDisposition)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs new file mode 100644 index 0000000000..d479f4d46f --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs @@ -0,0 +1,272 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class ContentRangeHeaderValueTest + { + [Fact] + public void Ctor_LengthOnlyOverloadUseInvalidValues_Throw() + { + Assert.Throws(() => new ContentRangeHeaderValue(-1)); + } + + [Fact] + public void Ctor_LengthOnlyOverloadValidValues_ValuesCorrectlySet() + { + var range = new ContentRangeHeaderValue(5); + + Assert.False(range.HasRange, "HasRange"); + Assert.True(range.HasLength, "HasLength"); + Assert.Equal("bytes", range.Unit); + Assert.Null(range.From); + Assert.Null(range.To); + Assert.Equal(5, range.Length); + } + + [Fact] + public void Ctor_FromAndToOverloadUseInvalidValues_Throw() + { + Assert.Throws(() => new ContentRangeHeaderValue(-1, 1)); + Assert.Throws(() => new ContentRangeHeaderValue(0, -1)); + Assert.Throws(() => new ContentRangeHeaderValue(2, 1)); + } + + [Fact] + public void Ctor_FromAndToOverloadValidValues_ValuesCorrectlySet() + { + var range = new ContentRangeHeaderValue(0, 1); + + Assert.True(range.HasRange, "HasRange"); + Assert.False(range.HasLength, "HasLength"); + Assert.Equal("bytes", range.Unit); + Assert.Equal(0, range.From); + Assert.Equal(1, range.To); + Assert.Null(range.Length); + } + + [Fact] + public void Ctor_FromToAndLengthOverloadUseInvalidValues_Throw() + { + Assert.Throws(() => new ContentRangeHeaderValue(-1, 1, 2)); + Assert.Throws(() => new ContentRangeHeaderValue(0, -1, 2)); + Assert.Throws(() => new ContentRangeHeaderValue(0, 1, -1)); + Assert.Throws(() => new ContentRangeHeaderValue(2, 1, 3)); + Assert.Throws(() => new ContentRangeHeaderValue(1, 2, 1)); + } + + [Fact] + public void Ctor_FromToAndLengthOverloadValidValues_ValuesCorrectlySet() + { + var range = new ContentRangeHeaderValue(0, 1, 2); + + Assert.True(range.HasRange, "HasRange"); + Assert.True(range.HasLength, "HasLength"); + Assert.Equal("bytes", range.Unit); + Assert.Equal(0, range.From); + Assert.Equal(1, range.To); + Assert.Equal(2, range.Length); + } + + [Fact] + public void Unit_GetAndSetValidAndInvalidValues_MatchExpectation() + { + var range = new ContentRangeHeaderValue(0); + range.Unit = "myunit"; + Assert.Equal("myunit", range.Unit); + + Assert.Throws(() => range.Unit = null); + Assert.Throws(() => range.Unit = ""); + Assert.Throws(() => range.Unit = " x"); + Assert.Throws(() => range.Unit = "x "); + Assert.Throws(() => range.Unit = "x y"); + } + + [Fact] + public void ToString_UseDifferentRanges_AllSerializedCorrectly() + { + var range = new ContentRangeHeaderValue(1, 2, 3); + range.Unit = "myunit"; + Assert.Equal("myunit 1-2/3", range.ToString()); + + range = new ContentRangeHeaderValue(123456789012345678, 123456789012345679); + Assert.Equal("bytes 123456789012345678-123456789012345679/*", range.ToString()); + + range = new ContentRangeHeaderValue(150); + Assert.Equal("bytes */150", range.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentRanges_SameOrDifferentHashCodes() + { + var range1 = new ContentRangeHeaderValue(1, 2, 5); + var range2 = new ContentRangeHeaderValue(1, 2); + var range3 = new ContentRangeHeaderValue(5); + var range4 = new ContentRangeHeaderValue(1, 2, 5); + range4.Unit = "BYTES"; + var range5 = new ContentRangeHeaderValue(1, 2, 5); + range5.Unit = "myunit"; + + Assert.NotEqual(range1.GetHashCode(), range2.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range3.GetHashCode()); + Assert.NotEqual(range2.GetHashCode(), range3.GetHashCode()); + Assert.Equal(range1.GetHashCode(), range4.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range5.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var range1 = new ContentRangeHeaderValue(1, 2, 5); + var range2 = new ContentRangeHeaderValue(1, 2); + var range3 = new ContentRangeHeaderValue(5); + var range4 = new ContentRangeHeaderValue(1, 2, 5); + range4.Unit = "BYTES"; + var range5 = new ContentRangeHeaderValue(1, 2, 5); + range5.Unit = "myunit"; + var range6 = new ContentRangeHeaderValue(1, 3, 5); + var range7 = new ContentRangeHeaderValue(2, 2, 5); + var range8 = new ContentRangeHeaderValue(1, 2, 6); + + Assert.False(range1.Equals(null), "bytes 1-2/5 vs. "); + Assert.False(range1.Equals(range2), "bytes 1-2/5 vs. bytes 1-2/*"); + Assert.False(range1.Equals(range3), "bytes 1-2/5 vs. bytes */5"); + Assert.False(range2.Equals(range3), "bytes 1-2/* vs. bytes */5"); + Assert.True(range1.Equals(range4), "bytes 1-2/5 vs. BYTES 1-2/5"); + Assert.True(range4.Equals(range1), "BYTES 1-2/5 vs. bytes 1-2/5"); + Assert.False(range1.Equals(range5), "bytes 1-2/5 vs. myunit 1-2/5"); + Assert.False(range1.Equals(range6), "bytes 1-2/5 vs. bytes 1-3/5"); + Assert.False(range1.Equals(range7), "bytes 1-2/5 vs. bytes 2-2/5"); + Assert.False(range1.Equals(range8), "bytes 1-2/5 vs. bytes 1-2/6"); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" bytes 1-2/3 ", new ContentRangeHeaderValue(1, 2, 3)); + CheckValidParse("bytes * / 3", new ContentRangeHeaderValue(3)); + + CheckValidParse(" custom 1234567890123456789-1234567890123456799/*", + new ContentRangeHeaderValue(1234567890123456789, 1234567890123456799) { Unit = "custom" }); + + CheckValidParse(" custom * / 123 ", + new ContentRangeHeaderValue(123) { Unit = "custom" }); + + // Note that we don't have a public constructor for value 'bytes */*' since the RFC doesn't mention a + // scenario for it. However, if a server returns this value, we're flexible and accept it. + var result = ContentRangeHeaderValue.Parse("bytes */*"); + Assert.Equal("bytes", result.Unit); + Assert.Null(result.From); + Assert.Null(result.To); + Assert.Null(result.Length); + Assert.False(result.HasRange, "HasRange"); + Assert.False(result.HasLength, "HasLength"); + } + + [Theory] + [InlineData("bytes 1-2/3,")] // no character after 'length' allowed + [InlineData("x bytes 1-2/3")] + [InlineData("bytes 1-2/3.4")] + [InlineData(null)] + [InlineData("")] + [InlineData("bytes 3-2/5")] + [InlineData("bytes 6-6/5")] + [InlineData("bytes 1-6/5")] + [InlineData("bytes 1-2/")] + [InlineData("bytes 1-2")] + [InlineData("bytes 1-/")] + [InlineData("bytes 1-")] + [InlineData("bytes 1")] + [InlineData("bytes ")] + [InlineData("bytes a-2/3")] + [InlineData("bytes 1-b/3")] + [InlineData("bytes 1-2/c")] + [InlineData("bytes1-2/3")] + // More than 19 digits >>Int64.MaxValue + [InlineData("bytes 1-12345678901234567890/3")] + [InlineData("bytes 12345678901234567890-3/3")] + [InlineData("bytes 1-2/12345678901234567890")] + // Exceed Int64.MaxValue, but use 19 digits + [InlineData("bytes 1-9999999999999999999/3")] + [InlineData("bytes 9999999999999999999-3/3")] + [InlineData("bytes 1-2/9999999999999999999")] + public void Parse_SetOfInvalidValueStrings_Throws(string input) + { + Assert.Throws(() => ContentRangeHeaderValue.Parse(input)); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" bytes 1-2/3 ", new ContentRangeHeaderValue(1, 2, 3)); + CheckValidTryParse("bytes * / 3", new ContentRangeHeaderValue(3)); + + CheckValidTryParse(" custom 1234567890123456789-1234567890123456799/*", + new ContentRangeHeaderValue(1234567890123456789, 1234567890123456799) { Unit = "custom" }); + + CheckValidTryParse(" custom * / 123 ", + new ContentRangeHeaderValue(123) { Unit = "custom" }); + + // Note that we don't have a public constructor for value 'bytes */*' since the RFC doesn't mention a + // scenario for it. However, if a server returns this value, we're flexible and accept it. + ContentRangeHeaderValue result = null; + Assert.True(ContentRangeHeaderValue.TryParse("bytes */*", out result)); + Assert.Equal("bytes", result.Unit); + Assert.Null(result.From); + Assert.Null(result.To); + Assert.Null(result.Length); + Assert.False(result.HasRange, "HasRange"); + Assert.False(result.HasLength, "HasLength"); + } + + [Theory] + [InlineData("bytes 1-2/3,")] // no character after 'length' allowed + [InlineData("x bytes 1-2/3")] + [InlineData("bytes 1-2/3.4")] + [InlineData(null)] + [InlineData("")] + [InlineData("bytes 3-2/5")] + [InlineData("bytes 6-6/5")] + [InlineData("bytes 1-6/5")] + [InlineData("bytes 1-2/")] + [InlineData("bytes 1-2")] + [InlineData("bytes 1-/")] + [InlineData("bytes 1-")] + [InlineData("bytes 1")] + [InlineData("bytes ")] + [InlineData("bytes a-2/3")] + [InlineData("bytes 1-b/3")] + [InlineData("bytes 1-2/c")] + [InlineData("bytes1-2/3")] + // More than 19 digits >>Int64.MaxValue + [InlineData("bytes 1-12345678901234567890/3")] + [InlineData("bytes 12345678901234567890-3/3")] + [InlineData("bytes 1-2/12345678901234567890")] + // Exceed Int64.MaxValue, but use 19 digits + [InlineData("bytes 1-9999999999999999999/3")] + [InlineData("bytes 9999999999999999999-3/3")] + [InlineData("bytes 1-2/9999999999999999999")] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse(string input) + { + ContentRangeHeaderValue result = null; + Assert.False(ContentRangeHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private void CheckValidParse(string input, ContentRangeHeaderValue expectedResult) + { + var result = ContentRangeHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckValidTryParse(string input, ContentRangeHeaderValue expectedResult) + { + ContentRangeHeaderValue result = null; + Assert.True(ContentRangeHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs new file mode 100644 index 0000000000..9a25389a50 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -0,0 +1,229 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class CookieHeaderValueTest + { + public static TheoryData CookieHeaderDataSet + { + get + { + var dataset = new TheoryData(); + var header1 = new CookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3"); + dataset.Add(header1, "name1=n1=v1&n2=v2&n3=v3"); + + var header2 = new CookieHeaderValue("name2", ""); + dataset.Add(header2, "name2="); + + var header3 = new CookieHeaderValue("name3", "value3"); + dataset.Add(header3, "name3=value3"); + + var header4 = new CookieHeaderValue("name4", "\"value4\""); + dataset.Add(header4, "name4=\"value4\""); + + return dataset; + } + } + + public static TheoryData InvalidCookieHeaderDataSet + { + get + { + return new TheoryData + { + "=value", + "name=value;", + "name=value,", + }; + } + } + + public static TheoryData InvalidCookieNames + { + get + { + return new TheoryData + { + "", + "{acb}", + "[acb]", + "\"acb\"", + "a,b", + "a;b", + "a\\b", + "a b", + }; + } + } + + public static TheoryData InvalidCookieValues + { + get + { + return new TheoryData + { + { "\"" }, + { "a,b" }, + { "a;b" }, + { "a\\b" }, + { "\"abc" }, + { "a\"bc" }, + { "abc\"" }, + { "a b" }, + }; + } + } + public static TheoryData, string[]> ListOfCookieHeaderDataSet + { + get + { + var dataset = new TheoryData, string[]>(); + var header1 = new CookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3"); + var string1 = "name1=n1=v1&n2=v2&n3=v3"; + + var header2 = new CookieHeaderValue("name2", "value2"); + var string2 = "name2=value2"; + + var header3 = new CookieHeaderValue("name3", "value3"); + var string3 = "name3=value3"; + + var header4 = new CookieHeaderValue("name4", "\"value4\""); + var string4 = "name4=\"value4\""; + + dataset.Add(new[] { header1 }.ToList(), new[] { string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, null, "", " ", ";", " , ", string1 }); + dataset.Add(new[] { header2 }.ToList(), new[] { string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1, string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1 + ", " + string2 }); + dataset.Add(new[] { header2, header1 }.ToList(), new[] { string2 + "; " + string1 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, string4) }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(";", string1, string2, string3, string4) }); + + return dataset; + } + } + + // TODO: [Fact] + public void CookieHeaderValue_CtorThrowsOnNullName() + { + Assert.Throws(() => new CookieHeaderValue(null, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieNames))] + public void CookieHeaderValue_CtorThrowsOnInvalidName(string name) + { + Assert.Throws(() => new CookieHeaderValue(name, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieValues))] + public void CookieHeaderValue_CtorThrowsOnInvalidValue(string value) + { + Assert.Throws(() => new CookieHeaderValue("name", value)); + } + + [Fact] + public void CookieHeaderValue_Ctor1_InitializesCorrectly() + { + var header = new CookieHeaderValue("cookie"); + Assert.Equal("cookie", header.Name); + Assert.Equal(string.Empty, header.Value); + } + + [Theory] + [InlineData("name", "")] + [InlineData("name", "value")] + [InlineData("name", "\"acb\"")] + public void CookieHeaderValue_Ctor2InitializesCorrectly(string name, string value) + { + var header = new CookieHeaderValue(name, value); + Assert.Equal(name, header.Name); + Assert.Equal(value, header.Value); + } + + [Fact] + public void CookieHeaderValue_Value() + { + var cookie = new CookieHeaderValue("name"); + Assert.Equal(String.Empty, cookie.Value); + + cookie.Value = "value1"; + Assert.Equal("value1", cookie.Value); + } + + [Theory] + [MemberData(nameof(CookieHeaderDataSet))] + public void CookieHeaderValue_ToString(CookieHeaderValue input, string expectedValue) + { + Assert.Equal(expectedValue, input.ToString()); + } + + [Theory] + [MemberData(nameof(CookieHeaderDataSet))] + public void CookieHeaderValue_Parse_AcceptsValidValues(CookieHeaderValue cookie, string expectedValue) + { + var header = CookieHeaderValue.Parse(expectedValue); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(CookieHeaderDataSet))] + public void CookieHeaderValue_TryParse_AcceptsValidValues(CookieHeaderValue cookie, string expectedValue) + { + CookieHeaderValue header; + bool result = CookieHeaderValue.TryParse(expectedValue, out header); + Assert.True(result); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(InvalidCookieHeaderDataSet))] + public void CookieHeaderValue_Parse_RejectsInvalidValues(string value) + { + Assert.Throws(() => CookieHeaderValue.Parse(value)); + } + + [Theory] + [MemberData(nameof(InvalidCookieHeaderDataSet))] + public void CookieHeaderValue_TryParse_RejectsInvalidValues(string value) + { + CookieHeaderValue header; + bool result = CookieHeaderValue.TryParse(value, out header); + + Assert.False(result); + } + + [Theory] + [MemberData(nameof(ListOfCookieHeaderDataSet))] + public void CookieHeaderValue_ParseList_AcceptsValidValues(IList cookies, string[] input) + { + var results = CookieHeaderValue.ParseList(input); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListOfCookieHeaderDataSet))] + public void CookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) + { + IList results; + bool result = CookieHeaderValue.TryParseList(input, out results); + Assert.True(result); + + Assert.Equal(cookies, results); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs new file mode 100644 index 0000000000..61479e9adf --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class DateParserTest + { + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + // We don't need to validate all possible date values, since they're already tested in HttpRuleParserTest. + // Just make sure the parser calls HttpRuleParser methods correctly. + CheckValidParsedValue("Tue, 15 Nov 1994 08:12:31 GMT", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero)); + CheckValidParsedValue(" Sunday, 06-Nov-94 08:49:37 GMT ", new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero)); + CheckValidParsedValue(" Tue,\r\n 15 Nov\r\n 1994 08:12:31 GMT ", new DateTimeOffset(1994, 11, 15, 8, 12, 31, TimeSpan.Zero)); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidParsedValue(null); + CheckInvalidParsedValue(string.Empty); + CheckInvalidParsedValue(" "); + CheckInvalidParsedValue("!!Sunday, 06-Nov-94 08:49:37 GMT"); + } + + [Fact] + public void ToString_UseDifferentValues_MatchExpectation() + { + Assert.Equal("Sat, 31 Jul 2010 15:38:57 GMT", + HeaderUtilities.FormatDate(new DateTimeOffset(2010, 7, 31, 15, 38, 57, TimeSpan.Zero))); + + Assert.Equal("Fri, 01 Jan 2010 01:01:01 GMT", + HeaderUtilities.FormatDate(new DateTimeOffset(2010, 1, 1, 1, 1, 1, TimeSpan.Zero))); + } + + #region Helper methods + + private void CheckValidParsedValue(string input, DateTimeOffset expectedResult) + { + DateTimeOffset result; + Assert.True(HeaderUtilities.TryParseDate(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParsedValue(string input) + { + DateTimeOffset result; + Assert.False(HeaderUtilities.TryParseDate(input, out result)); + Assert.Equal(new DateTimeOffset(), result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs new file mode 100644 index 0000000000..d94ce6409f --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs @@ -0,0 +1,315 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class EntityTagHeaderValueTest + { + [Fact] + public void Ctor_ETagNull_Throw() + { + Assert.Throws(() => new EntityTagHeaderValue(null)); + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new EntityTagHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_ETagInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException("tag"); + AssertFormatException(" tag "); + AssertFormatException("\"tag\" invalid"); + AssertFormatException("\"tag"); + AssertFormatException("tag\""); + AssertFormatException("\"tag\"\""); + AssertFormatException("\"\"tag\"\""); + AssertFormatException("\"\"tag\""); + AssertFormatException("W/\"tag\""); // tag value must not contain 'W/' + } + + [Fact] + public void Ctor_ETagValidFormat_SuccessfullyCreated() + { + var etag = new EntityTagHeaderValue("\"tag\""); + Assert.Equal("\"tag\"", etag.Tag); + Assert.False(etag.IsWeak, "IsWeak"); + } + + [Fact] + public void Ctor_ETagValidFormatAndIsWeak_SuccessfullyCreated() + { + var etag = new EntityTagHeaderValue("\"e tag\"", true); + Assert.Equal("\"e tag\"", etag.Tag); + Assert.True(etag.IsWeak, "IsWeak"); + } + + [Fact] + public void ToString_UseDifferentETags_AllSerializedCorrectly() + { + var etag = new EntityTagHeaderValue("\"e tag\""); + Assert.Equal("\"e tag\"", etag.ToString()); + + etag = new EntityTagHeaderValue("\"e tag\"", true); + Assert.Equal("W/\"e tag\"", etag.ToString()); + + etag = new EntityTagHeaderValue("\"\"", false); + Assert.Equal("\"\"", etag.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentETags_SameOrDifferentHashCodes() + { + var etag1 = new EntityTagHeaderValue("\"tag\""); + var etag2 = new EntityTagHeaderValue("\"TAG\""); + var etag3 = new EntityTagHeaderValue("\"tag\"", true); + var etag4 = new EntityTagHeaderValue("\"tag1\""); + var etag5 = new EntityTagHeaderValue("\"tag\""); + var etag6 = EntityTagHeaderValue.Any; + + Assert.NotEqual(etag1.GetHashCode(), etag2.GetHashCode()); + Assert.NotEqual(etag1.GetHashCode(), etag3.GetHashCode()); + Assert.NotEqual(etag1.GetHashCode(), etag4.GetHashCode()); + Assert.NotEqual(etag1.GetHashCode(), etag6.GetHashCode()); + Assert.Equal(etag1.GetHashCode(), etag5.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentETags_EqualOrNotEqualNoExceptions() + { + var etag1 = new EntityTagHeaderValue("\"tag\""); + var etag2 = new EntityTagHeaderValue("\"TAG\""); + var etag3 = new EntityTagHeaderValue("\"tag\"", true); + var etag4 = new EntityTagHeaderValue("\"tag1\""); + var etag5 = new EntityTagHeaderValue("\"tag\""); + var etag6 = EntityTagHeaderValue.Any; + + Assert.False(etag1.Equals(etag2), "Different casing."); + Assert.False(etag2.Equals(etag1), "Different casing."); + Assert.False(etag1.Equals(null), "tag vs. ."); + Assert.False(etag1.Equals(etag3), "strong vs. weak."); + Assert.False(etag3.Equals(etag1), "weak vs. strong."); + Assert.False(etag1.Equals(etag4), "tag vs. tag1."); + Assert.False(etag1.Equals(etag6), "tag vs. *."); + Assert.True(etag1.Equals(etag5), "tag vs. tag.."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse(" \"tag\" ", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse("\r\n \"tag\"\r\n ", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidParse("\"tag会\"", new EntityTagHeaderValue("\"tag会\"")); + CheckValidParse("W/\"tag\"", new EntityTagHeaderValue("\"tag\"", true)); + CheckValidParse("*", new EntityTagHeaderValue("*")); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(null); + CheckInvalidParse(string.Empty); + CheckInvalidParse(" "); + CheckInvalidParse(" !"); + CheckInvalidParse("tag\" !"); + CheckInvalidParse("!\"tag\""); + CheckInvalidParse("\"tag\","); + CheckInvalidParse("W"); + CheckInvalidParse("W/"); + CheckInvalidParse("W/\""); + CheckInvalidParse("\"tag\" \"tag2\""); + CheckInvalidParse("/\"tag\""); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse(" \"tag\" ", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse("\r\n \"tag\"\r\n ", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse("\"tag\"", new EntityTagHeaderValue("\"tag\"")); + CheckValidTryParse("\"tag会\"", new EntityTagHeaderValue("\"tag会\"")); + CheckValidTryParse("W/\"tag\"", new EntityTagHeaderValue("\"tag\"", true)); + CheckValidTryParse("*", new EntityTagHeaderValue("*")); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(" !"); + CheckInvalidTryParse("tag\" !"); + CheckInvalidTryParse("!\"tag\""); + CheckInvalidTryParse("\"tag\","); + CheckInvalidTryParse("\"tag\" \"tag2\""); + CheckInvalidTryParse("/\"tag\""); + } + + [Fact] + public void ParseList_NullOrEmptyArray_ReturnsEmptyList() + { + var result = EntityTagHeaderValue.ParseList(null); + Assert.NotNull(result); + Assert.Equal(0, result.Count); + + result = EntityTagHeaderValue.ParseList(new string[0]); + Assert.NotNull(result); + Assert.Equal(0, result.Count); + + result = EntityTagHeaderValue.ParseList(new string[] { "" }); + Assert.NotNull(result); + Assert.Equal(0, result.Count); + } + + [Fact] + public void TryParseList_NullOrEmptyArray_ReturnsFalse() + { + IList results = null; + Assert.False(EntityTagHeaderValue.TryParseList(null, out results)); + Assert.False(EntityTagHeaderValue.TryParseList(new string[0], out results)); + Assert.False(EntityTagHeaderValue.TryParseList(new string[] { "" }, out results)); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "\"tag\"", + "", + " \"tag\" ", + "\r\n \"tag\"\r\n ", + "\"tag会\"", + "\"tag\",\"tag\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results = EntityTagHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "\"tag\"", + "", + " \"tag\" ", + "\r\n \"tag\"\r\n ", + "\"tag会\"", + "\"tag\",\"tag\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results; + Assert.True(EntityTagHeaderValue.TryParseList(inputs, out results)); + var expectedResults = new[] + { + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag会\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\""), + new EntityTagHeaderValue("\"tag\"", true), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "\"tag\", tag, \"tag\"", + "tag, \"tag\"", + "", + " \"tag ", + "\r\n tag\"\r\n ", + "\"tag会\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + Assert.Throws(() => EntityTagHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "\"tag\", tag, \"tag\"", + "tag, \"tag\"", + "", + " \"tag ", + "\r\n tag\"\r\n ", + "\"tag会\"", + "\"tag\", \"tag\"", + "W/\"tag\"", + }; + IList results; + Assert.False(EntityTagHeaderValue.TryParseList(inputs, out results)); + } + + private void CheckValidParse(string input, EntityTagHeaderValue expectedResult) + { + var result = EntityTagHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => EntityTagHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, EntityTagHeaderValue expectedResult) + { + EntityTagHeaderValue result = null; + Assert.True(EntityTagHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + EntityTagHeaderValue result = null; + Assert.False(EntityTagHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private static void AssertFormatException(string tag) + { + Assert.Throws(() => new EntityTagHeaderValue(tag)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs new file mode 100644 index 0000000000..8ef17a55aa --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class MediaTypeHeaderValueComparerTests + { + public static IEnumerable SortValues + { + get + { + yield return new object[] { + new string[] + { + "application/*", + "text/plain", + "text/plain;q=1.0", + "text/plain", + "text/plain;q=0", + "*/*;q=0.8", + "*/*;q=1", + "text/*;q=1", + "text/plain;q=0.8", + "text/*;q=0.8", + "text/*;q=0.6", + "text/*;q=1.0", + "*/*;q=0.4", + "text/plain;q=0.6", + "text/xml", + }, + new string[] + { + "text/plain", + "text/plain;q=1.0", + "text/plain", + "text/xml", + "application/*", + "text/*;q=1", + "text/*;q=1.0", + "*/*;q=1", + "text/plain;q=0.8", + "text/*;q=0.8", + "*/*;q=0.8", + "text/plain;q=0.6", + "text/*;q=0.6", + "*/*;q=0.4", + "text/plain;q=0", + } + }; + } + } + + [Theory] + [MemberData(nameof(SortValues))] + public void SortMediaTypeHeaderValuesByQFactor_SortsCorrectly(IEnumerable unsorted, IEnumerable expectedSorted) + { + var unsortedValues = MediaTypeHeaderValue.ParseList(unsorted.ToList()); + var expectedSortedValues = MediaTypeHeaderValue.ParseList(expectedSorted.ToList()); + + var actualSorted = unsortedValues.OrderByDescending(m => m, MediaTypeHeaderValueComparer.QualityComparer).ToList(); + + Assert.Equal(expectedSortedValues, actualSorted); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs new file mode 100644 index 0000000000..140d629497 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -0,0 +1,520 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class MediaTypeHeaderValueTest + { + [Fact] + public void Ctor_MediaTypeNull_Throw() + { + Assert.Throws(() => new MediaTypeHeaderValue(null)); + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new MediaTypeHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_MediaTypeInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException(" text/plain "); + AssertFormatException("text / plain"); + AssertFormatException("text/ plain"); + AssertFormatException("text /plain"); + AssertFormatException("text/plain "); + AssertFormatException(" text/plain"); + AssertFormatException("te xt/plain"); + AssertFormatException("te=xt/plain"); + AssertFormatException("teäxt/plain"); + AssertFormatException("text/pläin"); + AssertFormatException("text"); + AssertFormatException("\"text/plain\""); + AssertFormatException("text/plain; charset=utf-8; "); + AssertFormatException("text/plain;"); + AssertFormatException("text/plain;charset=utf-8"); // ctor takes only media-type name, no parameters + } + + [Fact] + public void Ctor_MediaTypeValidFormat_SuccessfullyCreated() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Equal("text/plain", mediaType.MediaType); + Assert.Equal(0, mediaType.Parameters.Count); + Assert.Null(mediaType.Charset); + } + + [Fact] + public void Ctor_AddNameAndQuality_QualityParameterAdded() + { + var mediaType = new MediaTypeHeaderValue("application/xml", 0.08); + Assert.Equal(0.08, mediaType.Quality); + Assert.Equal("application/xml", mediaType.MediaType); + Assert.Equal(1, mediaType.Parameters.Count); + } + + [Fact] + public void Parameters_AddNull_Throw() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Throws(() => mediaType.Parameters.Add(null)); + } + + [Fact] + public void MediaType_SetAndGetMediaType_MatchExpectations() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Equal("text/plain", mediaType.MediaType); + + mediaType.MediaType = "application/xml"; + Assert.Equal("application/xml", mediaType.MediaType); + } + + [Fact] + public void Charset_SetCharsetAndValidateObject_ParametersEntryForCharsetAdded() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + mediaType.Charset = "mycharset"; + Assert.Equal("mycharset", mediaType.Charset); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("charset", mediaType.Parameters.First().Name); + + mediaType.Charset = null; + Assert.Null(mediaType.Charset); + Assert.Equal(0, mediaType.Parameters.Count); + mediaType.Charset = null; // It's OK to set it again to null; no exception. + } + + [Fact] + public void Charset_AddCharsetParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + + // Note that uppercase letters are used. Comparison should happen case-insensitive. + var charset = new NameValueHeaderValue("CHARSET", "old_charset"); + mediaType.Parameters.Add(charset); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("CHARSET", mediaType.Parameters.First().Name); + + mediaType.Charset = "new_charset"; + Assert.Equal("new_charset", mediaType.Charset); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("CHARSET", mediaType.Parameters.First().Name); + + mediaType.Parameters.Remove(charset); + Assert.Null(mediaType.Charset); + } + + [Fact] + public void Quality_SetCharsetAndValidateObject_ParametersEntryForCharsetAdded() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + mediaType.Quality = 0.563156454; + Assert.Equal(0.563, mediaType.Quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("q", mediaType.Parameters.First().Name); + Assert.Equal("0.563", mediaType.Parameters.First().Value); + + mediaType.Quality = null; + Assert.Null(mediaType.Quality); + Assert.Equal(0, mediaType.Parameters.Count); + mediaType.Quality = null; // It's OK to set it again to null; no exception. + } + + [Fact] + public void Quality_AddQualityParameterThenUseProperty_ParametersEntryIsOverwritten() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + + var quality = new NameValueHeaderValue("q", "0.132"); + mediaType.Parameters.Add(quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("q", mediaType.Parameters.First().Name); + Assert.Equal(0.132, mediaType.Quality); + + mediaType.Quality = 0.9; + Assert.Equal(0.9, mediaType.Quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("q", mediaType.Parameters.First().Name); + + mediaType.Parameters.Remove(quality); + Assert.Null(mediaType.Quality); + } + + [Fact] + public void Quality_AddQualityParameterUpperCase_CaseInsensitiveComparison() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + + var quality = new NameValueHeaderValue("Q", "0.132"); + mediaType.Parameters.Add(quality); + Assert.Equal(1, mediaType.Parameters.Count); + Assert.Equal("Q", mediaType.Parameters.First().Name); + Assert.Equal(0.132, mediaType.Quality); + } + + [Fact] + public void Quality_LessThanZero_Throw() + { + Assert.Throws(() => new MediaTypeHeaderValue("application/xml", -0.01)); + } + + [Fact] + public void Quality_GreaterThanOne_Throw() + { + var mediaType = new MediaTypeHeaderValue("application/xml"); + Assert.Throws(() => mediaType.Quality = 1.01); + } + + [Fact] + public void ToString_UseDifferentMediaTypes_AllSerializedCorrectly() + { + var mediaType = new MediaTypeHeaderValue("text/plain"); + Assert.Equal("text/plain", mediaType.ToString()); + + mediaType.Charset = "utf-8"; + Assert.Equal("text/plain; charset=utf-8", mediaType.ToString()); + + mediaType.Parameters.Add(new NameValueHeaderValue("custom", "\"custom value\"")); + Assert.Equal("text/plain; charset=utf-8; custom=\"custom value\"", mediaType.ToString()); + + mediaType.Charset = null; + Assert.Equal("text/plain; custom=\"custom value\"", mediaType.ToString()); + } + + [Fact] + public void GetHashCode_UseMediaTypeWithAndWithoutParameters_SameOrDifferentHashCodes() + { + var mediaType1 = new MediaTypeHeaderValue("text/plain"); + var mediaType2 = new MediaTypeHeaderValue("text/plain"); + mediaType2.Charset = "utf-8"; + var mediaType3 = new MediaTypeHeaderValue("text/plain"); + mediaType3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType4 = new MediaTypeHeaderValue("TEXT/plain"); + var mediaType5 = new MediaTypeHeaderValue("TEXT/plain"); + mediaType5.Parameters.Add(new NameValueHeaderValue("CHARSET", "UTF-8")); + + Assert.NotEqual(mediaType1.GetHashCode(), mediaType2.GetHashCode()); + Assert.NotEqual(mediaType1.GetHashCode(), mediaType3.GetHashCode()); + Assert.NotEqual(mediaType2.GetHashCode(), mediaType3.GetHashCode()); + Assert.Equal(mediaType1.GetHashCode(), mediaType4.GetHashCode()); + Assert.Equal(mediaType2.GetHashCode(), mediaType5.GetHashCode()); + } + + [Fact] + public void Equals_UseMediaTypeWithAndWithoutParameters_EqualOrNotEqualNoExceptions() + { + var mediaType1 = new MediaTypeHeaderValue("text/plain"); + var mediaType2 = new MediaTypeHeaderValue("text/plain"); + mediaType2.Charset = "utf-8"; + var mediaType3 = new MediaTypeHeaderValue("text/plain"); + mediaType3.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType4 = new MediaTypeHeaderValue("TEXT/plain"); + var mediaType5 = new MediaTypeHeaderValue("TEXT/plain"); + mediaType5.Parameters.Add(new NameValueHeaderValue("CHARSET", "UTF-8")); + var mediaType6 = new MediaTypeHeaderValue("TEXT/plain"); + mediaType6.Parameters.Add(new NameValueHeaderValue("CHARSET", "UTF-8")); + mediaType6.Parameters.Add(new NameValueHeaderValue("custom", "value")); + var mediaType7 = new MediaTypeHeaderValue("text/other"); + + Assert.False(mediaType1.Equals(mediaType2), "No params vs. charset."); + Assert.False(mediaType2.Equals(mediaType1), "charset vs. no params."); + Assert.False(mediaType1.Equals(null), "No params vs. ."); + Assert.False(mediaType1.Equals(mediaType3), "No params vs. custom param."); + Assert.False(mediaType2.Equals(mediaType3), "charset vs. custom param."); + Assert.True(mediaType1.Equals(mediaType4), "Different casing."); + Assert.True(mediaType2.Equals(mediaType5), "Different casing in charset."); + Assert.False(mediaType5.Equals(mediaType6), "charset vs. custom param."); + Assert.False(mediaType1.Equals(mediaType7), "text/plain vs. text/other."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse("\r\n text/plain ", new MediaTypeHeaderValue("text/plain")); + CheckValidParse("text/plain", new MediaTypeHeaderValue("text/plain")); + + CheckValidParse("\r\n text / plain ; charset = utf-8 ", new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }); + CheckValidParse(" text/plain;charset=utf-8", new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }); + + CheckValidParse("text/plain; charset=iso-8859-1", new MediaTypeHeaderValue("text/plain") { Charset = "iso-8859-1" }); + + var expected = new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }; + expected.Parameters.Add(new NameValueHeaderValue("custom", "value")); + CheckValidParse(" text/plain; custom=value;charset=utf-8", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Parameters.Add(new NameValueHeaderValue("custom")); + CheckValidParse(" text/plain; custom", expected); + + expected = new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }; + expected.Parameters.Add(new NameValueHeaderValue("custom", "\"x\"")); + CheckValidParse("text / plain ; custom =\r\n \"x\" ; charset = utf-8 ", expected); + + expected = new MediaTypeHeaderValue("text/plain") { Charset = "utf-8" }; + expected.Parameters.Add(new NameValueHeaderValue("custom", "\"x\"")); + CheckValidParse("text/plain;custom=\"x\";charset=utf-8", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + CheckValidParse("text/plain;", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Parameters.Add(new NameValueHeaderValue("name", "")); + CheckValidParse("text/plain;name=", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Parameters.Add(new NameValueHeaderValue("name", "value")); + CheckValidParse("text/plain;name=value;", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Charset = "iso-8859-1"; + expected.Quality = 1.0; + CheckValidParse("text/plain; charset=iso-8859-1; q=1.0", expected); + + expected = new MediaTypeHeaderValue("*/xml"); + expected.Charset = "utf-8"; + expected.Quality = 0.5; + CheckValidParse("\r\n */xml; charset=utf-8; q=0.5", expected); + + expected = new MediaTypeHeaderValue("*/*"); + CheckValidParse("*/*", expected); + + expected = new MediaTypeHeaderValue("text/*"); + expected.Charset = "utf-8"; + expected.Parameters.Add(new NameValueHeaderValue("foo", "bar")); + CheckValidParse("text/*; charset=utf-8; foo=bar", expected); + + expected = new MediaTypeHeaderValue("text/plain"); + expected.Charset = "utf-8"; + expected.Quality = 0; + expected.Parameters.Add(new NameValueHeaderValue("foo", "bar")); + CheckValidParse("text/plain; charset=utf-8; foo=bar; q=0.0", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse(""); + CheckInvalidParse(" "); + CheckInvalidParse(null); + CheckInvalidParse("text/plain会"); + CheckInvalidParse("text/plain ,"); + CheckInvalidParse("text/plain,"); + CheckInvalidParse("text/plain; charset=utf-8 ,"); + CheckInvalidParse("text/plain; charset=utf-8,"); + CheckInvalidParse("textplain"); + CheckInvalidParse("text/"); + CheckInvalidParse(",, , ,,text/plain; charset=iso-8859-1; q=1.0,\r\n */xml; charset=utf-8; q=0.5,,,"); + CheckInvalidParse("text/plain; charset=iso-8859-1; q=1.0, */xml; charset=utf-8; q=0.5"); + CheckInvalidParse(" , */xml; charset=utf-8; q=0.5 "); + CheckInvalidParse("text/plain; charset=iso-8859-1; q=1.0 , "); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + var expected = new MediaTypeHeaderValue("text/plain"); + CheckValidTryParse("\r\n text/plain ", expected); + CheckValidTryParse("text/plain", expected); + + // We don't have to test all possible input strings, since most of the pieces are handled by other parsers. + // The purpose of this test is to verify that these other parsers are combined correctly to build a + // media-type parser. + expected.Charset = "utf-8"; + CheckValidTryParse("\r\n text / plain ; charset = utf-8 ", expected); + CheckValidTryParse(" text/plain;charset=utf-8", expected); + + var value1 = new MediaTypeHeaderValue("text/plain"); + value1.Charset = "iso-8859-1"; + value1.Quality = 1.0; + + CheckValidTryParse("text/plain; charset=iso-8859-1; q=1.0", value1); + + var value2 = new MediaTypeHeaderValue("*/xml"); + value2.Charset = "utf-8"; + value2.Quality = 0.5; + + CheckValidTryParse("\r\n */xml; charset=utf-8; q=0.5", value2); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse(""); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(null); + CheckInvalidTryParse("text/plain会"); + CheckInvalidTryParse("text/plain ,"); + CheckInvalidTryParse("text/plain,"); + CheckInvalidTryParse("text/plain; charset=utf-8 ,"); + CheckInvalidTryParse("text/plain; charset=utf-8,"); + CheckInvalidTryParse("textplain"); + CheckInvalidTryParse("text/"); + CheckInvalidTryParse(",, , ,,text/plain; charset=iso-8859-1; q=1.0,\r\n */xml; charset=utf-8; q=0.5,,,"); + CheckInvalidTryParse("text/plain; charset=iso-8859-1; q=1.0, */xml; charset=utf-8; q=0.5"); + CheckInvalidTryParse(" , */xml; charset=utf-8; q=0.5 "); + CheckInvalidTryParse("text/plain; charset=iso-8859-1; q=1.0 , "); + } + + [Fact] + public void ParseList_NullOrEmptyArray_ReturnsEmptyList() + { + var results = MediaTypeHeaderValue.ParseList(null); + Assert.NotNull(results); + Assert.Equal(0, results.Count); + + results = MediaTypeHeaderValue.ParseList(new string[0]); + Assert.NotNull(results); + Assert.Equal(0, results.Count); + + results = MediaTypeHeaderValue.ParseList(new string[] { "" }); + Assert.NotNull(results); + Assert.Equal(0, results.Count); + } + + [Fact] + public void TryParseList_NullOrEmptyArray_ReturnsFalse() + { + IList results; + Assert.False(MediaTypeHeaderValue.TryParseList(null, out results)); + Assert.False(MediaTypeHeaderValue.TryParseList(new string[0], out results)); + Assert.False(MediaTypeHeaderValue.TryParseList(new string[] { "" }, out results)); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ReturnsValues() + { + var inputs = new[] { "text/html,application/xhtml+xml,", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; + var results = MediaTypeHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ReturnsTrue() + { + var inputs = new[] { "text/html,application/xhtml+xml,", "application/xml;q=0.9,image/webp,*/*;q=0.8" }; + IList results; + Assert.True(MediaTypeHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new MediaTypeHeaderValue("text/html"), + new MediaTypeHeaderValue("application/xhtml+xml"), + new MediaTypeHeaderValue("application/xml", 0.9), + new MediaTypeHeaderValue("image/webp"), + new MediaTypeHeaderValue("*/*", 0.8), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "text/html,application/xhtml+xml, ignore-this, ignore/this", + "application/xml;q=0.9,image/webp,*/*;q=0.8" + }; + Assert.Throws(() => MediaTypeHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "text/html,application/xhtml+xml, ignore-this, ignore/this", + "application/xml;q=0.9,image/webp,*/*;q=0.8", + "application/xml;q=0 4" + }; + IList results; + Assert.False(MediaTypeHeaderValue.TryParseList(inputs, out results)); + } + + [Theory] + [InlineData("*/*;", "*/*")] + [InlineData("text/*;", "text/*")] + [InlineData("text/plain;", "text/plain")] + [InlineData("*/*;", "*/*;charset=utf-8;")] + [InlineData("text/*;", "*/*;charset=utf-8;")] + [InlineData("text/plain;", "*/*;charset=utf-8;")] + [InlineData("text/plain;", "text/*;charset=utf-8;")] + [InlineData("text/plain;", "text/plain;charset=utf-8;")] + [InlineData("text/plain;version=v1", "Text/plain;Version=v1")] + [InlineData("text/plain;version=v1", "tExT/plain;version=V1")] + [InlineData("text/plain;version=v1", "TEXT/PLAIN;VERSION=V1")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;foo=bar;q=0.0;charset=utf-8")] // different order of parameters + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;charset=utf-8;foo=bar;q=0.0")] + public void IsSubsetOf_PositiveCases(string mediaType1, string mediaType2) + { + var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); + var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + + var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + Assert.True(isSubset); + } + + [Theory] + [InlineData("text/plain;version=v1", "text/plain;version=")] + [InlineData("*/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;missingparam=4;", "text/plain;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;missingparam=4;", "text/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/plain;missingparam=4;", "*/*;charset=utf-8;foo=bar;q=0.0")] + public void IsSubsetOf_NegativeCases(string mediaType1, string mediaType2) + { + var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); + var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + + var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + Assert.False(isSubset); + } + + private void CheckValidParse(string input, MediaTypeHeaderValue expectedResult) + { + var result = MediaTypeHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => MediaTypeHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, MediaTypeHeaderValue expectedResult) + { + MediaTypeHeaderValue result = null; + Assert.True(MediaTypeHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + MediaTypeHeaderValue result = null; + Assert.False(MediaTypeHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private static void AssertFormatException(string mediaType) + { + Assert.Throws(() => new MediaTypeHeaderValue(mediaType)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj new file mode 100644 index 0000000000..cbf789a8a0 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj @@ -0,0 +1,23 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 + Microsoft.Net.Http.Headers.Tests + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs new file mode 100644 index 0000000000..3ae04a9212 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -0,0 +1,394 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class NameValueHeaderValueTest + { + [Fact] + public void Ctor_NameNull_Throw() + { + Assert.Throws(() => new NameValueHeaderValue(null)); + // null and empty should be treated the same. So we also throw for empty strings. + Assert.Throws(() => new NameValueHeaderValue(string.Empty)); + } + + [Fact] + public void Ctor_NameInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException(" text ", null); + AssertFormatException("text ", null); + AssertFormatException(" text", null); + AssertFormatException("te xt", null); + AssertFormatException("te=xt", null); // The ctor takes a name which must not contain '='. + AssertFormatException("teäxt", null); + } + + [Fact] + public void Ctor_NameValidFormat_SuccessfullyCreated() + { + var nameValue = new NameValueHeaderValue("text", null); + Assert.Equal("text", nameValue.Name); + } + + [Fact] + public void Ctor_ValueInvalidFormat_ThrowFormatException() + { + // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. + AssertFormatException("text", " token "); + AssertFormatException("text", "token "); + AssertFormatException("text", " token"); + AssertFormatException("text", "token string"); + AssertFormatException("text", "\"quoted string with \" quotes\""); + AssertFormatException("text", "\"quoted string with \"two\" quotes\""); + } + + [Fact] + public void Ctor_ValueValidFormat_SuccessfullyCreated() + { + CheckValue(null); + CheckValue(string.Empty); + CheckValue("token_string"); + CheckValue("\"quoted string\""); + CheckValue("\"quoted string with quoted \\\" quote-pair\""); + } + + [Fact] + public void Value_CallSetterWithInvalidValues_Throw() + { + // Just verify that the setter calls the same validation the ctor invokes. + Assert.Throws(() => { var x = new NameValueHeaderValue("name"); x.Value = " x "; }); + Assert.Throws(() => { var x = new NameValueHeaderValue("name"); x.Value = "x y"; }); + } + + [Fact] + public void ToString_UseNoValueAndTokenAndQuotedStringValues_SerializedCorrectly() + { + var nameValue = new NameValueHeaderValue("text", "token"); + Assert.Equal("text=token", nameValue.ToString()); + + nameValue.Value = "\"quoted string\""; + Assert.Equal("text=\"quoted string\"", nameValue.ToString()); + + nameValue.Value = null; + Assert.Equal("text", nameValue.ToString()); + + nameValue.Value = string.Empty; + Assert.Equal("text", nameValue.ToString()); + } + + [Fact] + public void GetHashCode_ValuesUseDifferentValues_HashDiffersAccordingToRfc() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("text"); + + nameValue1.Value = null; + nameValue2.Value = null; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = null; + Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = string.Empty; + Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = null; + nameValue2.Value = string.Empty; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = "TOKEN"; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "token"; + nameValue2.Value = "token"; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"QUOTED STRING\""; + Assert.NotEqual(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"quoted string\""; + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + } + + [Fact] + public void GetHashCode_NameUseDifferentCasing_HashDiffersAccordingToRfc() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("TEXT"); + Assert.Equal(nameValue1.GetHashCode(), nameValue2.GetHashCode()); + } + + [Fact] + public void Equals_ValuesUseDifferentValues_ValuesAreEqualOrDifferentAccordingToRfc() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("text"); + + nameValue1.Value = null; + nameValue2.Value = null; + Assert.True(nameValue1.Equals(nameValue2), " vs. ."); + + nameValue1.Value = "token"; + nameValue2.Value = null; + Assert.False(nameValue1.Equals(nameValue2), "token vs. ."); + + nameValue1.Value = null; + nameValue2.Value = "token"; + Assert.False(nameValue1.Equals(nameValue2), " vs. token."); + + nameValue1.Value = string.Empty; + nameValue2.Value = "token"; + Assert.False(nameValue1.Equals(nameValue2), "string.Empty vs. token."); + + nameValue1.Value = null; + nameValue2.Value = string.Empty; + Assert.True(nameValue1.Equals(nameValue2), " vs. string.Empty."); + + nameValue1.Value = "token"; + nameValue2.Value = "TOKEN"; + Assert.True(nameValue1.Equals(nameValue2), "token vs. TOKEN."); + + nameValue1.Value = "token"; + nameValue2.Value = "token"; + Assert.True(nameValue1.Equals(nameValue2), "token vs. token."); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"QUOTED STRING\""; + Assert.False(nameValue1.Equals(nameValue2), "\"quoted string\" vs. \"QUOTED STRING\"."); + + nameValue1.Value = "\"quoted string\""; + nameValue2.Value = "\"quoted string\""; + Assert.True(nameValue1.Equals(nameValue2), "\"quoted string\" vs. \"quoted string\"."); + + Assert.False(nameValue1.Equals(null), "\"quoted string\" vs. ."); + } + + [Fact] + public void Equals_NameUseDifferentCasing_ConsideredEqual() + { + var nameValue1 = new NameValueHeaderValue("text"); + var nameValue2 = new NameValueHeaderValue("TEXT"); + Assert.True(nameValue1.Equals(nameValue2), "text vs. TEXT."); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" name = value ", new NameValueHeaderValue("name", "value")); + CheckValidParse(" name", new NameValueHeaderValue("name")); + CheckValidParse(" name ", new NameValueHeaderValue("name")); + CheckValidParse(" name=\"value\"", new NameValueHeaderValue("name", "\"value\"")); + CheckValidParse("name=value", new NameValueHeaderValue("name", "value")); + CheckValidParse("name=\"quoted str\"", new NameValueHeaderValue("name", "\"quoted str\"")); + CheckValidParse("name\t =va1ue", new NameValueHeaderValue("name", "va1ue")); + CheckValidParse("name= va*ue ", new NameValueHeaderValue("name", "va*ue")); + CheckValidParse("name=", new NameValueHeaderValue("name", "")); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse("name[value"); + CheckInvalidParse("name=value="); + CheckInvalidParse("name=会"); + CheckInvalidParse("name==value"); + CheckInvalidParse("name= va:ue"); + CheckInvalidParse("=value"); + CheckInvalidParse("name value"); + CheckInvalidParse("name=,value"); + CheckInvalidParse("会"); + CheckInvalidParse(null); + CheckInvalidParse(string.Empty); + CheckInvalidParse(" "); + CheckInvalidParse(" ,,"); + CheckInvalidParse(" , , name = value , "); + CheckInvalidParse(" name,"); + CheckInvalidParse(" ,name=\"value\""); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" name = value ", new NameValueHeaderValue("name", "value")); + CheckValidTryParse(" name", new NameValueHeaderValue("name")); + CheckValidTryParse(" name=\"value\"", new NameValueHeaderValue("name", "\"value\"")); + CheckValidTryParse("name=value", new NameValueHeaderValue("name", "value")); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("name[value"); + CheckInvalidTryParse("name=value="); + CheckInvalidTryParse("name=会"); + CheckInvalidTryParse("name==value"); + CheckInvalidTryParse("=value"); + CheckInvalidTryParse("name value"); + CheckInvalidTryParse("name=,value"); + CheckInvalidTryParse("会"); + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(" ,,"); + CheckInvalidTryParse(" , , name = value , "); + CheckInvalidTryParse(" name,"); + CheckInvalidTryParse(" ,name=\"value\""); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "name=value1", + "", + " name = value2 ", + "\r\n name =value3\r\n ", + "name=\"value 4\"", + "name=\"value会5\"", + "name=value6,name=value7", + "name=\"value 8\", name= \"value 9\"", + }; + var results = NameValueHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new NameValueHeaderValue("name", "value1"), + new NameValueHeaderValue("name", "value2"), + new NameValueHeaderValue("name", "value3"), + new NameValueHeaderValue("name", "\"value 4\""), + new NameValueHeaderValue("name", "\"value会5\""), + new NameValueHeaderValue("name", "value6"), + new NameValueHeaderValue("name", "value7"), + new NameValueHeaderValue("name", "\"value 8\""), + new NameValueHeaderValue("name", "\"value 9\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "name=value1", + "", + " name = value2 ", + "\r\n name =value3\r\n ", + "name=\"value 4\"", + "name=\"value会5\"", + "name=value6,name=value7", + "name=\"value 8\", name= \"value 9\"", + }; + IList results; + Assert.True(NameValueHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new NameValueHeaderValue("name", "value1"), + new NameValueHeaderValue("name", "value2"), + new NameValueHeaderValue("name", "value3"), + new NameValueHeaderValue("name", "\"value 4\""), + new NameValueHeaderValue("name", "\"value会5\""), + new NameValueHeaderValue("name", "value6"), + new NameValueHeaderValue("name", "value7"), + new NameValueHeaderValue("name", "\"value 8\""), + new NameValueHeaderValue("name", "\"value 9\""), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "name1=value1", + "name2", + " name3 = 3, value a", + "name4 =value4, name5 = value5 b", + "name6=\"value 6", + "name7=\"value会7\"", + "name8=value8,name9=value9", + "name10=\"value 10\", name11= \"value 11\"", + }; + Assert.Throws(() => NameValueHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "name1=value1", + "name2", + " name3 = 3, value a", + "name4 =value4, name5 = value5 b", + "name6=\"value 6", + "name7=\"value会7\"", + "name8=value8,name9=value9", + "name10=\"value 10\", name11= \"value 11\"", + }; + IList results; + Assert.False(NameValueHeaderValue.TryParseList(inputs, out results)); + } + + #region Helper methods + + private void CheckValidParse(string input, NameValueHeaderValue expectedResult) + { + var result = NameValueHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => NameValueHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, NameValueHeaderValue expectedResult) + { + NameValueHeaderValue result = null; + Assert.True(NameValueHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + NameValueHeaderValue result = null; + Assert.False(NameValueHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + private static void CheckValue(string value) + { + var nameValue = new NameValueHeaderValue("text", value); + Assert.Equal(value, nameValue.Value); + } + + private static void AssertFormatException(string name, string value) + { + Assert.Throws(() => new NameValueHeaderValue(name, value)); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs new file mode 100644 index 0000000000..b47b03b026 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -0,0 +1,174 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeConditionHeaderValueTest + { + [Fact] + public void Ctor_EntityTagOverload_MatchExpectation() + { + var rangeCondition = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + Assert.Equal(new EntityTagHeaderValue("\"x\""), rangeCondition.EntityTag); + Assert.Null(rangeCondition.LastModified); + + EntityTagHeaderValue input = null; + Assert.Throws(() => new RangeConditionHeaderValue(input)); + } + + [Fact] + public void Ctor_EntityTagStringOverload_MatchExpectation() + { + var rangeCondition = new RangeConditionHeaderValue("\"y\""); + Assert.Equal(new EntityTagHeaderValue("\"y\""), rangeCondition.EntityTag); + Assert.Null(rangeCondition.LastModified); + + Assert.Throws(() => new RangeConditionHeaderValue((string)null)); + } + + [Fact] + public void Ctor_DateOverload_MatchExpectation() + { + var rangeCondition = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + Assert.Null(rangeCondition.EntityTag); + Assert.Equal(new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero), rangeCondition.LastModified); + } + + [Fact] + public void ToString_UseDifferentrangeConditions_AllSerializedCorrectly() + { + var rangeCondition = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + Assert.Equal("\"x\"", rangeCondition.ToString()); + + rangeCondition = new RangeConditionHeaderValue(new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + Assert.Equal("Thu, 15 Jul 2010 12:33:57 GMT", rangeCondition.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentrangeConditions_SameOrDifferentHashCodes() + { + var rangeCondition1 = new RangeConditionHeaderValue("\"x\""); + var rangeCondition2 = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + var rangeCondition3 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition4 = new RangeConditionHeaderValue( + new DateTimeOffset(2008, 8, 16, 13, 44, 10, TimeSpan.Zero)); + var rangeCondition5 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition6 = new RangeConditionHeaderValue( + new EntityTagHeaderValue("\"x\"", true)); + + Assert.Equal(rangeCondition1.GetHashCode(), rangeCondition2.GetHashCode()); + Assert.NotEqual(rangeCondition1.GetHashCode(), rangeCondition3.GetHashCode()); + Assert.NotEqual(rangeCondition3.GetHashCode(), rangeCondition4.GetHashCode()); + Assert.Equal(rangeCondition3.GetHashCode(), rangeCondition5.GetHashCode()); + Assert.NotEqual(rangeCondition1.GetHashCode(), rangeCondition6.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var rangeCondition1 = new RangeConditionHeaderValue("\"x\""); + var rangeCondition2 = new RangeConditionHeaderValue(new EntityTagHeaderValue("\"x\"")); + var rangeCondition3 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition4 = new RangeConditionHeaderValue( + new DateTimeOffset(2008, 8, 16, 13, 44, 10, TimeSpan.Zero)); + var rangeCondition5 = new RangeConditionHeaderValue( + new DateTimeOffset(2010, 7, 15, 12, 33, 57, TimeSpan.Zero)); + var rangeCondition6 = new RangeConditionHeaderValue( + new EntityTagHeaderValue("\"x\"", true)); + + Assert.False(rangeCondition1.Equals(null), "\"x\" vs. "); + Assert.True(rangeCondition1.Equals(rangeCondition2), "\"x\" vs. \"x\""); + Assert.False(rangeCondition1.Equals(rangeCondition3), "\"x\" vs. date"); + Assert.False(rangeCondition3.Equals(rangeCondition1), "date vs. \"x\""); + Assert.False(rangeCondition3.Equals(rangeCondition4), "date vs. different date"); + Assert.True(rangeCondition3.Equals(rangeCondition5), "date vs. date"); + Assert.False(rangeCondition1.Equals(rangeCondition6), "\"x\" vs. W/\"x\""); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" \"x\" ", new RangeConditionHeaderValue("\"x\"")); + CheckValidParse(" Sun, 06 Nov 1994 08:49:37 GMT ", + new RangeConditionHeaderValue(new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero))); + CheckValidParse("Wed, 09 Nov 1994 08:49:37 GMT", + new RangeConditionHeaderValue(new DateTimeOffset(1994, 11, 9, 8, 49, 37, TimeSpan.Zero))); + CheckValidParse(" W/ \"tag\" ", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidParse(" w/\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidParse("\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\""))); + } + + [Theory] + [InlineData("\"x\" ,")] // no delimiter allowed + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT ,")] // no delimiter allowed + [InlineData("\"x\" Sun, 06 Nov 1994 08:49:37 GMT")] + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] + [InlineData(null)] + [InlineData("")] + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x")] + [InlineData("Wed, 09 Nov")] + [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x\",")] + [InlineData("Wed 09 Nov 1994 08:49:37 GMT,")] + public void Parse_SetOfInvalidValueStrings_Throws(string input) + { + Assert.Throws(() => RangeConditionHeaderValue.Parse(input)); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" \"x\" ", new RangeConditionHeaderValue("\"x\"")); + CheckValidTryParse(" Sun, 06 Nov 1994 08:49:37 GMT ", + new RangeConditionHeaderValue(new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero))); + CheckValidTryParse(" W/ \"tag\" ", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidTryParse(" w/\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\"", true))); + CheckValidTryParse("\"tag\"", new RangeConditionHeaderValue(new EntityTagHeaderValue("\"tag\""))); + } + + [Theory] + [InlineData("\"x\" ,")] // no delimiter allowed + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT ,")] // no delimiter allowed + [InlineData("\"x\" Sun, 06 Nov 1994 08:49:37 GMT")] + [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] + [InlineData(null)] + [InlineData("")] + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x")] + [InlineData("Wed, 09 Nov")] + [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] + [InlineData("\"x\",")] + [InlineData("Wed 09 Nov 1994 08:49:37 GMT,")] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse(string input) + { + RangeConditionHeaderValue result = null; + Assert.False(RangeConditionHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #region Helper methods + + private void CheckValidParse(string input, RangeConditionHeaderValue expectedResult) + { + var result = RangeConditionHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckValidTryParse(string input, RangeConditionHeaderValue expectedResult) + { + RangeConditionHeaderValue result = null; + Assert.True(RangeConditionHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs new file mode 100644 index 0000000000..22dc5dc749 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs @@ -0,0 +1,183 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeHeaderValueTest + { + [Fact] + public void Ctor_InvalidRange_Throw() + { + Assert.Throws(() => new RangeHeaderValue(5, 2)); + } + + [Fact] + public void Unit_GetAndSetValidAndInvalidValues_MatchExpectation() + { + var range = new RangeHeaderValue(); + range.Unit = "myunit"; + Assert.Equal("myunit", range.Unit); + + Assert.Throws(() => range.Unit = null); + Assert.Throws(() => range.Unit = ""); + Assert.Throws(() => range.Unit = " x"); + Assert.Throws(() => range.Unit = "x "); + Assert.Throws(() => range.Unit = "x y"); + } + + [Fact] + public void ToString_UseDifferentRanges_AllSerializedCorrectly() + { + var range = new RangeHeaderValue(); + range.Unit = "myunit"; + range.Ranges.Add(new RangeItemHeaderValue(1, 3)); + Assert.Equal("myunit=1-3", range.ToString()); + + range.Ranges.Add(new RangeItemHeaderValue(5, null)); + range.Ranges.Add(new RangeItemHeaderValue(null, 17)); + Assert.Equal("myunit=1-3, 5-, -17", range.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentRanges_SameOrDifferentHashCodes() + { + var range1 = new RangeHeaderValue(1, 2); + var range2 = new RangeHeaderValue(1, 2); + range2.Unit = "BYTES"; + var range3 = new RangeHeaderValue(1, null); + var range4 = new RangeHeaderValue(null, 2); + var range5 = new RangeHeaderValue(); + range5.Ranges.Add(new RangeItemHeaderValue(1, 2)); + range5.Ranges.Add(new RangeItemHeaderValue(3, 4)); + var range6 = new RangeHeaderValue(); + range6.Ranges.Add(new RangeItemHeaderValue(3, 4)); // reverse order of range5 + range6.Ranges.Add(new RangeItemHeaderValue(1, 2)); + + Assert.Equal(range1.GetHashCode(), range2.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range3.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range4.GetHashCode()); + Assert.NotEqual(range1.GetHashCode(), range5.GetHashCode()); + Assert.Equal(range5.GetHashCode(), range6.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var range1 = new RangeHeaderValue(1, 2); + var range2 = new RangeHeaderValue(1, 2); + range2.Unit = "BYTES"; + var range3 = new RangeHeaderValue(1, null); + var range4 = new RangeHeaderValue(null, 2); + var range5 = new RangeHeaderValue(); + range5.Ranges.Add(new RangeItemHeaderValue(1, 2)); + range5.Ranges.Add(new RangeItemHeaderValue(3, 4)); + var range6 = new RangeHeaderValue(); + range6.Ranges.Add(new RangeItemHeaderValue(3, 4)); // reverse order of range5 + range6.Ranges.Add(new RangeItemHeaderValue(1, 2)); + var range7 = new RangeHeaderValue(1, 2); + range7.Unit = "other"; + + Assert.False(range1.Equals(null), "bytes=1-2 vs. "); + Assert.True(range1.Equals(range2), "bytes=1-2 vs. BYTES=1-2"); + Assert.False(range1.Equals(range3), "bytes=1-2 vs. bytes=1-"); + Assert.False(range1.Equals(range4), "bytes=1-2 vs. bytes=-2"); + Assert.False(range1.Equals(range5), "bytes=1-2 vs. bytes=1-2,3-4"); + Assert.True(range5.Equals(range6), "bytes=1-2,3-4 vs. bytes=3-4,1-2"); + Assert.False(range1.Equals(range7), "bytes=1-2 vs. other=1-2"); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse(" bytes=1-2 ", new RangeHeaderValue(1, 2)); + + var expected = new RangeHeaderValue(); + expected.Unit = "custom"; + expected.Ranges.Add(new RangeItemHeaderValue(null, 5)); + expected.Ranges.Add(new RangeItemHeaderValue(1, 4)); + CheckValidParse("custom = - 5 , 1 - 4 ,,", expected); + + expected = new RangeHeaderValue(); + expected.Unit = "custom"; + expected.Ranges.Add(new RangeItemHeaderValue(1, 2)); + CheckValidParse(" custom = 1 - 2", expected); + + expected = new RangeHeaderValue(); + expected.Ranges.Add(new RangeItemHeaderValue(1, 2)); + expected.Ranges.Add(new RangeItemHeaderValue(3, null)); + expected.Ranges.Add(new RangeItemHeaderValue(null, 4)); + CheckValidParse("bytes =1-2,,3-, , ,-4,,", expected); + } + + [Fact] + public void Parse_SetOfInvalidValueStrings_Throws() + { + CheckInvalidParse("bytes=1-2x"); // only delimiter ',' allowed after last range + CheckInvalidParse("x bytes=1-2"); + CheckInvalidParse("bytes=1-2.4"); + CheckInvalidParse(null); + CheckInvalidParse(string.Empty); + + CheckInvalidParse("bytes=1"); + CheckInvalidParse("bytes="); + CheckInvalidParse("bytes"); + CheckInvalidParse("bytes 1-2"); + CheckInvalidParse("bytes= ,,, , ,,"); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse(" bytes=1-2 ", new RangeHeaderValue(1, 2)); + + var expected = new RangeHeaderValue(); + expected.Unit = "custom"; + expected.Ranges.Add(new RangeItemHeaderValue(null, 5)); + expected.Ranges.Add(new RangeItemHeaderValue(1, 4)); + CheckValidTryParse("custom = - 5 , 1 - 4 ,,", expected); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("bytes=1-2x"); // only delimiter ',' allowed after last range + CheckInvalidTryParse("x bytes=1-2"); + CheckInvalidTryParse("bytes=1-2.4"); + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + } + + #region Helper methods + + private void CheckValidParse(string input, RangeHeaderValue expectedResult) + { + var result = RangeHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidParse(string input) + { + Assert.Throws(() => RangeHeaderValue.Parse(input)); + } + + private void CheckValidTryParse(string input, RangeHeaderValue expectedResult) + { + RangeHeaderValue result = null; + Assert.True(RangeHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + RangeHeaderValue result = null; + Assert.False(RangeHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs new file mode 100644 index 0000000000..573ae8964e --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs @@ -0,0 +1,162 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class RangeItemHeaderValueTest + { + [Fact] + public void Ctor_BothValuesNull_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(null, null)); + } + + [Fact] + public void Ctor_FromValueNegative_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(-1, null)); + } + + [Fact] + public void Ctor_FromGreaterThanToValue_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(2, 1)); + } + + [Fact] + public void Ctor_ToValueNegative_Throw() + { + Assert.Throws(() => new RangeItemHeaderValue(null, -1)); + } + + [Fact] + public void Ctor_ValidFormat_SuccessfullyCreated() + { + var rangeItem = new RangeItemHeaderValue(1, 2); + Assert.Equal(1, rangeItem.From); + Assert.Equal(2, rangeItem.To); + } + + [Fact] + public void ToString_UseDifferentRangeItems_AllSerializedCorrectly() + { + // Make sure ToString() doesn't add any separators. + var rangeItem = new RangeItemHeaderValue(1000000000, 2000000000); + Assert.Equal("1000000000-2000000000", rangeItem.ToString()); + + rangeItem = new RangeItemHeaderValue(5, null); + Assert.Equal("5-", rangeItem.ToString()); + + rangeItem = new RangeItemHeaderValue(null, 10); + Assert.Equal("-10", rangeItem.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentRangeItems_SameOrDifferentHashCodes() + { + var rangeItem1 = new RangeItemHeaderValue(1, 2); + var rangeItem2 = new RangeItemHeaderValue(1, null); + var rangeItem3 = new RangeItemHeaderValue(null, 2); + var rangeItem4 = new RangeItemHeaderValue(2, 2); + var rangeItem5 = new RangeItemHeaderValue(1, 2); + + Assert.NotEqual(rangeItem1.GetHashCode(), rangeItem2.GetHashCode()); + Assert.NotEqual(rangeItem1.GetHashCode(), rangeItem3.GetHashCode()); + Assert.NotEqual(rangeItem1.GetHashCode(), rangeItem4.GetHashCode()); + Assert.Equal(rangeItem1.GetHashCode(), rangeItem5.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var rangeItem1 = new RangeItemHeaderValue(1, 2); + var rangeItem2 = new RangeItemHeaderValue(1, null); + var rangeItem3 = new RangeItemHeaderValue(null, 2); + var rangeItem4 = new RangeItemHeaderValue(2, 2); + var rangeItem5 = new RangeItemHeaderValue(1, 2); + + Assert.False(rangeItem1.Equals(rangeItem2), "1-2 vs. 1-."); + Assert.False(rangeItem2.Equals(rangeItem1), "1- vs. 1-2."); + Assert.False(rangeItem1.Equals(null), "1-2 vs. null."); + Assert.False(rangeItem1.Equals(rangeItem3), "1-2 vs. -2."); + Assert.False(rangeItem3.Equals(rangeItem1), "-2 vs. 1-2."); + Assert.False(rangeItem1.Equals(rangeItem4), "1-2 vs. 2-2."); + Assert.True(rangeItem1.Equals(rangeItem5), "1-2 vs. 1-2."); + } + + [Fact] + public void TryParse_DifferentValidScenarios_AllReturnNonZero() + { + CheckValidTryParse("1-2", 1, 2); + CheckValidTryParse(" 1-2", 1, 2); + CheckValidTryParse("0-0", 0, 0); + CheckValidTryParse(" 1-", 1, null); + CheckValidTryParse(" -2", null, 2); + + CheckValidTryParse(" 684684 - 123456789012345 ", 684684, 123456789012345); + + // The separator doesn't matter. It only parses until the first non-whitespace + CheckValidTryParse(" 1 - 2 ,", 1, 2); + + CheckValidTryParse(",,1-2, 3 - , , -6 , ,,", new Tuple(1, 2), new Tuple(3, null), + new Tuple(null, 6)); + CheckValidTryParse("1-2,", new Tuple(1, 2)); + CheckValidTryParse("1-", new Tuple(1, null)); + } + + [Theory] + [InlineData(null)] + [InlineData("")] + [InlineData(",,")] + [InlineData("1")] + [InlineData("1-2,3")] + [InlineData("1--2")] + [InlineData("1,-2")] + [InlineData("-")] + [InlineData("--")] + [InlineData("2-1")] + [InlineData("12345678901234567890123-")] // >>Int64.MaxValue + [InlineData("-12345678901234567890123")] // >>Int64.MaxValue + [InlineData("9999999999999999999-")] // 19-digit numbers outside the Int64 range. + [InlineData("-9999999999999999999")] // 19-digit numbers outside the Int64 range. + public void TryParse_DifferentInvalidScenarios_AllReturnFalse(string input) + { + RangeHeaderValue result; + Assert.False(RangeHeaderValue.TryParse("byte=" + input, out result)); + } + + private static void CheckValidTryParse(string input, long? expectedFrom, long? expectedTo) + { + RangeHeaderValue result; + Assert.True(RangeHeaderValue.TryParse("byte=" + input, out result), input); + + var ranges = result.Ranges.ToArray(); + Assert.Equal(1, ranges.Length); + + var range = ranges.First(); + + Assert.Equal(expectedFrom, range.From); + Assert.Equal(expectedTo, range.To); + } + + private static void CheckValidTryParse(string input, params Tuple[] expectedRanges) + { + RangeHeaderValue result; + Assert.True(RangeHeaderValue.TryParse("byte=" + input, out result), input); + + var ranges = result.Ranges.ToArray(); + Assert.Equal(expectedRanges.Length, ranges.Length); + + for (int i = 0; i < expectedRanges.Length; i++) + { + Assert.Equal(expectedRanges[i].Item1, ranges[i].From); + Assert.Equal(expectedRanges[i].Item2, ranges[i].To); + } + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs new file mode 100644 index 0000000000..ee3e12292b --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -0,0 +1,259 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class SetCookieHeaderValueTest + { + public static TheoryData SetCookieHeaderDataSet + { + get + { + var dataset = new TheoryData(); + var header1 = new SetCookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + HttpOnly = true, + MaxAge = TimeSpan.FromDays(1), + Path = "path1", + Secure = true + }; + dataset.Add(header1, "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"); + + var header2 = new SetCookieHeaderValue("name2", ""); + dataset.Add(header2, "name2="); + + var header3 = new SetCookieHeaderValue("name2", "value2"); + dataset.Add(header3, "name2=value2"); + + var header4 = new SetCookieHeaderValue("name4", "value4") + { + MaxAge = TimeSpan.FromDays(1), + }; + dataset.Add(header4, "name4=value4; max-age=86400"); + + var header5 = new SetCookieHeaderValue("name5", "value5") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + }; + dataset.Add(header5, "name5=value5; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"); + + return dataset; + } + } + + public static TheoryData InvalidSetCookieHeaderDataSet + { + get + { + return new TheoryData + { + "expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1", + "name=value; expires=Sun, 06 Nov 1994 08:49:37 ZZZ; max-age=86400; domain=domain1", + "name=value; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=-86400; domain=domain1", + }; + } + } + + public static TheoryData InvalidCookieNames + { + get + { + return new TheoryData + { + "", + "{acb}", + "[acb]", + "\"acb\"", + "a,b", + "a;b", + "a\\b", + }; + } + } + + public static TheoryData InvalidCookieValues + { + get + { + return new TheoryData + { + { "\"" }, + { "a,b" }, + { "a;b" }, + { "a\\b" }, + { "\"abc" }, + { "a\"bc" }, + { "abc\"" }, + }; + } + } + public static TheoryData, string[]> ListOfSetCookieHeaderDataSet + { + get + { + var dataset = new TheoryData, string[]>(); + var header1 = new SetCookieHeaderValue("name1", "n1=v1&n2=v2&n3=v3") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + HttpOnly = true, + MaxAge = TimeSpan.FromDays(1), + Path = "path1", + Secure = true + }; + var string1 = "name1=n1=v1&n2=v2&n3=v3; expires=Sun, 06 Nov 1994 08:49:37 GMT; max-age=86400; domain=domain1; path=path1; secure; httponly"; + + var header2 = new SetCookieHeaderValue("name2", "value2"); + var string2 = "name2=value2"; + + var header3 = new SetCookieHeaderValue("name3", "value3") + { + MaxAge = TimeSpan.FromDays(1), + }; + var string3 = "name3=value3; max-age=86400"; + + var header4 = new SetCookieHeaderValue("name4", "value4") + { + Domain = "domain1", + Expires = new DateTimeOffset(1994, 11, 6, 8, 49, 37, TimeSpan.Zero), + }; + var string4 = "name4=value4; expires=Sun, 06 Nov 1994 08:49:37 GMT; domain=domain1"; + + dataset.Add(new[] { header1 }.ToList(), new[] { string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, string1 }); + dataset.Add(new[] { header1, header1 }.ToList(), new[] { string1, null, "", " ", ",", " , ", string1 }); + dataset.Add(new[] { header2 }.ToList(), new[] { string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1, string2 }); + dataset.Add(new[] { header1, header2 }.ToList(), new[] { string1 + ", " + string2 }); + dataset.Add(new[] { header2, header1 }.ToList(), new[] { string2 + ", " + string1 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string1, string2, string3, string4 }); + dataset.Add(new[] { header1, header2, header3, header4 }.ToList(), new[] { string.Join(",", string1, string2, string3, string4) }); + + return dataset; + } + } + + // TODO: [Fact] + public void SetCookieHeaderValue_CtorThrowsOnNullName() + { + Assert.Throws(() => new SetCookieHeaderValue(null, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieNames))] + public void SetCookieHeaderValue_CtorThrowsOnInvalidName(string name) + { + Assert.Throws(() => new SetCookieHeaderValue(name, "value")); + } + + [Theory] + [MemberData(nameof(InvalidCookieValues))] + public void SetCookieHeaderValue_CtorThrowsOnInvalidValue(string value) + { + Assert.Throws(() => new SetCookieHeaderValue("name", value)); + } + + [Fact] + public void SetCookieHeaderValue_Ctor1_InitializesCorrectly() + { + var header = new SetCookieHeaderValue("cookie"); + Assert.Equal("cookie", header.Name); + Assert.Equal(string.Empty, header.Value); + } + + [Theory] + [InlineData("name", "")] + [InlineData("name", "value")] + [InlineData("name", "\"acb\"")] + public void SetCookieHeaderValue_Ctor2InitializesCorrectly(string name, string value) + { + var header = new SetCookieHeaderValue(name, value); + Assert.Equal(name, header.Name); + Assert.Equal(value, header.Value); + } + + [Fact] + public void SetCookieHeaderValue_Value() + { + var cookie = new SetCookieHeaderValue("name"); + Assert.Equal(String.Empty, cookie.Value); + + cookie.Value = "value1"; + Assert.Equal("value1", cookie.Value); + } + + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ToString(SetCookieHeaderValue input, string expectedValue) + { + Assert.Equal(expectedValue, input.ToString()); + } + + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_Parse_AcceptsValidValues(SetCookieHeaderValue cookie, string expectedValue) + { + var header = SetCookieHeaderValue.Parse(expectedValue); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(SetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParse_AcceptsValidValues(SetCookieHeaderValue cookie, string expectedValue) + { + SetCookieHeaderValue header; + bool result = SetCookieHeaderValue.TryParse(expectedValue, out header); + Assert.True(result); + + Assert.Equal(cookie, header); + Assert.Equal(expectedValue, header.ToString()); + } + + [Theory] + [MemberData(nameof(InvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_Parse_RejectsInvalidValues(string value) + { + Assert.Throws(() => SetCookieHeaderValue.Parse(value)); + } + + [Theory] + [MemberData(nameof(InvalidSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParse_RejectsInvalidValues(string value) + { + SetCookieHeaderValue header; + bool result = SetCookieHeaderValue.TryParse(value, out header); + + Assert.False(result); + } + + [Theory] + [MemberData(nameof(ListOfSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_ParseList_AcceptsValidValues(IList cookies, string[] input) + { + var results = SetCookieHeaderValue.ParseList(input); + + Assert.Equal(cookies, results); + } + + [Theory] + [MemberData(nameof(ListOfSetCookieHeaderDataSet))] + public void SetCookieHeaderValue_TryParseList_AcceptsValidValues(IList cookies, string[] input) + { + IList results; + bool result = SetCookieHeaderValue.TryParseList(input, out results); + Assert.True(result); + + Assert.Equal(cookies, results); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs new file mode 100644 index 0000000000..df4e729493 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class StringWithQualityHeaderValueComparerTest + { + public static TheoryData StringWithQualityHeaderValueComparerTestsBeforeAfterSortedValues + { + get + { + return new TheoryData + { + { + new string[] + { + "text", + "text;q=1.0", + "text", + "text;q=0", + "*;q=0.8", + "*;q=1", + "text;q=0.8", + "*;q=0.6", + "text;q=1.0", + "*;q=0.4", + "text;q=0.6", + }, + new string[] + { + "text", + "text;q=1.0", + "text", + "text;q=1.0", + "*;q=1", + "text;q=0.8", + "*;q=0.8", + "text;q=0.6", + "*;q=0.6", + "*;q=0.4", + "text;q=0", + } + } + }; + } + } + + [Theory] + [MemberData(nameof(StringWithQualityHeaderValueComparerTestsBeforeAfterSortedValues))] + public void SortStringWithQualityHeaderValuesByQFactor_SortsCorrectly(IEnumerable unsorted, IEnumerable expectedSorted) + { + var unsortedValues = StringWithQualityHeaderValue.ParseList(unsorted.ToList()); + var expectedSortedValues = StringWithQualityHeaderValue.ParseList(expectedSorted.ToList()); + + var actualSorted = unsortedValues.OrderByDescending(k => k, StringWithQualityHeaderValueComparer.QualityComparer).ToList(); + + Assert.True(expectedSortedValues.SequenceEqual(actualSorted)); + } + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs new file mode 100644 index 0000000000..0a57c61958 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs @@ -0,0 +1,339 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Net.Http.Headers +{ + public class StringWithQualityHeaderValueTest + { + [Fact] + public void Ctor_StringOnlyOverload_MatchExpectation() + { + var value = new StringWithQualityHeaderValue("token"); + Assert.Equal("token", value.Value); + Assert.Null(value.Quality); + + Assert.Throws(() => new StringWithQualityHeaderValue(null)); + Assert.Throws(() => new StringWithQualityHeaderValue("")); + Assert.Throws(() => new StringWithQualityHeaderValue("in valid")); + } + + [Fact] + public void Ctor_StringWithQualityOverload_MatchExpectation() + { + var value = new StringWithQualityHeaderValue("token", 0.5); + Assert.Equal("token", value.Value); + Assert.Equal(0.5, value.Quality); + + Assert.Throws(() => new StringWithQualityHeaderValue(null, 0.1)); + Assert.Throws(() => new StringWithQualityHeaderValue("", 0.1)); + Assert.Throws(() => new StringWithQualityHeaderValue("in valid", 0.1)); + + Assert.Throws(() => new StringWithQualityHeaderValue("t", 1.1)); + Assert.Throws(() => new StringWithQualityHeaderValue("t", -0.1)); + } + + [Fact] + public void ToString_UseDifferentValues_AllSerializedCorrectly() + { + var value = new StringWithQualityHeaderValue("token"); + Assert.Equal("token", value.ToString()); + + value = new StringWithQualityHeaderValue("token", 0.1); + Assert.Equal("token; q=0.1", value.ToString()); + + value = new StringWithQualityHeaderValue("token", 0); + Assert.Equal("token; q=0.0", value.ToString()); + + value = new StringWithQualityHeaderValue("token", 1); + Assert.Equal("token; q=1.0", value.ToString()); + + // Note that the quality value gets rounded + value = new StringWithQualityHeaderValue("token", 0.56789); + Assert.Equal("token; q=0.568", value.ToString()); + } + + [Fact] + public void GetHashCode_UseSameAndDifferentValues_SameOrDifferentHashCodes() + { + var value1 = new StringWithQualityHeaderValue("t", 0.123); + var value2 = new StringWithQualityHeaderValue("t", 0.123); + var value3 = new StringWithQualityHeaderValue("T", 0.123); + var value4 = new StringWithQualityHeaderValue("t"); + var value5 = new StringWithQualityHeaderValue("x", 0.123); + var value6 = new StringWithQualityHeaderValue("t", 0.5); + var value7 = new StringWithQualityHeaderValue("t", 0.1234); + var value8 = new StringWithQualityHeaderValue("T"); + var value9 = new StringWithQualityHeaderValue("x"); + + Assert.Equal(value1.GetHashCode(), value2.GetHashCode()); + Assert.Equal(value1.GetHashCode(), value3.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value4.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value5.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value6.GetHashCode()); + Assert.NotEqual(value1.GetHashCode(), value7.GetHashCode()); + Assert.Equal(value4.GetHashCode(), value8.GetHashCode()); + Assert.NotEqual(value4.GetHashCode(), value9.GetHashCode()); + } + + [Fact] + public void Equals_UseSameAndDifferentRanges_EqualOrNotEqualNoExceptions() + { + var value1 = new StringWithQualityHeaderValue("t", 0.123); + var value2 = new StringWithQualityHeaderValue("t", 0.123); + var value3 = new StringWithQualityHeaderValue("T", 0.123); + var value4 = new StringWithQualityHeaderValue("t"); + var value5 = new StringWithQualityHeaderValue("x", 0.123); + var value6 = new StringWithQualityHeaderValue("t", 0.5); + var value7 = new StringWithQualityHeaderValue("t", 0.1234); + var value8 = new StringWithQualityHeaderValue("T"); + var value9 = new StringWithQualityHeaderValue("x"); + + Assert.False(value1.Equals(null), "t; q=0.123 vs. "); + Assert.True(value1.Equals(value2), "t; q=0.123 vs. t; q=0.123"); + Assert.True(value1.Equals(value3), "t; q=0.123 vs. T; q=0.123"); + Assert.False(value1.Equals(value4), "t; q=0.123 vs. t"); + Assert.False(value4.Equals(value1), "t vs. t; q=0.123"); + Assert.False(value1.Equals(value5), "t; q=0.123 vs. x; q=0.123"); + Assert.False(value1.Equals(value6), "t; q=0.123 vs. t; q=0.5"); + Assert.False(value1.Equals(value7), "t; q=0.123 vs. t; q=0.1234"); + Assert.True(value4.Equals(value8), "t vs. T"); + Assert.False(value4.Equals(value9), "t vs. T"); + } + + [Fact] + public void Parse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidParse("text", new StringWithQualityHeaderValue("text")); + CheckValidParse("text;q=0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidParse("text ; q = 0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidParse("\r\n text ; q = 0.5 ", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidParse(" text ", new StringWithQualityHeaderValue("text")); + CheckValidParse(" \r\n text \r\n ; \r\n q = 0.123", new StringWithQualityHeaderValue("text", 0.123)); + CheckValidParse(" text ; q = 0.123 ", new StringWithQualityHeaderValue("text", 0.123)); + CheckValidParse("text;q=1 ", new StringWithQualityHeaderValue("text", 1)); + CheckValidParse("*", new StringWithQualityHeaderValue("*")); + CheckValidParse("*;q=0.7", new StringWithQualityHeaderValue("*", 0.7)); + CheckValidParse(" t", new StringWithQualityHeaderValue("t")); + CheckValidParse("t;q=0.", new StringWithQualityHeaderValue("t", 0)); + CheckValidParse("t;q=1.", new StringWithQualityHeaderValue("t", 1)); + CheckValidParse("t ; q = 0", new StringWithQualityHeaderValue("t", 0)); + CheckValidParse("iso-8859-5", new StringWithQualityHeaderValue("iso-8859-5")); + CheckValidParse("unicode-1-1; q=0.8", new StringWithQualityHeaderValue("unicode-1-1", 0.8)); + } + + [Theory] + [InlineData("text,")] + [InlineData("\r\n text ; q = 0.5, next_text ")] + [InlineData(" text,next_text ")] + [InlineData(" ,, text, , ,next")] + [InlineData(" ,, text, , ,")] + [InlineData(", \r\n text \r\n ; \r\n q = 0.123")] + [InlineData("teäxt")] + [InlineData("text会")] + [InlineData("会")] + [InlineData("t;q=会")] + [InlineData("t;q=")] + [InlineData("t;q")] + [InlineData("t;会=1")] + [InlineData("t;q会=1")] + [InlineData("t y")] + [InlineData("t;q=1 y")] + [InlineData(null)] + [InlineData("")] + [InlineData(" ")] + [InlineData(" ,,")] + [InlineData("t;q=-1")] + [InlineData("t;q=1.00001")] + [InlineData("t;")] + [InlineData("t;;q=1")] + [InlineData("t;q=a")] + [InlineData("t;qa")] + [InlineData("t;q1")] + public void Parse_SetOfInvalidValueStrings_Throws(string input) + { + Assert.Throws(() => StringWithQualityHeaderValue.Parse(input)); + } + + [Fact] + public void TryParse_SetOfValidValueStrings_ParsedCorrectly() + { + CheckValidTryParse("text", new StringWithQualityHeaderValue("text")); + CheckValidTryParse("text;q=0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidTryParse("text ; q = 0.5", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidTryParse("\r\n text ; q = 0.5 ", new StringWithQualityHeaderValue("text", 0.5)); + CheckValidTryParse(" text ", new StringWithQualityHeaderValue("text")); + CheckValidTryParse(" \r\n text \r\n ; \r\n q = 0.123", new StringWithQualityHeaderValue("text", 0.123)); + } + + [Fact] + public void TryParse_SetOfInvalidValueStrings_ReturnsFalse() + { + CheckInvalidTryParse("text,"); + CheckInvalidTryParse("\r\n text ; q = 0.5, next_text "); + CheckInvalidTryParse(" text,next_text "); + CheckInvalidTryParse(" ,, text, , ,next"); + CheckInvalidTryParse(" ,, text, , ,"); + CheckInvalidTryParse(", \r\n text \r\n ; \r\n q = 0.123"); + CheckInvalidTryParse("teäxt"); + CheckInvalidTryParse("text会"); + CheckInvalidTryParse("会"); + CheckInvalidTryParse("t;q=会"); + CheckInvalidTryParse("t;q="); + CheckInvalidTryParse("t;q"); + CheckInvalidTryParse("t;会=1"); + CheckInvalidTryParse("t;q会=1"); + CheckInvalidTryParse("t y"); + CheckInvalidTryParse("t;q=1 y"); + + CheckInvalidTryParse(null); + CheckInvalidTryParse(string.Empty); + CheckInvalidTryParse(" "); + CheckInvalidTryParse(" ,,"); + } + + [Fact] + public void ParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "text1", + "text2,", + "textA,textB", + "text3;q=0.5", + "text4;q=0.5,", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results = StringWithQualityHeaderValue.ParseList(inputs); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("textA"), + new StringWithQualityHeaderValue("textB"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void TryParseList_SetOfValidValueStrings_ParsedCorrectly() + { + var inputs = new[] + { + "", + "text1", + "text2,", + "textA,textB", + "text3;q=0.5", + "text4;q=0.5,", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results; + Assert.True(StringWithQualityHeaderValue.TryParseList(inputs, out results)); + + var expectedResults = new[] + { + new StringWithQualityHeaderValue("text1"), + new StringWithQualityHeaderValue("text2"), + new StringWithQualityHeaderValue("textA"), + new StringWithQualityHeaderValue("textB"), + new StringWithQualityHeaderValue("text3", 0.5), + new StringWithQualityHeaderValue("text4", 0.5), + new StringWithQualityHeaderValue("text5", 0.5), + new StringWithQualityHeaderValue("text6", 0.05), + new StringWithQualityHeaderValue("text7"), + new StringWithQualityHeaderValue("text8", 0.5), + new StringWithQualityHeaderValue("text9"), + new StringWithQualityHeaderValue("text10", 0.5), + }.ToList(); + + Assert.Equal(expectedResults, results); + } + + [Fact] + public void ParseList_WithSomeInvlaidValues_Throws() + { + var inputs = new[] + { + "", + "text1", + "text 1", + "text2", + "\"text 2\",", + "text3;q=0.5", + "text4;q=0.5, extra stuff", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + Assert.Throws(() => StringWithQualityHeaderValue.ParseList(inputs)); + } + + [Fact] + public void TryParseList_WithSomeInvlaidValues_ReturnsFalse() + { + var inputs = new[] + { + "", + "text1", + "text 1", + "text2", + "\"text 2\",", + "text3;q=0.5", + "text4;q=0.5, extra stuff", + " text5 ; q = 0.50 ", + "\r\n text6 ; q = 0.05 ", + "text7,text8;q=0.5", + " text9 , text10 ; q = 0.5 ", + }; + IList results; + Assert.False(StringWithQualityHeaderValue.TryParseList(inputs, out results)); + } + + #region Helper methods + + private void CheckValidParse(string input, StringWithQualityHeaderValue expectedResult) + { + var result = StringWithQualityHeaderValue.Parse(input); + Assert.Equal(expectedResult, result); + } + + private void CheckValidTryParse(string input, StringWithQualityHeaderValue expectedResult) + { + StringWithQualityHeaderValue result = null; + Assert.True(StringWithQualityHeaderValue.TryParse(input, out result)); + Assert.Equal(expectedResult, result); + } + + private void CheckInvalidTryParse(string input) + { + StringWithQualityHeaderValue result = null; + Assert.False(StringWithQualityHeaderValue.TryParse(input, out result)); + Assert.Null(result); + } + + #endregion + } +} diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json new file mode 100644 index 0000000000..4ffa75e704 --- /dev/null +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -0,0 +1,18 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.Net.Http.Headers": "1.0.0-*", + "xunit.runner.kre": "1.0.0-*" + }, + "commands": { + "test": "xunit.runner.kre" + }, + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10-beta-*" + } + } + } +} From 16a811479eb4f098387b0bcd6702e25003ae6c59 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 14 Jan 2015 17:24:33 -0800 Subject: [PATCH 0372/1838] Simplify HttpContextAccessor (now singleton) --- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 7 ++- .../HostingServicesCollectionExtensions.cs | 2 +- .../HttpContextAccessor.cs | 59 ++++++------------- .../IHttpContextAccessor.cs | 5 +- .../PipelineInstance.cs | 7 ++- .../RequestServicesContainer.cs | 30 +--------- .../TestServerTests.cs | 17 ++++++ 7 files changed, 46 insertions(+), 81 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 0dc426b1a4..83ef3a8d8e 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -16,17 +16,20 @@ namespace Microsoft.AspNet.Hosting private readonly IStartupManager _startupManager; private readonly IApplicationBuilderFactory _builderFactory; private readonly IHttpContextFactory _httpContextFactory; + private readonly IHttpContextAccessor _contextAccessor; public HostingEngine( IServerManager serverManager, IStartupManager startupManager, IApplicationBuilderFactory builderFactory, - IHttpContextFactory httpContextFactory) + IHttpContextFactory httpContextFactory, + IHttpContextAccessor contextAccessor) { _serverManager = serverManager; _startupManager = startupManager; _builderFactory = builderFactory; _httpContextFactory = httpContextFactory; + _contextAccessor = contextAccessor; } public IDisposable Start(HostingContext context) @@ -37,7 +40,7 @@ namespace Microsoft.AspNet.Hosting EnsureApplicationDelegate(context); var applicationLifetime = (ApplicationLifetime)context.Services.GetRequiredService(); - var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate); + var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate, _contextAccessor); var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); return new Disposable(() => diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 5122ca73da..82c134ffb2 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -39,7 +39,7 @@ namespace Microsoft.Framework.DependencyInjection // TODO: Do we expect this to be provide by the runtime eventually? services.AddLogging(configuration); services.TryAdd(describer.Singleton()); - services.TryAdd(describer.Scoped()); + services.TryAdd(describer.Singleton()); // REVIEW: don't try add because we pull out IEnumerable? services.AddInstance(new ConfigureHostingEnvironment(configuration)); diff --git a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs index c811d4bfef..4507d384cf 100644 --- a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs @@ -14,60 +14,35 @@ namespace Microsoft.AspNet.Hosting { public class HttpContextAccessor : IHttpContextAccessor { - private HttpContext _value; - - public bool IsRootContext { get; set; } +#if ASPNET50 + private const string LogicalDataKey = "__HttpContext_Current__"; public HttpContext Value { get { - return IsRootContext ? AccessRootHttpContext() : _value; + var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + return handle != null ? handle.Unwrap() as HttpContext : null; } - } - - public HttpContext SetValue(HttpContext value) - { - if (IsRootContext) + set { - return ExchangeRootHttpContext(value); + CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(value)); } - var prior = _value; - _value = value; - return prior; } -#if ASPNET50 - private const string LogicalDataKey = "__HttpContext_Current__"; #elif ASPNETCORE50 - private static AsyncLocal _httpContextCurrent = new AsyncLocal(); -#endif - - private static HttpContext AccessRootHttpContext() + private AsyncLocal _httpContextCurrent = new AsyncLocal(); + public HttpContext Value { -#if ASPNET50 - var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - return handle != null ? handle.Unwrap() as HttpContext : null; -#elif ASPNETCORE50 - return _httpContextCurrent.Value; -#else - throw new Exception("TODO: CallContext not available"); -#endif + get + { + return _httpContextCurrent.Value; + } + set + { + _httpContextCurrent.Value = value; + } } - - private static HttpContext ExchangeRootHttpContext(HttpContext httpContext) - { -#if ASPNET50 - var prior = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(httpContext)); - return prior != null ? prior.Unwrap() as HttpContext : null; -#elif ASPNETCORE50 - var prior = _httpContextCurrent.Value; - _httpContextCurrent.Value = httpContext; - return prior; -#else - return null; #endif - } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs index 01656f4cd7..563808d7f8 100644 --- a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs @@ -7,9 +7,6 @@ namespace Microsoft.AspNet.Hosting { public interface IHttpContextAccessor { - bool IsRootContext { get; set; } - HttpContext Value { get; } - - HttpContext SetValue(HttpContext value); + HttpContext Value { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index 2efe3d6b24..d69a700c94 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -4,9 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Server; namespace Microsoft.AspNet.Hosting { @@ -14,16 +12,19 @@ namespace Microsoft.AspNet.Hosting { private readonly IHttpContextFactory _httpContextFactory; private readonly RequestDelegate _requestDelegate; + private readonly IHttpContextAccessor _contextAccessor; - public PipelineInstance(IHttpContextFactory httpContextFactory, RequestDelegate requestDelegate) + public PipelineInstance(IHttpContextFactory httpContextFactory, RequestDelegate requestDelegate, IHttpContextAccessor contextAccessor) { _httpContextFactory = httpContextFactory; _requestDelegate = requestDelegate; + _contextAccessor = contextAccessor; } public Task Invoke(object serverEnvironment) { var httpContext = _httpContextFactory.CreateHttpContext(serverEnvironment); + _contextAccessor.Value = httpContext; return _requestDelegate(httpContext); } diff --git a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs index 8b3d32316d..747aae5012 100644 --- a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; @@ -13,7 +12,6 @@ namespace Microsoft.AspNet.RequestContainer public RequestServicesContainer( HttpContext context, IServiceScopeFactory scopeFactory, - IHttpContextAccessor appContextAccessor, IServiceProvider appServiceProvider) { if (scopeFactory == null) @@ -24,12 +22,6 @@ namespace Microsoft.AspNet.RequestContainer { throw new ArgumentNullException(nameof(context)); } - if (appContextAccessor == null) - { - throw new ArgumentNullException(nameof(appContextAccessor)); - } - - AppContextAccessor = appContextAccessor; Context = context; PriorAppServices = context.ApplicationServices; @@ -37,23 +29,15 @@ namespace Microsoft.AspNet.RequestContainer // Begin the scope Scope = scopeFactory.CreateScope(); - ScopeContextAccessor = Scope.ServiceProvider.GetRequiredService(); Context.ApplicationServices = appServiceProvider; Context.RequestServices = Scope.ServiceProvider; - - PriorAppHttpContext = AppContextAccessor.SetValue(context); - PriorScopeHttpContext = ScopeContextAccessor.SetValue(context); } private HttpContext Context { get; set; } private IServiceProvider PriorAppServices { get; set; } private IServiceProvider PriorRequestServices { get; set; } - private HttpContext PriorAppHttpContext { get; set; } - private HttpContext PriorScopeHttpContext { get; set; } private IServiceScope Scope { get; set; } - private IHttpContextAccessor ScopeContextAccessor { get; set; } - private IHttpContextAccessor AppContextAccessor { get; set; } // CONSIDER: this could be an extension method on HttpContext instead @@ -73,29 +57,24 @@ namespace Microsoft.AspNet.RequestContainer // Matches constructor of RequestContainer var rootServiceProvider = serviceProvider.GetRequiredService(); - var rootHttpContextAccessor = serviceProvider.GetRequiredService(); var rootServiceScopeFactory = serviceProvider.GetRequiredService(); - rootHttpContextAccessor.IsRootContext = true; - // Pre Scope setup var priorApplicationServices = serviceProvider; var priorRequestServices = serviceProvider; var appServiceProvider = rootServiceProvider; var appServiceScopeFactory = rootServiceScopeFactory; - var appHttpContextAccessor = rootHttpContextAccessor; if (priorApplicationServices != null && priorApplicationServices != appServiceProvider) { appServiceProvider = priorApplicationServices; appServiceScopeFactory = priorApplicationServices.GetRequiredService(); - appHttpContextAccessor = priorApplicationServices.GetRequiredService(); } // Creates the scope and does the service swaps - return new RequestServicesContainer(httpContext, appServiceScopeFactory, appHttpContextAccessor, appServiceProvider); + return new RequestServicesContainer(httpContext, appServiceScopeFactory, appServiceProvider); } #region IDisposable Support @@ -107,9 +86,6 @@ namespace Microsoft.AspNet.RequestContainer { if (disposing) { - ScopeContextAccessor.SetValue(PriorScopeHttpContext); - AppContextAccessor.SetValue(PriorAppHttpContext); - Context.RequestServices = PriorRequestServices; Context.ApplicationServices = PriorAppServices; } @@ -123,10 +99,6 @@ namespace Microsoft.AspNet.RequestContainer Context = null; PriorAppServices = null; PriorRequestServices = null; - ScopeContextAccessor = null; - AppContextAccessor = null; - PriorAppHttpContext = null; - PriorScopeHttpContext = null; disposedValue = true; } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 47cd1d1403..0a31db1b21 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -37,6 +37,23 @@ namespace Microsoft.AspNet.TestHost Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); } + [Fact] + public async Task CanAccessHttpContext() + { + var services = new ServiceCollection().BuildServiceProvider(); + TestServer server = TestServer.Create(app => + { + app.Run(context => + { + var accessor = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("HasContext:"+(accessor.Value != null)); + }); + }); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("HasContext:True", result); + } + [Fact] public async Task CreateInvokesApp() { From 68be1d1b19108e00ea49db4e5de5352c06699efd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 15 Jan 2015 11:52:34 -0800 Subject: [PATCH 0373/1838] #162 - Change PipelineCore namespace to Http.Core. Part-1. --- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- .../BufferingHelper.cs | 2 +- .../Collections/FormCollection.cs | 2 +- .../Collections/FormFileCollection.cs | 2 +- .../Collections/HeaderDictionary.cs | 4 +- .../Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 2 +- .../Collections/RequestCookiesCollection.cs | 4 +- .../Collections/ResponseCookies.cs | 2 +- .../Collections/SessionCollection.cs | 2 +- .../DefaultHttpContext.cs | 12 +++--- .../DefaultHttpRequest.cs | 6 +-- .../DefaultHttpResponse.cs | 8 ++-- .../FormFeature.cs | 4 +- src/Microsoft.AspNet.PipelineCore/FormFile.cs | 2 +- ...equestFeature.cs => HttpRequestFeature.cs} | 6 +-- ...ponseFeature.cs => HttpResponseFeature.cs} | 6 +-- .../IFormFeature.cs | 2 +- .../IItemsFeature.cs | 2 +- .../IQueryFeature.cs | 2 +- .../IRequestCookiesFeature.cs | 2 +- .../IResponseCookiesFeature.cs | 4 +- .../IServiceProvidersFeature.cs | 2 +- .../Infrastructure/FeatureReference.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 2 +- .../ItemsFeature.cs | 2 +- .../NotNullAttribute.cs | 2 +- .../QueryFeature.cs | 6 +-- .../ReferenceReadStream.cs | 2 +- .../RequestCookiesFeature.cs | 6 +-- .../ResponseCookiesFeature.cs | 6 +-- .../Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 2 +- .../Security/ChallengeContext.cs | 2 +- .../Security/HttpAuthenticationFeature.cs | 2 +- .../Security/SignInContext.cs | 2 +- .../Security/SignOutContext.cs | 2 +- .../ServiceProvidersFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 2 +- .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../HttpResponseSendingExtensionsTests.cs | 2 +- .../UseWithServicesTests.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 2 +- .../MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- .../OwinEnvironmentTests.cs | 3 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 2 +- .../FormFeatureTests.cs | 2 +- .../HeaderDictionaryTests.cs | 4 +- .../Properties/AssemblyInfo.cs | 39 ------------------- .../QueryFeatureTests.cs | 2 +- 53 files changed, 77 insertions(+), 117 deletions(-) rename src/Microsoft.AspNet.PipelineCore/{DefaultHttpRequestFeature.cs => HttpRequestFeature.cs} (87%) rename src/Microsoft.AspNet.PipelineCore/{DefaultHttpResponseFeature.cs => HttpResponseFeature.cs} (85%) delete mode 100644 test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 8a0e7cbcfd..9ff85950f2 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -16,7 +16,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Security; +using Microsoft.AspNet.Http.Core.Security; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 5bd2e0a9fa..fe4b17d1ac 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -7,7 +7,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs index b10c017c36..58ef9c509e 100644 --- a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs +++ b/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs @@ -6,7 +6,7 @@ using System.IO; using Microsoft.AspNet.Http; using Microsoft.AspNet.WebUtilities; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public static class BufferingHelper { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs index a80fea12d1..55d7b321a0 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs index 2ef4d29476..d33992bff8 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs index bf362c94ed..72dc55ec36 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs @@ -7,9 +7,9 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs index dc5216d117..06c27fbc1e 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs index 1e12bb6dc1..91f3b8c8f3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs index 5fd131d990..36a91735a3 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs @@ -5,9 +5,9 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs index 2412b54a83..35aa02b17c 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs @@ -8,7 +8,7 @@ using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs index 261b401cdb..8d2c3b7565 100644 --- a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore.Collections +namespace Microsoft.AspNet.Http.Core.Collections { public class SessionCollection : ISessionCollection { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs index 3b445fefbe..09915207ee 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs @@ -14,11 +14,11 @@ using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; -using Microsoft.AspNet.PipelineCore.Security; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Core.Security; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class DefaultHttpContext : HttpContext { @@ -38,8 +38,8 @@ namespace Microsoft.AspNet.PipelineCore public DefaultHttpContext() : this(new FeatureCollection()) { - SetFeature(new DefaultHttpRequestFeature()); - SetFeature(new DefaultHttpResponseFeature()); + SetFeature(new HttpRequestFeature()); + SetFeature(new HttpResponseFeature()); } public DefaultHttpContext(IFeatureCollection features) diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs index d95c37b9c3..28e8f2807c 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs @@ -9,10 +9,10 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs index 16d187450d..46358ad69f 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs @@ -14,11 +14,11 @@ using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Microsoft.AspNet.HttpFeature.Security; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; -using Microsoft.AspNet.PipelineCore.Security; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Core.Security; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs index 0180728be2..a0f1d5db07 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFeature.cs @@ -9,11 +9,11 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.WebUtilities; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/FormFile.cs b/src/Microsoft.AspNet.PipelineCore/FormFile.cs index 19ea07466f..bbf0a52699 100644 --- a/src/Microsoft.AspNet.PipelineCore/FormFile.cs +++ b/src/Microsoft.AspNet.PipelineCore/FormFile.cs @@ -4,7 +4,7 @@ using System.IO; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs b/src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs similarity index 87% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs rename to src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs index 156e362c9b..751b366ebe 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs @@ -6,11 +6,11 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { - public class DefaultHttpRequestFeature : IHttpRequestFeature + public class HttpRequestFeature : IHttpRequestFeature { - public DefaultHttpRequestFeature() + public HttpRequestFeature() { Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs b/src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs similarity index 85% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs rename to src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs index c3b933bb8a..d4b5287885 100644 --- a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs @@ -6,11 +6,11 @@ using System.Collections.Generic; using System.IO; using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { - public class DefaultHttpResponseFeature : IHttpResponseFeature + public class HttpResponseFeature : IHttpResponseFeature { - public DefaultHttpResponseFeature() + public HttpResponseFeature() { StatusCode = 200; Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs index cc84d32a4b..00f2645118 100644 --- a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs @@ -6,7 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IFormFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs index 9afe1623de..a38a9cb720 100644 --- a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IItemsFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs index e1ad3146c0..545200b3c5 100644 --- a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IQueryFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs index ba1a0e3616..d52e714c71 100644 --- a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs index 6d51b7a015..f33a15361b 100644 --- a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs index 03dffc578d..3435e53972 100644 --- a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs index 0726b73b95..f6db6e4fef 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.FeatureModel; -namespace Microsoft.AspNet.PipelineCore.Infrastructure +namespace Microsoft.AspNet.Http.Core.Infrastructure { internal struct FeatureReference { diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs index 48dab300ac..85208daa0d 100644 --- a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.PipelineCore.Infrastructure +namespace Microsoft.AspNet.Http.Core.Infrastructure { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs index 54d7d123f4..50b32711a3 100644 --- a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs index 33fc2e3070..2328b5d5d8 100644 --- a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs +++ b/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] internal sealed class NotNullAttribute : Attribute diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs index e57b406153..e1b05f6b84 100644 --- a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs @@ -5,11 +5,11 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs index aaad97ae92..06755f543d 100644 --- a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs @@ -6,7 +6,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs index 952bfed0f6..e57ff741ce 100644 --- a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs @@ -7,10 +7,10 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs index f8ea2bf1b7..801d6d4b05 100644 --- a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs @@ -4,10 +4,10 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore.Collections; -using Microsoft.AspNet.PipelineCore.Infrastructure; +using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Core.Infrastructure; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs index ffd779039e..d9e516e756 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class AuthTypeContext : IAuthTypeContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs index 1e27a006c4..e04326b257 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class AuthenticateContext : IAuthenticateContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs index ea87d06599..5c8b8ef74b 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class ChallengeContext : IChallengeContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs index 368b888573..8e40287b22 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs @@ -4,7 +4,7 @@ using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs index 43a88a82de..9856e7ee1a 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class SignInContext : ISignInContext { diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs index 546c5bca83..4ebde735d2 100644 --- a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.HttpFeature.Security; -namespace Microsoft.AspNet.PipelineCore.Security +namespace Microsoft.AspNet.Http.Core.Security { public class SignOutContext : ISignOutContext { diff --git a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs index 50bfab0065..9f218d9bbb 100644 --- a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs index 6e9a7ba0dd..3c935b52f8 100644 --- a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.HttpFeature; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class WebSocketAcceptContext : IWebSocketAcceptContext { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index 6b437d8925..a7e15c1844 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs index 05d662a955..ce046ba3e7 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -4,7 +4,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 1ed29d112e..d2393592ad 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -6,7 +6,7 @@ using Xunit; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using System.Collections.Generic; using System.Threading.Tasks; diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs index aa6582e753..c9692254f1 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,7 +3,7 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index bdaa1eeedb..e49637ed56 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -5,7 +5,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index c5016f3064..b0ef791a3e 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Builder.Extensions diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 88fd2f7174..b98e99cfc1 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -7,8 +7,7 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs index 723811a947..2b04823c53 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs @@ -12,7 +12,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.HttpFeature; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs index 397d480580..e2518fd10b 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs @@ -8,7 +8,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.HttpFeature; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs index b129adc0e1..7f1224c1b7 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.PipelineCore +namespace Microsoft.AspNet.Http.Core { public class FormFeatureTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs index 74667bbeb0..4bee6e446d 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.PipelineCore.Collections; +using Microsoft.AspNet.Http.Core.Collections; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs deleted file mode 100644 index 2a4dd7d85d..0000000000 --- a/test/Microsoft.AspNet.PipelineCore.Tests/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -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("Microsoft.AspNet.PipelineCore.Tests")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.PipelineCore.Tests")] -[assembly: AssemblyCopyright("Copyright © 2013")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("7c564547-b037-4054-a1ec-18e62717be47")] - -// 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("0.1.0")] -[assembly: AssemblyVersion("0.1.0")] -[assembly: AssemblyFileVersion("0.1.0")] diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs index 975edda5b1..f76fdb25fe 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs @@ -6,7 +6,7 @@ using Microsoft.AspNet.HttpFeature; using Moq; using Xunit; -namespace Microsoft.AspNet.PipelineCore.Tests +namespace Microsoft.AspNet.Http.Core.Tests { public class QueryFeatureTests { From d43cf30eff2cbbcc33352c6f49bf1f7ffb13dfc0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 15 Jan 2015 12:37:34 -0800 Subject: [PATCH 0374/1838] #162 - Rename PipelineCore project to Http.Core. Part 2. --- HttpAbstractions.sln | 6 +++--- .../ApplicationBuilder.cs | 0 .../BufferingHelper.cs | 0 .../Collections/FormCollection.cs | 0 .../Collections/FormFileCollection.cs | 0 .../Collections/HeaderDictionary.cs | 0 .../Collections/ItemsDictionary.cs | 0 .../Collections/ReadableStringCollection.cs | 0 .../Collections/RequestCookiesCollection.cs | 0 .../Collections/ResponseCookies.cs | 0 .../Collections/SessionCollection.cs | 0 .../DefaultHttpContext.cs | 0 .../DefaultHttpRequest.cs | 0 .../DefaultHttpResponse.cs | 0 .../FormFeature.cs | 0 .../FormFile.cs | 0 .../HttpRequestFeature.cs | 0 .../HttpResponseFeature.cs | 0 .../IFormFeature.cs | 0 .../IItemsFeature.cs | 0 .../IQueryFeature.cs | 0 .../IRequestCookiesFeature.cs | 0 .../IResponseCookiesFeature.cs | 0 .../IServiceProvidersFeature.cs | 0 .../Infrastructure/Constants.cs | 0 .../Infrastructure/FeatureReference.cs | 0 .../Infrastructure/ParsingHelpers.cs | 0 .../ItemsFeature.cs | 0 .../Microsoft.AspNet.Http.Core.kproj} | 0 .../NotNullAttribute.cs | 0 .../QueryFeature.cs | 0 .../ReferenceReadStream.cs | 0 .../RequestCookiesFeature.cs | 0 .../ResponseCookiesFeature.cs | 0 .../Security/AuthTypeContext.cs | 0 .../Security/AuthenticateContext.cs | 0 .../Security/ChallengeContext.cs | 0 .../Security/HttpAuthenticationFeature.cs | 0 .../Security/SignInContext.cs | 0 .../Security/SignOutContext.cs | 0 .../ServiceProvidersFeature.cs | 0 .../WebSocketAcceptContext.cs | 0 .../project.json | 0 src/Microsoft.AspNet.Owin/project.json | 2 +- .../ApplicationBuilderTests.cs | 0 .../DefaultHttpContextTests.cs | 0 .../DefaultHttpRequestTests.cs | 0 .../FormFeatureTests.cs | 0 .../HeaderDictionaryTests.cs | 0 .../Microsoft.AspNet.Http.Core.Tests.kproj} | 0 .../QueryFeatureTests.cs | 0 .../project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- 56 files changed, 9 insertions(+), 9 deletions(-) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/BufferingHelper.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/FormCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/FormFileCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/HeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/ItemsDictionary.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/ReadableStringCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/RequestCookiesCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/ResponseCookies.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Collections/SessionCollection.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/DefaultHttpContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/DefaultHttpRequest.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/DefaultHttpResponse.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/FormFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/FormFile.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/HttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/HttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IFormFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IItemsFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IQueryFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IRequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/IServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Infrastructure/Constants.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Infrastructure/FeatureReference.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Infrastructure/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ItemsFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj => Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj} (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/NotNullAttribute.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/QueryFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ReferenceReadStream.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/RequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/AuthTypeContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/ChallengeContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/HttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/SignInContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/Security/SignOutContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/ServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.PipelineCore => Microsoft.AspNet.Http.Core}/project.json (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/ApplicationBuilderTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/DefaultHttpContextTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/DefaultHttpRequestTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/FormFeatureTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/HeaderDictionaryTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj => Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj} (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/QueryFeatureTests.cs (100%) rename test/{Microsoft.AspNet.PipelineCore.Tests => Microsoft.AspNet.Http.Core.Tests}/project.json (90%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 8ae65bd225..e4bd71292f 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,13 +1,13 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22410.0 +VisualStudioVersion = 14.0.22513.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore", "src\Microsoft.AspNet.PipelineCore\Microsoft.AspNet.PipelineCore.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject @@ -15,7 +15,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeatur EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.PipelineCore.Tests", "test\Microsoft.AspNet.PipelineCore.Tests\Microsoft.AspNet.PipelineCore.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject diff --git a/src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ApplicationBuilder.cs rename to src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/BufferingHelper.cs rename to src/Microsoft.AspNet.Http.Core/BufferingHelper.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/FormCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/FormFileCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/HeaderDictionary.cs rename to src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/ItemsDictionary.cs rename to src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/ResponseCookies.cs rename to src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Collections/SessionCollection.cs rename to src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpContext.cs rename to src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpRequest.cs rename to src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs diff --git a/src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/DefaultHttpResponse.cs rename to src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs diff --git a/src/Microsoft.AspNet.PipelineCore/FormFeature.cs b/src/Microsoft.AspNet.Http.Core/FormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/FormFeature.cs rename to src/Microsoft.AspNet.Http.Core/FormFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/FormFile.cs b/src/Microsoft.AspNet.Http.Core/FormFile.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/FormFile.cs rename to src/Microsoft.AspNet.Http.Core/FormFile.cs diff --git a/src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/HttpRequestFeature.cs rename to src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/HttpResponseFeature.cs rename to src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IFormFeature.cs b/src/Microsoft.AspNet.Http.Core/IFormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IFormFeature.cs rename to src/Microsoft.AspNet.Http.Core/IFormFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs b/src/Microsoft.AspNet.Http.Core/IItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IItemsFeature.cs rename to src/Microsoft.AspNet.Http.Core/IItemsFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs b/src/Microsoft.AspNet.Http.Core/IQueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IQueryFeature.cs rename to src/Microsoft.AspNet.Http.Core/IQueryFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IRequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/IServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Infrastructure/Constants.cs rename to src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Infrastructure/FeatureReference.cs rename to src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Infrastructure/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs b/src/Microsoft.AspNet.Http.Core/ItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ItemsFeature.cs rename to src/Microsoft.AspNet.Http.Core/ItemsFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Microsoft.AspNet.PipelineCore.kproj rename to src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj diff --git a/src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/NotNullAttribute.cs rename to src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs diff --git a/src/Microsoft.AspNet.PipelineCore/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/QueryFeature.cs rename to src/Microsoft.AspNet.Http.Core/QueryFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ReferenceReadStream.cs rename to src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs diff --git a/src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/RequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/AuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/SignInContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/Security/SignOutContext.cs rename to src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/ServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.PipelineCore/project.json b/src/Microsoft.AspNet.Http.Core/project.json similarity index 100% rename from src/Microsoft.AspNet.PipelineCore/project.json rename to src/Microsoft.AspNet.Http.Core/project.json diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index d8dac9991b..ce8c5b3058 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" } }, "frameworks": { diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpContextTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/HeaderDictionaryTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/Microsoft.AspNet.PipelineCore.Tests.kproj rename to test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.PipelineCore.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs diff --git a/test/Microsoft.AspNet.PipelineCore.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json similarity index 90% rename from test/Microsoft.AspNet.PipelineCore.Tests/project.json rename to test/Microsoft.AspNet.Http.Core.Tests/project.json index fda938bb96..3d6bee5edb 100644 --- a/test/Microsoft.AspNet.PipelineCore.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -3,7 +3,7 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 85c20ce28b..55f53f5fe7 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -3,7 +3,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index ff303ab74d..134db2aeae 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 16f501140e..4725d69b82 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.HttpFeature": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index a445ee721d..d449b763bd 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { From 9746a67990a640ed2078fc53a400d9a251f8bbbf Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 15 Jan 2015 12:45:07 -0800 Subject: [PATCH 0375/1838] Handle PipelineCore rename. --- src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs | 4 ++-- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 2 +- .../Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 1b01ed6b17..227d7bd2f4 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -1,9 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 63dd7c6c7d..ebd3beb943 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { "Microsoft.AspNet.FileSystems": "1.0.0-*", - "Microsoft.AspNet.PipelineCore": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index d108874bdd..c24922d5b3 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -12,8 +12,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 0e00d492ef..e247d4ec64 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -6,7 +6,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; -using Microsoft.AspNet.PipelineCore; +using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.RequestContainer; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index a536114e57..435f7a3224 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -9,8 +9,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.PipelineCore; using Xunit; namespace Microsoft.AspNet.TestHost From 26860ad7de3e74a7c72bb5900e3928b27456a7d3 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 15 Jan 2015 18:34:38 -0800 Subject: [PATCH 0376/1838] Code cleanup --- src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index a0c78ead9e..e97059c66b 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -12,7 +12,8 @@ namespace Microsoft.AspNet.Http /// public static class FormFileExtensions { - private static int DefaultBufferSize = 81920; + // Stream.CopyTo method uses 80KB as the default buffer size. + private static int DefaultBufferSize = 80 * 1024; /// /// Saves the contents of an uploaded file. From db484a7dcb32d4ff7e137c08480192126268ce88 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Fri, 16 Jan 2015 17:08:30 -0800 Subject: [PATCH 0377/1838] Rename Microsoft.AspNet.HttpFeature to Microsoft.AspNet.Http.Interfaces --- HttpAbstractions.sln | 2 +- .../Collections/SessionCollection.cs | 2 +- src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs | 4 ++-- src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs | 4 ++-- src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/QueryFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs | 2 +- .../Security/AuthenticateContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs | 2 +- .../Security/HttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Http.Core/project.json | 2 +- .../AssemblyNeutralAttribute.cs | 0 .../IHttpApplicationFeature.cs | 2 +- .../IHttpBufferingFeature.cs | 2 +- .../IHttpClientCertificateFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- .../IHttpSendFileFeature.cs | 2 +- .../IHttpUpgradeFeature.cs | 2 +- .../IHttpWebSocketFeature.cs | 2 +- .../ISession.cs | 2 +- .../ISessionFactory.cs | 2 +- .../ISessionFeature.cs | 2 +- .../IWebSocketAcceptContext.cs | 2 +- .../Microsoft.AspNet.Http.Interfaces.kproj} | 0 .../Security/IAuthTypeContext.cs | 2 +- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IAuthenticationHandler.cs | 2 +- .../Security/IChallengeContext.cs | 2 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext .cs | 2 +- .../project.json | 0 src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 2 +- test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Http.Core.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- .../Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- 59 files changed, 60 insertions(+), 60 deletions(-) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/AssemblyNeutralAttribute.cs (100%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpApplicationFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpBufferingFeature.cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpClientCertificateFeature.cs (95%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpConnectionFeature.cs (92%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpRequestFeature.cs (94%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpRequestLifetimeFeature.cs (90%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpResponseFeature.cs (93%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpSendFileFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpUpgradeFeature.cs (90%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IHttpWebSocketFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/ISession.cs (93%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/ISessionFactory.cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/ISessionFeature.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/IWebSocketAcceptContext.cs (88%) rename src/{Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj => Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj} (100%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IAuthTypeContext.cs (88%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IAuthenticateContext.cs (93%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IAuthenticationHandler.cs (92%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IChallengeContext.cs (90%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/IHttpAuthenticationFeature.cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/ISignInContext.cs (91%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/Security/ISignOutContext .cs (89%) rename src/{Microsoft.AspNet.HttpFeature => Microsoft.AspNet.Http.Interfaces}/project.json (100%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index e4bd71292f..7a857f0800 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -11,7 +11,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.HttpFeature", "src\Microsoft.AspNet.HttpFeature\Microsoft.AspNet.HttpFeature.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs index 8d2c3b7565..52ad9af615 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 09915207ee..2de1680de3 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -12,8 +12,8 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Security; diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 28e8f2807c..46fa1907b7 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 46358ad69f..7e44614704 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -12,8 +12,8 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Security; diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs index 751b366ebe..ae9fb236c9 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs index d4b5287885..4a5c6c7634 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index e1b05f6b84..d9bfb76406 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index e57ff741ce..ea0aa45cf7 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs index 801d6d4b05..d4bf2d180a 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs index d9e516e756..df792fc74f 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs index e04326b257..95dd14a8d2 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs @@ -8,7 +8,7 @@ using System.Security.Claims; using System.Text; using System.Threading.Tasks; using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs index 5c8b8ef74b..aa9a424fc4 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs index 8e40287b22..f0989c420c 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs index 9856e7ee1a..0e9383e97c 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs index 4ebde735d2..c2ed25f04a 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Http.Core.Security { diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs index 3c935b52f8..48e3cd7c71 100644 --- a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 8eaabc9a33..91374fa6c6 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -5,7 +5,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs similarity index 100% rename from src/Microsoft.AspNet.HttpFeature/AssemblyNeutralAttribute.cs rename to src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs index 344f87352c..2a885ecbbb 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpApplicationFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs index 53b7fd9894..83a6be21d0 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs @@ -3,7 +3,7 @@ using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpBufferingFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs similarity index 95% rename from src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs index b70fa027cf..556265c165 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs @@ -6,7 +6,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpClientCertificateFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs similarity index 92% rename from src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs index 7598c9ce0b..51940f3709 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs @@ -4,7 +4,7 @@ using System.Net; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpConnectionFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs similarity index 94% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs index 66b5c5fa82..ca178a7dfa 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpRequestFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs similarity index 90% rename from src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs index b6bcee9c32..498463dbc3 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpRequestLifetimeFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs similarity index 93% rename from src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index aa7603be03..b28700df9c 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpResponseFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs index be42442acc..dcb598e6ce 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs @@ -5,7 +5,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpSendFileFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs similarity index 90% rename from src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs index 3d3f924cae..98d4e60cba 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpUpgradeFeature diff --git a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index 3d87e86bb4..d3aeaae642 100644 --- a/src/Microsoft.AspNet.HttpFeature/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -5,7 +5,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IHttpWebSocketFeature diff --git a/src/Microsoft.AspNet.HttpFeature/ISession.cs b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs similarity index 93% rename from src/Microsoft.AspNet.HttpFeature/ISession.cs rename to src/Microsoft.AspNet.Http.Interfaces/ISession.cs index 6a0fe4035a..d18fca3e99 100644 --- a/src/Microsoft.AspNet.HttpFeature/ISession.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface ISession diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs rename to src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs index 1187696726..e8917db76d 100644 --- a/src/Microsoft.AspNet.HttpFeature/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs @@ -4,7 +4,7 @@ using System; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface ISessionFactory diff --git a/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs index 400f365b68..360e407c65 100644 --- a/src/Microsoft.AspNet.HttpFeature/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs @@ -3,7 +3,7 @@ using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { // TODO: Is there any reason not to flatten the Factory down into the Feature? [AssemblyNeutral] diff --git a/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs similarity index 88% rename from src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs index dbcc14c7ce..80becb585a 100644 --- a/src/Microsoft.AspNet.HttpFeature/IWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs @@ -3,7 +3,7 @@ using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature +namespace Microsoft.AspNet.Http.Interfaces { [AssemblyNeutral] public interface IWebSocketAcceptContext diff --git a/src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj similarity index 100% rename from src/Microsoft.AspNet.HttpFeature/Microsoft.AspNet.HttpFeature.kproj rename to src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs similarity index 88% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs index bf3627a3d8..d3308720c9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IAuthTypeContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs similarity index 93% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 333c044f86..1e354a8149 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IAuthenticateContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs similarity index 92% rename from src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index f081744b22..ca68c40668 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IAuthenticationHandler diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs similarity index 90% rename from src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index 5f32f318df..94d64b6257 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IChallengeContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index 4ee676b095..74605995a9 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -4,7 +4,7 @@ using System.Security.Claims; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface IHttpAuthenticationFeature diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs similarity index 91% rename from src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index 694ece38d2..eea09aa055 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface ISignInContext diff --git a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs similarity index 89% rename from src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs index 232db13ad7..fd4fe89b11 100644 --- a/src/Microsoft.AspNet.HttpFeature/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Runtime; -namespace Microsoft.AspNet.HttpFeature.Security +namespace Microsoft.AspNet.Http.Interfaces.Security { [AssemblyNeutral] public interface ISignOutContext diff --git a/src/Microsoft.AspNet.HttpFeature/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json similarity index 100% rename from src/Microsoft.AspNet.HttpFeature/project.json rename to src/Microsoft.AspNet.Http.Interfaces/project.json diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 9ff85950f2..4a97095eda 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,8 +14,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Security; namespace Microsoft.AspNet.Owin diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 3332221be8..469933cf64 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -15,8 +15,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; -using Microsoft.AspNet.HttpFeature.Security; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Security; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 15ec0a01f8..20e73c2967 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 1e847e6264..063f43eead 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 9660a5d00e..1d43a8a85c 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index ce8c5b3058..ffa82b3a9e 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -5,7 +5,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": { "version": "1.0.0-*", "type": "build" } + "Microsoft.AspNet.Http.Interfaces": { "version": "1.0.0-*", "type": "build" } }, "frameworks": { "aspnet50": { }, diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 867e8889e6..6dfc567e0b 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 2b04823c53..146967c135 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -9,7 +9,7 @@ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs index e2518fd10b..7c5557bb2a 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs index f76fdb25fe..91846bc000 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index 3d6bee5edb..df6823dc6d 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 55f53f5fe7..ddf07a3826 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index e49637ed56..ae1a7c5985 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -4,7 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index b0ef791a3e..bc94b5717c 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 134db2aeae..f6549fc724 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 663972150f..93becf8a60 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 4725d69b82..f0caf021ab 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.HttpFeature": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" From bf9d22bb895a748d272860690647e9b5a4d017c3 Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Sun, 18 Jan 2015 20:50:01 -0800 Subject: [PATCH 0378/1838] Handle HttpFeature rename --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 2 +- src/Microsoft.AspNet.TestHost/RequestFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index c24922d5b3..1549565532 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -13,7 +13,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index 2ea5ae5127..f23df6716a 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 9f2ebfd081..8c8aa08e60 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 435f7a3224..9956339096 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core; -using Microsoft.AspNet.HttpFeature; +using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.TestHost From dceba03f4a3b9264df49643953d473b149d856b5 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 19 Jan 2015 01:43:09 -0800 Subject: [PATCH 0379/1838] Removed unused dependencies #173 --- src/Microsoft.AspNet.FeatureModel/project.json | 1 - src/Microsoft.AspNet.Owin/project.json | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 6845cd91a4..72c7319d68 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,6 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, "frameworks": { "aspnet50": {}, diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index ffa82b3a9e..19cc720380 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -4,8 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": { "version": "1.0.0-*", "type": "build" } + "Microsoft.AspNet.Http.Core": "1.0.0-*" }, "frameworks": { "aspnet50": { }, From cb17819552fe6d38a536ccc035d655bbfa300f89 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 20 Jan 2015 01:31:43 -0800 Subject: [PATCH 0380/1838] Updating build.cmd and build.sh to use dotnetsdk --- build.cmd | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 86ca5bbbf1..c8041fdd9d 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dotnetsdk use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index c7873ef58e..3f3c731c04 100755 --- a/build.sh +++ b/build.sh @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/kvm.sh + source setup/dotnetsdk.sh fi if ! type k > /dev/null 2>&1; then - kvm upgrade + dotnetsdk upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From 236801ee6ec0c6d95822a93c8ab8f4feb367fca3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 20 Jan 2015 01:31:48 -0800 Subject: [PATCH 0381/1838] Updating build.cmd and build.sh to use dotnetsdk --- build.cmd | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 86ca5bbbf1..c8041fdd9d 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_KRE_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dotnetsdk use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index c7873ef58e..3f3c731c04 100755 --- a/build.sh +++ b/build.sh @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/kvm.sh + source setup/dotnetsdk.sh fi if ! type k > /dev/null 2>&1; then - kvm upgrade + dotnetsdk upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From a93537e3be3710272e906c7273e7c2994fe3ebd2 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 20 Jan 2015 01:36:04 -0800 Subject: [PATCH 0382/1838] Updating build.cmd and build.sh to use dotnetsdk --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 3f3c731c04..350d7e389a 100755 --- a/build.sh +++ b/build.sh @@ -28,7 +28,7 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source setup/dotnetsdk.sh + source packages/KoreBuild/build/dotnetsdk.sh fi if ! type k > /dev/null 2>&1; then From 382c3af065fd06c71686d1102723ac60fc003e7b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 20 Jan 2015 01:36:08 -0800 Subject: [PATCH 0383/1838] Updating build.cmd and build.sh to use dotnetsdk --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 3f3c731c04..350d7e389a 100755 --- a/build.sh +++ b/build.sh @@ -28,7 +28,7 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source setup/dotnetsdk.sh + source packages/KoreBuild/build/dotnetsdk.sh fi if ! type k > /dev/null 2>&1; then From 36c2a44b915d8553864dcfdc378c718498327266 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 20 Jan 2015 08:37:10 -0800 Subject: [PATCH 0384/1838] Handle IFileSystem rename. --- src/Microsoft.AspNet.Hosting/HostingEnvironment.cs | 6 +++--- src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Hosting/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 181aa6aac8..47d805f99b 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.FileSystems; +using Microsoft.AspNet.FileProviders; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Hosting { EnvironmentName = DefaultEnvironmentName; WebRoot = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); - WebRootFileSystem = new PhysicalFileSystem(WebRoot); + WebRootFileProvider = new PhysicalFileProvider(WebRoot); foreach (var configure in configures) { configure.Configure(this); @@ -26,6 +26,6 @@ namespace Microsoft.AspNet.Hosting public string WebRoot { get; private set; } - public IFileSystem WebRootFileSystem { get; set; } + public IFileProvider WebRootFileProvider { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs index bcf0e6b812..8f5966e332 100644 --- a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FileSystems; +using Microsoft.AspNet.FileProviders; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -13,6 +13,6 @@ namespace Microsoft.AspNet.Hosting string WebRoot { get; } - IFileSystem WebRootFileSystem { get; set; } + IFileProvider WebRootFileProvider { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index ebd3beb943..5c740ce152 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { - "Microsoft.AspNet.FileSystems": "1.0.0-*", + "Microsoft.AspNet.FileProviders": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index e2e0ba6852..3c6d5c13b6 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -59,7 +59,7 @@ namespace Microsoft.AspNet.Hosting var services = HostingServices.Create().BuildServiceProvider(); var env = services.GetRequiredService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRoot); - Assert.True(env.WebRootFileSystem.GetFileInfo("TextFile.txt").Exists); + Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } public void Initialize(IApplicationBuilder builder) From 118fc73707be5b49a6602e733ff4cab8d1876bc7 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Tue, 20 Jan 2015 17:22:50 -0800 Subject: [PATCH 0385/1838] Updating NuGet.config --- NuGet.Config | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..53454b2000 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,6 @@  - From 2c6411e95d83604c021a650dd8d288f3049bbf77 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Tue, 20 Jan 2015 17:22:57 -0800 Subject: [PATCH 0386/1838] Updating NuGet.config --- NuGet.Config | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 2d3b0cb857..53454b2000 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,6 @@  - From e9c79612aa3748e90256a4657da8ae71a8191ce6 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 20 Jan 2015 18:17:58 -0800 Subject: [PATCH 0387/1838] Rename SKIP_KRE_INSTALL to SKIP_DOTNET_INSTALL --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index c8041fdd9d..220a1ff561 100644 --- a/build.cmd +++ b/build.cmd @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_KRE_INSTALL%"=="1" goto run +IF "%SKIP_DOTNET_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 From 93c5b0f2c8fe7f5a14eab7475b916813271f453f Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 20 Jan 2015 18:19:02 -0800 Subject: [PATCH 0388/1838] Rename SKIP_KRE_INSTALL to SKIP_DOTNET_INSTALL --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index c8041fdd9d..220a1ff561 100644 --- a/build.cmd +++ b/build.cmd @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_KRE_INSTALL%"=="1" goto run +IF "%SKIP_DOTNET_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 From dd8dee2979abda792a4eb3be45c5fa6d224c9021 Mon Sep 17 00:00:00 2001 From: Aligned Date: Wed, 21 Jan 2015 13:18:51 -0600 Subject: [PATCH 0389/1838] Change ASP.NET vNext to ASP.Net 5 in the Readme.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 1dbf89ce85..8bf71cfc4d 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ Hosting ======= -The Hosting repo contains code required to host an ASP.NET vNext application, it is the entry point used when self-hosting an application. +The Hosting repo contains code required to host an ASP.NET 5 application, it is the entry point used when self-hosting an application. -This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. +This project is part of ASP.NET 5. You can find samples, documentation and getting started instructions for ASP.NET 5 at the [Home](https://github.com/aspnet/home) repo. From 97c9f8f479dc8071b7a3b402258ee50af38d51d8 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Wed, 21 Jan 2015 15:49:10 -0800 Subject: [PATCH 0390/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From f733c18075e837acc7117f73a35d00858b3e0b92 Mon Sep 17 00:00:00 2001 From: Suhas Joshi Date: Wed, 21 Jan 2015 15:49:23 -0800 Subject: [PATCH 0391/1838] Updating to release NuGet.config --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + From 15a51e423f52457159064333f238cf425a6340d2 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 22 Jan 2015 09:41:29 -0800 Subject: [PATCH 0392/1838] #175 - Decode multipart headers as UTF-8. --- .../BufferedReadStream.cs | 41 ++++--- .../MultipartReaderTests.cs | 111 ++++++++++++++++++ 2 files changed, 131 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 944f126b93..847873e2d1 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -11,8 +11,8 @@ namespace Microsoft.AspNet.WebUtilities { internal class BufferedReadStream : Stream { - private const char CR = '\r'; - private const char LF = '\n'; + private const byte CR = (byte)'\r'; + private const byte LF = (byte)'\n'; private readonly Stream _inner; private readonly byte[] _buffer; @@ -310,8 +310,9 @@ namespace Microsoft.AspNet.WebUtilities public string ReadLine(int lengthLimit) { CheckDisposed(); - StringBuilder builder = new StringBuilder(); + var builder = new MemoryStream(200); bool foundCR = false, foundCRLF = false; + while (!foundCRLF && EnsureBuffered()) { if (builder.Length > lengthLimit) @@ -321,19 +322,15 @@ namespace Microsoft.AspNet.WebUtilities ProcessLineChar(builder, ref foundCR, ref foundCRLF); } - if (foundCRLF) - { - return builder.ToString(0, builder.Length - 2); // Drop the CRLF - } - // Stream ended with no CRLF. - return builder.ToString(); + return DecodeLine(builder, foundCRLF); } public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) { CheckDisposed(); - StringBuilder builder = new StringBuilder(); + var builder = new MemoryStream(200); bool foundCR = false, foundCRLF = false; + while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) { if (builder.Length > lengthLimit) @@ -344,25 +341,20 @@ namespace Microsoft.AspNet.WebUtilities ProcessLineChar(builder, ref foundCR, ref foundCRLF); } - if (foundCRLF) - { - return builder.ToString(0, builder.Length - 2); // Drop the CRLF - } - // Stream ended with no CRLF. - return builder.ToString(); + return DecodeLine(builder, foundCRLF); } - private void ProcessLineChar(StringBuilder builder, ref bool foundCR, ref bool foundCRLF) + private void ProcessLineChar(MemoryStream builder, ref bool foundCR, ref bool foundCRLF) { - char ch = (char)_buffer[_bufferOffset]; // TODO: Encoding enforcement - builder.Append(ch); + var b = _buffer[_bufferOffset]; + builder.WriteByte(b); _bufferOffset++; _bufferCount--; - if (ch == CR) + if (b == CR) { foundCR = true; } - else if (ch == LF) + else if (b == LF) { if (foundCR) { @@ -375,6 +367,13 @@ namespace Microsoft.AspNet.WebUtilities } } + private string DecodeLine(MemoryStream builder, bool foundCRLF) + { + // Drop the final CRLF, if any + var length = foundCRLF ? builder.Length - 2 : builder.Length; + return Encoding.UTF8.GetString(builder.ToArray(), 0, (int)length); + } + private void CheckDisposed() { if (_disposed) diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs index a642511a86..49a5abedd0 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -43,6 +43,19 @@ Content-Type: text/plain Content of a.txt. +--9051914041544843365972754266-- +"; + private const string TwoPartBodyWithUnicodeFileName = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" + +text default +--9051914041544843365972754266 +Content-Disposition: form-data; name=""file1""; filename=""a色.txt"" +Content-Type: text/plain + +Content of a.txt. + --9051914041544843365972754266-- "; private const string ThreePartBody = @@ -147,6 +160,32 @@ Content-Type: text/html Assert.Null(await reader.ReadNextSectionAsync()); } + [Fact] + public async Task MutipartReader_ReadTwoPartBodyWithUnicodeFileName_Success() + { + var stream = MakeStream(TwoPartBodyWithUnicodeFileName); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(2, section.Headers.Count); + Assert.Equal("form-data; name=\"file1\"; filename=\"a色.txt\"", section.Headers["Content-Disposition"][0]); + Assert.Equal("text/plain", section.Headers["Content-Type"][0]); + buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("Content of a.txt.\r\n", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + [Fact] public async Task MutipartReader_ThreePartBody_Success() { @@ -181,5 +220,77 @@ Content-Type: text/html Assert.Null(await reader.ReadNextSectionAsync()); } + + [Fact] + public async Task MutipartReader_ReadInvalidUtf8Header_ReplacementCharacters() + { + var body1 = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" filename=""a"; + + var body2 = +@".txt"" + +text default +--9051914041544843365972754266-- +"; + var stream = new MemoryStream(); + var bytes = Encoding.UTF8.GetBytes(body1); + stream.Write(bytes, 0, bytes.Length); + + // Write an invalid utf-8 segment in the middle + stream.Write(new byte[] { 0xC1, 0x21 }, 0, 2); + + bytes = Encoding.UTF8.GetBytes(body2); + stream.Write(bytes, 0, bytes.Length); + stream.Seek(0, SeekOrigin.Begin); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\" filename=\"a\uFFFD!.txt\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } + + [Fact] + public async Task MutipartReader_ReadInvalidUtf8SurrogateHeader_ReplacementCharacters() + { + var body1 = +@"--9051914041544843365972754266 +Content-Disposition: form-data; name=""text"" filename=""a"; + + var body2 = +@".txt"" + +text default +--9051914041544843365972754266-- +"; + var stream = new MemoryStream(); + var bytes = Encoding.UTF8.GetBytes(body1); + stream.Write(bytes, 0, bytes.Length); + + // Write an invalid utf-8 segment in the middle + stream.Write(new byte[] { 0xED, 0xA0, 85 }, 0, 3); + + bytes = Encoding.UTF8.GetBytes(body2); + stream.Write(bytes, 0, bytes.Length); + stream.Seek(0, SeekOrigin.Begin); + var reader = new MultipartReader(Boundary, stream); + + var section = await reader.ReadNextSectionAsync(); + Assert.NotNull(section); + Assert.Equal(1, section.Headers.Count); + Assert.Equal("form-data; name=\"text\" filename=\"a\uFFFDU.txt\"", section.Headers["Content-Disposition"][0]); + var buffer = new MemoryStream(); + await section.Body.CopyToAsync(buffer); + Assert.Equal("text default", Encoding.ASCII.GetString(buffer.ToArray())); + + Assert.Null(await reader.ReadNextSectionAsync()); + } } } \ No newline at end of file From 096a0bf2989a20b6f8f8a9b13541764cd57f2444 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 27 Jan 2015 12:18:34 -0800 Subject: [PATCH 0393/1838] #174 - Constants for status codes, lookup for reason phrases. --- .../ReasonPhrases.cs | 65 +++++++++++++++++++ .../StatusCodes.cs | 54 +++++++++++++++ 2 files changed, 119 insertions(+) create mode 100644 src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/StatusCodes.cs diff --git a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs new file mode 100644 index 0000000000..487437d6a3 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.WebUtilities +{ + public static class ReasonPhrases + { + private static IDictionary Phrases = new Dictionary() + { + { 200, "OK" }, + { 201, "Created" }, + { 202, "Accepted" }, + { 203, "Non-Authoritative Information" }, + { 204, "No Content" }, + { 205, "Reset Content" }, + { 206, "Partial Content" }, + + { 300, "Multiple Choices" }, + { 301, "Moved Permanently" }, + { 302, "Found" }, + { 303, "See Other" }, + { 304, "Not Modified" }, + { 305, "Use Proxy" }, + { 306, "Switch Proxy" }, + { 307, "Temporary Redirect" }, + + { 400, "Bad Request" }, + { 401, "Unauthorized" }, + { 402, "Payment Required" }, + { 403, "Forbidden" }, + { 404, "Not Found" }, + { 405, "Method Not Allowed" }, + { 406, "Not Acceptable" }, + { 407, "Proxy Authentication Required" }, + { 408, "Request Timeout" }, + { 409, "Conflict" }, + { 410, "Gone" }, + { 411, "Length Required" }, + { 412, "Precondition Failed" }, + { 413, "Request Entity Too Large" }, + { 414, "Request-URI Too Long" }, + { 415, "Unsupported Media Type" }, + { 416, "Requested Range Not Satisfiable" }, + { 417, "Expectation Failed" }, + { 418, "I'm a teapot" }, + { 419, "Authentication Timeout" }, + + { 500, "Internal Server Error" }, + { 501, "Not Implemented" }, + { 502, "Bad Gateway" }, + { 503, "Service Unavailable" }, + { 504, "Gateway Timeout" }, + { 505, "HTTP Version Not Supported" }, + { 506, "Variant Also Negotiates" }, + }; + + public static string GetReasonPhrase(int statusCode) + { + string phrase; + return Phrases.TryGetValue(statusCode, out phrase) ? phrase : string.Empty; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs new file mode 100644 index 0000000000..959d9593d9 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs @@ -0,0 +1,54 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.WebUtilities +{ + public static class StatusCodes + { + public const int Status200OK = 200; + public const int Status201Created = 201; + public const int Status202Accepted = 202; + public const int Status203NonAuthoritative = 203; + public const int Status204NoContent = 204; + public const int Status205ResetContent = 205; + public const int Status206PartialContent = 206; + + public const int Status300MultipleChoices = 300; + public const int Status301MovedPermanently = 301; + public const int Status302Found = 302; + public const int Status303SeeOther = 303; + public const int Status304NotModified = 304; + public const int Status305UseProxy = 305; + public const int Status306SwitchProxy = 306; + public const int Status307TemporaryRedirect = 307; + + public const int Status400BadRequest = 400; + public const int Status401Unauthorized = 401; + public const int Status402PaymentRequired = 402; + public const int Status403Forbidden = 403; + public const int Status404NotFound = 404; + public const int Status405MethodNotAllowed = 405; + public const int Status406NotAcceptable = 406; + public const int Status407ProxyAuthenticationRequired = 407; + public const int Status408RequestTimeout = 408; + public const int Status409Conflict = 409; + public const int Status410Gone = 410; + public const int Status411LengthRequired = 411; + public const int Status412PreconditionFailed = 412; + public const int Status413RequestEntityTooLarge = 413; + public const int Status414RequestUriTooLong = 414; + public const int Status415UnsupportedMediaType = 415; + public const int Status416RequestedRangeNotSatisfiable = 416; + public const int Status417ExpectationFailed = 417; + public const int Status418ImATeapot = 418; + public const int Status419AuthenticationTimeout = 419; + + public const int Status500InternalServerError = 500; + public const int Status501NotImplemented = 501; + public const int Status502BadGateway = 502; + public const int Status503ServiceUnavailable = 503; + public const int Status504GatewayTimeout = 504; + public const int Status505HttpVersionNotsupported = 505; + public const int Status506VariantAlsoNegotiates = 506; + } +} \ No newline at end of file From 2535e30b125dd5c5c99ea6215a5926d312a0e010 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 28 Jan 2015 18:10:06 -0800 Subject: [PATCH 0394/1838] Update build.cmd and build.sh to use kvm --- build.cmd | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 220a1ff561..5885abe388 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DOTNET_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\dotnetsdk use default -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index 350d7e389a..c7873ef58e 100755 --- a/build.sh +++ b/build.sh @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/dotnetsdk.sh + source packages/KoreBuild/build/kvm.sh fi if ! type k > /dev/null 2>&1; then - dotnetsdk upgrade + kvm upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From 89484cdffb9f0f7ce84cf4a8ea00db1ea6969912 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 28 Jan 2015 18:10:20 -0800 Subject: [PATCH 0395/1838] Change SKIP_DOTNET_INSTALL to SKIP_KRE_INSTALL --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 5885abe388..86ca5bbbf1 100644 --- a/build.cmd +++ b/build.cmd @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_DOTNET_INSTALL%"=="1" goto run +IF "%SKIP_KRE_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 From c90a4918210b8c50636e9bb372c38e0c846b35ae Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 28 Jan 2015 18:11:41 -0800 Subject: [PATCH 0396/1838] Update build.cmd and build.sh to use kvm --- build.cmd | 6 +++--- build.sh | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 220a1ff561..5885abe388 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DOTNET_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dotnetsdk upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\dotnetsdk install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\dotnetsdk use default -runtime CLR -x86 +CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index 350d7e389a..c7873ef58e 100755 --- a/build.sh +++ b/build.sh @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/dotnetsdk.sh + source packages/KoreBuild/build/kvm.sh fi if ! type k > /dev/null 2>&1; then - dotnetsdk upgrade + kvm upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From ae56486c6ac7de859063673af74f2092eac692e9 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Wed, 28 Jan 2015 18:12:37 -0800 Subject: [PATCH 0397/1838] Change SKIP_DOTNET_INSTALL to SKIP_KRE_INSTALL --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 5885abe388..86ca5bbbf1 100644 --- a/build.cmd +++ b/build.cmd @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_DOTNET_INSTALL%"=="1" goto run +IF "%SKIP_KRE_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 From ba58c767e8c34f1a27935c0deca7c48836294ba5 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Jan 2015 22:34:18 -0800 Subject: [PATCH 0398/1838] Fixing NuGet.config --- NuGet.Config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.Config b/NuGet.Config index 53454b2000..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,6 +1,7 @@  + From 3416bfcc80cb2d8e0b464e0a6b4d7cc372c7b8de Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Jan 2015 23:24:31 -0800 Subject: [PATCH 0399/1838] Fixing NuGet.config --- NuGet.Config | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGet.Config b/NuGet.Config index 53454b2000..2d3b0cb857 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,6 +1,7 @@  + From eba2808109f86b034466051d0abccf2d01cf81fa Mon Sep 17 00:00:00 2001 From: damianedwards Date: Tue, 27 Jan 2015 17:50:42 -0800 Subject: [PATCH 0400/1838] Register ILogger -> Logger in default services --- .../HostingServicesCollectionExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 82c134ffb2..8c52a6910d 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -17,6 +17,7 @@ namespace Microsoft.Framework.DependencyInjection { var describe = new ServiceDescriber(config); services.TryAdd(describe.Singleton()); + services.TryAdd(describe.Singleton(typeof(ILogger<>), typeof(Logger<>))); return services; } From 62242689531830b7e5ac3fc171bf91742fa1f5b2 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 4 Feb 2015 14:20:22 -0800 Subject: [PATCH 0401/1838] Updating .kproj files --- .../Microsoft.AspNet.FeatureModel.kproj | 7 +------ .../Microsoft.AspNet.Http.Core.kproj | 7 +------ .../Microsoft.AspNet.Http.Extensions.kproj | 7 +------ .../Microsoft.AspNet.Http.Interfaces.kproj | 7 +------ src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj | 7 +------ src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj | 7 +------ .../Microsoft.AspNet.WebUtilities.kproj | 7 +------ .../Microsoft.Net.Http.Headers.kproj | 8 +------- .../Microsoft.AspNet.Http.Extensions.Tests.kproj | 7 +------ .../Microsoft.AspNet.WebUtilities.Tests.kproj | 7 +------ .../Microsoft.Net.Http.Headers.Tests.kproj | 8 +------- 11 files changed, 11 insertions(+), 68 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj index 5484c20589..f75392129d 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj index 96b305e9b6..b50c4e7764 100644 --- a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj +++ b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj index b431b00760..64be73c1ea 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj index 90f93a0f7b..bd80d293f8 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj +++ b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj index 3a68cce3bc..aead60bd2e 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj index 4c7801eada..e668c3289a 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj index efc8a50504..77c0886660 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj index f6e3ec7676..8750df3e9b 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj @@ -7,7 +7,6 @@ 60aa2fdb-8121-4826-8d00-9a143fefaf66 - Microsoft.Net.Http.Headers ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ @@ -15,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj index b3dbf90a69..3fa25da029 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj index 098750fe14..2592290c21 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj @@ -14,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj index cbf789a8a0..dfb42bfc9a 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj @@ -7,7 +7,6 @@ e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 - Microsoft.Net.Http.Headers.Tests ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ @@ -15,9 +14,4 @@ 2.0 - - - - - - \ No newline at end of file + From 6208698a5c3e65f2b531f5c5aa87a231d9f69a40 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 9 Feb 2015 22:10:29 -0800 Subject: [PATCH 0402/1838] Added Microsoft.AspNet.Hosting.Interfaces package --- Hosting.sln | 17 +++++++++++++++- .../IApplicationLifetime.cs | 0 .../IHostingEnvironment.cs | 0 .../IServerFactory.cs | 0 .../Microsoft.AspNet.Hosting.Interfaces.kproj | 20 +++++++++++++++++++ .../project.json | 14 +++++++++++++ src/Microsoft.AspNet.Hosting/project.json | 6 +++--- .../Microsoft.AspNet.Hosting.Tests.kproj | 5 +++-- 8 files changed, 56 insertions(+), 6 deletions(-) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNet.Hosting.Interfaces}/IApplicationLifetime.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNet.Hosting.Interfaces}/IHostingEnvironment.cs (100%) rename src/{Microsoft.AspNet.Hosting/Server => Microsoft.AspNet.Hosting.Interfaces}/IServerFactory.cs (100%) create mode 100644 src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.kproj create mode 100644 src/Microsoft.AspNet.Hosting.Interfaces/project.json diff --git a/Hosting.sln b/Hosting.sln index 52888aa65a..33c4336fb9 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.21916.0 +VisualStudioVersion = 14.0.22530.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -22,6 +22,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution global.json = global.json EndProjectSection EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.kproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -82,6 +84,18 @@ Global {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.Build.0 = Release|Any CPU {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|x86.Build.0 = Debug|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|Any CPU.Build.0 = Release|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|x86.ActiveCfg = Release|Any CPU + {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -92,5 +106,6 @@ Global {3944F036-7E75-47E8-AA52-C4B89A64EC3A} = {E0497F39-AFFB-4819-A116-E39E361915AB} {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {BB780FBB-7842-4759-8DE7-96FA2E5571C1} = {E0497F39-AFFB-4819-A116-E39E361915AB} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Hosting/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/IApplicationLifetime.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/IHostingEnvironment.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Server/IServerFactory.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.kproj b/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.kproj new file mode 100644 index 0000000000..b50140bec2 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.kproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + bb780fbb-7842-4759-8de7-96fa2e5571c1 + Microsoft.AspNet.Hosting.Interfaces + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json new file mode 100644 index 0000000000..21b82874ae --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -0,0 +1,14 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.ConfigurationModel": "1.0.0-*" + }, + + "frameworks": { + "aspnet50": { }, + "aspnetcore50": { } + } +} diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 5c740ce152..2696a48923 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -2,11 +2,11 @@ "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { - "Microsoft.AspNet.FileProviders": "1.0.0-*", + "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", + "Microsoft.AspNet.FileProviders": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": { "version": "1.0.0-*", "type": "build" }, + "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Newtonsoft.Json": "6.0.6" }, "frameworks": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index e82e9b32a2..766519fb73 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -1,4 +1,4 @@ - + 14.0 @@ -12,6 +12,7 @@ 2.0 + 23533 - + \ No newline at end of file From 9e7fbde9f1a221b4764a4ac2155cd64e48d08381 Mon Sep 17 00:00:00 2001 From: David Haney Date: Tue, 10 Feb 2015 17:41:06 -0500 Subject: [PATCH 0403/1838] Logical AND would never be true; broke into OR statement --- src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs index 7c5be8753c..3c2e9635f3 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -91,7 +91,7 @@ namespace Microsoft.Net.Http.Headers if (skipEmptyValues) { - while ((current < input.Length) && (input[current] == ',') && (input[current] == ';')) + while ((current < input.Length) && ((input[current] == ',') || (input[current] == ';'))) { current++; // skip delimiter. current = current + HttpRuleParser.GetWhitespaceLength(input, current); From 1008e1725954dd59a157722434c9f823f6160272 Mon Sep 17 00:00:00 2001 From: Levi B Date: Sat, 7 Feb 2015 16:03:40 -0800 Subject: [PATCH 0404/1838] Add HtmlEncoder, UrlEncoder, and JavaScriptStringEncoder Also add interfaces for abstracting each of these Unit tests are not in yet but are coming soon --- .../Encoders/CodePointFilters.cs | 2585 +++++++++++++++++ .../Encoders/EncoderCommon.cs | 37 + .../Encoders/HexUtil.cs | 48 + .../Encoders/HtmlEncoder.cs | 229 ++ .../Encoders/ICodePointFilter.cs | 19 + .../Encoders/IHtmlEncoder.cs | 25 + .../Encoders/IJavaScriptStringEncoder.cs | 21 + .../Encoders/IUrlEncoder.cs | 25 + .../Encoders/JavaScriptStringEncoder.cs | 163 ++ .../Encoders/UnicodeEncoderBase.cs | 171 ++ .../Encoders/UnicodeHelpers.cs | 228 ++ .../Encoders/UrlEncoder.cs | 161 + .../unicode-7.0.0-defined-characters.bin | Bin 0 -> 8192 bytes .../project.json | 8 +- 14 files changed, 3719 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs new file mode 100644 index 0000000000..9268062fd5 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs @@ -0,0 +1,2585 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains predefined Unicode code point filters. + /// + public static class CodePointFilters + { + /// + /// A filter which allows no characters. + /// + public static ICodePointFilter None + { + get + { + return LazyInitializer.EnsureInitialized(ref _none); + } + } + private static EmptyCodePointFilter _none; + + /// + /// A filter which allows all Unicode Basic Multilingual Plane characters. + /// + /// + /// This range spans the code points U+0000 .. U+FFFF. + /// + public static ICodePointFilter All + { + get + { + return GetFilter(ref _all, first: '\u0000', last: '\uFFFF'); + } + } + private static DefinedCharacterCodePointFilter _all; + + /// + /// A filter which allows characters in the 'Basic Latin' Unicode range. + /// + /// + /// This range spans the code points U+0000 .. U+007F. + /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BasicLatin + { + get + { + return GetFilter(ref _basicLatin, first: '\u0000', last: '\u007F'); + } + } + private static DefinedCharacterCodePointFilter _basicLatin; + + /// + /// A filter which allows characters in the 'Latin-1 Supplement' Unicode range. + /// + /// + /// This range spans the code points U+0080 .. U+00FF. + /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Latin1Supplement + { + get + { + return GetFilter(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); + } + } + private static DefinedCharacterCodePointFilter _latin1Supplement; + + /// + /// A filter which allows characters in the 'Latin Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+0100 .. U+017F. + /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedA + { + get + { + return GetFilter(ref _latinExtendedA, first: '\u0100', last: '\u017F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedA; + + /// + /// A filter which allows characters in the 'Latin Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+0180 .. U+024F. + /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedB + { + get + { + return GetFilter(ref _latinExtendedB, first: '\u0180', last: '\u024F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedB; + + /// + /// A filter which allows characters in the 'IPA Extensions' Unicode range. + /// + /// + /// This range spans the code points U+0250 .. U+02AF. + /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this range. + /// + public static ICodePointFilter IPAExtensions + { + get + { + return GetFilter(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); + } + } + private static DefinedCharacterCodePointFilter _ipaExtensions; + + /// + /// A filter which allows characters in the 'Spacing Modifier Letters' Unicode range. + /// + /// + /// This range spans the code points U+02B0 .. U+02FF. + /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SpacingModifierLetters + { + get + { + return GetFilter(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); + } + } + private static DefinedCharacterCodePointFilter _spacingModifierLetters; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks' Unicode range. + /// + /// + /// This range spans the code points U+0300 .. U+036F. + /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarks + { + get + { + return GetFilter(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarks; + + /// + /// A filter which allows characters in the 'Greek and Coptic' Unicode range. + /// + /// + /// This range spans the code points U+0370 .. U+03FF. + /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GreekandCoptic + { + get + { + return GetFilter(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); + } + } + private static DefinedCharacterCodePointFilter _greekandCoptic; + + /// + /// A filter which allows characters in the 'Cyrillic' Unicode range. + /// + /// + /// This range spans the code points U+0400 .. U+04FF. + /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Cyrillic + { + get + { + return GetFilter(ref _cyrillic, first: '\u0400', last: '\u04FF'); + } + } + private static DefinedCharacterCodePointFilter _cyrillic; + + /// + /// A filter which allows characters in the 'Cyrillic Supplement' Unicode range. + /// + /// + /// This range spans the code points U+0500 .. U+052F. + /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CyrillicSupplement + { + get + { + return GetFilter(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); + } + } + private static DefinedCharacterCodePointFilter _cyrillicSupplement; + + /// + /// A filter which allows characters in the 'Armenian' Unicode range. + /// + /// + /// This range spans the code points U+0530 .. U+058F. + /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Armenian + { + get + { + return GetFilter(ref _armenian, first: '\u0530', last: '\u058F'); + } + } + private static DefinedCharacterCodePointFilter _armenian; + + /// + /// A filter which allows characters in the 'Hebrew' Unicode range. + /// + /// + /// This range spans the code points U+0590 .. U+05FF. + /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Hebrew + { + get + { + return GetFilter(ref _hebrew, first: '\u0590', last: '\u05FF'); + } + } + private static DefinedCharacterCodePointFilter _hebrew; + + /// + /// A filter which allows characters in the 'Arabic' Unicode range. + /// + /// + /// This range spans the code points U+0600 .. U+06FF. + /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Arabic + { + get + { + return GetFilter(ref _arabic, first: '\u0600', last: '\u06FF'); + } + } + private static DefinedCharacterCodePointFilter _arabic; + + /// + /// A filter which allows characters in the 'Syriac' Unicode range. + /// + /// + /// This range spans the code points U+0700 .. U+074F. + /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Syriac + { + get + { + return GetFilter(ref _syriac, first: '\u0700', last: '\u074F'); + } + } + private static DefinedCharacterCodePointFilter _syriac; + + /// + /// A filter which allows characters in the 'Arabic Supplement' Unicode range. + /// + /// + /// This range spans the code points U+0750 .. U+077F. + /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicSupplement + { + get + { + return GetFilter(ref _arabicSupplement, first: '\u0750', last: '\u077F'); + } + } + private static DefinedCharacterCodePointFilter _arabicSupplement; + + /// + /// A filter which allows characters in the 'Thaana' Unicode range. + /// + /// + /// This range spans the code points U+0780 .. U+07BF. + /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Thaana + { + get + { + return GetFilter(ref _thaana, first: '\u0780', last: '\u07BF'); + } + } + private static DefinedCharacterCodePointFilter _thaana; + + /// + /// A filter which allows characters in the 'NKo' Unicode range. + /// + /// + /// This range spans the code points U+07C0 .. U+07FF. + /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter NKo + { + get + { + return GetFilter(ref _nKo, first: '\u07C0', last: '\u07FF'); + } + } + private static DefinedCharacterCodePointFilter _nKo; + + /// + /// A filter which allows characters in the 'Samaritan' Unicode range. + /// + /// + /// This range spans the code points U+0800 .. U+083F. + /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Samaritan + { + get + { + return GetFilter(ref _samaritan, first: '\u0800', last: '\u083F'); + } + } + private static DefinedCharacterCodePointFilter _samaritan; + + /// + /// A filter which allows characters in the 'Mandaic' Unicode range. + /// + /// + /// This range spans the code points U+0840 .. U+085F. + /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Mandaic + { + get + { + return GetFilter(ref _mandaic, first: '\u0840', last: '\u085F'); + } + } + private static DefinedCharacterCodePointFilter _mandaic; + + /// + /// A filter which allows characters in the 'Arabic Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+08A0 .. U+08FF. + /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicExtendedA + { + get + { + return GetFilter(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); + } + } + private static DefinedCharacterCodePointFilter _arabicExtendedA; + + /// + /// A filter which allows characters in the 'Devanagari' Unicode range. + /// + /// + /// This range spans the code points U+0900 .. U+097F. + /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Devanagari + { + get + { + return GetFilter(ref _devanagari, first: '\u0900', last: '\u097F'); + } + } + private static DefinedCharacterCodePointFilter _devanagari; + + /// + /// A filter which allows characters in the 'Bengali' Unicode range. + /// + /// + /// This range spans the code points U+0980 .. U+09FF. + /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Bengali + { + get + { + return GetFilter(ref _bengali, first: '\u0980', last: '\u09FF'); + } + } + private static DefinedCharacterCodePointFilter _bengali; + + /// + /// A filter which allows characters in the 'Gurmukhi' Unicode range. + /// + /// + /// This range spans the code points U+0A00 .. U+0A7F. + /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Gurmukhi + { + get + { + return GetFilter(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); + } + } + private static DefinedCharacterCodePointFilter _gurmukhi; + + /// + /// A filter which allows characters in the 'Gujarati' Unicode range. + /// + /// + /// This range spans the code points U+0A80 .. U+0AFF. + /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Gujarati + { + get + { + return GetFilter(ref _gujarati, first: '\u0A80', last: '\u0AFF'); + } + } + private static DefinedCharacterCodePointFilter _gujarati; + + /// + /// A filter which allows characters in the 'Oriya' Unicode range. + /// + /// + /// This range spans the code points U+0B00 .. U+0B7F. + /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Oriya + { + get + { + return GetFilter(ref _oriya, first: '\u0B00', last: '\u0B7F'); + } + } + private static DefinedCharacterCodePointFilter _oriya; + + /// + /// A filter which allows characters in the 'Tamil' Unicode range. + /// + /// + /// This range spans the code points U+0B80 .. U+0BFF. + /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tamil + { + get + { + return GetFilter(ref _tamil, first: '\u0B80', last: '\u0BFF'); + } + } + private static DefinedCharacterCodePointFilter _tamil; + + /// + /// A filter which allows characters in the 'Telugu' Unicode range. + /// + /// + /// This range spans the code points U+0C00 .. U+0C7F. + /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Telugu + { + get + { + return GetFilter(ref _telugu, first: '\u0C00', last: '\u0C7F'); + } + } + private static DefinedCharacterCodePointFilter _telugu; + + /// + /// A filter which allows characters in the 'Kannada' Unicode range. + /// + /// + /// This range spans the code points U+0C80 .. U+0CFF. + /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Kannada + { + get + { + return GetFilter(ref _kannada, first: '\u0C80', last: '\u0CFF'); + } + } + private static DefinedCharacterCodePointFilter _kannada; + + /// + /// A filter which allows characters in the 'Malayalam' Unicode range. + /// + /// + /// This range spans the code points U+0D00 .. U+0D7F. + /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Malayalam + { + get + { + return GetFilter(ref _malayalam, first: '\u0D00', last: '\u0D7F'); + } + } + private static DefinedCharacterCodePointFilter _malayalam; + + /// + /// A filter which allows characters in the 'Sinhala' Unicode range. + /// + /// + /// This range spans the code points U+0D80 .. U+0DFF. + /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Sinhala + { + get + { + return GetFilter(ref _sinhala, first: '\u0D80', last: '\u0DFF'); + } + } + private static DefinedCharacterCodePointFilter _sinhala; + + /// + /// A filter which allows characters in the 'Thai' Unicode range. + /// + /// + /// This range spans the code points U+0E00 .. U+0E7F. + /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Thai + { + get + { + return GetFilter(ref _thai, first: '\u0E00', last: '\u0E7F'); + } + } + private static DefinedCharacterCodePointFilter _thai; + + /// + /// A filter which allows characters in the 'Lao' Unicode range. + /// + /// + /// This range spans the code points U+0E80 .. U+0EFF. + /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Lao + { + get + { + return GetFilter(ref _lao, first: '\u0E80', last: '\u0EFF'); + } + } + private static DefinedCharacterCodePointFilter _lao; + + /// + /// A filter which allows characters in the 'Tibetan' Unicode range. + /// + /// + /// This range spans the code points U+0F00 .. U+0FFF. + /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tibetan + { + get + { + return GetFilter(ref _tibetan, first: '\u0F00', last: '\u0FFF'); + } + } + private static DefinedCharacterCodePointFilter _tibetan; + + /// + /// A filter which allows characters in the 'Myanmar' Unicode range. + /// + /// + /// This range spans the code points U+1000 .. U+109F. + /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Myanmar + { + get + { + return GetFilter(ref _myanmar, first: '\u1000', last: '\u109F'); + } + } + private static DefinedCharacterCodePointFilter _myanmar; + + /// + /// A filter which allows characters in the 'Georgian' Unicode range. + /// + /// + /// This range spans the code points U+10A0 .. U+10FF. + /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Georgian + { + get + { + return GetFilter(ref _georgian, first: '\u10A0', last: '\u10FF'); + } + } + private static DefinedCharacterCodePointFilter _georgian; + + /// + /// A filter which allows characters in the 'Hangul Jamo' Unicode range. + /// + /// + /// This range spans the code points U+1100 .. U+11FF. + /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulJamo + { + get + { + return GetFilter(ref _hangulJamo, first: '\u1100', last: '\u11FF'); + } + } + private static DefinedCharacterCodePointFilter _hangulJamo; + + /// + /// A filter which allows characters in the 'Ethiopic' Unicode range. + /// + /// + /// This range spans the code points U+1200 .. U+137F. + /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Ethiopic + { + get + { + return GetFilter(ref _ethiopic, first: '\u1200', last: '\u137F'); + } + } + private static DefinedCharacterCodePointFilter _ethiopic; + + /// + /// A filter which allows characters in the 'Ethiopic Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1380 .. U+139F. + /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EthiopicSupplement + { + get + { + return GetFilter(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); + } + } + private static DefinedCharacterCodePointFilter _ethiopicSupplement; + + /// + /// A filter which allows characters in the 'Cherokee' Unicode range. + /// + /// + /// This range spans the code points U+13A0 .. U+13FF. + /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Cherokee + { + get + { + return GetFilter(ref _cherokee, first: '\u13A0', last: '\u13FF'); + } + } + private static DefinedCharacterCodePointFilter _cherokee; + + /// + /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics' Unicode range. + /// + /// + /// This range spans the code points U+1400 .. U+167F. + /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter UnifiedCanadianAboriginalSyllabics + { + get + { + return GetFilter(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); + } + } + private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabics; + + /// + /// A filter which allows characters in the 'Ogham' Unicode range. + /// + /// + /// This range spans the code points U+1680 .. U+169F. + /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Ogham + { + get + { + return GetFilter(ref _ogham, first: '\u1680', last: '\u169F'); + } + } + private static DefinedCharacterCodePointFilter _ogham; + + /// + /// A filter which allows characters in the 'Runic' Unicode range. + /// + /// + /// This range spans the code points U+16A0 .. U+16FF. + /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Runic + { + get + { + return GetFilter(ref _runic, first: '\u16A0', last: '\u16FF'); + } + } + private static DefinedCharacterCodePointFilter _runic; + + /// + /// A filter which allows characters in the 'Tagalog' Unicode range. + /// + /// + /// This range spans the code points U+1700 .. U+171F. + /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tagalog + { + get + { + return GetFilter(ref _tagalog, first: '\u1700', last: '\u171F'); + } + } + private static DefinedCharacterCodePointFilter _tagalog; + + /// + /// A filter which allows characters in the 'Hanunoo' Unicode range. + /// + /// + /// This range spans the code points U+1720 .. U+173F. + /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Hanunoo + { + get + { + return GetFilter(ref _hanunoo, first: '\u1720', last: '\u173F'); + } + } + private static DefinedCharacterCodePointFilter _hanunoo; + + /// + /// A filter which allows characters in the 'Buhid' Unicode range. + /// + /// + /// This range spans the code points U+1740 .. U+175F. + /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Buhid + { + get + { + return GetFilter(ref _buhid, first: '\u1740', last: '\u175F'); + } + } + private static DefinedCharacterCodePointFilter _buhid; + + /// + /// A filter which allows characters in the 'Tagbanwa' Unicode range. + /// + /// + /// This range spans the code points U+1760 .. U+177F. + /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tagbanwa + { + get + { + return GetFilter(ref _tagbanwa, first: '\u1760', last: '\u177F'); + } + } + private static DefinedCharacterCodePointFilter _tagbanwa; + + /// + /// A filter which allows characters in the 'Khmer' Unicode range. + /// + /// + /// This range spans the code points U+1780 .. U+17FF. + /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Khmer + { + get + { + return GetFilter(ref _khmer, first: '\u1780', last: '\u17FF'); + } + } + private static DefinedCharacterCodePointFilter _khmer; + + /// + /// A filter which allows characters in the 'Mongolian' Unicode range. + /// + /// + /// This range spans the code points U+1800 .. U+18AF. + /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Mongolian + { + get + { + return GetFilter(ref _mongolian, first: '\u1800', last: '\u18AF'); + } + } + private static DefinedCharacterCodePointFilter _mongolian; + + /// + /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics Extended' Unicode range. + /// + /// + /// This range spans the code points U+18B0 .. U+18FF. + /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter UnifiedCanadianAboriginalSyllabicsExtended + { + get + { + return GetFilter(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); + } + } + private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabicsExtended; + + /// + /// A filter which allows characters in the 'Limbu' Unicode range. + /// + /// + /// This range spans the code points U+1900 .. U+194F. + /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Limbu + { + get + { + return GetFilter(ref _limbu, first: '\u1900', last: '\u194F'); + } + } + private static DefinedCharacterCodePointFilter _limbu; + + /// + /// A filter which allows characters in the 'Tai Le' Unicode range. + /// + /// + /// This range spans the code points U+1950 .. U+197F. + /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this range. + /// + public static ICodePointFilter TaiLe + { + get + { + return GetFilter(ref _taiLe, first: '\u1950', last: '\u197F'); + } + } + private static DefinedCharacterCodePointFilter _taiLe; + + /// + /// A filter which allows characters in the 'New Tai Lue' Unicode range. + /// + /// + /// This range spans the code points U+1980 .. U+19DF. + /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter NewTaiLue + { + get + { + return GetFilter(ref _newTaiLue, first: '\u1980', last: '\u19DF'); + } + } + private static DefinedCharacterCodePointFilter _newTaiLue; + + /// + /// A filter which allows characters in the 'Khmer Symbols' Unicode range. + /// + /// + /// This range spans the code points U+19E0 .. U+19FF. + /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KhmerSymbols + { + get + { + return GetFilter(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); + } + } + private static DefinedCharacterCodePointFilter _khmerSymbols; + + /// + /// A filter which allows characters in the 'Buginese' Unicode range. + /// + /// + /// This range spans the code points U+1A00 .. U+1A1F. + /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Buginese + { + get + { + return GetFilter(ref _buginese, first: '\u1A00', last: '\u1A1F'); + } + } + private static DefinedCharacterCodePointFilter _buginese; + + /// + /// A filter which allows characters in the 'Tai Tham' Unicode range. + /// + /// + /// This range spans the code points U+1A20 .. U+1AAF. + /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this range. + /// + public static ICodePointFilter TaiTham + { + get + { + return GetFilter(ref _taiTham, first: '\u1A20', last: '\u1AAF'); + } + } + private static DefinedCharacterCodePointFilter _taiTham; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks Extended' Unicode range. + /// + /// + /// This range spans the code points U+1AB0 .. U+1AFF. + /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarksExtended + { + get + { + return GetFilter(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksExtended; + + /// + /// A filter which allows characters in the 'Balinese' Unicode range. + /// + /// + /// This range spans the code points U+1B00 .. U+1B7F. + /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Balinese + { + get + { + return GetFilter(ref _balinese, first: '\u1B00', last: '\u1B7F'); + } + } + private static DefinedCharacterCodePointFilter _balinese; + + /// + /// A filter which allows characters in the 'Sundanese' Unicode range. + /// + /// + /// This range spans the code points U+1B80 .. U+1BBF. + /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Sundanese + { + get + { + return GetFilter(ref _sundanese, first: '\u1B80', last: '\u1BBF'); + } + } + private static DefinedCharacterCodePointFilter _sundanese; + + /// + /// A filter which allows characters in the 'Batak' Unicode range. + /// + /// + /// This range spans the code points U+1BC0 .. U+1BFF. + /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Batak + { + get + { + return GetFilter(ref _batak, first: '\u1BC0', last: '\u1BFF'); + } + } + private static DefinedCharacterCodePointFilter _batak; + + /// + /// A filter which allows characters in the 'Lepcha' Unicode range. + /// + /// + /// This range spans the code points U+1C00 .. U+1C4F. + /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Lepcha + { + get + { + return GetFilter(ref _lepcha, first: '\u1C00', last: '\u1C4F'); + } + } + private static DefinedCharacterCodePointFilter _lepcha; + + /// + /// A filter which allows characters in the 'Ol Chiki' Unicode range. + /// + /// + /// This range spans the code points U+1C50 .. U+1C7F. + /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this range. + /// + public static ICodePointFilter OlChiki + { + get + { + return GetFilter(ref _olChiki, first: '\u1C50', last: '\u1C7F'); + } + } + private static DefinedCharacterCodePointFilter _olChiki; + + /// + /// A filter which allows characters in the 'Sundanese Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1CC0 .. U+1CCF. + /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SundaneseSupplement + { + get + { + return GetFilter(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); + } + } + private static DefinedCharacterCodePointFilter _sundaneseSupplement; + + /// + /// A filter which allows characters in the 'Vedic Extensions' Unicode range. + /// + /// + /// This range spans the code points U+1CD0 .. U+1CFF. + /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter VedicExtensions + { + get + { + return GetFilter(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); + } + } + private static DefinedCharacterCodePointFilter _vedicExtensions; + + /// + /// A filter which allows characters in the 'Phonetic Extensions' Unicode range. + /// + /// + /// This range spans the code points U+1D00 .. U+1D7F. + /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter PhoneticExtensions + { + get + { + return GetFilter(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); + } + } + private static DefinedCharacterCodePointFilter _phoneticExtensions; + + /// + /// A filter which allows characters in the 'Phonetic Extensions Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1D80 .. U+1DBF. + /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter PhoneticExtensionsSupplement + { + get + { + return GetFilter(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); + } + } + private static DefinedCharacterCodePointFilter _phoneticExtensionsSupplement; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks Supplement' Unicode range. + /// + /// + /// This range spans the code points U+1DC0 .. U+1DFF. + /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarksSupplement + { + get + { + return GetFilter(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksSupplement; + + /// + /// A filter which allows characters in the 'Latin Extended Additional' Unicode range. + /// + /// + /// This range spans the code points U+1E00 .. U+1EFF. + /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedAdditional + { + get + { + return GetFilter(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedAdditional; + + /// + /// A filter which allows characters in the 'Greek Extended' Unicode range. + /// + /// + /// This range spans the code points U+1F00 .. U+1FFF. + /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GreekExtended + { + get + { + return GetFilter(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); + } + } + private static DefinedCharacterCodePointFilter _greekExtended; + + /// + /// A filter which allows characters in the 'General Punctuation' Unicode range. + /// + /// + /// This range spans the code points U+2000 .. U+206F. + /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GeneralPunctuation + { + get + { + return GetFilter(ref _generalPunctuation, first: '\u2000', last: '\u206F'); + } + } + private static DefinedCharacterCodePointFilter _generalPunctuation; + + /// + /// A filter which allows characters in the 'Superscripts and Subscripts' Unicode range. + /// + /// + /// This range spans the code points U+2070 .. U+209F. + /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SuperscriptsandSubscripts + { + get + { + return GetFilter(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); + } + } + private static DefinedCharacterCodePointFilter _superscriptsandSubscripts; + + /// + /// A filter which allows characters in the 'Currency Symbols' Unicode range. + /// + /// + /// This range spans the code points U+20A0 .. U+20CF. + /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CurrencySymbols + { + get + { + return GetFilter(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); + } + } + private static DefinedCharacterCodePointFilter _currencySymbols; + + /// + /// A filter which allows characters in the 'Combining Diacritical Marks for Symbols' Unicode range. + /// + /// + /// This range spans the code points U+20D0 .. U+20FF. + /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningDiacriticalMarksforSymbols + { + get + { + return GetFilter(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); + } + } + private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksforSymbols; + + /// + /// A filter which allows characters in the 'Letterlike Symbols' Unicode range. + /// + /// + /// This range spans the code points U+2100 .. U+214F. + /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LetterlikeSymbols + { + get + { + return GetFilter(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); + } + } + private static DefinedCharacterCodePointFilter _letterlikeSymbols; + + /// + /// A filter which allows characters in the 'Number Forms' Unicode range. + /// + /// + /// This range spans the code points U+2150 .. U+218F. + /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this range. + /// + public static ICodePointFilter NumberForms + { + get + { + return GetFilter(ref _numberForms, first: '\u2150', last: '\u218F'); + } + } + private static DefinedCharacterCodePointFilter _numberForms; + + /// + /// A filter which allows characters in the 'Arrows' Unicode range. + /// + /// + /// This range spans the code points U+2190 .. U+21FF. + /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Arrows + { + get + { + return GetFilter(ref _arrows, first: '\u2190', last: '\u21FF'); + } + } + private static DefinedCharacterCodePointFilter _arrows; + + /// + /// A filter which allows characters in the 'Mathematical Operators' Unicode range. + /// + /// + /// This range spans the code points U+2200 .. U+22FF. + /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MathematicalOperators + { + get + { + return GetFilter(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); + } + } + private static DefinedCharacterCodePointFilter _mathematicalOperators; + + /// + /// A filter which allows characters in the 'Miscellaneous Technical' Unicode range. + /// + /// + /// This range spans the code points U+2300 .. U+23FF. + /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousTechnical + { + get + { + return GetFilter(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousTechnical; + + /// + /// A filter which allows characters in the 'Control Pictures' Unicode range. + /// + /// + /// This range spans the code points U+2400 .. U+243F. + /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ControlPictures + { + get + { + return GetFilter(ref _controlPictures, first: '\u2400', last: '\u243F'); + } + } + private static DefinedCharacterCodePointFilter _controlPictures; + + /// + /// A filter which allows characters in the 'Optical Character Recognition' Unicode range. + /// + /// + /// This range spans the code points U+2440 .. U+245F. + /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this range. + /// + public static ICodePointFilter OpticalCharacterRecognition + { + get + { + return GetFilter(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); + } + } + private static DefinedCharacterCodePointFilter _opticalCharacterRecognition; + + /// + /// A filter which allows characters in the 'Enclosed Alphanumerics' Unicode range. + /// + /// + /// This range spans the code points U+2460 .. U+24FF. + /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EnclosedAlphanumerics + { + get + { + return GetFilter(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); + } + } + private static DefinedCharacterCodePointFilter _enclosedAlphanumerics; + + /// + /// A filter which allows characters in the 'Box Drawing' Unicode range. + /// + /// + /// This range spans the code points U+2500 .. U+257F. + /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BoxDrawing + { + get + { + return GetFilter(ref _boxDrawing, first: '\u2500', last: '\u257F'); + } + } + private static DefinedCharacterCodePointFilter _boxDrawing; + + /// + /// A filter which allows characters in the 'Block Elements' Unicode range. + /// + /// + /// This range spans the code points U+2580 .. U+259F. + /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BlockElements + { + get + { + return GetFilter(ref _blockElements, first: '\u2580', last: '\u259F'); + } + } + private static DefinedCharacterCodePointFilter _blockElements; + + /// + /// A filter which allows characters in the 'Geometric Shapes' Unicode range. + /// + /// + /// This range spans the code points U+25A0 .. U+25FF. + /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GeometricShapes + { + get + { + return GetFilter(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); + } + } + private static DefinedCharacterCodePointFilter _geometricShapes; + + /// + /// A filter which allows characters in the 'Miscellaneous Symbols' Unicode range. + /// + /// + /// This range spans the code points U+2600 .. U+26FF. + /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousSymbols + { + get + { + return GetFilter(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousSymbols; + + /// + /// A filter which allows characters in the 'Dingbats' Unicode range. + /// + /// + /// This range spans the code points U+2700 .. U+27BF. + /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Dingbats + { + get + { + return GetFilter(ref _dingbats, first: '\u2700', last: '\u27BF'); + } + } + private static DefinedCharacterCodePointFilter _dingbats; + + /// + /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-A' Unicode range. + /// + /// + /// This range spans the code points U+27C0 .. U+27EF. + /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousMathematicalSymbolsA + { + get + { + return GetFilter(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsA; + + /// + /// A filter which allows characters in the 'Supplemental Arrows-A' Unicode range. + /// + /// + /// This range spans the code points U+27F0 .. U+27FF. + /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalArrowsA + { + get + { + return GetFilter(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); + } + } + private static DefinedCharacterCodePointFilter _supplementalArrowsA; + + /// + /// A filter which allows characters in the 'Braille Patterns' Unicode range. + /// + /// + /// This range spans the code points U+2800 .. U+28FF. + /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BraillePatterns + { + get + { + return GetFilter(ref _braillePatterns, first: '\u2800', last: '\u28FF'); + } + } + private static DefinedCharacterCodePointFilter _braillePatterns; + + /// + /// A filter which allows characters in the 'Supplemental Arrows-B' Unicode range. + /// + /// + /// This range spans the code points U+2900 .. U+297F. + /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalArrowsB + { + get + { + return GetFilter(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); + } + } + private static DefinedCharacterCodePointFilter _supplementalArrowsB; + + /// + /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-B' Unicode range. + /// + /// + /// This range spans the code points U+2980 .. U+29FF. + /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousMathematicalSymbolsB + { + get + { + return GetFilter(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsB; + + /// + /// A filter which allows characters in the 'Supplemental Mathematical Operators' Unicode range. + /// + /// + /// This range spans the code points U+2A00 .. U+2AFF. + /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalMathematicalOperators + { + get + { + return GetFilter(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); + } + } + private static DefinedCharacterCodePointFilter _supplementalMathematicalOperators; + + /// + /// A filter which allows characters in the 'Miscellaneous Symbols and Arrows' Unicode range. + /// + /// + /// This range spans the code points U+2B00 .. U+2BFF. + /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MiscellaneousSymbolsandArrows + { + get + { + return GetFilter(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); + } + } + private static DefinedCharacterCodePointFilter _miscellaneousSymbolsandArrows; + + /// + /// A filter which allows characters in the 'Glagolitic' Unicode range. + /// + /// + /// This range spans the code points U+2C00 .. U+2C5F. + /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Glagolitic + { + get + { + return GetFilter(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); + } + } + private static DefinedCharacterCodePointFilter _glagolitic; + + /// + /// A filter which allows characters in the 'Latin Extended-C' Unicode range. + /// + /// + /// This range spans the code points U+2C60 .. U+2C7F. + /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedC + { + get + { + return GetFilter(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedC; + + /// + /// A filter which allows characters in the 'Coptic' Unicode range. + /// + /// + /// This range spans the code points U+2C80 .. U+2CFF. + /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Coptic + { + get + { + return GetFilter(ref _coptic, first: '\u2C80', last: '\u2CFF'); + } + } + private static DefinedCharacterCodePointFilter _coptic; + + /// + /// A filter which allows characters in the 'Georgian Supplement' Unicode range. + /// + /// + /// This range spans the code points U+2D00 .. U+2D2F. + /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter GeorgianSupplement + { + get + { + return GetFilter(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); + } + } + private static DefinedCharacterCodePointFilter _georgianSupplement; + + /// + /// A filter which allows characters in the 'Tifinagh' Unicode range. + /// + /// + /// This range spans the code points U+2D30 .. U+2D7F. + /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Tifinagh + { + get + { + return GetFilter(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); + } + } + private static DefinedCharacterCodePointFilter _tifinagh; + + /// + /// A filter which allows characters in the 'Ethiopic Extended' Unicode range. + /// + /// + /// This range spans the code points U+2D80 .. U+2DDF. + /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EthiopicExtended + { + get + { + return GetFilter(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); + } + } + private static DefinedCharacterCodePointFilter _ethiopicExtended; + + /// + /// A filter which allows characters in the 'Cyrillic Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+2DE0 .. U+2DFF. + /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CyrillicExtendedA + { + get + { + return GetFilter(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); + } + } + private static DefinedCharacterCodePointFilter _cyrillicExtendedA; + + /// + /// A filter which allows characters in the 'Supplemental Punctuation' Unicode range. + /// + /// + /// This range spans the code points U+2E00 .. U+2E7F. + /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SupplementalPunctuation + { + get + { + return GetFilter(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); + } + } + private static DefinedCharacterCodePointFilter _supplementalPunctuation; + + /// + /// A filter which allows characters in the 'CJK Radicals Supplement' Unicode range. + /// + /// + /// This range spans the code points U+2E80 .. U+2EFF. + /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKRadicalsSupplement + { + get + { + return GetFilter(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); + } + } + private static DefinedCharacterCodePointFilter _cjkRadicalsSupplement; + + /// + /// A filter which allows characters in the 'Kangxi Radicals' Unicode range. + /// + /// + /// This range spans the code points U+2F00 .. U+2FDF. + /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KangxiRadicals + { + get + { + return GetFilter(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); + } + } + private static DefinedCharacterCodePointFilter _kangxiRadicals; + + /// + /// A filter which allows characters in the 'Ideographic Description Characters' Unicode range. + /// + /// + /// This range spans the code points U+2FF0 .. U+2FFF. + /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter IdeographicDescriptionCharacters + { + get + { + return GetFilter(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); + } + } + private static DefinedCharacterCodePointFilter _ideographicDescriptionCharacters; + + /// + /// A filter which allows characters in the 'CJK Symbols and Punctuation' Unicode range. + /// + /// + /// This range spans the code points U+3000 .. U+303F. + /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKSymbolsandPunctuation + { + get + { + return GetFilter(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); + } + } + private static DefinedCharacterCodePointFilter _cjkSymbolsandPunctuation; + + /// + /// A filter which allows characters in the 'Hiragana' Unicode range. + /// + /// + /// This range spans the code points U+3040 .. U+309F. + /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Hiragana + { + get + { + return GetFilter(ref _hiragana, first: '\u3040', last: '\u309F'); + } + } + private static DefinedCharacterCodePointFilter _hiragana; + + /// + /// A filter which allows characters in the 'Katakana' Unicode range. + /// + /// + /// This range spans the code points U+30A0 .. U+30FF. + /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Katakana + { + get + { + return GetFilter(ref _katakana, first: '\u30A0', last: '\u30FF'); + } + } + private static DefinedCharacterCodePointFilter _katakana; + + /// + /// A filter which allows characters in the 'Bopomofo' Unicode range. + /// + /// + /// This range spans the code points U+3100 .. U+312F. + /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Bopomofo + { + get + { + return GetFilter(ref _bopomofo, first: '\u3100', last: '\u312F'); + } + } + private static DefinedCharacterCodePointFilter _bopomofo; + + /// + /// A filter which allows characters in the 'Hangul Compatibility Jamo' Unicode range. + /// + /// + /// This range spans the code points U+3130 .. U+318F. + /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulCompatibilityJamo + { + get + { + return GetFilter(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); + } + } + private static DefinedCharacterCodePointFilter _hangulCompatibilityJamo; + + /// + /// A filter which allows characters in the 'Kanbun' Unicode range. + /// + /// + /// This range spans the code points U+3190 .. U+319F. + /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Kanbun + { + get + { + return GetFilter(ref _kanbun, first: '\u3190', last: '\u319F'); + } + } + private static DefinedCharacterCodePointFilter _kanbun; + + /// + /// A filter which allows characters in the 'Bopomofo Extended' Unicode range. + /// + /// + /// This range spans the code points U+31A0 .. U+31BF. + /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter BopomofoExtended + { + get + { + return GetFilter(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); + } + } + private static DefinedCharacterCodePointFilter _bopomofoExtended; + + /// + /// A filter which allows characters in the 'CJK Strokes' Unicode range. + /// + /// + /// This range spans the code points U+31C0 .. U+31EF. + /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKStrokes + { + get + { + return GetFilter(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); + } + } + private static DefinedCharacterCodePointFilter _cjkStrokes; + + /// + /// A filter which allows characters in the 'Katakana Phonetic Extensions' Unicode range. + /// + /// + /// This range spans the code points U+31F0 .. U+31FF. + /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KatakanaPhoneticExtensions + { + get + { + return GetFilter(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); + } + } + private static DefinedCharacterCodePointFilter _katakanaPhoneticExtensions; + + /// + /// A filter which allows characters in the 'Enclosed CJK Letters and Months' Unicode range. + /// + /// + /// This range spans the code points U+3200 .. U+32FF. + /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EnclosedCJKLettersandMonths + { + get + { + return GetFilter(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); + } + } + private static DefinedCharacterCodePointFilter _enclosedCJKLettersandMonths; + + /// + /// A filter which allows characters in the 'CJK Compatibility' Unicode range. + /// + /// + /// This range spans the code points U+3300 .. U+33FF. + /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKCompatibility + { + get + { + return GetFilter(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); + } + } + private static DefinedCharacterCodePointFilter _cjkCompatibility; + + /// + /// A filter which allows characters in the 'CJK Unified Ideographs Extension A' Unicode range. + /// + /// + /// This range spans the code points U+3400 .. U+4DBF. + /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKUnifiedIdeographsExtensionA + { + get + { + return GetFilter(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); + } + } + private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographsExtensionA; + + /// + /// A filter which allows characters in the 'Yijing Hexagram Symbols' Unicode range. + /// + /// + /// This range spans the code points U+4DC0 .. U+4DFF. + /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter YijingHexagramSymbols + { + get + { + return GetFilter(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); + } + } + private static DefinedCharacterCodePointFilter _yijingHexagramSymbols; + + /// + /// A filter which allows characters in the 'CJK Unified Ideographs' Unicode range. + /// + /// + /// This range spans the code points U+4E00 .. U+9FFF. + /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKUnifiedIdeographs + { + get + { + return GetFilter(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); + } + } + private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographs; + + /// + /// A filter which allows characters in the 'Yi Syllables' Unicode range. + /// + /// + /// This range spans the code points U+A000 .. U+A48F. + /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this range. + /// + public static ICodePointFilter YiSyllables + { + get + { + return GetFilter(ref _yiSyllables, first: '\uA000', last: '\uA48F'); + } + } + private static DefinedCharacterCodePointFilter _yiSyllables; + + /// + /// A filter which allows characters in the 'Yi Radicals' Unicode range. + /// + /// + /// This range spans the code points U+A490 .. U+A4CF. + /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this range. + /// + public static ICodePointFilter YiRadicals + { + get + { + return GetFilter(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); + } + } + private static DefinedCharacterCodePointFilter _yiRadicals; + + /// + /// A filter which allows characters in the 'Lisu' Unicode range. + /// + /// + /// This range spans the code points U+A4D0 .. U+A4FF. + /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Lisu + { + get + { + return GetFilter(ref _lisu, first: '\uA4D0', last: '\uA4FF'); + } + } + private static DefinedCharacterCodePointFilter _lisu; + + /// + /// A filter which allows characters in the 'Vai' Unicode range. + /// + /// + /// This range spans the code points U+A500 .. U+A63F. + /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Vai + { + get + { + return GetFilter(ref _vai, first: '\uA500', last: '\uA63F'); + } + } + private static DefinedCharacterCodePointFilter _vai; + + /// + /// A filter which allows characters in the 'Cyrillic Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+A640 .. U+A69F. + /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CyrillicExtendedB + { + get + { + return GetFilter(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); + } + } + private static DefinedCharacterCodePointFilter _cyrillicExtendedB; + + /// + /// A filter which allows characters in the 'Bamum' Unicode range. + /// + /// + /// This range spans the code points U+A6A0 .. U+A6FF. + /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Bamum + { + get + { + return GetFilter(ref _bamum, first: '\uA6A0', last: '\uA6FF'); + } + } + private static DefinedCharacterCodePointFilter _bamum; + + /// + /// A filter which allows characters in the 'Modifier Tone Letters' Unicode range. + /// + /// + /// This range spans the code points U+A700 .. U+A71F. + /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ModifierToneLetters + { + get + { + return GetFilter(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); + } + } + private static DefinedCharacterCodePointFilter _modifierToneLetters; + + /// + /// A filter which allows characters in the 'Latin Extended-D' Unicode range. + /// + /// + /// This range spans the code points U+A720 .. U+A7FF. + /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedD + { + get + { + return GetFilter(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedD; + + /// + /// A filter which allows characters in the 'Syloti Nagri' Unicode range. + /// + /// + /// This range spans the code points U+A800 .. U+A82F. + /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SylotiNagri + { + get + { + return GetFilter(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); + } + } + private static DefinedCharacterCodePointFilter _sylotiNagri; + + /// + /// A filter which allows characters in the 'Common Indic Number Forms' Unicode range. + /// + /// + /// This range spans the code points U+A830 .. U+A83F. + /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CommonIndicNumberForms + { + get + { + return GetFilter(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); + } + } + private static DefinedCharacterCodePointFilter _commonIndicNumberForms; + + /// + /// A filter which allows characters in the 'Phags-pa' Unicode range. + /// + /// + /// This range spans the code points U+A840 .. U+A87F. + /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Phagspa + { + get + { + return GetFilter(ref _phagspa, first: '\uA840', last: '\uA87F'); + } + } + private static DefinedCharacterCodePointFilter _phagspa; + + /// + /// A filter which allows characters in the 'Saurashtra' Unicode range. + /// + /// + /// This range spans the code points U+A880 .. U+A8DF. + /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Saurashtra + { + get + { + return GetFilter(ref _saurashtra, first: '\uA880', last: '\uA8DF'); + } + } + private static DefinedCharacterCodePointFilter _saurashtra; + + /// + /// A filter which allows characters in the 'Devanagari Extended' Unicode range. + /// + /// + /// This range spans the code points U+A8E0 .. U+A8FF. + /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter DevanagariExtended + { + get + { + return GetFilter(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); + } + } + private static DefinedCharacterCodePointFilter _devanagariExtended; + + /// + /// A filter which allows characters in the 'Kayah Li' Unicode range. + /// + /// + /// This range spans the code points U+A900 .. U+A92F. + /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter KayahLi + { + get + { + return GetFilter(ref _kayahLi, first: '\uA900', last: '\uA92F'); + } + } + private static DefinedCharacterCodePointFilter _kayahLi; + + /// + /// A filter which allows characters in the 'Rejang' Unicode range. + /// + /// + /// This range spans the code points U+A930 .. U+A95F. + /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Rejang + { + get + { + return GetFilter(ref _rejang, first: '\uA930', last: '\uA95F'); + } + } + private static DefinedCharacterCodePointFilter _rejang; + + /// + /// A filter which allows characters in the 'Hangul Jamo Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+A960 .. U+A97F. + /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulJamoExtendedA + { + get + { + return GetFilter(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); + } + } + private static DefinedCharacterCodePointFilter _hangulJamoExtendedA; + + /// + /// A filter which allows characters in the 'Javanese' Unicode range. + /// + /// + /// This range spans the code points U+A980 .. U+A9DF. + /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Javanese + { + get + { + return GetFilter(ref _javanese, first: '\uA980', last: '\uA9DF'); + } + } + private static DefinedCharacterCodePointFilter _javanese; + + /// + /// A filter which allows characters in the 'Myanmar Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+A9E0 .. U+A9FF. + /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MyanmarExtendedB + { + get + { + return GetFilter(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); + } + } + private static DefinedCharacterCodePointFilter _myanmarExtendedB; + + /// + /// A filter which allows characters in the 'Cham' Unicode range. + /// + /// + /// This range spans the code points U+AA00 .. U+AA5F. + /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Cham + { + get + { + return GetFilter(ref _cham, first: '\uAA00', last: '\uAA5F'); + } + } + private static DefinedCharacterCodePointFilter _cham; + + /// + /// A filter which allows characters in the 'Myanmar Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+AA60 .. U+AA7F. + /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MyanmarExtendedA + { + get + { + return GetFilter(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); + } + } + private static DefinedCharacterCodePointFilter _myanmarExtendedA; + + /// + /// A filter which allows characters in the 'Tai Viet' Unicode range. + /// + /// + /// This range spans the code points U+AA80 .. U+AADF. + /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this range. + /// + public static ICodePointFilter TaiViet + { + get + { + return GetFilter(ref _taiViet, first: '\uAA80', last: '\uAADF'); + } + } + private static DefinedCharacterCodePointFilter _taiViet; + + /// + /// A filter which allows characters in the 'Meetei Mayek Extensions' Unicode range. + /// + /// + /// This range spans the code points U+AAE0 .. U+AAFF. + /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MeeteiMayekExtensions + { + get + { + return GetFilter(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); + } + } + private static DefinedCharacterCodePointFilter _meeteiMayekExtensions; + + /// + /// A filter which allows characters in the 'Ethiopic Extended-A' Unicode range. + /// + /// + /// This range spans the code points U+AB00 .. U+AB2F. + /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter EthiopicExtendedA + { + get + { + return GetFilter(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); + } + } + private static DefinedCharacterCodePointFilter _ethiopicExtendedA; + + /// + /// A filter which allows characters in the 'Latin Extended-E' Unicode range. + /// + /// + /// This range spans the code points U+AB30 .. U+AB6F. + /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this range. + /// + public static ICodePointFilter LatinExtendedE + { + get + { + return GetFilter(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); + } + } + private static DefinedCharacterCodePointFilter _latinExtendedE; + + /// + /// A filter which allows characters in the 'Meetei Mayek' Unicode range. + /// + /// + /// This range spans the code points U+ABC0 .. U+ABFF. + /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter MeeteiMayek + { + get + { + return GetFilter(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); + } + } + private static DefinedCharacterCodePointFilter _meeteiMayek; + + /// + /// A filter which allows characters in the 'Hangul Syllables' Unicode range. + /// + /// + /// This range spans the code points U+AC00 .. U+D7AF. + /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulSyllables + { + get + { + return GetFilter(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); + } + } + private static DefinedCharacterCodePointFilter _hangulSyllables; + + /// + /// A filter which allows characters in the 'Hangul Jamo Extended-B' Unicode range. + /// + /// + /// This range spans the code points U+D7B0 .. U+D7FF. + /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HangulJamoExtendedB + { + get + { + return GetFilter(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); + } + } + private static DefinedCharacterCodePointFilter _hangulJamoExtendedB; + + /// + /// A filter which allows characters in the 'CJK Compatibility Ideographs' Unicode range. + /// + /// + /// This range spans the code points U+F900 .. U+FAFF. + /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKCompatibilityIdeographs + { + get + { + return GetFilter(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); + } + } + private static DefinedCharacterCodePointFilter _cjkCompatibilityIdeographs; + + /// + /// A filter which allows characters in the 'Alphabetic Presentation Forms' Unicode range. + /// + /// + /// This range spans the code points U+FB00 .. U+FB4F. + /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter AlphabeticPresentationForms + { + get + { + return GetFilter(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); + } + } + private static DefinedCharacterCodePointFilter _alphabeticPresentationForms; + + /// + /// A filter which allows characters in the 'Arabic Presentation Forms-A' Unicode range. + /// + /// + /// This range spans the code points U+FB50 .. U+FDFF. + /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicPresentationFormsA + { + get + { + return GetFilter(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); + } + } + private static DefinedCharacterCodePointFilter _arabicPresentationFormsA; + + /// + /// A filter which allows characters in the 'Variation Selectors' Unicode range. + /// + /// + /// This range spans the code points U+FE00 .. U+FE0F. + /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter VariationSelectors + { + get + { + return GetFilter(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); + } + } + private static DefinedCharacterCodePointFilter _variationSelectors; + + /// + /// A filter which allows characters in the 'Vertical Forms' Unicode range. + /// + /// + /// This range spans the code points U+FE10 .. U+FE1F. + /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this range. + /// + public static ICodePointFilter VerticalForms + { + get + { + return GetFilter(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); + } + } + private static DefinedCharacterCodePointFilter _verticalForms; + + /// + /// A filter which allows characters in the 'Combining Half Marks' Unicode range. + /// + /// + /// This range spans the code points U+FE20 .. U+FE2F. + /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CombiningHalfMarks + { + get + { + return GetFilter(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); + } + } + private static DefinedCharacterCodePointFilter _combiningHalfMarks; + + /// + /// A filter which allows characters in the 'CJK Compatibility Forms' Unicode range. + /// + /// + /// This range spans the code points U+FE30 .. U+FE4F. + /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this range. + /// + public static ICodePointFilter CJKCompatibilityForms + { + get + { + return GetFilter(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); + } + } + private static DefinedCharacterCodePointFilter _cjkCompatibilityForms; + + /// + /// A filter which allows characters in the 'Small Form Variants' Unicode range. + /// + /// + /// This range spans the code points U+FE50 .. U+FE6F. + /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this range. + /// + public static ICodePointFilter SmallFormVariants + { + get + { + return GetFilter(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); + } + } + private static DefinedCharacterCodePointFilter _smallFormVariants; + + /// + /// A filter which allows characters in the 'Arabic Presentation Forms-B' Unicode range. + /// + /// + /// This range spans the code points U+FE70 .. U+FEFF. + /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this range. + /// + public static ICodePointFilter ArabicPresentationFormsB + { + get + { + return GetFilter(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); + } + } + private static DefinedCharacterCodePointFilter _arabicPresentationFormsB; + + /// + /// A filter which allows characters in the 'Halfwidth and Fullwidth Forms' Unicode range. + /// + /// + /// This range spans the code points U+FF00 .. U+FFEF. + /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this range. + /// + public static ICodePointFilter HalfwidthandFullwidthForms + { + get + { + return GetFilter(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); + } + } + private static DefinedCharacterCodePointFilter _halfwidthandFullwidthForms; + + /// + /// A filter which allows characters in the 'Specials' Unicode range. + /// + /// + /// This range spans the code points U+FFF0 .. U+FFFF. + /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this range. + /// + public static ICodePointFilter Specials + { + get + { + return GetFilter(ref _specials, first: '\uFFF0', last: '\uFFFF'); + } + } + private static DefinedCharacterCodePointFilter _specials; + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private static ICodePointFilter GetFilter(ref DefinedCharacterCodePointFilter filter, char first, char last) + { + // Return an existing filter if it has already been created, otherwise + // create a new filter on-demand. + return Volatile.Read(ref filter) ?? GetFilterSlow(ref filter, first, last); + } + + private static ICodePointFilter GetFilterSlow(ref DefinedCharacterCodePointFilter filter, char first, char last) + { + // If the filter hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'filter' value. + DefinedCharacterCodePointFilter newFilter = new DefinedCharacterCodePointFilter(first, last); + Volatile.Write(ref filter, newFilter); + return newFilter; + } + + /// + /// A code point filter which returns only defined characters within a certain + /// range of the Unicode specification. + /// + private sealed class DefinedCharacterCodePointFilter : ICodePointFilter + { + private readonly int _count; + private readonly int _first; + + public DefinedCharacterCodePointFilter(int first, int last) + { + Debug.Assert(0 <= first); + Debug.Assert(first <= last); + Debug.Assert(last <= 0xFFFF); + + _first = first; + _count = last - first + 1; + } + + public IEnumerable GetAllowedCodePoints() + { + for (int i = 0; i < _count; i++) + { + int thisCodePoint = _first + i; + if (UnicodeHelpers.IsCharacterDefined((char)thisCodePoint)) + { + yield return thisCodePoint; + } + } + } + } + + /// + /// A filter that allows no code points. + /// + private sealed class EmptyCodePointFilter : ICodePointFilter + { + public IEnumerable GetAllowedCodePoints() + { + return Enumerable.Empty(); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs new file mode 100644 index 0000000000..a46ae99ed2 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + internal static class EncoderCommon + { + // Gets the optimal capacity of the StringBuilder that will be used to build the output + // given a specified number of input characters and the worst-case growth. + public static int GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar) + { + // We treat 32KB byte size (16k chars) as a soft upper boundary for the length of any StringBuilder + // that we allocate. We'll try to avoid going above this boundary if we can avoid it so that we + // don't allocate objects on the LOH. + const int upperBound = 16 * 1024; + + // Once we have chosen an initial value for the StringBuilder size, the StringBuilder type will + // efficiently allocate additionally blocks if necessary. + + if (numCharsToEncode >= upperBound) + { + // We know that the output will contain at least as many characters as the input, so if the + // input length exceeds the soft upper boundary just preallocate the entire builder and hope for + // a best-case outcome. + return numCharsToEncode; + } + else + { + // Allocate the worst-case if we can, but don't exceed the soft upper boundary. + long worstCaseTotalChars = (long)numCharsToEncode * worstCaseOutputCharsPerInputChar; + return (int)Math.Min(upperBound, worstCaseTotalChars); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs new file mode 100644 index 0000000000..05fa1c5882 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs @@ -0,0 +1,48 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains helpers for dealing with byte-hex char conversions. + /// + internal static class HexUtil + { + /// + /// Converts a number 0 - 15 to its associated hex character '0' - 'F'. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static char IntToChar(uint i) + { + Debug.Assert(i < 16); + return (i < 10) ? (char)('0' + i) : (char)('A' + (i - 10)); + } + + /// + /// Returns the integral form of this hexadecimal character. + /// + /// 0 - 15 if the character is valid, -1 if the character is invalid. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static int ParseHexCharacter(char c) + { + if ('0' <= c && c <= '9') { return c - '0'; } + else if ('A' <= c && c <= 'F') { return c - 'A' + 10; } + else if ('a' <= c && c <= 'f') { return c - 'a' + 10; } + else { return -1; } + } + + /// + /// Gets the uppercase hex-encoded form of a byte. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static void WriteHexEncodedByte(byte b, out char firstHexChar, out char secondHexChar) + { + firstHexChar = IntToChar((uint)b >> 4); + secondHexChar = IntToChar((uint)b & 0xFU); + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs new file mode 100644 index 0000000000..b0559d7219 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -0,0 +1,229 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// A class which can perform HTML encoding given an allow list of characters which + /// can be represented unencoded. + /// + /// + /// Once constructed, instances of this class are thread-safe for multiple callers. + /// + public unsafe sealed class HtmlEncoder : IHtmlEncoder + { + // The default HtmlEncoder (Basic Latin), instantiated on demand + private static HtmlEncoder _defaultEncoder; + + // A bitmap of characters which are allowed to be returned unescaped. + private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + + /// + /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// + public HtmlEncoder() + : this(CodePointFilters.BasicLatin) + { + } + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + public HtmlEncoder(params ICodePointFilter[] filters) + { + if (filters == null) + { + return; // no characters are allowed, just no-op immediately + } + + // Punch a hole for each allowed code point across all filters (this is an OR). + // We don't allow supplementary (astral) characters for now. + foreach (var filter in filters) + { + foreach (var codePoint in filter.GetAllowedCodePoints()) + { + if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) + { + AllowCharacter((char)codePoint); + } + } + } + + // Forbid characters that are special in HTML + ForbidCharacter('<'); + ForbidCharacter('>'); + ForbidCharacter('&'); + ForbidCharacter('\''); // can be used to escape attributes + ForbidCharacter('\"'); // can be used to escape attributes + ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks + + // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed + // (includes categories Cc, Cs, Co, Cn, Zl, Zp) + uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); + Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); + for (int i = 0; i < _allowedCharsBitmap.Length; i++) + { + _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; + } + } + + /// + /// A default instance of the HtmlEncoder, equivalent to allowing only + /// the 'Basic Latin' character range. + /// + public static HtmlEncoder Default + { + get + { + HtmlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); + if (defaultEncoder == null) + { + defaultEncoder = new HtmlEncoder(); + Volatile.Write(ref _defaultEncoder, defaultEncoder); + } + return defaultEncoder; + } + } + + // Marks a character as allowed (can be returned unencoded) + private void AllowCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] |= 0x1U << offset; + } + + // Marks a character as forbidden (must be returned encoded) + private void ForbidCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] &= ~(0x1U << offset); + } + + /// + /// Everybody's favorite HtmlEncode routine. + /// + public string HtmlEncode(string value) + { + if (String.IsNullOrEmpty(value)) + { + return value; + } + + // Quick check: does the string need to be encoded at all? + // If not, just return the input string as-is. + for (int i = 0; i < value.Length; i++) + { + if (!IsCharacterAllowed(value[i])) + { + return HtmlEncodeImpl(value, i); + } + } + return value; + } + + private string HtmlEncodeImpl(string input, int idxOfFirstCharWhichRequiresEncoding) + { + Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); + Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); + + // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" + // We don't need to worry about astral code points since they consume *two* input chars to + // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. + int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; + int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); + Debug.Assert(sbCapacity >= input.Length); + + // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, + // then begin encoding from the last (potentially requiring encoding) part of the input string. + StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); + fixed (char* pInput = input) + { + return HtmlEncodeImpl2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + } + } + + private string HtmlEncodeImpl2(StringBuilder builder, char* input, uint charsRemaining) + { + while (charsRemaining != 0) + { + int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); + if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) + { + // Supplementary characters should always be encoded numerically. + WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); + + // We consume two UTF-16 characters for a single supplementary character. + input += 2; + charsRemaining -= 2; + } + else + { + // Otherwise, this was a BMP character. + input++; + charsRemaining--; + char c = (char)nextScalar; + if (IsCharacterAllowed(c)) + { + builder.Append(c); + } + else + { + if (c == '<') { builder.Append("<"); } + else if (c == '>') { builder.Append(">"); } + else if (c == '&') { builder.Append("&"); } + else if (c == '\"') { builder.Append("""); } + else { WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); } + } + } + } + + return builder.ToString(); + } + + // Determines whether the given character can be returned unencoded. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private bool IsCharacterAllowed(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + } + + // Writes a scalar value as "�" + private static void WriteScalarAsHtmlEncodedEntity(StringBuilder builder, uint value) + { + // We're building the characters up in reverse + char* chars = stackalloc char[8 /* "FFFFFFFF" */]; + int numCharsWritten = 0; + do + { + Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); + // Pop off the last nibble + chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); + value >>= 4; + } while (value != 0); + + // Finally, write out the HTML-encoded scalar value. + builder.Append('&'); + builder.Append('#'); + builder.Append('x'); + Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); + do + { + builder.Append(chars[--numCharsWritten]); + } while (numCharsWritten != 0); + builder.Append(';'); + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs new file mode 100644 index 0000000000..e57b6535d2 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Represents a filter which allows only certain Unicode code points through. + /// + public interface ICodePointFilter + { + /// + /// Gets an enumeration of all allowed code points. + /// + IEnumerable GetAllowedCodePoints(); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs new file mode 100644 index 0000000000..e80fb908a7 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Provides services for HTML-encoding input. + /// + public interface IHtmlEncoder + { + /// + /// HTML-encodes a given input string. + /// + /// + /// The HTML-encoded value, or null if the input string was null. + /// + /// + /// The return value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + string HtmlEncode(string value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs new file mode 100644 index 0000000000..8a287548cf --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Provides services for JavaScript-escaping strings. + /// + public interface IJavaScriptStringEncoder + { + /// + /// JavaScript-escapes a given input string. + /// + /// + /// The JavaScript-escaped value, or null if the input string was null. + /// + string JavaScriptStringEncode(string value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs new file mode 100644 index 0000000000..0806f5f971 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Provides services for URL-escaping strings. + /// + public interface IUrlEncoder + { + /// + /// URL-escapes a given input string. + /// + /// + /// The URL-escaped value, or null if the input string was null. + /// + /// + /// The return value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + string UrlEncode(string value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs new file mode 100644 index 0000000000..671d2081b3 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs @@ -0,0 +1,163 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Text; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// A class which can perform JavaScript string escaping given an allow list of characters which + /// can be represented unescaped. + /// + /// + /// Once constructed, instances of this class are thread-safe for multiple callers. + /// + public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder + { + // The default JavaScript string encoder (Basic Latin), instantiated on demand + private static JavaScriptStringEncoder _defaultEncoder; + + // The inner encoder, responsible for the actual encoding routines + private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder; + + /// + /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// + public JavaScriptStringEncoder() + : this(JavaScriptStringUnicodeEncoder.BasicLatin) + { + } + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + public JavaScriptStringEncoder(params ICodePointFilter[] filters) + : this(new JavaScriptStringUnicodeEncoder(filters)) + { + } + + private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder) + { + Debug.Assert(innerEncoder != null); + _innerUnicodeEncoder = innerEncoder; + } + + /// + /// A default instance of the JavaScriptStringEncoder, equivalent to allowing only + /// the 'Basic Latin' character range. + /// + public static JavaScriptStringEncoder Default + { + get + { + JavaScriptStringEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); + if (defaultEncoder == null) + { + defaultEncoder = new JavaScriptStringEncoder(); + Volatile.Write(ref _defaultEncoder, defaultEncoder); + } + return defaultEncoder; + } + } + + /// + /// Everybody's favorite JavaScriptStringEncode routine. + /// + public string JavaScriptStringEncode(string value) + { + return _innerUnicodeEncoder.Encode(value); + } + + private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase + { + // A singleton instance of the basic latin encoder. + private static JavaScriptStringUnicodeEncoder _basicLatinSingleton; + + // The worst case encoding is 6 output chars per input char: [input] U+FFFF -> [output] "\uFFFF" + // We don't need to worry about astral code points since they're represented as encoded + // surrogate pairs in the output. + private const int MaxOutputCharsPerInputChar = 6; + + internal JavaScriptStringUnicodeEncoder(ICodePointFilter[] filters) + : base(filters, MaxOutputCharsPerInputChar) + { + // The only interesting characters above and beyond what the base encoder + // already covers are the solidus and reverse solidus. + ForbidCharacter('\\'); + ForbidCharacter('/'); + } + + internal static JavaScriptStringUnicodeEncoder BasicLatin + { + get + { + JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); + if (encoder == null) + { + encoder = new JavaScriptStringUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + Volatile.Write(ref _basicLatinSingleton, encoder); + } + return encoder; + } + } + + // Writes a scalar value as a JavaScript-escaped character (or sequence of characters). + // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 + // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 + // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf + protected override void WriteEncodedScalar(StringBuilder builder, uint value) + { + // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. + // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". + // (In ECMA-262 this character is a NonEscape character.) + // HTML-specific characters (including apostrophe and quotes) will + // be written out as numeric entities for defense-in-depth. + // See UnicodeEncoderBase ctor comments for more info. + + if (value == (uint)'\b') { builder.Append(@"\b"); } + else if (value == (uint)'\t') { builder.Append(@"\t"); } + else if (value == (uint)'\n') { builder.Append(@"\n"); } + else if (value == (uint)'\f') { builder.Append(@"\f"); } + else if (value == (uint)'\r') { builder.Append(@"\r"); } + else if (value == (uint)'/') { builder.Append(@"\/"); } + else if (value == (uint)'\\') { builder.Append(@"\\"); } + else { WriteEncodedScalarAsNumericEntity(builder, value); } + } + + // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). + private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) + { + if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) + { + // Convert this back to UTF-16 and write out both characters. + char leadingSurrogate, trailingSurrogate; + UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); + WriteEncodedSingleCharacter(builder, leadingSurrogate); + WriteEncodedSingleCharacter(builder, trailingSurrogate); + } + else + { + // This is only a single character. + WriteEncodedSingleCharacter(builder, value); + } + } + + // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. + private static void WriteEncodedSingleCharacter(StringBuilder builder, uint value) + { + Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); + + // Encode this as 6 chars "\uFFFF". + builder.Append('\\'); + builder.Append('u'); + builder.Append(HexUtil.IntToChar(value >> 12)); + builder.Append(HexUtil.IntToChar((value >> 8) & 0xFU)); + builder.Append(HexUtil.IntToChar((value >> 4) & 0xFU)); + builder.Append(HexUtil.IntToChar(value & 0xFU)); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs new file mode 100644 index 0000000000..2f04910b30 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -0,0 +1,171 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Text; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + internal unsafe abstract class UnicodeEncoderBase + { + // A bitmap of characters which are allowed to be returned unescaped. + private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + + // The worst-case number of output chars generated for any input char. + private readonly int _maxOutputCharsPerInputChar; + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + protected UnicodeEncoderBase(ICodePointFilter[] filters, int maxOutputCharsPerInputChar) + { + _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar; + + if (filters != null) + { + // Punch a hole for each allowed code point across all filters (this is an OR). + // We don't allow supplementary (astral) characters for now. + foreach (var filter in filters) + { + foreach (var codePoint in filter.GetAllowedCodePoints()) + { + if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) + { + AllowCharacter((char)codePoint); + } + } + } + } + + // Forbid characters that are special in HTML. + // Even though this is a common encoder used by everybody (including URL + // and JavaScript strings), it's unfortunately common for developers to + // forget to HTML-encode a string once it has been URL-encoded or + // JavaScript string-escaped, so this offers extra protection. + ForbidCharacter('<'); + ForbidCharacter('>'); + ForbidCharacter('&'); + ForbidCharacter('\''); // can be used to escape attributes + ForbidCharacter('\"'); // can be used to escape attributes + ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks + + // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed + // (includes categories Cc, Cs, Co, Cn, Zl, Zp) + uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); + Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); + for (int i = 0; i < _allowedCharsBitmap.Length; i++) + { + _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; + } + } + + // Marks a character as allowed (can be returned unencoded) + private void AllowCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] |= 0x1U << offset; + } + + // Marks a character as forbidden (must be returned encoded) + protected void ForbidCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] &= ~(0x1U << offset); + } + + /// + /// Entry point to the encoder. + /// + public string Encode(string value) + { + if (String.IsNullOrEmpty(value)) + { + return value; + } + + // Quick check: does the string need to be encoded at all? + // If not, just return the input string as-is. + for (int i = 0; i < value.Length; i++) + { + if (!IsCharacterAllowed(value[i])) + { + return EncodeCore(value, i); + } + } + return value; + } + + private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding) + { + Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); + Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); + + // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" + // We don't need to worry about astral code points since they consume *two* input chars to + // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. + int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; + int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); + Debug.Assert(sbCapacity >= input.Length); + + // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, + // then begin encoding from the last (potentially requiring encoding) part of the input string. + StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); + fixed (char* pInput = input) + { + return EncodeCore2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + } + } + + private string EncodeCore2(StringBuilder builder, char* input, uint charsRemaining) + { + while (charsRemaining != 0) + { + int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); + if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) + { + // Supplementary characters should always be encoded numerically. + WriteEncodedScalar(builder, (uint)nextScalar); + + // We consume two UTF-16 characters for a single supplementary character. + input += 2; + charsRemaining -= 2; + } + else + { + // Otherwise, this was a BMP character. + input++; + charsRemaining--; + char c = (char)nextScalar; + if (IsCharacterAllowed(c)) + { + builder.Append(c); + } + else + { + WriteEncodedScalar(builder, (uint)nextScalar); + } + } + } + + return builder.ToString(); + } + + // Determines whether the given character can be returned unencoded. + [MethodImpl(MethodImplOptions.AggressiveInlining)] + private bool IsCharacterAllowed(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + } + + protected abstract void WriteEncodedScalar(StringBuilder builder, uint value); + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs new file mode 100644 index 0000000000..89424a2612 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs @@ -0,0 +1,228 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains helpers for dealing with Unicode code points. + /// + internal unsafe static class UnicodeHelpers + { + /// + /// Used for invalid Unicode sequences or other unrepresentable values. + /// + private const char UNICODE_REPLACEMENT_CHAR = '\uFFFD'; + + /// + /// The last code point defined by the Unicode specification. + /// + internal const int UNICODE_LAST_CODEPOINT = 0x10FFFF; + + private static uint[] _definedCharacterBitmap; + + /// + /// Helper method which creates a bitmap of all characters which are + /// defined per version 7.0.0 of the Unicode specification. + /// + [MethodImpl(MethodImplOptions.NoInlining)] + private static uint[] CreateDefinedCharacterBitmap() + { + // The stream should be exactly 8KB in size. + var stream = typeof(UnicodeHelpers).GetTypeInfo().Assembly.GetManifestResourceStream("compiler/resources/unicode-7.0.0-defined-characters.bin"); + if (stream.Length != 8 * 1024) + { + Environment.FailFast("Corrupt data detected."); + } + + // Read everything in as raw bytes. + byte[] rawData = new byte[8 * 1024]; + for (int numBytesReadTotal = 0; numBytesReadTotal < rawData.Length;) + { + int numBytesReadThisIteration = stream.Read(rawData, numBytesReadTotal, rawData.Length - numBytesReadTotal); + if (numBytesReadThisIteration == 0) + { + Environment.FailFast("Corrupt data detected."); + } + numBytesReadTotal += numBytesReadThisIteration; + } + + // Finally, convert the byte[] to a uint[]. + // The incoming bytes are little-endian. + uint[] retVal = new uint[2 * 1024]; + for (int i = 0; i < retVal.Length; i++) + { + retVal[i] = (((uint)rawData[4 * i + 3]) << 24) + | (((uint)rawData[4 * i + 2]) << 16) + | (((uint)rawData[4 * i + 1]) << 8) + | (uint)rawData[4 * i]; + } + + // And we're done! + Volatile.Write(ref _definedCharacterBitmap, retVal); + return retVal; + } + + /// + /// Returns a bitmap of all characters which are defined per version 7.0.0 + /// of the Unicode specification. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static uint[] GetDefinedCharacterBitmap() + { + return Volatile.Read(ref _definedCharacterBitmap) ?? CreateDefinedCharacterBitmap(); + } + + /// + /// Given a UTF-16 character stream, reads the next scalar value from the stream. + /// Set 'endOfString' to true if 'pChar' points to the last character in the stream. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static int GetScalarValueFromUtf16(char* pChar, bool endOfString) + { + // This method is marked as AggressiveInlining to handle the common case of a non-surrogate + // character. The surrogate case is handled in the slower fallback code path. + char thisChar = *pChar; + return (Char.IsSurrogate(thisChar)) ? GetScalarValueFromUtf16Slow(pChar, endOfString) : thisChar; + } + + private static int GetScalarValueFromUtf16Slow(char* pChar, bool endOfString) + { + char firstChar = pChar[0]; + + if (!Char.IsSurrogate(firstChar)) + { + Debug.Fail("This case should've been handled by the fast path."); + return firstChar; + } + else if (Char.IsHighSurrogate(firstChar)) + { + if (endOfString) + { + // unmatched surrogate - substitute + return UNICODE_REPLACEMENT_CHAR; + } + else + { + char secondChar = pChar[1]; + if (Char.IsLowSurrogate(secondChar)) + { + // valid surrogate pair - extract codepoint + return GetScalarValueFromUtf16SurrogatePair(firstChar, secondChar); + } + else + { + // unmatched surrogate - substitute + return UNICODE_REPLACEMENT_CHAR; + } + } + } + else + { + // unmatched surrogate - substitute + Debug.Assert(Char.IsLowSurrogate(firstChar)); + return UNICODE_REPLACEMENT_CHAR; + } + } + + private static int GetScalarValueFromUtf16SurrogatePair(char highSurrogate, char lowSurrogate) + { + Debug.Assert(Char.IsHighSurrogate(highSurrogate)); + Debug.Assert(Char.IsLowSurrogate(lowSurrogate)); + + // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the + // details of this conversion. We don't use Char.ConvertToUtf32 because its exception + // handling shows up on the hot path, and our caller has already sanitized the inputs. + return (lowSurrogate & 0x3ff) | (((highSurrogate & 0x3ff) + (1 << 6)) << 10); + } + + internal static void GetUtf16SurrogatePairFromAstralScalarValue(int scalar, out char highSurrogate, out char lowSurrogate) + { + Debug.Assert(0x10000 <= scalar && scalar <= UNICODE_LAST_CODEPOINT); + + // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the + // details of this conversion. We don't use Char.ConvertFromUtf32 because its exception + // handling shows up on the hot path, it allocates temporary strings (which we don't want), + // and our caller has already sanitized the inputs. + + int x = scalar & 0xFFFF; + int u = scalar >> 16; + int w = u - 1; + highSurrogate = (char)(0xD800 | (w << 6) | (x >> 10)); + lowSurrogate = (char)(0xDC00 | (x & 0x3FF)); + } + + /// + /// Given a Unicode scalar value, returns the UTF-8 representation of the value. + /// The return value's bytes should be popped from the LSB. + /// + internal static int GetUtf8RepresentationForScalarValue(uint scalar) + { + Debug.Assert(scalar <= UNICODE_LAST_CODEPOINT); + + // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.6 for the + // details of this conversion. We don't use UTF8Encoding since we're encoding + // a scalar code point, not a UTF16 character sequence. + if (scalar <= 0x7f) + { + // one byte used: scalar 00000000 0xxxxxxx -> byte sequence 0xxxxxxx + byte firstByte = (byte)scalar; + return firstByte; + } + else if (scalar <= 0x7ff) + { + // two bytes used: scalar 00000yyy yyxxxxxx -> byte sequence 110yyyyy 10xxxxxx + byte firstByte = (byte)(0xc0 | (scalar >> 6)); + byte secondByteByte = (byte)(0x80 | (scalar & 0x3f)); + return ((secondByteByte << 8) | firstByte); + } + else if (scalar <= 0xffff) + { + // three bytes used: scalar zzzzyyyy yyxxxxxx -> byte sequence 1110zzzz 10yyyyyy 10xxxxxx + byte firstByte = (byte)(0xe0 | (scalar >> 12)); + byte secondByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); + byte thirdByte = (byte)(0x80 | (scalar & 0x3f)); + return ((((thirdByte << 8) | secondByte) << 8) | firstByte); + } + else + { + // four bytes used: scalar 000uuuuu zzzzyyyy yyxxxxxx -> byte sequence 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx + byte firstByte = (byte)(0xf0 | (scalar >> 18)); + byte secondByte = (byte)(0x80 | ((scalar >> 12) & 0x3f)); + byte thirdByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); + byte fourthByte = (byte)(0x80 | (scalar & 0x3f)); + return ((((((fourthByte << 8) | thirdByte) << 8) | secondByte) << 8) | firstByte); + } + } + + /// + /// Returns a value stating whether a character is defined per version 7.0.0 + /// of the Unicode specification. Certain classes of characters (control chars, + /// private use, surrogates, some whitespace) are considered "undefined" for + /// our purposes. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static bool IsCharacterDefined(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((GetDefinedCharacterBitmap()[index] >> offset) & 0x1U) != 0; + } + + /// + /// Determines whether the given scalar value is in the supplementary plane and thus + /// requires 2 characters to be represented in UTF-16 (as a surrogate pair). + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + internal static bool IsSupplementaryCodePoint(int scalar) + { + return ((scalar & ~((int)Char.MaxValue)) != 0); + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs new file mode 100644 index 0000000000..81706559ff --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs @@ -0,0 +1,161 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Text; +using System.Threading; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// A class which can perform URL string escaping given an allow list of characters which + /// can be represented unescaped. + /// + /// + /// Once constructed, instances of this class are thread-safe for multiple callers. + /// + public sealed class UrlEncoder : IUrlEncoder + { + // The default URL string encoder (Basic Latin), instantiated on demand + private static UrlEncoder _defaultEncoder; + + // The inner encoder, responsible for the actual encoding routines + private readonly UrlUnicodeEncoder _innerUnicodeEncoder; + + /// + /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// + public UrlEncoder() + : this(UrlUnicodeEncoder.BasicLatin) + { + } + + /// + /// Instantiates an encoder using a custom allow list of characters. + /// + public UrlEncoder(params ICodePointFilter[] filters) + : this(new UrlUnicodeEncoder(filters)) + { + } + + private UrlEncoder(UrlUnicodeEncoder innerEncoder) + { + Debug.Assert(innerEncoder != null); + _innerUnicodeEncoder = innerEncoder; + } + + /// + /// A default instance of the UrlEncoder, equivalent to allowing only + /// the 'Basic Latin' character range. + /// + public static UrlEncoder Default + { + get + { + UrlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); + if (defaultEncoder == null) + { + defaultEncoder = new UrlEncoder(); + Volatile.Write(ref _defaultEncoder, defaultEncoder); + } + return defaultEncoder; + } + } + + /// + /// Everybody's favorite UrlEncode routine. + /// + public string UrlEncode(string value) + { + return _innerUnicodeEncoder.Encode(value); + } + + private sealed class UrlUnicodeEncoder : UnicodeEncoderBase + { + // A singleton instance of the basic latin encoder. + private static UrlUnicodeEncoder _basicLatinSingleton; + + // We perform UTF8 conversion of input, which means that the worst case is + // 9 output chars per input char: [input] U+FFFF -> [output] "%XX%YY%ZZ". + // We don't need to worry about astral code points since they consume 2 input + // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char. + private const int MaxOutputCharsPerInputChar = 9; + + internal UrlUnicodeEncoder(ICodePointFilter[] filters) + : base(filters, MaxOutputCharsPerInputChar) + { + // Per RFC 3987, Sec. 2.2, we want encodings that are safe for + // 'isegment', 'iquery', and 'ifragment'. The only thing these + // all have in common is 'ipchar', which is defined as such: + // + // ipchar = iunreserved / pct-encoded / sub-delims / ":" + // / "@" + // + // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar + // + // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF + // / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD + // / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD + // / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD + // / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD + // / %xD0000-DFFFD / %xE1000-EFFFD + // + // pct-encoded = "%" HEXDIG HEXDIG + // + // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + // / "*" / "+" / "," / ";" / "=" + // + // From this list, the base encoder blocks "&", "'", "+", + // and we'll additionally block "=" since it has special meaning + // in x-www-form-urlencoded representations. + // + // This means that the full list of allowed characters from the + // Basic Latin set is: + // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / ":" / "@" + + const string forbiddenChars = @" #%/=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder + foreach (char c in forbiddenChars) + { + ForbidCharacter(c); + } + + // Specials (U+FFF0 .. U+FFFF) are forbidden by the definition of 'ucschar' above + for (int i = 0; i < 16; i++) + { + ForbidCharacter((char)(0xFFF0 | i)); + } + + // Supplementary characters are forbidden anyway by the base encoder + } + + internal static UrlUnicodeEncoder BasicLatin + { + get + { + UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); + if (encoder == null) + { + encoder = new UrlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + Volatile.Write(ref _basicLatinSingleton, encoder); + } + return encoder; + } + } + + // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. + protected override void WriteEncodedScalar(StringBuilder builder, uint value) + { + uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); + do + { + char highNibble, lowNibble; + HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); + builder.Append('%'); + builder.Append(highNibble); + builder.Append(lowNibble); + } while ((asUtf8 >>= 8) != 0); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin new file mode 100644 index 0000000000000000000000000000000000000000..61406a9b82543917f6fa3e032461f6222f8902ba GIT binary patch literal 8192 zcmeHMy>1gh5MFZ~@6^8!2o1s)?I`3-2@Qy|{JmLlZR1rih> zT_j7SN$emO7{&JR&CLC55<(m)5sKJ3-R#Wl%--y`Kf1eh&N;4$poV%~b2ZZ9=nM1l zrQ2E|f>y%$yK-j9aw8L-<36AIMb&=jl9YYiP^)J``BeHYgod>|3PTEc+WW=4{5b2q z?0gt8r<1PeFFtj*Z#^5ZcauJPw>+HncN%WQiJPeZ;jFhk5Px?tY<|8!Mo_2s1;G5y)^SxC_$pE0wD% zv!I~{=kg4~ojT6%)_5>`WRf7wARi2Xkj)ARUUcG=(;s5@(iSMio$yd)W(=zmf%mjc z%qPKK$g034#`>>OT!;Z@5KoIP70B2_(xObZ=@<_ zlu*ty>1_tlTjq^Ae{m4HAR}{Hn=8@+mdwVrqi(FDOcgKLk9nEsP>WJ56;k;GOJ%Kc zwH7;#4xAko6uR1ur5GO9cFg&62}A6PSqUF~korNDQ_P089 zZj=)~mJxx7z?ukbRqHygpEV(iZV`cqKtv!S5D|z7Lc6q|?4AL``Ykpj8J|YkixS zF0n52Cmi)9liYj{yG`rsi7FhU$?M@IsD8sO4(k+8JxogMNa-h2nxAg57o6OLb+lM4 IHi_Kh-^J+0%>V!Z literal 0 HcmV?d00001 diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index e4e0e0cb08..57c6db035f 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,6 +1,9 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods such as URL encoding.", + "compilationOptions": { + "allowUnsafe": true + }, "dependencies": { }, "frameworks": { @@ -11,8 +14,11 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*" + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Threading": "4.0.10-beta-*" } } } From fc7ed3a9cd570d6829991f2e812dbe2bd4f64471 Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 11 Feb 2015 11:37:07 -0800 Subject: [PATCH 0405/1838] Add TLS token binding feature --- .../ITlsTokenBindingFeature.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs new file mode 100644 index 0000000000..d9aaf0fcd5 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Http.Interfaces +{ + /// + /// Provides information regarding TLS token binding parameters. + /// + /// + /// TLS token bindings help mitigate the risk of impersonation by an attacker in the + /// event an authenticated client's bearer tokens are somehow exfiltrated from the + /// client's machine. See https://datatracker.ietf.org/doc/draft-popov-token-binding/ + /// for more information. + /// + [AssemblyNeutral] + public interface ITlsTokenBindingFeature + { + /// + /// Gets the 'provided' token binding identifier associated with the request. + /// + /// The token binding identifier, or null if the client did not + /// supply a 'provided' token binding or valid proof of possession of the + /// associated private key. The caller should treat this identifier as an + /// opaque blob and should not try to parse it. + byte[] GetProvidedTokenBindingId(); + + /// + /// Gets the 'referred' token binding identifier associated with the request. + /// + /// The token binding identifier, or null if the client did not + /// supply a 'referred' token binding or valid proof of possession of the + /// associated private key. The caller should treat this identifier as an + /// opaque blob and should not try to parse it. + byte[] GetReferredTokenBindingId(); + } +} From 14c872d981bde92d64ad05b328fe9205ae1ed967 Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 11 Feb 2015 12:03:47 -0800 Subject: [PATCH 0406/1838] Update HtmlEncoder to wrap UnicodeEncoderBase --- .../Encoders/HtmlEncoder.cs | 201 +++++------------- 1 file changed, 56 insertions(+), 145 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs index b0559d7219..0f205b3e43 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -3,7 +3,6 @@ using System; using System.Diagnostics; -using System.Runtime.CompilerServices; using System.Text; using System.Threading; @@ -21,14 +20,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // The default HtmlEncoder (Basic Latin), instantiated on demand private static HtmlEncoder _defaultEncoder; - // A bitmap of characters which are allowed to be returned unescaped. - private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + // The inner encoder, responsible for the actual encoding routines + private readonly HtmlUnicodeEncoder _innerUnicodeEncoder; /// /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. /// public HtmlEncoder() - : this(CodePointFilters.BasicLatin) + : this(HtmlUnicodeEncoder.BasicLatin) { } @@ -36,41 +35,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// Instantiates an encoder using a custom allow list of characters. /// public HtmlEncoder(params ICodePointFilter[] filters) + : this(new HtmlUnicodeEncoder(filters)) { - if (filters == null) - { - return; // no characters are allowed, just no-op immediately - } + } - // Punch a hole for each allowed code point across all filters (this is an OR). - // We don't allow supplementary (astral) characters for now. - foreach (var filter in filters) - { - foreach (var codePoint in filter.GetAllowedCodePoints()) - { - if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) - { - AllowCharacter((char)codePoint); - } - } - } - - // Forbid characters that are special in HTML - ForbidCharacter('<'); - ForbidCharacter('>'); - ForbidCharacter('&'); - ForbidCharacter('\''); // can be used to escape attributes - ForbidCharacter('\"'); // can be used to escape attributes - ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks - - // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zl, Zp) - uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); - Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); - for (int i = 0; i < _allowedCharsBitmap.Length; i++) - { - _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; - } + private HtmlEncoder(HtmlUnicodeEncoder innerEncoder) + { + Debug.Assert(innerEncoder != null); + _innerUnicodeEncoder = innerEncoder; } /// @@ -91,139 +63,78 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } - // Marks a character as allowed (can be returned unencoded) - private void AllowCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] |= 0x1U << offset; - } - - // Marks a character as forbidden (must be returned encoded) - private void ForbidCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] &= ~(0x1U << offset); - } - /// /// Everybody's favorite HtmlEncode routine. /// public string HtmlEncode(string value) { - if (String.IsNullOrEmpty(value)) - { - return value; - } - - // Quick check: does the string need to be encoded at all? - // If not, just return the input string as-is. - for (int i = 0; i < value.Length; i++) - { - if (!IsCharacterAllowed(value[i])) - { - return HtmlEncodeImpl(value, i); - } - } - return value; + return _innerUnicodeEncoder.Encode(value); } - private string HtmlEncodeImpl(string input, int idxOfFirstCharWhichRequiresEncoding) + private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase { - Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); - Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); + // A singleton instance of the basic latin encoder. + private static HtmlUnicodeEncoder _basicLatinSingleton; // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" // We don't need to worry about astral code points since they consume *two* input chars to - // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. - int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; - int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); - Debug.Assert(sbCapacity >= input.Length); + // generate at most 10 output chars ("􏿿"), which equates to 5 output chars per input char. + private const int MaxOutputCharsPerInputChar = 8; - // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, - // then begin encoding from the last (potentially requiring encoding) part of the input string. - StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); - fixed (char* pInput = input) + internal HtmlUnicodeEncoder(ICodePointFilter[] filters) + : base(filters, MaxOutputCharsPerInputChar) { - return HtmlEncodeImpl2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); } - } - private string HtmlEncodeImpl2(StringBuilder builder, char* input, uint charsRemaining) - { - while (charsRemaining != 0) + internal static HtmlUnicodeEncoder BasicLatin { - int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); - if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) + get { - // Supplementary characters should always be encoded numerically. - WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); - - // We consume two UTF-16 characters for a single supplementary character. - input += 2; - charsRemaining -= 2; - } - else - { - // Otherwise, this was a BMP character. - input++; - charsRemaining--; - char c = (char)nextScalar; - if (IsCharacterAllowed(c)) + HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); + if (encoder == null) { - builder.Append(c); - } - else - { - if (c == '<') { builder.Append("<"); } - else if (c == '>') { builder.Append(">"); } - else if (c == '&') { builder.Append("&"); } - else if (c == '\"') { builder.Append("""); } - else { WriteScalarAsHtmlEncodedEntity(builder, (uint)nextScalar); } + encoder = new HtmlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + Volatile.Write(ref _basicLatinSingleton, encoder); } + return encoder; } } - return builder.ToString(); - } - - // Determines whether the given character can be returned unencoded. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private bool IsCharacterAllowed(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; - } - - // Writes a scalar value as "�" - private static void WriteScalarAsHtmlEncodedEntity(StringBuilder builder, uint value) - { - // We're building the characters up in reverse - char* chars = stackalloc char[8 /* "FFFFFFFF" */]; - int numCharsWritten = 0; - do + // Writes a scalar value as an HTML-encoded entity. + protected override void WriteEncodedScalar(StringBuilder builder, uint value) { - Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); - // Pop off the last nibble - chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); - value >>= 4; - } while (value != 0); + if (value == (uint)'\"') { builder.Append("""); } + else if (value == (uint)'&') { builder.Append("&"); } + else if (value == (uint)'<') { builder.Append("<"); } + else if (value == (uint)'>') { builder.Append(">"); } + else { WriteEncodedScalarAsNumericEntity(builder, value); } + } - // Finally, write out the HTML-encoded scalar value. - builder.Append('&'); - builder.Append('#'); - builder.Append('x'); - Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); - do + // Writes a scalar value as an HTML-encoded numeric entity. + private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) { - builder.Append(chars[--numCharsWritten]); - } while (numCharsWritten != 0); - builder.Append(';'); + // We're building the characters up in reverse + char* chars = stackalloc char[8 /* "FFFFFFFF" */]; + int numCharsWritten = 0; + do + { + Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); + // Pop off the last nibble + chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); + value >>= 4; + } while (value != 0); + + // Finally, write out the HTML-encoded scalar value. + builder.Append('&'); + builder.Append('#'); + builder.Append('x'); + Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); + do + { + builder.Append(chars[--numCharsWritten]); + } while (numCharsWritten != 0); + builder.Append(';'); + } } } } From e5c6fd401fac99d93d4c4d1c9b93eaab70740baf Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 11 Feb 2015 17:39:39 -0800 Subject: [PATCH 0407/1838] Add TextWriter-based overloads to the encoding routines These make the core implementations slightly slower but provide the benefit of reducing allocations, which is useful when these methods are called frequently by Razor. --- .../Encoders/EncoderExtensions.cs | 55 ++++++ .../Encoders/HtmlEncoder.cs | 42 +++-- .../Encoders/IHtmlEncoder.cs | 24 ++- .../Encoders/IJavaScriptStringEncoder.cs | 13 ++ .../Encoders/IUrlEncoder.cs | 20 +++ .../Encoders/JavaScriptStringEncoder.cs | 58 ++++--- .../Encoders/UnicodeEncoderBase.cs | 164 ++++++++++++++++-- .../Encoders/UrlEncoder.cs | 26 ++- 8 files changed, 350 insertions(+), 52 deletions(-) create mode 100644 src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs new file mode 100644 index 0000000000..57c3b59ba7 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Helpful extension methods for the encoder classes. + /// + public static class EncoderExtensions + { + /// + /// HTML-encodes a string and writes the result to the supplied output. + /// + /// + /// The encoded value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + public static void HtmlEncode([NotNull] this IHtmlEncoder htmlEncoder, string value, [NotNull] TextWriter output) + { + if (!String.IsNullOrEmpty(value)) + { + htmlEncoder.HtmlEncode(value, 0, value.Length, output); + } + } + + /// + /// JavaScript-escapes a string and writes the result to the supplied output. + /// + public static void JavaScriptStringEncode([NotNull] this IJavaScriptStringEncoder javaScriptStringEncoder, string value, [NotNull] TextWriter output) + { + if (!String.IsNullOrEmpty(value)) + { + javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output); + } + } + + /// + /// URL-encodes a string and writes the result to the supplied output. + /// + /// + /// The encoded value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + public static void UrlEncode([NotNull] this IUrlEncoder urlEncoder, string value, [NotNull] TextWriter output) + { + if (!String.IsNullOrEmpty(value)) + { + urlEncoder.UrlEncode(value, 0, value.Length, output); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs index 0f205b3e43..30a3da320e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -3,7 +3,7 @@ using System; using System.Diagnostics; -using System.Text; +using System.IO; using System.Threading; namespace Microsoft.AspNet.WebUtilities.Encoders @@ -63,6 +63,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } + /// + /// Everybody's favorite HtmlEncode routine. + /// + public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + /// /// Everybody's favorite HtmlEncode routine. /// @@ -71,6 +79,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return _innerUnicodeEncoder.Encode(value); } + /// + /// Everybody's favorite HtmlEncode routine. + /// + public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase { // A singleton instance of the basic latin encoder. @@ -101,17 +117,17 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as an HTML-encoded entity. - protected override void WriteEncodedScalar(StringBuilder builder, uint value) + protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) { - if (value == (uint)'\"') { builder.Append("""); } - else if (value == (uint)'&') { builder.Append("&"); } - else if (value == (uint)'<') { builder.Append("<"); } - else if (value == (uint)'>') { builder.Append(">"); } - else { WriteEncodedScalarAsNumericEntity(builder, value); } + if (value == (uint)'\"') { writeString(output, """); } + else if (value == (uint)'&') { writeString(output, "&"); } + else if (value == (uint)'<') { writeString(output, "<"); } + else if (value == (uint)'>') { writeString(output, ">"); } + else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } } // Writes a scalar value as an HTML-encoded numeric entity. - private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) + private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class { // We're building the characters up in reverse char* chars = stackalloc char[8 /* "FFFFFFFF" */]; @@ -125,15 +141,15 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } while (value != 0); // Finally, write out the HTML-encoded scalar value. - builder.Append('&'); - builder.Append('#'); - builder.Append('x'); + writeChar(output, '&'); + writeChar(output, '#'); + writeChar(output, 'x'); Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); do { - builder.Append(chars[--numCharsWritten]); + writeChar(output, chars[--numCharsWritten]); } while (numCharsWritten != 0); - builder.Append(';'); + writeChar(output, ';'); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs index e80fb908a7..89947567ce 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs @@ -1,7 +1,9 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +using System; +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; namespace Microsoft.AspNet.WebUtilities.Encoders { @@ -10,6 +12,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// public interface IHtmlEncoder { + /// + /// HTML-encodes a character array and writes the result to the supplied + /// output. + /// + /// + /// The encoded value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + void HtmlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + /// /// HTML-encodes a given input string. /// @@ -21,5 +33,15 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// as long as the attribute value is surrounded by single or double quotes. /// string HtmlEncode(string value); + + /// + /// HTML-encodes a given input string and writes the result to the + /// supplied output. + /// + /// + /// The encoded value is also safe for inclusion inside an HTML attribute + /// as long as the attribute value is surrounded by single or double quotes. + /// + void HtmlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs index 8a287548cf..502c699ac4 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; namespace Microsoft.AspNet.WebUtilities.Encoders { @@ -10,6 +11,12 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// public interface IJavaScriptStringEncoder { + /// + /// JavaScript-escapes a character array and writes the result to the + /// supplied output. + /// + void JavaScriptStringEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + /// /// JavaScript-escapes a given input string. /// @@ -17,5 +24,11 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// The JavaScript-escaped value, or null if the input string was null. /// string JavaScriptStringEncode(string value); + + /// + /// JavaScript-escapes a given input string and writes the + /// result to the supplied output. + /// + void JavaScriptStringEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs index 0806f5f971..c04014570e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; namespace Microsoft.AspNet.WebUtilities.Encoders { @@ -10,6 +11,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// public interface IUrlEncoder { + /// + /// URL-escapes a character array and writes the result to the supplied + /// output. + /// + /// + /// The encoded value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + void UrlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + /// /// URL-escapes a given input string. /// @@ -21,5 +32,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// fragment portion of a URI. /// string UrlEncode(string value); + + /// + /// URL-escapes a string and writes the result to the supplied output. + /// + /// + /// The encoded value is safe for use in the segment, query, or + /// fragment portion of a URI. + /// + void UrlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs index 671d2081b3..460cae57cd 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs @@ -3,7 +3,7 @@ using System; using System.Diagnostics; -using System.Text; +using System.IO; using System.Threading; namespace Microsoft.AspNet.WebUtilities.Encoders @@ -63,6 +63,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } + /// + /// Everybody's favorite JavaScriptStringEncode routine. + /// + public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + /// /// Everybody's favorite JavaScriptStringEncode routine. /// @@ -71,6 +79,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return _innerUnicodeEncoder.Encode(value); } + /// + /// Everybody's favorite JavaScriptStringEncode routine. + /// + public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase { // A singleton instance of the basic latin encoder. @@ -108,7 +124,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf - protected override void WriteEncodedScalar(StringBuilder builder, uint value) + protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) { // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". @@ -117,46 +133,46 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // be written out as numeric entities for defense-in-depth. // See UnicodeEncoderBase ctor comments for more info. - if (value == (uint)'\b') { builder.Append(@"\b"); } - else if (value == (uint)'\t') { builder.Append(@"\t"); } - else if (value == (uint)'\n') { builder.Append(@"\n"); } - else if (value == (uint)'\f') { builder.Append(@"\f"); } - else if (value == (uint)'\r') { builder.Append(@"\r"); } - else if (value == (uint)'/') { builder.Append(@"\/"); } - else if (value == (uint)'\\') { builder.Append(@"\\"); } - else { WriteEncodedScalarAsNumericEntity(builder, value); } + if (value == (uint)'\b') { writeString(output, @"\b"); } + else if (value == (uint)'\t') { writeString(output, @"\t"); } + else if (value == (uint)'\n') { writeString(output, @"\n"); } + else if (value == (uint)'\f') { writeString(output, @"\f"); } + else if (value == (uint)'\r') { writeString(output, @"\r"); } + else if (value == (uint)'/') { writeString(output, @"\/"); } + else if (value == (uint)'\\') { writeString(output, @"\\"); } + else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } } // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). - private static void WriteEncodedScalarAsNumericEntity(StringBuilder builder, uint value) + private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class { if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) { // Convert this back to UTF-16 and write out both characters. char leadingSurrogate, trailingSurrogate; UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); - WriteEncodedSingleCharacter(builder, leadingSurrogate); - WriteEncodedSingleCharacter(builder, trailingSurrogate); + WriteEncodedSingleCharacter(output, writeChar, leadingSurrogate); + WriteEncodedSingleCharacter(output, writeChar, trailingSurrogate); } else { // This is only a single character. - WriteEncodedSingleCharacter(builder, value); + WriteEncodedSingleCharacter(output, writeChar, value); } } // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. - private static void WriteEncodedSingleCharacter(StringBuilder builder, uint value) + private static void WriteEncodedSingleCharacter(T output, Action writeChar, uint value) where T : class { Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); // Encode this as 6 chars "\uFFFF". - builder.Append('\\'); - builder.Append('u'); - builder.Append(HexUtil.IntToChar(value >> 12)); - builder.Append(HexUtil.IntToChar((value >> 8) & 0xFU)); - builder.Append(HexUtil.IntToChar((value >> 4) & 0xFU)); - builder.Append(HexUtil.IntToChar(value & 0xFU)); + writeChar(output, '\\'); + writeChar(output, 'u'); + writeChar(output, HexUtil.IntToChar(value >> 12)); + writeChar(output, HexUtil.IntToChar((value >> 8) & 0xFU)); + writeChar(output, HexUtil.IntToChar((value >> 4) & 0xFU)); + writeChar(output, HexUtil.IntToChar(value & 0xFU)); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs index 2f04910b30..d370fbe4f6 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.IO; using System.Runtime.CompilerServices; using System.Text; @@ -10,6 +11,12 @@ namespace Microsoft.AspNet.WebUtilities.Encoders { internal unsafe abstract class UnicodeEncoderBase { + // Stubs for appending data to a TextWriter or StringBuilder + private static readonly Action _appendCharToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); + private static readonly Action _appendCharToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); + private static readonly Action _appendStringToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); + private static readonly Action _appendStringToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); + // A bitmap of characters which are allowed to be returned unescaped. private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; @@ -70,6 +77,26 @@ namespace Microsoft.AspNet.WebUtilities.Encoders _allowedCharsBitmap[index] |= 0x1U << offset; } + private static void AppendToStringBuilder(StringBuilder builder, char value) + { + builder.Append(value); + } + + private static void AppendToStringBuilder(StringBuilder builder, string value) + { + builder.Append(value); + } + + private static void AppendToTextWriter(TextWriter writer, char value) + { + writer.Write(value); + } + + private static void AppendToTextWriter(TextWriter writer, string value) + { + writer.Write(value); + } + // Marks a character as forbidden (must be returned encoded) protected void ForbidCharacter(char c) { @@ -79,6 +106,37 @@ namespace Microsoft.AspNet.WebUtilities.Encoders _allowedCharsBitmap[index] &= ~(0x1U << offset); } + /// + /// Entry point to the encoder. + /// + public void Encode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output) + { + // Input checking + ValidateInputs(startIndex, charCount, actualInputLength: value.Length); + + if (charCount != 0) + { + fixed (char* pChars = value) + { + int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(&pChars[startIndex], charCount); + if (indexOfFirstCharWhichRequiresEncoding < 0) + { + // All chars are valid - just copy the buffer as-is. + output.Write(value, startIndex, charCount); + } + else + { + // Flush all chars which are known to be valid, then encode the remainder individually + if (indexOfFirstCharWhichRequiresEncoding > 0) + { + output.Write(value, startIndex, indexOfFirstCharWhichRequiresEncoding); + } + EncodeCore(&pChars[startIndex + indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); + } + } + } + } + /// /// Entry point to the encoder. /// @@ -95,22 +153,60 @@ namespace Microsoft.AspNet.WebUtilities.Encoders { if (!IsCharacterAllowed(value[i])) { - return EncodeCore(value, i); + return EncodeCore(value, idxOfFirstCharWhichRequiresEncoding: i); } } return value; } + /// + /// Entry point to the encoder. + /// + public void Encode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output) + { + // Input checking + ValidateInputs(startIndex, charCount, actualInputLength: value.Length); + + if (charCount != 0) + { + fixed (char* pChars = value) + { + if (charCount == value.Length) + { + // Optimize for the common case: we're being asked to encode the entire input string + // (not just a subset). If all characters are safe, we can just spit it out as-is. + int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(pChars, charCount); + if (indexOfFirstCharWhichRequiresEncoding < 0) + { + output.Write(value); + } + else + { + // Flush all chars which are known to be valid, then encode the remainder individually + for (int i = 0; i < indexOfFirstCharWhichRequiresEncoding; i++) + { + output.Write(pChars[i]); + } + EncodeCore(&pChars[indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); + } + } + else + { + // We're being asked to encode a subset, so we need to go through the slow path of appending + // each character individually. + EncodeCore(&pChars[startIndex], (uint)charCount, output); + } + } + } + } + private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding) { Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); - // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" - // We don't need to worry about astral code points since they consume *two* input chars to - // generate at most 10 output chars ("􏿿"), which equates to 5 output per input. int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; - int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, worstCaseOutputCharsPerInputChar: 8)); + int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, _maxOutputCharsPerInputChar)); Debug.Assert(sbCapacity >= input.Length); // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, @@ -118,11 +214,17 @@ namespace Microsoft.AspNet.WebUtilities.Encoders StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); fixed (char* pInput = input) { - return EncodeCore2(builder, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + EncodeCore(builder, _appendStringToStringBuilderStub, _appendCharToStringBuilderStub, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); } + return builder.ToString(); } - private string EncodeCore2(StringBuilder builder, char* input, uint charsRemaining) + private void EncodeCore(char* input, uint charsRemaining, TextWriter output) + { + EncodeCore(output, _appendStringToTextWriterStub, _appendCharToTextWriterStub, input, charsRemaining); + } + + private void EncodeCore(T output, Action writeString, Action writeChar, char* input, uint charsRemaining) where T : class { while (charsRemaining != 0) { @@ -130,7 +232,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) { // Supplementary characters should always be encoded numerically. - WriteEncodedScalar(builder, (uint)nextScalar); + WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); // We consume two UTF-16 characters for a single supplementary character. input += 2; @@ -144,16 +246,26 @@ namespace Microsoft.AspNet.WebUtilities.Encoders char c = (char)nextScalar; if (IsCharacterAllowed(c)) { - builder.Append(c); + writeChar(output, c); } else { - WriteEncodedScalar(builder, (uint)nextScalar); + WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); } } } + } - return builder.ToString(); + private int GetIndexOfFirstCharWhichRequiresEncoding(char* input, int inputLength) + { + for (int i = 0; i < inputLength; i++) + { + if (!IsCharacterAllowed(input[i])) + { + return i; + } + } + return -1; // no characters require encoding } // Determines whether the given character can be returned unencoded. @@ -166,6 +278,34 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; } - protected abstract void WriteEncodedScalar(StringBuilder builder, uint value); + private static T PrepareDelegate(T @del) where T : class + { +#if ASPNETCORE50 + // RuntimeHelpers.PrepareMethod doesn't exist on CoreCLR, so we'll depend + // on cross-gen for performance optimizations. + return del; +#else + // We prepare the method ahead of time to ensure that it's JITted before + // the delegate is constructed; this allows the delegate to point straight + // to the processor code rather than to the prestub dispatch code. + Delegate castDel = (Delegate)(object)del; + RuntimeHelpers.PrepareMethod(castDel.Method.MethodHandle); + return (T)(object)castDel.Method.CreateDelegate(typeof(T)); +#endif + } + + private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) + { + if (startIndex < 0 || startIndex > actualInputLength) + { + throw new ArgumentOutOfRangeException(nameof(startIndex)); + } + if (charCount < 0 || charCount > (actualInputLength - startIndex)) + { + throw new ArgumentOutOfRangeException(nameof(charCount)); + } + } + + protected abstract void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) where T : class; } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs index 81706559ff..2eda7cb52e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs @@ -3,7 +3,7 @@ using System; using System.Diagnostics; -using System.Text; +using System.IO; using System.Threading; namespace Microsoft.AspNet.WebUtilities.Encoders @@ -63,6 +63,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } + /// + /// Everybody's favorite UrlEncode routine. + /// + public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + /// /// Everybody's favorite UrlEncode routine. /// @@ -71,6 +79,14 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return _innerUnicodeEncoder.Encode(value); } + /// + /// Everybody's favorite UrlEncode routine. + /// + public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) + { + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); + } + private sealed class UrlUnicodeEncoder : UnicodeEncoderBase { // A singleton instance of the basic latin encoder. @@ -144,16 +160,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. - protected override void WriteEncodedScalar(StringBuilder builder, uint value) + protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) { uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); do { char highNibble, lowNibble; HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); - builder.Append('%'); - builder.Append(highNibble); - builder.Append(lowNibble); + writeChar(output, '%'); + writeChar(output, highNibble); + writeChar(output, lowNibble); } while ((asUtf8 >>= 8) != 0); } } From 26cd8d51b68578ede39366987a8230c075e93d3f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 12 Feb 2015 09:07:47 -0800 Subject: [PATCH 0408/1838] Removing ANIs --- src/Microsoft.AspNet.Http.Core/IFormFeature.cs | 2 -- .../AssemblyNeutralAttribute.cs | 13 ------------- .../IHttpApplicationFeature.cs | 2 -- .../IHttpBufferingFeature.cs | 3 --- .../IHttpClientCertificateFeature.cs | 2 -- .../IHttpConnectionFeature.cs | 2 -- .../IHttpRequestFeature.cs | 3 --- .../IHttpRequestLifetimeFeature.cs | 2 -- .../IHttpResponseFeature.cs | 2 -- .../IHttpSendFileFeature.cs | 2 -- .../IHttpUpgradeFeature.cs | 2 -- .../IHttpWebSocketFeature.cs | 2 -- src/Microsoft.AspNet.Http.Interfaces/ISession.cs | 2 -- .../ISessionFactory.cs | 4 ---- .../ISessionFeature.cs | 3 --- .../ITlsTokenBindingFeature.cs | 4 ---- .../IWebSocketAcceptContext.cs | 3 --- .../Security/IAuthTypeContext.cs | 2 -- .../Security/IAuthenticateContext.cs | 2 -- .../Security/IAuthenticationHandler.cs | 3 --- .../Security/IChallengeContext.cs | 2 -- .../Security/IHttpAuthenticationFeature.cs | 2 -- .../Security/ISignInContext.cs | 2 -- .../Security/ISignOutContext .cs | 2 -- src/Microsoft.AspNet.Http.Interfaces/project.json | 6 +----- src/Microsoft.AspNet.Http/IServerInformation.cs | 1 - 26 files changed, 1 insertion(+), 74 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs b/src/Microsoft.AspNet.Http.Core/IFormFeature.cs index 00f2645118..2447a8a3fe 100644 --- a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/IFormFeature.cs @@ -3,8 +3,6 @@ using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs b/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs deleted file mode 100644 index e1d35fbf25..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/AssemblyNeutralAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Framework.Runtime -{ - [AssemblyNeutralAttribute] - [AttributeUsage(AttributeTargets.All, Inherited = false, AllowMultiple = true)] - public sealed class AssemblyNeutralAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs index 2a885ecbbb..1548e74397 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpApplicationFeature { string AppName { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs index 83a6be21d0..d78b7e6e8c 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs @@ -1,11 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpBufferingFeature { void DisableRequestBuffering(); diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs index 556265c165..c49de2b9e2 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs @@ -4,11 +4,9 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpClientCertificateFeature { /// diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs index 51940f3709..dc1f8bd0ac 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpConnectionFeature { IPAddress RemoteIpAddress { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs index ca178a7dfa..9f2d3d3c06 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs @@ -1,14 +1,11 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpRequestFeature { string Protocol { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs index 498463dbc3..351e6eb5be 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpRequestLifetimeFeature { CancellationToken RequestAborted { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index b28700df9c..ecdbd93c2f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -4,11 +4,9 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpResponseFeature { int StatusCode { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs index dcb598e6ce..76e9b832e8 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs @@ -3,11 +3,9 @@ using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpSendFileFeature { Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation); diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs index 98d4e60cba..6441c8915a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs @@ -3,11 +3,9 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpUpgradeFeature { bool IsUpgradableRequest { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index d3aeaae642..8b79bde6d7 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -3,11 +3,9 @@ using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IHttpWebSocketFeature { bool IsWebSocketRequest { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs index d18fca3e99..90d4e15566 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs @@ -3,11 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface ISession { void Load(); diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs index e8917db76d..ff162b8491 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs @@ -1,12 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface ISessionFactory { bool IsAvailable { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs index 360e407c65..ffe6e91eac 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs @@ -1,12 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { // TODO: Is there any reason not to flatten the Factory down into the Feature? - [AssemblyNeutral] public interface ISessionFeature { ISessionFactory Factory { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs index d9aaf0fcd5..d5211d9464 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs @@ -1,9 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { /// @@ -15,7 +12,6 @@ namespace Microsoft.AspNet.Http.Interfaces /// client's machine. See https://datatracker.ietf.org/doc/draft-popov-token-binding/ /// for more information. /// - [AssemblyNeutral] public interface ITlsTokenBindingFeature { /// diff --git a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs index 80becb585a..1ae4306712 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs @@ -1,11 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Runtime; - namespace Microsoft.AspNet.Http.Interfaces { - [AssemblyNeutral] public interface IWebSocketAcceptContext { string SubProtocol { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs index d3308720c9..ef952847b0 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IAuthTypeContext { void Accept(IDictionary description); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 1e354a8149..3e09a1aa5e 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -3,11 +3,9 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IAuthenticateContext { IEnumerable AuthenticationTypes { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index ca68c40668..32ed5f2cf8 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -1,13 +1,10 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IAuthenticationHandler { void GetDescriptions(IAuthTypeContext context); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index 94d64b6257..cb44dc300b 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IChallengeContext { IEnumerable AuthenticationTypes {get;} diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index 74605995a9..183ebe9d2f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface IHttpAuthenticationFeature { ClaimsPrincipal User { get; set; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index eea09aa055..c6d1b4efc0 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -3,11 +3,9 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface ISignInContext { IEnumerable Identities { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs index fd4fe89b11..426c601e24 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Http.Interfaces.Security { - [AssemblyNeutral] public interface ISignOutContext { IEnumerable AuthenticationTypes { get; } diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index b2d2d6f3e0..3b6666ff83 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -6,14 +6,10 @@ "aspnetcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.IO": "4.0.10-beta-*", "System.Net.Primitives": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Security.Principal": "4.0.0-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs index f7f267996c..e99042e637 100644 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ b/src/Microsoft.AspNet.Http/IServerInformation.cs @@ -3,7 +3,6 @@ namespace Microsoft.AspNet.Builder { - // TODO: [AssemblyNeutral] public interface IServerInformation { string Name { get; } From 0dd3a494638a50de0fc302e234215ba60ac8857a Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 12 Feb 2015 11:13:44 -0800 Subject: [PATCH 0409/1838] Perf: Eliminate chatty virtual dispatches This gives a speedup of approx. 20% (for overloads which take TextWriter) to 40% (for overloads which don't take TextWriter) for inputs in which at least one character requires encoding. --- .../Encoders/HtmlEncoder.cs | 24 ++-- .../Encoders/JavaScriptStringEncoder.cs | 40 +++---- .../Encoders/UnicodeEncoderBase.cs | 107 ++++++++++-------- .../Encoders/UrlEncoder.cs | 8 +- 4 files changed, 94 insertions(+), 85 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs index 30a3da320e..14af7db2c6 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs @@ -117,17 +117,17 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as an HTML-encoded entity. - protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) + protected override void WriteEncodedScalar(ref Writer writer, uint value) { - if (value == (uint)'\"') { writeString(output, """); } - else if (value == (uint)'&') { writeString(output, "&"); } - else if (value == (uint)'<') { writeString(output, "<"); } - else if (value == (uint)'>') { writeString(output, ">"); } - else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } + if (value == (uint)'\"') { writer.Write("""); } + else if (value == (uint)'&') { writer.Write("&"); } + else if (value == (uint)'<') { writer.Write("<"); } + else if (value == (uint)'>') { writer.Write(">"); } + else { WriteEncodedScalarAsNumericEntity(ref writer, value); } } // Writes a scalar value as an HTML-encoded numeric entity. - private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class + private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) { // We're building the characters up in reverse char* chars = stackalloc char[8 /* "FFFFFFFF" */]; @@ -141,15 +141,15 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } while (value != 0); // Finally, write out the HTML-encoded scalar value. - writeChar(output, '&'); - writeChar(output, '#'); - writeChar(output, 'x'); + writer.Write('&'); + writer.Write('#'); + writer.Write('x'); Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); do { - writeChar(output, chars[--numCharsWritten]); + writer.Write(chars[--numCharsWritten]); } while (numCharsWritten != 0); - writeChar(output, ';'); + writer.Write(';'); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs index 460cae57cd..39d7cef34f 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf - protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) + protected override void WriteEncodedScalar(ref Writer writer, uint value) { // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". @@ -133,46 +133,46 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // be written out as numeric entities for defense-in-depth. // See UnicodeEncoderBase ctor comments for more info. - if (value == (uint)'\b') { writeString(output, @"\b"); } - else if (value == (uint)'\t') { writeString(output, @"\t"); } - else if (value == (uint)'\n') { writeString(output, @"\n"); } - else if (value == (uint)'\f') { writeString(output, @"\f"); } - else if (value == (uint)'\r') { writeString(output, @"\r"); } - else if (value == (uint)'/') { writeString(output, @"\/"); } - else if (value == (uint)'\\') { writeString(output, @"\\"); } - else { WriteEncodedScalarAsNumericEntity(output, writeChar, value); } + if (value == (uint)'\b') { writer.Write(@"\b"); } + else if (value == (uint)'\t') { writer.Write(@"\t"); } + else if (value == (uint)'\n') { writer.Write(@"\n"); } + else if (value == (uint)'\f') { writer.Write(@"\f"); } + else if (value == (uint)'\r') { writer.Write(@"\r"); } + else if (value == (uint)'/') { writer.Write(@"\/"); } + else if (value == (uint)'\\') { writer.Write(@"\\"); } + else { WriteEncodedScalarAsNumericEntity(ref writer, value); } } // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). - private static void WriteEncodedScalarAsNumericEntity(T output, Action writeChar, uint value) where T : class + private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) { if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) { // Convert this back to UTF-16 and write out both characters. char leadingSurrogate, trailingSurrogate; UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); - WriteEncodedSingleCharacter(output, writeChar, leadingSurrogate); - WriteEncodedSingleCharacter(output, writeChar, trailingSurrogate); + WriteEncodedSingleCharacter(ref writer, leadingSurrogate); + WriteEncodedSingleCharacter(ref writer, trailingSurrogate); } else { // This is only a single character. - WriteEncodedSingleCharacter(output, writeChar, value); + WriteEncodedSingleCharacter(ref writer, value); } } // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. - private static void WriteEncodedSingleCharacter(T output, Action writeChar, uint value) where T : class + private static void WriteEncodedSingleCharacter(ref Writer writer, uint value) { Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); // Encode this as 6 chars "\uFFFF". - writeChar(output, '\\'); - writeChar(output, 'u'); - writeChar(output, HexUtil.IntToChar(value >> 12)); - writeChar(output, HexUtil.IntToChar((value >> 8) & 0xFU)); - writeChar(output, HexUtil.IntToChar((value >> 4) & 0xFU)); - writeChar(output, HexUtil.IntToChar(value & 0xFU)); + writer.Write('\\'); + writer.Write('u'); + writer.Write(HexUtil.IntToChar(value >> 12)); + writer.Write(HexUtil.IntToChar((value >> 8) & 0xFU)); + writer.Write(HexUtil.IntToChar((value >> 4) & 0xFU)); + writer.Write(HexUtil.IntToChar(value & 0xFU)); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs index d370fbe4f6..7b6c0ae50e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -11,12 +11,6 @@ namespace Microsoft.AspNet.WebUtilities.Encoders { internal unsafe abstract class UnicodeEncoderBase { - // Stubs for appending data to a TextWriter or StringBuilder - private static readonly Action _appendCharToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); - private static readonly Action _appendCharToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); - private static readonly Action _appendStringToStringBuilderStub = PrepareDelegate((Action)AppendToStringBuilder); - private static readonly Action _appendStringToTextWriterStub = PrepareDelegate((Action)AppendToTextWriter); - // A bitmap of characters which are allowed to be returned unescaped. private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; @@ -77,26 +71,6 @@ namespace Microsoft.AspNet.WebUtilities.Encoders _allowedCharsBitmap[index] |= 0x1U << offset; } - private static void AppendToStringBuilder(StringBuilder builder, char value) - { - builder.Append(value); - } - - private static void AppendToStringBuilder(StringBuilder builder, string value) - { - builder.Append(value); - } - - private static void AppendToTextWriter(TextWriter writer, char value) - { - writer.Write(value); - } - - private static void AppendToTextWriter(TextWriter writer, string value) - { - writer.Write(value); - } - // Marks a character as forbidden (must be returned encoded) protected void ForbidCharacter(char c) { @@ -212,19 +186,21 @@ namespace Microsoft.AspNet.WebUtilities.Encoders // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, // then begin encoding from the last (potentially requiring encoding) part of the input string. StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); + Writer writer = new Writer(builder); fixed (char* pInput = input) { - EncodeCore(builder, _appendStringToStringBuilderStub, _appendCharToStringBuilderStub, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); + EncodeCore(ref writer, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); } return builder.ToString(); } private void EncodeCore(char* input, uint charsRemaining, TextWriter output) { - EncodeCore(output, _appendStringToTextWriterStub, _appendCharToTextWriterStub, input, charsRemaining); + Writer writer = new Writer(output); + EncodeCore(ref writer, input, charsRemaining); } - private void EncodeCore(T output, Action writeString, Action writeChar, char* input, uint charsRemaining) where T : class + private void EncodeCore(ref Writer writer, char* input, uint charsRemaining) { while (charsRemaining != 0) { @@ -232,7 +208,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) { // Supplementary characters should always be encoded numerically. - WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); + WriteEncodedScalar(ref writer, (uint)nextScalar); // We consume two UTF-16 characters for a single supplementary character. input += 2; @@ -246,11 +222,11 @@ namespace Microsoft.AspNet.WebUtilities.Encoders char c = (char)nextScalar; if (IsCharacterAllowed(c)) { - writeChar(output, c); + writer.Write(c); } else { - WriteEncodedScalar(output, writeString, writeChar, (uint)nextScalar); + WriteEncodedScalar(ref writer, (uint)nextScalar); } } } @@ -278,22 +254,6 @@ namespace Microsoft.AspNet.WebUtilities.Encoders return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; } - private static T PrepareDelegate(T @del) where T : class - { -#if ASPNETCORE50 - // RuntimeHelpers.PrepareMethod doesn't exist on CoreCLR, so we'll depend - // on cross-gen for performance optimizations. - return del; -#else - // We prepare the method ahead of time to ensure that it's JITted before - // the delegate is constructed; this allows the delegate to point straight - // to the processor code rather than to the prestub dispatch code. - Delegate castDel = (Delegate)(object)del; - RuntimeHelpers.PrepareMethod(castDel.Method.MethodHandle); - return (T)(object)castDel.Method.CreateDelegate(typeof(T)); -#endif - } - private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) { if (startIndex < 0 || startIndex > actualInputLength) @@ -306,6 +266,55 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } } - protected abstract void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) where T : class; + protected abstract void WriteEncodedScalar(ref Writer writer, uint value); + + /// + /// Provides an abstraction over both StringBuilder and TextWriter. + /// Declared as a struct so we can allocate on the stack and pass by + /// reference. Eliminates chatty virtual dispatches on hot paths. + /// + protected struct Writer + { + private readonly StringBuilder _innerBuilder; + private readonly TextWriter _innerWriter; + + public Writer(StringBuilder innerBuilder) + { + _innerBuilder = innerBuilder; + _innerWriter = null; + } + + public Writer(TextWriter innerWriter) + { + _innerBuilder = null; + _innerWriter = innerWriter; + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Write(char value) + { + if (_innerBuilder != null) + { + _innerBuilder.Append(value); + } + else + { + _innerWriter.Write(value); + } + } + + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public void Write(string value) + { + if (_innerBuilder != null) + { + _innerBuilder.Append(value); + } + else + { + _innerWriter.Write(value); + } + } + } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs index 2eda7cb52e..1a7b71799c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs @@ -160,16 +160,16 @@ namespace Microsoft.AspNet.WebUtilities.Encoders } // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. - protected override void WriteEncodedScalar(T output, Action writeString, Action writeChar, uint value) + protected override void WriteEncodedScalar(ref Writer writer, uint value) { uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); do { char highNibble, lowNibble; HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); - writeChar(output, '%'); - writeChar(output, highNibble); - writeChar(output, lowNibble); + writer.Write('%'); + writer.Write(highNibble); + writer.Write(lowNibble); } while ((asUtf8 >>= 8) != 0); } } From 5038c369db16a23312612073ce7b36ab4b1931aa Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 12 Feb 2015 14:44:38 -0800 Subject: [PATCH 0410/1838] Using IServiceManifest from Microsoft.Framework.Runtime.Interfaces --- .../IApplicationLifetime.cs | 2 -- .../IConfigureHostingEnvironment.cs | 1 - .../IHostingEnvironment.cs | 2 -- .../IServerFactory.cs | 2 -- .../project.json | 1 - src/Microsoft.AspNet.Hosting/IServiceManifest.cs | 16 ---------------- src/Microsoft.AspNet.Hosting/project.json | 1 + 7 files changed, 1 insertion(+), 24 deletions(-) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNet.Hosting.Interfaces}/IConfigureHostingEnvironment.cs (94%) delete mode 100644 src/Microsoft.AspNet.Hosting/IServiceManifest.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs index df20556da1..755a415103 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs @@ -2,14 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting { /// /// Allows consumers to perform cleanup during a graceful shutdown. /// - [AssemblyNeutral] public interface IApplicationLifetime { /// diff --git a/src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs similarity index 94% rename from src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs index 715d55b687..6ea92fde03 100644 --- a/src/Microsoft.AspNet.Hosting/IConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs @@ -5,7 +5,6 @@ using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting { - [AssemblyNeutral] public interface IConfigureHostingEnvironment { void Configure(IHostingEnvironment hostingEnv); diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs index 8f5966e332..c946e5d3ff 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting { - [AssemblyNeutral] public interface IHostingEnvironment { string EnvironmentName { get; set; } diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs index 94cb26ece7..979730e5de 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs @@ -5,11 +5,9 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting.Server { - [AssemblyNeutral] public interface IServerFactory { IServerInformation Initialize(IConfiguration configuration); diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index 21b82874ae..9e5b132ac8 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -3,7 +3,6 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Hosting/IServiceManifest.cs b/src/Microsoft.AspNet.Hosting/IServiceManifest.cs deleted file mode 100644 index 3810fdc06c..0000000000 --- a/src/Microsoft.AspNet.Hosting/IServiceManifest.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.Framework.DependencyInjection.ServiceLookup -{ -#if ASPNET50 || ASPNETCORE50 - [Microsoft.Framework.Runtime.AssemblyNeutral] -#endif - public interface IServiceManifest - { - IEnumerable Services { get; } - } -} diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 2696a48923..f4deb14aca 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -3,6 +3,7 @@ "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Microsoft.AspNet.FileProviders": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", From fe3675a9e06f5a3ff1eed9c8aeb8108f88e90d10 Mon Sep 17 00:00:00 2001 From: dtkujawski Date: Thu, 12 Feb 2015 17:40:14 -0600 Subject: [PATCH 0411/1838] Ability to derive Startup from a base class and have "Configure" and "ConfigureServices" be invoked from the base class when present. --- .../Startup/StartupLoader.cs | 20 ++++++------- .../Fakes/Startup.cs | 12 ++++---- .../Fakes/StartupBase.cs | 29 +++++++++++++++++++ .../StartupManagerTests.cs | 3 +- 4 files changed, 47 insertions(+), 17 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index a7e85283bf..24770cd502 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -29,18 +29,18 @@ namespace Microsoft.AspNet.Hosting.Startup { var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); - var methodInfo = startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithEnv) - ?? startupType.GetTypeInfo().GetDeclaredMethod(methodNameWithNoEnv); - if (methodInfo == null) + var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) + ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + if (methodInfo == null) { if (required) - { - throw new Exception(string.Format("TODO: {0} or {1} method not found", - methodNameWithEnv, - methodNameWithNoEnv)); + { + throw new Exception(string.Format("TODO: {0} or {1} method not found", + methodNameWithEnv, + methodNameWithNoEnv)); - } - return null; + } + return null; } if (returnType != null && methodInfo.ReturnType != returnType) { @@ -160,7 +160,7 @@ namespace Microsoft.AspNet.Hosting.Startup } else { - // void ConfigureServices(IServiceCollection) + // void ConfigureServices(IServiceCollection) Invoke(servicesMethod, instance, builder, services); if (builder != null) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index e657841566..54ef6de669 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -9,7 +9,7 @@ using System; namespace Microsoft.AspNet.Hosting.Fakes { - public class Startup + public class Startup : StartupBase { public Startup() { @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Hosting.Fakes }); } - public void ConfigureRetailServices(IServiceCollection services) + public void ConfigureRetailServices(IServiceCollection services) { services.AddOptions(); services.Configure(o => @@ -94,8 +94,8 @@ namespace Microsoft.AspNet.Hosting.Fakes return services.BuildServiceProvider(); } - public virtual void Configure(IApplicationBuilder builder) - { - } - } + public virtual void Configure(IApplicationBuilder builder) + { + } + } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs new file mode 100644 index 0000000000..f1ee427a87 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.OptionsModel; +using System; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupBase + { + public StartupBase() + { + } + + public void ConfigureBaseClassServices(IServiceCollection services) + { + services.AddOptions(); + services.Configure(o => + { + o.Configured = true; + o.Environment = "BaseClass"; + }); + } + + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index f3323b978a..46758b92bc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -42,7 +42,8 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData("StaticProvider")] [InlineData("Provider")] [InlineData("ProviderArgs")] - public void StartupClassAddsConfigureServicesToApplicationServices(string environment) + [InlineData("BaseClass")] + public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { var services = HostingServices.Create().BuildServiceProvider(); var manager = services.GetRequiredService(); From a48f76da7c4687e3372b02ef945ad70fad55f7fc Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 12 Feb 2015 15:48:49 -0800 Subject: [PATCH 0412/1838] Update IServiceProvider references --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index b717bb7050..46b0f94703 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -6,8 +6,8 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.ServiceLookup; using Microsoft.Framework.Logging; +using Microsoft.Framework.Runtime; using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.Hosting diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 65aa6faecd..4fe3e36006 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.DependencyInjection.ServiceLookup; +using Microsoft.Framework.Runtime; using Xunit; namespace Microsoft.AspNet.Hosting.Tests From 66b98e2ff3bfdc2ec3fb47cac69a166d556dd2aa Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 12 Feb 2015 16:05:09 -0800 Subject: [PATCH 0413/1838] Reacting to IServiceManifest namespace rename --- test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 4fe3e36006..5e6e733da8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -84,11 +84,12 @@ namespace Microsoft.AspNet.Hosting.Tests fallbackServices.AddTransient(); // Act - var exp = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); + var exception = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); // Assert - Assert.True(exp.Message.Contains("No service for type 'Microsoft.Framework.DependencyInjection.ServiceLookup.IServiceManifest'")); + Assert.Equal($"No service for type '{typeof(IServiceManifest).FullName}' has been registered.", + exception.Message); } private class ServiceManifest : IServiceManifest From e95472e953b2bf09a31b9b3ac2f20453f38e7b7c Mon Sep 17 00:00:00 2001 From: dtkujawski Date: Thu, 12 Feb 2015 23:45:26 -0600 Subject: [PATCH 0414/1838] Switch from tabs to spaces --- .../Startup/StartupLoader.cs | 20 +++++++++---------- .../Fakes/Startup.cs | 10 +++++----- .../Fakes/StartupBase.cs | 20 +++++++++---------- .../StartupManagerTests.cs | 4 ++-- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 24770cd502..ba48bd211c 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -29,18 +29,18 @@ namespace Microsoft.AspNet.Hosting.Startup { var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); - var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) - ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - if (methodInfo == null) + var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) + ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + if (methodInfo == null) { if (required) - { - throw new Exception(string.Format("TODO: {0} or {1} method not found", - methodNameWithEnv, - methodNameWithNoEnv)); + { + throw new Exception(string.Format("TODO: {0} or {1} method not found", + methodNameWithEnv, + methodNameWithNoEnv)); - } - return null; + } + return null; } if (returnType != null && methodInfo.ReturnType != returnType) { @@ -160,7 +160,7 @@ namespace Microsoft.AspNet.Hosting.Startup } else { - // void ConfigureServices(IServiceCollection) + // void ConfigureServices(IServiceCollection) Invoke(servicesMethod, instance, builder, services); if (builder != null) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 54ef6de669..efcb11537a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Hosting.Fakes }); } - public void ConfigureRetailServices(IServiceCollection services) + public void ConfigureRetailServices(IServiceCollection services) { services.AddOptions(); services.Configure(o => @@ -94,8 +94,8 @@ namespace Microsoft.AspNet.Hosting.Fakes return services.BuildServiceProvider(); } - public virtual void Configure(IApplicationBuilder builder) - { - } - } + public virtual void Configure(IApplicationBuilder builder) + { + } + } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs index f1ee427a87..7fbe35cffb 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs @@ -15,15 +15,15 @@ namespace Microsoft.AspNet.Hosting.Fakes { } - public void ConfigureBaseClassServices(IServiceCollection services) - { - services.AddOptions(); - services.Configure(o => - { - o.Configured = true; - o.Environment = "BaseClass"; - }); - } + public void ConfigureBaseClassServices(IServiceCollection services) + { + services.AddOptions(); + services.Configure(o => + { + o.Configured = true; + o.Environment = "BaseClass"; + }); + } - } + } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 46758b92bc..29aa84173c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -42,8 +42,8 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData("StaticProvider")] [InlineData("Provider")] [InlineData("ProviderArgs")] - [InlineData("BaseClass")] - public void StartupClassAddsConfigureServicesToApplicationServices(string environment) + [InlineData("BaseClass")] + public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { var services = HostingServices.Create().BuildServiceProvider(); var manager = services.GetRequiredService(); From 5a5975e348d0b17541ca8fcdb424ddb8285b058f Mon Sep 17 00:00:00 2001 From: dtkujawski Date: Fri, 13 Feb 2015 11:47:42 -0600 Subject: [PATCH 0415/1838] Removed Ctor, Cleaned up namespace and removed extra vertical spacing as per comments. --- test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs index 7fbe35cffb..e9daa9584d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs @@ -1,20 +1,12 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.Framework.OptionsModel; -using System; namespace Microsoft.AspNet.Hosting.Fakes { public class StartupBase { - public StartupBase() - { - } - public void ConfigureBaseClassServices(IServiceCollection services) { services.AddOptions(); @@ -24,6 +16,5 @@ namespace Microsoft.AspNet.Hosting.Fakes o.Environment = "BaseClass"; }); } - } } \ No newline at end of file From fc524872940ad3f8de6befe2272fd003f925ff45 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 13 Feb 2015 14:12:40 -0800 Subject: [PATCH 0416/1838] Encoders should forbid Zs (space separator) characters except U+0020 SPACE --- .../Encoders/UnicodeEncoderBase.cs | 2 +- .../unicode-7.0.0-defined-characters.bin | Bin 8192 -> 8192 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs index 7b6c0ae50e..19b5ddd90a 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zl, Zp) + // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); for (int i = 0; i < _allowedCharsBitmap.Length; i++) diff --git a/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin index 61406a9b82543917f6fa3e032461f6222f8902ba..c9b36c871d6146d5c25044cd405807c15641d3f3 100644 GIT binary patch delta 48 zcmZp0XmFSy!uW6UM3$(H`H4)7|2AJ_(r4sh`0@Y${~93v|G$1S56c%upadh^e@Ory C&lg?* delta 46 vcmZp0XmFSyGI=6P^v3)|CdU7pFEZ&f^85#ZKVb6zW*(L=j6exSw*Qg<8h{vR From 34acb16e2038f5e00855b6df89f937402f15c558 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 16 Feb 2015 13:29:03 -0800 Subject: [PATCH 0417/1838] Add project.lock.json to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 08e21e25bf..ac82da7568 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ nuget.exe *.ncrunchsolution *.*sdf *.ipch -*.sln.ide \ No newline at end of file +*.sln.ide +project.lock.json From d0543305f007b2826f395595b8871f2642ad54c6 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Mon, 16 Feb 2015 13:30:36 -0800 Subject: [PATCH 0418/1838] Add project.lock.json to .gitignore --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 08e21e25bf..ac82da7568 100644 --- a/.gitignore +++ b/.gitignore @@ -23,4 +23,5 @@ nuget.exe *.ncrunchsolution *.*sdf *.ipch -*.sln.ide \ No newline at end of file +*.sln.ide +project.lock.json From 3f9423eda9ab8e227970592815b29146f892a305 Mon Sep 17 00:00:00 2001 From: Levi B Date: Mon, 16 Feb 2015 14:54:59 -0800 Subject: [PATCH 0419/1838] Provide a facility for registering encoder services --- .../Encoders/EncoderOptions.cs | 21 ++++++++++ .../EncoderServiceCollectionExtensions.cs | 25 ++++++++++++ .../Encoders/EncoderServices.cs | 39 +++++++++++++++++++ .../project.json | 2 + 4 files changed, 87 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs new file mode 100644 index 0000000000..5cc6097284 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). + /// + public sealed class EncoderOptions + { + /// + /// Specifies code point tables which do not require escaping by the encoders. + /// + /// + /// By default, only Basic Latin is allowed. + /// + public ICodePointFilter[] CodePointFilters { get; set; } = new[] { Microsoft.AspNet.WebUtilities.Encoders.CodePointFilters.BasicLatin }; + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs new file mode 100644 index 0000000000..5e501e27a4 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.WebUtilities.Encoders; +using Microsoft.Framework.ConfigurationModel; + +namespace Microsoft.Framework.DependencyInjection +{ + public static class EncoderServiceCollectionExtensions + { + public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services) + { + return AddEncoders(services, configuration: null); + } + + public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) + { + services.AddOptions(configuration); + services.TryAdd(EncoderServices.GetDefaultServices(configuration)); + return services; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs new file mode 100644 index 0000000000..d6590d8731 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs @@ -0,0 +1,39 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.OptionsModel; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + public static class EncoderServices + { + public static IEnumerable GetDefaultServices() + { + return GetDefaultServices(configuration: null); + } + + public static IEnumerable GetDefaultServices(IConfiguration configuration) + { + var describe = new ServiceDescriber(configuration); + + // Register the default encoders + // We want to call the 'Default' property getters lazily since they perform static caching + yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filters => new HtmlEncoder(filters))); + yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filters => new JavaScriptStringEncoder(filters))); + yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filters => new UrlEncoder(filters))); + } + + private static Func CreateFactory(Func parameterlessCtor, Func parameterfulCtor) + { + return serviceProvider => + { + var codePointFilters = serviceProvider?.GetService>()?.Options?.CodePointFilters; + return (codePointFilters != null) ? parameterfulCtor(codePointFilters) : parameterlessCtor(); + }; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index be234399ec..a5cf55cd04 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,9 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { From fa18a8fb30629382c907f20b8544bf7c2496ea44 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 17 Feb 2015 10:50:07 -0800 Subject: [PATCH 0420/1838] Rename HttpRequest.IsSecure -> HttpRequest.IsHttps --- src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.Http/HttpRequest.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 46fa1907b7..4c89f0f457 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -112,7 +112,7 @@ namespace Microsoft.AspNet.Http.Core set { HttpRequestFeature.Scheme = value; } } - public override bool IsSecure + public override bool IsHttps { get { return string.Equals("https", Scheme, StringComparison.OrdinalIgnoreCase); } } diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http/HttpRequest.cs index 5ab2010a59..7465c30638 100644 --- a/src/Microsoft.AspNet.Http/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http/HttpRequest.cs @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Http /// Returns true if the owin.RequestScheme is https. /// /// true if this request is using https; otherwise, false. - public abstract bool IsSecure { get; } + public abstract bool IsHttps { get; } /// /// Gets or set the Host header. May include the port. diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 4a97095eda..148d80fcc0 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -99,7 +99,7 @@ namespace Microsoft.AspNet.Owin _context.Items[OwinConstants.OwinVersion] = "1.0"; } - if (context.Request.IsSecure) + if (context.Request.IsHttps) { _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, (feature, value) => feature.ClientCertificate = (X509Certificate)value)); From 2ee12735b3cfd2198ac33d423f158dba0eaba8c2 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 19 Feb 2015 13:22:58 -0800 Subject: [PATCH 0421/1838] Make it easier to add hosting services Fixes https://github.com/aspnet/Hosting/pull/146 --- .../ConfigureHostingEnvironment.cs | 2 +- .../HostingServices.cs | 42 +++++++++--- .../HostingServicesCollectionExtensions.cs | 14 +++- src/Microsoft.AspNet.TestHost/TestServer.cs | 17 +++-- .../HostingServicesFacts.cs | 67 +++++++++++++++++++ .../TestServerTests.cs | 30 ++++++++- 6 files changed, 153 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs index a714c2cfef..892eaab372 100644 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting public void Configure(IHostingEnvironment hostingEnv) { - hostingEnv.EnvironmentName = _config.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; + hostingEnv.EnvironmentName = _config?.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 46b0f94703..f102226ff8 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -14,39 +14,61 @@ namespace Microsoft.AspNet.Hosting { public static class HostingServices { - private static IServiceCollection Import(IServiceProvider fallbackProvider) + private static IServiceCollection Import(IServiceProvider fallbackProvider, Action configureHostServices) { var services = new ServiceCollection(); + if (configureHostServices != null) + { + configureHostServices(services); + } var manifest = fallbackProvider.GetRequiredService(); foreach (var service in manifest.Services) { services.AddTransient(service, sp => fallbackProvider.GetService(service)); } + services.AddSingleton(sp => new HostingManifest(services)); return services; } - public static IServiceCollection Create(IConfiguration configuration = null) + public static IServiceCollection Create() { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configuration); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: null); } - public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration = null) + public static IServiceCollection Create(IServiceProvider fallbackServices) { - configuration = configuration ?? new Configuration(); - var services = Import(fallbackServices); + return Create(fallbackServices, configureHostServices: null, configuration: null); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices) + { + return Create(fallbackServices, configureHostServices, configuration: null); + } + + public static IServiceCollection Create(Action configureHostServices, IConfiguration configuration) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: configuration); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices, IConfiguration configuration) + { + var services = Import(fallbackServices, configureHostServices); services.AddHosting(configuration); - services.AddSingleton(sp => new HostingManifest(fallbackServices)); return services; } // Manifest exposes the fallback manifest in addition to ITypeActivator, IHostingEnvironment, and ILoggerFactory private class HostingManifest : IServiceManifest { - public HostingManifest(IServiceProvider fallback) + public HostingManifest(IServiceCollection hostServices) { - var manifest = fallback.GetRequiredService(); Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor) } - .Concat(manifest.Services).Distinct(); + .Concat(hostServices.Select(s => s.ServiceType)).Distinct(); } public IEnumerable Services { get; private set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 8c52a6910d..f6a73158a7 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -12,8 +12,13 @@ namespace Microsoft.Framework.DependencyInjection { public static class HostingServicesExtensions { + public static IServiceCollection AddLogging(this IServiceCollection services) + { + return services.AddLogging(config: null); + } + // REVIEW: Logging doesn't depend on DI, where should this live? - public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config = null) + public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config) { var describe = new ServiceDescriber(config); services.TryAdd(describe.Singleton()); @@ -21,7 +26,12 @@ namespace Microsoft.Framework.DependencyInjection return services; } - public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) + public static IServiceCollection AddHosting(this IServiceCollection services) + { + return services.AddHosting(configuration: null); + } + + public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration) { var describer = new ServiceDescriber(configuration); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 54b908133e..a5496170d1 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -2,10 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; -using System.Linq; using System.Net.Http; -using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; @@ -49,12 +46,22 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(Action app) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app); + return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices: null); + } + + public static TestServer Create(Action app, Action configureHostServices) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices); } public static TestServer Create(IServiceProvider serviceProvider, Action app) { - var appServices = HostingServices.Create(serviceProvider).BuildServiceProvider(); + return Create(serviceProvider, app, configureHostServices: null); + } + + public static TestServer Create(IServiceProvider serviceProvider, Action app, Action configureHostServices) + { + var appServices = HostingServices.Create(serviceProvider, configureHostServices).BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 5e6e733da8..8cafaa90c6 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -53,6 +53,73 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services } + [Fact] + public void CreateCanAddAdditionalServices() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddTransient(); + fallbackServices.AddTransient(); // Don't register in manifest + + fallbackServices.AddInstance(new ServiceManifest( + new Type[] { + typeof(IFakeService), + })); + + var instance = new FakeService(); + var factoryInstance = new FakeFactoryService(instance); + + var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), + additionalHostServices => + { + additionalHostServices.AddSingleton(); + additionalHostServices.AddInstance(instance); + additionalHostServices.AddSingleton(serviceProvider => factoryInstance); + }); + + // Act + var provider = services.BuildServiceProvider(); + var singleton = provider.GetRequiredService(); + var transient = provider.GetRequiredService(); + var factory = provider.GetRequiredService(); + var manifest = provider.GetRequiredService(); + + // Assert + Assert.Same(singleton, provider.GetRequiredService()); + Assert.NotSame(transient, provider.GetRequiredService()); + Assert.Same(instance, provider.GetRequiredService()); + Assert.Same(factoryInstance, factory); + Assert.Same(factory.FakeService, instance); + Assert.Null(provider.GetService()); + Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services + Assert.Contains(typeof(IFakeSingletonService), manifest.Services); + Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); + Assert.Contains(typeof(IFactoryService), manifest.Services); + } + + [Fact] + public void CreateAdditionalServicesDoNotOverrideFallback() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddTransient(); + + fallbackServices.AddInstance(new ServiceManifest( + new Type[] { + typeof(IFakeService), + })); + + var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), + additionalHostServices => additionalHostServices.AddSingleton()); + + // Act + var provider = services.BuildServiceProvider(); + var stillTransient = provider.GetRequiredService(); + + // Assert + Assert.NotSame(stillTransient, provider.GetRequiredService()); + } + [Fact] public void CanHideImportedServices() { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 0a31db1b21..57d4ed290e 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -40,7 +40,6 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanAccessHttpContext() { - var services = new ServiceCollection().BuildServiceProvider(); TestServer server = TestServer.Create(app => { app.Run(context => @@ -54,6 +53,35 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("HasContext:True", result); } + public class ContextHolder + { + public ContextHolder(IHttpContextAccessor accessor) + { + Accessor = accessor; + } + + public IHttpContextAccessor Accessor { get; set; } + } + + [Fact] + public async Task CanAddNewHostServices() + { + TestServer server = TestServer.Create(app => + { + var a = app.ApplicationServices.GetRequiredService(); + + app.Run(context => + { + var b = app.ApplicationServices.GetRequiredService(); + var accessor = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.Value != null)); + }); + }, newHostServices => newHostServices.AddSingleton()); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("HasContext:True", result); + } + [Fact] public async Task CreateInvokesApp() { From c551ec24909f2b6b9102d25cd314b97bacc97143 Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 19 Feb 2015 14:14:04 -0800 Subject: [PATCH 0422/1838] Add encoder extension methods --- .../Encoders/EncoderExtensions.cs | 51 +++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs new file mode 100644 index 0000000000..65dbc541aa --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.WebUtilities.Encoders +{ + /// + /// Contains extension methods for fetching encoders from a service provider. + /// + public static class EncoderExtensions + { + /// + /// Retrieves an IHtmlEncoder from a service provider. + /// + /// + /// This method is guaranteed never to return null. + /// It will return a default encoder instance if the service provider does not contain one. + /// + public static IHtmlEncoder GetHtmlEncoder([NotNull] this IServiceProvider serviceProvider) + { + return serviceProvider.GetService() ?? HtmlEncoder.Default; + } + + /// + /// Retrieves an IJavaScriptStringEncoder from a service provider. + /// + /// + /// This method is guaranteed never to return null. + /// It will return a default encoder instance if the service provider does not contain one. + /// + public static IJavaScriptStringEncoder GetJavaScriptStringEncoder([NotNull] this IServiceProvider serviceProvider) + { + return serviceProvider.GetService() ?? JavaScriptStringEncoder.Default; + } + + /// + /// Retrieves an IUrlEncoder from a service provider. + /// + /// + /// This method is guaranteed never to return null. + /// It will return a default encoder instance if the service provider does not contain one. + /// + public static IUrlEncoder GetUrlEncoder([NotNull] this IServiceProvider serviceProvider) + { + return serviceProvider.GetService() ?? UrlEncoder.Default; + } + } +} From 8d98d7620902fecb41fe11b5475414941bbfac60 Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 19 Feb 2015 14:42:20 -0800 Subject: [PATCH 0423/1838] Code comment clarifications --- src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs | 6 +++--- src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs index 89947567ce..b48aa2ddcf 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// output. /// /// - /// The encoded value is also safe for inclusion inside an HTML attribute + /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// void HtmlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// The HTML-encoded value, or null if the input string was null. /// /// - /// The return value is also safe for inclusion inside an HTML attribute + /// The return value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// string HtmlEncode(string value); @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// supplied output. /// /// - /// The encoded value is also safe for inclusion inside an HTML attribute + /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// void HtmlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs index c04014570e..464a92ba0e 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs +++ b/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// output. /// /// - /// The encoded value is safe for use in the segment, query, or + /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// void UrlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); @@ -28,7 +28,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// The URL-escaped value, or null if the input string was null. /// /// - /// The return value is safe for use in the segment, query, or + /// The return value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// string UrlEncode(string value); @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// URL-escapes a string and writes the result to the supplied output. /// /// - /// The encoded value is safe for use in the segment, query, or + /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// void UrlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); From 21d5ae540ee7c53d38ea3e634db151254f23e0b7 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 19 Feb 2015 15:17:18 -0800 Subject: [PATCH 0424/1838] Fix for MVC functional failures --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index f102226ff8..7ebc153c12 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -52,7 +52,7 @@ namespace Microsoft.AspNet.Hosting public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: configuration); + return Create(fallbackServices, configureHostServices: null, configuration: configuration); } public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices, IConfiguration configuration) From b510370c9b31b6f1f922d90735fb210f52ca0fe4 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 19 Feb 2015 16:58:04 -0800 Subject: [PATCH 0425/1838] Add ILogger to manifest --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 7ebc153c12..926812c408 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Hosting { public HostingManifest(IServiceCollection hostServices) { - Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor) } + Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(ILogger<>), typeof(IHttpContextAccessor) } .Concat(hostServices.Select(s => s.ServiceType)).Distinct(); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index e247d4ec64..74027b51fc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -93,6 +93,7 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(typeof(IApplicationLifetime))] [InlineData(typeof(ILoggerFactory))] [InlineData(typeof(IHttpContextAccessor))] + [InlineData(typeof(ILogger))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) { var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); From d687ec2c26a1ad34d7ee7db21f17be916c45d07c Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 19 Feb 2015 17:57:27 -0800 Subject: [PATCH 0426/1838] Revert HostingServices.Create changes Need to understand MVC failures --- .../ConfigureHostingEnvironment.cs | 2 +- .../HostingServices.cs | 44 +++--------- .../HostingServicesCollectionExtensions.cs | 14 +--- src/Microsoft.AspNet.TestHost/TestServer.cs | 17 ++--- .../HostingServicesFacts.cs | 67 ------------------- .../UseRequestServicesFacts.cs | 1 - .../TestServerTests.cs | 30 +-------- 7 files changed, 20 insertions(+), 155 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs index 892eaab372..a714c2cfef 100644 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting public void Configure(IHostingEnvironment hostingEnv) { - hostingEnv.EnvironmentName = _config?.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; + hostingEnv.EnvironmentName = _config.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 926812c408..46b0f94703 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -14,61 +14,39 @@ namespace Microsoft.AspNet.Hosting { public static class HostingServices { - private static IServiceCollection Import(IServiceProvider fallbackProvider, Action configureHostServices) + private static IServiceCollection Import(IServiceProvider fallbackProvider) { var services = new ServiceCollection(); - if (configureHostServices != null) - { - configureHostServices(services); - } var manifest = fallbackProvider.GetRequiredService(); foreach (var service in manifest.Services) { services.AddTransient(service, sp => fallbackProvider.GetService(service)); } - services.AddSingleton(sp => new HostingManifest(services)); return services; } - public static IServiceCollection Create() + public static IServiceCollection Create(IConfiguration configuration = null) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: null); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configuration); } - public static IServiceCollection Create(IServiceProvider fallbackServices) + public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration = null) { - return Create(fallbackServices, configureHostServices: null, configuration: null); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices) - { - return Create(fallbackServices, configureHostServices, configuration: null); - } - - public static IServiceCollection Create(Action configureHostServices, IConfiguration configuration) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration) - { - return Create(fallbackServices, configureHostServices: null, configuration: configuration); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices, IConfiguration configuration) - { - var services = Import(fallbackServices, configureHostServices); + configuration = configuration ?? new Configuration(); + var services = Import(fallbackServices); services.AddHosting(configuration); + services.AddSingleton(sp => new HostingManifest(fallbackServices)); return services; } // Manifest exposes the fallback manifest in addition to ITypeActivator, IHostingEnvironment, and ILoggerFactory private class HostingManifest : IServiceManifest { - public HostingManifest(IServiceCollection hostServices) + public HostingManifest(IServiceProvider fallback) { - Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(ILogger<>), typeof(IHttpContextAccessor) } - .Concat(hostServices.Select(s => s.ServiceType)).Distinct(); + var manifest = fallback.GetRequiredService(); + Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor) } + .Concat(manifest.Services).Distinct(); } public IEnumerable Services { get; private set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index f6a73158a7..8c52a6910d 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -12,13 +12,8 @@ namespace Microsoft.Framework.DependencyInjection { public static class HostingServicesExtensions { - public static IServiceCollection AddLogging(this IServiceCollection services) - { - return services.AddLogging(config: null); - } - // REVIEW: Logging doesn't depend on DI, where should this live? - public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config) + public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config = null) { var describe = new ServiceDescriber(config); services.TryAdd(describe.Singleton()); @@ -26,12 +21,7 @@ namespace Microsoft.Framework.DependencyInjection return services; } - public static IServiceCollection AddHosting(this IServiceCollection services) - { - return services.AddHosting(configuration: null); - } - - public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) { var describer = new ServiceDescriber(configuration); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index a5496170d1..54b908133e 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -2,7 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Linq; using System.Net.Http; +using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; @@ -46,22 +49,12 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(Action app) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices: null); - } - - public static TestServer Create(Action app, Action configureHostServices) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices); + return Create(CallContextServiceLocator.Locator.ServiceProvider, app); } public static TestServer Create(IServiceProvider serviceProvider, Action app) { - return Create(serviceProvider, app, configureHostServices: null); - } - - public static TestServer Create(IServiceProvider serviceProvider, Action app, Action configureHostServices) - { - var appServices = HostingServices.Create(serviceProvider, configureHostServices).BuildServiceProvider(); + var appServices = HostingServices.Create(serviceProvider).BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 8cafaa90c6..5e6e733da8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -53,73 +53,6 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services } - [Fact] - public void CreateCanAddAdditionalServices() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - fallbackServices.AddTransient(); // Don't register in manifest - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - - var instance = new FakeService(); - var factoryInstance = new FakeFactoryService(instance); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), - additionalHostServices => - { - additionalHostServices.AddSingleton(); - additionalHostServices.AddInstance(instance); - additionalHostServices.AddSingleton(serviceProvider => factoryInstance); - }); - - // Act - var provider = services.BuildServiceProvider(); - var singleton = provider.GetRequiredService(); - var transient = provider.GetRequiredService(); - var factory = provider.GetRequiredService(); - var manifest = provider.GetRequiredService(); - - // Assert - Assert.Same(singleton, provider.GetRequiredService()); - Assert.NotSame(transient, provider.GetRequiredService()); - Assert.Same(instance, provider.GetRequiredService()); - Assert.Same(factoryInstance, factory); - Assert.Same(factory.FakeService, instance); - Assert.Null(provider.GetService()); - Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services - Assert.Contains(typeof(IFakeSingletonService), manifest.Services); - Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); - Assert.Contains(typeof(IFactoryService), manifest.Services); - } - - [Fact] - public void CreateAdditionalServicesDoNotOverrideFallback() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), - additionalHostServices => additionalHostServices.AddSingleton()); - - // Act - var provider = services.BuildServiceProvider(); - var stillTransient = provider.GetRequiredService(); - - // Assert - Assert.NotSame(stillTransient, provider.GetRequiredService()); - } - [Fact] public void CanHideImportedServices() { diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 74027b51fc..e247d4ec64 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -93,7 +93,6 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(typeof(IApplicationLifetime))] [InlineData(typeof(ILoggerFactory))] [InlineData(typeof(IHttpContextAccessor))] - [InlineData(typeof(ILogger))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) { var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 57d4ed290e..0a31db1b21 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -40,6 +40,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanAccessHttpContext() { + var services = new ServiceCollection().BuildServiceProvider(); TestServer server = TestServer.Create(app => { app.Run(context => @@ -53,35 +54,6 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("HasContext:True", result); } - public class ContextHolder - { - public ContextHolder(IHttpContextAccessor accessor) - { - Accessor = accessor; - } - - public IHttpContextAccessor Accessor { get; set; } - } - - [Fact] - public async Task CanAddNewHostServices() - { - TestServer server = TestServer.Create(app => - { - var a = app.ApplicationServices.GetRequiredService(); - - app.Run(context => - { - var b = app.ApplicationServices.GetRequiredService(); - var accessor = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.Value != null)); - }); - }, newHostServices => newHostServices.AddSingleton()); - - string result = await server.CreateClient().GetStringAsync("/path"); - Assert.Equal("HasContext:True", result); - } - [Fact] public async Task CreateInvokesApp() { From 204fb08e01966bbbe0fc6d54848b222aa7a41e0b Mon Sep 17 00:00:00 2001 From: Levi B Date: Sun, 22 Feb 2015 12:19:22 -0800 Subject: [PATCH 0427/1838] Refactor Encoders into their own package --- HttpAbstractions.sln | 17 ++++++++++++- .../Encoders/EncoderExtensions.cs | 2 +- .../Encoders/EncoderOptions.cs | 7 ++--- .../EncoderServiceCollectionExtensions.cs | 2 +- .../Encoders/EncoderServices.cs | 2 +- .../project.json | 2 +- .../project.json | 10 ++------ .../CodePointFilters.cs | 7 ++--- .../EncoderCommon.cs | 2 +- .../EncoderExtensions.cs | 3 ++- .../HexUtil.cs | 2 +- .../HtmlEncoder.cs | 2 +- .../ICodePointFilter.cs | 2 +- .../IHtmlEncoder.cs | 3 ++- .../IJavaScriptStringEncoder.cs | 3 ++- .../IUrlEncoder.cs | 3 ++- .../JavaScriptStringEncoder.cs | 2 +- .../Microsoft.Framework.WebEncoders.kproj | 17 +++++++++++++ .../UnicodeEncoderBase.cs | 3 ++- .../UnicodeHelpers.cs | 2 +- .../UrlEncoder.cs | 2 +- .../unicode-7.0.0-defined-characters.bin | Bin .../project.json | 24 ++++++++++++++++++ 23 files changed, 88 insertions(+), 31 deletions(-) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/CodePointFilters.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/EncoderCommon.cs (97%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/EncoderExtensions.cs (96%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/HexUtil.cs (97%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/HtmlEncoder.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/ICodePointFilter.cs (92%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/IHtmlEncoder.cs (95%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/IJavaScriptStringEncoder.cs (93%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/IUrlEncoder.cs (95%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/JavaScriptStringEncoder.cs (99%) create mode 100644 src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/UnicodeEncoderBase.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/UnicodeHelpers.cs (99%) rename src/{Microsoft.AspNet.WebUtilities/Encoders => Microsoft.Framework.WebEncoders}/UrlEncoder.cs (99%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.Framework.WebEncoders}/compiler/resources/unicode-7.0.0-defined-characters.bin (100%) create mode 100644 src/Microsoft.Framework.WebEncoders/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 7a857f0800..40feee2b00 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22513.0 +VisualStudioVersion = 14.0.22609.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -37,6 +37,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.kproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.kproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -201,6 +203,18 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.Build.0 = Debug|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.Build.0 = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.ActiveCfg = Release|Any CPU + {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -221,5 +235,6 @@ Global {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs index 65dbc541aa..6437376d08 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs @@ -5,7 +5,7 @@ using System; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains extension methods for fetching encoders from a service provider. diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs index 5cc6097284..828455651a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). @@ -14,8 +14,9 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// Specifies code point tables which do not require escaping by the encoders. /// /// - /// By default, only Basic Latin is allowed. + /// If this property is set to a null array, then by default only the 'Basic Latin' + /// code point filter is active. /// - public ICodePointFilter[] CodePointFilters { get; set; } = new[] { Microsoft.AspNet.WebUtilities.Encoders.CodePointFilters.BasicLatin }; + public ICodePointFilter[] CodePointFilters { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs index 5e501e27a4..7cd52e384f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs @@ -3,7 +3,7 @@ using System; using Microsoft.AspNet.Http; -using Microsoft.AspNet.WebUtilities.Encoders; +using Microsoft.Framework.WebEncoders; using Microsoft.Framework.ConfigurationModel; namespace Microsoft.Framework.DependencyInjection diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs index d6590d8731..8bac20cae8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs @@ -7,7 +7,7 @@ using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { public static class EncoderServices { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index a5cf55cd04..cb0f113bcd 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Framework.WebEncoders": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 57c6db035f..3a4c42267f 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,9 +1,6 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 common helper methods such as URL encoding.", - "compilationOptions": { - "allowUnsafe": true - }, + "description": "ASP.NET 5 common helper methods.", "dependencies": { }, "frameworks": { @@ -14,11 +11,8 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Threading": "4.0.10-beta-*" + "System.Runtime.Extensions": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs rename to src/Microsoft.Framework.WebEncoders/CodePointFilters.cs index 9268062fd5..781636916c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/CodePointFilters.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs @@ -4,11 +4,10 @@ using System; using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains predefined Unicode code point filters. @@ -2576,9 +2575,11 @@ namespace Microsoft.AspNet.WebUtilities.Encoders /// private sealed class EmptyCodePointFilter : ICodePointFilter { + private static readonly int[] _emptyArray = new int[0]; // immutable since empty + public IEnumerable GetAllowedCodePoints() { - return Enumerable.Empty(); + return _emptyArray; } } } diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs b/src/Microsoft.Framework.WebEncoders/EncoderCommon.cs similarity index 97% rename from src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs rename to src/Microsoft.Framework.WebEncoders/EncoderCommon.cs index a46ae99ed2..5bb405240a 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderCommon.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderCommon.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { internal static class EncoderCommon { diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs index 57c3b59ba7..6312387609 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs @@ -3,8 +3,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Helpful extension methods for the encoder classes. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs b/src/Microsoft.Framework.WebEncoders/HexUtil.cs similarity index 97% rename from src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs rename to src/Microsoft.Framework.WebEncoders/HexUtil.cs index 05fa1c5882..e4b512d1a5 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HexUtil.cs +++ b/src/Microsoft.Framework.WebEncoders/HexUtil.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains helpers for dealing with byte-hex char conversions. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 14af7db2c6..7bcf12f1e3 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// A class which can perform HTML encoding given an allow list of characters which diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs similarity index 92% rename from src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs rename to src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs index e57b6535d2..1a4fc58774 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/ICodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Represents a filter which allows only certain Unicode code points through. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs similarity index 95% rename from src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs index b48aa2ddcf..0456285b23 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs @@ -4,8 +4,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Provides services for HTML-encoding input. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs similarity index 93% rename from src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs index 502c699ac4..487c1ca35c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs @@ -3,8 +3,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Provides services for JavaScript-escaping strings. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs similarity index 95% rename from src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs index 464a92ba0e..2b4a8cbd57 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/IUrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs @@ -3,8 +3,9 @@ using System; using System.IO; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Provides services for URL-escaping strings. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 39d7cef34f..0d61898614 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// A class which can perform JavaScript string escaping given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj new file mode 100644 index 0000000000..9a3c5e9646 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj @@ -0,0 +1,17 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + dd2ce416-765e-4000-a03e-c2ff165da1b6 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs rename to src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs index 19b5ddd90a..45ba58e02b 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs @@ -6,8 +6,9 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Text; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { internal unsafe abstract class UnicodeEncoderBase { diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs rename to src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs index 89424a2612..549f912e1a 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// Contains helpers for dealing with Unicode code points. diff --git a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs similarity index 99% rename from src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 1a7b71799c..8df2b5bce5 100644 --- a/src/Microsoft.AspNet.WebUtilities/Encoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; -namespace Microsoft.AspNet.WebUtilities.Encoders +namespace Microsoft.Framework.WebEncoders { /// /// A class which can perform URL string escaping given an allow list of characters which diff --git a/src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/compiler/resources/unicode-7.0.0-defined-characters.bin rename to src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json new file mode 100644 index 0000000000..e61fe47605 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -0,0 +1,24 @@ +{ + "version": "1.0.0-*", + "description": "Contains encoders for HTML, JavaScript, and URLs.", + "compilationOptions": { + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, + "frameworks": { + "net45": { }, + "aspnet50": { }, + "aspnetcore50": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Reflection": "4.0.10-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Threading": "4.0.10-beta-*" + } + } + } +} From 024c72b05a4d619fe1f35e34e75211fe49f608d3 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 24 Feb 2015 14:09:55 -0800 Subject: [PATCH 0428/1838] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 6ba75cfaa8..e9ec88786b 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,9 @@ HttpAbstractions ================ -Contains HTTP abstractions for ASP.NET vNext such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. +Contains HTTP abstractions for ASP.NET 5 such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. -This project is part of ASP.NET vNext. You can find samples, documentation and getting started instructions for ASP.NET vNext at the [Home](https://github.com/aspnet/home) repo. +This project is part of ASP.NET 5. You can find samples, documentation and getting started instructions for ASP.NET 5 at the [Home](https://github.com/aspnet/home) repo. From c5dc9abff6bac10da4154382e1a9b8b256525174 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 24 Feb 2015 11:51:41 -0800 Subject: [PATCH 0429/1838] Doc comment cleanup, API refactorings Rename CodePointFilters -> UnicodeBlocks Rework allowed / disallowed code point APIs for ease of use Move service registration APIs into WebEncoders project --- .../project.json | 2 - .../AllowedCharsBitmap.cs | 65 + .../CodePointFilter.cs | 273 ++ .../CodePointFilters.cs | 2586 ----------------- .../EncoderExtensions.cs | 22 +- .../EncoderOptions.cs | 7 +- .../EncoderServiceCollectionExtensions.cs | 4 +- .../EncoderServiceProviderExtensions.cs} | 4 +- .../EncoderServices.cs | 12 +- .../HtmlEncoder.cs | 23 +- .../IHtmlEncoder.cs | 3 +- .../IJavaScriptStringEncoder.cs | 7 + .../JavaScriptStringEncoder.cs | 23 +- .../UnicodeBlock.cs | 66 + .../UnicodeBlocks.cs | 64 + .../UnicodeBlocks.generated.cs | 2336 +++++++++++++++ .../UnicodeEncoderBase.cs | 70 +- .../UrlEncoder.cs | 23 +- .../project.json | 3 + 19 files changed, 2922 insertions(+), 2671 deletions(-) create mode 100644 src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs create mode 100644 src/Microsoft.Framework.WebEncoders/CodePointFilter.cs delete mode 100644 src/Microsoft.Framework.WebEncoders/CodePointFilters.cs rename src/{Microsoft.AspNet.Http.Extensions/Encoders => Microsoft.Framework.WebEncoders}/EncoderOptions.cs (65%) rename src/{Microsoft.AspNet.Http.Extensions/Encoders => Microsoft.Framework.WebEncoders}/EncoderServiceCollectionExtensions.cs (96%) rename src/{Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs => Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs} (95%) rename src/{Microsoft.AspNet.Http.Extensions/Encoders => Microsoft.Framework.WebEncoders}/EncoderServices.cs (73%) create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index cb0f113bcd..be234399ec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,9 +3,7 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.WebEncoders": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs new file mode 100644 index 0000000000..475c47a2b0 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; + +namespace Microsoft.Framework.WebEncoders +{ + internal struct AllowedCharsBitmap + { + private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); + private uint[] _allowedCharsBitmap; + + public AllowedCharsBitmap() + { + _allowedCharsBitmap = new uint[ALLOWED_CHARS_BITMAP_LENGTH]; + } + + // Marks a character as allowed (can be returned unencoded) + public void AllowCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] |= 0x1U << offset; + } + + public AllowedCharsBitmap Clone() + { + AllowedCharsBitmap retVal; + retVal._allowedCharsBitmap = (uint[])this._allowedCharsBitmap.Clone(); + return retVal; + } + + // Marks a character as forbidden (must be returned encoded) + public void ForbidCharacter(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + _allowedCharsBitmap[index] &= ~(0x1U << offset); + } + + public void ForbidUndefinedCharacters() + { + // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed + // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) + uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); + Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); + for (int i = 0; i < _allowedCharsBitmap.Length; i++) + { + _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; + } + } + + // Determines whether the given character can be returned unencoded. + public bool IsCharacterAllowed(char c) + { + uint codePoint = (uint)c; + int index = (int)(codePoint >> 5); + int offset = (int)(codePoint & 0x1FU); + return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs new file mode 100644 index 0000000000..97a43b803b --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -0,0 +1,273 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.Framework.Internal; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Represents a filter which allows only certain Unicode code points through. + /// + public sealed class CodePointFilter : ICodePointFilter + { + private AllowedCharsBitmap _allowedCharsBitmap; + + /// + /// Instantiates the filter allowing only the 'Basic Latin' block of characters through. + /// + public CodePointFilter() + { + _allowedCharsBitmap = new AllowedCharsBitmap(); + AllowBlock(UnicodeBlocks.BasicLatin); + } + + /// + /// Instantiates the filter by cloning the allow list of another filter. + /// + public CodePointFilter([NotNull] ICodePointFilter other) + { + CodePointFilter otherAsCodePointFilter = other as CodePointFilter; + if (otherAsCodePointFilter != null) + { + _allowedCharsBitmap = otherAsCodePointFilter.GetAllowedCharsBitmap(); + } + else + { + _allowedCharsBitmap = new AllowedCharsBitmap(); + AllowFilter(other); + } + } + + /// + /// Instantiates the filter where only the provided Unicode character blocks are + /// allowed by the filter. + /// + /// + public CodePointFilter(params UnicodeBlock[] allowedBlocks) + { + _allowedCharsBitmap = new AllowedCharsBitmap(); + AllowBlocks(allowedBlocks); + } + + /// + /// Allows all characters in the specified Unicode character block through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowBlock([NotNull] UnicodeBlock block) + { + int firstCodePoint = block.FirstCodePoint; + int blockSize = block.BlockSize; + for (int i = 0; i < blockSize; i++) + { + _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Allows all characters in the specified Unicode character blocks through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowBlocks(params UnicodeBlock[] blocks) + { + if (blocks != null) + { + for (int i = 0; i < blocks.Length; i++) + { + AllowBlock(blocks[i]); + } + } + return this; + } + + /// + /// Allows the specified character through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowChar(char c) + { + _allowedCharsBitmap.AllowCharacter(c); + return this; + } + + /// + /// Allows the specified characters through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowChars(params char[] chars) + { + if (chars != null) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.AllowCharacter(chars[i]); + } + } + return this; + } + + /// + /// Allows all characters in the specified string through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowChars([NotNull] string chars) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.AllowCharacter(chars[i]); + } + return this; + } + + /// + /// Allows all characters approved by the specified filter through this filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowFilter([NotNull] ICodePointFilter filter) + { + foreach (var allowedCodePoint in filter.GetAllowedCodePoints()) + { + // If the code point can't be represented as a BMP character, skip it. + char codePointAsChar = (char)allowedCodePoint; + if (allowedCodePoint == codePointAsChar) + { + _allowedCharsBitmap.AllowCharacter(codePointAsChar); + } + } + return this; + } + + /// + /// Disallows all characters in the specified Unicode character block through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidBlock([NotNull] UnicodeBlock block) + { + int firstCodePoint = block.FirstCodePoint; + int blockSize = block.BlockSize; + for (int i = 0; i < blockSize; i++) + { + _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Disallows all characters in the specified Unicode character blocks through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidBlocks(params UnicodeBlock[] blocks) + { + if (blocks != null) + { + for (int i = 0; i < blocks.Length; i++) + { + ForbidBlock(blocks[i]); + } + } + return this; + } + + /// + /// Disallows the specified character through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidChar(char c) + { + _allowedCharsBitmap.ForbidCharacter(c); + return this; + } + + /// + /// Disallows the specified characters through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidChars(params char[] chars) + { + if (chars != null) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.ForbidCharacter(chars[i]); + } + } + return this; + } + + /// + /// Disallows all characters in the specified string through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidChars([NotNull] string chars) + { + for (int i = 0; i < chars.Length; i++) + { + _allowedCharsBitmap.ForbidCharacter(chars[i]); + } + return this; + } + + /// + /// Retrieves the bitmap of allowed characters from this filter. + /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification. + /// + internal AllowedCharsBitmap GetAllowedCharsBitmap() + { + return _allowedCharsBitmap.Clone(); + } + + /// + /// Gets an enumeration of all allowed code points. + /// + public IEnumerable GetAllowedCodePoints() + { + for (int i = 0; i < 0x10000; i++) + { + if (_allowedCharsBitmap.IsCharacterAllowed((char)i)) + { + yield return i; + } + } + } + + /// + /// Returns a value stating whether the given character is allowed through the filter. + /// + public bool IsCharacterAllowed(char c) + { + return _allowedCharsBitmap.IsCharacterAllowed(c); + } + + /// + /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible. + /// + internal static CodePointFilter Wrap(ICodePointFilter filter) + { + return (filter as CodePointFilter) ?? new CodePointFilter(filter); + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs deleted file mode 100644 index 781636916c..0000000000 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilters.cs +++ /dev/null @@ -1,2586 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Contains predefined Unicode code point filters. - /// - public static class CodePointFilters - { - /// - /// A filter which allows no characters. - /// - public static ICodePointFilter None - { - get - { - return LazyInitializer.EnsureInitialized(ref _none); - } - } - private static EmptyCodePointFilter _none; - - /// - /// A filter which allows all Unicode Basic Multilingual Plane characters. - /// - /// - /// This range spans the code points U+0000 .. U+FFFF. - /// - public static ICodePointFilter All - { - get - { - return GetFilter(ref _all, first: '\u0000', last: '\uFFFF'); - } - } - private static DefinedCharacterCodePointFilter _all; - - /// - /// A filter which allows characters in the 'Basic Latin' Unicode range. - /// - /// - /// This range spans the code points U+0000 .. U+007F. - /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BasicLatin - { - get - { - return GetFilter(ref _basicLatin, first: '\u0000', last: '\u007F'); - } - } - private static DefinedCharacterCodePointFilter _basicLatin; - - /// - /// A filter which allows characters in the 'Latin-1 Supplement' Unicode range. - /// - /// - /// This range spans the code points U+0080 .. U+00FF. - /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Latin1Supplement - { - get - { - return GetFilter(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); - } - } - private static DefinedCharacterCodePointFilter _latin1Supplement; - - /// - /// A filter which allows characters in the 'Latin Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+0100 .. U+017F. - /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedA - { - get - { - return GetFilter(ref _latinExtendedA, first: '\u0100', last: '\u017F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedA; - - /// - /// A filter which allows characters in the 'Latin Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+0180 .. U+024F. - /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedB - { - get - { - return GetFilter(ref _latinExtendedB, first: '\u0180', last: '\u024F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedB; - - /// - /// A filter which allows characters in the 'IPA Extensions' Unicode range. - /// - /// - /// This range spans the code points U+0250 .. U+02AF. - /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this range. - /// - public static ICodePointFilter IPAExtensions - { - get - { - return GetFilter(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); - } - } - private static DefinedCharacterCodePointFilter _ipaExtensions; - - /// - /// A filter which allows characters in the 'Spacing Modifier Letters' Unicode range. - /// - /// - /// This range spans the code points U+02B0 .. U+02FF. - /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SpacingModifierLetters - { - get - { - return GetFilter(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); - } - } - private static DefinedCharacterCodePointFilter _spacingModifierLetters; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks' Unicode range. - /// - /// - /// This range spans the code points U+0300 .. U+036F. - /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarks - { - get - { - return GetFilter(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarks; - - /// - /// A filter which allows characters in the 'Greek and Coptic' Unicode range. - /// - /// - /// This range spans the code points U+0370 .. U+03FF. - /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GreekandCoptic - { - get - { - return GetFilter(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); - } - } - private static DefinedCharacterCodePointFilter _greekandCoptic; - - /// - /// A filter which allows characters in the 'Cyrillic' Unicode range. - /// - /// - /// This range spans the code points U+0400 .. U+04FF. - /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Cyrillic - { - get - { - return GetFilter(ref _cyrillic, first: '\u0400', last: '\u04FF'); - } - } - private static DefinedCharacterCodePointFilter _cyrillic; - - /// - /// A filter which allows characters in the 'Cyrillic Supplement' Unicode range. - /// - /// - /// This range spans the code points U+0500 .. U+052F. - /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CyrillicSupplement - { - get - { - return GetFilter(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); - } - } - private static DefinedCharacterCodePointFilter _cyrillicSupplement; - - /// - /// A filter which allows characters in the 'Armenian' Unicode range. - /// - /// - /// This range spans the code points U+0530 .. U+058F. - /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Armenian - { - get - { - return GetFilter(ref _armenian, first: '\u0530', last: '\u058F'); - } - } - private static DefinedCharacterCodePointFilter _armenian; - - /// - /// A filter which allows characters in the 'Hebrew' Unicode range. - /// - /// - /// This range spans the code points U+0590 .. U+05FF. - /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Hebrew - { - get - { - return GetFilter(ref _hebrew, first: '\u0590', last: '\u05FF'); - } - } - private static DefinedCharacterCodePointFilter _hebrew; - - /// - /// A filter which allows characters in the 'Arabic' Unicode range. - /// - /// - /// This range spans the code points U+0600 .. U+06FF. - /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Arabic - { - get - { - return GetFilter(ref _arabic, first: '\u0600', last: '\u06FF'); - } - } - private static DefinedCharacterCodePointFilter _arabic; - - /// - /// A filter which allows characters in the 'Syriac' Unicode range. - /// - /// - /// This range spans the code points U+0700 .. U+074F. - /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Syriac - { - get - { - return GetFilter(ref _syriac, first: '\u0700', last: '\u074F'); - } - } - private static DefinedCharacterCodePointFilter _syriac; - - /// - /// A filter which allows characters in the 'Arabic Supplement' Unicode range. - /// - /// - /// This range spans the code points U+0750 .. U+077F. - /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicSupplement - { - get - { - return GetFilter(ref _arabicSupplement, first: '\u0750', last: '\u077F'); - } - } - private static DefinedCharacterCodePointFilter _arabicSupplement; - - /// - /// A filter which allows characters in the 'Thaana' Unicode range. - /// - /// - /// This range spans the code points U+0780 .. U+07BF. - /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Thaana - { - get - { - return GetFilter(ref _thaana, first: '\u0780', last: '\u07BF'); - } - } - private static DefinedCharacterCodePointFilter _thaana; - - /// - /// A filter which allows characters in the 'NKo' Unicode range. - /// - /// - /// This range spans the code points U+07C0 .. U+07FF. - /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter NKo - { - get - { - return GetFilter(ref _nKo, first: '\u07C0', last: '\u07FF'); - } - } - private static DefinedCharacterCodePointFilter _nKo; - - /// - /// A filter which allows characters in the 'Samaritan' Unicode range. - /// - /// - /// This range spans the code points U+0800 .. U+083F. - /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Samaritan - { - get - { - return GetFilter(ref _samaritan, first: '\u0800', last: '\u083F'); - } - } - private static DefinedCharacterCodePointFilter _samaritan; - - /// - /// A filter which allows characters in the 'Mandaic' Unicode range. - /// - /// - /// This range spans the code points U+0840 .. U+085F. - /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Mandaic - { - get - { - return GetFilter(ref _mandaic, first: '\u0840', last: '\u085F'); - } - } - private static DefinedCharacterCodePointFilter _mandaic; - - /// - /// A filter which allows characters in the 'Arabic Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+08A0 .. U+08FF. - /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicExtendedA - { - get - { - return GetFilter(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); - } - } - private static DefinedCharacterCodePointFilter _arabicExtendedA; - - /// - /// A filter which allows characters in the 'Devanagari' Unicode range. - /// - /// - /// This range spans the code points U+0900 .. U+097F. - /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Devanagari - { - get - { - return GetFilter(ref _devanagari, first: '\u0900', last: '\u097F'); - } - } - private static DefinedCharacterCodePointFilter _devanagari; - - /// - /// A filter which allows characters in the 'Bengali' Unicode range. - /// - /// - /// This range spans the code points U+0980 .. U+09FF. - /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Bengali - { - get - { - return GetFilter(ref _bengali, first: '\u0980', last: '\u09FF'); - } - } - private static DefinedCharacterCodePointFilter _bengali; - - /// - /// A filter which allows characters in the 'Gurmukhi' Unicode range. - /// - /// - /// This range spans the code points U+0A00 .. U+0A7F. - /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Gurmukhi - { - get - { - return GetFilter(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); - } - } - private static DefinedCharacterCodePointFilter _gurmukhi; - - /// - /// A filter which allows characters in the 'Gujarati' Unicode range. - /// - /// - /// This range spans the code points U+0A80 .. U+0AFF. - /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Gujarati - { - get - { - return GetFilter(ref _gujarati, first: '\u0A80', last: '\u0AFF'); - } - } - private static DefinedCharacterCodePointFilter _gujarati; - - /// - /// A filter which allows characters in the 'Oriya' Unicode range. - /// - /// - /// This range spans the code points U+0B00 .. U+0B7F. - /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Oriya - { - get - { - return GetFilter(ref _oriya, first: '\u0B00', last: '\u0B7F'); - } - } - private static DefinedCharacterCodePointFilter _oriya; - - /// - /// A filter which allows characters in the 'Tamil' Unicode range. - /// - /// - /// This range spans the code points U+0B80 .. U+0BFF. - /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tamil - { - get - { - return GetFilter(ref _tamil, first: '\u0B80', last: '\u0BFF'); - } - } - private static DefinedCharacterCodePointFilter _tamil; - - /// - /// A filter which allows characters in the 'Telugu' Unicode range. - /// - /// - /// This range spans the code points U+0C00 .. U+0C7F. - /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Telugu - { - get - { - return GetFilter(ref _telugu, first: '\u0C00', last: '\u0C7F'); - } - } - private static DefinedCharacterCodePointFilter _telugu; - - /// - /// A filter which allows characters in the 'Kannada' Unicode range. - /// - /// - /// This range spans the code points U+0C80 .. U+0CFF. - /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Kannada - { - get - { - return GetFilter(ref _kannada, first: '\u0C80', last: '\u0CFF'); - } - } - private static DefinedCharacterCodePointFilter _kannada; - - /// - /// A filter which allows characters in the 'Malayalam' Unicode range. - /// - /// - /// This range spans the code points U+0D00 .. U+0D7F. - /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Malayalam - { - get - { - return GetFilter(ref _malayalam, first: '\u0D00', last: '\u0D7F'); - } - } - private static DefinedCharacterCodePointFilter _malayalam; - - /// - /// A filter which allows characters in the 'Sinhala' Unicode range. - /// - /// - /// This range spans the code points U+0D80 .. U+0DFF. - /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Sinhala - { - get - { - return GetFilter(ref _sinhala, first: '\u0D80', last: '\u0DFF'); - } - } - private static DefinedCharacterCodePointFilter _sinhala; - - /// - /// A filter which allows characters in the 'Thai' Unicode range. - /// - /// - /// This range spans the code points U+0E00 .. U+0E7F. - /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Thai - { - get - { - return GetFilter(ref _thai, first: '\u0E00', last: '\u0E7F'); - } - } - private static DefinedCharacterCodePointFilter _thai; - - /// - /// A filter which allows characters in the 'Lao' Unicode range. - /// - /// - /// This range spans the code points U+0E80 .. U+0EFF. - /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Lao - { - get - { - return GetFilter(ref _lao, first: '\u0E80', last: '\u0EFF'); - } - } - private static DefinedCharacterCodePointFilter _lao; - - /// - /// A filter which allows characters in the 'Tibetan' Unicode range. - /// - /// - /// This range spans the code points U+0F00 .. U+0FFF. - /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tibetan - { - get - { - return GetFilter(ref _tibetan, first: '\u0F00', last: '\u0FFF'); - } - } - private static DefinedCharacterCodePointFilter _tibetan; - - /// - /// A filter which allows characters in the 'Myanmar' Unicode range. - /// - /// - /// This range spans the code points U+1000 .. U+109F. - /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Myanmar - { - get - { - return GetFilter(ref _myanmar, first: '\u1000', last: '\u109F'); - } - } - private static DefinedCharacterCodePointFilter _myanmar; - - /// - /// A filter which allows characters in the 'Georgian' Unicode range. - /// - /// - /// This range spans the code points U+10A0 .. U+10FF. - /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Georgian - { - get - { - return GetFilter(ref _georgian, first: '\u10A0', last: '\u10FF'); - } - } - private static DefinedCharacterCodePointFilter _georgian; - - /// - /// A filter which allows characters in the 'Hangul Jamo' Unicode range. - /// - /// - /// This range spans the code points U+1100 .. U+11FF. - /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulJamo - { - get - { - return GetFilter(ref _hangulJamo, first: '\u1100', last: '\u11FF'); - } - } - private static DefinedCharacterCodePointFilter _hangulJamo; - - /// - /// A filter which allows characters in the 'Ethiopic' Unicode range. - /// - /// - /// This range spans the code points U+1200 .. U+137F. - /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Ethiopic - { - get - { - return GetFilter(ref _ethiopic, first: '\u1200', last: '\u137F'); - } - } - private static DefinedCharacterCodePointFilter _ethiopic; - - /// - /// A filter which allows characters in the 'Ethiopic Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1380 .. U+139F. - /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EthiopicSupplement - { - get - { - return GetFilter(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); - } - } - private static DefinedCharacterCodePointFilter _ethiopicSupplement; - - /// - /// A filter which allows characters in the 'Cherokee' Unicode range. - /// - /// - /// This range spans the code points U+13A0 .. U+13FF. - /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Cherokee - { - get - { - return GetFilter(ref _cherokee, first: '\u13A0', last: '\u13FF'); - } - } - private static DefinedCharacterCodePointFilter _cherokee; - - /// - /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics' Unicode range. - /// - /// - /// This range spans the code points U+1400 .. U+167F. - /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter UnifiedCanadianAboriginalSyllabics - { - get - { - return GetFilter(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); - } - } - private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabics; - - /// - /// A filter which allows characters in the 'Ogham' Unicode range. - /// - /// - /// This range spans the code points U+1680 .. U+169F. - /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Ogham - { - get - { - return GetFilter(ref _ogham, first: '\u1680', last: '\u169F'); - } - } - private static DefinedCharacterCodePointFilter _ogham; - - /// - /// A filter which allows characters in the 'Runic' Unicode range. - /// - /// - /// This range spans the code points U+16A0 .. U+16FF. - /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Runic - { - get - { - return GetFilter(ref _runic, first: '\u16A0', last: '\u16FF'); - } - } - private static DefinedCharacterCodePointFilter _runic; - - /// - /// A filter which allows characters in the 'Tagalog' Unicode range. - /// - /// - /// This range spans the code points U+1700 .. U+171F. - /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tagalog - { - get - { - return GetFilter(ref _tagalog, first: '\u1700', last: '\u171F'); - } - } - private static DefinedCharacterCodePointFilter _tagalog; - - /// - /// A filter which allows characters in the 'Hanunoo' Unicode range. - /// - /// - /// This range spans the code points U+1720 .. U+173F. - /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Hanunoo - { - get - { - return GetFilter(ref _hanunoo, first: '\u1720', last: '\u173F'); - } - } - private static DefinedCharacterCodePointFilter _hanunoo; - - /// - /// A filter which allows characters in the 'Buhid' Unicode range. - /// - /// - /// This range spans the code points U+1740 .. U+175F. - /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Buhid - { - get - { - return GetFilter(ref _buhid, first: '\u1740', last: '\u175F'); - } - } - private static DefinedCharacterCodePointFilter _buhid; - - /// - /// A filter which allows characters in the 'Tagbanwa' Unicode range. - /// - /// - /// This range spans the code points U+1760 .. U+177F. - /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tagbanwa - { - get - { - return GetFilter(ref _tagbanwa, first: '\u1760', last: '\u177F'); - } - } - private static DefinedCharacterCodePointFilter _tagbanwa; - - /// - /// A filter which allows characters in the 'Khmer' Unicode range. - /// - /// - /// This range spans the code points U+1780 .. U+17FF. - /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Khmer - { - get - { - return GetFilter(ref _khmer, first: '\u1780', last: '\u17FF'); - } - } - private static DefinedCharacterCodePointFilter _khmer; - - /// - /// A filter which allows characters in the 'Mongolian' Unicode range. - /// - /// - /// This range spans the code points U+1800 .. U+18AF. - /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Mongolian - { - get - { - return GetFilter(ref _mongolian, first: '\u1800', last: '\u18AF'); - } - } - private static DefinedCharacterCodePointFilter _mongolian; - - /// - /// A filter which allows characters in the 'Unified Canadian Aboriginal Syllabics Extended' Unicode range. - /// - /// - /// This range spans the code points U+18B0 .. U+18FF. - /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter UnifiedCanadianAboriginalSyllabicsExtended - { - get - { - return GetFilter(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); - } - } - private static DefinedCharacterCodePointFilter _unifiedCanadianAboriginalSyllabicsExtended; - - /// - /// A filter which allows characters in the 'Limbu' Unicode range. - /// - /// - /// This range spans the code points U+1900 .. U+194F. - /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Limbu - { - get - { - return GetFilter(ref _limbu, first: '\u1900', last: '\u194F'); - } - } - private static DefinedCharacterCodePointFilter _limbu; - - /// - /// A filter which allows characters in the 'Tai Le' Unicode range. - /// - /// - /// This range spans the code points U+1950 .. U+197F. - /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this range. - /// - public static ICodePointFilter TaiLe - { - get - { - return GetFilter(ref _taiLe, first: '\u1950', last: '\u197F'); - } - } - private static DefinedCharacterCodePointFilter _taiLe; - - /// - /// A filter which allows characters in the 'New Tai Lue' Unicode range. - /// - /// - /// This range spans the code points U+1980 .. U+19DF. - /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter NewTaiLue - { - get - { - return GetFilter(ref _newTaiLue, first: '\u1980', last: '\u19DF'); - } - } - private static DefinedCharacterCodePointFilter _newTaiLue; - - /// - /// A filter which allows characters in the 'Khmer Symbols' Unicode range. - /// - /// - /// This range spans the code points U+19E0 .. U+19FF. - /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KhmerSymbols - { - get - { - return GetFilter(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); - } - } - private static DefinedCharacterCodePointFilter _khmerSymbols; - - /// - /// A filter which allows characters in the 'Buginese' Unicode range. - /// - /// - /// This range spans the code points U+1A00 .. U+1A1F. - /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Buginese - { - get - { - return GetFilter(ref _buginese, first: '\u1A00', last: '\u1A1F'); - } - } - private static DefinedCharacterCodePointFilter _buginese; - - /// - /// A filter which allows characters in the 'Tai Tham' Unicode range. - /// - /// - /// This range spans the code points U+1A20 .. U+1AAF. - /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this range. - /// - public static ICodePointFilter TaiTham - { - get - { - return GetFilter(ref _taiTham, first: '\u1A20', last: '\u1AAF'); - } - } - private static DefinedCharacterCodePointFilter _taiTham; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks Extended' Unicode range. - /// - /// - /// This range spans the code points U+1AB0 .. U+1AFF. - /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarksExtended - { - get - { - return GetFilter(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksExtended; - - /// - /// A filter which allows characters in the 'Balinese' Unicode range. - /// - /// - /// This range spans the code points U+1B00 .. U+1B7F. - /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Balinese - { - get - { - return GetFilter(ref _balinese, first: '\u1B00', last: '\u1B7F'); - } - } - private static DefinedCharacterCodePointFilter _balinese; - - /// - /// A filter which allows characters in the 'Sundanese' Unicode range. - /// - /// - /// This range spans the code points U+1B80 .. U+1BBF. - /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Sundanese - { - get - { - return GetFilter(ref _sundanese, first: '\u1B80', last: '\u1BBF'); - } - } - private static DefinedCharacterCodePointFilter _sundanese; - - /// - /// A filter which allows characters in the 'Batak' Unicode range. - /// - /// - /// This range spans the code points U+1BC0 .. U+1BFF. - /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Batak - { - get - { - return GetFilter(ref _batak, first: '\u1BC0', last: '\u1BFF'); - } - } - private static DefinedCharacterCodePointFilter _batak; - - /// - /// A filter which allows characters in the 'Lepcha' Unicode range. - /// - /// - /// This range spans the code points U+1C00 .. U+1C4F. - /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Lepcha - { - get - { - return GetFilter(ref _lepcha, first: '\u1C00', last: '\u1C4F'); - } - } - private static DefinedCharacterCodePointFilter _lepcha; - - /// - /// A filter which allows characters in the 'Ol Chiki' Unicode range. - /// - /// - /// This range spans the code points U+1C50 .. U+1C7F. - /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this range. - /// - public static ICodePointFilter OlChiki - { - get - { - return GetFilter(ref _olChiki, first: '\u1C50', last: '\u1C7F'); - } - } - private static DefinedCharacterCodePointFilter _olChiki; - - /// - /// A filter which allows characters in the 'Sundanese Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1CC0 .. U+1CCF. - /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SundaneseSupplement - { - get - { - return GetFilter(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); - } - } - private static DefinedCharacterCodePointFilter _sundaneseSupplement; - - /// - /// A filter which allows characters in the 'Vedic Extensions' Unicode range. - /// - /// - /// This range spans the code points U+1CD0 .. U+1CFF. - /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter VedicExtensions - { - get - { - return GetFilter(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); - } - } - private static DefinedCharacterCodePointFilter _vedicExtensions; - - /// - /// A filter which allows characters in the 'Phonetic Extensions' Unicode range. - /// - /// - /// This range spans the code points U+1D00 .. U+1D7F. - /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter PhoneticExtensions - { - get - { - return GetFilter(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); - } - } - private static DefinedCharacterCodePointFilter _phoneticExtensions; - - /// - /// A filter which allows characters in the 'Phonetic Extensions Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1D80 .. U+1DBF. - /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter PhoneticExtensionsSupplement - { - get - { - return GetFilter(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); - } - } - private static DefinedCharacterCodePointFilter _phoneticExtensionsSupplement; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks Supplement' Unicode range. - /// - /// - /// This range spans the code points U+1DC0 .. U+1DFF. - /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarksSupplement - { - get - { - return GetFilter(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksSupplement; - - /// - /// A filter which allows characters in the 'Latin Extended Additional' Unicode range. - /// - /// - /// This range spans the code points U+1E00 .. U+1EFF. - /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedAdditional - { - get - { - return GetFilter(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedAdditional; - - /// - /// A filter which allows characters in the 'Greek Extended' Unicode range. - /// - /// - /// This range spans the code points U+1F00 .. U+1FFF. - /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GreekExtended - { - get - { - return GetFilter(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); - } - } - private static DefinedCharacterCodePointFilter _greekExtended; - - /// - /// A filter which allows characters in the 'General Punctuation' Unicode range. - /// - /// - /// This range spans the code points U+2000 .. U+206F. - /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GeneralPunctuation - { - get - { - return GetFilter(ref _generalPunctuation, first: '\u2000', last: '\u206F'); - } - } - private static DefinedCharacterCodePointFilter _generalPunctuation; - - /// - /// A filter which allows characters in the 'Superscripts and Subscripts' Unicode range. - /// - /// - /// This range spans the code points U+2070 .. U+209F. - /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SuperscriptsandSubscripts - { - get - { - return GetFilter(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); - } - } - private static DefinedCharacterCodePointFilter _superscriptsandSubscripts; - - /// - /// A filter which allows characters in the 'Currency Symbols' Unicode range. - /// - /// - /// This range spans the code points U+20A0 .. U+20CF. - /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CurrencySymbols - { - get - { - return GetFilter(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); - } - } - private static DefinedCharacterCodePointFilter _currencySymbols; - - /// - /// A filter which allows characters in the 'Combining Diacritical Marks for Symbols' Unicode range. - /// - /// - /// This range spans the code points U+20D0 .. U+20FF. - /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningDiacriticalMarksforSymbols - { - get - { - return GetFilter(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); - } - } - private static DefinedCharacterCodePointFilter _combiningDiacriticalMarksforSymbols; - - /// - /// A filter which allows characters in the 'Letterlike Symbols' Unicode range. - /// - /// - /// This range spans the code points U+2100 .. U+214F. - /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LetterlikeSymbols - { - get - { - return GetFilter(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); - } - } - private static DefinedCharacterCodePointFilter _letterlikeSymbols; - - /// - /// A filter which allows characters in the 'Number Forms' Unicode range. - /// - /// - /// This range spans the code points U+2150 .. U+218F. - /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this range. - /// - public static ICodePointFilter NumberForms - { - get - { - return GetFilter(ref _numberForms, first: '\u2150', last: '\u218F'); - } - } - private static DefinedCharacterCodePointFilter _numberForms; - - /// - /// A filter which allows characters in the 'Arrows' Unicode range. - /// - /// - /// This range spans the code points U+2190 .. U+21FF. - /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Arrows - { - get - { - return GetFilter(ref _arrows, first: '\u2190', last: '\u21FF'); - } - } - private static DefinedCharacterCodePointFilter _arrows; - - /// - /// A filter which allows characters in the 'Mathematical Operators' Unicode range. - /// - /// - /// This range spans the code points U+2200 .. U+22FF. - /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MathematicalOperators - { - get - { - return GetFilter(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); - } - } - private static DefinedCharacterCodePointFilter _mathematicalOperators; - - /// - /// A filter which allows characters in the 'Miscellaneous Technical' Unicode range. - /// - /// - /// This range spans the code points U+2300 .. U+23FF. - /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousTechnical - { - get - { - return GetFilter(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousTechnical; - - /// - /// A filter which allows characters in the 'Control Pictures' Unicode range. - /// - /// - /// This range spans the code points U+2400 .. U+243F. - /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ControlPictures - { - get - { - return GetFilter(ref _controlPictures, first: '\u2400', last: '\u243F'); - } - } - private static DefinedCharacterCodePointFilter _controlPictures; - - /// - /// A filter which allows characters in the 'Optical Character Recognition' Unicode range. - /// - /// - /// This range spans the code points U+2440 .. U+245F. - /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this range. - /// - public static ICodePointFilter OpticalCharacterRecognition - { - get - { - return GetFilter(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); - } - } - private static DefinedCharacterCodePointFilter _opticalCharacterRecognition; - - /// - /// A filter which allows characters in the 'Enclosed Alphanumerics' Unicode range. - /// - /// - /// This range spans the code points U+2460 .. U+24FF. - /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EnclosedAlphanumerics - { - get - { - return GetFilter(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); - } - } - private static DefinedCharacterCodePointFilter _enclosedAlphanumerics; - - /// - /// A filter which allows characters in the 'Box Drawing' Unicode range. - /// - /// - /// This range spans the code points U+2500 .. U+257F. - /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BoxDrawing - { - get - { - return GetFilter(ref _boxDrawing, first: '\u2500', last: '\u257F'); - } - } - private static DefinedCharacterCodePointFilter _boxDrawing; - - /// - /// A filter which allows characters in the 'Block Elements' Unicode range. - /// - /// - /// This range spans the code points U+2580 .. U+259F. - /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BlockElements - { - get - { - return GetFilter(ref _blockElements, first: '\u2580', last: '\u259F'); - } - } - private static DefinedCharacterCodePointFilter _blockElements; - - /// - /// A filter which allows characters in the 'Geometric Shapes' Unicode range. - /// - /// - /// This range spans the code points U+25A0 .. U+25FF. - /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GeometricShapes - { - get - { - return GetFilter(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); - } - } - private static DefinedCharacterCodePointFilter _geometricShapes; - - /// - /// A filter which allows characters in the 'Miscellaneous Symbols' Unicode range. - /// - /// - /// This range spans the code points U+2600 .. U+26FF. - /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousSymbols - { - get - { - return GetFilter(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousSymbols; - - /// - /// A filter which allows characters in the 'Dingbats' Unicode range. - /// - /// - /// This range spans the code points U+2700 .. U+27BF. - /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Dingbats - { - get - { - return GetFilter(ref _dingbats, first: '\u2700', last: '\u27BF'); - } - } - private static DefinedCharacterCodePointFilter _dingbats; - - /// - /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-A' Unicode range. - /// - /// - /// This range spans the code points U+27C0 .. U+27EF. - /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousMathematicalSymbolsA - { - get - { - return GetFilter(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsA; - - /// - /// A filter which allows characters in the 'Supplemental Arrows-A' Unicode range. - /// - /// - /// This range spans the code points U+27F0 .. U+27FF. - /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalArrowsA - { - get - { - return GetFilter(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); - } - } - private static DefinedCharacterCodePointFilter _supplementalArrowsA; - - /// - /// A filter which allows characters in the 'Braille Patterns' Unicode range. - /// - /// - /// This range spans the code points U+2800 .. U+28FF. - /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BraillePatterns - { - get - { - return GetFilter(ref _braillePatterns, first: '\u2800', last: '\u28FF'); - } - } - private static DefinedCharacterCodePointFilter _braillePatterns; - - /// - /// A filter which allows characters in the 'Supplemental Arrows-B' Unicode range. - /// - /// - /// This range spans the code points U+2900 .. U+297F. - /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalArrowsB - { - get - { - return GetFilter(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); - } - } - private static DefinedCharacterCodePointFilter _supplementalArrowsB; - - /// - /// A filter which allows characters in the 'Miscellaneous Mathematical Symbols-B' Unicode range. - /// - /// - /// This range spans the code points U+2980 .. U+29FF. - /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousMathematicalSymbolsB - { - get - { - return GetFilter(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousMathematicalSymbolsB; - - /// - /// A filter which allows characters in the 'Supplemental Mathematical Operators' Unicode range. - /// - /// - /// This range spans the code points U+2A00 .. U+2AFF. - /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalMathematicalOperators - { - get - { - return GetFilter(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); - } - } - private static DefinedCharacterCodePointFilter _supplementalMathematicalOperators; - - /// - /// A filter which allows characters in the 'Miscellaneous Symbols and Arrows' Unicode range. - /// - /// - /// This range spans the code points U+2B00 .. U+2BFF. - /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MiscellaneousSymbolsandArrows - { - get - { - return GetFilter(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); - } - } - private static DefinedCharacterCodePointFilter _miscellaneousSymbolsandArrows; - - /// - /// A filter which allows characters in the 'Glagolitic' Unicode range. - /// - /// - /// This range spans the code points U+2C00 .. U+2C5F. - /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Glagolitic - { - get - { - return GetFilter(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); - } - } - private static DefinedCharacterCodePointFilter _glagolitic; - - /// - /// A filter which allows characters in the 'Latin Extended-C' Unicode range. - /// - /// - /// This range spans the code points U+2C60 .. U+2C7F. - /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedC - { - get - { - return GetFilter(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedC; - - /// - /// A filter which allows characters in the 'Coptic' Unicode range. - /// - /// - /// This range spans the code points U+2C80 .. U+2CFF. - /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Coptic - { - get - { - return GetFilter(ref _coptic, first: '\u2C80', last: '\u2CFF'); - } - } - private static DefinedCharacterCodePointFilter _coptic; - - /// - /// A filter which allows characters in the 'Georgian Supplement' Unicode range. - /// - /// - /// This range spans the code points U+2D00 .. U+2D2F. - /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter GeorgianSupplement - { - get - { - return GetFilter(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); - } - } - private static DefinedCharacterCodePointFilter _georgianSupplement; - - /// - /// A filter which allows characters in the 'Tifinagh' Unicode range. - /// - /// - /// This range spans the code points U+2D30 .. U+2D7F. - /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Tifinagh - { - get - { - return GetFilter(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); - } - } - private static DefinedCharacterCodePointFilter _tifinagh; - - /// - /// A filter which allows characters in the 'Ethiopic Extended' Unicode range. - /// - /// - /// This range spans the code points U+2D80 .. U+2DDF. - /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EthiopicExtended - { - get - { - return GetFilter(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); - } - } - private static DefinedCharacterCodePointFilter _ethiopicExtended; - - /// - /// A filter which allows characters in the 'Cyrillic Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+2DE0 .. U+2DFF. - /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CyrillicExtendedA - { - get - { - return GetFilter(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); - } - } - private static DefinedCharacterCodePointFilter _cyrillicExtendedA; - - /// - /// A filter which allows characters in the 'Supplemental Punctuation' Unicode range. - /// - /// - /// This range spans the code points U+2E00 .. U+2E7F. - /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SupplementalPunctuation - { - get - { - return GetFilter(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); - } - } - private static DefinedCharacterCodePointFilter _supplementalPunctuation; - - /// - /// A filter which allows characters in the 'CJK Radicals Supplement' Unicode range. - /// - /// - /// This range spans the code points U+2E80 .. U+2EFF. - /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKRadicalsSupplement - { - get - { - return GetFilter(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); - } - } - private static DefinedCharacterCodePointFilter _cjkRadicalsSupplement; - - /// - /// A filter which allows characters in the 'Kangxi Radicals' Unicode range. - /// - /// - /// This range spans the code points U+2F00 .. U+2FDF. - /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KangxiRadicals - { - get - { - return GetFilter(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); - } - } - private static DefinedCharacterCodePointFilter _kangxiRadicals; - - /// - /// A filter which allows characters in the 'Ideographic Description Characters' Unicode range. - /// - /// - /// This range spans the code points U+2FF0 .. U+2FFF. - /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter IdeographicDescriptionCharacters - { - get - { - return GetFilter(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); - } - } - private static DefinedCharacterCodePointFilter _ideographicDescriptionCharacters; - - /// - /// A filter which allows characters in the 'CJK Symbols and Punctuation' Unicode range. - /// - /// - /// This range spans the code points U+3000 .. U+303F. - /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKSymbolsandPunctuation - { - get - { - return GetFilter(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); - } - } - private static DefinedCharacterCodePointFilter _cjkSymbolsandPunctuation; - - /// - /// A filter which allows characters in the 'Hiragana' Unicode range. - /// - /// - /// This range spans the code points U+3040 .. U+309F. - /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Hiragana - { - get - { - return GetFilter(ref _hiragana, first: '\u3040', last: '\u309F'); - } - } - private static DefinedCharacterCodePointFilter _hiragana; - - /// - /// A filter which allows characters in the 'Katakana' Unicode range. - /// - /// - /// This range spans the code points U+30A0 .. U+30FF. - /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Katakana - { - get - { - return GetFilter(ref _katakana, first: '\u30A0', last: '\u30FF'); - } - } - private static DefinedCharacterCodePointFilter _katakana; - - /// - /// A filter which allows characters in the 'Bopomofo' Unicode range. - /// - /// - /// This range spans the code points U+3100 .. U+312F. - /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Bopomofo - { - get - { - return GetFilter(ref _bopomofo, first: '\u3100', last: '\u312F'); - } - } - private static DefinedCharacterCodePointFilter _bopomofo; - - /// - /// A filter which allows characters in the 'Hangul Compatibility Jamo' Unicode range. - /// - /// - /// This range spans the code points U+3130 .. U+318F. - /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulCompatibilityJamo - { - get - { - return GetFilter(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); - } - } - private static DefinedCharacterCodePointFilter _hangulCompatibilityJamo; - - /// - /// A filter which allows characters in the 'Kanbun' Unicode range. - /// - /// - /// This range spans the code points U+3190 .. U+319F. - /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Kanbun - { - get - { - return GetFilter(ref _kanbun, first: '\u3190', last: '\u319F'); - } - } - private static DefinedCharacterCodePointFilter _kanbun; - - /// - /// A filter which allows characters in the 'Bopomofo Extended' Unicode range. - /// - /// - /// This range spans the code points U+31A0 .. U+31BF. - /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter BopomofoExtended - { - get - { - return GetFilter(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); - } - } - private static DefinedCharacterCodePointFilter _bopomofoExtended; - - /// - /// A filter which allows characters in the 'CJK Strokes' Unicode range. - /// - /// - /// This range spans the code points U+31C0 .. U+31EF. - /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKStrokes - { - get - { - return GetFilter(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); - } - } - private static DefinedCharacterCodePointFilter _cjkStrokes; - - /// - /// A filter which allows characters in the 'Katakana Phonetic Extensions' Unicode range. - /// - /// - /// This range spans the code points U+31F0 .. U+31FF. - /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KatakanaPhoneticExtensions - { - get - { - return GetFilter(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); - } - } - private static DefinedCharacterCodePointFilter _katakanaPhoneticExtensions; - - /// - /// A filter which allows characters in the 'Enclosed CJK Letters and Months' Unicode range. - /// - /// - /// This range spans the code points U+3200 .. U+32FF. - /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EnclosedCJKLettersandMonths - { - get - { - return GetFilter(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); - } - } - private static DefinedCharacterCodePointFilter _enclosedCJKLettersandMonths; - - /// - /// A filter which allows characters in the 'CJK Compatibility' Unicode range. - /// - /// - /// This range spans the code points U+3300 .. U+33FF. - /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKCompatibility - { - get - { - return GetFilter(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); - } - } - private static DefinedCharacterCodePointFilter _cjkCompatibility; - - /// - /// A filter which allows characters in the 'CJK Unified Ideographs Extension A' Unicode range. - /// - /// - /// This range spans the code points U+3400 .. U+4DBF. - /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKUnifiedIdeographsExtensionA - { - get - { - return GetFilter(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); - } - } - private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographsExtensionA; - - /// - /// A filter which allows characters in the 'Yijing Hexagram Symbols' Unicode range. - /// - /// - /// This range spans the code points U+4DC0 .. U+4DFF. - /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter YijingHexagramSymbols - { - get - { - return GetFilter(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); - } - } - private static DefinedCharacterCodePointFilter _yijingHexagramSymbols; - - /// - /// A filter which allows characters in the 'CJK Unified Ideographs' Unicode range. - /// - /// - /// This range spans the code points U+4E00 .. U+9FFF. - /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKUnifiedIdeographs - { - get - { - return GetFilter(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); - } - } - private static DefinedCharacterCodePointFilter _cjkUnifiedIdeographs; - - /// - /// A filter which allows characters in the 'Yi Syllables' Unicode range. - /// - /// - /// This range spans the code points U+A000 .. U+A48F. - /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this range. - /// - public static ICodePointFilter YiSyllables - { - get - { - return GetFilter(ref _yiSyllables, first: '\uA000', last: '\uA48F'); - } - } - private static DefinedCharacterCodePointFilter _yiSyllables; - - /// - /// A filter which allows characters in the 'Yi Radicals' Unicode range. - /// - /// - /// This range spans the code points U+A490 .. U+A4CF. - /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this range. - /// - public static ICodePointFilter YiRadicals - { - get - { - return GetFilter(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); - } - } - private static DefinedCharacterCodePointFilter _yiRadicals; - - /// - /// A filter which allows characters in the 'Lisu' Unicode range. - /// - /// - /// This range spans the code points U+A4D0 .. U+A4FF. - /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Lisu - { - get - { - return GetFilter(ref _lisu, first: '\uA4D0', last: '\uA4FF'); - } - } - private static DefinedCharacterCodePointFilter _lisu; - - /// - /// A filter which allows characters in the 'Vai' Unicode range. - /// - /// - /// This range spans the code points U+A500 .. U+A63F. - /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Vai - { - get - { - return GetFilter(ref _vai, first: '\uA500', last: '\uA63F'); - } - } - private static DefinedCharacterCodePointFilter _vai; - - /// - /// A filter which allows characters in the 'Cyrillic Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+A640 .. U+A69F. - /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CyrillicExtendedB - { - get - { - return GetFilter(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); - } - } - private static DefinedCharacterCodePointFilter _cyrillicExtendedB; - - /// - /// A filter which allows characters in the 'Bamum' Unicode range. - /// - /// - /// This range spans the code points U+A6A0 .. U+A6FF. - /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Bamum - { - get - { - return GetFilter(ref _bamum, first: '\uA6A0', last: '\uA6FF'); - } - } - private static DefinedCharacterCodePointFilter _bamum; - - /// - /// A filter which allows characters in the 'Modifier Tone Letters' Unicode range. - /// - /// - /// This range spans the code points U+A700 .. U+A71F. - /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ModifierToneLetters - { - get - { - return GetFilter(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); - } - } - private static DefinedCharacterCodePointFilter _modifierToneLetters; - - /// - /// A filter which allows characters in the 'Latin Extended-D' Unicode range. - /// - /// - /// This range spans the code points U+A720 .. U+A7FF. - /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedD - { - get - { - return GetFilter(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedD; - - /// - /// A filter which allows characters in the 'Syloti Nagri' Unicode range. - /// - /// - /// This range spans the code points U+A800 .. U+A82F. - /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SylotiNagri - { - get - { - return GetFilter(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); - } - } - private static DefinedCharacterCodePointFilter _sylotiNagri; - - /// - /// A filter which allows characters in the 'Common Indic Number Forms' Unicode range. - /// - /// - /// This range spans the code points U+A830 .. U+A83F. - /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CommonIndicNumberForms - { - get - { - return GetFilter(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); - } - } - private static DefinedCharacterCodePointFilter _commonIndicNumberForms; - - /// - /// A filter which allows characters in the 'Phags-pa' Unicode range. - /// - /// - /// This range spans the code points U+A840 .. U+A87F. - /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Phagspa - { - get - { - return GetFilter(ref _phagspa, first: '\uA840', last: '\uA87F'); - } - } - private static DefinedCharacterCodePointFilter _phagspa; - - /// - /// A filter which allows characters in the 'Saurashtra' Unicode range. - /// - /// - /// This range spans the code points U+A880 .. U+A8DF. - /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Saurashtra - { - get - { - return GetFilter(ref _saurashtra, first: '\uA880', last: '\uA8DF'); - } - } - private static DefinedCharacterCodePointFilter _saurashtra; - - /// - /// A filter which allows characters in the 'Devanagari Extended' Unicode range. - /// - /// - /// This range spans the code points U+A8E0 .. U+A8FF. - /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter DevanagariExtended - { - get - { - return GetFilter(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); - } - } - private static DefinedCharacterCodePointFilter _devanagariExtended; - - /// - /// A filter which allows characters in the 'Kayah Li' Unicode range. - /// - /// - /// This range spans the code points U+A900 .. U+A92F. - /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter KayahLi - { - get - { - return GetFilter(ref _kayahLi, first: '\uA900', last: '\uA92F'); - } - } - private static DefinedCharacterCodePointFilter _kayahLi; - - /// - /// A filter which allows characters in the 'Rejang' Unicode range. - /// - /// - /// This range spans the code points U+A930 .. U+A95F. - /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Rejang - { - get - { - return GetFilter(ref _rejang, first: '\uA930', last: '\uA95F'); - } - } - private static DefinedCharacterCodePointFilter _rejang; - - /// - /// A filter which allows characters in the 'Hangul Jamo Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+A960 .. U+A97F. - /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulJamoExtendedA - { - get - { - return GetFilter(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); - } - } - private static DefinedCharacterCodePointFilter _hangulJamoExtendedA; - - /// - /// A filter which allows characters in the 'Javanese' Unicode range. - /// - /// - /// This range spans the code points U+A980 .. U+A9DF. - /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Javanese - { - get - { - return GetFilter(ref _javanese, first: '\uA980', last: '\uA9DF'); - } - } - private static DefinedCharacterCodePointFilter _javanese; - - /// - /// A filter which allows characters in the 'Myanmar Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+A9E0 .. U+A9FF. - /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MyanmarExtendedB - { - get - { - return GetFilter(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); - } - } - private static DefinedCharacterCodePointFilter _myanmarExtendedB; - - /// - /// A filter which allows characters in the 'Cham' Unicode range. - /// - /// - /// This range spans the code points U+AA00 .. U+AA5F. - /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Cham - { - get - { - return GetFilter(ref _cham, first: '\uAA00', last: '\uAA5F'); - } - } - private static DefinedCharacterCodePointFilter _cham; - - /// - /// A filter which allows characters in the 'Myanmar Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+AA60 .. U+AA7F. - /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MyanmarExtendedA - { - get - { - return GetFilter(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); - } - } - private static DefinedCharacterCodePointFilter _myanmarExtendedA; - - /// - /// A filter which allows characters in the 'Tai Viet' Unicode range. - /// - /// - /// This range spans the code points U+AA80 .. U+AADF. - /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this range. - /// - public static ICodePointFilter TaiViet - { - get - { - return GetFilter(ref _taiViet, first: '\uAA80', last: '\uAADF'); - } - } - private static DefinedCharacterCodePointFilter _taiViet; - - /// - /// A filter which allows characters in the 'Meetei Mayek Extensions' Unicode range. - /// - /// - /// This range spans the code points U+AAE0 .. U+AAFF. - /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MeeteiMayekExtensions - { - get - { - return GetFilter(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); - } - } - private static DefinedCharacterCodePointFilter _meeteiMayekExtensions; - - /// - /// A filter which allows characters in the 'Ethiopic Extended-A' Unicode range. - /// - /// - /// This range spans the code points U+AB00 .. U+AB2F. - /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter EthiopicExtendedA - { - get - { - return GetFilter(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); - } - } - private static DefinedCharacterCodePointFilter _ethiopicExtendedA; - - /// - /// A filter which allows characters in the 'Latin Extended-E' Unicode range. - /// - /// - /// This range spans the code points U+AB30 .. U+AB6F. - /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this range. - /// - public static ICodePointFilter LatinExtendedE - { - get - { - return GetFilter(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); - } - } - private static DefinedCharacterCodePointFilter _latinExtendedE; - - /// - /// A filter which allows characters in the 'Meetei Mayek' Unicode range. - /// - /// - /// This range spans the code points U+ABC0 .. U+ABFF. - /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter MeeteiMayek - { - get - { - return GetFilter(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); - } - } - private static DefinedCharacterCodePointFilter _meeteiMayek; - - /// - /// A filter which allows characters in the 'Hangul Syllables' Unicode range. - /// - /// - /// This range spans the code points U+AC00 .. U+D7AF. - /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulSyllables - { - get - { - return GetFilter(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); - } - } - private static DefinedCharacterCodePointFilter _hangulSyllables; - - /// - /// A filter which allows characters in the 'Hangul Jamo Extended-B' Unicode range. - /// - /// - /// This range spans the code points U+D7B0 .. U+D7FF. - /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HangulJamoExtendedB - { - get - { - return GetFilter(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); - } - } - private static DefinedCharacterCodePointFilter _hangulJamoExtendedB; - - /// - /// A filter which allows characters in the 'CJK Compatibility Ideographs' Unicode range. - /// - /// - /// This range spans the code points U+F900 .. U+FAFF. - /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKCompatibilityIdeographs - { - get - { - return GetFilter(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); - } - } - private static DefinedCharacterCodePointFilter _cjkCompatibilityIdeographs; - - /// - /// A filter which allows characters in the 'Alphabetic Presentation Forms' Unicode range. - /// - /// - /// This range spans the code points U+FB00 .. U+FB4F. - /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter AlphabeticPresentationForms - { - get - { - return GetFilter(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); - } - } - private static DefinedCharacterCodePointFilter _alphabeticPresentationForms; - - /// - /// A filter which allows characters in the 'Arabic Presentation Forms-A' Unicode range. - /// - /// - /// This range spans the code points U+FB50 .. U+FDFF. - /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicPresentationFormsA - { - get - { - return GetFilter(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); - } - } - private static DefinedCharacterCodePointFilter _arabicPresentationFormsA; - - /// - /// A filter which allows characters in the 'Variation Selectors' Unicode range. - /// - /// - /// This range spans the code points U+FE00 .. U+FE0F. - /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter VariationSelectors - { - get - { - return GetFilter(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); - } - } - private static DefinedCharacterCodePointFilter _variationSelectors; - - /// - /// A filter which allows characters in the 'Vertical Forms' Unicode range. - /// - /// - /// This range spans the code points U+FE10 .. U+FE1F. - /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this range. - /// - public static ICodePointFilter VerticalForms - { - get - { - return GetFilter(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); - } - } - private static DefinedCharacterCodePointFilter _verticalForms; - - /// - /// A filter which allows characters in the 'Combining Half Marks' Unicode range. - /// - /// - /// This range spans the code points U+FE20 .. U+FE2F. - /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CombiningHalfMarks - { - get - { - return GetFilter(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); - } - } - private static DefinedCharacterCodePointFilter _combiningHalfMarks; - - /// - /// A filter which allows characters in the 'CJK Compatibility Forms' Unicode range. - /// - /// - /// This range spans the code points U+FE30 .. U+FE4F. - /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this range. - /// - public static ICodePointFilter CJKCompatibilityForms - { - get - { - return GetFilter(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); - } - } - private static DefinedCharacterCodePointFilter _cjkCompatibilityForms; - - /// - /// A filter which allows characters in the 'Small Form Variants' Unicode range. - /// - /// - /// This range spans the code points U+FE50 .. U+FE6F. - /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this range. - /// - public static ICodePointFilter SmallFormVariants - { - get - { - return GetFilter(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); - } - } - private static DefinedCharacterCodePointFilter _smallFormVariants; - - /// - /// A filter which allows characters in the 'Arabic Presentation Forms-B' Unicode range. - /// - /// - /// This range spans the code points U+FE70 .. U+FEFF. - /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this range. - /// - public static ICodePointFilter ArabicPresentationFormsB - { - get - { - return GetFilter(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); - } - } - private static DefinedCharacterCodePointFilter _arabicPresentationFormsB; - - /// - /// A filter which allows characters in the 'Halfwidth and Fullwidth Forms' Unicode range. - /// - /// - /// This range spans the code points U+FF00 .. U+FFEF. - /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this range. - /// - public static ICodePointFilter HalfwidthandFullwidthForms - { - get - { - return GetFilter(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); - } - } - private static DefinedCharacterCodePointFilter _halfwidthandFullwidthForms; - - /// - /// A filter which allows characters in the 'Specials' Unicode range. - /// - /// - /// This range spans the code points U+FFF0 .. U+FFFF. - /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this range. - /// - public static ICodePointFilter Specials - { - get - { - return GetFilter(ref _specials, first: '\uFFF0', last: '\uFFFF'); - } - } - private static DefinedCharacterCodePointFilter _specials; - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private static ICodePointFilter GetFilter(ref DefinedCharacterCodePointFilter filter, char first, char last) - { - // Return an existing filter if it has already been created, otherwise - // create a new filter on-demand. - return Volatile.Read(ref filter) ?? GetFilterSlow(ref filter, first, last); - } - - private static ICodePointFilter GetFilterSlow(ref DefinedCharacterCodePointFilter filter, char first, char last) - { - // If the filter hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'filter' value. - DefinedCharacterCodePointFilter newFilter = new DefinedCharacterCodePointFilter(first, last); - Volatile.Write(ref filter, newFilter); - return newFilter; - } - - /// - /// A code point filter which returns only defined characters within a certain - /// range of the Unicode specification. - /// - private sealed class DefinedCharacterCodePointFilter : ICodePointFilter - { - private readonly int _count; - private readonly int _first; - - public DefinedCharacterCodePointFilter(int first, int last) - { - Debug.Assert(0 <= first); - Debug.Assert(first <= last); - Debug.Assert(last <= 0xFFFF); - - _first = first; - _count = last - first + 1; - } - - public IEnumerable GetAllowedCodePoints() - { - for (int i = 0; i < _count; i++) - { - int thisCodePoint = _first + i; - if (UnicodeHelpers.IsCharacterDefined((char)thisCodePoint)) - { - yield return thisCodePoint; - } - } - } - } - - /// - /// A filter that allows no code points. - /// - private sealed class EmptyCodePointFilter : ICodePointFilter - { - private static readonly int[] _emptyArray = new int[0]; // immutable since empty - - public IEnumerable GetAllowedCodePoints() - { - return _emptyArray; - } - } - } -} diff --git a/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs index 6312387609..e8ed2cdcf1 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs @@ -3,7 +3,6 @@ using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -19,8 +18,13 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is also safe for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// - public static void HtmlEncode([NotNull] this IHtmlEncoder htmlEncoder, string value, [NotNull] TextWriter output) + public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output) { + if (htmlEncoder == null) + { + throw new ArgumentNullException(nameof(htmlEncoder)); + } + if (!String.IsNullOrEmpty(value)) { htmlEncoder.HtmlEncode(value, 0, value.Length, output); @@ -30,8 +34,13 @@ namespace Microsoft.Framework.WebEncoders /// /// JavaScript-escapes a string and writes the result to the supplied output. /// - public static void JavaScriptStringEncode([NotNull] this IJavaScriptStringEncoder javaScriptStringEncoder, string value, [NotNull] TextWriter output) + public static void JavaScriptStringEncode(this IJavaScriptStringEncoder javaScriptStringEncoder, string value, TextWriter output) { + if (javaScriptStringEncoder == null) + { + throw new ArgumentNullException(nameof(javaScriptStringEncoder)); + } + if (!String.IsNullOrEmpty(value)) { javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output); @@ -45,8 +54,13 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is safe for use in the segment, query, or /// fragment portion of a URI. /// - public static void UrlEncode([NotNull] this IUrlEncoder urlEncoder, string value, [NotNull] TextWriter output) + public static void UrlEncode(this IUrlEncoder urlEncoder, string value, TextWriter output) { + if (urlEncoder == null) + { + throw new ArgumentNullException(nameof(urlEncoder)); + } + if (!String.IsNullOrEmpty(value)) { urlEncoder.UrlEncode(value, 0, value.Length, output); diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs b/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs similarity index 65% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderOptions.cs index 828455651a..e2547359cf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderOptions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs @@ -11,12 +11,11 @@ namespace Microsoft.Framework.WebEncoders public sealed class EncoderOptions { /// - /// Specifies code point tables which do not require escaping by the encoders. + /// Specifies which code points are allowed to be represented unescaped by the encoders. /// /// - /// If this property is set to a null array, then by default only the 'Basic Latin' - /// code point filter is active. + /// If this property is null, then the encoders will use their default allow lists. /// - public ICodePointFilter[] CodePointFilters { get; set; } + public ICodePointFilter CodePointFilter { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs similarity index 96% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 7cd52e384f..9b8a84b98e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.Framework.WebEncoders; using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Internal; +using Microsoft.Framework.WebEncoders; namespace Microsoft.Framework.DependencyInjection { diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs similarity index 95% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs rename to src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs index 6437376d08..a7982bdf7a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs @@ -2,15 +2,15 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { /// /// Contains extension methods for fetching encoders from a service provider. /// - public static class EncoderExtensions + public static class EncoderServiceProviderExtensions { /// /// Retrieves an IHtmlEncoder from a service provider. diff --git a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs similarity index 73% rename from src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs rename to src/Microsoft.Framework.WebEncoders/EncoderServices.cs index 8bac20cae8..0b9d6820d3 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Encoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -22,17 +22,17 @@ namespace Microsoft.Framework.WebEncoders // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filters => new HtmlEncoder(filters))); - yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filters => new JavaScriptStringEncoder(filters))); - yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filters => new UrlEncoder(filters))); + yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); + yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); + yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); } - private static Func CreateFactory(Func parameterlessCtor, Func parameterfulCtor) + private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) { return serviceProvider => { - var codePointFilters = serviceProvider?.GetService>()?.Options?.CodePointFilters; - return (codePointFilters != null) ? parameterfulCtor(codePointFilters) : parameterlessCtor(); + var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; + return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); }; } } diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 7bcf12f1e3..20a504d38d 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -13,6 +13,8 @@ namespace Microsoft.Framework.WebEncoders /// can be represented unencoded. /// /// + /// Instances of this type will always encode a certain set of characters (such as < + /// and >), even if the filter provided in the constructor allows such characters. /// Once constructed, instances of this class are thread-safe for multiple callers. /// public unsafe sealed class HtmlEncoder : IHtmlEncoder @@ -32,10 +34,19 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom allow list of characters. + /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// pass through the encoder unescaped. /// - public HtmlEncoder(params ICodePointFilter[] filters) - : this(new HtmlUnicodeEncoder(filters)) + public HtmlEncoder(params UnicodeBlock[] allowedBlocks) + : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + { + } + + /// + /// Instantiates an encoder using a custom code point filter. + /// + public HtmlEncoder(ICodePointFilter filter) + : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } @@ -97,8 +108,8 @@ namespace Microsoft.Framework.WebEncoders // generate at most 10 output chars ("􏿿"), which equates to 5 output chars per input char. private const int MaxOutputCharsPerInputChar = 8; - internal HtmlUnicodeEncoder(ICodePointFilter[] filters) - : base(filters, MaxOutputCharsPerInputChar) + internal HtmlUnicodeEncoder(CodePointFilter filter) + : base(filter, MaxOutputCharsPerInputChar) { } @@ -109,7 +120,7 @@ namespace Microsoft.Framework.WebEncoders HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new HtmlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + encoder = new HtmlUnicodeEncoder(new CodePointFilter()); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs index 0456285b23..4a24158263 100644 --- a/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs @@ -1,5 +1,4 @@ -using System; -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs index 487c1ca35c..99f011ff9a 100644 --- a/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs @@ -16,6 +16,9 @@ namespace Microsoft.Framework.WebEncoders /// JavaScript-escapes a character array and writes the result to the /// supplied output. /// + /// + /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. + /// void JavaScriptStringEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); /// @@ -23,6 +26,7 @@ namespace Microsoft.Framework.WebEncoders /// /// /// The JavaScript-escaped value, or null if the input string was null. + /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. /// string JavaScriptStringEncode(string value); @@ -30,6 +34,9 @@ namespace Microsoft.Framework.WebEncoders /// JavaScript-escapes a given input string and writes the /// result to the supplied output. /// + /// + /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. + /// void JavaScriptStringEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 0d61898614..eb6ba16dae 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -13,6 +13,8 @@ namespace Microsoft.Framework.WebEncoders /// can be represented unescaped. /// /// + /// Instances of this type will always encode a certain set of characters (such as ' + /// and "), even if the filter provided in the constructor allows such characters. /// Once constructed, instances of this class are thread-safe for multiple callers. /// public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder @@ -32,10 +34,19 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom allow list of characters. + /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// pass through the encoder unescaped. /// - public JavaScriptStringEncoder(params ICodePointFilter[] filters) - : this(new JavaScriptStringUnicodeEncoder(filters)) + public JavaScriptStringEncoder(params UnicodeBlock[] allowedBlocks) + : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedBlocks))) + { + } + + /// + /// Instantiates an encoder using a custom code point filter. + /// + public JavaScriptStringEncoder(ICodePointFilter filter) + : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) { } @@ -97,8 +108,8 @@ namespace Microsoft.Framework.WebEncoders // surrogate pairs in the output. private const int MaxOutputCharsPerInputChar = 6; - internal JavaScriptStringUnicodeEncoder(ICodePointFilter[] filters) - : base(filters, MaxOutputCharsPerInputChar) + internal JavaScriptStringUnicodeEncoder(CodePointFilter filter) + : base(filter, MaxOutputCharsPerInputChar) { // The only interesting characters above and beyond what the base encoder // already covers are the solidus and reverse solidus. @@ -113,7 +124,7 @@ namespace Microsoft.Framework.WebEncoders JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new JavaScriptStringUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter()); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs new file mode 100644 index 0000000000..26f84d86a0 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Represents a range of Unicode code points. + /// + /// + /// Currently only the Basic Multilingual Plane is supported. + /// + public sealed class UnicodeBlock + { + /// + /// Creates a new representation of a Unicode block given the first code point + /// in the block and the number of code points in the block. + /// + public UnicodeBlock(int firstCodePoint, int blockSize) + { + // Parameter checking: the first code point must be U+nnn0, the block size must + // be a multiple of 16 bytes, and we can't span planes. + // See http://unicode.org/faq/blocks_ranges.html for more info. + if (firstCodePoint < 0 || firstCodePoint > 0xFFFF || ((firstCodePoint & 0xF) != 0)) + { + throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); + } + if (blockSize < 0 || (blockSize % 16 != 0) || ((long)firstCodePoint + (long)blockSize > 0x10000)) + { + throw new ArgumentOutOfRangeException(nameof(blockSize)); + } + + FirstCodePoint = firstCodePoint; + BlockSize = blockSize; + } + + /// + /// The number of code points in this block. + /// + public int BlockSize { get; } + + /// + /// The first code point in this block. + /// + public int FirstCodePoint { get; } + + public static UnicodeBlock FromCharacterRange(char firstChar, char lastChar) + { + // Parameter checking: the first code point must be U+nnn0 and the last + // code point must be U+nnnF. We already can't span planes since 'char' + // allows only Basic Multilingual Plane characters. + // See http://unicode.org/faq/blocks_ranges.html for more info. + if ((firstChar & 0xF) != 0) + { + throw new ArgumentOutOfRangeException(nameof(firstChar)); + } + if (lastChar < firstChar || (lastChar & 0xF) != 0xF) + { + throw new ArgumentOutOfRangeException(nameof(lastChar)); + } + + return new UnicodeBlock(firstChar, 1 + (int)(lastChar - firstChar)); + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs new file mode 100644 index 0000000000..2217e2db93 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Contains predefined Unicode code point filters. + /// + public static partial class UnicodeBlocks + { + /// + /// Represents an empty Unicode block. + /// + /// + /// This block contains no code points. + /// + public static UnicodeBlock None + { + get + { + return Volatile.Read(ref _none) ?? CreateEmptyBlock(ref _none); + } + } + private static UnicodeBlock _none; + + /// + /// Represents a block containing all characters in the Unicode Basic Multilingual Plane (U+0000..U+FFFF). + /// + public static UnicodeBlock All + { + get + { + return Volatile.Read(ref _all) ?? CreateBlock(ref _all, '\u0000', '\uFFFF'); + } + } + private static UnicodeBlock _all; + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeBlock CreateBlock(ref UnicodeBlock block, char first, char last) + { + // If the block hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'block' value. + Debug.Assert(last > first, "Code points were specified out of order."); + var newBlock = UnicodeBlock.FromCharacterRange(first, last); + Volatile.Write(ref block, newBlock); + return newBlock; + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeBlock CreateEmptyBlock(ref UnicodeBlock block) + { + // If the block hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'block' value. + var newBlock = new UnicodeBlock(0, 0); + Volatile.Write(ref block, newBlock); + return newBlock; + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs new file mode 100644 index 0000000000..d3404759c5 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs @@ -0,0 +1,2336 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + public static partial class UnicodeBlocks + { + /// + /// Represents the 'Basic Latin' Unicode block (U+0000..U+007F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BasicLatin + { + get + { + return Volatile.Read(ref _basicLatin) ?? CreateBlock(ref _basicLatin, first: '\u0000', last: '\u007F'); + } + } + private static UnicodeBlock _basicLatin; + + /// + /// Represents the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Latin1Supplement + { + get + { + return Volatile.Read(ref _latin1Supplement) ?? CreateBlock(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); + } + } + private static UnicodeBlock _latin1Supplement; + + /// + /// Represents the 'Latin Extended-A' Unicode block (U+0100..U+017F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedA + { + get + { + return Volatile.Read(ref _latinExtendedA) ?? CreateBlock(ref _latinExtendedA, first: '\u0100', last: '\u017F'); + } + } + private static UnicodeBlock _latinExtendedA; + + /// + /// Represents the 'Latin Extended-B' Unicode block (U+0180..U+024F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedB + { + get + { + return Volatile.Read(ref _latinExtendedB) ?? CreateBlock(ref _latinExtendedB, first: '\u0180', last: '\u024F'); + } + } + private static UnicodeBlock _latinExtendedB; + + /// + /// Represents the 'IPA Extensions' Unicode block (U+0250..U+02AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. + /// + public static UnicodeBlock IPAExtensions + { + get + { + return Volatile.Read(ref _ipaExtensions) ?? CreateBlock(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); + } + } + private static UnicodeBlock _ipaExtensions; + + /// + /// Represents the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SpacingModifierLetters + { + get + { + return Volatile.Read(ref _spacingModifierLetters) ?? CreateBlock(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); + } + } + private static UnicodeBlock _spacingModifierLetters; + + /// + /// Represents the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarks + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateBlock(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); + } + } + private static UnicodeBlock _combiningDiacriticalMarks; + + /// + /// Represents the 'Greek and Coptic' Unicode block (U+0370..U+03FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GreekandCoptic + { + get + { + return Volatile.Read(ref _greekandCoptic) ?? CreateBlock(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); + } + } + private static UnicodeBlock _greekandCoptic; + + /// + /// Represents the 'Cyrillic' Unicode block (U+0400..U+04FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Cyrillic + { + get + { + return Volatile.Read(ref _cyrillic) ?? CreateBlock(ref _cyrillic, first: '\u0400', last: '\u04FF'); + } + } + private static UnicodeBlock _cyrillic; + + /// + /// Represents the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CyrillicSupplement + { + get + { + return Volatile.Read(ref _cyrillicSupplement) ?? CreateBlock(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); + } + } + private static UnicodeBlock _cyrillicSupplement; + + /// + /// Represents the 'Armenian' Unicode block (U+0530..U+058F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Armenian + { + get + { + return Volatile.Read(ref _armenian) ?? CreateBlock(ref _armenian, first: '\u0530', last: '\u058F'); + } + } + private static UnicodeBlock _armenian; + + /// + /// Represents the 'Hebrew' Unicode block (U+0590..U+05FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Hebrew + { + get + { + return Volatile.Read(ref _hebrew) ?? CreateBlock(ref _hebrew, first: '\u0590', last: '\u05FF'); + } + } + private static UnicodeBlock _hebrew; + + /// + /// Represents the 'Arabic' Unicode block (U+0600..U+06FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Arabic + { + get + { + return Volatile.Read(ref _arabic) ?? CreateBlock(ref _arabic, first: '\u0600', last: '\u06FF'); + } + } + private static UnicodeBlock _arabic; + + /// + /// Represents the 'Syriac' Unicode block (U+0700..U+074F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Syriac + { + get + { + return Volatile.Read(ref _syriac) ?? CreateBlock(ref _syriac, first: '\u0700', last: '\u074F'); + } + } + private static UnicodeBlock _syriac; + + /// + /// Represents the 'Arabic Supplement' Unicode block (U+0750..U+077F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicSupplement + { + get + { + return Volatile.Read(ref _arabicSupplement) ?? CreateBlock(ref _arabicSupplement, first: '\u0750', last: '\u077F'); + } + } + private static UnicodeBlock _arabicSupplement; + + /// + /// Represents the 'Thaana' Unicode block (U+0780..U+07BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Thaana + { + get + { + return Volatile.Read(ref _thaana) ?? CreateBlock(ref _thaana, first: '\u0780', last: '\u07BF'); + } + } + private static UnicodeBlock _thaana; + + /// + /// Represents the 'NKo' Unicode block (U+07C0..U+07FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock NKo + { + get + { + return Volatile.Read(ref _nKo) ?? CreateBlock(ref _nKo, first: '\u07C0', last: '\u07FF'); + } + } + private static UnicodeBlock _nKo; + + /// + /// Represents the 'Samaritan' Unicode block (U+0800..U+083F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Samaritan + { + get + { + return Volatile.Read(ref _samaritan) ?? CreateBlock(ref _samaritan, first: '\u0800', last: '\u083F'); + } + } + private static UnicodeBlock _samaritan; + + /// + /// Represents the 'Mandaic' Unicode block (U+0840..U+085F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Mandaic + { + get + { + return Volatile.Read(ref _mandaic) ?? CreateBlock(ref _mandaic, first: '\u0840', last: '\u085F'); + } + } + private static UnicodeBlock _mandaic; + + /// + /// Represents the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicExtendedA + { + get + { + return Volatile.Read(ref _arabicExtendedA) ?? CreateBlock(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); + } + } + private static UnicodeBlock _arabicExtendedA; + + /// + /// Represents the 'Devanagari' Unicode block (U+0900..U+097F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Devanagari + { + get + { + return Volatile.Read(ref _devanagari) ?? CreateBlock(ref _devanagari, first: '\u0900', last: '\u097F'); + } + } + private static UnicodeBlock _devanagari; + + /// + /// Represents the 'Bengali' Unicode block (U+0980..U+09FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Bengali + { + get + { + return Volatile.Read(ref _bengali) ?? CreateBlock(ref _bengali, first: '\u0980', last: '\u09FF'); + } + } + private static UnicodeBlock _bengali; + + /// + /// Represents the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Gurmukhi + { + get + { + return Volatile.Read(ref _gurmukhi) ?? CreateBlock(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); + } + } + private static UnicodeBlock _gurmukhi; + + /// + /// Represents the 'Gujarati' Unicode block (U+0A80..U+0AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Gujarati + { + get + { + return Volatile.Read(ref _gujarati) ?? CreateBlock(ref _gujarati, first: '\u0A80', last: '\u0AFF'); + } + } + private static UnicodeBlock _gujarati; + + /// + /// Represents the 'Oriya' Unicode block (U+0B00..U+0B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Oriya + { + get + { + return Volatile.Read(ref _oriya) ?? CreateBlock(ref _oriya, first: '\u0B00', last: '\u0B7F'); + } + } + private static UnicodeBlock _oriya; + + /// + /// Represents the 'Tamil' Unicode block (U+0B80..U+0BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tamil + { + get + { + return Volatile.Read(ref _tamil) ?? CreateBlock(ref _tamil, first: '\u0B80', last: '\u0BFF'); + } + } + private static UnicodeBlock _tamil; + + /// + /// Represents the 'Telugu' Unicode block (U+0C00..U+0C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Telugu + { + get + { + return Volatile.Read(ref _telugu) ?? CreateBlock(ref _telugu, first: '\u0C00', last: '\u0C7F'); + } + } + private static UnicodeBlock _telugu; + + /// + /// Represents the 'Kannada' Unicode block (U+0C80..U+0CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Kannada + { + get + { + return Volatile.Read(ref _kannada) ?? CreateBlock(ref _kannada, first: '\u0C80', last: '\u0CFF'); + } + } + private static UnicodeBlock _kannada; + + /// + /// Represents the 'Malayalam' Unicode block (U+0D00..U+0D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Malayalam + { + get + { + return Volatile.Read(ref _malayalam) ?? CreateBlock(ref _malayalam, first: '\u0D00', last: '\u0D7F'); + } + } + private static UnicodeBlock _malayalam; + + /// + /// Represents the 'Sinhala' Unicode block (U+0D80..U+0DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Sinhala + { + get + { + return Volatile.Read(ref _sinhala) ?? CreateBlock(ref _sinhala, first: '\u0D80', last: '\u0DFF'); + } + } + private static UnicodeBlock _sinhala; + + /// + /// Represents the 'Thai' Unicode block (U+0E00..U+0E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Thai + { + get + { + return Volatile.Read(ref _thai) ?? CreateBlock(ref _thai, first: '\u0E00', last: '\u0E7F'); + } + } + private static UnicodeBlock _thai; + + /// + /// Represents the 'Lao' Unicode block (U+0E80..U+0EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Lao + { + get + { + return Volatile.Read(ref _lao) ?? CreateBlock(ref _lao, first: '\u0E80', last: '\u0EFF'); + } + } + private static UnicodeBlock _lao; + + /// + /// Represents the 'Tibetan' Unicode block (U+0F00..U+0FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tibetan + { + get + { + return Volatile.Read(ref _tibetan) ?? CreateBlock(ref _tibetan, first: '\u0F00', last: '\u0FFF'); + } + } + private static UnicodeBlock _tibetan; + + /// + /// Represents the 'Myanmar' Unicode block (U+1000..U+109F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Myanmar + { + get + { + return Volatile.Read(ref _myanmar) ?? CreateBlock(ref _myanmar, first: '\u1000', last: '\u109F'); + } + } + private static UnicodeBlock _myanmar; + + /// + /// Represents the 'Georgian' Unicode block (U+10A0..U+10FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Georgian + { + get + { + return Volatile.Read(ref _georgian) ?? CreateBlock(ref _georgian, first: '\u10A0', last: '\u10FF'); + } + } + private static UnicodeBlock _georgian; + + /// + /// Represents the 'Hangul Jamo' Unicode block (U+1100..U+11FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulJamo + { + get + { + return Volatile.Read(ref _hangulJamo) ?? CreateBlock(ref _hangulJamo, first: '\u1100', last: '\u11FF'); + } + } + private static UnicodeBlock _hangulJamo; + + /// + /// Represents the 'Ethiopic' Unicode block (U+1200..U+137F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Ethiopic + { + get + { + return Volatile.Read(ref _ethiopic) ?? CreateBlock(ref _ethiopic, first: '\u1200', last: '\u137F'); + } + } + private static UnicodeBlock _ethiopic; + + /// + /// Represents the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EthiopicSupplement + { + get + { + return Volatile.Read(ref _ethiopicSupplement) ?? CreateBlock(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); + } + } + private static UnicodeBlock _ethiopicSupplement; + + /// + /// Represents the 'Cherokee' Unicode block (U+13A0..U+13FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Cherokee + { + get + { + return Volatile.Read(ref _cherokee) ?? CreateBlock(ref _cherokee, first: '\u13A0', last: '\u13FF'); + } + } + private static UnicodeBlock _cherokee; + + /// + /// Represents the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock UnifiedCanadianAboriginalSyllabics + { + get + { + return Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); + } + } + private static UnicodeBlock _unifiedCanadianAboriginalSyllabics; + + /// + /// Represents the 'Ogham' Unicode block (U+1680..U+169F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Ogham + { + get + { + return Volatile.Read(ref _ogham) ?? CreateBlock(ref _ogham, first: '\u1680', last: '\u169F'); + } + } + private static UnicodeBlock _ogham; + + /// + /// Represents the 'Runic' Unicode block (U+16A0..U+16FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Runic + { + get + { + return Volatile.Read(ref _runic) ?? CreateBlock(ref _runic, first: '\u16A0', last: '\u16FF'); + } + } + private static UnicodeBlock _runic; + + /// + /// Represents the 'Tagalog' Unicode block (U+1700..U+171F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tagalog + { + get + { + return Volatile.Read(ref _tagalog) ?? CreateBlock(ref _tagalog, first: '\u1700', last: '\u171F'); + } + } + private static UnicodeBlock _tagalog; + + /// + /// Represents the 'Hanunoo' Unicode block (U+1720..U+173F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Hanunoo + { + get + { + return Volatile.Read(ref _hanunoo) ?? CreateBlock(ref _hanunoo, first: '\u1720', last: '\u173F'); + } + } + private static UnicodeBlock _hanunoo; + + /// + /// Represents the 'Buhid' Unicode block (U+1740..U+175F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Buhid + { + get + { + return Volatile.Read(ref _buhid) ?? CreateBlock(ref _buhid, first: '\u1740', last: '\u175F'); + } + } + private static UnicodeBlock _buhid; + + /// + /// Represents the 'Tagbanwa' Unicode block (U+1760..U+177F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tagbanwa + { + get + { + return Volatile.Read(ref _tagbanwa) ?? CreateBlock(ref _tagbanwa, first: '\u1760', last: '\u177F'); + } + } + private static UnicodeBlock _tagbanwa; + + /// + /// Represents the 'Khmer' Unicode block (U+1780..U+17FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Khmer + { + get + { + return Volatile.Read(ref _khmer) ?? CreateBlock(ref _khmer, first: '\u1780', last: '\u17FF'); + } + } + private static UnicodeBlock _khmer; + + /// + /// Represents the 'Mongolian' Unicode block (U+1800..U+18AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Mongolian + { + get + { + return Volatile.Read(ref _mongolian) ?? CreateBlock(ref _mongolian, first: '\u1800', last: '\u18AF'); + } + } + private static UnicodeBlock _mongolian; + + /// + /// Represents the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock UnifiedCanadianAboriginalSyllabicsExtended + { + get + { + return Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); + } + } + private static UnicodeBlock _unifiedCanadianAboriginalSyllabicsExtended; + + /// + /// Represents the 'Limbu' Unicode block (U+1900..U+194F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Limbu + { + get + { + return Volatile.Read(ref _limbu) ?? CreateBlock(ref _limbu, first: '\u1900', last: '\u194F'); + } + } + private static UnicodeBlock _limbu; + + /// + /// Represents the 'Tai Le' Unicode block (U+1950..U+197F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. + /// + public static UnicodeBlock TaiLe + { + get + { + return Volatile.Read(ref _taiLe) ?? CreateBlock(ref _taiLe, first: '\u1950', last: '\u197F'); + } + } + private static UnicodeBlock _taiLe; + + /// + /// Represents the 'New Tai Lue' Unicode block (U+1980..U+19DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock NewTaiLue + { + get + { + return Volatile.Read(ref _newTaiLue) ?? CreateBlock(ref _newTaiLue, first: '\u1980', last: '\u19DF'); + } + } + private static UnicodeBlock _newTaiLue; + + /// + /// Represents the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KhmerSymbols + { + get + { + return Volatile.Read(ref _khmerSymbols) ?? CreateBlock(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); + } + } + private static UnicodeBlock _khmerSymbols; + + /// + /// Represents the 'Buginese' Unicode block (U+1A00..U+1A1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Buginese + { + get + { + return Volatile.Read(ref _buginese) ?? CreateBlock(ref _buginese, first: '\u1A00', last: '\u1A1F'); + } + } + private static UnicodeBlock _buginese; + + /// + /// Represents the 'Tai Tham' Unicode block (U+1A20..U+1AAF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. + /// + public static UnicodeBlock TaiTham + { + get + { + return Volatile.Read(ref _taiTham) ?? CreateBlock(ref _taiTham, first: '\u1A20', last: '\u1AAF'); + } + } + private static UnicodeBlock _taiTham; + + /// + /// Represents the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarksExtended + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateBlock(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); + } + } + private static UnicodeBlock _combiningDiacriticalMarksExtended; + + /// + /// Represents the 'Balinese' Unicode block (U+1B00..U+1B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Balinese + { + get + { + return Volatile.Read(ref _balinese) ?? CreateBlock(ref _balinese, first: '\u1B00', last: '\u1B7F'); + } + } + private static UnicodeBlock _balinese; + + /// + /// Represents the 'Sundanese' Unicode block (U+1B80..U+1BBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Sundanese + { + get + { + return Volatile.Read(ref _sundanese) ?? CreateBlock(ref _sundanese, first: '\u1B80', last: '\u1BBF'); + } + } + private static UnicodeBlock _sundanese; + + /// + /// Represents the 'Batak' Unicode block (U+1BC0..U+1BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Batak + { + get + { + return Volatile.Read(ref _batak) ?? CreateBlock(ref _batak, first: '\u1BC0', last: '\u1BFF'); + } + } + private static UnicodeBlock _batak; + + /// + /// Represents the 'Lepcha' Unicode block (U+1C00..U+1C4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Lepcha + { + get + { + return Volatile.Read(ref _lepcha) ?? CreateBlock(ref _lepcha, first: '\u1C00', last: '\u1C4F'); + } + } + private static UnicodeBlock _lepcha; + + /// + /// Represents the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. + /// + public static UnicodeBlock OlChiki + { + get + { + return Volatile.Read(ref _olChiki) ?? CreateBlock(ref _olChiki, first: '\u1C50', last: '\u1C7F'); + } + } + private static UnicodeBlock _olChiki; + + /// + /// Represents the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SundaneseSupplement + { + get + { + return Volatile.Read(ref _sundaneseSupplement) ?? CreateBlock(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); + } + } + private static UnicodeBlock _sundaneseSupplement; + + /// + /// Represents the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock VedicExtensions + { + get + { + return Volatile.Read(ref _vedicExtensions) ?? CreateBlock(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); + } + } + private static UnicodeBlock _vedicExtensions; + + /// + /// Represents the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock PhoneticExtensions + { + get + { + return Volatile.Read(ref _phoneticExtensions) ?? CreateBlock(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); + } + } + private static UnicodeBlock _phoneticExtensions; + + /// + /// Represents the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock PhoneticExtensionsSupplement + { + get + { + return Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateBlock(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); + } + } + private static UnicodeBlock _phoneticExtensionsSupplement; + + /// + /// Represents the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarksSupplement + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateBlock(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); + } + } + private static UnicodeBlock _combiningDiacriticalMarksSupplement; + + /// + /// Represents the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedAdditional + { + get + { + return Volatile.Read(ref _latinExtendedAdditional) ?? CreateBlock(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); + } + } + private static UnicodeBlock _latinExtendedAdditional; + + /// + /// Represents the 'Greek Extended' Unicode block (U+1F00..U+1FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GreekExtended + { + get + { + return Volatile.Read(ref _greekExtended) ?? CreateBlock(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); + } + } + private static UnicodeBlock _greekExtended; + + /// + /// Represents the 'General Punctuation' Unicode block (U+2000..U+206F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GeneralPunctuation + { + get + { + return Volatile.Read(ref _generalPunctuation) ?? CreateBlock(ref _generalPunctuation, first: '\u2000', last: '\u206F'); + } + } + private static UnicodeBlock _generalPunctuation; + + /// + /// Represents the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SuperscriptsandSubscripts + { + get + { + return Volatile.Read(ref _superscriptsandSubscripts) ?? CreateBlock(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); + } + } + private static UnicodeBlock _superscriptsandSubscripts; + + /// + /// Represents the 'Currency Symbols' Unicode block (U+20A0..U+20CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CurrencySymbols + { + get + { + return Volatile.Read(ref _currencySymbols) ?? CreateBlock(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); + } + } + private static UnicodeBlock _currencySymbols; + + /// + /// Represents the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningDiacriticalMarksforSymbols + { + get + { + return Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateBlock(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); + } + } + private static UnicodeBlock _combiningDiacriticalMarksforSymbols; + + /// + /// Represents the 'Letterlike Symbols' Unicode block (U+2100..U+214F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LetterlikeSymbols + { + get + { + return Volatile.Read(ref _letterlikeSymbols) ?? CreateBlock(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); + } + } + private static UnicodeBlock _letterlikeSymbols; + + /// + /// Represents the 'Number Forms' Unicode block (U+2150..U+218F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. + /// + public static UnicodeBlock NumberForms + { + get + { + return Volatile.Read(ref _numberForms) ?? CreateBlock(ref _numberForms, first: '\u2150', last: '\u218F'); + } + } + private static UnicodeBlock _numberForms; + + /// + /// Represents the 'Arrows' Unicode block (U+2190..U+21FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Arrows + { + get + { + return Volatile.Read(ref _arrows) ?? CreateBlock(ref _arrows, first: '\u2190', last: '\u21FF'); + } + } + private static UnicodeBlock _arrows; + + /// + /// Represents the 'Mathematical Operators' Unicode block (U+2200..U+22FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MathematicalOperators + { + get + { + return Volatile.Read(ref _mathematicalOperators) ?? CreateBlock(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); + } + } + private static UnicodeBlock _mathematicalOperators; + + /// + /// Represents the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousTechnical + { + get + { + return Volatile.Read(ref _miscellaneousTechnical) ?? CreateBlock(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); + } + } + private static UnicodeBlock _miscellaneousTechnical; + + /// + /// Represents the 'Control Pictures' Unicode block (U+2400..U+243F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ControlPictures + { + get + { + return Volatile.Read(ref _controlPictures) ?? CreateBlock(ref _controlPictures, first: '\u2400', last: '\u243F'); + } + } + private static UnicodeBlock _controlPictures; + + /// + /// Represents the 'Optical Character Recognition' Unicode block (U+2440..U+245F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. + /// + public static UnicodeBlock OpticalCharacterRecognition + { + get + { + return Volatile.Read(ref _opticalCharacterRecognition) ?? CreateBlock(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); + } + } + private static UnicodeBlock _opticalCharacterRecognition; + + /// + /// Represents the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EnclosedAlphanumerics + { + get + { + return Volatile.Read(ref _enclosedAlphanumerics) ?? CreateBlock(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); + } + } + private static UnicodeBlock _enclosedAlphanumerics; + + /// + /// Represents the 'Box Drawing' Unicode block (U+2500..U+257F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BoxDrawing + { + get + { + return Volatile.Read(ref _boxDrawing) ?? CreateBlock(ref _boxDrawing, first: '\u2500', last: '\u257F'); + } + } + private static UnicodeBlock _boxDrawing; + + /// + /// Represents the 'Block Elements' Unicode block (U+2580..U+259F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BlockElements + { + get + { + return Volatile.Read(ref _blockElements) ?? CreateBlock(ref _blockElements, first: '\u2580', last: '\u259F'); + } + } + private static UnicodeBlock _blockElements; + + /// + /// Represents the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GeometricShapes + { + get + { + return Volatile.Read(ref _geometricShapes) ?? CreateBlock(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); + } + } + private static UnicodeBlock _geometricShapes; + + /// + /// Represents the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousSymbols + { + get + { + return Volatile.Read(ref _miscellaneousSymbols) ?? CreateBlock(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); + } + } + private static UnicodeBlock _miscellaneousSymbols; + + /// + /// Represents the 'Dingbats' Unicode block (U+2700..U+27BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Dingbats + { + get + { + return Volatile.Read(ref _dingbats) ?? CreateBlock(ref _dingbats, first: '\u2700', last: '\u27BF'); + } + } + private static UnicodeBlock _dingbats; + + /// + /// Represents the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousMathematicalSymbolsA + { + get + { + return Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); + } + } + private static UnicodeBlock _miscellaneousMathematicalSymbolsA; + + /// + /// Represents the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalArrowsA + { + get + { + return Volatile.Read(ref _supplementalArrowsA) ?? CreateBlock(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); + } + } + private static UnicodeBlock _supplementalArrowsA; + + /// + /// Represents the 'Braille Patterns' Unicode block (U+2800..U+28FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BraillePatterns + { + get + { + return Volatile.Read(ref _braillePatterns) ?? CreateBlock(ref _braillePatterns, first: '\u2800', last: '\u28FF'); + } + } + private static UnicodeBlock _braillePatterns; + + /// + /// Represents the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalArrowsB + { + get + { + return Volatile.Read(ref _supplementalArrowsB) ?? CreateBlock(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); + } + } + private static UnicodeBlock _supplementalArrowsB; + + /// + /// Represents the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousMathematicalSymbolsB + { + get + { + return Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); + } + } + private static UnicodeBlock _miscellaneousMathematicalSymbolsB; + + /// + /// Represents the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalMathematicalOperators + { + get + { + return Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateBlock(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); + } + } + private static UnicodeBlock _supplementalMathematicalOperators; + + /// + /// Represents the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MiscellaneousSymbolsandArrows + { + get + { + return Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateBlock(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); + } + } + private static UnicodeBlock _miscellaneousSymbolsandArrows; + + /// + /// Represents the 'Glagolitic' Unicode block (U+2C00..U+2C5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Glagolitic + { + get + { + return Volatile.Read(ref _glagolitic) ?? CreateBlock(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); + } + } + private static UnicodeBlock _glagolitic; + + /// + /// Represents the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedC + { + get + { + return Volatile.Read(ref _latinExtendedC) ?? CreateBlock(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); + } + } + private static UnicodeBlock _latinExtendedC; + + /// + /// Represents the 'Coptic' Unicode block (U+2C80..U+2CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Coptic + { + get + { + return Volatile.Read(ref _coptic) ?? CreateBlock(ref _coptic, first: '\u2C80', last: '\u2CFF'); + } + } + private static UnicodeBlock _coptic; + + /// + /// Represents the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock GeorgianSupplement + { + get + { + return Volatile.Read(ref _georgianSupplement) ?? CreateBlock(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); + } + } + private static UnicodeBlock _georgianSupplement; + + /// + /// Represents the 'Tifinagh' Unicode block (U+2D30..U+2D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Tifinagh + { + get + { + return Volatile.Read(ref _tifinagh) ?? CreateBlock(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); + } + } + private static UnicodeBlock _tifinagh; + + /// + /// Represents the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EthiopicExtended + { + get + { + return Volatile.Read(ref _ethiopicExtended) ?? CreateBlock(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); + } + } + private static UnicodeBlock _ethiopicExtended; + + /// + /// Represents the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CyrillicExtendedA + { + get + { + return Volatile.Read(ref _cyrillicExtendedA) ?? CreateBlock(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); + } + } + private static UnicodeBlock _cyrillicExtendedA; + + /// + /// Represents the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SupplementalPunctuation + { + get + { + return Volatile.Read(ref _supplementalPunctuation) ?? CreateBlock(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); + } + } + private static UnicodeBlock _supplementalPunctuation; + + /// + /// Represents the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKRadicalsSupplement + { + get + { + return Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateBlock(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); + } + } + private static UnicodeBlock _cjkRadicalsSupplement; + + /// + /// Represents the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KangxiRadicals + { + get + { + return Volatile.Read(ref _kangxiRadicals) ?? CreateBlock(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); + } + } + private static UnicodeBlock _kangxiRadicals; + + /// + /// Represents the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock IdeographicDescriptionCharacters + { + get + { + return Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateBlock(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); + } + } + private static UnicodeBlock _ideographicDescriptionCharacters; + + /// + /// Represents the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKSymbolsandPunctuation + { + get + { + return Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateBlock(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); + } + } + private static UnicodeBlock _cjkSymbolsandPunctuation; + + /// + /// Represents the 'Hiragana' Unicode block (U+3040..U+309F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Hiragana + { + get + { + return Volatile.Read(ref _hiragana) ?? CreateBlock(ref _hiragana, first: '\u3040', last: '\u309F'); + } + } + private static UnicodeBlock _hiragana; + + /// + /// Represents the 'Katakana' Unicode block (U+30A0..U+30FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Katakana + { + get + { + return Volatile.Read(ref _katakana) ?? CreateBlock(ref _katakana, first: '\u30A0', last: '\u30FF'); + } + } + private static UnicodeBlock _katakana; + + /// + /// Represents the 'Bopomofo' Unicode block (U+3100..U+312F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Bopomofo + { + get + { + return Volatile.Read(ref _bopomofo) ?? CreateBlock(ref _bopomofo, first: '\u3100', last: '\u312F'); + } + } + private static UnicodeBlock _bopomofo; + + /// + /// Represents the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulCompatibilityJamo + { + get + { + return Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateBlock(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); + } + } + private static UnicodeBlock _hangulCompatibilityJamo; + + /// + /// Represents the 'Kanbun' Unicode block (U+3190..U+319F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Kanbun + { + get + { + return Volatile.Read(ref _kanbun) ?? CreateBlock(ref _kanbun, first: '\u3190', last: '\u319F'); + } + } + private static UnicodeBlock _kanbun; + + /// + /// Represents the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock BopomofoExtended + { + get + { + return Volatile.Read(ref _bopomofoExtended) ?? CreateBlock(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); + } + } + private static UnicodeBlock _bopomofoExtended; + + /// + /// Represents the 'CJK Strokes' Unicode block (U+31C0..U+31EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKStrokes + { + get + { + return Volatile.Read(ref _cjkStrokes) ?? CreateBlock(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); + } + } + private static UnicodeBlock _cjkStrokes; + + /// + /// Represents the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KatakanaPhoneticExtensions + { + get + { + return Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateBlock(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); + } + } + private static UnicodeBlock _katakanaPhoneticExtensions; + + /// + /// Represents the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EnclosedCJKLettersandMonths + { + get + { + return Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateBlock(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); + } + } + private static UnicodeBlock _enclosedCJKLettersandMonths; + + /// + /// Represents the 'CJK Compatibility' Unicode block (U+3300..U+33FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKCompatibility + { + get + { + return Volatile.Read(ref _cjkCompatibility) ?? CreateBlock(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); + } + } + private static UnicodeBlock _cjkCompatibility; + + /// + /// Represents the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKUnifiedIdeographsExtensionA + { + get + { + return Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateBlock(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); + } + } + private static UnicodeBlock _cjkUnifiedIdeographsExtensionA; + + /// + /// Represents the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock YijingHexagramSymbols + { + get + { + return Volatile.Read(ref _yijingHexagramSymbols) ?? CreateBlock(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); + } + } + private static UnicodeBlock _yijingHexagramSymbols; + + /// + /// Represents the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKUnifiedIdeographs + { + get + { + return Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateBlock(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); + } + } + private static UnicodeBlock _cjkUnifiedIdeographs; + + /// + /// Represents the 'Yi Syllables' Unicode block (U+A000..U+A48F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. + /// + public static UnicodeBlock YiSyllables + { + get + { + return Volatile.Read(ref _yiSyllables) ?? CreateBlock(ref _yiSyllables, first: '\uA000', last: '\uA48F'); + } + } + private static UnicodeBlock _yiSyllables; + + /// + /// Represents the 'Yi Radicals' Unicode block (U+A490..U+A4CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. + /// + public static UnicodeBlock YiRadicals + { + get + { + return Volatile.Read(ref _yiRadicals) ?? CreateBlock(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); + } + } + private static UnicodeBlock _yiRadicals; + + /// + /// Represents the 'Lisu' Unicode block (U+A4D0..U+A4FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Lisu + { + get + { + return Volatile.Read(ref _lisu) ?? CreateBlock(ref _lisu, first: '\uA4D0', last: '\uA4FF'); + } + } + private static UnicodeBlock _lisu; + + /// + /// Represents the 'Vai' Unicode block (U+A500..U+A63F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Vai + { + get + { + return Volatile.Read(ref _vai) ?? CreateBlock(ref _vai, first: '\uA500', last: '\uA63F'); + } + } + private static UnicodeBlock _vai; + + /// + /// Represents the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CyrillicExtendedB + { + get + { + return Volatile.Read(ref _cyrillicExtendedB) ?? CreateBlock(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); + } + } + private static UnicodeBlock _cyrillicExtendedB; + + /// + /// Represents the 'Bamum' Unicode block (U+A6A0..U+A6FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Bamum + { + get + { + return Volatile.Read(ref _bamum) ?? CreateBlock(ref _bamum, first: '\uA6A0', last: '\uA6FF'); + } + } + private static UnicodeBlock _bamum; + + /// + /// Represents the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ModifierToneLetters + { + get + { + return Volatile.Read(ref _modifierToneLetters) ?? CreateBlock(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); + } + } + private static UnicodeBlock _modifierToneLetters; + + /// + /// Represents the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedD + { + get + { + return Volatile.Read(ref _latinExtendedD) ?? CreateBlock(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); + } + } + private static UnicodeBlock _latinExtendedD; + + /// + /// Represents the 'Syloti Nagri' Unicode block (U+A800..U+A82F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SylotiNagri + { + get + { + return Volatile.Read(ref _sylotiNagri) ?? CreateBlock(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); + } + } + private static UnicodeBlock _sylotiNagri; + + /// + /// Represents the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CommonIndicNumberForms + { + get + { + return Volatile.Read(ref _commonIndicNumberForms) ?? CreateBlock(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); + } + } + private static UnicodeBlock _commonIndicNumberForms; + + /// + /// Represents the 'Phags-pa' Unicode block (U+A840..U+A87F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Phagspa + { + get + { + return Volatile.Read(ref _phagspa) ?? CreateBlock(ref _phagspa, first: '\uA840', last: '\uA87F'); + } + } + private static UnicodeBlock _phagspa; + + /// + /// Represents the 'Saurashtra' Unicode block (U+A880..U+A8DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Saurashtra + { + get + { + return Volatile.Read(ref _saurashtra) ?? CreateBlock(ref _saurashtra, first: '\uA880', last: '\uA8DF'); + } + } + private static UnicodeBlock _saurashtra; + + /// + /// Represents the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock DevanagariExtended + { + get + { + return Volatile.Read(ref _devanagariExtended) ?? CreateBlock(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); + } + } + private static UnicodeBlock _devanagariExtended; + + /// + /// Represents the 'Kayah Li' Unicode block (U+A900..U+A92F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock KayahLi + { + get + { + return Volatile.Read(ref _kayahLi) ?? CreateBlock(ref _kayahLi, first: '\uA900', last: '\uA92F'); + } + } + private static UnicodeBlock _kayahLi; + + /// + /// Represents the 'Rejang' Unicode block (U+A930..U+A95F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Rejang + { + get + { + return Volatile.Read(ref _rejang) ?? CreateBlock(ref _rejang, first: '\uA930', last: '\uA95F'); + } + } + private static UnicodeBlock _rejang; + + /// + /// Represents the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulJamoExtendedA + { + get + { + return Volatile.Read(ref _hangulJamoExtendedA) ?? CreateBlock(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); + } + } + private static UnicodeBlock _hangulJamoExtendedA; + + /// + /// Represents the 'Javanese' Unicode block (U+A980..U+A9DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Javanese + { + get + { + return Volatile.Read(ref _javanese) ?? CreateBlock(ref _javanese, first: '\uA980', last: '\uA9DF'); + } + } + private static UnicodeBlock _javanese; + + /// + /// Represents the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MyanmarExtendedB + { + get + { + return Volatile.Read(ref _myanmarExtendedB) ?? CreateBlock(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); + } + } + private static UnicodeBlock _myanmarExtendedB; + + /// + /// Represents the 'Cham' Unicode block (U+AA00..U+AA5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Cham + { + get + { + return Volatile.Read(ref _cham) ?? CreateBlock(ref _cham, first: '\uAA00', last: '\uAA5F'); + } + } + private static UnicodeBlock _cham; + + /// + /// Represents the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MyanmarExtendedA + { + get + { + return Volatile.Read(ref _myanmarExtendedA) ?? CreateBlock(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); + } + } + private static UnicodeBlock _myanmarExtendedA; + + /// + /// Represents the 'Tai Viet' Unicode block (U+AA80..U+AADF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. + /// + public static UnicodeBlock TaiViet + { + get + { + return Volatile.Read(ref _taiViet) ?? CreateBlock(ref _taiViet, first: '\uAA80', last: '\uAADF'); + } + } + private static UnicodeBlock _taiViet; + + /// + /// Represents the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MeeteiMayekExtensions + { + get + { + return Volatile.Read(ref _meeteiMayekExtensions) ?? CreateBlock(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); + } + } + private static UnicodeBlock _meeteiMayekExtensions; + + /// + /// Represents the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock EthiopicExtendedA + { + get + { + return Volatile.Read(ref _ethiopicExtendedA) ?? CreateBlock(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); + } + } + private static UnicodeBlock _ethiopicExtendedA; + + /// + /// Represents the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. + /// + public static UnicodeBlock LatinExtendedE + { + get + { + return Volatile.Read(ref _latinExtendedE) ?? CreateBlock(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); + } + } + private static UnicodeBlock _latinExtendedE; + + /// + /// Represents the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock MeeteiMayek + { + get + { + return Volatile.Read(ref _meeteiMayek) ?? CreateBlock(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); + } + } + private static UnicodeBlock _meeteiMayek; + + /// + /// Represents the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulSyllables + { + get + { + return Volatile.Read(ref _hangulSyllables) ?? CreateBlock(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); + } + } + private static UnicodeBlock _hangulSyllables; + + /// + /// Represents the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HangulJamoExtendedB + { + get + { + return Volatile.Read(ref _hangulJamoExtendedB) ?? CreateBlock(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); + } + } + private static UnicodeBlock _hangulJamoExtendedB; + + /// + /// Represents the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKCompatibilityIdeographs + { + get + { + return Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateBlock(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); + } + } + private static UnicodeBlock _cjkCompatibilityIdeographs; + + /// + /// Represents the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock AlphabeticPresentationForms + { + get + { + return Volatile.Read(ref _alphabeticPresentationForms) ?? CreateBlock(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); + } + } + private static UnicodeBlock _alphabeticPresentationForms; + + /// + /// Represents the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicPresentationFormsA + { + get + { + return Volatile.Read(ref _arabicPresentationFormsA) ?? CreateBlock(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); + } + } + private static UnicodeBlock _arabicPresentationFormsA; + + /// + /// Represents the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock VariationSelectors + { + get + { + return Volatile.Read(ref _variationSelectors) ?? CreateBlock(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); + } + } + private static UnicodeBlock _variationSelectors; + + /// + /// Represents the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. + /// + public static UnicodeBlock VerticalForms + { + get + { + return Volatile.Read(ref _verticalForms) ?? CreateBlock(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); + } + } + private static UnicodeBlock _verticalForms; + + /// + /// Represents the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CombiningHalfMarks + { + get + { + return Volatile.Read(ref _combiningHalfMarks) ?? CreateBlock(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); + } + } + private static UnicodeBlock _combiningHalfMarks; + + /// + /// Represents the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. + /// + public static UnicodeBlock CJKCompatibilityForms + { + get + { + return Volatile.Read(ref _cjkCompatibilityForms) ?? CreateBlock(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); + } + } + private static UnicodeBlock _cjkCompatibilityForms; + + /// + /// Represents the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. + /// + public static UnicodeBlock SmallFormVariants + { + get + { + return Volatile.Read(ref _smallFormVariants) ?? CreateBlock(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); + } + } + private static UnicodeBlock _smallFormVariants; + + /// + /// Represents the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. + /// + public static UnicodeBlock ArabicPresentationFormsB + { + get + { + return Volatile.Read(ref _arabicPresentationFormsB) ?? CreateBlock(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); + } + } + private static UnicodeBlock _arabicPresentationFormsB; + + /// + /// Represents the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. + /// + public static UnicodeBlock HalfwidthandFullwidthForms + { + get + { + return Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateBlock(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); + } + } + private static UnicodeBlock _halfwidthandFullwidthForms; + + /// + /// Represents the 'Specials' Unicode block (U+FFF0..U+FFFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. + /// + public static UnicodeBlock Specials + { + get + { + return Volatile.Read(ref _specials) ?? CreateBlock(ref _specials, first: '\uFFF0', last: '\uFFFF'); + } + } + private static UnicodeBlock _specials; + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs index 45ba58e02b..6a382b8a4d 100644 --- a/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs +++ b/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs @@ -6,14 +6,13 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Text; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { internal unsafe abstract class UnicodeEncoderBase { // A bitmap of characters which are allowed to be returned unescaped. - private readonly uint[] _allowedCharsBitmap = new uint[0x10000 / 32]; + private AllowedCharsBitmap _allowedCharsBitmap; // The worst-case number of output chars generated for any input char. private readonly int _maxOutputCharsPerInputChar; @@ -21,25 +20,10 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using a custom allow list of characters. /// - protected UnicodeEncoderBase(ICodePointFilter[] filters, int maxOutputCharsPerInputChar) + protected UnicodeEncoderBase(CodePointFilter filter, int maxOutputCharsPerInputChar) { _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar; - - if (filters != null) - { - // Punch a hole for each allowed code point across all filters (this is an OR). - // We don't allow supplementary (astral) characters for now. - foreach (var filter in filters) - { - foreach (var codePoint in filter.GetAllowedCodePoints()) - { - if (!UnicodeHelpers.IsSupplementaryCodePoint(codePoint)) - { - AllowCharacter((char)codePoint); - } - } - } - } + _allowedCharsBitmap = filter.GetAllowedCharsBitmap(); // Forbid characters that are special in HTML. // Even though this is a common encoder used by everybody (including URL @@ -55,38 +39,29 @@ namespace Microsoft.Framework.WebEncoders // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) - uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); - Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); - for (int i = 0; i < _allowedCharsBitmap.Length; i++) - { - _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; - } - } - - // Marks a character as allowed (can be returned unencoded) - private void AllowCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] |= 0x1U << offset; + _allowedCharsBitmap.ForbidUndefinedCharacters(); } // Marks a character as forbidden (must be returned encoded) protected void ForbidCharacter(char c) { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] &= ~(0x1U << offset); + _allowedCharsBitmap.ForbidCharacter(c); } - + /// /// Entry point to the encoder. /// - public void Encode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output) + public void Encode(char[] value, int startIndex, int charCount, TextWriter output) { // Input checking + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } ValidateInputs(startIndex, charCount, actualInputLength: value.Length); if (charCount != 0) @@ -137,9 +112,17 @@ namespace Microsoft.Framework.WebEncoders /// /// Entry point to the encoder. /// - public void Encode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output) + public void Encode(string value, int startIndex, int charCount, TextWriter output) { // Input checking + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } ValidateInputs(startIndex, charCount, actualInputLength: value.Length); if (charCount != 0) @@ -249,10 +232,7 @@ namespace Microsoft.Framework.WebEncoders [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool IsCharacterAllowed(char c) { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; + return _allowedCharsBitmap.IsCharacterAllowed(c); } private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 8df2b5bce5..d3c66a26b3 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -13,6 +13,8 @@ namespace Microsoft.Framework.WebEncoders /// can be represented unescaped. /// /// + /// Instances of this type will always encode a certain set of characters (such as + + /// and ?), even if the filter provided in the constructor allows such characters. /// Once constructed, instances of this class are thread-safe for multiple callers. /// public sealed class UrlEncoder : IUrlEncoder @@ -32,10 +34,19 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom allow list of characters. + /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// pass through the encoder unescaped. /// - public UrlEncoder(params ICodePointFilter[] filters) - : this(new UrlUnicodeEncoder(filters)) + public UrlEncoder(params UnicodeBlock[] allowedBlocks) + : this(new UrlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + { + } + + /// + /// Instantiates an encoder using a custom code point filter. + /// + public UrlEncoder(ICodePointFilter filter) + : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } @@ -98,8 +109,8 @@ namespace Microsoft.Framework.WebEncoders // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char. private const int MaxOutputCharsPerInputChar = 9; - internal UrlUnicodeEncoder(ICodePointFilter[] filters) - : base(filters, MaxOutputCharsPerInputChar) + internal UrlUnicodeEncoder(CodePointFilter filter) + : base(filter, MaxOutputCharsPerInputChar) { // Per RFC 3987, Sec. 2.2, we want encodings that are safe for // 'isegment', 'iquery', and 'ifragment'. The only thing these @@ -152,7 +163,7 @@ namespace Microsoft.Framework.WebEncoders UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new UrlUnicodeEncoder(new[] { CodePointFilters.BasicLatin }); + encoder = new UrlUnicodeEncoder(new CodePointFilter()); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index e61fe47605..15a2417f33 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,6 +5,9 @@ "allowUnsafe": true }, "dependencies": { + "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { From 00864c1af4b854ef396794ea306e77c2a5ec9986 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Wed, 25 Feb 2015 16:05:22 -0800 Subject: [PATCH 0430/1838] Hosting API review feedback # 1 Addresses: https://github.com/aspnet/Hosting/issues/164 https://github.com/aspnet/Hosting/issues/163 https://github.com/aspnet/Hosting/issues/155 https://github.com/aspnet/Hosting/issues/156 https://github.com/aspnet/Hosting/issues/154 --- .../ApplicationLifetime.cs | 4 +- .../HostingContext.cs | 5 +-- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 34 +++++++++------ .../HostingServicesCollectionExtensions.cs | 5 +-- src/Microsoft.AspNet.Hosting/Program.cs | 7 ++-- .../{IServerManager.cs => IServerLoader.cs} | 4 +- .../{ServerManager.cs => ServerLoader.cs} | 6 +-- .../Startup/IStartupLoaderProvider.cs | 12 ------ .../Startup/IStartupManager.cs | 16 ------- .../Startup/NullStartupLoader.cs | 28 ------------- .../Startup/StartupLoader.cs | 12 ++---- .../Startup/StartupLoaderProvider.cs | 24 ----------- .../Startup/StartupManager.cs | 42 ------------------- src/Microsoft.AspNet.TestHost/TestServer.cs | 6 +-- .../HostingEngineTests.cs | 3 +- .../StartupManagerTests.cs | 30 +++++++------ .../UseRequestServicesFacts.cs | 6 +-- 17 files changed, 62 insertions(+), 182 deletions(-) rename src/Microsoft.AspNet.Hosting/Server/{IServerManager.cs => IServerLoader.cs} (71%) rename src/Microsoft.AspNet.Hosting/Server/{ServerManager.cs => ServerLoader.cs} (93%) delete mode 100644 src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs index d1db40def4..3d9fa53b8b 100644 --- a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Hosting /// /// Signals the ApplicationStopping event and blocks until it completes. /// - public void SignalStopping() + public void NotifyStopping() { try { @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Hosting /// /// Signals the ApplicationStopped event and blocks until it completes. /// - public void SignalStopped() + public void NotifyStopped() { try { diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index e7ddd9b863..c3bcba3d26 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -3,7 +3,6 @@ using System; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Hosting.Server; using Microsoft.Framework.ConfigurationModel; @@ -11,7 +10,7 @@ namespace Microsoft.AspNet.Hosting { public class HostingContext { - public IServiceProvider Services { get; set; } + public IApplicationLifetime ApplicationLifeTime { get; set; } public IConfiguration Configuration { get; set; } public IApplicationBuilder Builder { get; set; } @@ -21,7 +20,7 @@ namespace Microsoft.AspNet.Hosting public Action ApplicationStartup { get; set; } public RequestDelegate ApplicationDelegate { get; set; } - public string ServerName { get; set; } + public string ServerFactoryAssembly { get; set; } public IServerFactory ServerFactory { get; set; } public IServerInformation Server { get; set; } } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 83ef3a8d8e..7b86e8ce42 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -2,31 +2,32 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Linq; using System.Threading; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting { public class HostingEngine : IHostingEngine { - private readonly IServerManager _serverManager; - private readonly IStartupManager _startupManager; + private readonly IServerLoader _serverManager; + private readonly IStartupLoader _startupLoader; private readonly IApplicationBuilderFactory _builderFactory; private readonly IHttpContextFactory _httpContextFactory; private readonly IHttpContextAccessor _contextAccessor; public HostingEngine( - IServerManager serverManager, - IStartupManager startupManager, + IServerLoader serverManager, + IStartupLoader startupLoader, IApplicationBuilderFactory builderFactory, IHttpContextFactory httpContextFactory, IHttpContextAccessor contextAccessor) { _serverManager = serverManager; - _startupManager = startupManager; + _startupLoader = startupLoader; _builderFactory = builderFactory; _httpContextFactory = httpContextFactory; _contextAccessor = contextAccessor; @@ -39,16 +40,16 @@ namespace Microsoft.AspNet.Hosting InitalizeServerFactory(context); EnsureApplicationDelegate(context); - var applicationLifetime = (ApplicationLifetime)context.Services.GetRequiredService(); + var applicationLifetime = (ApplicationLifetime)context.ApplicationLifeTime; var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate, _contextAccessor); var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); - + return new Disposable(() => { - applicationLifetime.SignalStopping(); + applicationLifetime.NotifyStopping(); server.Dispose(); pipeline.Dispose(); - applicationLifetime.SignalStopped(); + applicationLifetime.NotifyStopped(); }); } @@ -69,7 +70,7 @@ namespace Microsoft.AspNet.Hosting return; } - context.ServerFactory = _serverManager.GetServerFactory(context.ServerName); + context.ServerFactory = _serverManager.LoadServerFactory(context.ServerFactoryAssembly); } private void InitalizeServerFactory(HostingContext context) @@ -105,9 +106,16 @@ namespace Microsoft.AspNet.Hosting return; } - context.ApplicationStartup = _startupManager.LoadStartup( + var diagnosticMessages = new List(); + context.ApplicationStartup = _startupLoader.LoadStartup( context.ApplicationName, - context.EnvironmentName); + context.EnvironmentName, + diagnosticMessages); + + if (context.ApplicationStartup == null) + { + throw new Exception(diagnosticMessages.Aggregate("TODO: web application entrypoint not found message", (a, b) => a + "\r\n" + b)); + } } private class Disposable : IDisposable diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 8c52a6910d..1c698d3f49 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -26,10 +26,9 @@ namespace Microsoft.Framework.DependencyInjection var describer = new ServiceDescriber(configuration); services.TryAdd(describer.Transient()); - services.TryAdd(describer.Transient()); + services.TryAdd(describer.Transient()); - services.TryAdd(describer.Transient()); - services.TryAdd(describer.Transient()); + services.TryAdd(describer.Transient()); services.TryAdd(describer.Transient()); services.TryAdd(describer.Transient()); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 8376913626..96b1478529 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -24,8 +24,6 @@ namespace Microsoft.AspNet.Hosting _serviceProvider = serviceProvider; } - - public void Main(string[] args) { var config = new Configuration(); @@ -41,12 +39,13 @@ namespace Microsoft.AspNet.Hosting var appEnv = services.GetRequiredService(); var hostingEnv = services.GetRequiredService(); + var applicationLifeTime = services.GetRequiredService(); var context = new HostingContext() { - Services = services, + ApplicationLifeTime = applicationLifeTime, Configuration = config, - ServerName = config.Get("server"), // TODO: Key names + ServerFactoryAssembly = config.Get("server"), // TODO: Key names ApplicationName = config.Get("app") // TODO: Key names ?? appEnv.ApplicationName, EnvironmentName = hostingEnv.EnvironmentName, diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs similarity index 71% rename from src/Microsoft.AspNet.Hosting/Server/IServerManager.cs rename to src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs index 92aa79dfd2..f0b91fcf8f 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs @@ -3,8 +3,8 @@ namespace Microsoft.AspNet.Hosting.Server { - public interface IServerManager + public interface IServerLoader { - IServerFactory GetServerFactory(string serverName); + IServerFactory LoadServerFactory(string serverName); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs similarity index 93% rename from src/Microsoft.AspNet.Hosting/Server/ServerManager.cs rename to src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index d59cb979fc..9354eff0a8 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerManager.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -8,16 +8,16 @@ using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Server { - public class ServerManager : IServerManager + public class ServerLoader : IServerLoader { private readonly IServiceProvider _services; - public ServerManager(IServiceProvider services) + public ServerLoader(IServiceProvider services) { _services = services; } - public IServerFactory GetServerFactory(string serverFactoryIdentifier) + public IServerFactory LoadServerFactory(string serverFactoryIdentifier) { if (string.IsNullOrEmpty(serverFactoryIdentifier)) { diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs deleted file mode 100644 index a134f501e5..0000000000 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoaderProvider.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Hosting.Startup -{ - public interface IStartupLoaderProvider - { - int Order { get; } - - IStartupLoader CreateStartupLoader(IStartupLoader next); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs deleted file mode 100644 index 15932fb21b..0000000000 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupManager.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Hosting.Startup -{ - public interface IStartupManager - { - Action LoadStartup( - string applicationName, - string environmentName); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs deleted file mode 100644 index ae672d4598..0000000000 --- a/src/Microsoft.AspNet.Hosting/Startup/NullStartupLoader.cs +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Hosting.Startup -{ - public class NullStartupLoader : IStartupLoader - { - static NullStartupLoader() - { - Instance = new NullStartupLoader(); - } - - public static IStartupLoader Instance { get; private set; } - - public Action LoadStartup( - string applicationName, - string environmentName, - IList diagnosticMessages) - { - return null; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index a7e85283bf..2fb227d5f1 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -15,14 +15,10 @@ namespace Microsoft.AspNet.Hosting.Startup public class StartupLoader : IStartupLoader { private readonly IServiceProvider _services; - private readonly IStartupLoader _next; - public StartupLoader( - IServiceProvider services, - IStartupLoader next) + public StartupLoader(IServiceProvider services) { _services = services; - _next = next; } private MethodInfo FindMethod(Type startupType, string methodName, string environmentName, Type returnType = null, bool required = true) @@ -94,9 +90,9 @@ namespace Microsoft.AspNet.Hosting.Startup string environmentName, IList diagnosticMessages) { - if (String.IsNullOrEmpty(applicationName)) + if (string.IsNullOrEmpty(applicationName)) { - return _next.LoadStartup(applicationName, environmentName, diagnosticMessages); + throw new ArgumentNullException("applicationName"); } var assembly = Assembly.Load(new AssemblyName(applicationName)); @@ -156,7 +152,7 @@ namespace Microsoft.AspNet.Hosting.Startup { // IServiceProvider ConfigureServices(IServiceCollection) builder.ApplicationServices = (Invoke(servicesMethod, instance, builder, services) as IServiceProvider) - ?? builder.ApplicationServices; + ?? builder.ApplicationServices; } else { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs deleted file mode 100644 index 22cfe0872a..0000000000 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoaderProvider.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Hosting.Startup -{ - public class StartupLoaderProvider : IStartupLoaderProvider - { - private readonly IServiceProvider _services; - - public StartupLoaderProvider(IServiceProvider services) - { - _services = services; - } - - public int Order { get { return -100; } } - - public IStartupLoader CreateStartupLoader(IStartupLoader next) - { - return new StartupLoader(_services, next); - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs deleted file mode 100644 index 8f7249899f..0000000000 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupManager.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Hosting.Startup -{ - public class StartupManager : IStartupManager - { - private readonly IEnumerable _providers; - - public StartupManager(IEnumerable providers) - { - _providers = providers; - } - - public Action LoadStartup( - string applicationName, - string environmentName) - { - // build ordered chain of application loaders - var chain = _providers - .OrderBy(provider => provider.Order) - .Aggregate(NullStartupLoader.Instance, (next, provider) => provider.CreateStartupLoader(next)); - - // invoke chain to acquire application entrypoint and diagnostic messages - var diagnosticMessages = new List(); - var application = chain.LoadStartup(applicationName, environmentName, diagnosticMessages); - - if (application == null) - { - throw new Exception(diagnosticMessages.Aggregate("TODO: web application entrypoint not found message", (a, b) => a + "\r\n" + b)); - } - - return application; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 54b908133e..6505344c2e 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -2,10 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; -using System.Linq; using System.Net.Http; -using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; @@ -31,13 +28,14 @@ namespace Microsoft.AspNet.TestHost public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { var appEnv = serviceProvider.GetRequiredService(); + var applicationLifeTime = serviceProvider.GetRequiredService(); HostingContext hostContext = new HostingContext() { ApplicationName = appEnv.ApplicationName, + ApplicationLifeTime = applicationLifeTime, Configuration = config, ServerFactory = this, - Services = serviceProvider, ApplicationStartup = appStartup }; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 3c6d5c13b6..3784c49be0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -34,11 +34,12 @@ namespace Microsoft.AspNet.Hosting var services = HostingServices.Create().BuildServiceProvider(); var engine = services.GetRequiredService(); + var applicationLifeTime = services.GetRequiredService(); var context = new HostingContext { + ApplicationLifeTime = applicationLifeTime, ServerFactory = this, - Services = services, ApplicationName = "Microsoft.AspNet.Hosting.Tests" }; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index f3323b978a..43e9c13eee 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -25,9 +25,10 @@ namespace Microsoft.AspNet.Hosting.Tests serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetRequiredService(); + var loader = services.GetRequiredService(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithServices"); + var diagnosticMessages = new List(); + var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithServices", diagnosticMessages); startup.Invoke(new ApplicationBuilder(services)); @@ -45,9 +46,10 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { var services = HostingServices.Create().BuildServiceProvider(); - var manager = services.GetRequiredService(); + var loader = services.GetRequiredService(); + var diagnosticMesssages = new List(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", environment ?? ""); + var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", environment ?? "", diagnosticMesssages); var app = new ApplicationBuilder(services); @@ -65,9 +67,10 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupClassConfigureServicesThatFallsbackToApplicationServices(string env) { var services = HostingServices.Create().BuildServiceProvider(); - var manager = services.GetRequiredService(); + var loader = services.GetRequiredService(); + var diagnosticMessages = new List(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", env); + var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", env, diagnosticMessages); var app = new ApplicationBuilder(services); @@ -82,9 +85,10 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupClassWithConfigureServicesAndUseServicesHidesConfigureServices() { var services = HostingServices.Create().BuildServiceProvider(); - var manager = services.GetRequiredService(); + var loader = services.GetRequiredService(); + var diagnosticMessages = new List(); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "UseServices"); + var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "UseServices", diagnosticMessages); var app = new ApplicationBuilder(services); @@ -105,9 +109,10 @@ namespace Microsoft.AspNet.Hosting.Tests var serviceCollection = HostingServices.Create(); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetRequiredService(); + var loader = services.GetRequiredService(); + var diagnosticMessages = new List(); - var ex = Assert.Throws(() => manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "Boom")); + var ex = Assert.Throws(() => loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); Assert.True(ex.Message.Contains("ConfigureBoom or Configure method not found")); } @@ -116,11 +121,12 @@ namespace Microsoft.AspNet.Hosting.Tests { var serviceCollection = HostingServices.Create(); var services = serviceCollection.BuildServiceProvider(); - var manager = services.GetRequiredService(); + var loader = services.GetRequiredService(); var app = new ApplicationBuilder(services); - var startup = manager.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithConfigureServices"); + var diagnosticMessages = new List(); + var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithConfigureServices", diagnosticMessages); startup.Invoke(app); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index e247d4ec64..44cd34f8f9 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -5,7 +5,6 @@ using System; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.RequestContainer; using Microsoft.Framework.DependencyInjection; @@ -83,11 +82,8 @@ namespace Microsoft.AspNet.Hosting.Tests [Theory] [InlineData(typeof(IHostingEngine))] - [InlineData(typeof(IServerManager))] - [InlineData(typeof(IStartupManager))] - [InlineData(typeof(IStartupLoaderProvider))] + [InlineData(typeof(IServerLoader))] [InlineData(typeof(IApplicationBuilderFactory))] - [InlineData(typeof(IStartupLoaderProvider))] [InlineData(typeof(IHttpContextFactory))] [InlineData(typeof(ITypeActivator))] [InlineData(typeof(IApplicationLifetime))] From a2eec4f863bc6d5c3bad43a483ac0041b2b98cb5 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Wed, 25 Feb 2015 17:48:46 -0800 Subject: [PATCH 0431/1838] Changing the IHttpContextFactory.CreateHttpContext take in a IFeatureCollection Addresses: https://github.com/aspnet/Hosting/issues/162 --- .../IServerFactory.cs | 3 ++- src/Microsoft.AspNet.Hosting.Interfaces/project.json | 8 ++++---- .../Builder/HttpContextFactory.cs | 7 +++---- .../Builder/IHttpContextFactory.cs | 3 ++- src/Microsoft.AspNet.Hosting/PipelineInstance.cs | 5 +++-- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 4 ++-- src/Microsoft.AspNet.TestHost/TestServer.cs | 9 +++++---- .../Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 7 ++++--- 8 files changed, 25 insertions(+), 21 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs index 979730e5de..f389a1ec4c 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs @@ -4,6 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.FeatureModel; using Microsoft.Framework.ConfigurationModel; namespace Microsoft.AspNet.Hosting.Server @@ -11,6 +12,6 @@ namespace Microsoft.AspNet.Hosting.Server public interface IServerFactory { IServerInformation Initialize(IConfiguration configuration); - IDisposable Start(IServerInformation serverInformation, Func application); + IDisposable Start(IServerInformation serverInformation, Func application); } } diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index 9e5b132ac8..6f33dd5cea 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -2,12 +2,12 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*" }, - "frameworks": { - "aspnet50": { }, - "aspnetcore50": { } + "aspnet50": {}, + "aspnetcore50": {} } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 227d7bd2f4..9c03e2fcb1 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -9,11 +9,10 @@ namespace Microsoft.AspNet.Hosting.Builder { public class HttpContextFactory : IHttpContextFactory { - public HttpContext CreateHttpContext(object serverContext) + public HttpContext CreateHttpContext(IFeatureCollection featureCollection) { - var featureObject = serverContext as IFeatureCollection ?? new FeatureObject(serverContext); - var featureCollection = new FeatureCollection(featureObject); - var httpContext = new DefaultHttpContext(featureCollection); + var featureObject = featureCollection ?? new FeatureObject(null); + var httpContext = new DefaultHttpContext(new FeatureCollection(featureObject)); return httpContext; } } diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs index cdd6be9fac..ba3e7a36dc 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -1,12 +1,13 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting.Builder { public interface IHttpContextFactory { - HttpContext CreateHttpContext(object serverContext); + HttpContext CreateHttpContext(IFeatureCollection featureCollection); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs index d69a700c94..3d14ee404c 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/PipelineInstance.cs @@ -4,6 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Builder; namespace Microsoft.AspNet.Hosting @@ -21,9 +22,9 @@ namespace Microsoft.AspNet.Hosting _contextAccessor = contextAccessor; } - public Task Invoke(object serverEnvironment) + public Task Invoke(IFeatureCollection featureCollection) { - var httpContext = _httpContextFactory.CreateHttpContext(serverEnvironment); + var httpContext = _httpContextFactory.CreateHttpContext(featureCollection); _contextAccessor.Value = httpContext; return _requestDelegate(httpContext); } diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 1549565532..f190c0b539 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -23,14 +23,14 @@ namespace Microsoft.AspNet.TestHost /// public class ClientHandler : HttpMessageHandler { - private readonly Func _next; + private readonly Func _next; private readonly PathString _pathBase; /// /// Create a new handler. /// /// The pipeline entry point. - public ClientHandler(Func next, PathString pathBase) + public ClientHandler(Func next, PathString pathBase) { if (next == null) { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 6505344c2e..ef7c53c2d1 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -5,6 +5,7 @@ using System; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; @@ -21,7 +22,7 @@ namespace Microsoft.AspNet.TestHost private const string DefaultEnvironmentName = "Development"; private const string ServerName = nameof(TestServer); private static readonly ServerInformation ServerInfo = new ServerInformation(); - private Func _appDelegate; + private Func _appDelegate; private IDisposable _appInstance; private bool _disposed = false; @@ -83,7 +84,7 @@ namespace Microsoft.AspNet.TestHost return ServerInfo; } - public IDisposable Start(IServerInformation serverInformation, Func application) + public IDisposable Start(IServerInformation serverInformation, Func application) { if (!(serverInformation.GetType() == typeof(ServerInformation))) { @@ -95,13 +96,13 @@ namespace Microsoft.AspNet.TestHost return this; } - public Task Invoke(object env) + public Task Invoke(IFeatureCollection featureCollection) { if (_disposed) { throw new ObjectDisposedException(GetType().FullName); } - return _appDelegate(env); + return _appDelegate(featureCollection); } public void Dispose() diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 3784c49be0..e8395c649f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Server; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; @@ -73,7 +74,7 @@ namespace Microsoft.AspNet.Hosting return null; } - public IDisposable Start(IServerInformation serverInformation, Func application) + public IDisposable Start(IServerInformation serverInformation, Func application) { var startInstance = new StartInstance(application); _startInstances.Add(startInstance); @@ -82,9 +83,9 @@ namespace Microsoft.AspNet.Hosting public class StartInstance : IDisposable { - private readonly Func _application; + private readonly Func _application; - public StartInstance(Func application) + public StartInstance(Func application) { _application = application; } From 435215b542586f2ab2f2a34df8e89b5bc7e52873 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Thu, 26 Feb 2015 10:38:39 -0800 Subject: [PATCH 0432/1838] PR comments --- .../Builder/HttpContextFactory.cs | 4 +--- src/Microsoft.AspNet.Hosting/HostingContext.cs | 4 ++-- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 8 +++++--- src/Microsoft.AspNet.Hosting/Program.cs | 6 +++--- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 4 ++-- 7 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 9c03e2fcb1..8089252955 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -11,9 +11,7 @@ namespace Microsoft.AspNet.Hosting.Builder { public HttpContext CreateHttpContext(IFeatureCollection featureCollection) { - var featureObject = featureCollection ?? new FeatureObject(null); - var httpContext = new DefaultHttpContext(new FeatureCollection(featureObject)); - return httpContext; + return new DefaultHttpContext(featureCollection); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index c3bcba3d26..f5dd096850 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Hosting { public class HostingContext { - public IApplicationLifetime ApplicationLifeTime { get; set; } + public IApplicationLifetime ApplicationLifetime { get; set; } public IConfiguration Configuration { get; set; } public IApplicationBuilder Builder { get; set; } @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Hosting public Action ApplicationStartup { get; set; } public RequestDelegate ApplicationDelegate { get; set; } - public string ServerFactoryAssembly { get; set; } + public string ServerFactoryLocation { get; set; } public IServerFactory ServerFactory { get; set; } public IServerInformation Server { get; set; } } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 7b86e8ce42..930b5d1851 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Hosting InitalizeServerFactory(context); EnsureApplicationDelegate(context); - var applicationLifetime = (ApplicationLifetime)context.ApplicationLifeTime; + var applicationLifetime = (ApplicationLifetime)context.ApplicationLifetime; var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate, _contextAccessor); var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.Hosting return; } - context.ServerFactory = _serverManager.LoadServerFactory(context.ServerFactoryAssembly); + context.ServerFactory = _serverManager.LoadServerFactory(context.ServerFactoryLocation); } private void InitalizeServerFactory(HostingContext context) @@ -114,7 +114,9 @@ namespace Microsoft.AspNet.Hosting if (context.ApplicationStartup == null) { - throw new Exception(diagnosticMessages.Aggregate("TODO: web application entrypoint not found message", (a, b) => a + "\r\n" + b)); + throw new ArgumentException( + diagnosticMessages.Aggregate("Failed to find an entry point for the web application.", (a, b) => a + "\r\n" + b), + nameof(context)); } } diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 96b1478529..db44580208 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -39,13 +39,13 @@ namespace Microsoft.AspNet.Hosting var appEnv = services.GetRequiredService(); var hostingEnv = services.GetRequiredService(); - var applicationLifeTime = services.GetRequiredService(); + var applicationLifetime = services.GetRequiredService(); var context = new HostingContext() { - ApplicationLifeTime = applicationLifeTime, + ApplicationLifetime = applicationLifetime, Configuration = config, - ServerFactoryAssembly = config.Get("server"), // TODO: Key names + ServerFactoryLocation = config.Get("server"), // TODO: Key names ApplicationName = config.Get("app") // TODO: Key names ?? appEnv.ApplicationName, EnvironmentName = hostingEnv.EnvironmentName, diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 2fb227d5f1..e162cc07d5 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -92,7 +92,7 @@ namespace Microsoft.AspNet.Hosting.Startup { if (string.IsNullOrEmpty(applicationName)) { - throw new ArgumentNullException("applicationName"); + throw new ArgumentException("applicationName"); } var assembly = Assembly.Load(new AssemblyName(applicationName)); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index ef7c53c2d1..a626723572 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -29,12 +29,12 @@ namespace Microsoft.AspNet.TestHost public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) { var appEnv = serviceProvider.GetRequiredService(); - var applicationLifeTime = serviceProvider.GetRequiredService(); + var applicationLifetime = serviceProvider.GetRequiredService(); HostingContext hostContext = new HostingContext() { ApplicationName = appEnv.ApplicationName, - ApplicationLifeTime = applicationLifeTime, + ApplicationLifetime = applicationLifetime, Configuration = config, ServerFactory = this, ApplicationStartup = appStartup diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index e8395c649f..2af5628080 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -35,11 +35,11 @@ namespace Microsoft.AspNet.Hosting var services = HostingServices.Create().BuildServiceProvider(); var engine = services.GetRequiredService(); - var applicationLifeTime = services.GetRequiredService(); + var applicationLifetime = services.GetRequiredService(); var context = new HostingContext { - ApplicationLifeTime = applicationLifeTime, + ApplicationLifetime = applicationLifetime, ServerFactory = this, ApplicationName = "Microsoft.AspNet.Hosting.Tests" }; From 0ca24147a0ac6b6c30170ed13e160f58f91bd493 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 11:06:31 -0800 Subject: [PATCH 0433/1838] Add unit tests and code generation routines --- HttpAbstractions.sln | 15 + .../AllowedCharsBitmap.cs | 7 + .../CodePointFilter.cs | 12 + .../Properties/AssemblyInfo.cs | 7 + .../AllowedCharsBitmapTests.cs | 125 + .../CodePointFilterTests.cs | 369 + .../EncoderCommonTests.cs | 21 + .../EncoderExtensionsTests.cs | 72 + .../Entities.cs | 38 + .../Extensions.cs | 27 + .../HtmlEncoderTests.cs | 269 + .../JavaScriptStringEncoderTests.cs | 331 + ...icrosoft.Framework.WebEncoders.Tests.kproj | 17 + .../ParsedEntity.cs | 17 + .../UnicodeBlockTests.cs | 86 + .../UnicodeBlocksTests.cs | 210 + .../UnicodeEncoderBaseTests.cs | 406 + .../UnicodeHelpersTests.cs | 184 + .../UrlEncoderTests.cs | 302 + .../project.json | 18 + unicode/Blocks.txt | 283 + .../DefinedCharListGenerator/App.config | 6 + .../DefinedCharListGenerator.csproj | 61 + .../DefinedCharListGenerator/Program.cs | 107 + .../Properties/AssemblyInfo.cs | 36 + unicode/Generators/Generators.sln | 28 + .../UnicodeTablesGenerator/App.config | 6 + .../UnicodeTablesGenerator/Program.cs | 109 + .../Properties/AssemblyInfo.cs | 36 + .../UnicodeTablesGenerator.csproj | 61 + unicode/UnicodeData.txt | 27268 ++++++++++++++++ unicode/unicode-copyright.txt | 47 + 32 files changed, 30581 insertions(+) create mode 100644 src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/Entities.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/project.json create mode 100644 unicode/Blocks.txt create mode 100644 unicode/Generators/DefinedCharListGenerator/App.config create mode 100644 unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj create mode 100644 unicode/Generators/DefinedCharListGenerator/Program.cs create mode 100644 unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs create mode 100644 unicode/Generators/Generators.sln create mode 100644 unicode/Generators/UnicodeTablesGenerator/App.config create mode 100644 unicode/Generators/UnicodeTablesGenerator/Program.cs create mode 100644 unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs create mode 100644 unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj create mode 100644 unicode/UnicodeData.txt create mode 100644 unicode/unicode-copyright.txt diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 40feee2b00..042139d424 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -39,6 +39,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers. EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.kproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.kproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -215,6 +217,18 @@ Global {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.ActiveCfg = Release|Any CPU {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.Build.0 = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.ActiveCfg = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.Build.0 = Debug|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.Build.0 = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU + {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -236,5 +250,6 @@ Global {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs index 475c47a2b0..67918e5122 100644 --- a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -25,6 +25,13 @@ namespace Microsoft.Framework.WebEncoders _allowedCharsBitmap[index] |= 0x1U << offset; } + // Marks all characters as forbidden (must be returned encoded) + public void Clear() + { + Array.Clear(_allowedCharsBitmap, 0, _allowedCharsBitmap.Length); + } + + // Creates a deep copy of this bitmap public AllowedCharsBitmap Clone() { AllowedCharsBitmap retVal; diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index 97a43b803b..7fd1201b4b 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -151,6 +151,18 @@ namespace Microsoft.Framework.WebEncoders return this; } + /// + /// Disallows all characters through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter Clear() + { + _allowedCharsBitmap.Clear(); + return this; + } + /// /// Disallows all characters in the specified Unicode character block through the filter. /// diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..9ee9efbfa5 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs new file mode 100644 index 0000000000..0810fb82d8 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class AllowedCharsBitmapTests + { + [Fact] + public void Ctor_EmptyByDefault() + { + // Act + var bitmap = new AllowedCharsBitmap(); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.False(bitmap.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Allow_Forbid_ZigZag() + { + // Arrange + var bitmap = new AllowedCharsBitmap(); + + // Act + // The only chars which are allowed are those whose code points are multiples of 3 or 7 + // who aren't also multiples of 5. Exception: multiples of 35 are allowed. + for (int i = 0; i <= Char.MaxValue; i += 3) + { + bitmap.AllowCharacter((char)i); + } + for (int i = 0; i <= Char.MaxValue; i += 5) + { + bitmap.ForbidCharacter((char)i); + } + for (int i = 0; i <= Char.MaxValue; i += 7) + { + bitmap.AllowCharacter((char)i); + } + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + bool isAllowed = false; + if (i % 3 == 0) { isAllowed = true; } + if (i % 5 == 0) { isAllowed = false; } + if (i % 7 == 0) { isAllowed = true; } + Assert.Equal(isAllowed, bitmap.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Clear_ForbidsEverything() + { + // Arrange + var bitmap = new AllowedCharsBitmap(); + for (int i = 1; i <= Char.MaxValue; i++) + { + bitmap.AllowCharacter((char)i); + } + + // Act + bitmap.Clear(); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.False(bitmap.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Clone_MakesDeepCopy() + { + // Arrange + var originalBitmap = new AllowedCharsBitmap(); + originalBitmap.AllowCharacter('x'); + + // Act + var clonedBitmap = originalBitmap.Clone(); + clonedBitmap.AllowCharacter('y'); + + // Assert + Assert.True(originalBitmap.IsCharacterAllowed('x')); + Assert.False(originalBitmap.IsCharacterAllowed('y')); + Assert.True(clonedBitmap.IsCharacterAllowed('x')); + Assert.True(clonedBitmap.IsCharacterAllowed('y')); + } + + [Fact] + public void ForbidUndefinedCharacters_RemovesUndefinedChars() + { + // Arrange + // We only allow odd-numbered characters in this test so that + // we can validate that we properly merged the two bitmaps together + // rather than simply overwriting the target. + var bitmap = new AllowedCharsBitmap(); + for (int i = 1; i <= Char.MaxValue; i += 2) + { + bitmap.AllowCharacter((char)i); + } + + // Act + bitmap.ForbidUndefinedCharacters(); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (i % 2 == 0) + { + Assert.False(bitmap.IsCharacterAllowed((char)i)); // these chars were never allowed in the original description + } + else + { + Assert.Equal(UnicodeHelpers.IsCharacterDefined((char)i), bitmap.IsCharacterAllowed((char)i)); + } + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs new file mode 100644 index 0000000000..e0dfbfb92a --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -0,0 +1,369 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class CodePointFilterTests + { + [Fact] + public void Ctor_Parameterless_DefaultsToBasicLatin() + { + // Act + var filter = new CodePointFilter(); + + // Assert + for (int i = 0; i <= 0x007F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0080; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Ctor_OtherCodePointFilterAsInterface() + { + // Arrange + var originalFilter = new OddCodePointFilter(); + + // Act + var newFilter = new CodePointFilter(originalFilter); + + // Assert + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.Equal((i % 2) == 1, newFilter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Ctor_OtherCodePointFilterAsConcreteType_Clones() + { + // Arrange + var originalFilter = new CodePointFilter(UnicodeBlocks.None).AllowChar('x'); + + // Act + var newFilter = new CodePointFilter(originalFilter).AllowChar('y'); + + // Assert + Assert.True(originalFilter.IsCharacterAllowed('x')); + Assert.False(originalFilter.IsCharacterAllowed('y')); + Assert.True(newFilter.IsCharacterAllowed('x')); + Assert.True(newFilter.IsCharacterAllowed('y')); + } + + [Fact] + public void Ctor_UnicodeBlocks() + { + // Act + var filter = new CodePointFilter(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); + + // Assert + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i < 0x2C60; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C60; i <= 0x2C7F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C80; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowBlock() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None); + + // Act + var retVal = filter.AllowBlock(UnicodeBlocks.LatinExtendedA); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowBlocks() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None); + + // Act + var retVal = filter.AllowBlocks(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i < 0x2C60; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C60; i <= 0x2C7F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C80; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowChar() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowChar('\u0100'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('\u0100')); + Assert.False(filter.IsCharacterAllowed('\u0101')); + } + + [Fact] + public void AllowChars_Array() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowChars('\u0100', '\u0102'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('\u0100')); + Assert.False(filter.IsCharacterAllowed('\u0101')); + Assert.True(filter.IsCharacterAllowed('\u0102')); + Assert.False(filter.IsCharacterAllowed('\u0103')); + } + + [Fact] + public void AllowChars_String() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowChars("\u0100\u0102"); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('\u0100')); + Assert.False(filter.IsCharacterAllowed('\u0101')); + Assert.True(filter.IsCharacterAllowed('\u0102')); + Assert.False(filter.IsCharacterAllowed('\u0103')); + } + + [Fact] + public void AllowFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.AllowFilter(new OddCodePointFilter()); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= 0x007F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0080; i <= Char.MaxValue; i++) + { + Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void Clear() + { + // Arrange + var filter = new CodePointFilter(); + for (int i = 1; i <= Char.MaxValue; i++) + { + filter.AllowChar((char)i); + } + + // Act + var retVal = filter.Clear(); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void ForbidBlock() + { + // Arrange + var filter = new CodePointFilter(new OddCodePointFilter()); + + // Act + var retVal = filter.ForbidBlock(UnicodeBlocks.Specials); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= 0xFFEF; i++) + { + Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); + } + for (int i = 0xFFF0; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void ForbidBlocks() + { + // Arrange + var filter = new CodePointFilter(new OddCodePointFilter()); + + // Act + var retVal = filter.ForbidBlocks(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i <= 0x007F; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0080; i <= 0xFFEF; i++) + { + Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); + } + for (int i = 0xFFF0; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void ForbidChar() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.ForbidChar('x'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.True(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_Array() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.ForbidChars('x', 'z'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_String() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + + // Act + var retVal = filter.ForbidChars("xz"); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void GetAllowedCodePoints() + { + // Arrange + var expected = Enumerable.Range(UnicodeBlocks.BasicLatin.FirstCodePoint, UnicodeBlocks.BasicLatin.BlockSize) + .Concat(Enumerable.Range(UnicodeBlocks.Specials.FirstCodePoint, UnicodeBlocks.Specials.BlockSize)) + .Except(new int[] { 'x' }) + .OrderBy(i => i) + .ToArray(); + + var filter = new CodePointFilter(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + filter.ForbidChar('x'); + + // Act + var retVal = filter.GetAllowedCodePoints().OrderBy(i => i).ToArray(); + + // Assert + Assert.Equal(expected, retVal); + } + + // a code point filter which allows only odd code points through + private sealed class OddCodePointFilter : ICodePointFilter + { + public IEnumerable GetAllowedCodePoints() + { + for (int i = 1; i <= Char.MaxValue; i += 2) + { + yield return i; + } + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs new file mode 100644 index 0000000000..5e3e9f3817 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderCommonTests + { + [Theory] + [InlineData(10000, 3, 16 * 1024)] // we cap at 16k chars + [InlineData(5000, 3, 15000)] // haven't exceeded the 16k cap + [InlineData(40000, 3, 40000)] // if we spill over the LOH, we still allocate an output buffer equivalent in length to the input buffer + [InlineData(512, Int32.MaxValue, 16 * 1024)] // make sure we can handle numeric overflow + public void GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar, int expectedResult) + { + Assert.Equal(expectedResult, EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsToEncode, worstCaseOutputCharsPerInputChar)); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs new file mode 100644 index 0000000000..d4351a169e --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -0,0 +1,72 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderExtensionsTests + { + [Fact] + public void HtmlEncode_ParameterChecks() + { + Assert.Throws(() => EncoderExtensions.HtmlEncode(null, "Hello!", new StringWriter())); + } + + [Fact] + public void HtmlEncode_PositiveTestCase() + { + // Arrange + IHtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + StringWriter writer = new StringWriter(); + + // Act + encoder.HtmlEncode("Hello+there!", writer); + + // Assert + Assert.Equal("Hello+there!", writer.ToString()); + } + + [Fact] + public void JavaScriptStringEncode_ParameterChecks() + { + Assert.Throws(() => EncoderExtensions.JavaScriptStringEncode(null, "Hello!", new StringWriter())); + } + + [Fact] + public void JavaScriptStringEncode_PositiveTestCase() + { + // Arrange + IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + StringWriter writer = new StringWriter(); + + // Act + encoder.JavaScriptStringEncode("Hello+there!", writer); + + // Assert + Assert.Equal(@"Hello\u002Bthere!", writer.ToString()); + } + + [Fact] + public void UrlEncode_ParameterChecks() + { + Assert.Throws(() => EncoderExtensions.UrlEncode(null, "Hello!", new StringWriter())); + } + + [Fact] + public void UrlEncode_PositiveTestCase() + { + // Arrange + IUrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + StringWriter writer = new StringWriter(); + + // Act + encoder.UrlEncode("Hello+there!", writer); + + // Assert + Assert.Equal("Hello%2Bthere!", writer.ToString()); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs new file mode 100644 index 0000000000..e46df90876 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using Newtonsoft.Json; + +namespace Microsoft.Framework.WebEncoders +{ + internal static class Entities + { + public static readonly IDictionary ParsedEntities = GetParsedEntities(); + + private static IDictionary GetParsedEntities() + { + // read all entries + string allEntitiesText = ReadEntitiesJsonFile(); + var deserializedRawData = new JsonSerializer().Deserialize>(new JsonTextReader(new StringReader(allEntitiesText))); + + // strip out all entries which aren't of the form "&entity;" + foreach (var key in deserializedRawData.Keys.ToArray() /* dupe since we're mutating original structure */) + { + if (!key.StartsWith("&", StringComparison.Ordinal) || !key.EndsWith(";", StringComparison.Ordinal)) + { + deserializedRawData.Remove(key); + } + } + return deserializedRawData; + } + + private static string ReadEntitiesJsonFile() + { + return File.ReadAllText("entities.json"); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs new file mode 100644 index 0000000000..4c9ec94198 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace Microsoft.Framework.WebEncoders +{ + public static class Extensions + { + public static string[] ReadAllLines(this TextReader reader) + { + return ReadAllLinesImpl(reader).ToArray(); + } + + private static IEnumerable ReadAllLinesImpl(TextReader reader) + { + string line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs new file mode 100644 index 0000000000..6da944dc07 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs @@ -0,0 +1,269 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class HtmlEncoderTests + { + [Fact] + public void Ctor_WithCodePointFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + HtmlEncoder encoder = new HtmlEncoder(filter); + + // Act & assert + Assert.Equal("a", encoder.HtmlEncode("a")); + Assert.Equal("b", encoder.HtmlEncode("b")); + Assert.Equal("c", encoder.HtmlEncode("c")); + Assert.Equal("d", encoder.HtmlEncode("d")); + Assert.Equal("�", encoder.HtmlEncode("\0")); // we still always encode control chars + Assert.Equal("&", encoder.HtmlEncode("&")); // we still always encode HTML-special chars + Assert.Equal("￿", encoder.HtmlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + + // Act & assert + Assert.Equal("a", encoder.HtmlEncode("a")); + Assert.Equal("\u00E9", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.HtmlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Ctor_WithNoParameters_DefaultsToBasicLatin() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + + // Act & assert + Assert.Equal("a", encoder.HtmlEncode("a")); + Assert.Equal("é", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("☁", encoder.HtmlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Default_EquivalentToBasicLatin() + { + // Arrange + HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeBlocks.BasicLatin); + HtmlEncoder testEncoder = HtmlEncoder.Default; + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (!IsSurrogateCodePoint(i)) + { + string input = new String((char)i, 1); + Assert.Equal(controlEncoder.HtmlEncode(input), testEncoder.HtmlEncode(input)); + } + } + } + + [Fact] + public void Default_ReturnsSingletonInstance() + { + // Act + HtmlEncoder encoder1 = HtmlEncoder.Default; + HtmlEncoder encoder2 = HtmlEncoder.Default; + + // Assert + Assert.Same(encoder1, encoder2); + } + + [Theory] + [InlineData("<", "<")] + [InlineData(">", ">")] + [InlineData("&", "&")] + [InlineData("'", "'")] + [InlineData("\"", """)] + [InlineData("+", "+")] + public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act + string retVal = encoder.HtmlEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char + } + else + { + if (input == "<") { expected = "<"; } + else if (input == ">") { expected = ">"; } + else if (input == "&") { expected = "&"; } + else if (input == "\"") { expected = """; } + else + { + bool mustEncode = false; + if (i == '\'' || i == '+') + { + mustEncode = true; // apostrophe, plus + } + else if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) + { + mustEncode = true; // control char + } + else if (!UnicodeHelpers.IsCharacterDefined((char)i)) + { + mustEncode = true; // undefined (or otherwise disallowed) char + } + + if (mustEncode) + { + expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); + } + else + { + expected = input; // no encoding + } + } + } + + string retVal = encoder.HtmlEncode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); + string retVal = encoder.HtmlEncode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD𐏿e\uFFFD"; + + // Act + string retVal = encoder.HtmlEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void HtmlEncode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + + // Act & assert + Assert.Equal("", encoder.HtmlEncode("")); + } + + [Fact] + public void HtmlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + string input = "Hello, there!"; + + // Act & assert + Assert.Same(input, encoder.HtmlEncode(input)); + } + + [Fact] + public void HtmlEncode_NullInput_ReturnsNull() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + + // Act & assert + Assert.Null(encoder.HtmlEncode(null)); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal("&Hello, there!", new HtmlEncoder().HtmlEncode("&Hello, there!")); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal("Hello, there!&", new HtmlEncoder().HtmlEncode("Hello, there!&")); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal("Hello, &there!", new HtmlEncoder().HtmlEncode("Hello, &there!")); + } + + [Fact] + public void HtmlEncode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal("Hello, <there>!", new HtmlEncoder().HtmlEncode("Hello, !")); + } + + [Fact] + public void HtmlEncode_CharArray() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + var output = new StringWriter(); + + // Act + encoder.HtmlEncode("Hello+world!".ToCharArray(), 3, 5, output); + + // Assert + Assert.Equal("lo+wo", output.ToString()); + } + + [Fact] + public void HtmlEncode_StringSubstring() + { + // Arrange + HtmlEncoder encoder = new HtmlEncoder(); + var output = new StringWriter(); + + // Act + encoder.HtmlEncode("Hello+world!", 3, 5, output); + + // Assert + Assert.Equal("lo+wo", output.ToString()); + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs new file mode 100644 index 0000000000..470a5b2311 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -0,0 +1,331 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class JavaScriptStringEncoderTests + { + [Fact] + public void Ctor_WithCodePointFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter); + + // Act & assert + Assert.Equal("a", encoder.JavaScriptStringEncode("a")); + Assert.Equal("b", encoder.JavaScriptStringEncode("b")); + Assert.Equal(@"\u0063", encoder.JavaScriptStringEncode("c")); + Assert.Equal("d", encoder.JavaScriptStringEncode("d")); + Assert.Equal(@"\u0000", encoder.JavaScriptStringEncode("\0")); // we still always encode control chars + Assert.Equal(@"\u0026", encoder.JavaScriptStringEncode("&")); // we still always encode HTML-special chars + Assert.Equal(@"\uFFFF", encoder.JavaScriptStringEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + + // Act & assert + Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a")); + Assert.Equal("\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Ctor_WithNoParameters_DefaultsToBasicLatin() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + + // Act & assert + Assert.Equal("a", encoder.JavaScriptStringEncode("a")); + Assert.Equal(@"\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal(@"\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Default_EquivalentToBasicLatin() + { + // Arrange + JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeBlocks.BasicLatin); + JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default; + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (!IsSurrogateCodePoint(i)) + { + string input = new String((char)i, 1); + Assert.Equal(controlEncoder.JavaScriptStringEncode(input), testEncoder.JavaScriptStringEncode(input)); + } + } + } + + [Fact] + public void Default_ReturnsSingletonInstance() + { + // Act + JavaScriptStringEncoder encoder1 = JavaScriptStringEncoder.Default; + JavaScriptStringEncoder encoder2 = JavaScriptStringEncoder.Default; + + // Assert + Assert.Same(encoder1, encoder2); + } + + [Theory] + [InlineData("<", @"\u003C")] + [InlineData(">", @"\u003E")] + [InlineData("&", @"\u0026")] + [InlineData("'", @"\u0027")] + [InlineData("\"", @"\u0022")] + [InlineData("+", @"\u002B")] + [InlineData("\\", @"\\")] + [InlineData("/", @"\/")] + [InlineData("\b", @"\b")] + [InlineData("\f", @"\f")] + [InlineData("\n", @"\n")] + [InlineData("\t", @"\t")] + [InlineData("\r", @"\r")] + public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + + // Act + string retVal = encoder.JavaScriptStringEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char + } + else + { + if (input == "\b") { expected = @"\b"; } + else if (input == "\t") { expected = @"\t"; } + else if (input == "\n") { expected = @"\n"; } + else if (input == "\f") { expected = @"\f"; } + else if (input == "\r") { expected = @"\r"; } + else if (input == "\\") { expected = @"\\"; } + else if (input == "/") { expected = @"\/"; } + else + { + bool mustEncode = false; + switch (i) + { + case '<': + case '>': + case '&': + case '\"': + case '\'': + case '+': + mustEncode = true; + break; + } + + if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) + { + mustEncode = true; // control char + } + else if (!UnicodeHelpers.IsCharacterDefined((char)i)) + { + mustEncode = true; // undefined (or otherwise disallowed) char + } + + if (mustEncode) + { + expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}", i); + } + else + { + expected = input; // no encoding + } + } + } + + string retVal = encoder.JavaScriptStringEncode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}\u{1:X4}", (uint)input[0], (uint)input[1]); + string retVal = encoder.JavaScriptStringEncode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD\\uD800\\uDFFFe\uFFFD"; // 'D800' 'DFFF' was preserved since it's valid + + // Act + string retVal = encoder.JavaScriptStringEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void JavaScriptStringEncode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + + // Act & assert + Assert.Equal("", encoder.JavaScriptStringEncode("")); + } + + [Fact] + public void JavaScriptStringEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + string input = "Hello, there!"; + + // Act & assert + Assert.Same(input, encoder.JavaScriptStringEncode(input)); + } + + [Fact] + public void JavaScriptStringEncode_NullInput_ReturnsNull() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + + // Act & assert + Assert.Null(encoder.JavaScriptStringEncode(null)); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal(@"\u0026Hello, there!", new JavaScriptStringEncoder().JavaScriptStringEncode("&Hello, there!")); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal(@"Hello, there!\u0026", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, there!&")); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal(@"Hello, \u0026there!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, &there!")); + } + + [Fact] + public void JavaScriptStringEncode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal(@"Hello, \u003Cthere\u003E!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, !")); + } + + [Fact] + public void JavaScriptStringEncode_CharArray() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + var output = new StringWriter(); + + // Act + encoder.JavaScriptStringEncode("Hello+world!".ToCharArray(), 3, 5, output); + + // Assert + Assert.Equal(@"lo\u002Bwo", output.ToString()); + } + + [Fact] + public void JavaScriptStringEncode_StringSubstring() + { + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); + var output = new StringWriter(); + + // Act + encoder.JavaScriptStringEncode("Hello+world!", 3, 5, output); + + // Assert + Assert.Equal(@"lo\u002Bwo", output.ToString()); + } + + [Theory] + [InlineData("\"", @"\u0022")] + [InlineData("'", @"\u0027")] + public void JavaScriptStringEncode_Quotes(string input, string expected) + { + // Per the design document, we provide additional defense-in-depth + // against breaking out of HTML attributes by having the encoders + // never emit the ' or " characters. This means that we want to + // \u-escape these characters instead of using \' and \". + + // Arrange + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + + // Act + string retVal = encoder.JavaScriptStringEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void JavaScriptStringEncode_DoesNotOutputHtmlSensitiveCharacters() + { + // Per the design document, we provide additional defense-in-depth + // by never emitting HTML-sensitive characters unescaped. + + // Arrange + JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act & assert + for (int i = 0; i <= 0x10FFFF; i++) + { + if (IsSurrogateCodePoint(i)) + { + continue; // surrogates don't matter here + } + + string javaScriptStringEncoded = javaScriptStringEncoder.JavaScriptStringEncode(Char.ConvertFromUtf32(i)); + string thenHtmlEncoded = htmlEncoder.HtmlEncode(javaScriptStringEncoded); + Assert.Equal(javaScriptStringEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters + } + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj new file mode 100644 index 0000000000..f91eeecab2 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj @@ -0,0 +1,17 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 7ae2731d-43cd-4cf8-850a-4914de2ce930 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + diff --git a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs new file mode 100644 index 0000000000..b8c36b57ad --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs @@ -0,0 +1,17 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Newtonsoft.Json; + +namespace Microsoft.Framework.WebEncoders +{ + internal sealed class ParsedEntity + { + [JsonProperty("codepoints")] + public int[] Codepoints { get; set; } + + [JsonProperty("characters")] + public string DecodedString { get; set; } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs new file mode 100644 index 0000000000..5dee8d76bb --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs @@ -0,0 +1,86 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeBlockTests + { + [Theory] + [InlineData(-1, 16)] + [InlineData(1, 16)] + [InlineData(0x10000, 16)] + public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int blockSize) + { + var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); + Assert.Equal("firstCodePoint", ex.ParamName); + } + + [Theory] + [InlineData(0x0100, -1)] + [InlineData(0x0100, 15)] + [InlineData(0x0100, 0x10000)] + public void Ctor_FailureCase_BlockSize(int firstCodePoint, int blockSize) + { + var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); + Assert.Equal("blockSize", ex.ParamName); + } + + [Fact] + public void Ctor_SuccessCase() + { + // Act + var block = new UnicodeBlock(0x0100, 128); // Latin Extended-A + + // Assert + Assert.Equal(0x0100, block.FirstCodePoint); + Assert.Equal(128, block.BlockSize); + } + + [Theory] + [InlineData('\u0001', '\u0002')] + public void FromCharacterRange_FailureCases_FirstChar(char firstChar, char lastChar) + { + var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); + Assert.Equal("firstChar", ex.ParamName); + } + + [Theory] + [InlineData('\u0100', '\u007F')] + [InlineData('\u0100', '\u0100')] + [InlineData('\u0100', '\u010E')] + public void FromCharacterRange_FailureCases_LastChar(char firstChar, char lastChar) + { + var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); + Assert.Equal("lastChar", ex.ParamName); + } + + [Fact] + public void FromCharacterRange_SuccessCase() + { + // Act + var block = UnicodeBlock.FromCharacterRange('\u0180', '\u024F'); // Latin Extended-B + + // Assert + Assert.Equal(0x0180, block.FirstCodePoint); + Assert.Equal(208, block.BlockSize); + } + + [Fact] + public void FromCharacterRange_SuccessCase_All() + { + // Act + var block = UnicodeBlock.FromCharacterRange('\u0000', '\uFFFF'); + + // Assert + Assert.Equal(0, block.FirstCodePoint); + Assert.Equal(0x10000, block.BlockSize); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs new file mode 100644 index 0000000000..c4eb4591e3 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs @@ -0,0 +1,210 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeBlocksTests + { + [Fact] + public void Block_None() + { + UnicodeBlock block = UnicodeBlocks.None; + Assert.NotNull(block); + + // Test 1: the block should be empty + Assert.Equal(0, block.FirstCodePoint); + Assert.Equal(0, block.BlockSize); + + // Test 2: calling the property multiple times should cache and return the same block instance + UnicodeBlock block2 = UnicodeBlocks.None; + Assert.Same(block, block2); + } + + [Fact] + public void Block_All() + { + Block_Unicode('\u0000', '\uFFFF', nameof(UnicodeBlocks.All)); + } + + [Theory] + [InlineData('\u0000', '\u007F', nameof(UnicodeBlocks.BasicLatin))] + [InlineData('\u0080', '\u00FF', nameof(UnicodeBlocks.Latin1Supplement))] + [InlineData('\u0100', '\u017F', nameof(UnicodeBlocks.LatinExtendedA))] + [InlineData('\u0180', '\u024F', nameof(UnicodeBlocks.LatinExtendedB))] + [InlineData('\u0250', '\u02AF', nameof(UnicodeBlocks.IPAExtensions))] + [InlineData('\u02B0', '\u02FF', nameof(UnicodeBlocks.SpacingModifierLetters))] + [InlineData('\u0300', '\u036F', nameof(UnicodeBlocks.CombiningDiacriticalMarks))] + [InlineData('\u0370', '\u03FF', nameof(UnicodeBlocks.GreekandCoptic))] + [InlineData('\u0400', '\u04FF', nameof(UnicodeBlocks.Cyrillic))] + [InlineData('\u0500', '\u052F', nameof(UnicodeBlocks.CyrillicSupplement))] + [InlineData('\u0530', '\u058F', nameof(UnicodeBlocks.Armenian))] + [InlineData('\u0590', '\u05FF', nameof(UnicodeBlocks.Hebrew))] + [InlineData('\u0600', '\u06FF', nameof(UnicodeBlocks.Arabic))] + [InlineData('\u0700', '\u074F', nameof(UnicodeBlocks.Syriac))] + [InlineData('\u0750', '\u077F', nameof(UnicodeBlocks.ArabicSupplement))] + [InlineData('\u0780', '\u07BF', nameof(UnicodeBlocks.Thaana))] + [InlineData('\u07C0', '\u07FF', nameof(UnicodeBlocks.NKo))] + [InlineData('\u0800', '\u083F', nameof(UnicodeBlocks.Samaritan))] + [InlineData('\u0840', '\u085F', nameof(UnicodeBlocks.Mandaic))] + [InlineData('\u08A0', '\u08FF', nameof(UnicodeBlocks.ArabicExtendedA))] + [InlineData('\u0900', '\u097F', nameof(UnicodeBlocks.Devanagari))] + [InlineData('\u0980', '\u09FF', nameof(UnicodeBlocks.Bengali))] + [InlineData('\u0A00', '\u0A7F', nameof(UnicodeBlocks.Gurmukhi))] + [InlineData('\u0A80', '\u0AFF', nameof(UnicodeBlocks.Gujarati))] + [InlineData('\u0B00', '\u0B7F', nameof(UnicodeBlocks.Oriya))] + [InlineData('\u0B80', '\u0BFF', nameof(UnicodeBlocks.Tamil))] + [InlineData('\u0C00', '\u0C7F', nameof(UnicodeBlocks.Telugu))] + [InlineData('\u0C80', '\u0CFF', nameof(UnicodeBlocks.Kannada))] + [InlineData('\u0D00', '\u0D7F', nameof(UnicodeBlocks.Malayalam))] + [InlineData('\u0D80', '\u0DFF', nameof(UnicodeBlocks.Sinhala))] + [InlineData('\u0E00', '\u0E7F', nameof(UnicodeBlocks.Thai))] + [InlineData('\u0E80', '\u0EFF', nameof(UnicodeBlocks.Lao))] + [InlineData('\u0F00', '\u0FFF', nameof(UnicodeBlocks.Tibetan))] + [InlineData('\u1000', '\u109F', nameof(UnicodeBlocks.Myanmar))] + [InlineData('\u10A0', '\u10FF', nameof(UnicodeBlocks.Georgian))] + [InlineData('\u1100', '\u11FF', nameof(UnicodeBlocks.HangulJamo))] + [InlineData('\u1200', '\u137F', nameof(UnicodeBlocks.Ethiopic))] + [InlineData('\u1380', '\u139F', nameof(UnicodeBlocks.EthiopicSupplement))] + [InlineData('\u13A0', '\u13FF', nameof(UnicodeBlocks.Cherokee))] + [InlineData('\u1400', '\u167F', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabics))] + [InlineData('\u1680', '\u169F', nameof(UnicodeBlocks.Ogham))] + [InlineData('\u16A0', '\u16FF', nameof(UnicodeBlocks.Runic))] + [InlineData('\u1700', '\u171F', nameof(UnicodeBlocks.Tagalog))] + [InlineData('\u1720', '\u173F', nameof(UnicodeBlocks.Hanunoo))] + [InlineData('\u1740', '\u175F', nameof(UnicodeBlocks.Buhid))] + [InlineData('\u1760', '\u177F', nameof(UnicodeBlocks.Tagbanwa))] + [InlineData('\u1780', '\u17FF', nameof(UnicodeBlocks.Khmer))] + [InlineData('\u1800', '\u18AF', nameof(UnicodeBlocks.Mongolian))] + [InlineData('\u18B0', '\u18FF', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabicsExtended))] + [InlineData('\u1900', '\u194F', nameof(UnicodeBlocks.Limbu))] + [InlineData('\u1950', '\u197F', nameof(UnicodeBlocks.TaiLe))] + [InlineData('\u1980', '\u19DF', nameof(UnicodeBlocks.NewTaiLue))] + [InlineData('\u19E0', '\u19FF', nameof(UnicodeBlocks.KhmerSymbols))] + [InlineData('\u1A00', '\u1A1F', nameof(UnicodeBlocks.Buginese))] + [InlineData('\u1A20', '\u1AAF', nameof(UnicodeBlocks.TaiTham))] + [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksExtended))] + [InlineData('\u1B00', '\u1B7F', nameof(UnicodeBlocks.Balinese))] + [InlineData('\u1B80', '\u1BBF', nameof(UnicodeBlocks.Sundanese))] + [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeBlocks.Batak))] + [InlineData('\u1C00', '\u1C4F', nameof(UnicodeBlocks.Lepcha))] + [InlineData('\u1C50', '\u1C7F', nameof(UnicodeBlocks.OlChiki))] + [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeBlocks.SundaneseSupplement))] + [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeBlocks.VedicExtensions))] + [InlineData('\u1D00', '\u1D7F', nameof(UnicodeBlocks.PhoneticExtensions))] + [InlineData('\u1D80', '\u1DBF', nameof(UnicodeBlocks.PhoneticExtensionsSupplement))] + [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksSupplement))] + [InlineData('\u1E00', '\u1EFF', nameof(UnicodeBlocks.LatinExtendedAdditional))] + [InlineData('\u1F00', '\u1FFF', nameof(UnicodeBlocks.GreekExtended))] + [InlineData('\u2000', '\u206F', nameof(UnicodeBlocks.GeneralPunctuation))] + [InlineData('\u2070', '\u209F', nameof(UnicodeBlocks.SuperscriptsandSubscripts))] + [InlineData('\u20A0', '\u20CF', nameof(UnicodeBlocks.CurrencySymbols))] + [InlineData('\u20D0', '\u20FF', nameof(UnicodeBlocks.CombiningDiacriticalMarksforSymbols))] + [InlineData('\u2100', '\u214F', nameof(UnicodeBlocks.LetterlikeSymbols))] + [InlineData('\u2150', '\u218F', nameof(UnicodeBlocks.NumberForms))] + [InlineData('\u2190', '\u21FF', nameof(UnicodeBlocks.Arrows))] + [InlineData('\u2200', '\u22FF', nameof(UnicodeBlocks.MathematicalOperators))] + [InlineData('\u2300', '\u23FF', nameof(UnicodeBlocks.MiscellaneousTechnical))] + [InlineData('\u2400', '\u243F', nameof(UnicodeBlocks.ControlPictures))] + [InlineData('\u2440', '\u245F', nameof(UnicodeBlocks.OpticalCharacterRecognition))] + [InlineData('\u2460', '\u24FF', nameof(UnicodeBlocks.EnclosedAlphanumerics))] + [InlineData('\u2500', '\u257F', nameof(UnicodeBlocks.BoxDrawing))] + [InlineData('\u2580', '\u259F', nameof(UnicodeBlocks.BlockElements))] + [InlineData('\u25A0', '\u25FF', nameof(UnicodeBlocks.GeometricShapes))] + [InlineData('\u2600', '\u26FF', nameof(UnicodeBlocks.MiscellaneousSymbols))] + [InlineData('\u2700', '\u27BF', nameof(UnicodeBlocks.Dingbats))] + [InlineData('\u27C0', '\u27EF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsA))] + [InlineData('\u27F0', '\u27FF', nameof(UnicodeBlocks.SupplementalArrowsA))] + [InlineData('\u2800', '\u28FF', nameof(UnicodeBlocks.BraillePatterns))] + [InlineData('\u2900', '\u297F', nameof(UnicodeBlocks.SupplementalArrowsB))] + [InlineData('\u2980', '\u29FF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsB))] + [InlineData('\u2A00', '\u2AFF', nameof(UnicodeBlocks.SupplementalMathematicalOperators))] + [InlineData('\u2B00', '\u2BFF', nameof(UnicodeBlocks.MiscellaneousSymbolsandArrows))] + [InlineData('\u2C00', '\u2C5F', nameof(UnicodeBlocks.Glagolitic))] + [InlineData('\u2C60', '\u2C7F', nameof(UnicodeBlocks.LatinExtendedC))] + [InlineData('\u2C80', '\u2CFF', nameof(UnicodeBlocks.Coptic))] + [InlineData('\u2D00', '\u2D2F', nameof(UnicodeBlocks.GeorgianSupplement))] + [InlineData('\u2D30', '\u2D7F', nameof(UnicodeBlocks.Tifinagh))] + [InlineData('\u2D80', '\u2DDF', nameof(UnicodeBlocks.EthiopicExtended))] + [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeBlocks.CyrillicExtendedA))] + [InlineData('\u2E00', '\u2E7F', nameof(UnicodeBlocks.SupplementalPunctuation))] + [InlineData('\u2E80', '\u2EFF', nameof(UnicodeBlocks.CJKRadicalsSupplement))] + [InlineData('\u2F00', '\u2FDF', nameof(UnicodeBlocks.KangxiRadicals))] + [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeBlocks.IdeographicDescriptionCharacters))] + [InlineData('\u3000', '\u303F', nameof(UnicodeBlocks.CJKSymbolsandPunctuation))] + [InlineData('\u3040', '\u309F', nameof(UnicodeBlocks.Hiragana))] + [InlineData('\u30A0', '\u30FF', nameof(UnicodeBlocks.Katakana))] + [InlineData('\u3100', '\u312F', nameof(UnicodeBlocks.Bopomofo))] + [InlineData('\u3130', '\u318F', nameof(UnicodeBlocks.HangulCompatibilityJamo))] + [InlineData('\u3190', '\u319F', nameof(UnicodeBlocks.Kanbun))] + [InlineData('\u31A0', '\u31BF', nameof(UnicodeBlocks.BopomofoExtended))] + [InlineData('\u31C0', '\u31EF', nameof(UnicodeBlocks.CJKStrokes))] + [InlineData('\u31F0', '\u31FF', nameof(UnicodeBlocks.KatakanaPhoneticExtensions))] + [InlineData('\u3200', '\u32FF', nameof(UnicodeBlocks.EnclosedCJKLettersandMonths))] + [InlineData('\u3300', '\u33FF', nameof(UnicodeBlocks.CJKCompatibility))] + [InlineData('\u3400', '\u4DBF', nameof(UnicodeBlocks.CJKUnifiedIdeographsExtensionA))] + [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeBlocks.YijingHexagramSymbols))] + [InlineData('\u4E00', '\u9FFF', nameof(UnicodeBlocks.CJKUnifiedIdeographs))] + [InlineData('\uA000', '\uA48F', nameof(UnicodeBlocks.YiSyllables))] + [InlineData('\uA490', '\uA4CF', nameof(UnicodeBlocks.YiRadicals))] + [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeBlocks.Lisu))] + [InlineData('\uA500', '\uA63F', nameof(UnicodeBlocks.Vai))] + [InlineData('\uA640', '\uA69F', nameof(UnicodeBlocks.CyrillicExtendedB))] + [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeBlocks.Bamum))] + [InlineData('\uA700', '\uA71F', nameof(UnicodeBlocks.ModifierToneLetters))] + [InlineData('\uA720', '\uA7FF', nameof(UnicodeBlocks.LatinExtendedD))] + [InlineData('\uA800', '\uA82F', nameof(UnicodeBlocks.SylotiNagri))] + [InlineData('\uA830', '\uA83F', nameof(UnicodeBlocks.CommonIndicNumberForms))] + [InlineData('\uA840', '\uA87F', nameof(UnicodeBlocks.Phagspa))] + [InlineData('\uA880', '\uA8DF', nameof(UnicodeBlocks.Saurashtra))] + [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeBlocks.DevanagariExtended))] + [InlineData('\uA900', '\uA92F', nameof(UnicodeBlocks.KayahLi))] + [InlineData('\uA930', '\uA95F', nameof(UnicodeBlocks.Rejang))] + [InlineData('\uA960', '\uA97F', nameof(UnicodeBlocks.HangulJamoExtendedA))] + [InlineData('\uA980', '\uA9DF', nameof(UnicodeBlocks.Javanese))] + [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeBlocks.MyanmarExtendedB))] + [InlineData('\uAA00', '\uAA5F', nameof(UnicodeBlocks.Cham))] + [InlineData('\uAA60', '\uAA7F', nameof(UnicodeBlocks.MyanmarExtendedA))] + [InlineData('\uAA80', '\uAADF', nameof(UnicodeBlocks.TaiViet))] + [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeBlocks.MeeteiMayekExtensions))] + [InlineData('\uAB00', '\uAB2F', nameof(UnicodeBlocks.EthiopicExtendedA))] + [InlineData('\uAB30', '\uAB6F', nameof(UnicodeBlocks.LatinExtendedE))] + [InlineData('\uABC0', '\uABFF', nameof(UnicodeBlocks.MeeteiMayek))] + [InlineData('\uAC00', '\uD7AF', nameof(UnicodeBlocks.HangulSyllables))] + [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeBlocks.HangulJamoExtendedB))] + [InlineData('\uF900', '\uFAFF', nameof(UnicodeBlocks.CJKCompatibilityIdeographs))] + [InlineData('\uFB00', '\uFB4F', nameof(UnicodeBlocks.AlphabeticPresentationForms))] + [InlineData('\uFB50', '\uFDFF', nameof(UnicodeBlocks.ArabicPresentationFormsA))] + [InlineData('\uFE00', '\uFE0F', nameof(UnicodeBlocks.VariationSelectors))] + [InlineData('\uFE10', '\uFE1F', nameof(UnicodeBlocks.VerticalForms))] + [InlineData('\uFE20', '\uFE2F', nameof(UnicodeBlocks.CombiningHalfMarks))] + [InlineData('\uFE30', '\uFE4F', nameof(UnicodeBlocks.CJKCompatibilityForms))] + [InlineData('\uFE50', '\uFE6F', nameof(UnicodeBlocks.SmallFormVariants))] + [InlineData('\uFE70', '\uFEFF', nameof(UnicodeBlocks.ArabicPresentationFormsB))] + [InlineData('\uFF00', '\uFFEF', nameof(UnicodeBlocks.HalfwidthandFullwidthForms))] + [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeBlocks.Specials))] + public void Block_Unicode(char first, char last, string blockName) + { + Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 + Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF + Assert.True(first < last); // code point ranges should be ordered + + var propInfo = typeof(UnicodeBlocks).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(propInfo); + + UnicodeBlock block = (UnicodeBlock)propInfo.GetValue(null); + Assert.NotNull(block); + + // Test 1: the block should span the range first..last + Assert.Equal(first, block.FirstCodePoint); + Assert.Equal(last, block.FirstCodePoint + block.BlockSize - 1); + + // Test 2: calling the property multiple times should cache and return the same block instance + UnicodeBlock block2 = (UnicodeBlock)propInfo.GetValue(null); + Assert.Same(block, block2); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs new file mode 100644 index 0000000000..06e2fc0c73 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -0,0 +1,406 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using Moq; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeEncoderBaseTests + { + [Fact] + public void Ctor_WithCustomFilters() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter); + + // Act & assert + Assert.Equal("a", encoder.Encode("a")); + Assert.Equal("b", encoder.Encode("b")); + Assert.Equal("[U+0063]", encoder.Encode("c")); + Assert.Equal("d", encoder.Encode("d")); + Assert.Equal("[U+0000]", encoder.Encode("\0")); // we still always encode control chars + Assert.Equal("[U+0026]", encoder.Encode("&")); // we still always encode HTML-special chars + Assert.Equal("[U+FFFF]", encoder.Encode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols)); + + // Act & assert + Assert.Equal("[U+0061]", encoder.Encode("a")); + Assert.Equal("\u00E9", encoder.Encode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.Encode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + const string input = "Hello <>&\'\"+ there!"; + const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!"; + + // Act & assert + Assert.Equal(expected, encoder.Encode(input)); + } + + [Fact] + public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char + } + else + { + bool mustEncode = false; + switch (i) + { + case '<': + case '>': + case '&': + case '\"': + case '\'': + case '+': + mustEncode = true; + break; + } + + if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) + { + mustEncode = true; // control char + } + else if (!UnicodeHelpers.IsCharacterDefined((char)i)) + { + mustEncode = true; // undefined (or otherwise disallowed) char + } + + if (mustEncode) + { + expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", i); + } + else + { + expected = input; // no encoding + } + } + + string retVal = encoder.Encode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X}]", i); + string retVal = encoder.Encode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD[U+103FF]e\uFFFD"; + + // Act + string retVal = encoder.Encode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void Encode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + + // Act & assert + Assert.Equal("", encoder.Encode("")); + } + + [Fact] + public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + string input = "Hello, there!"; + + // Act & assert + Assert.Same(input, encoder.Encode(input)); + } + + [Fact] + public void Encode_NullInput_ReturnsNull() + { + // Arrange + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + + // Act & assert + Assert.Null(encoder.Encode(null)); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("&Hello, there!")); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, there!&")); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, &there!")); + } + + [Fact] + public void Encode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, !")); + } + + [Fact] + public void Encode_CharArray_ParameterChecking_NegativeTestCases() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + + // Act & assert + Assert.Throws(() => encoder.Encode((char[])null, 0, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 0, 3, null)); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), -1, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 4, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, -1, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 1, 3, new StringWriter())); + } + + [Fact] + public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + TextWriter output = new Mock(MockBehavior.Strict).Object; + + // Act + encoder.Encode("abc".ToCharArray(), 2, 0, output); + + // Assert + // If we got this far (without TextWriter throwing), success! + } + + [Fact] + public void Encode_CharArray_AllCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); + + // Assert + Assert.Equal("xy", output.ToString()); + } + + [Fact] + public void Encode_CharArray_AllCharsInvalid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); + + // Assert + Assert.Equal("[U+0078][U+0079]", output.ToString()); + } + + [Fact] + public void Encode_CharArray_SomeCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz".ToCharArray(), 2, 3, output); + + // Assert + Assert.Equal("c[U+0026]x", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_ParameterChecking_NegativeTestCases() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + + // Act & assert + Assert.Throws(() => encoder.Encode((string)null, 0, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 0, 3, null)); + Assert.Throws(() => encoder.Encode("abc", -1, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 2, 2, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 4, 0, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 2, -1, new StringWriter())); + Assert.Throws(() => encoder.Encode("abc", 1, 3, new StringWriter())); + } + + [Fact] + public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); + TextWriter output = new Mock(MockBehavior.Strict).Object; + + // Act + encoder.Encode("abc", 2, 0, output); + + // Assert + // If we got this far (without TextWriter throwing), success! + } + + [Fact] + public void Encode_StringSubstring_AllCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz", 4, 2, output); + + // Assert + Assert.Equal("xy", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + var mockWriter = new Mock(MockBehavior.Strict); + mockWriter.Setup(o => o.Write("abc")).Verifiable(); + + // Act + encoder.Encode("abc", 0, 3, mockWriter.Object); + + // Assert + mockWriter.Verify(); + } + + [Fact] + public void Encode_StringSubstring_AllCharsInvalid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz", 4, 2, output); + + // Assert + Assert.Equal("[U+0078][U+0079]", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_SomeCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + encoder.Encode("abc&xyz", 2, 3, output); + + // Assert + Assert.Equal("c[U+0026]x", output.ToString()); + } + + [Fact] + public void Encode_StringSubstring_EntireString_SomeCharsValid() + { + // Arrange + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + StringWriter output = new StringWriter(); + + // Act + const string input = "abc&xyz"; + encoder.Encode(input, 0, input.Length, output); + + // Assert + Assert.Equal("abc[U+0026]xyz", output.ToString()); + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + + private sealed class CustomCodePointFilter : ICodePointFilter + { + private readonly int[] _allowedCodePoints; + + public CustomCodePointFilter(params int[] allowedCodePoints) + { + _allowedCodePoints = allowedCodePoints; + } + + public IEnumerable GetAllowedCodePoints() + { + return _allowedCodePoints; + } + } + + private sealed class CustomUnicodeEncoderBase : UnicodeEncoderBase + { + // We pass a (known bad) value of 1 for 'max output chars per input char', + // which also tests that the code behaves properly even if the original + // estimate is incorrect. + public CustomUnicodeEncoderBase(CodePointFilter filter) + : base(filter, maxOutputCharsPerInputChar: 1) + { + } + + public CustomUnicodeEncoderBase(params UnicodeBlock[] allowedBlocks) + : this(new CodePointFilter(allowedBlocks)) + { + } + + protected override void WriteEncodedScalar(ref Writer writer, uint value) + { + writer.Write(String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", value)); + } + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs new file mode 100644 index 0000000000..9a2671023a --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -0,0 +1,184 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Text; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public unsafe class UnicodeHelpersTests + { + private const int UnicodeReplacementChar = '\uFFFD'; + + private static readonly UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + + [Fact] + public void GetDefinedCharacterBitmap_ReturnsSingletonInstance() + { + // Act + uint[] retVal1 = UnicodeHelpers.GetDefinedCharacterBitmap(); + uint[] retVal2 = UnicodeHelpers.GetDefinedCharacterBitmap(); + + // Assert + Assert.Same(retVal1, retVal2); + } + + [Theory] + [InlineData(1, "a", (int)'a')] // normal BMP char, end of string + [InlineData(2, "ab", (int)'a')] // normal BMP char, not end of string + [InlineData(3, "\uDFFF", UnicodeReplacementChar)] // trailing surrogate, end of string + [InlineData(4, "\uDFFFx", UnicodeReplacementChar)] // trailing surrogate, not end of string + [InlineData(5, "\uD800", UnicodeReplacementChar)] // leading surrogate, end of string + [InlineData(6, "\uD800x", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by non-surrogate + [InlineData(7, "\uD800\uD800", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by leading surrogate + [InlineData(8, "\uD800\uDFFF", 0x103FF)] // leading surrogate, not end of string, followed by trailing surrogate + public void GetScalarValueFromUtf16(int unused, string input, int expectedResult) + { + // The 'unused' parameter exists because the xunit runner can't distinguish + // the individual malformed data test cases from each other without this + // additional identifier. + + fixed (char* pInput = input) + { + Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1))); + } + } + + [Fact] + public void GetUtf8RepresentationForScalarValue() + { + for (int i = 0; i <= 0x10FFFF; i++) + { + if (i <= 0xFFFF && Char.IsSurrogate((char)i)) + { + continue; // no surrogates + } + + // Arrange + byte[] expectedUtf8Bytes = _utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(i)); + + // Act + List actualUtf8Bytes = new List(4); + uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)i); + do + { + actualUtf8Bytes.Add((byte)asUtf8); + } while ((asUtf8 >>= 8) != 0); + + // Assert + Assert.Equal(expectedUtf8Bytes, actualUtf8Bytes); + } + } + + [Fact] + public void IsCharacterDefined() + { + // Arrange + bool[] definedChars = ReadListOfDefinedCharacters(); + List errors = new List(); + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + bool expected = definedChars[i]; + bool actual = UnicodeHelpers.IsCharacterDefined((char)i); + if (expected != actual) + { + string message = String.Format(CultureInfo.InvariantCulture, "Character U+{0:X4}: expected = {1}, actual = {2}", i, expected, actual); + errors.Add(message); + } + } + + if (errors.Count > 0) + { + Assert.True(false, String.Join(Environment.NewLine, errors)); + } + } + + private static bool[] ReadListOfDefinedCharacters() + { + HashSet allowedCategories = new HashSet(); + + // Letters + allowedCategories.Add("Lu"); + allowedCategories.Add("Ll"); + allowedCategories.Add("Lt"); + allowedCategories.Add("Lm"); + allowedCategories.Add("Lo"); + + // Marks + allowedCategories.Add("Mn"); + allowedCategories.Add("Mc"); + allowedCategories.Add("Me"); + + // Numbers + allowedCategories.Add("Nd"); + allowedCategories.Add("Nl"); + allowedCategories.Add("No"); + + // Punctuation + allowedCategories.Add("Pc"); + allowedCategories.Add("Pd"); + allowedCategories.Add("Ps"); + allowedCategories.Add("Pe"); + allowedCategories.Add("Pi"); + allowedCategories.Add("Pf"); + allowedCategories.Add("Po"); + + // Symbols + allowedCategories.Add("Sm"); + allowedCategories.Add("Sc"); + allowedCategories.Add("Sk"); + allowedCategories.Add("So"); + + // Separators + // With the exception of U+0020 SPACE, these aren't allowed + + // Other + // We only allow one category of 'other' characters + allowedCategories.Add("Cf"); + + HashSet seenCategories = new HashSet(); + + bool[] retVal = new bool[0x10000]; + string[] allLines = new StreamReader(typeof(UnicodeHelpersTests).GetTypeInfo().Assembly.GetManifestResourceStream("../../unicode/UnicodeData.txt")).ReadAllLines(); + + foreach (string line in allLines) + { + string[] splitLine = line.Split(';'); + uint codePoint = UInt32.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + if (codePoint >= retVal.Length) + { + continue; // don't care about supplementary chars + } + + if (codePoint == (uint)' ') + { + retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char + } + else + { + string category = splitLine[2]; + if (allowedCategories.Contains(category)) + { + retVal[codePoint] = true; // chars in this category are allowable + seenCategories.Add(category); + } + } + } + + // Finally, we need to make sure we've seen every category which contains + // allowed characters. This provides extra defense against having a typo + // in the list of categories. + Assert.Equal(allowedCategories.OrderBy(c => c), seenCategories.OrderBy(c => c)); + + return retVal; + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs new file mode 100644 index 0000000000..fd649ffc08 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -0,0 +1,302 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UrlEncoderTests + { + private static UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + + [Fact] + public void Ctor_WithCodePointFilter() + { + // Arrange + var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + UrlEncoder encoder = new UrlEncoder(filter); + + // Act & assert + Assert.Equal("a", encoder.UrlEncode("a")); + Assert.Equal("b", encoder.UrlEncode("b")); + Assert.Equal("%63", encoder.UrlEncode("c")); + Assert.Equal("d", encoder.UrlEncode("d")); + Assert.Equal("%00", encoder.UrlEncode("\0")); // we still always encode control chars + Assert.Equal("%26", encoder.UrlEncode("&")); // we still always encode HTML-special chars + Assert.Equal("%EF%BF%BF", encoder.UrlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars + } + + [Fact] + public void Ctor_WithUnicodeBlocks() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + + // Act & assert + Assert.Equal("%61", encoder.UrlEncode("a")); + Assert.Equal("\u00E9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("\u2601", encoder.UrlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Ctor_WithNoParameters_DefaultsToBasicLatin() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + + // Act & assert + Assert.Equal("a", encoder.UrlEncode("a")); + Assert.Equal("%C3%A9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); + Assert.Equal("%E2%98%81", encoder.UrlEncode("\u2601" /* CLOUD */)); + } + + [Fact] + public void Default_EquivalentToBasicLatin() + { + // Arrange + UrlEncoder controlEncoder = new UrlEncoder(UnicodeBlocks.BasicLatin); + UrlEncoder testEncoder = UrlEncoder.Default; + + // Act & assert + for (int i = 0; i <= Char.MaxValue; i++) + { + if (!IsSurrogateCodePoint(i)) + { + string input = new String((char)i, 1); + Assert.Equal(controlEncoder.UrlEncode(input), testEncoder.UrlEncode(input)); + } + } + } + + [Fact] + public void Default_ReturnsSingletonInstance() + { + // Act + UrlEncoder encoder1 = UrlEncoder.Default; + UrlEncoder encoder2 = UrlEncoder.Default; + + // Assert + Assert.Same(encoder1, encoder2); + } + + [Fact] + public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + + // Act & assert - BMP chars + for (int i = 0; i <= 0xFFFF; i++) + { + string input = new String((char)i, 1); + string expected; + if (IsSurrogateCodePoint(i)) + { + expected = "%EF%BF%BD"; // unpaired surrogate -> Unicode replacement char + } + else + { + bool mustEncode = true; + + // RFC 3987, Sec. 2.2 gives the list of allowed chars + // (We allow 'ipchar' except for "'", "&", "+", "%", and "=" + if (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z') || ('0' <= i && i <= '9')) + { + mustEncode = false; // ALPHA / DIGIT + } + else if ((0x00A0 <= i && i <= 0xD7FF) | (0xF900 <= i && i <= 0xFDCF) | (0xFDF0 <= i && i <= 0xFFEF)) + { + mustEncode = !UnicodeHelpers.IsCharacterDefined((char)i); // 'ucschar' + } + else + { + switch (i) + { + // iunreserved + case '-': + case '.': + case '_': + case '~': + + // ipchar + case ':': + case '@': + + // sub-delims + case '!': + case '$': + case '(': + case ')': + case '*': + case ',': + case ';': + mustEncode = false; + break; + } + } + + if (mustEncode) + { + expected = GetKnownGoodPercentEncodedValue(i); + } + else + { + expected = input; // no encoding + } + } + + string retVal = encoder.UrlEncode(input); + Assert.Equal(expected, retVal); + } + + // Act & assert - astral chars + for (int i = 0x10000; i <= 0x10FFFF; i++) + { + string input = Char.ConvertFromUtf32(i); + string expected = GetKnownGoodPercentEncodedValue(i); + string retVal = encoder.UrlEncode(input); + Assert.Equal(expected, retVal); + } + } + + [Fact] + public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); // allow all codepoints + + // "abcde" + const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; + const string expected = "a%EF%BF%BDb%EF%BF%BDc%EF%BF%BD%EF%BF%BDd%EF%BF%BD%F0%90%8F%BFe%EF%BF%BD"; // 'D800' 'DFFF' was preserved since it's valid + + // Act + string retVal = encoder.UrlEncode(input); + + // Assert + Assert.Equal(expected, retVal); + } + + [Fact] + public void UrlEncode_EmptyStringInput_ReturnsEmptyString() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + + // Act & assert + Assert.Equal("", encoder.UrlEncode("")); + } + + [Fact] + public void UrlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + string input = "Hello,there!"; + + // Act & assert + Assert.Same(input, encoder.UrlEncode(input)); + } + + [Fact] + public void UrlEncode_NullInput_ReturnsNull() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + + // Act & assert + Assert.Null(encoder.UrlEncode(null)); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingAtBeginning() + { + Assert.Equal(@"%26Hello,there!", new UrlEncoder().UrlEncode("&Hello,there!")); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingAtEnd() + { + Assert.Equal(@"Hello,there!%26", new UrlEncoder().UrlEncode("Hello,there!&")); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingInMiddle() + { + Assert.Equal(@"Hello,%20%26there!", new UrlEncoder().UrlEncode("Hello, &there!")); + } + + [Fact] + public void UrlEncode_WithCharsRequiringEncodingInterspersed() + { + Assert.Equal(@"Hello,%20%3Cthere%3E!", new UrlEncoder().UrlEncode("Hello, !")); + } + + [Fact] + public void UrlEncode_CharArray() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + var output = new StringWriter(); + + // Act + encoder.UrlEncode("Hello+world!".ToCharArray(), 3, 5, output); + + // Assert + Assert.Equal("lo%2Bwo", output.ToString()); + } + + [Fact] + public void UrlEncode_StringSubstring() + { + // Arrange + UrlEncoder encoder = new UrlEncoder(); + var output = new StringWriter(); + + // Act + encoder.UrlEncode("Hello+world!", 3, 5, output); + + // Assert + Assert.Equal("lo%2Bwo", output.ToString()); + } + + [Fact] + public void UrlEncode_DoesNotOutputHtmlSensitiveCharacters() + { + // Per the design document, we provide additional defense-in-depth + // by never emitting HTML-sensitive characters unescaped. + + // Arrange + UrlEncoder urlEncoder = new UrlEncoder(UnicodeBlocks.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + + // Act & assert + for (int i = 0; i <= 0x10FFFF; i++) + { + if (IsSurrogateCodePoint(i)) + { + continue; // surrogates don't matter here + } + + string urlEncoded = urlEncoder.UrlEncode(Char.ConvertFromUtf32(i)); + string thenHtmlEncoded = htmlEncoder.HtmlEncode(urlEncoded); + Assert.Equal(urlEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters + } + } + + private static string GetKnownGoodPercentEncodedValue(int codePoint) + { + // Convert the code point to UTF16, then call Encoding.UTF8.GetBytes, then hex-encode everything + return String.Concat(_utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(codePoint)).Select(b => String.Format(CultureInfo.InvariantCulture, "%{0:X2}", b))); + } + + private static bool IsSurrogateCodePoint(int codePoint) + { + return (0xD800 <= codePoint && codePoint <= 0xDFFF); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json new file mode 100644 index 0000000000..e4e4d9f445 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -0,0 +1,18 @@ +{ + "dependencies": { + "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Moq": "4.2.1312.1622", + "Newtonsoft.Json": "6.0.6", + "xunit.runner.kre": "1.0.0-*" + }, + "commands": { + "test": "xunit.runner.kre" + }, + "compilationOptions": { + "allowUnsafe": true + }, + "frameworks": { + "aspnet50": { } + }, + "resources": "..\\..\\unicode\\UnicodeData.txt" +} diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt new file mode 100644 index 0000000000..3653af7a47 --- /dev/null +++ b/unicode/Blocks.txt @@ -0,0 +1,283 @@ +# Blocks-7.0.0.txt +# Date: 2014-04-03, 23:23:00 GMT [RP, KW] +# +# Unicode Character Database +# Copyright (c) 1991-2014 Unicode, Inc. +# For terms of use, see http://www.unicode.org/terms_of_use.html +# For documentation, see http://www.unicode.org/reports/tr44/ +# +# Note: The casing of block names is not normative. +# For example, "Basic Latin" and "BASIC LATIN" are equivalent. +# +# Format: +# Start Code..End Code; Block Name + +# ================================================ + +# Note: When comparing block names, casing, whitespace, hyphens, +# and underbars are ignored. +# For example, "Latin Extended-A" and "latin extended a" are equivalent. +# For more information on the comparison of property values, +# see UAX #44: http://www.unicode.org/reports/tr44/ +# +# All code points not explicitly listed for Block +# have the value No_Block. + +# Property: Block +# +# @missing: 0000..10FFFF; No_Block + +0000..007F; Basic Latin +0080..00FF; Latin-1 Supplement +0100..017F; Latin Extended-A +0180..024F; Latin Extended-B +0250..02AF; IPA Extensions +02B0..02FF; Spacing Modifier Letters +0300..036F; Combining Diacritical Marks +0370..03FF; Greek and Coptic +0400..04FF; Cyrillic +0500..052F; Cyrillic Supplement +0530..058F; Armenian +0590..05FF; Hebrew +0600..06FF; Arabic +0700..074F; Syriac +0750..077F; Arabic Supplement +0780..07BF; Thaana +07C0..07FF; NKo +0800..083F; Samaritan +0840..085F; Mandaic +08A0..08FF; Arabic Extended-A +0900..097F; Devanagari +0980..09FF; Bengali +0A00..0A7F; Gurmukhi +0A80..0AFF; Gujarati +0B00..0B7F; Oriya +0B80..0BFF; Tamil +0C00..0C7F; Telugu +0C80..0CFF; Kannada +0D00..0D7F; Malayalam +0D80..0DFF; Sinhala +0E00..0E7F; Thai +0E80..0EFF; Lao +0F00..0FFF; Tibetan +1000..109F; Myanmar +10A0..10FF; Georgian +1100..11FF; Hangul Jamo +1200..137F; Ethiopic +1380..139F; Ethiopic Supplement +13A0..13FF; Cherokee +1400..167F; Unified Canadian Aboriginal Syllabics +1680..169F; Ogham +16A0..16FF; Runic +1700..171F; Tagalog +1720..173F; Hanunoo +1740..175F; Buhid +1760..177F; Tagbanwa +1780..17FF; Khmer +1800..18AF; Mongolian +18B0..18FF; Unified Canadian Aboriginal Syllabics Extended +1900..194F; Limbu +1950..197F; Tai Le +1980..19DF; New Tai Lue +19E0..19FF; Khmer Symbols +1A00..1A1F; Buginese +1A20..1AAF; Tai Tham +1AB0..1AFF; Combining Diacritical Marks Extended +1B00..1B7F; Balinese +1B80..1BBF; Sundanese +1BC0..1BFF; Batak +1C00..1C4F; Lepcha +1C50..1C7F; Ol Chiki +1CC0..1CCF; Sundanese Supplement +1CD0..1CFF; Vedic Extensions +1D00..1D7F; Phonetic Extensions +1D80..1DBF; Phonetic Extensions Supplement +1DC0..1DFF; Combining Diacritical Marks Supplement +1E00..1EFF; Latin Extended Additional +1F00..1FFF; Greek Extended +2000..206F; General Punctuation +2070..209F; Superscripts and Subscripts +20A0..20CF; Currency Symbols +20D0..20FF; Combining Diacritical Marks for Symbols +2100..214F; Letterlike Symbols +2150..218F; Number Forms +2190..21FF; Arrows +2200..22FF; Mathematical Operators +2300..23FF; Miscellaneous Technical +2400..243F; Control Pictures +2440..245F; Optical Character Recognition +2460..24FF; Enclosed Alphanumerics +2500..257F; Box Drawing +2580..259F; Block Elements +25A0..25FF; Geometric Shapes +2600..26FF; Miscellaneous Symbols +2700..27BF; Dingbats +27C0..27EF; Miscellaneous Mathematical Symbols-A +27F0..27FF; Supplemental Arrows-A +2800..28FF; Braille Patterns +2900..297F; Supplemental Arrows-B +2980..29FF; Miscellaneous Mathematical Symbols-B +2A00..2AFF; Supplemental Mathematical Operators +2B00..2BFF; Miscellaneous Symbols and Arrows +2C00..2C5F; Glagolitic +2C60..2C7F; Latin Extended-C +2C80..2CFF; Coptic +2D00..2D2F; Georgian Supplement +2D30..2D7F; Tifinagh +2D80..2DDF; Ethiopic Extended +2DE0..2DFF; Cyrillic Extended-A +2E00..2E7F; Supplemental Punctuation +2E80..2EFF; CJK Radicals Supplement +2F00..2FDF; Kangxi Radicals +2FF0..2FFF; Ideographic Description Characters +3000..303F; CJK Symbols and Punctuation +3040..309F; Hiragana +30A0..30FF; Katakana +3100..312F; Bopomofo +3130..318F; Hangul Compatibility Jamo +3190..319F; Kanbun +31A0..31BF; Bopomofo Extended +31C0..31EF; CJK Strokes +31F0..31FF; Katakana Phonetic Extensions +3200..32FF; Enclosed CJK Letters and Months +3300..33FF; CJK Compatibility +3400..4DBF; CJK Unified Ideographs Extension A +4DC0..4DFF; Yijing Hexagram Symbols +4E00..9FFF; CJK Unified Ideographs +A000..A48F; Yi Syllables +A490..A4CF; Yi Radicals +A4D0..A4FF; Lisu +A500..A63F; Vai +A640..A69F; Cyrillic Extended-B +A6A0..A6FF; Bamum +A700..A71F; Modifier Tone Letters +A720..A7FF; Latin Extended-D +A800..A82F; Syloti Nagri +A830..A83F; Common Indic Number Forms +A840..A87F; Phags-pa +A880..A8DF; Saurashtra +A8E0..A8FF; Devanagari Extended +A900..A92F; Kayah Li +A930..A95F; Rejang +A960..A97F; Hangul Jamo Extended-A +A980..A9DF; Javanese +A9E0..A9FF; Myanmar Extended-B +AA00..AA5F; Cham +AA60..AA7F; Myanmar Extended-A +AA80..AADF; Tai Viet +AAE0..AAFF; Meetei Mayek Extensions +AB00..AB2F; Ethiopic Extended-A +AB30..AB6F; Latin Extended-E +ABC0..ABFF; Meetei Mayek +AC00..D7AF; Hangul Syllables +D7B0..D7FF; Hangul Jamo Extended-B +D800..DB7F; High Surrogates +DB80..DBFF; High Private Use Surrogates +DC00..DFFF; Low Surrogates +E000..F8FF; Private Use Area +F900..FAFF; CJK Compatibility Ideographs +FB00..FB4F; Alphabetic Presentation Forms +FB50..FDFF; Arabic Presentation Forms-A +FE00..FE0F; Variation Selectors +FE10..FE1F; Vertical Forms +FE20..FE2F; Combining Half Marks +FE30..FE4F; CJK Compatibility Forms +FE50..FE6F; Small Form Variants +FE70..FEFF; Arabic Presentation Forms-B +FF00..FFEF; Halfwidth and Fullwidth Forms +FFF0..FFFF; Specials +10000..1007F; Linear B Syllabary +10080..100FF; Linear B Ideograms +10100..1013F; Aegean Numbers +10140..1018F; Ancient Greek Numbers +10190..101CF; Ancient Symbols +101D0..101FF; Phaistos Disc +10280..1029F; Lycian +102A0..102DF; Carian +102E0..102FF; Coptic Epact Numbers +10300..1032F; Old Italic +10330..1034F; Gothic +10350..1037F; Old Permic +10380..1039F; Ugaritic +103A0..103DF; Old Persian +10400..1044F; Deseret +10450..1047F; Shavian +10480..104AF; Osmanya +10500..1052F; Elbasan +10530..1056F; Caucasian Albanian +10600..1077F; Linear A +10800..1083F; Cypriot Syllabary +10840..1085F; Imperial Aramaic +10860..1087F; Palmyrene +10880..108AF; Nabataean +10900..1091F; Phoenician +10920..1093F; Lydian +10980..1099F; Meroitic Hieroglyphs +109A0..109FF; Meroitic Cursive +10A00..10A5F; Kharoshthi +10A60..10A7F; Old South Arabian +10A80..10A9F; Old North Arabian +10AC0..10AFF; Manichaean +10B00..10B3F; Avestan +10B40..10B5F; Inscriptional Parthian +10B60..10B7F; Inscriptional Pahlavi +10B80..10BAF; Psalter Pahlavi +10C00..10C4F; Old Turkic +10E60..10E7F; Rumi Numeral Symbols +11000..1107F; Brahmi +11080..110CF; Kaithi +110D0..110FF; Sora Sompeng +11100..1114F; Chakma +11150..1117F; Mahajani +11180..111DF; Sharada +111E0..111FF; Sinhala Archaic Numbers +11200..1124F; Khojki +112B0..112FF; Khudawadi +11300..1137F; Grantha +11480..114DF; Tirhuta +11580..115FF; Siddham +11600..1165F; Modi +11680..116CF; Takri +118A0..118FF; Warang Citi +11AC0..11AFF; Pau Cin Hau +12000..123FF; Cuneiform +12400..1247F; Cuneiform Numbers and Punctuation +13000..1342F; Egyptian Hieroglyphs +16800..16A3F; Bamum Supplement +16A40..16A6F; Mro +16AD0..16AFF; Bassa Vah +16B00..16B8F; Pahawh Hmong +16F00..16F9F; Miao +1B000..1B0FF; Kana Supplement +1BC00..1BC9F; Duployan +1BCA0..1BCAF; Shorthand Format Controls +1D000..1D0FF; Byzantine Musical Symbols +1D100..1D1FF; Musical Symbols +1D200..1D24F; Ancient Greek Musical Notation +1D300..1D35F; Tai Xuan Jing Symbols +1D360..1D37F; Counting Rod Numerals +1D400..1D7FF; Mathematical Alphanumeric Symbols +1E800..1E8DF; Mende Kikakui +1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols +1F000..1F02F; Mahjong Tiles +1F030..1F09F; Domino Tiles +1F0A0..1F0FF; Playing Cards +1F100..1F1FF; Enclosed Alphanumeric Supplement +1F200..1F2FF; Enclosed Ideographic Supplement +1F300..1F5FF; Miscellaneous Symbols and Pictographs +1F600..1F64F; Emoticons +1F650..1F67F; Ornamental Dingbats +1F680..1F6FF; Transport and Map Symbols +1F700..1F77F; Alchemical Symbols +1F780..1F7FF; Geometric Shapes Extended +1F800..1F8FF; Supplemental Arrows-C +20000..2A6DF; CJK Unified Ideographs Extension B +2A700..2B73F; CJK Unified Ideographs Extension C +2B740..2B81F; CJK Unified Ideographs Extension D +2F800..2FA1F; CJK Compatibility Ideographs Supplement +E0000..E007F; Tags +E0100..E01EF; Variation Selectors Supplement +F0000..FFFFF; Supplementary Private Use Area-A +100000..10FFFF; Supplementary Private Use Area-B + +# EOF diff --git a/unicode/Generators/DefinedCharListGenerator/App.config b/unicode/Generators/DefinedCharListGenerator/App.config new file mode 100644 index 0000000000..9c05822ff5 --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj new file mode 100644 index 0000000000..b1e3df2dc8 --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4} + Exe + Properties + DefinedCharListGenerator + DefinedCharListGenerator + v4.5.1 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + UnicodeData.txt + PreserveNewest + + + + + \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs new file mode 100644 index 0000000000..f98dd32f5b --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/Program.cs @@ -0,0 +1,107 @@ +using System; +using System.Diagnostics; +using System.Globalization; +using System.IO; + +namespace DefinedCharListGenerator +{ + /// + /// This program outputs the 'unicode-defined-chars.bin' bitmap file. + /// + class Program + { + static void Main(string[] args) + { + // The input file should be UnicodeData.txt from the UCD corresponding to the + // version of the Unicode spec we're consuming. + // More info: http://www.unicode.org/reports/tr44/tr44-14.html#UCD_Files + // Latest UnicodeData.txt: http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt + + const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF + bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1]; + + // Read all defined characters from the input file. + string[] allLines = File.ReadAllLines("UnicodeData.txt"); + + // Each line is a semicolon-delimited list of information: + // ;;;... + foreach (string line in allLines) + { + string[] splitLine = line.Split(new char[] { ';' }, 4); + + // We only allow certain categories of code points. + // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case + uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + string category = splitLine[2]; + if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category))) + { + continue; + } + + Debug.Assert(codepoint <= MAX_UNICODE_CHAR); + definedChars[codepoint] = true; + } + + // Finally, write the list of defined characters out as a bitmap. + // Each consecutive block of 8 chars is written as a single byte. + // For instance, the first byte of the output file contains the + // bitmap for the following codepoints: + // - (bit 7) U+0007 [MSB] + // - (bit 6) U+0006 + // - (bit 5) U+0005 + // - (bit 4) U+0004 + // - (bit 3) U+0003 + // - (bit 2) U+0002 + // - (bit 1) U+0001 + // - (bit 0) U+0000 [LSB] + // The next byte will contain the bitmap for U+000F to U+0008, + // and so on until the last byte, which is U+FFFF to U+FFF8. + // The bytes are written out in little-endian order. + // We're only concerned about the BMP (U+0000 .. U+FFFF) for now. + MemoryStream outBuffer = new MemoryStream(); + for (int i = 0; i < 0x10000; i += 8) + { + int thisByte = 0; + for (int j = 7; j >= 0; j--) + { + thisByte <<= 1; + if (definedChars[i + j]) + { + thisByte |= 0x1; + } + } + outBuffer.WriteByte((byte)thisByte); + } + + File.WriteAllBytes("unicode-defined-chars.bin", outBuffer.ToArray()); + } + + private static bool IsAllowedUnicodeCategory(string category) + { + // We only allow certain classes of characters + return category == "Lu" /* letters */ + || category == "Ll" + || category == "Lt" + || category == "Lm" + || category == "Lo" + || category == "Mn" /* marks */ + || category == "Mc" + || category == "Me" + || category == "Nd" /* numbers */ + || category == "Nl" + || category == "No" + || category == "Pc" /* punctuation */ + || category == "Pd" + || category == "Ps" + || category == "Pe" + || category == "Pi" + || category == "Pf" + || category == "Po" + || category == "Sm" /* symbols */ + || category == "Sc" + || category == "Sk" + || category == "So" + || category == "Cf"; /* other */ + } + } +} diff --git a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..693c041be1 --- /dev/null +++ b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("DefinedCharListGenerator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("DefinedCharListGenerator")] +[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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("5089f890-38f7-413c-87b0-d8eb1e238ef5")] + +// 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")] diff --git a/unicode/Generators/Generators.sln b/unicode/Generators/Generators.sln new file mode 100644 index 0000000000..acfaad9b24 --- /dev/null +++ b/unicode/Generators/Generators.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 2013 +VisualStudioVersion = 12.0.31101.0 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DefinedCharListGenerator", "DefinedCharListGenerator\DefinedCharListGenerator.csproj", "{0E87CEC9-46CE-4B6B-A613-93AA773C10A4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicodeTablesGenerator", "UnicodeTablesGenerator\UnicodeTablesGenerator.csproj", "{3D181114-6946-4D34-A3B9-0F83B6B8FEAE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.Build.0 = Release|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/unicode/Generators/UnicodeTablesGenerator/App.config b/unicode/Generators/UnicodeTablesGenerator/App.config new file mode 100644 index 0000000000..9c05822ff5 --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs new file mode 100644 index 0000000000..02c740a785 --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/Program.cs @@ -0,0 +1,109 @@ +using System; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace UnicodeTablesGenerator +{ + /// + /// This program outputs the 'UnicodeBlocks.generated.txt' and + /// 'UnicodeBlocksTests.generated.txt' source files. + /// + /// + /// The generated files require some hand-tweaking. For instance, you'll need + /// to remove surrogates and private use blocks. The files can then be merged + /// into the *.generated.cs files as appropriate. + /// + class Program + { + private const string _codePointFiltersGeneratedFormat = @" +/// +/// Represents the '{0}' Unicode block (U+{1}..U+{2}). +/// +/// +/// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block. +/// +public static UnicodeBlock {3} +{{ + get + {{ + return Volatile.Read(ref _{4}) ?? CreateBlock(ref _{4}, first: '\u{1}', last: '\u{2}'); + }} +}} +private static UnicodeBlock _{4}; +"; + + private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeBlocks.{0}))]"; + + private static void Main() + { + // The input file should be Blocks.txt from the UCD corresponding to the + // version of the Unicode spec we're consuming. + // More info: http://www.unicode.org/reports/tr44/ + // Latest Blocks.txt: http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt + + StringBuilder runtimeCodeBuilder = new StringBuilder(); + StringBuilder testCodeBuilder = new StringBuilder(); + string[] allLines = File.ReadAllLines("Blocks.txt"); + + Regex regex = new Regex(@"^(?[0-9A-F]{4})\.\.(?[0-9A-F]{4}); (?.+)$"); + + foreach (var line in allLines) + { + // We only care about lines of the form "XXXX..XXXX; Block name" + var match = regex.Match(line); + if (match == null || !match.Success) + { + continue; + } + + string startCode = match.Groups["startCode"].Value; + string endCode = match.Groups["endCode"].Value; + string blockName = match.Groups["blockName"].Value; + string blockNameAsProperty = RemoveAllNonAlphanumeric(blockName); + string blockNameAsField = WithDotNetFieldCasing(blockNameAsProperty); + + runtimeCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersGeneratedFormat, + blockName, startCode, endCode, blockNameAsProperty, blockNameAsField); + + testCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersTestsGeneratedFormat, + blockNameAsProperty, startCode, endCode); + testCodeBuilder.AppendLine(); + } + + File.WriteAllText("UnicodeBlocks.generated.txt", runtimeCodeBuilder.ToString()); + File.WriteAllText("UnicodeBlocksTests.generated.txt", testCodeBuilder.ToString()); + } + + private static string RemoveAllNonAlphanumeric(string blockName) + { + // Allow only A-Z 0-9 + return new String(blockName.ToCharArray().Where(c => ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9')).ToArray()); + } + + private static string WithDotNetFieldCasing(string input) + { + char[] chars = input.ToCharArray(); + for (int i = 0; i < chars.Length; i++) + { + if (Char.IsLower(chars[i])) + { + if (i > 1) + { + // restore original casing for the previous char unless the previous + // char was at the front of the string + chars[i - 1] = input[i - 1]; + } + break; + } + else + { + chars[i] = Char.ToLowerInvariant(chars[i]); + } + } + return new String(chars); + } + } +} diff --git a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b7fc3fb222 --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +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("UnicodeTablesGenerator")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("UnicodeTablesGenerator")] +[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)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("c9286457-3d25-4143-9458-028aabedc4f5")] + +// 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")] diff --git a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj new file mode 100644 index 0000000000..2821a1533c --- /dev/null +++ b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj @@ -0,0 +1,61 @@ + + + + + Debug + AnyCPU + {3D181114-6946-4D34-A3B9-0F83B6B8FEAE} + Exe + Properties + UnicodeTablesGenerator + UnicodeTablesGenerator + v4.5.1 + 512 + true + + + AnyCPU + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + Blocks.txt + PreserveNewest + + + + + \ No newline at end of file diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt new file mode 100644 index 0000000000..31c8a7eaa0 --- /dev/null +++ b/unicode/UnicodeData.txt @@ -0,0 +1,27268 @@ +0000;;Cc;0;BN;;;;;N;NULL;;;; +0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; +0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; +0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; +0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; +0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; +0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; +0007;;Cc;0;BN;;;;;N;BELL;;;; +0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; +0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; +000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;; +000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; +000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; +000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; +000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; +000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; +0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; +0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; +0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; +0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; +0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; +0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; +0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; +0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; +0018;;Cc;0;BN;;;;;N;CANCEL;;;; +0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; +001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; +001B;;Cc;0;BN;;;;;N;ESCAPE;;;; +001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; +001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; +001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; +001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; +0020;SPACE;Zs;0;WS;;;;;N;;;;; +0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; +0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; +0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; +0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; +0026;AMPERSAND;Po;0;ON;;;;;N;;;;; +0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; +0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; +0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; +002A;ASTERISK;Po;0;ON;;;;;N;;;;; +002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; +002C;COMMA;Po;0;CS;;;;;N;;;;; +002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; +002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; +002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; +0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; +0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; +0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; +0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; +0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; +0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; +0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; +0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; +0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; +0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; +003A;COLON;Po;0;CS;;;;;N;;;;; +003B;SEMICOLON;Po;0;ON;;;;;N;;;;; +003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; +003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; +0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; +0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; +0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; +0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; +0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; +0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; +0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; +0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; +0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; +0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; +004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; +004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; +004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; +004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; +004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; +004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; +0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; +0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; +0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; +0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; +0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; +0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; +0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; +0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; +0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; +0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; +005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; +005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; +005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; +005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; +005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; +005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; +0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; +0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 +0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 +0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 +0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 +0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 +0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 +0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 +0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 +0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 +006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A +006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B +006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C +006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D +006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E +006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F +0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 +0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 +0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 +0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 +0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 +0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 +0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 +0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 +0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 +0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 +007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A +007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; +007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; +007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; +007E;TILDE;Sm;0;ON;;;;;N;;;;; +007F;;Cc;0;BN;;;;;N;DELETE;;;; +0080;;Cc;0;BN;;;;;N;;;;; +0081;;Cc;0;BN;;;;;N;;;;; +0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; +0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; +0084;;Cc;0;BN;;;;;N;;;;; +0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; +0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; +0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; +0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; +0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; +008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; +008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; +008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; +008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; +008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; +008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; +0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; +0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; +0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; +0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; +0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; +0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; +0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; +0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; +0098;;Cc;0;BN;;;;;N;START OF STRING;;;; +0099;;Cc;0;BN;;;;;N;;;;; +009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; +009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; +009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; +009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; +009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; +009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; +00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; +00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; +00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; +00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; +00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; +00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; +00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; +00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; +00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;; +00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; +00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; +00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; +00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; +00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; +00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; +00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; +00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; +00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; +00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; +00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C +00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; +00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; +00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; +00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; +00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;; +00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; +00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; +00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; +00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; +00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; +00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; +00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; +00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; +00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; +00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; +00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; +00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; +00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; +00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; +00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; +00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; +00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; +00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; +00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; +00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; +00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; +00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; +00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; +00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; +00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; +00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; +00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; +00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; +00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; +00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; +00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; +00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; +00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; +00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; +00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; +00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; +00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; +00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 +00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 +00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 +00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 +00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 +00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 +00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 +00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 +00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 +00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 +00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA +00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB +00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC +00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD +00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE +00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF +00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 +00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 +00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 +00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 +00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 +00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 +00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 +00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 +00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 +00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA +00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB +00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC +00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD +00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE +00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 +0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; +0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 +0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; +0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 +0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; +0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 +0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; +0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 +0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; +0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 +010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; +010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A +010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; +010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C +010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; +010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E +0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; +0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 +0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; +0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 +0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; +0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 +0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; +0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 +0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; +0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 +011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; +011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A +011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; +011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C +011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; +011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E +0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; +0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 +0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; +0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 +0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; +0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 +0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; +0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 +0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; +0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 +012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; +012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A +012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; +012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C +012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; +012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E +0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; +0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 +0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; +0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 +0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; +0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 +0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; +0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 +0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; +0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; +013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 +013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; +013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B +013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; +013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D +013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; +0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F +0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; +0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 +0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; +0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 +0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; +0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 +0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; +0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 +0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; +014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; +014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A +014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; +014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C +014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; +014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E +0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; +0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 +0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; +0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 +0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; +0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 +0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; +0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 +0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; +0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 +015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; +015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A +015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; +015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C +015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; +015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E +0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; +0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 +0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; +0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 +0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; +0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 +0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; +0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 +0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; +0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 +016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; +016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A +016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; +016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C +016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; +016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E +0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; +0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 +0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; +0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 +0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; +0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 +0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; +0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 +0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; +0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; +017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 +017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; +017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B +017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; +017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D +017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 +0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 +0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; +0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; +0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 +0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; +0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 +0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; +0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; +0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 +0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; +018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; +018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; +018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B +018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; +018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; +018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; +0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; +0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; +0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 +0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; +0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; +0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 +0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; +0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; +0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; +0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 +019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D +019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; +019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; +019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; +019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 +019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; +01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; +01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 +01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; +01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 +01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; +01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 +01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; +01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; +01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 +01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; +01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; +01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; +01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; +01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC +01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; +01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; +01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF +01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; +01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; +01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; +01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 +01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; +01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 +01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; +01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; +01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 +01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; +01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; +01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; +01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC +01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; +01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 +01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; +01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; +01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; +01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; +01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 +01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 +01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 +01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 +01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 +01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 +01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB +01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB +01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB +01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; +01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD +01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; +01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF +01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; +01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 +01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; +01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 +01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; +01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 +01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; +01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 +01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; +01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 +01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; +01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB +01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E +01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; +01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE +01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; +01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 +01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; +01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 +01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; +01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 +01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; +01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 +01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; +01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 +01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; +01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA +01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; +01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC +01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; +01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE +01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; +01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 +01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2 +01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 +01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; +01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 +01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; +01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; +01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; +01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 +01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; +01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA +01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; +01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC +01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; +01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE +0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; +0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 +0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; +0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 +0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; +0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 +0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; +0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 +0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; +0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 +020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; +020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A +020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; +020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C +020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; +020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E +0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; +0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 +0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; +0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 +0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; +0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 +0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; +0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 +0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; +0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 +021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; +021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A +021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; +021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C +021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; +021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E +0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; +0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; +0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; +0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 +0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; +0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 +0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; +0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 +0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; +0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 +022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; +022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A +022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; +022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C +022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; +022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E +0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; +0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 +0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; +0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 +0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; +0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; +0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; +0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; +0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; +0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; +023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; +023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; +023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B +023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; +023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; +023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E +0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F +0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; +0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 +0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; +0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; +0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; +0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; +0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 +0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; +0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 +024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; +024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A +024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; +024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C +024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; +024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E +0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F +0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D +0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 +0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 +0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 +0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; +0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 +0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A +0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; +0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F +025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; +025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 +025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB +025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; +025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; +025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; +0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 +0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC +0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; +0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 +0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; +0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D +0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA +0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; +0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 +0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 +026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; +026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 +026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD +026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; +026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; +026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C +0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; +0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E +0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D +0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; +0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; +0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F +0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; +0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; +0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; +0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; +027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; +027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; +027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 +027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; +027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; +0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 +0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; +0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; +0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 +0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; +0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; +0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; +0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 +0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE +0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 +028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 +028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 +028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 +028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; +028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; +028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; +0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; +0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; +0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 +0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; +0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; +0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; +0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; +0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; +0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; +029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; +029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; +029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 +029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; +02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; +02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; +02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; +02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; +02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; +02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; +02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; +02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; +02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; +02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; +02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; +02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; +02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; +02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; +02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; +02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; +02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; +02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; +02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; +02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; +02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; +02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; +02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; +02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; +02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; +02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; +02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; +02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; +02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; +02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; +02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; +02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; +02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; +02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; +02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; +02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; +02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; +02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; +02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; +02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; +02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; +02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; +02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; +02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; +02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; +02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; +02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; +02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; +02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;; +02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; +02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; +02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; +02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; +02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; +02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; +02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; +02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; +02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; +02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; +02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; +02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; +02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; +02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; +02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; +02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; +02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; +02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; +02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; +02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; +02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; +02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; +02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; +02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; +02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; +02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; +02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; +02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; +02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; +02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; +0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; +0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; +0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; +0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; +0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; +0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; +0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; +0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; +0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; +0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; +030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; +030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; +030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; +030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; +030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; +030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; +0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; +0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; +0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; +0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; +0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; +0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; +0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; +0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; +0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; +0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; +031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; +031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; +031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; +031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; +031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; +031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; +0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; +0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; +0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; +0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; +0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; +0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; +0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; +0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; +0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; +0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; +032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; +032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; +032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; +032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; +032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; +032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; +0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; +0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; +0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; +0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; +0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; +0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; +0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; +0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; +0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; +0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; +033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; +033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; +033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; +033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; +033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; +033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; +0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; +0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; +0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; +0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; +0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; +0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 +0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; +0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; +034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; +034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; +034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; +034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; +0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; +0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; +0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; +0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; +0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; +035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; +035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; +035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; +035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; +0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; +0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; +0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; +0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; +0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; +0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; +0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; +0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; +0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; +0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; +036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; +036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; +036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; +036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; +036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; +036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; +0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; +0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 +0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; +0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 +0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; +0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; +0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; +0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 +037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; +037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD +037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE +037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF +037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; +037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; +0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; +0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; +0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; +0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; +0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; +0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; +038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; +038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; +038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; +038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; +0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; +0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; +0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; +0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; +0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; +0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; +0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; +0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; +0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; +0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; +039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; +039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; +039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; +039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; +039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; +039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; +03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; +03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; +03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; +03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; +03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; +03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; +03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; +03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; +03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; +03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; +03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; +03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 +03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 +03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 +03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A +03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; +03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 +03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 +03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 +03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 +03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 +03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 +03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 +03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 +03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 +03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A +03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B +03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C +03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D +03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E +03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F +03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 +03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 +03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 +03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 +03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 +03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 +03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 +03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 +03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 +03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA +03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB +03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C +03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E +03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F +03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; +03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 +03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 +03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; +03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; +03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; +03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 +03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 +03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF +03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; +03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 +03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; +03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA +03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; +03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC +03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; +03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE +03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; +03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 +03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; +03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 +03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; +03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 +03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; +03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 +03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; +03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 +03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; +03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA +03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; +03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC +03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; +03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE +03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A +03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 +03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 +03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F +03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; +03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 +03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; +03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; +03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 +03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2; +03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; +03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA +03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; +03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; +03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; +03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; +0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; +0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; +0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; +0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; +0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; +0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; +0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; +0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; +0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; +0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; +040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; +040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; +040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; +040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; +040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; +040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; +0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; +0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; +0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; +0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; +0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; +0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; +0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; +0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; +0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; +0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; +041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; +041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; +041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; +041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; +041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; +041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; +0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; +0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; +0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; +0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; +0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; +0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; +0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; +0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; +0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; +0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; +042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; +042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; +042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; +042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; +042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; +042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; +0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 +0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 +0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 +0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 +0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 +0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 +0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 +0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 +0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 +0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 +043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A +043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B +043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C +043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D +043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E +043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F +0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 +0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 +0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 +0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 +0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 +0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 +0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 +0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 +0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 +0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 +044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A +044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B +044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C +044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D +044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E +044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F +0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 +0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 +0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 +0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 +0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 +0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 +0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 +0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 +0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 +0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 +045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A +045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B +045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C +045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D +045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E +045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F +0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; +0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 +0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; +0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 +0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; +0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 +0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; +0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 +0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; +0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 +046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; +046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A +046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; +046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C +046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; +046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E +0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; +0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 +0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; +0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 +0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; +0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 +0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; +0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 +0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; +0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 +047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; +047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A +047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; +047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C +047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; +047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E +0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; +0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 +0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; +0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; +0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; +0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; +0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; +0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; +0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; +0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; +048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A +048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; +048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C +048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; +048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E +0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; +0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 +0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; +0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 +0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; +0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 +0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; +0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 +0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; +0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 +049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; +049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A +049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; +049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C +049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; +049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E +04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; +04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 +04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; +04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 +04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; +04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 +04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; +04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 +04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; +04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 +04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; +04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA +04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; +04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC +04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; +04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE +04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; +04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 +04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; +04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 +04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; +04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 +04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; +04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 +04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; +04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 +04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; +04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA +04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; +04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC +04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; +04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE +04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; +04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; +04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 +04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; +04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 +04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; +04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 +04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; +04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 +04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; +04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 +04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; +04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB +04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; +04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD +04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 +04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; +04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 +04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; +04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 +04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; +04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 +04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; +04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 +04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; +04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 +04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; +04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA +04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; +04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC +04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; +04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE +04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; +04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 +04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; +04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 +04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; +04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 +04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; +04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 +04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; +04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 +04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; +04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA +04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; +04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC +04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; +04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE +04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; +04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 +04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; +04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 +04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; +04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 +04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; +04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 +04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; +04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 +04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; +04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA +04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; +04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC +04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; +04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE +0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; +0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 +0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; +0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 +0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; +0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 +0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; +0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 +0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; +0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 +050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; +050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A +050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; +050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C +050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; +050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E +0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; +0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 +0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; +0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 +0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; +0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 +0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; +0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 +0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; +0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 +051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; +051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A +051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; +051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C +051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; +051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E +0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; +0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 +0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; +0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 +0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; +0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 +0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; +0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 +0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; +0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 +052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; +052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A +052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; +052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C +052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; +052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E +0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; +0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; +0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; +0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; +0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; +0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; +0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; +0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; +0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; +053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; +053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; +053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; +053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; +053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; +053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; +0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; +0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; +0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; +0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; +0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; +0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; +0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; +0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; +0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; +0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; +054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; +054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; +054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; +054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; +054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; +054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; +0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; +0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; +0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; +0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; +0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; +0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; +0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; +0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; +055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; +055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; +055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; +055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; +055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; +055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; +0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 +0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 +0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 +0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 +0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 +0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 +0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 +0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 +0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 +056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A +056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B +056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C +056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D +056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E +056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F +0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 +0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 +0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 +0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 +0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 +0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 +0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 +0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 +0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 +0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 +057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A +057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B +057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C +057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D +057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E +057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F +0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 +0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 +0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 +0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 +0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 +0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 +0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 +0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; +0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; +058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; +058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; +058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; +0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; +0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; +0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; +0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; +0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; +0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; +0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; +0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; +0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; +059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; +059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; +059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; +059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; +059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; +059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; +05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; +05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; +05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; +05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; +05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; +05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; +05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; +05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; +05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; +05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; +05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; +05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; +05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; +05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; +05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; +05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; +05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; +05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; +05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; +05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; +05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; +05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; +05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; +05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; +05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; +05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; +05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; +05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; +05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; +05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; +05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; +05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; +05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; +05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; +05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; +05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; +05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; +05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; +05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; +05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; +05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; +05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; +05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; +05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; +05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; +05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; +05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; +05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; +05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; +05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; +05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; +05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; +05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; +05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; +05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; +05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; +05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; +05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; +05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; +05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; +05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; +05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; +05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; +05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; +05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; +05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; +05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; +05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; +0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; +0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; +0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; +0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; +0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; +0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; +0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; +0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; +0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; +0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; +060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; +060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; +060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; +060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; +0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; +0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; +0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; +0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; +0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; +0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; +0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; +0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; +0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; +0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; +061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; +061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; +061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; +061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; +061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; +0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; +0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; +0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; +0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; +0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; +0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; +0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; +0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; +0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; +0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; +062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; +062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; +062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; +062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; +062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; +062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; +0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; +0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; +0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; +0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; +0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; +0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; +0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; +0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; +0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; +063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; +063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; +0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; +0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; +0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; +0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; +0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; +0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; +0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; +0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; +064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; +064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; +064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; +064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; +064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; +064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; +0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; +0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; +0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; +0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; +0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; +0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; +0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; +0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; +065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; +065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; +065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; +065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; +0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; +0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; +0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; +0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; +0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; +0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; +0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; +0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; +0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; +0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; +066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; +066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; +066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; +066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; +066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; +066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; +0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; +0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; +0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; +0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; +0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; +0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; +0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; +0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; +0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; +0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; +067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; +067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; +067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; +067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; +067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; +067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; +0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; +0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; +0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; +0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; +0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; +0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; +0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; +0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; +0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; +0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; +068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; +068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; +068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; +068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; +0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; +0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; +0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; +0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; +0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; +0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; +0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; +0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; +0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; +069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; +06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; +06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; +06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; +06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; +06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; +06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; +06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; +06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; +06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; +06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; +06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; +06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; +06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; +06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; +06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; +06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; +06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; +06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; +06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; +06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; +06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; +06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; +06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; +06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; +06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; +06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; +06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; +06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; +06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; +06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; +06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; +06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; +06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; +06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; +06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; +06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; +06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; +06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; +06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; +06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; +06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; +06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; +06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; +06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; +06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; +06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; +06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; +06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; +06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; +06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; +06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; +06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; +06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; +06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; +06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; +06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; +06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; +06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; +06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; +06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; +06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; +06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; +06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; +06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; +06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; +06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; +06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; +06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; +06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; +06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; +06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; +06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; +06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; +06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; +06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; +06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; +0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; +0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; +0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; +0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; +0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; +0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; +070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; +070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; +070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; +070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; +070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; +0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; +0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; +0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; +0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; +0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; +0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; +0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; +0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; +0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; +0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; +071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; +071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; +071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; +071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; +071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; +071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; +0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; +0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; +0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; +0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; +0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; +0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; +0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; +0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; +0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; +0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; +072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; +072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; +072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; +072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; +072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; +072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; +0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; +0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; +0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; +0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; +0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; +0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; +0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; +073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; +073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; +073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; +073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; +073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; +0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; +0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; +0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; +0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; +0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; +0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; +074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; +074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; +074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; +074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; +0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; +0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; +0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; +075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; +075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; +075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; +0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; +0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; +0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; +0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; +076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; +076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; +076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; +076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; +0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; +0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; +077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; +077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; +077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; +077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; +077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; +0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; +0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; +0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; +0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; +0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; +0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; +0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; +0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; +0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; +078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; +078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; +078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; +078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; +078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; +078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; +0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; +0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; +0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; +0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; +0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; +0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; +0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; +0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; +0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; +0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; +079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; +079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; +079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; +079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; +079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; +079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; +07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; +07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; +07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; +07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; +07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; +07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; +07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; +07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; +07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; +07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; +07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; +07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; +07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; +07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; +07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; +07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; +07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; +07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; +07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; +07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; +07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; +07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; +07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; +07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; +07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; +07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; +07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; +07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; +07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; +07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; +07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; +07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; +07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; +07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; +07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; +07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; +07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; +07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; +07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; +07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; +07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; +07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; +07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; +07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; +07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; +07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; +07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; +07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; +07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; +07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; +07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; +07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; +07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; +07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; +07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; +07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; +07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; +07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; +07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; +07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; +07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; +07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; +07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; +07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; +07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; +07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; +07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; +07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; +07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; +07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; +07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; +07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; +0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; +0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; +0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; +0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; +0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; +0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; +0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; +0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; +0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; +0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; +080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; +080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; +080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; +080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; +080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; +080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; +0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; +0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; +0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; +0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; +0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; +0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; +0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; +0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; +0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; +0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; +081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; +081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; +081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; +081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; +081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; +081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; +0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; +0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; +0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; +0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; +0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; +0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; +0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; +0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; +0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; +0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; +082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; +082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; +082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; +0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; +0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; +0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; +0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; +0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; +0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; +0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; +0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; +0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; +0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; +083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; +083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; +083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; +083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; +083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; +0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; +0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; +0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; +0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; +0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; +0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; +0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; +0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; +0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; +0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; +084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; +084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; +084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; +084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; +084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; +084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; +0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; +0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; +0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; +0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; +0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; +0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; +0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; +0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; +0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; +0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; +085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; +085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; +085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; +08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; +08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; +08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; +08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; +08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; +08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; +08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; +08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; +08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; +08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; +08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; +08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; +08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; +08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; +08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; +08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; +08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; +08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; +08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; +08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; +08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; +08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; +08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; +08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; +08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; +08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; +08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; +08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; +08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; +0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; +0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; +0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; +0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; +0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; +0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; +090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; +090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; +090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; +090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; +0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; +0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; +0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; +0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; +0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; +0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; +0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; +0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; +0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; +0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; +091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; +091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; +091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; +091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; +091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; +091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; +0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; +0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; +0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; +0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; +0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; +0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; +0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; +0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; +092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; +092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; +092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; +092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; +092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; +092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; +0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; +0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; +0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; +0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; +0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; +0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; +0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; +0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; +0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; +0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; +093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; +093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; +094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; +0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; +0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; +0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; +0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; +0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; +0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; +095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; +095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; +095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; +095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; +095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; +095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; +0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; +0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; +0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; +0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; +0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; +0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; +0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; +0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; +0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; +0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; +097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; +097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; +097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; +097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; +097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; +0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; +0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; +0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; +0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; +0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; +0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; +098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; +098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; +0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; +0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; +0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; +0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; +0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; +0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; +0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; +0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; +099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; +099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; +099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; +099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; +099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; +099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; +09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; +09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; +09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; +09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; +09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; +09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; +09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; +09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; +09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; +09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; +09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; +09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; +09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; +09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; +09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; +09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; +09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; +09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; +09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; +09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; +09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; +09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; +09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; +09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; +09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; +09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; +09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; +09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; +09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; +09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; +09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; +09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; +09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; +09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; +09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; +09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; +09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; +09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; +0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; +0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; +0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; +0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; +0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; +0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; +0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; +0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; +0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; +0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; +0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; +0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; +0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; +0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; +0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; +0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; +0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; +0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; +0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; +0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; +0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; +0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; +0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; +0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; +0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; +0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; +0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; +0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; +0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; +0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; +0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; +0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; +0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; +0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; +0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; +0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; +0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; +0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; +0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; +0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; +0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; +0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; +0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; +0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; +0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; +0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; +0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; +0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; +0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; +0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; +0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; +0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; +0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; +0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; +0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; +0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; +0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; +0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; +0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; +0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; +0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; +0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; +0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; +0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; +0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; +0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; +0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; +0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; +0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; +0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; +0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; +0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; +0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; +0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; +0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; +0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; +0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; +0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; +0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; +0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; +0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; +0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; +0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; +0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; +0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; +0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; +0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; +0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; +0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; +0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; +0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; +0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; +0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; +0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; +0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; +0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; +0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; +0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; +0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; +0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; +0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; +0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; +0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; +0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; +0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; +0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; +0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; +0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; +0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; +0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; +0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; +0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; +0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; +0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; +0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; +0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; +0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; +0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; +0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; +0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; +0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; +0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; +0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; +0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; +0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; +0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; +0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; +0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; +0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; +0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; +0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; +0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; +0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; +0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; +0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; +0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; +0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; +0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; +0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; +0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; +0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; +0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; +0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; +0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; +0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; +0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; +0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; +0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; +0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; +0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; +0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; +0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; +0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; +0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; +0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; +0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; +0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; +0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; +0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; +0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; +0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; +0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; +0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; +0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; +0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; +0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; +0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; +0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; +0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; +0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; +0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; +0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; +0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; +0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; +0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; +0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; +0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; +0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; +0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; +0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; +0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; +0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; +0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; +0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; +0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; +0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; +0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; +0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; +0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; +0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; +0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; +0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; +0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; +0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; +0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; +0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; +0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; +0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; +0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; +0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; +0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; +0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; +0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; +0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; +0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; +0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; +0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; +0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; +0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; +0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; +0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; +0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; +0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; +0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; +0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; +0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; +0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; +0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; +0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; +0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; +0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; +0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; +0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; +0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; +0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; +0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; +0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; +0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; +0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; +0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; +0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; +0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; +0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; +0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; +0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; +0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; +0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; +0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; +0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; +0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; +0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; +0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; +0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; +0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; +0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; +0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; +0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; +0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; +0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; +0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; +0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; +0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; +0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; +0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; +0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; +0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; +0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; +0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; +0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; +0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; +0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; +0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; +0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; +0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; +0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; +0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; +0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; +0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; +0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; +0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; +0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; +0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; +0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; +0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; +0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; +0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; +0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; +0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; +0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; +0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; +0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; +0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; +0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; +0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; +0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; +0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; +0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; +0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; +0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; +0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; +0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; +0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; +0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; +0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; +0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; +0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; +0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; +0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; +0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; +0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; +0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; +0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; +0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; +0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; +0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; +0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; +0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; +0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; +0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; +0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; +0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; +0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; +0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; +0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; +0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; +0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; +0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; +0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; +0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; +0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; +0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; +0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; +0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; +0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; +0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; +0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; +0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; +0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; +0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; +0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; +0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; +0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; +0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; +0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; +0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; +0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; +0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; +0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; +0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; +0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; +0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; +0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; +0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; +0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; +0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; +0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; +0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; +0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; +0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; +0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; +0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; +0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; +0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; +0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; +0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; +0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; +0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; +0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; +0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; +0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; +0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; +0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; +0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; +0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; +0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; +0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; +0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; +0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; +0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; +0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; +0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; +0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; +0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; +0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; +0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; +0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; +0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; +0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; +0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; +0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; +0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; +0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; +0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; +0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; +0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; +0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; +0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; +0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; +0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; +0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; +0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; +0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; +0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; +0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; +0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; +0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; +0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; +0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; +0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; +0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; +0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; +0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; +0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; +0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; +0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; +0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; +0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; +0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; +0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; +0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; +0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; +0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; +0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; +0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; +0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; +0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; +0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; +0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; +0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; +0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; +0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; +0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; +0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; +0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; +0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; +0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; +0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; +0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; +0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; +0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; +0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; +0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; +0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; +0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; +0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; +0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; +0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; +0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; +0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; +0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; +0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; +0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; +0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; +0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; +0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; +0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; +0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; +0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; +0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; +0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; +0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; +0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; +0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; +0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; +0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; +0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; +0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; +0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; +0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; +0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; +0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; +0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; +0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; +0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; +0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; +0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; +0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; +0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; +0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; +0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; +0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; +0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; +0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; +0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; +0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; +0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; +0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; +0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; +0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; +0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; +0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; +0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; +0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; +0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; +0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; +0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; +0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; +0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; +0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; +0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; +0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; +0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; +0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; +0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; +0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; +0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; +0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; +0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; +0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; +0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; +0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; +0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; +0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; +0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; +0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; +0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; +0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; +0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; +0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; +0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; +0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; +0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; +0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; +0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; +0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; +0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; +0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; +0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; +0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; +0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; +0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; +0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; +0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; +0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; +0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; +0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; +0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; +0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; +0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; +0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; +0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; +0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; +0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; +0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; +0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; +0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; +0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; +0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; +0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; +0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; +0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; +0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; +0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; +0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; +0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; +0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; +0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; +0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; +0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; +0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; +0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; +0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; +0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; +0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; +0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; +0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; +0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; +0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; +0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; +0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; +0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; +0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; +0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;;;; +0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; +0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; +0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; +0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; +0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; +0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; +0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; +0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; +0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; +0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; +0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; +0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; +0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; +0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; +0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; +0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; +0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; +0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; +0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; +0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; +0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; +0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; +0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; +0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; +0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; +0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; +0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; +0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; +0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; +0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; +0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; +0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; +0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; +0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; +0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; +0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; +0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; +0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; +0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; +0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; +0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; +0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; +0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; +0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; +0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; +0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; +0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; +0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; +0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; +0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; +0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; +0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; +0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; +0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; +0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; +0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; +0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; +0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; +0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; +0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; +0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; +0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; +0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; +0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; +0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; +0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; +0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; +0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; +0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; +0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; +0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; +0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; +0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; +0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; +0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; +0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; +0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; +0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; +0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; +0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; +0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; +0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; +0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; +0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; +0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; +0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; +0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; +0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; +0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; +0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; +0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; +0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; +0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; +0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; +0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; +0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; +0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; +0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; +0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; +0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; +0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; +0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; +0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; +0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; +0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; +0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; +0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; +0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; +0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; +0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; +0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; +0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; +0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; +0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; +0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; +0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; +0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; +0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; +0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; +0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; +0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; +0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; +0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; +0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; +0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; +0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; +0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; +0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; +0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; +0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; +0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; +0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; +0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; +0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; +0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; +0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; +0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; +0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; +0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; +0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; +0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; +0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; +0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; +0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; +0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; +0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; +0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; +0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; +0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; +0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; +0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; +0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; +0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; +0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; +0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; +0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; +0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; +0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; +0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; +0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; +0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; +0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; +0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; +0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; +0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; +0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; +0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; +0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; +0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; +0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; +0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; +0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; +0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; +0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; +0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; +0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; +0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; +0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; +0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; +0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; +1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; +1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; +1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; +1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; +1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; +1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; +1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; +1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; +1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; +1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; +100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; +100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; +100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; +100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; +100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; +100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; +1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; +1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; +1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; +1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; +1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; +1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; +1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; +1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; +1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; +1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; +101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; +101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; +101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; +101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; +101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; +101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; +1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; +1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; +1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; +1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; +1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; +1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; +1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; +1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; +1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; +1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; +102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; +102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; +1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; +1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; +1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; +103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; +103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; +103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; +104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; +104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; +104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; +104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; +104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; +1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; +1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; +1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; +105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; +105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; +105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; +105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; +105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; +1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; +1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; +1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; +1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; +1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; +1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; +1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; +1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; +1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; +106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; +106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; +106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; +106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; +106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; +106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; +1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; +1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; +1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; +1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; +1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; +1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; +1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; +1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; +1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; +1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; +107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; +107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; +107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; +107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; +107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; +107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; +1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; +1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; +1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; +1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; +1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; +1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; +1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; +1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; +1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; +1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; +108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; +108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; +108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; +108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; +108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; +108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; +1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; +109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; +109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; +109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; +109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; +109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; +10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; +10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; +10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; +10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; +10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; +10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; +10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; +10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; +10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; +10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; +10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; +10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; +10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; +10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; +10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; +10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; +10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; +10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; +10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; +10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; +10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; +10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; +10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; +10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; +10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; +10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; +10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; +10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; +10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; +10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; +10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; +10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; +10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; +10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; +10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; +10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; +10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; +10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; +10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; +10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; +10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; +10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; +10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; +10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; +10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; +10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; +10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; +10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; +10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; +10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; +10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; +10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; +10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; +10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; +10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; +10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; +10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; +10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; +10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; +10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; +10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; +10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; +10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; +10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; +10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; +10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; +10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; +10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; +10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; +10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; +10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; +10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; +10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; +10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; +10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; +10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; +10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; +10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; +10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; +10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; +10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; +10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; +10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; +10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L; 10DC;;;;N;;;;; +10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;; +10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;; +10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;; +1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; +1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; +1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; +1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; +1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; +110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; +110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; +110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; +1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; +1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; +1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; +112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; +112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; +112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; +1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; +1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; +1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; +1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; +113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; +113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; +113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; +1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; +1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; +1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; +1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; +1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; +114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; +114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; +114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; +114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; +114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; +1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; +1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; +1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; +1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; +1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; +1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; +115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; +1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; +1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; +1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; +1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; +1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; +1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; +1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; +1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; +1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; +1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; +116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; +116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; +116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; +116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; +116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; +116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; +1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; +1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; +1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; +1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; +1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; +1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; +1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; +1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; +1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; +1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; +117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; +117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; +117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; +117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; +117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; +117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; +1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; +1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; +1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; +1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; +1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; +1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; +1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; +1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; +1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; +1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; +118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; +118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; +118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; +118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; +118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; +118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; +1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; +1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; +1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; +1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; +1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; +1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; +1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; +1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; +1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; +1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; +119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; +119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; +119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; +119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; +119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; +119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; +11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; +11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; +11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; +11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; +11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; +11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; +11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; +11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; +11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; +11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; +11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; +11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; +11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; +11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; +11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; +11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; +11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; +11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; +11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; +11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; +11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; +11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; +11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; +11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; +11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; +11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; +11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; +11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; +11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; +11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; +11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; +11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; +11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; +11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; +11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; +11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; +11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; +11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; +11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; +11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; +11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; +11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; +11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; +11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; +11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; +11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; +11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; +11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; +11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; +11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; +11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; +11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; +11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; +11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; +11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; +11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; +11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; +11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; +11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; +11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; +11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; +11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; +11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; +11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; +11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; +11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; +11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; +11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; +1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; +1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; +1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; +1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; +1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; +1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; +1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; +1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; +1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; +120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; +120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; +120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; +120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; +120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; +1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; +1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; +1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; +1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; +1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; +1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; +1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; +1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; +1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; +1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; +121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; +121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; +121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; +121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; +121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; +1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; +1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; +1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; +1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; +1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; +1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; +1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; +1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; +1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; +1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; +122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; +122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; +122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; +122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; +122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; +122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; +1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; +1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; +1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; +1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; +1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; +1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; +1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; +1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; +123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; +1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; +1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; +1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; +1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; +1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; +1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; +1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; +1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; +1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; +124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; +124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; +124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; +124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; +1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; +1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; +1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; +1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; +1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; +1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; +1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; +1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; +125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; +125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; +125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; +125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; +1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; +1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; +1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; +1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; +1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; +1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; +1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; +1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; +1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; +126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; +126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; +126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; +126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; +126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; +1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; +1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; +1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; +1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; +1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; +1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; +1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; +1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; +1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; +127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; +127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; +127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; +127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; +127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; +1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; +1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; +1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; +1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; +1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; +1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; +1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; +1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; +1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; +128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; +128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; +128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; +128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; +1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; +1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; +1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; +1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; +1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; +1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; +1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; +1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; +129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; +12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; +12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; +12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; +12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; +12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; +12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; +12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; +12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; +12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; +12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; +12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; +12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; +12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; +12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; +12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; +12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; +12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; +12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; +12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; +12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; +12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; +12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; +12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; +12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; +12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; +12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; +12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; +12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; +12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; +12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; +12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; +12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; +12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; +12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; +12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; +12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; +12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; +12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; +12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; +12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; +12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; +12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; +12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; +12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; +12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; +12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; +12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; +12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; +12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; +12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; +12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; +12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; +12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; +12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; +12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; +12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; +12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; +12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; +12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; +12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; +12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; +12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; +12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; +12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; +12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; +12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; +12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; +1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; +1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; +1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; +1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; +1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; +1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; +1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; +1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; +1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; +130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; +130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; +130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; +130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; +130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; +1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; +1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; +1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; +1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; +1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; +1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; +131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; +131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; +1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; +1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; +1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; +1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; +1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; +1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; +1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; +1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; +132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; +132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; +132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; +1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; +1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; +1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; +1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; +1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; +1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; +1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; +1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; +1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; +1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; +133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; +133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; +133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; +133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; +133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; +133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; +1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; +1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; +1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; +1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; +1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; +1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; +1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; +1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; +1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; +1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; +134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; +134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; +134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; +134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; +134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; +1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; +1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; +1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; +1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; +1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; +1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; +1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; +1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; +1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; +135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; +135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; +135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; +1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; +1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; +1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; +1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; +1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; +1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; +1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; +1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; +1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; +1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; +136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; +136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; +136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; +136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; +136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; +136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; +1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; +1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; +1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; +1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; +137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; +1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; +1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; +1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; +1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; +1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; +1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; +1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; +1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; +1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; +138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; +138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; +138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; +138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; +138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; +138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; +1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; +1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; +1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; +1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; +1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; +1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; +1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; +1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; +1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; +1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; +13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; +13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; +13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; +13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; +13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; +13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; +13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; +13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; +13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; +13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; +13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; +13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; +13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; +13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; +13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; +13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; +13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; +13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; +13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; +13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; +13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; +13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; +13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; +13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; +13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; +13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; +13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; +13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; +13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; +13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; +13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; +13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; +13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; +13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; +13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; +13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; +13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; +13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; +13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; +13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; +13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; +13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; +13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; +13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; +13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; +13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; +13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; +13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; +13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; +13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; +13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; +13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; +13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; +13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; +13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; +13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; +13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; +13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; +13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; +13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; +13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; +13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; +13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; +13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; +13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; +13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; +13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; +13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; +13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; +13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; +13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; +13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; +13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; +13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; +13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; +13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; +13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; +13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; +13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; +13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; +13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; +13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; +13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; +13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; +1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; +1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; +1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; +1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; +1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; +1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; +1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; +1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; +1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; +140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; +140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; +140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; +140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; +140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; +140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; +1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; +1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; +1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; +1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; +1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; +1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; +1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; +1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; +1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; +1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; +141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; +141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; +141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; +141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; +141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; +1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; +1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; +1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; +1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; +1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; +1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; +1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; +1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; +1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; +1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; +142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; +142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; +142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; +142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; +142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; +142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; +1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; +1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; +1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; +1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; +1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; +1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; +1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; +1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; +1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; +1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; +143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; +143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; +143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; +143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; +143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; +143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; +1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; +1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; +1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; +1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; +1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; +1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; +1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; +1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; +1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; +1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; +144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; +144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; +144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; +144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; +144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; +144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; +1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; +1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; +1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; +1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; +1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; +1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; +1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; +1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; +1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; +1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; +145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; +145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; +145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; +145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; +145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; +145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; +1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; +1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; +1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; +1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; +1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; +1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; +1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; +1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; +1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; +1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; +146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; +146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; +146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; +146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; +146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; +146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; +1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; +1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; +1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; +1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; +1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; +1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; +1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; +1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; +1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; +1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; +147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; +147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; +147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; +147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; +147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; +147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; +1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; +1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; +1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; +1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; +1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; +1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; +1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; +1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; +1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; +1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; +148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; +148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; +148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; +148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; +148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; +148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; +1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; +1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; +1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; +1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; +1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; +1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; +1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; +1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; +1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; +1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; +149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; +149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; +149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; +149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; +149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; +149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; +14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; +14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; +14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; +14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; +14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; +14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; +14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; +14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; +14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; +14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; +14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; +14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; +14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; +14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; +14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; +14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; +14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; +14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; +14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; +14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; +14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; +14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; +14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; +14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; +14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; +14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; +14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; +14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; +14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; +14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; +14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; +14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; +14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; +14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; +14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; +14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; +14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; +14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; +14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; +14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; +14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; +14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; +14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; +14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; +14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; +14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; +14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; +14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; +14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; +14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; +14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; +14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; +14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; +14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; +14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; +14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; +14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; +14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; +14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; +14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; +14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; +14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; +14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; +14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; +14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; +14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; +14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; +14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; +14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; +14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; +14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; +14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; +14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; +14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; +14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; +14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; +14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; +14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; +14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; +14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; +14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; +14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; +14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; +14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; +14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; +14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; +14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; +14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; +14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; +14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; +14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; +14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; +14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; +14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; +14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; +14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; +1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; +1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; +1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; +1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; +1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; +1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; +1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; +1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; +1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; +1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; +150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; +150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; +150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; +150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; +150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; +150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; +1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; +1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; +1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; +1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; +1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; +1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; +1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; +1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; +1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; +1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; +151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; +151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; +151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; +151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; +151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; +151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; +1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; +1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; +1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; +1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; +1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; +1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; +1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; +1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; +1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; +1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; +152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; +152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; +152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; +152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; +152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; +152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; +1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; +1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; +1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; +1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; +1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; +1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; +1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; +1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; +1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; +1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; +153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; +153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; +153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; +153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; +153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; +153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; +1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; +1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; +1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; +1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; +1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; +1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; +1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; +1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; +1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; +1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; +154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; +154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; +154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; +154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; +154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; +154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; +1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; +1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; +1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; +1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; +1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; +1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; +1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; +1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; +1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; +1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; +155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; +155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; +155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; +155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; +155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; +155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; +1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; +1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; +1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; +1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; +1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; +1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; +1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; +1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; +1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; +1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; +156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; +156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; +156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; +156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; +156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; +156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; +1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; +1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; +1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; +1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; +1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; +1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; +1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; +1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; +1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; +1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; +157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; +157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; +157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; +157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; +157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; +157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; +1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; +1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; +1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; +1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; +1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; +1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; +1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; +1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; +1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; +1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; +158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; +158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; +158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; +158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; +158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; +158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; +1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; +1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; +1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; +1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; +1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; +1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; +1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; +1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; +1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; +1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; +159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; +159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; +159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; +159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; +159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; +159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; +15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; +15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; +15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; +15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; +15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; +15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; +15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; +15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; +15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; +15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; +15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; +15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; +15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; +15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; +15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; +15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; +15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; +15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; +15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; +15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; +15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; +15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; +15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; +15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; +15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; +15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; +15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; +15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; +15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; +15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; +15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; +15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; +15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; +15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; +15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; +15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; +15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; +15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; +15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; +15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; +15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; +15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; +15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; +15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; +15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; +15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; +15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; +15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; +15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; +15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; +15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; +15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; +15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; +15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; +15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; +15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; +15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; +15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; +15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; +15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; +15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; +15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; +15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; +15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; +15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; +15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; +15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; +15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; +15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; +15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; +15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; +15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; +15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; +15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; +15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; +15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; +15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; +15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; +15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; +15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; +15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; +15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; +15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; +15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; +15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; +15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; +15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; +15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; +15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; +15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; +15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; +15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; +15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; +15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; +15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; +15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; +1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; +1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; +1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; +1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; +1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; +1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; +1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; +1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; +1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; +1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; +160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; +160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; +160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; +160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; +160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; +160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; +1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; +1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; +1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; +1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; +1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; +1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; +1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; +1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; +1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; +1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; +161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; +161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; +161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; +161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; +161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; +161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; +1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; +1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; +1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; +1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; +1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; +1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; +1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; +1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; +1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; +1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; +162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; +162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; +162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; +162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; +162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; +162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; +1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; +1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; +1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; +1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; +1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; +1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; +1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; +1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; +1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; +1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; +163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; +163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; +163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; +163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; +163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; +163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; +1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; +1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; +1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; +1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; +1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; +1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; +1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; +1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; +1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; +1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; +164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; +164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; +164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; +164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; +164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; +164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; +1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; +1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; +1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; +1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; +1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; +1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; +1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; +1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; +1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; +1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; +165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; +165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; +165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; +165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; +165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; +165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; +1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; +1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; +1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; +1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; +1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; +1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; +1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; +1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; +1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; +1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; +166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; +166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; +166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; +166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; +166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; +166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; +1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; +1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; +1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; +1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; +1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; +1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; +1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; +1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; +1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; +1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; +167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; +167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; +167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; +167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; +167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; +167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; +1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; +1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; +1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; +1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; +1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; +1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; +1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; +1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; +1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; +1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; +168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; +168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; +168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; +168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; +168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; +168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; +1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; +1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; +1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; +1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; +1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; +1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; +1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; +1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; +1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; +1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; +169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; +169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; +169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; +16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; +16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; +16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; +16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; +16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; +16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; +16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; +16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; +16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; +16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; +16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; +16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; +16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; +16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; +16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; +16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; +16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; +16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; +16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; +16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; +16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; +16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; +16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; +16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; +16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; +16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; +16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; +16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; +16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; +16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; +16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; +16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; +16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; +16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; +16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; +16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; +16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; +16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; +16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; +16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; +16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; +16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; +16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; +16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; +16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; +16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; +16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; +16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; +16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; +16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; +16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; +16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; +16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; +16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; +16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; +16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; +16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; +16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; +16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; +16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; +16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; +16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; +16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; +16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; +16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; +16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; +16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; +16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; +16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; +16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; +16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; +16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; +16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; +16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; +16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; +16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; +16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; +16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; +16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; +16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; +16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; +16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; +16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; +16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; +16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; +16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; +16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; +16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; +1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; +1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; +1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; +1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; +1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; +1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; +1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; +1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; +1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; +1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; +170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; +170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; +170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; +170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; +170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; +1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; +1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; +1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; +1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; +1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; +1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; +1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; +1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; +1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; +1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; +1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; +1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; +172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; +172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; +172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; +172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; +172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; +172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; +1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; +1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; +1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; +1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; +1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; +1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; +1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; +1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; +1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; +1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; +1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; +1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; +1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; +1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; +174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; +174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; +174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; +174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; +174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; +174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; +1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; +1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; +1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; +1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; +1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; +1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; +1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; +1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; +1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; +1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; +1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; +1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; +176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; +176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; +176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; +176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; +176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; +1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; +1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; +1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; +1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; +1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; +1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; +1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; +1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; +1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; +1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; +1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; +178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; +178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; +178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; +178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; +178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; +178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; +1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; +1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; +1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; +1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; +1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; +1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; +1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; +1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; +1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; +1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; +179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; +179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; +179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; +179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; +179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; +179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; +17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; +17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; +17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; +17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; +17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; +17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; +17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; +17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; +17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; +17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; +17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; +17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; +17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; +17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; +17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; +17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; +17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; +17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; +17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; +17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; +17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; +17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; +17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; +17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; +17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; +17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; +17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; +17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; +17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; +17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; +17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; +17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; +17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; +17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; +17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; +17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; +17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; +17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; +17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; +17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; +17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; +17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; +17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; +17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; +17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; +17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; +17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; +17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; +17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; +17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; +17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; +17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; +17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; +17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; +17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; +17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; +17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; +17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; +17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; +17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; +17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; +1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; +1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; +1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; +1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; +1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; +1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; +1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; +1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; +1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; +1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; +180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; +180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; +180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; +180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; +180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; +1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; +1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; +1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; +1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; +1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; +1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; +1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; +1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; +1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; +1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; +182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; +182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; +182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; +182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; +182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; +182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; +1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; +1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; +1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; +1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; +1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; +1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; +1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; +1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; +183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; +183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; +183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; +183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; +183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; +183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; +1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; +1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; +1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; +1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; +1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; +1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; +1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; +1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; +1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; +184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; +184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; +184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; +184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; +184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; +184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; +1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; +1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; +1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; +1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; +1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; +1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; +1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; +1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; +1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; +1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; +185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; +185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; +185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; +185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; +185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; +185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; +1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; +1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; +1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; +1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; +1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; +1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; +1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; +1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; +1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; +1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; +186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; +186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; +186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; +186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; +186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; +186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; +1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; +1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; +1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; +1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; +1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; +1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; +1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; +1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; +1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; +1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; +1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; +1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; +1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; +1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; +1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; +1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; +1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; +1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; +188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; +188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; +188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; +188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; +188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; +188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; +1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; +1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; +1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; +1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; +1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; +1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; +1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; +1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; +1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; +189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; +189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; +189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; +189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; +189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; +18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; +18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; +18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; +18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; +18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; +18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; +18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; +18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; +18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; +18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; +18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; +18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; +18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; +18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; +18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; +18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; +18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; +18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; +18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; +18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; +18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; +18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; +18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; +18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; +18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; +18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; +18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; +18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; +18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; +18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; +18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; +18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; +18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; +18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; +18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; +18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; +18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; +18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; +18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; +18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; +18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; +18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; +18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; +18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; +18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; +18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; +18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; +18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; +18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; +18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; +18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; +18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; +18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; +18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; +18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; +18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; +18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; +18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; +18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; +18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; +18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; +18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; +18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; +18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; +18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; +18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; +18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; +18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; +18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; +18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; +18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; +18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; +18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; +18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; +18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; +18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; +18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; +18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; +18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; +18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; +18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; +1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; +1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; +1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; +1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; +1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; +1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; +1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; +1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; +1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; +1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; +190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; +190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; +190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; +190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; +190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; +190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; +1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; +1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; +1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; +1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; +1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; +1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; +1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; +1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; +1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; +1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; +191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; +191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; +191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; +191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; +191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; +1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; +1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; +1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; +1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; +1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; +1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; +1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; +1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; +1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; +1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; +193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; +193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; +1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; +1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; +1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; +1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; +1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; +1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; +1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; +1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; +1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; +1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; +1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; +1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; +1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; +195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; +195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; +195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; +195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; +195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; +195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; +1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; +1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; +1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; +1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; +1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; +1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; +1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; +1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; +1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; +1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; +196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; +196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; +196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; +196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; +1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; +1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; +1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; +1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; +1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; +1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; +1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; +1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; +1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; +1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; +1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; +1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; +1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; +198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; +198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; +198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; +1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; +1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; +1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; +199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; +199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; +199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; +199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; +199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; +19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; +19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; +19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; +19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; +19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; +19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; +19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; +19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; +19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; +19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; +19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; +19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; +19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; +19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; +19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; +19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; +19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; +19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; +19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; +19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; +19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; +19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; +19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; +19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; +19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; +19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; +19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; +19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; +19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; +19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; +19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; +19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; +19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; +19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; +19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; +19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; +19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; +19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; +19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; +19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; +19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; +19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; +19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; +19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; +19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; +19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; +19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; +19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; +1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; +1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; +1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; +1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; +1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; +1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; +1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; +1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; +1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; +1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; +1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; +1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; +1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; +1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; +1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; +1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; +1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; +1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; +1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; +1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; +1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; +1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; +1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; +1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; +1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; +1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; +1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; +1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; +1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; +1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; +1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; +1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; +1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; +1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; +1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; +1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; +1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; +1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; +1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; +1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; +1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; +1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; +1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; +1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; +1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; +1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; +1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; +1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; +1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; +1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; +1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; +1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; +1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; +1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; +1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; +1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; +1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; +1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; +1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; +1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; +1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; +1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; +1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; +1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; +1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; +1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; +1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; +1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; +1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; +1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; +1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; +1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; +1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; +1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; +1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; +1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; +1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; +1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; +1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; +1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; +1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; +1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; +1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; +1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; +1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; +1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; +1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; +1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; +1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; +1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; +1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; +1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; +1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; +1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; +1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; +1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; +1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; +1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; +1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; +1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; +1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; +1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; +1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; +1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; +1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; +1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; +1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; +1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; +1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; +1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; +1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; +1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; +1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; +1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; +1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; +1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; +1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; +1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; +1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; +1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; +1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; +1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; +1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; +1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; +1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; +1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; +1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; +1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; +1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; +1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; +1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; +1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; +1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; +1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; +1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; +1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; +1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; +1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; +1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; +1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; +1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; +1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; +1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; +1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; +1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; +1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; +1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; +1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; +1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; +1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; +1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; +1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; +1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; +1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; +1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; +1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; +1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; +1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; +1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; +1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; +1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; +1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; +1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; +1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; +1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; +1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; +1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; +1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; +1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; +1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; +1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; +1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; +1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; +1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; +1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; +1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; +1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; +1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; +1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; +1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; +1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; +1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; +1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; +1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; +1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; +1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; +1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; +1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; +1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; +1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; +1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; +1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; +1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; +1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; +1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; +1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; +1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; +1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; +1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; +1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; +1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; +1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; +1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; +1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; +1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; +1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; +1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; +1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; +1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; +1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; +1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; +1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; +1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; +1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; +1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; +1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; +1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; +1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; +1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; +1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; +1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; +1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; +1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; +1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; +1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; +1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; +1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; +1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; +1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; +1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; +1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; +1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; +1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; +1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; +1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; +1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; +1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; +1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; +1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; +1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; +1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; +1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; +1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; +1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; +1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; +1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; +1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; +1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; +1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; +1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; +1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; +1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; +1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; +1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; +1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; +1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; +1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; +1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; +1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; +1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; +1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; +1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; +1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; +1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; +1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; +1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; +1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; +1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; +1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; +1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; +1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; +1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; +1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; +1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; +1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; +1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; +1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; +1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; +1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; +1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; +1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; +1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; +1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; +1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; +1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; +1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; +1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; +1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; +1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; +1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; +1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; +1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; +1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; +1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; +1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; +1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; +1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; +1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; +1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; +1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; +1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; +1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; +1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; +1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; +1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; +1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; +1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; +1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; +1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; +1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; +1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; +1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; +1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; +1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; +1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; +1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; +1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; +1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; +1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; +1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; +1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; +1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; +1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; +1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; +1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; +1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; +1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; +1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; +1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; +1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; +1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; +1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; +1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; +1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; +1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; +1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; +1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; +1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; +1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; +1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; +1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; +1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; +1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; +1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; +1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; +1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; +1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; +1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; +1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; +1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; +1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; +1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; +1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; +1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; +1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; +1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; +1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; +1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; +1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; +1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; +1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; +1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; +1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; +1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; +1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; +1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; +1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; +1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; +1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; +1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; +1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; +1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; +1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; +1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; +1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; +1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; +1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; +1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; +1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; +1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; +1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; +1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; +1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; +1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; +1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; +1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; +1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; +1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; +1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; +1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; +1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; +1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; +1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; +1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; +1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; +1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; +1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; +1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; +1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; +1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; +1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; +1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; +1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; +1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; +1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; +1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; +1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; +1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; +1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; +1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; +1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; +1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; +1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; +1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; +1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; +1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; +1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; +1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; +1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; +1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; +1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; +1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;; +1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; +1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; +1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; +1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; +1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; +1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; +1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; +1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; +1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; +1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; +1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; +1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; +1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; +1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; +1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; +1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; +1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; +1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; +1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; +1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; +1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; +1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; +1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; +1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; +1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; +1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; +1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; +1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; +1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; +1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; +1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; +1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; +1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; +1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; +1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; +1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; +1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; +1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; +1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; +1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; +1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; +1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; +1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; +1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; +1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; +1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L; 0041;;;;N;;;;; +1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L; 00C6;;;;N;;;;; +1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L; 0042;;;;N;;;;; +1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; +1D30;MODIFIER LETTER CAPITAL D;Lm;0;L; 0044;;;;N;;;;; +1D31;MODIFIER LETTER CAPITAL E;Lm;0;L; 0045;;;;N;;;;; +1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L; 018E;;;;N;;;;; +1D33;MODIFIER LETTER CAPITAL G;Lm;0;L; 0047;;;;N;;;;; +1D34;MODIFIER LETTER CAPITAL H;Lm;0;L; 0048;;;;N;;;;; +1D35;MODIFIER LETTER CAPITAL I;Lm;0;L; 0049;;;;N;;;;; +1D36;MODIFIER LETTER CAPITAL J;Lm;0;L; 004A;;;;N;;;;; +1D37;MODIFIER LETTER CAPITAL K;Lm;0;L; 004B;;;;N;;;;; +1D38;MODIFIER LETTER CAPITAL L;Lm;0;L; 004C;;;;N;;;;; +1D39;MODIFIER LETTER CAPITAL M;Lm;0;L; 004D;;;;N;;;;; +1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L; 004E;;;;N;;;;; +1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; +1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L; 004F;;;;N;;;;; +1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L; 0222;;;;N;;;;; +1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L; 0050;;;;N;;;;; +1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L; 0052;;;;N;;;;; +1D40;MODIFIER LETTER CAPITAL T;Lm;0;L; 0054;;;;N;;;;; +1D41;MODIFIER LETTER CAPITAL U;Lm;0;L; 0055;;;;N;;;;; +1D42;MODIFIER LETTER CAPITAL W;Lm;0;L; 0057;;;;N;;;;; +1D43;MODIFIER LETTER SMALL A;Lm;0;L; 0061;;;;N;;;;; +1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L; 0250;;;;N;;;;; +1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L; 0251;;;;N;;;;; +1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L; 1D02;;;;N;;;;; +1D47;MODIFIER LETTER SMALL B;Lm;0;L; 0062;;;;N;;;;; +1D48;MODIFIER LETTER SMALL D;Lm;0;L; 0064;;;;N;;;;; +1D49;MODIFIER LETTER SMALL E;Lm;0;L; 0065;;;;N;;;;; +1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L; 0259;;;;N;;;;; +1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L; 025B;;;;N;;;;; +1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1D4D;MODIFIER LETTER SMALL G;Lm;0;L; 0067;;;;N;;;;; +1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; +1D4F;MODIFIER LETTER SMALL K;Lm;0;L; 006B;;;;N;;;;; +1D50;MODIFIER LETTER SMALL M;Lm;0;L; 006D;;;;N;;;;; +1D51;MODIFIER LETTER SMALL ENG;Lm;0;L; 014B;;;;N;;;;; +1D52;MODIFIER LETTER SMALL O;Lm;0;L; 006F;;;;N;;;;; +1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L; 0254;;;;N;;;;; +1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L; 1D16;;;;N;;;;; +1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L; 1D17;;;;N;;;;; +1D56;MODIFIER LETTER SMALL P;Lm;0;L; 0070;;;;N;;;;; +1D57;MODIFIER LETTER SMALL T;Lm;0;L; 0074;;;;N;;;;; +1D58;MODIFIER LETTER SMALL U;Lm;0;L; 0075;;;;N;;;;; +1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L; 1D1D;;;;N;;;;; +1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L; 026F;;;;N;;;;; +1D5B;MODIFIER LETTER SMALL V;Lm;0;L; 0076;;;;N;;;;; +1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L; 1D25;;;;N;;;;; +1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L; 03B2;;;;N;;;;; +1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L; 03B4;;;;N;;;;; +1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L; 03C6;;;;N;;;;; +1D61;MODIFIER LETTER SMALL CHI;Lm;0;L; 03C7;;;;N;;;;; +1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L; 0072;;;;N;;;;; +1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L; 0075;;;;N;;;;; +1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L; 0076;;;;N;;;;; +1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L; 03B2;;;;N;;;;; +1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 03B3;;;;N;;;;; +1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L; 03C1;;;;N;;;;; +1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L; 03C6;;;;N;;;;; +1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L; 03C7;;;;N;;;;; +1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; +1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; +1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L; 043D;;;;N;;;;; +1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D +1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; +1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 +1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; +1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; +1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; +1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; +1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L; 0252;;;;N;;;;; +1D9C;MODIFIER LETTER SMALL C;Lm;0;L; 0063;;;;N;;;;; +1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L; 0255;;;;N;;;;; +1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L; 00F0;;;;N;;;;; +1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L; 025C;;;;N;;;;; +1DA0;MODIFIER LETTER SMALL F;Lm;0;L; 0066;;;;N;;;;; +1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L; 025F;;;;N;;;;; +1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L; 0261;;;;N;;;;; +1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L; 0265;;;;N;;;;; +1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L; 0268;;;;N;;;;; +1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L; 0269;;;;N;;;;; +1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L; 026A;;;;N;;;;; +1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L; 1D7B;;;;N;;;;; +1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L; 029D;;;;N;;;;; +1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L; 026D;;;;N;;;;; +1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L; 1D85;;;;N;;;;; +1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L; 029F;;;;N;;;;; +1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L; 0271;;;;N;;;;; +1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L; 0270;;;;N;;;;; +1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L; 0272;;;;N;;;;; +1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L; 0273;;;;N;;;;; +1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L; 0274;;;;N;;;;; +1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L; 0275;;;;N;;;;; +1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L; 0278;;;;N;;;;; +1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L; 0282;;;;N;;;;; +1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L; 0283;;;;N;;;;; +1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L; 01AB;;;;N;;;;; +1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L; 0289;;;;N;;;;; +1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L; 028A;;;;N;;;;; +1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L; 1D1C;;;;N;;;;; +1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L; 028B;;;;N;;;;; +1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L; 028C;;;;N;;;;; +1DBB;MODIFIER LETTER SMALL Z;Lm;0;L; 007A;;;;N;;;;; +1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L; 0290;;;;N;;;;; +1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L; 0291;;;;N;;;;; +1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L; 0292;;;;N;;;;; +1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L; 03B8;;;;N;;;;; +1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; +1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; +1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; +1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; +1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; +1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; +1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; +1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; +1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; +1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; +1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; +1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; +1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; +1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; +1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; +1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; +1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; +1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; +1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; +1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; +1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; +1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; +1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; +1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; +1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; +1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; +1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; +1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; +1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; +1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; +1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; +1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; +1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; +1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; +1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; +1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; +1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; +1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; +1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; +1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; +1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; +1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; +1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; +1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; +1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; +1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; +1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; +1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; +1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 +1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; +1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 +1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; +1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 +1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; +1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 +1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; +1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 +1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; +1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A +1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; +1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C +1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; +1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E +1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; +1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 +1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; +1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 +1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; +1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 +1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; +1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 +1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; +1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 +1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; +1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A +1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; +1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C +1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; +1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E +1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; +1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 +1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; +1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 +1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; +1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 +1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; +1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 +1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; +1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 +1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; +1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A +1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; +1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C +1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; +1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E +1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; +1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 +1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; +1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 +1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; +1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 +1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; +1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 +1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; +1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 +1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; +1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A +1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; +1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C +1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; +1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E +1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; +1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 +1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; +1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 +1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; +1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 +1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; +1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 +1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; +1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 +1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; +1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A +1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; +1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C +1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; +1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E +1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; +1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 +1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; +1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 +1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; +1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 +1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; +1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 +1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; +1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 +1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; +1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A +1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; +1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C +1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; +1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E +1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; +1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 +1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; +1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 +1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; +1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 +1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; +1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 +1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; +1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 +1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; +1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A +1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; +1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C +1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; +1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E +1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; +1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 +1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; +1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 +1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; +1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 +1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; +1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 +1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; +1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 +1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; +1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A +1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; +1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C +1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; +1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E +1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; +1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 +1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; +1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 +1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; +1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 +1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; +1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 +1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; +1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 +1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; +1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A +1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; +1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C +1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; +1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E +1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; +1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 +1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; +1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 +1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; +1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 +1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; +1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; +1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; +1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; +1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; +1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 +1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; +1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; +1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; +1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; +1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; +1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 +1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; +1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 +1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; +1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 +1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; +1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 +1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; +1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 +1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; +1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA +1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; +1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC +1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; +1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE +1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; +1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 +1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; +1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 +1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; +1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 +1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; +1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 +1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; +1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 +1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; +1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA +1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; +1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC +1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; +1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE +1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; +1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 +1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; +1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 +1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; +1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 +1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; +1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 +1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; +1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 +1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; +1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA +1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; +1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; +1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE +1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; +1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 +1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; +1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 +1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; +1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 +1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; +1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 +1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; +1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; +1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA +1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; +1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC +1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; +1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE +1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; +1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 +1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; +1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 +1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; +1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 +1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; +1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 +1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; +1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 +1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; +1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA +1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; +1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC +1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; +1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE +1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; +1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 +1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; +1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 +1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; +1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 +1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; +1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 +1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; +1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 +1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; +1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA +1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; +1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC +1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; +1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE +1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 +1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 +1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A +1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B +1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C +1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D +1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E +1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F +1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; +1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; +1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; +1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; +1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; +1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; +1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; +1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; +1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 +1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 +1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A +1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B +1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C +1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D +1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; +1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; +1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; +1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; +1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; +1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; +1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 +1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 +1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A +1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B +1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C +1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D +1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E +1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F +1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; +1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; +1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; +1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; +1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; +1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; +1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; +1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; +1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 +1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 +1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A +1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B +1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C +1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D +1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E +1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F +1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; +1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; +1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; +1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; +1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; +1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; +1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; +1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; +1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 +1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 +1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A +1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B +1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C +1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D +1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; +1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; +1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; +1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; +1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; +1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; +1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; +1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 +1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; +1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B +1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; +1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D +1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; +1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F +1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; +1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; +1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; +1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; +1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 +1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 +1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A +1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B +1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C +1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D +1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E +1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F +1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; +1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; +1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; +1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; +1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; +1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; +1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; +1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; +1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA +1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB +1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 +1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 +1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA +1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB +1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA +1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB +1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 +1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 +1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA +1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB +1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA +1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB +1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 +1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 +1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A +1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B +1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C +1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D +1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E +1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F +1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; +1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; +1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; +1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; +1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; +1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; +1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; +1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; +1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 +1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 +1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A +1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B +1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C +1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D +1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E +1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F +1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; +1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; +1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; +1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; +1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; +1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; +1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; +1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; +1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 +1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 +1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA +1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB +1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC +1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD +1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE +1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF +1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; +1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; +1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; +1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; +1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; +1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; +1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; +1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; +1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 +1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 +1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; +1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC +1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; +1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; +1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; +1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; +1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; +1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; +1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; +1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; +1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; +1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 +1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; +1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; +1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; +1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; +1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC +1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; +1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; +1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; +1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; +1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; +1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; +1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; +1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; +1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; +1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; +1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; +1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 +1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 +1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; +1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; +1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; +1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; +1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; +1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; +1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; +1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; +1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; +1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; +1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; +1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 +1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 +1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; +1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; +1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; +1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC +1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; +1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; +1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; +1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; +1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; +1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; +1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; +1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; +1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; +1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; +1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; +1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC +1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; +1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; +1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; +1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; +1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; +1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; +1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; +1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; +1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; +1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; +2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; +2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; +2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; +2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; +2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; +2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; +2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; +200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; +200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; +200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; +200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; +200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; +200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; +2010;HYPHEN;Pd;0;ON;;;;;N;;;;; +2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; +2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; +2013;EN DASH;Pd;0;ON;;;;;N;;;;; +2014;EM DASH;Pd;0;ON;;;;;N;;;;; +2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; +2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; +2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; +2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; +2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; +201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; +201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; +201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; +201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; +201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; +201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; +2020;DAGGER;Po;0;ON;;;;;N;;;;; +2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; +2022;BULLET;Po;0;ON;;;;;N;;;;; +2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; +2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; +2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; +2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; +2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; +2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; +2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; +202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; +202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; +202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; +202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; +202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; +202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; +2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; +2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; +2032;PRIME;Po;0;ET;;;;;N;;;;; +2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; +2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; +2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; +2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; +2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; +2038;CARET;Po;0;ON;;;;;N;;;;; +2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; +203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; +203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; +203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; +203D;INTERROBANG;Po;0;ON;;;;;N;;;;; +203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; +203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; +2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; +2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; +2042;ASTERISM;Po;0;ON;;;;;N;;;;; +2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; +2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; +2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; +2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; +2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; +2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; +2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; +204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; +204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; +204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; +204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; +204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; +2050;CLOSE UP;Po;0;ON;;;;;N;;;;; +2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; +2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; +2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; +2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; +2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2057;QUADRUPLE PRIME;Po;0;ON; 2032 2032 2032 2032;;;;N;;;;; +2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; +205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; +205D;TRICOLON;Po;0;ON;;;;;N;;;;; +205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; +205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; +2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; +2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; +2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; +2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; +2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; +2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; +2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; +2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; +2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; +206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; +206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; +206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; +2070;SUPERSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; +2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; +2074;SUPERSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; +2075;SUPERSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; +2076;SUPERSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; +2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; +2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; +2079;SUPERSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; +207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +207B;SUPERSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; +207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; +207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; +207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +2080;SUBSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; +2081;SUBSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; +2082;SUBSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; +2083;SUBSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; +2084;SUBSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; +2085;SUBSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; +2086;SUBSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; +2087;SUBSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; +2088;SUBSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; +2089;SUBSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; +208A;SUBSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +208B;SUBSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; +208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; +208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; +2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; +2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; +2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; +2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L; 0078;;;;N;;;;; +2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L; 0259;;;;N;;;;; +2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L; 0068;;;;N;;;;; +2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L; 006B;;;;N;;;;; +2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L; 006C;;;;N;;;;; +2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L; 006D;;;;N;;;;; +2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; +209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; +209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; +209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; +20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; +20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; +20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; +20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; +20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; +20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; +20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; +20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; +20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; +20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; +20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; +20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; +20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; +20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; +20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; +20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; +20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; +20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; +20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; +20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; +20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; +20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; +20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; +20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; +20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; +20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; +20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; +20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; +20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; +20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; +20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; +20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; +20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; +20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; +20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; +20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; +20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; +20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; +20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; +20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; +20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; +20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; +20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; +20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; +20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; +20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; +20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; +20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; +20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; +20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; +20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; +20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; +20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; +20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; +20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; +20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; +2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; +2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; +2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; +2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; +2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; +2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; +2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; +2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; +2108;SCRUPLE;So;0;ON;;;;;N;;;;; +2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; +210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; +210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; +210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; +210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; +210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; +2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; +2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; +2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; +2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; +2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; +2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; +2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; +2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; +2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; +211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; +211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; +211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; +211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; +211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; +211F;RESPONSE;So;0;ON;;;;;N;;;;; +2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; +2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; +2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; +2123;VERSICLE;So;0;ON;;;;;N;;;;; +2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; +2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; +2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; +2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; +2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; +2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; +212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; +212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; +212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; +212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; +212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; +212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; +2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; +2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; +2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; +2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; +2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; +2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; +2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; +2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; +213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; +213B;FACSIMILE SIGN;So;0;ON; 0046 0041 0058;;;;N;;;;; +213C;DOUBLE-STRUCK SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON; 2211;;;;Y;;;;; +2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; +2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; +2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; +2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; +214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; +214C;PER SIGN;So;0;ON;;;;;N;;;;; +214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; +214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 +214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; +2150;VULGAR FRACTION ONE SEVENTH;No;0;ON; 0031 2044 0037;;;1/7;N;;;;; +2151;VULGAR FRACTION ONE NINTH;No;0;ON; 0031 2044 0039;;;1/9;N;;;;; +2152;VULGAR FRACTION ONE TENTH;No;0;ON; 0031 2044 0031 0030;;;1/10;N;;;;; +2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; +2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; +2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; +2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; +2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; +2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; +2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; +215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; +215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; +215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; +215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; +215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; +215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; +2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; +2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; +2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; +2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; +2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; +2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; +2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; +2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; +2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; +2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; +216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; +216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; +216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; +216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; +216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; +216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; +2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 +2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 +2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 +2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 +2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 +2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 +2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 +2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 +2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 +2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 +217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A +217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B +217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C +217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D +217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E +217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F +2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; +2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; +2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; +2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; +2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 +2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; +2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; +2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; +2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; +2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; +2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; +2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; +2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; +2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; +2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; +2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; +2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; +2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; +2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; +219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; +219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; +219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; +219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; +219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; +219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; +21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; +21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; +21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; +21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; +21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; +21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; +21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; +21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; +21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; +21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; +21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; +21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; +21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; +21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; +21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; +21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; +21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; +21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; +21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; +21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; +21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; +21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; +21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; +21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; +21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; +21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; +21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; +21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; +21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; +21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; +21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; +21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; +21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; +21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; +21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; +21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; +21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; +21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; +21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; +21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; +21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; +21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; +21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; +21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; +21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; +21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; +21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; +21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; +21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; +21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; +21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; +21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; +21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; +21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; +21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; +21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; +21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; +21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; +21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; +21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; +21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; +21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; +21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; +21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; +21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; +21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; +21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; +21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; +21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; +21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; +21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; +21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; +21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; +21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; +21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; +21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; +21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; +2200;FOR ALL;Sm;0;ON;;;;;N;;;;; +2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; +2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; +2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; +2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; +2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; +2206;INCREMENT;Sm;0;ON;;;;;N;;;;; +2207;NABLA;Sm;0;ON;;;;;N;;;;; +2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; +220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; +220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; +220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; +220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; +220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; +2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; +2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; +2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; +2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; +2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; +2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; +2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; +2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; +221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; +221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; +221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; +221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; +221E;INFINITY;Sm;0;ON;;;;;N;;;;; +221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; +2220;ANGLE;Sm;0;ON;;;;;Y;;;;; +2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; +2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; +2223;DIVIDES;Sm;0;ON;;;;;N;;;;; +2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; +2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; +2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; +2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; +222A;UNION;Sm;0;ON;;;;;N;;;;; +222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; +222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; +222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; +2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; +2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2234;THEREFORE;Sm;0;ON;;;;;N;;;;; +2235;BECAUSE;Sm;0;ON;;;;;N;;;;; +2236;RATIO;Sm;0;ON;;;;;N;;;;; +2237;PROPORTION;Sm;0;ON;;;;;N;;;;; +2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; +2239;EXCESS;Sm;0;ON;;;;;Y;;;;; +223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; +223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; +223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; +223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; +223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; +2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; +2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; +2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; +2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; +2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; +2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; +224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; +224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; +224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; +2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; +2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; +2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; +2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; +2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; +2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; +2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; +2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; +225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; +225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; +225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; +225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; +225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; +225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; +2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; +2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; +2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; +2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; +2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; +2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; +2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; +2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; +2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; +226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; +226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; +226C;BETWEEN;Sm;0;ON;;;;;N;;;;; +226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; +226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; +226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; +2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; +2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; +2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; +2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; +2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; +2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; +2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; +2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; +2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; +2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; +227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; +227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; +2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; +2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; +2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; +2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; +2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; +2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; +2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; +228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; +228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; +228C;MULTISET;Sm;0;ON;;;;;Y;;;;; +228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; +228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; +228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; +2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; +2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; +2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; +2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; +2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; +2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; +229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; +229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; +229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; +229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; +229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; +22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; +22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; +22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; +22A5;UP TACK;Sm;0;ON;;;;;N;;;;; +22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; +22A7;MODELS;Sm;0;ON;;;;;Y;;;;; +22A8;TRUE;Sm;0;ON;;;;;Y;;;;; +22A9;FORCES;Sm;0;ON;;;;;Y;;;;; +22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; +22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; +22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; +22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; +22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; +22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; +22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; +22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; +22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; +22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; +22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; +22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; +22BB;XOR;Sm;0;ON;;;;;N;;;;; +22BC;NAND;Sm;0;ON;;;;;N;;;;; +22BD;NOR;Sm;0;ON;;;;;N;;;;; +22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; +22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; +22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; +22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; +22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; +22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; +22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; +22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; +22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; +22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; +22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; +22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; +22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; +22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; +22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; +22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; +22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; +22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; +22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; +22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; +22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; +22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; +22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; +22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; +22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; +22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; +22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; +22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; +22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; +22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; +22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; +22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; +22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; +22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; +22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; +22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; +22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; +22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; +22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; +22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; +22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; +2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; +2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; +2302;HOUSE;So;0;ON;;;;;N;;;;; +2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; +2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; +2305;PROJECTIVE;So;0;ON;;;;;N;;;;; +2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; +2307;WAVY LINE;So;0;ON;;;;;N;;;;; +2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; +2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; +230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; +230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; +230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; +230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; +230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; +230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; +2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; +2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; +2312;ARC;So;0;ON;;;;;N;;;;; +2313;SEGMENT;So;0;ON;;;;;N;;;;; +2314;SECTOR;So;0;ON;;;;;N;;;;; +2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; +2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; +2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; +2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; +231A;WATCH;So;0;ON;;;;;N;;;;; +231B;HOURGLASS;So;0;ON;;;;;N;;;;; +231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; +231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; +231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; +231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; +2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2322;FROWN;So;0;ON;;;;;N;;;;; +2323;SMILE;So;0;ON;;;;;N;;;;; +2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; +2325;OPTION KEY;So;0;ON;;;;;N;;;;; +2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; +2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; +2328;KEYBOARD;So;0;ON;;;;;N;;;;; +2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; +232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; +232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; +232C;BENZENE RING;So;0;ON;;;;;N;;;;; +232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; +232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; +232F;SYMMETRY;So;0;ON;;;;;N;;;;; +2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; +2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; +2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; +2333;SLOPE;So;0;ON;;;;;N;;;;; +2334;COUNTERBORE;So;0;ON;;;;;N;;;;; +2335;COUNTERSINK;So;0;ON;;;;;N;;;;; +2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; +2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; +2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; +2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; +233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; +233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; +233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; +233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; +233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; +233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; +2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; +2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; +2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; +2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; +2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; +2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; +2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; +2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; +2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; +2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; +234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; +234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; +234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; +234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; +234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; +234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; +2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; +2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; +2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; +2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; +2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; +2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; +2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; +2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; +2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; +2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; +235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; +235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; +235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; +235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; +235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; +235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; +2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; +2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; +2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; +2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; +2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; +2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; +2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; +2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; +2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; +2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; +236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; +236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; +236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; +236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; +236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; +236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; +2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; +2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; +2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; +2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; +2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; +2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; +2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; +2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; +2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; +2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; +237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; +237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; +237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; +237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; +237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; +237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; +2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; +2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; +2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; +2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; +2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; +2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; +2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; +2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; +238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; +238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; +238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; +238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; +238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; +238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; +2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; +2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; +2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; +2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; +2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; +2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; +2398;NEXT PAGE;So;0;ON;;;;;N;;;;; +2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; +239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; +239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; +23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; +23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; +23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; +23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; +23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; +23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; +23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; +23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; +23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; +23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; +23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; +23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; +23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; +23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; +23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; +23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; +23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; +23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; +23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; +23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; +23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; +23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; +23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; +23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; +23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; +23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; +23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; +23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; +23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; +23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; +23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; +23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; +23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; +23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; +23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; +23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; +23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; +23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; +23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; +23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; +23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; +23DB;FUSE;So;0;ON;;;;;N;;;;; +23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; +23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; +23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; +23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; +23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; +23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; +23E5;FLATNESS;So;0;ON;;;;;N;;;;; +23E6;AC CURRENT;So;0;ON;;;;;N;;;;; +23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; +23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; +23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; +23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; +23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; +23F1;STOPWATCH;So;0;ON;;;;;N;;;;; +23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; +23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; +23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; +23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; +23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; +2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; +2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; +2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; +2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; +2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; +2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; +2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; +2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; +2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; +2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; +240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; +240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; +240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; +240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; +240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; +240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; +2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; +2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; +2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; +2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; +2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; +2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; +2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; +2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; +2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; +2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; +241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; +241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; +241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; +241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; +241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; +241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; +2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; +2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; +2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; +2423;OPEN BOX;So;0;ON;;;;;N;;;;; +2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; +2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; +2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; +2440;OCR HOOK;So;0;ON;;;;;N;;;;; +2441;OCR CHAIR;So;0;ON;;;;;N;;;;; +2442;OCR FORK;So;0;ON;;;;;N;;;;; +2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; +2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; +2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; +2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; +2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; +2448;OCR DASH;So;0;ON;;;;;N;;;;; +2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; +244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; +2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; +2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; +2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; +2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; +2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; +2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; +2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; +2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; +2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; +2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; +246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; +246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; +246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; +246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; +246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; +246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; +2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; +2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; +2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; +2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; +2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; +2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; +2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; +2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; +2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; +2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; +247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; +247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; +247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; +247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; +247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; +247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; +2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; +2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; +2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; +2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; +2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; +2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; +2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; +2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; +2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; +2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; +248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; +248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; +248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; +248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; +248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; +248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; +2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; +2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; +2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; +2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; +2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; +2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; +2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; +2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; +2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; +2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; +249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; +249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; +249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; +249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; +249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; +249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; +24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; +24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; +24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; +24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; +24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; +24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; +24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; +24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; +24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; +24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; +24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; +24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; +24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; +24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; +24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; +24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; +24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; +24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; +24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; +24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; +24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; +24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; +24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; +24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; +24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; +24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; +24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; +24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; +24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; +24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; +24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; +24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; +24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; +24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; +24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; +24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; +24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; +24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; +24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; +24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; +24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; +24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; +24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; +24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; +24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; +24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; +24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; +24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; +24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 +24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 +24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 +24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 +24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA +24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB +24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC +24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD +24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE +24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF +24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 +24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 +24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 +24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 +24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 +24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 +24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 +24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 +24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 +24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 +24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA +24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB +24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC +24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD +24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE +24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF +24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; +24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; +24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; +24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; +24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; +24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; +24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; +24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; +24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; +24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; +24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; +24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; +24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; +24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; +24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; +24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; +24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; +24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; +24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; +24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; +24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; +2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; +2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; +2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; +2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; +2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; +2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; +2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; +2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; +2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; +2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; +250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; +250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; +250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; +250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; +250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; +250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; +2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; +2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; +2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; +2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; +2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; +2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; +2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; +2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; +2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; +2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; +251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; +251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; +251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; +251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; +251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; +251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; +2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; +2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; +2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; +2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; +2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; +2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; +2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; +2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; +2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; +2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; +252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; +252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; +252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; +252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; +252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; +252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; +2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; +2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; +2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; +2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; +2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; +2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; +2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; +2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; +2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; +2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; +253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; +253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; +253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; +253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; +253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; +253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; +2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; +2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; +2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; +2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; +2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; +2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; +2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; +2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; +2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; +2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; +254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; +254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; +254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; +254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; +254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; +254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; +2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; +2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; +2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; +2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; +2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; +2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; +2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; +2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; +2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; +2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; +255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; +255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; +255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; +255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; +255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; +255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; +2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; +2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; +2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; +2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; +2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; +2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; +2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; +2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; +2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; +2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; +256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; +256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; +256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; +256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; +256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; +256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; +2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; +2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; +2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; +2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; +2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; +2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; +2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; +2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; +2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; +2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; +257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; +257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; +257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; +257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; +257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; +257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; +2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; +2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; +2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; +2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +2588;FULL BLOCK;So;0;ON;;;;;N;;;;; +2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; +258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; +258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; +258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; +258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; +2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; +2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; +2593;DARK SHADE;So;0;ON;;;;;N;;;;; +2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; +2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; +2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; +2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; +2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; +259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; +259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; +25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; +25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; +25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; +25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; +25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; +25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; +25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; +25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; +25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; +25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; +25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; +25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; +25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; +25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; +25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; +25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; +25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; +25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; +25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; +25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; +25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; +25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; +25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; +25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; +25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; +25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; +25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; +25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; +25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; +25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; +25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; +25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; +25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; +25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +25C9;FISHEYE;So;0;ON;;;;;N;;;;; +25CA;LOZENGE;So;0;ON;;;;;N;;;;; +25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; +25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; +25CE;BULLSEYE;So;0;ON;;;;;N;;;;; +25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; +25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; +25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; +25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; +25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; +25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; +25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; +25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; +25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; +25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; +25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; +25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; +25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; +25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; +25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; +25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; +25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; +25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; +25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; +25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; +2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; +2601;CLOUD;So;0;ON;;;;;N;;;;; +2602;UMBRELLA;So;0;ON;;;;;N;;;;; +2603;SNOWMAN;So;0;ON;;;;;N;;;;; +2604;COMET;So;0;ON;;;;;N;;;;; +2605;BLACK STAR;So;0;ON;;;;;N;;;;; +2606;WHITE STAR;So;0;ON;;;;;N;;;;; +2607;LIGHTNING;So;0;ON;;;;;N;;;;; +2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; +2609;SUN;So;0;ON;;;;;N;;;;; +260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; +260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; +260C;CONJUNCTION;So;0;ON;;;;;N;;;;; +260D;OPPOSITION;So;0;ON;;;;;N;;;;; +260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; +260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; +2610;BALLOT BOX;So;0;ON;;;;;N;;;;; +2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; +2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; +2613;SALTIRE;So;0;ON;;;;;N;;;;; +2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; +2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; +2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +2618;SHAMROCK;So;0;ON;;;;;N;;;;; +2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; +2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; +2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; +2624;CADUCEUS;So;0;ON;;;;;N;;;;; +2625;ANKH;So;0;ON;;;;;N;;;;; +2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; +2627;CHI RHO;So;0;ON;;;;;N;;;;; +2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; +2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; +262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; +262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; +262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; +262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; +262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; +262F;YIN YANG;So;0;ON;;;;;N;;;;; +2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; +2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; +2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; +2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; +2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; +2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; +2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; +2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; +2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; +263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; +263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; +263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; +263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; +263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; +263F;MERCURY;So;0;ON;;;;;N;;;;; +2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; +2641;EARTH;So;0;ON;;;;;N;;;;; +2642;MALE SIGN;So;0;ON;;;;;N;;;;; +2643;JUPITER;So;0;ON;;;;;N;;;;; +2644;SATURN;So;0;ON;;;;;N;;;;; +2645;URANUS;So;0;ON;;;;;N;;;;; +2646;NEPTUNE;So;0;ON;;;;;N;;;;; +2647;PLUTO;So;0;ON;;;;;N;;;;; +2648;ARIES;So;0;ON;;;;;N;;;;; +2649;TAURUS;So;0;ON;;;;;N;;;;; +264A;GEMINI;So;0;ON;;;;;N;;;;; +264B;CANCER;So;0;ON;;;;;N;;;;; +264C;LEO;So;0;ON;;;;;N;;;;; +264D;VIRGO;So;0;ON;;;;;N;;;;; +264E;LIBRA;So;0;ON;;;;;N;;;;; +264F;SCORPIUS;So;0;ON;;;;;N;;;;; +2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; +2651;CAPRICORN;So;0;ON;;;;;N;;;;; +2652;AQUARIUS;So;0;ON;;;;;N;;;;; +2653;PISCES;So;0;ON;;;;;N;;;;; +2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; +2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; +2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; +2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; +2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; +2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; +265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; +265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; +265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; +265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; +265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; +265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; +2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; +2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; +2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; +2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; +2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; +2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; +2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; +2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; +2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; +266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; +266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; +266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; +266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; +266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; +266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; +2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; +2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; +2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; +2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; +2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; +2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; +2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; +2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; +267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; +267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; +267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; +267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; +267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; +2680;DIE FACE-1;So;0;ON;;;;;N;;;;; +2681;DIE FACE-2;So;0;ON;;;;;N;;;;; +2682;DIE FACE-3;So;0;ON;;;;;N;;;;; +2683;DIE FACE-4;So;0;ON;;;;;N;;;;; +2684;DIE FACE-5;So;0;ON;;;;;N;;;;; +2685;DIE FACE-6;So;0;ON;;;;;N;;;;; +2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; +2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; +2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; +2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; +268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; +268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; +268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; +268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; +268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; +268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; +2690;WHITE FLAG;So;0;ON;;;;;N;;;;; +2691;BLACK FLAG;So;0;ON;;;;;N;;;;; +2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; +2693;ANCHOR;So;0;ON;;;;;N;;;;; +2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; +2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; +2696;SCALES;So;0;ON;;;;;N;;;;; +2697;ALEMBIC;So;0;ON;;;;;N;;;;; +2698;FLOWER;So;0;ON;;;;;N;;;;; +2699;GEAR;So;0;ON;;;;;N;;;;; +269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; +269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; +269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; +269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; +269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; +26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; +26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; +26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; +26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; +26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; +26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; +26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; +26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; +26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; +26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; +26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; +26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; +26B0;COFFIN;So;0;ON;;;;;N;;;;; +26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; +26B2;NEUTER;So;0;ON;;;;;N;;;;; +26B3;CERES;So;0;ON;;;;;N;;;;; +26B4;PALLAS;So;0;ON;;;;;N;;;;; +26B5;JUNO;So;0;ON;;;;;N;;;;; +26B6;VESTA;So;0;ON;;;;;N;;;;; +26B7;CHIRON;So;0;ON;;;;;N;;;;; +26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; +26B9;SEXTILE;So;0;ON;;;;;N;;;;; +26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; +26BB;QUINCUNX;So;0;ON;;;;;N;;;;; +26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; +26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; +26BE;BASEBALL;So;0;ON;;;;;N;;;;; +26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; +26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; +26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; +26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; +26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +26C6;RAIN;So;0;ON;;;;;N;;;;; +26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; +26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; +26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; +26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; +26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; +26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; +26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; +26CF;PICK;So;0;ON;;;;;N;;;;; +26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; +26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; +26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; +26D3;CHAINS;So;0;ON;;;;;N;;;;; +26D4;NO ENTRY;So;0;ON;;;;;N;;;;; +26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; +26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; +26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; +26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; +26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; +26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; +26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; +26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; +26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; +26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; +26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; +26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; +26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; +26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; +26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; +26EA;CHURCH;So;0;ON;;;;;N;;;;; +26EB;CASTLE;So;0;ON;;;;;N;;;;; +26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; +26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; +26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; +26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; +26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; +26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; +26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; +26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; +26F4;FERRY;So;0;ON;;;;;N;;;;; +26F5;SAILBOAT;So;0;ON;;;;;N;;;;; +26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; +26F7;SKIER;So;0;ON;;;;;N;;;;; +26F8;ICE SKATE;So;0;ON;;;;;N;;;;; +26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; +26FA;TENT;So;0;ON;;;;;N;;;;; +26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; +26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; +26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; +26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; +26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; +2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; +2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; +2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; +2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; +2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; +2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; +2708;AIRPLANE;So;0;ON;;;;;N;;;;; +2709;ENVELOPE;So;0;ON;;;;;N;;;;; +270A;RAISED FIST;So;0;ON;;;;;N;;;;; +270B;RAISED HAND;So;0;ON;;;;;N;;;;; +270C;VICTORY HAND;So;0;ON;;;;;N;;;;; +270D;WRITING HAND;So;0;ON;;;;;N;;;;; +270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +270F;PENCIL;So;0;ON;;;;;N;;;;; +2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; +2711;WHITE NIB;So;0;ON;;;;;N;;;;; +2712;BLACK NIB;So;0;ON;;;;;N;;;;; +2713;CHECK MARK;So;0;ON;;;;;N;;;;; +2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; +2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; +2717;BALLOT X;So;0;ON;;;;;N;;;;; +2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; +2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; +271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; +271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; +271D;LATIN CROSS;So;0;ON;;;;;N;;;;; +271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; +2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; +2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; +2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; +2728;SPARKLES;So;0;ON;;;;;N;;;;; +2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; +272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; +272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; +272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; +272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; +272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; +2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; +2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; +2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; +2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; +273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; +273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; +273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; +2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; +2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; +2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; +2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; +2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; +2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; +2747;SPARKLE;So;0;ON;;;;;N;;;;; +2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; +2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; +274C;CROSS MARK;So;0;ON;;;;;N;;;;; +274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; +274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; +2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; +2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; +2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; +2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; +275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; +275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; +2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; +2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; +2766;FLORAL HEART;So;0;ON;;;;;N;;;;; +2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; +2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; +276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; +2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; +2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; +2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; +2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; +2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; +277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; +277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; +277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; +277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; +277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; +277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; +2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; +2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; +2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; +2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; +2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; +2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; +2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; +2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; +278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; +278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; +278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; +278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; +278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; +278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; +2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; +2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; +2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; +2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; +2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; +2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; +2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; +2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; +2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; +2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; +279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; +279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; +279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; +279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; +279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; +279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; +27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; +27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; +27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; +27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; +27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; +27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; +27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; +27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; +27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; +27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; +27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; +27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; +27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; +27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; +27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; +27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; +27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; +27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; +27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; +27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; +27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; +27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; +27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; +27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; +27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; +27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; +27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; +27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; +27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; +27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; +27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; +27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; +27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; +27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; +27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; +27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; +27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; +27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; +27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; +27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; +27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; +27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; +27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; +27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; +27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; +27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; +27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; +27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; +27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; +27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; +27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; +27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; +27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; +27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; +27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; +27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; +27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; +27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; +27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; +2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; +2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; +2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; +2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; +2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; +2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; +2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; +2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; +2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; +280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; +280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; +280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; +280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; +280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; +280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; +2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; +2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; +2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; +2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; +2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; +2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; +2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; +2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; +2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; +2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; +281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; +281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; +281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; +281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; +281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; +281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; +2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; +2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; +2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; +2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; +2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; +2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; +2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; +2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; +2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; +2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; +282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; +282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; +282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; +282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; +282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; +282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; +2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; +2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; +2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; +2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; +2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; +2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; +2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; +2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; +2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; +2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; +283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; +283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; +283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; +283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; +283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; +283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; +2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; +2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; +2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; +2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; +2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; +2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; +2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; +2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; +2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; +2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; +284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; +284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; +284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; +284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; +284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; +284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; +2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; +2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; +2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; +2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; +2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; +2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; +2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; +2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; +2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; +2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; +285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; +285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; +285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; +285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; +285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; +285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; +2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; +2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; +2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; +2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; +2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; +2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; +2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; +2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; +2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; +2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; +286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; +286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; +286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; +286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; +286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; +286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; +2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; +2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; +2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; +2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; +2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; +2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; +2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; +2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; +2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; +2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; +287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; +287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; +287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; +287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; +287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; +287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; +2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; +2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; +2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; +2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; +2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; +2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; +2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; +2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; +2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; +2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; +288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; +288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; +288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; +288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; +288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; +288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; +2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; +2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; +2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; +2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; +2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; +2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; +2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; +2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; +2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; +2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; +289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; +289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; +289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; +289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; +289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; +289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; +28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; +28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; +28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; +28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; +28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; +28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; +28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; +28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; +28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; +28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; +28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; +28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; +28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; +28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; +28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; +28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; +28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; +28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; +28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; +28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; +28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; +28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; +28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; +28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; +28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; +28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; +28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; +28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; +28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; +28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; +28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; +28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; +28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; +28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; +28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; +28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; +28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; +28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; +28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; +28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; +28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; +28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; +28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; +28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; +28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; +28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; +28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; +28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; +28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; +28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; +28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; +28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; +28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; +28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; +28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; +28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; +28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; +28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; +28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; +28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; +28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; +28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; +28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; +28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; +28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; +28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; +28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; +28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; +28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; +28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; +28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; +28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; +28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; +28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; +28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; +28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; +28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; +28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; +28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; +28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; +28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; +28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; +28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; +28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; +28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; +28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; +28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; +28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; +28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; +28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; +28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; +28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; +28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; +28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; +28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; +28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; +2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; +290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; +2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; +291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; +2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; +292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; +2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; +2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; +2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; +2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; +2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; +2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; +293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; +293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; +2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; +2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; +2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; +294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; +2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; +2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; +2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; +2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; +2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; +2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; +295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; +295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; +295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; +2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; +2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; +2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; +296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; +296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; +296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; +2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; +2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; +2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; +297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; +297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; +297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; +2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; +2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; +2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; +2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; +2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; +2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; +2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; +2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; +298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; +298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; +298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; +298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; +298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; +298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; +2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; +2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; +2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; +2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; +2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; +2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; +2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; +2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; +299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; +299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; +299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; +299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; +299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; +29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; +29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; +29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; +29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; +29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; +29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; +29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; +29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; +29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; +29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; +29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; +29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; +29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; +29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; +29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; +29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; +29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; +29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; +29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; +29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; +29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; +29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; +29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; +29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; +29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; +29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; +29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; +29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; +29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; +29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; +29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; +29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; +29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; +29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; +29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; +29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; +29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; +29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; +29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; +29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; +29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; +29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; +29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; +29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; +29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; +29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; +29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; +29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; +29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; +29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; +29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; +29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; +29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; +29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; +29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; +29FE;TINY;Sm;0;ON;;;;;N;;;;; +29FF;MINY;Sm;0;ON;;;;;N;;;;; +2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; +2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; +2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; +2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; +2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; +2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; +2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; +2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; +2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; +2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON; 222B 222B 222B 222B;;;;Y;;;;; +2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; +2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; +2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; +2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; +2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; +2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; +2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; +2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; +2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; +2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; +2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; +2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; +2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2A1D;JOIN;Sm;0;ON;;;;;N;;;;; +2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; +2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; +2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; +2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; +2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; +2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; +2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; +2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; +2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; +2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; +2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; +2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; +2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; +2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; +2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; +2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; +2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; +2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; +2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; +2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; +2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; +2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; +2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; +2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; +2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; +2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; +2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; +2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; +2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; +2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; +2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; +2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; +2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; +2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; +2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; +2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; +2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; +2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; +2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; +2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; +2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; +2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; +2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2A74;DOUBLE COLON EQUAL;Sm;0;ON; 003A 003A 003D;;;;Y;;;;; +2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D;;;;N;;;;; +2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D 003D;;;;N;;;;; +2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; +2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; +2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; +2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; +2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; +2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; +2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; +2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; +2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; +2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; +2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; +2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; +2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; +2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; +2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; +2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; +2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; +2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; +2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; +2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; +2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; +2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; +2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; +2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; +2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; +2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; +2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; +2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; +2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; +2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; +2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; +2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; +2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; +2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; +2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; +2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; +2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; +2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; +2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; +2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; +2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; +2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; +2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; +2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; +2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; +2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; +2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; +2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; +2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; +2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; +2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; +2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; +2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; +2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; +2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; +2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; +2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; +2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; +2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; +2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; +2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; +2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; +2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; +2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; +2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; +2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; +2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; +2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; +2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; +2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; +2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; +2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; +2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; +2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; +2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; +2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; +2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; +2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; +2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; +2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; +2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; +2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; +2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; +2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; +2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; +2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; +2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; +2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; +2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; +2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; +2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; +2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; +2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; +2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; +2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; +2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; +2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; +2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; +2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; +2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; +2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; +2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; +2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; +2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; +2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; +2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; +2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; +2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; +2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; +2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; +2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; +2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; +2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; +2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; +2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; +2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; +2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; +2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; +2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; +2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; +2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; +2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; +2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; +2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; +2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; +2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; +2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; +2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; +2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; +2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; +2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; +2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; +2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; +2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; +2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; +2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; +2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; +2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; +2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; +2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; +2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; +2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; +2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; +2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; +2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; +2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; +2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; +2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; +2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; +2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; +2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; +2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; +2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; +2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; +2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; +2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; +2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; +2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; +2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; +2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; +2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; +2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; +2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; +2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; +2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; +2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; +2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; +2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; +2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; +2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; +2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; +2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; +2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; +2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; +2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; +2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; +2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; +2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; +2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; +2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; +2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; +2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; +2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; +2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; +2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; +2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; +2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; +2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; +2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; +2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; +2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; +2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; +2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; +2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; +2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; +2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; +2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; +2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 +2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 +2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 +2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 +2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 +2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 +2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 +2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 +2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 +2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 +2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A +2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B +2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C +2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D +2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E +2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F +2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 +2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 +2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 +2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 +2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 +2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 +2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 +2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 +2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 +2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 +2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A +2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B +2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C +2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D +2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E +2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F +2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 +2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 +2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 +2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 +2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 +2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 +2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 +2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 +2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 +2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 +2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A +2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B +2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C +2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D +2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E +2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; +2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 +2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; +2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; +2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; +2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A +2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E +2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; +2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 +2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; +2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 +2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; +2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B +2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; +2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; +2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; +2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; +2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; +2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; +2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 +2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; +2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; +2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 +2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; +2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; +2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; +2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; +2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; +2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L; 006A;;;;N;;;;; +2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L; 0056;;;;N;;;;; +2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; +2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; +2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; +2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 +2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; +2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 +2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; +2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 +2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; +2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 +2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; +2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 +2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; +2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A +2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; +2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C +2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; +2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E +2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; +2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 +2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; +2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 +2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; +2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 +2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; +2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 +2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; +2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 +2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; +2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A +2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; +2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C +2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; +2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E +2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; +2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 +2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; +2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 +2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; +2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 +2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; +2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 +2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; +2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 +2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; +2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA +2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; +2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC +2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; +2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE +2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; +2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 +2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; +2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 +2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; +2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 +2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; +2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 +2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; +2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 +2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; +2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA +2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; +2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC +2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; +2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE +2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; +2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 +2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; +2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 +2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; +2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 +2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; +2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 +2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; +2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 +2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; +2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA +2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; +2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC +2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; +2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE +2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; +2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 +2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; +2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 +2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; +2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 +2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; +2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 +2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; +2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 +2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; +2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA +2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; +2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC +2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; +2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE +2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; +2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 +2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; +2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 +2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; +2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; +2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; +2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; +2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; +2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; +2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; +2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; +2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB +2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; +2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED +2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; +2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; +2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; +2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; +2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 +2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; +2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; +2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; +2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; +2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; +2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; +2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 +2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 +2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 +2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 +2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 +2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 +2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 +2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 +2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 +2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 +2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA +2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB +2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC +2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD +2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE +2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF +2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 +2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 +2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 +2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 +2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 +2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 +2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 +2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 +2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 +2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 +2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA +2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB +2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC +2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD +2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE +2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF +2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 +2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 +2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 +2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 +2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 +2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 +2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 +2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD +2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; +2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; +2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; +2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; +2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; +2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; +2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; +2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; +2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; +2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; +2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; +2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; +2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; +2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; +2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; +2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; +2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; +2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; +2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; +2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; +2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; +2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; +2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; +2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; +2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; +2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; +2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; +2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; +2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; +2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; +2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; +2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; +2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; +2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; +2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; +2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; +2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; +2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; +2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; +2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; +2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; +2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; +2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; +2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; +2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; +2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; +2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; +2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; +2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; +2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; +2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; +2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; +2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; +2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; +2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; +2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; +2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L; 2D61;;;;N;;;;; +2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; +2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; +2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; +2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; +2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; +2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; +2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; +2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; +2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; +2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; +2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; +2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; +2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; +2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; +2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; +2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; +2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; +2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; +2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; +2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; +2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; +2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; +2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; +2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; +2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; +2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; +2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; +2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; +2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; +2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; +2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; +2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; +2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; +2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; +2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; +2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; +2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; +2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; +2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; +2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; +2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; +2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; +2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; +2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; +2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; +2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; +2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; +2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; +2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; +2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; +2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; +2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; +2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; +2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; +2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; +2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; +2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; +2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; +2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; +2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; +2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; +2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; +2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; +2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; +2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; +2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; +2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; +2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; +2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; +2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; +2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; +2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; +2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; +2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; +2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; +2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; +2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; +2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; +2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; +2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; +2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; +2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; +2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; +2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; +2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; +2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; +2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; +2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; +2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; +2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; +2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; +2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; +2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; +2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; +2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; +2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; +2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; +2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; +2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; +2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; +2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; +2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; +2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; +2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; +2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; +2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; +2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; +2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; +2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; +2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; +2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; +2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; +2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; +2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; +2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; +2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; +2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; +2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; +2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; +2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; +2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; +2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; +2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; +2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; +2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; +2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; +2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; +2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; +2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; +2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; +2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; +2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; +2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; +2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; +2E30;RING POINT;Po;0;ON;;;;;N;;;;; +2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; +2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; +2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; +2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; +2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; +2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; +2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; +2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; +2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; +2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; +2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; +2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; +2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; +2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; +2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; +2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; +2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; +2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; +2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; +2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; +2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; +2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; +2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; +2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; +2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; +2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; +2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; +2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; +2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; +2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; +2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; +2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; +2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; +2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; +2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; +2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; +2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; +2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; +2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; +2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; +2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; +2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; +2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; +2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; +2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; +2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; +2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; +2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; +2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; +2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; +2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; +2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; +2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; +2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; +2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; +2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; +2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; +2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; +2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; +2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; +2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; +2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; +2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; +2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; +2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; +2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; +2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; +2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; +2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; +2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; +2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; +2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; +2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; +2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; +2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; +2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; +2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; +2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; +2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; +2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; +2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; +2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; +2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; +2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; +2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; +2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; +2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; +2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; +2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; +2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; +2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; +2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; +2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; +2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; +2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; +2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; +2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; +2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; +2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; +2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; +2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; +2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; +2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; +2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; +2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; +2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; +2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; +2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; +2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; +2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; +2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; +2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; +2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; +2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; +2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; +2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; +2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; +2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; +2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; +2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; +2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; +2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; +2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; +2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; +2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; +2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; +2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; +2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; +2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; +2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; +2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; +2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; +2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; +2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; +2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; +2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; +2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; +2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; +2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; +2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; +2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; +2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; +2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; +2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; +2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; +2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; +2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; +2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; +2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; +2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; +2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; +2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; +2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; +2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; +2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; +2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; +2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; +2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; +2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; +2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; +2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; +2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; +2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; +2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; +2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; +2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; +2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; +2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; +2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; +2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; +2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; +2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; +2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; +2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; +2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; +2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; +2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; +2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; +2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; +2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; +2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; +2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; +2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; +2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; +2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; +2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; +2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; +2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; +2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; +2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; +2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; +2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; +2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; +2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; +2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; +2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; +2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; +2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; +2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; +2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; +2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; +2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; +2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; +2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; +2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; +2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; +2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; +2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; +2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; +2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; +2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; +2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; +2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; +2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; +2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; +2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; +2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; +2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; +2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; +2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; +2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; +2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; +2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; +2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; +2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; +2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; +2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; +2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; +2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; +2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; +2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; +2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; +2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; +2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; +2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; +2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; +2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; +2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; +2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; +2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; +2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; +2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; +2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; +2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; +2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; +2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; +2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; +2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; +2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; +2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; +2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; +2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; +2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; +2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; +2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; +2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; +2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; +2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; +2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; +2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; +2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; +2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; +2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; +2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; +2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; +2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; +2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; +2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; +2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; +2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; +2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; +2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; +2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; +2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; +2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; +2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; +2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; +2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; +2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; +2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; +2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; +2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; +2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; +2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; +2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; +2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; +2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; +2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; +2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; +2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; +2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; +2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; +2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; +2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; +2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; +2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; +2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; +2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; +2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; +2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; +2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; +2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; +2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; +2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; +2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; +2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; +2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; +2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; +2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; +2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; +2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; +2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; +2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; +2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; +2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; +2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; +2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; +2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; +2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; +2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; +2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; +2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; +2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; +2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; +2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; +2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; +2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; +2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; +2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; +2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; +2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; +2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; +2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; +2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; +2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; +2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; +2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; +2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; +2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; +2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; +2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; +2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; +2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; +2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; +2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; +2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; +2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; +2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; +2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; +2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; +2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; +2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; +2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; +3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; +3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; +3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; +3003;DITTO MARK;Po;0;ON;;;;;N;;;;; +3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; +3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; +3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; +3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; +3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; +300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; +300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; +300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; +300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; +300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; +300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; +3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; +3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; +3012;POSTAL MARK;So;0;ON;;;;;N;;;;; +3013;GETA MARK;So;0;ON;;;;;N;;;;; +3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; +3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; +3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; +3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; +3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; +3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; +301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; +301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; +301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; +301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; +301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; +3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; +3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; +3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; +3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; +3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; +3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; +3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; +3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; +3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; +3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; +302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; +302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; +302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; +302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; +302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; +3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; +3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; +3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; +3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; +3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; +3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; +3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; +3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; +3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; +303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; +303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; +303C;MASU MARK;Lo;0;L;;;;;N;;;;; +303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; +303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; +303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; +3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; +3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; +3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; +3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; +3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; +304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; +304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; +304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; +304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; +304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; +3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; +3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; +3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; +3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; +3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; +3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; +3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; +3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; +3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; +3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; +305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; +305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; +305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; +305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; +305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; +305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; +3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; +3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; +3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; +3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; +3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; +3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; +3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; +3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; +3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; +306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; +306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; +306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; +306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; +306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; +306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; +3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; +3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; +3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; +3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; +3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; +3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; +3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; +3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; +3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; +3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; +307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; +307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; +307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; +307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; +307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; +307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; +3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; +3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; +3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; +3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; +3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; +3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; +3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; +308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; +308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; +308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; +308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; +308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; +3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; +3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; +3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; +3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; +3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; +3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; +309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; +309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; +309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; +309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; +309F;HIRAGANA DIGRAPH YORI;Lo;0;L; 3088 308A;;;;N;;;;; +30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; +30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; +30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; +30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; +30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; +30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; +30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; +30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; +30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; +30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; +30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; +30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; +30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; +30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; +30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; +30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; +30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; +30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; +30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; +30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; +30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; +30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; +30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; +30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; +30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; +30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; +30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; +30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; +30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; +30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; +30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; +30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; +30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; +30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; +30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; +30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; +30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; +30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; +30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; +30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; +30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; +30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; +30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; +30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; +30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; +30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; +30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; +30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; +30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; +30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; +30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; +30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; +30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; +30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; +30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; +30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; +30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; +30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; +30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; +30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; +30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; +30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; +30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; +30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; +30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; +30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; +30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; +30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; +30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; +30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; +30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; +30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; +30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; +30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; +30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; +30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; +30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; +30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; +30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; +30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; +30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; +30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; +30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; +30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; +30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; +30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; +30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; +30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; +30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; +30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; +30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; +30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; +30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; +30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; +30FF;KATAKANA DIGRAPH KOTO;Lo;0;L; 30B3 30C8;;;;N;;;;; +3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; +3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; +3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; +3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; +3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; +310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; +310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; +310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; +310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; +310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; +310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; +3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; +3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; +3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; +3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; +3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; +3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; +3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; +3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; +3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; +3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; +311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; +311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; +311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; +311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; +311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; +311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; +3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; +3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; +3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; +3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; +3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; +3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; +3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; +3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; +3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; +3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; +312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; +312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; +312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; +312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; +3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; +3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; +3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; +3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; +3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; +3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; +3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; +3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; +3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; +313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; +313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; +313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; +313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; +313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; +313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; +3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; +3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; +3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; +3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; +3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; +3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; +3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; +3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; +3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; +3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; +314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; +314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; +314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; +314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; +314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; +314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; +3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; +3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; +3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; +3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; +3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; +3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; +3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; +3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; +3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; +3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; +315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; +315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; +315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; +315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; +315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; +315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; +3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; +3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; +3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; +3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; +3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; +3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; +3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; +3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; +3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; +3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; +316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; +316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; +316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; +316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; +316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; +316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; +3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; +3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; +3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; +3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; +3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; +3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; +3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; +3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; +3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; +3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; +317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; +317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; +317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; +317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; +317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; +317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; +3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; +3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; +3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; +3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; +3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; +3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; +3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; +3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; +3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; +3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; +318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; +318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; +318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; +318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; +318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; +3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; +3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; +3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;;;; +3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;;;; +3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;;;; +3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;;;; +3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;;;; +3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;;;; +3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;;;; +3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;;;; +319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;;;; +319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;;;; +319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;;;; +319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;;;; +319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;;;; +319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;;;; +31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; +31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; +31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; +31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; +31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; +31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; +31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; +31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; +31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; +31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; +31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; +31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; +31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; +31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; +31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; +31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; +31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; +31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; +31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; +31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; +31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; +31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; +31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; +31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; +31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; +31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; +31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; +31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; +31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; +31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; +31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; +31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; +31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; +31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; +31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; +31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; +31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; +31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; +31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; +31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; +31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; +31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; +31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; +31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; +31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; +31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; +31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; +31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; +31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; +31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; +31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; +31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; +31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; +31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; +31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; +31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; +31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; +31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; +31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; +31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; +31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; +31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; +31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; +31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; +31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; +31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; +31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; +31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; +31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; +31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; +31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; +31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; +31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; +31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; +31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; +31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; +31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; +31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; +31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; +3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; +3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; +3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; +3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; +3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; +3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; +3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; +3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; +3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; +3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; +320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; +320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; +320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; +320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; +320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; +320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; +3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; +3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; +3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; +3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; +3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; +3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; +3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; +3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; +3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; +3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; +321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; +321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; +321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; +321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON; 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; +321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON; 0028 110B 1169 1112 116E 0029;;;;N;;;;; +3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; +3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; +3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; +3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; +3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; +3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; +3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; +3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; +3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; +3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; +322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; +322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; +322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; +322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; +322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; +322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; +3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; +3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; +3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; +3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; +3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; +3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; +3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; +3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; +3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; +3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; +323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; +323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; +323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; +323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; +323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; +323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; +3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; +3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; +3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; +3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; +3244;CIRCLED IDEOGRAPH QUESTION;So;0;L; 554F;;;;N;;;;; +3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L; 5E7C;;;;N;;;;; +3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L; 6587;;;;N;;;;; +3247;CIRCLED IDEOGRAPH KOTO;So;0;L; 7B8F;;;;N;;;;; +3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; +3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; +324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; +324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; +324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; +324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; +324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; +324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; +3250;PARTNERSHIP SIGN;So;0;ON; 0050 0054 0045;;;;N;;;;; +3251;CIRCLED NUMBER TWENTY ONE;No;0;ON; 0032 0031;;;21;N;;;;; +3252;CIRCLED NUMBER TWENTY TWO;No;0;ON; 0032 0032;;;22;N;;;;; +3253;CIRCLED NUMBER TWENTY THREE;No;0;ON; 0032 0033;;;23;N;;;;; +3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON; 0032 0034;;;24;N;;;;; +3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON; 0032 0035;;;25;N;;;;; +3256;CIRCLED NUMBER TWENTY SIX;No;0;ON; 0032 0036;;;26;N;;;;; +3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON; 0032 0037;;;27;N;;;;; +3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON; 0032 0038;;;28;N;;;;; +3259;CIRCLED NUMBER TWENTY NINE;No;0;ON; 0032 0039;;;29;N;;;;; +325A;CIRCLED NUMBER THIRTY;No;0;ON; 0033 0030;;;30;N;;;;; +325B;CIRCLED NUMBER THIRTY ONE;No;0;ON; 0033 0031;;;31;N;;;;; +325C;CIRCLED NUMBER THIRTY TWO;No;0;ON; 0033 0032;;;32;N;;;;; +325D;CIRCLED NUMBER THIRTY THREE;No;0;ON; 0033 0033;;;33;N;;;;; +325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON; 0033 0034;;;34;N;;;;; +325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON; 0033 0035;;;35;N;;;;; +3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; +3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; +3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; +3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; +3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; +3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; +3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; +3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; +3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; +3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; +326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; +326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; +326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; +326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; +326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; +326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; +3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; +3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; +3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; +3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; +3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; +3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; +3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; +3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; +3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; +3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; +327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; +327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; +327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON; 110E 1161 11B7 1100 1169;;;;N;;;;; +327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON; 110C 116E 110B 1174;;;;N;;;;; +327E;CIRCLED HANGUL IEUNG U;So;0;ON; 110B 116E;;;;N;;;;; +327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; +3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; +3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; +3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; +3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; +3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; +3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; +3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; +3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; +3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; +3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; +328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; +328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; +328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; +328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; +328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; +328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; +3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; +3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; +3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; +3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; +3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; +3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; +3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; +3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; +3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; +3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; +329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; +329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; +329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; +329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; +329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; +329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; +32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; +32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; +32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; +32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; +32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; +32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; +32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; +32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; +32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; +32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; +32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; +32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; +32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; +32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; +32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; +32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; +32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; +32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON; 0033 0036;;;36;N;;;;; +32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON; 0033 0037;;;37;N;;;;; +32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON; 0033 0038;;;38;N;;;;; +32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON; 0033 0039;;;39;N;;;;; +32B5;CIRCLED NUMBER FORTY;No;0;ON; 0034 0030;;;40;N;;;;; +32B6;CIRCLED NUMBER FORTY ONE;No;0;ON; 0034 0031;;;41;N;;;;; +32B7;CIRCLED NUMBER FORTY TWO;No;0;ON; 0034 0032;;;42;N;;;;; +32B8;CIRCLED NUMBER FORTY THREE;No;0;ON; 0034 0033;;;43;N;;;;; +32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON; 0034 0034;;;44;N;;;;; +32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON; 0034 0035;;;45;N;;;;; +32BB;CIRCLED NUMBER FORTY SIX;No;0;ON; 0034 0036;;;46;N;;;;; +32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON; 0034 0037;;;47;N;;;;; +32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON; 0034 0038;;;48;N;;;;; +32BE;CIRCLED NUMBER FORTY NINE;No;0;ON; 0034 0039;;;49;N;;;;; +32BF;CIRCLED NUMBER FIFTY;No;0;ON; 0035 0030;;;50;N;;;;; +32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; +32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; +32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; +32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; +32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; +32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; +32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; +32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; +32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; +32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; +32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; +32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; +32CC;SQUARE HG;So;0;ON; 0048 0067;;;;N;;;;; +32CD;SQUARE ERG;So;0;ON; 0065 0072 0067;;;;N;;;;; +32CE;SQUARE EV;So;0;ON; 0065 0056;;;;N;;;;; +32CF;LIMITED LIABILITY SIGN;So;0;ON; 004C 0054 0044;;;;N;;;;; +32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; +32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; +32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; +32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; +32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; +32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; +32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; +32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; +32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; +32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; +32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; +32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; +32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; +32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; +32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; +32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; +32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; +32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; +32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; +32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; +32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; +32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; +32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; +32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; +32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; +32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; +32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; +32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; +32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; +32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; +32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; +32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; +32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; +32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; +32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; +32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; +32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; +32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; +32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; +32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; +32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; +32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; +32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; +32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; +32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; +32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; +3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; +3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; +3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; +3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; +3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; +3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; +3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; +3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; +3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; +3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; +330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; +330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; +330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; +330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; +330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; +330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; +3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; +3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; +3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; +3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; +3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; +3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; +3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; +3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; +3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; +3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; +331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; +331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; +331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; +331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; +331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; +331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; +3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; +3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; +3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; +3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; +3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; +3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; +3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; +3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; +3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; +3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; +332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; +332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; +332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; +332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; +332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; +332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; +3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; +3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; +3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; +3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; +3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; +3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; +3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; +3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; +3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; +3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; +333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; +333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; +333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; +333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; +333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; +333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; +3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; +3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; +3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; +3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; +3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; +3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; +3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; +3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; +3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; +3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; +334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; +334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; +334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; +334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; +334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; +334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; +3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; +3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; +3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; +3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; +3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; +3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; +3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; +3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; +3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; +3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; +335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; +335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; +335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; +335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; +335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; +335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; +3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; +3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; +3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; +3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; +3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; +3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; +3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; +3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; +3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; +3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; +336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; +336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; +336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; +336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; +336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; +336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; +3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; +3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; +3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; +3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; +3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; +3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; +3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; +3377;SQUARE DM;So;0;ON; 0064 006D;;;;N;;;;; +3378;SQUARE DM SQUARED;So;0;ON; 0064 006D 00B2;;;;N;;;;; +3379;SQUARE DM CUBED;So;0;ON; 0064 006D 00B3;;;;N;;;;; +337A;SQUARE IU;So;0;ON; 0049 0055;;;;N;;;;; +337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; +337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; +337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; +337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; +337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; +3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; +3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; +3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; +3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; +3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; +3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; +3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; +3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; +3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; +3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; +338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; +338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; +338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; +338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; +338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; +338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; +3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; +3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; +3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; +3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; +3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; +3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; +3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; +3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; +3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; +3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; +339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; +339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; +339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; +339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; +339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; +339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; +33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; +33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; +33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; +33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; +33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; +33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; +33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; +33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; +33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; +33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; +33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; +33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; +33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; +33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; +33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; +33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; +33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; +33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; +33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; +33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; +33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; +33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; +33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; +33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; +33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; +33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; +33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; +33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; +33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; +33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; +33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; +33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; +33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; +33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; +33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; +33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; +33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; +33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; +33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; +33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; +33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; +33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; +33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; +33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; +33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; +33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; +33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; +33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; +33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; +33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; +33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; +33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; +33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; +33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; +33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; +33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; +33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; +33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; +33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; +33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; +33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; +33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; +33DE;SQUARE V OVER M;So;0;ON; 0056 2215 006D;;;;N;;;;; +33DF;SQUARE A OVER M;So;0;ON; 0041 2215 006D;;;;N;;;;; +33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; +33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; +33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; +33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; +33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; +33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; +33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; +33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; +33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; +33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; +33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; +33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; +33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; +33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; +33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; +33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; +33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; +33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; +33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; +33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; +33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; +33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; +33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; +33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; +33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; +33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; +33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; +33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; +33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; +33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; +33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; +33FF;SQUARE GAL;So;0;ON; 0067 0061 006C;;;;N;;;;; +3400;;Lo;0;L;;;;;N;;;;; +4DB5;;Lo;0;L;;;;;N;;;;; +4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; +4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; +4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; +4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; +4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; +4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; +4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; +4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; +4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; +4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; +4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; +4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; +4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; +4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; +4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; +4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; +4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; +4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; +4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; +4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; +4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; +4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; +4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; +4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; +4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; +4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; +4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; +4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; +4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; +4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; +4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; +4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; +4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; +4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; +4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; +4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; +4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; +4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; +4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; +4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; +4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; +4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; +4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; +4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; +4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; +4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; +4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; +4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; +4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; +4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; +4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; +4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; +4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; +4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; +4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; +4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; +4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; +4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; +4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; +4E00;;Lo;0;L;;;;;N;;;;; +9FCC;;Lo;0;L;;;;;N;;;;; +A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; +A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; +A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; +A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; +A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; +A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; +A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; +A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; +A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; +A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; +A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; +A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; +A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; +A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; +A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; +A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; +A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; +A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; +A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; +A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; +A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; +A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; +A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; +A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; +A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; +A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; +A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; +A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; +A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; +A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; +A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; +A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; +A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; +A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; +A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; +A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; +A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; +A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; +A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; +A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; +A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; +A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; +A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; +A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; +A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; +A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; +A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; +A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; +A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; +A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; +A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; +A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; +A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; +A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; +A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; +A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; +A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; +A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; +A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; +A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; +A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; +A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; +A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; +A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; +A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; +A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; +A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; +A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; +A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; +A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; +A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; +A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; +A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; +A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; +A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; +A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; +A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; +A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; +A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; +A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; +A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; +A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; +A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; +A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; +A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; +A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; +A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; +A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; +A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; +A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; +A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; +A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; +A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; +A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; +A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; +A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; +A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; +A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; +A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; +A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; +A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; +A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; +A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; +A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; +A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; +A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; +A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; +A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; +A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; +A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; +A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; +A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; +A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; +A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; +A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; +A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; +A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; +A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; +A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; +A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; +A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; +A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; +A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; +A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; +A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; +A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; +A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; +A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; +A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; +A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; +A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; +A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; +A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; +A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; +A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; +A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; +A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; +A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; +A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; +A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; +A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; +A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; +A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; +A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; +A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; +A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; +A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; +A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; +A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; +A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; +A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; +A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; +A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; +A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; +A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; +A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; +A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; +A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; +A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; +A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; +A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; +A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; +A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; +A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; +A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; +A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; +A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; +A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; +A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; +A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; +A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; +A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; +A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; +A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; +A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; +A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; +A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; +A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; +A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; +A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; +A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; +A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; +A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; +A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; +A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; +A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; +A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; +A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; +A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; +A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; +A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; +A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; +A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; +A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; +A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; +A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; +A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; +A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; +A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; +A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; +A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; +A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; +A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; +A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; +A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; +A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; +A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; +A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; +A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; +A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; +A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; +A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; +A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; +A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; +A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; +A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; +A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; +A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; +A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; +A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; +A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; +A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; +A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; +A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; +A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; +A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; +A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; +A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; +A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; +A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; +A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; +A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; +A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; +A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; +A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; +A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; +A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; +A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; +A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; +A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; +A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; +A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; +A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; +A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; +A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; +A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; +A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; +A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; +A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; +A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; +A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; +A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; +A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; +A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; +A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; +A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; +A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; +A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; +A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; +A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; +A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; +A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; +A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; +A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; +A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; +A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; +A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; +A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; +A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; +A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; +A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; +A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; +A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; +A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; +A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; +A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; +A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; +A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; +A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; +A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; +A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; +A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; +A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; +A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; +A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; +A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; +A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; +A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; +A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; +A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; +A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; +A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; +A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; +A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; +A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; +A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; +A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; +A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; +A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; +A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; +A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; +A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; +A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; +A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; +A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; +A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; +A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; +A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; +A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; +A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; +A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; +A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; +A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; +A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; +A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; +A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; +A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; +A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; +A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; +A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; +A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; +A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; +A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; +A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; +A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; +A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; +A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; +A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; +A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; +A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; +A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; +A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; +A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; +A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; +A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; +A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; +A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; +A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; +A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; +A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; +A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; +A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; +A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; +A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; +A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; +A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; +A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; +A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; +A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; +A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; +A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; +A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; +A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; +A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; +A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; +A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; +A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; +A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; +A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; +A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; +A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; +A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; +A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; +A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; +A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; +A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; +A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; +A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; +A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; +A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; +A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; +A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; +A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; +A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; +A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; +A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; +A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; +A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; +A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; +A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; +A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; +A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; +A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; +A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; +A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; +A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; +A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; +A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; +A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; +A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; +A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; +A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; +A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; +A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; +A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; +A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; +A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; +A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; +A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; +A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; +A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; +A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; +A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; +A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; +A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; +A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; +A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; +A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; +A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; +A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; +A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; +A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; +A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; +A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; +A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; +A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; +A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; +A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; +A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; +A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; +A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; +A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; +A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; +A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; +A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; +A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; +A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; +A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; +A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; +A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; +A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; +A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; +A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; +A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; +A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; +A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; +A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; +A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; +A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; +A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; +A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; +A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; +A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; +A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; +A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; +A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; +A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; +A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; +A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; +A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; +A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; +A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; +A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; +A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; +A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; +A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; +A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; +A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; +A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; +A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; +A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; +A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; +A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; +A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; +A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; +A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; +A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; +A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; +A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; +A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; +A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; +A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; +A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; +A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; +A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; +A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; +A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; +A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; +A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; +A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; +A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; +A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; +A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; +A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; +A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; +A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; +A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; +A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; +A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; +A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; +A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; +A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; +A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; +A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; +A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; +A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; +A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; +A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; +A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; +A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; +A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; +A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; +A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; +A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; +A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; +A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; +A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; +A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; +A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; +A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; +A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; +A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; +A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; +A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; +A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; +A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; +A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; +A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; +A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; +A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; +A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; +A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; +A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; +A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; +A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; +A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; +A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; +A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; +A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; +A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; +A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; +A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; +A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; +A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; +A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; +A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; +A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; +A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; +A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; +A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; +A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; +A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; +A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; +A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; +A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; +A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; +A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; +A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; +A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; +A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; +A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; +A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; +A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; +A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; +A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; +A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; +A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; +A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; +A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; +A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; +A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; +A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; +A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; +A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; +A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; +A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; +A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; +A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; +A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; +A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; +A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; +A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; +A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; +A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; +A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; +A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; +A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; +A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; +A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; +A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; +A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; +A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; +A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; +A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; +A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; +A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; +A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; +A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; +A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; +A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; +A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; +A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; +A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; +A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; +A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; +A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; +A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; +A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; +A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; +A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; +A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; +A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; +A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; +A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; +A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; +A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; +A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; +A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; +A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; +A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; +A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; +A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; +A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; +A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; +A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; +A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; +A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; +A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; +A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; +A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; +A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; +A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; +A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; +A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; +A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; +A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; +A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; +A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; +A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; +A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; +A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; +A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; +A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; +A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; +A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; +A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; +A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; +A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; +A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; +A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; +A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; +A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; +A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; +A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; +A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; +A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; +A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; +A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; +A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; +A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; +A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; +A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; +A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; +A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; +A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; +A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; +A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; +A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; +A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; +A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; +A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; +A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; +A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; +A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; +A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; +A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; +A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; +A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; +A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; +A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; +A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; +A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; +A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; +A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; +A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; +A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; +A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; +A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; +A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; +A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; +A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; +A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; +A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; +A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; +A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; +A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; +A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; +A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; +A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; +A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; +A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; +A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; +A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; +A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; +A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; +A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; +A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; +A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; +A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; +A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; +A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; +A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; +A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; +A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; +A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; +A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; +A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; +A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; +A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; +A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; +A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; +A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; +A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; +A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; +A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; +A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; +A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; +A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; +A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; +A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; +A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; +A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; +A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; +A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; +A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; +A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; +A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; +A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; +A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; +A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; +A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; +A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; +A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; +A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; +A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; +A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; +A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; +A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; +A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; +A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; +A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; +A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; +A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; +A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; +A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; +A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; +A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; +A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; +A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; +A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; +A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; +A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; +A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; +A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; +A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; +A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; +A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; +A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; +A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; +A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; +A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; +A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; +A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; +A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; +A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; +A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; +A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; +A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; +A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; +A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; +A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; +A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; +A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; +A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; +A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; +A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; +A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; +A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; +A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; +A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; +A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; +A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; +A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; +A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; +A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; +A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; +A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; +A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; +A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; +A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; +A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; +A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; +A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; +A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; +A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; +A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; +A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; +A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; +A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; +A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; +A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; +A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; +A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; +A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; +A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; +A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; +A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; +A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; +A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; +A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; +A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; +A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; +A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; +A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; +A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; +A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; +A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; +A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; +A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; +A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; +A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; +A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; +A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; +A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; +A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; +A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; +A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; +A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; +A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; +A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; +A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; +A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; +A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; +A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; +A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; +A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; +A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; +A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; +A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; +A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; +A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; +A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; +A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; +A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; +A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; +A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; +A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; +A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; +A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; +A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; +A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; +A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; +A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; +A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; +A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; +A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; +A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; +A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; +A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; +A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; +A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; +A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; +A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; +A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; +A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; +A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; +A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; +A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; +A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; +A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; +A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; +A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; +A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; +A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; +A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; +A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; +A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; +A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; +A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; +A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; +A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; +A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; +A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; +A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; +A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; +A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; +A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; +A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; +A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; +A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; +A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; +A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; +A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; +A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; +A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; +A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; +A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; +A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; +A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; +A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; +A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; +A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; +A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; +A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; +A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; +A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; +A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; +A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; +A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; +A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; +A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; +A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; +A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; +A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; +A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; +A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; +A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; +A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; +A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; +A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; +A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; +A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; +A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; +A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; +A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; +A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; +A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; +A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; +A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; +A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; +A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; +A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; +A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; +A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; +A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; +A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; +A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; +A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; +A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; +A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; +A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; +A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; +A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; +A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; +A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; +A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; +A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; +A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; +A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; +A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; +A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; +A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; +A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; +A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; +A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; +A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; +A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; +A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; +A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; +A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; +A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; +A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; +A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; +A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; +A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; +A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; +A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; +A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; +A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; +A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; +A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; +A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; +A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; +A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; +A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; +A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; +A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; +A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; +A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; +A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; +A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; +A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; +A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; +A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; +A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; +A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; +A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; +A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; +A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; +A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; +A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; +A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; +A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; +A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; +A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; +A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; +A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; +A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; +A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; +A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; +A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; +A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; +A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; +A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; +A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; +A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; +A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; +A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; +A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; +A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; +A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; +A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; +A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; +A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; +A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; +A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; +A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; +A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; +A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; +A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; +A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; +A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; +A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; +A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; +A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; +A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; +A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; +A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; +A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; +A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; +A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; +A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; +A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; +A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; +A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; +A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; +A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; +A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; +A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; +A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; +A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; +A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; +A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; +A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; +A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; +A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; +A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; +A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; +A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; +A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; +A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; +A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; +A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; +A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; +A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; +A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; +A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; +A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; +A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; +A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; +A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; +A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; +A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; +A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; +A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; +A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; +A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; +A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; +A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; +A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; +A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; +A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; +A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; +A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; +A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; +A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; +A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; +A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; +A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; +A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; +A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; +A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; +A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; +A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; +A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; +A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; +A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; +A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; +A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; +A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; +A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; +A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; +A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; +A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; +A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; +A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; +A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; +A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; +A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; +A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; +A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; +A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; +A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; +A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; +A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; +A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; +A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; +A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; +A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; +A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; +A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; +A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; +A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; +A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; +A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; +A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; +A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; +A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; +A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; +A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; +A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; +A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; +A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; +A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; +A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; +A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; +A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; +A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; +A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; +A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; +A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; +A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; +A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; +A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; +A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; +A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; +A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; +A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; +A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; +A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; +A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; +A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; +A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; +A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; +A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; +A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; +A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; +A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; +A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; +A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; +A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; +A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; +A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; +A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; +A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; +A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; +A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; +A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; +A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; +A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; +A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; +A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; +A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; +A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; +A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; +A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; +A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; +A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; +A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; +A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; +A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; +A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; +A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; +A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; +A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; +A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; +A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; +A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; +A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; +A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; +A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; +A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; +A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; +A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; +A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; +A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; +A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; +A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; +A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; +A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; +A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; +A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; +A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; +A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; +A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; +A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; +A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; +A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; +A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; +A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; +A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; +A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; +A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; +A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; +A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; +A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; +A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; +A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; +A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; +A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; +A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; +A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; +A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; +A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; +A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; +A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; +A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; +A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; +A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; +A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; +A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; +A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; +A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; +A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; +A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; +A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; +A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; +A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; +A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; +A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; +A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; +A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; +A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; +A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; +A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; +A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; +A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; +A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; +A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; +A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; +A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; +A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; +A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; +A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; +A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; +A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; +A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; +A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; +A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; +A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; +A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; +A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; +A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; +A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; +A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; +A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; +A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; +A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; +A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; +A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; +A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; +A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; +A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; +A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; +A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; +A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; +A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; +A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; +A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; +A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; +A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; +A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; +A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; +A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; +A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; +A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; +A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; +A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; +A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; +A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; +A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; +A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; +A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; +A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; +A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; +A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; +A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; +A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; +A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; +A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; +A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; +A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; +A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; +A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; +A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; +A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; +A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; +A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; +A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; +A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; +A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; +A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; +A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; +A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; +A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; +A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; +A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; +A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; +A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; +A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; +A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; +A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; +A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; +A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; +A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; +A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; +A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; +A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; +A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; +A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; +A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; +A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; +A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; +A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; +A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; +A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; +A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; +A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; +A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; +A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; +A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; +A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; +A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; +A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; +A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; +A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; +A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; +A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; +A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; +A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; +A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; +A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; +A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; +A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; +A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; +A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; +A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; +A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; +A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; +A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; +A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; +A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; +A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; +A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; +A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; +A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; +A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; +A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; +A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; +A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; +A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; +A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; +A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; +A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; +A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; +A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; +A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; +A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; +A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; +A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; +A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; +A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; +A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; +A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; +A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; +A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; +A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; +A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; +A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; +A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; +A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; +A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; +A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; +A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; +A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; +A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; +A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; +A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; +A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; +A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; +A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; +A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; +A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; +A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; +A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; +A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; +A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; +A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; +A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; +A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; +A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; +A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; +A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; +A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; +A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; +A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; +A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; +A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; +A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; +A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; +A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; +A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; +A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; +A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; +A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; +A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; +A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; +A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; +A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; +A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; +A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; +A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; +A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; +A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; +A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; +A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; +A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; +A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; +A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; +A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; +A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; +A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; +A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; +A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; +A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; +A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; +A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; +A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; +A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; +A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; +A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; +A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; +A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; +A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; +A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; +A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; +A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; +A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; +A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 +A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; +A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 +A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; +A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 +A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; +A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 +A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; +A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 +A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; +A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A +A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; +A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C +A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; +A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E +A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; +A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 +A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; +A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 +A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; +A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 +A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; +A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 +A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; +A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 +A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; +A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A +A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; +A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C +A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; +A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E +A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; +A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 +A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; +A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 +A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; +A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 +A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; +A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 +A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; +A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 +A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; +A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A +A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; +A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C +A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; +A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; +A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; +A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; +A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; +A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; +A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; +A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; +A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; +A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; +A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; +A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; +A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; +A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; +A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; +A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; +A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; +A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 +A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; +A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 +A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; +A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 +A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; +A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 +A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; +A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 +A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; +A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A +A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; +A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C +A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; +A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E +A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; +A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 +A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; +A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 +A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; +A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 +A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; +A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 +A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; +A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 +A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; +A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A +A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; +A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; +A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; +A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; +A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; +A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; +A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; +A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; +A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; +A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; +A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; +A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; +A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; +A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; +A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; +A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; +A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; +A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; +A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; +A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; +A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; +A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; +A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; +A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; +A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; +A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; +A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; +A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; +A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; +A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; +A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; +A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; +A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; +A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; +A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; +A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; +A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; +A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; +A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; +A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; +A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; +A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; +A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; +A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; +A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; +A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; +A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; +A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; +A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; +A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; +A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; +A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; +A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; +A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; +A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; +A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; +A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; +A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; +A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; +A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; +A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; +A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; +A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; +A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; +A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; +A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; +A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; +A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; +A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; +A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; +A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; +A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; +A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; +A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; +A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; +A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; +A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; +A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; +A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; +A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; +A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; +A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; +A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; +A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; +A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; +A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; +A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; +A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; +A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; +A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; +A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; +A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; +A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; +A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; +A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; +A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; +A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; +A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; +A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; +A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; +A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; +A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; +A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; +A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; +A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; +A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; +A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; +A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; +A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; +A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; +A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; +A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 +A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; +A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 +A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; +A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 +A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; +A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 +A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; +A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A +A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; +A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C +A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; +A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E +A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; +A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; +A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; +A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 +A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; +A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 +A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; +A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 +A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; +A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 +A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; +A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A +A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; +A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C +A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; +A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E +A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; +A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 +A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; +A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 +A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; +A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 +A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; +A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 +A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; +A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 +A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; +A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A +A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; +A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C +A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; +A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E +A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; +A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 +A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; +A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 +A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; +A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 +A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; +A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 +A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; +A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 +A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; +A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A +A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; +A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C +A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; +A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E +A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; +A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 +A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; +A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 +A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; +A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 +A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; +A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 +A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; +A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 +A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; +A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A +A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; +A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C +A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; +A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E +A770;MODIFIER LETTER US;Lm;0;L; A76F;;;;N;;;;; +A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; +A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; +A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; +A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; +A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; +A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; +A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; +A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; +A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; +A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 +A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; +A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B +A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; +A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; +A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E +A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; +A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 +A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; +A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 +A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; +A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 +A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; +A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 +A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; +A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; +A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; +A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; +A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B +A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; +A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; +A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 +A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; +A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 +A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; +A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; +A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 +A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; +A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 +A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; +A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A +A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; +A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C +A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; +A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E +A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; +A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 +A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; +A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 +A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; +A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 +A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; +A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 +A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; +A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 +A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; +A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; +A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; +A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; +A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; +A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; +A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; +A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; +A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; +A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; +A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; +A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; +A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; +A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; +A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; +A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; +A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; +A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; +A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; +A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; +A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; +A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; +A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; +A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; +A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; +A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; +A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; +A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; +A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; +A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; +A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; +A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; +A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; +A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; +A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; +A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; +A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; +A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; +A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; +A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; +A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; +A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; +A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; +A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; +A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; +A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; +A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; +A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; +A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; +A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; +A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; +A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; +A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; +A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; +A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; +A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; +A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; +A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; +A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; +A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; +A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; +A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; +A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; +A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; +A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; +A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; +A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; +A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; +A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; +A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; +A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; +A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; +A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; +A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; +A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; +A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; +A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; +A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; +A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; +A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; +A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; +A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; +A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; +A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; +A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; +A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; +A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; +A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; +A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; +A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; +A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; +A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; +A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; +A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; +A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; +A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; +A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; +A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; +A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; +A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; +A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; +A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; +A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; +A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; +A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; +A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; +A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; +A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; +A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; +A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; +A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; +A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; +A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; +A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; +A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; +A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; +A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; +A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; +A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; +A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; +A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; +A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; +A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; +A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; +A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; +A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; +A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; +A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; +A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; +A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; +A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; +A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; +A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; +A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; +A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; +A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; +A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; +A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; +A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; +A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; +A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; +A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; +A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; +A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; +A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; +A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; +A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; +A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; +A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; +A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; +A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; +A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; +A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; +A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; +A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; +A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; +A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; +A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; +A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; +A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; +A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; +A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; +A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; +A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; +A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; +A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; +A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; +A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; +A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; +A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; +A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; +A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; +A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; +A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; +A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; +A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; +A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; +A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; +A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; +A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; +A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; +A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; +A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; +A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; +A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; +A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; +A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; +A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; +A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; +A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; +A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; +A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; +A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; +A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; +A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; +A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; +A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; +A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; +A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; +A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; +A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; +A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; +A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; +A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; +A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; +A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; +A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; +A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; +A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; +A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; +A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; +A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; +A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; +A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; +A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; +A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; +A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; +A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; +A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; +A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; +A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; +A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; +A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; +A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; +A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; +A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; +A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; +A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; +A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; +A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; +A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; +A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; +A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; +A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; +A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; +A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; +A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; +A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; +A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; +A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; +A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; +A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; +A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; +A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; +A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; +A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; +A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; +A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; +A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; +A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; +A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; +A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; +A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; +A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; +A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; +A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; +A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; +A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; +A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; +A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; +A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; +A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; +A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; +A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; +A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; +A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; +A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; +A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; +A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; +A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; +A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; +A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; +A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; +A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; +A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; +A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; +A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; +A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; +A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; +A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; +A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; +A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; +A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; +A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; +A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; +A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; +A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; +A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; +A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; +A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; +A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; +A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; +A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; +A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; +A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; +A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; +A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; +A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; +A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; +A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; +A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; +A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; +A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; +A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; +A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; +A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; +A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; +A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; +A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; +A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; +A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; +A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; +A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; +A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; +A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; +A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; +A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; +A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; +A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; +A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; +A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; +A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; +A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; +A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; +A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; +A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; +A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; +A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; +A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; +A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; +A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; +A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; +A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; +A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; +A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; +A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; +A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; +A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; +A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; +A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; +A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; +A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; +A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; +A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; +A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; +A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; +A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; +A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; +A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; +A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; +A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; +A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; +A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; +A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; +A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; +A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; +A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; +A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; +A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; +A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; +A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; +A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; +A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; +A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; +A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; +AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; +AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; +AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; +AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; +AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; +AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; +AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; +AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; +AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; +AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; +AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; +AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; +AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; +AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; +AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; +AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; +AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; +AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; +AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; +AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; +AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; +AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; +AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; +AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; +AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; +AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; +AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; +AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; +AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; +AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; +AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; +AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; +AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; +AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; +AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; +AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; +AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; +AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; +AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; +AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; +AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; +AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; +AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; +AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; +AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; +AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; +AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; +AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; +AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; +AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; +AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; +AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; +AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; +AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; +AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; +AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; +AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; +AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; +AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; +AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; +AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; +AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; +AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; +AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; +AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; +AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; +AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; +AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; +AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; +AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; +AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; +AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; +AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; +AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; +AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; +AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; +AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; +AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; +AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; +AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; +AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; +AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; +AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; +AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; +AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; +AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; +AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; +AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; +AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; +AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; +AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; +AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; +AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; +AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; +AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; +AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; +AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; +AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; +AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; +AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; +AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; +AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; +AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; +AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; +AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; +AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; +AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; +AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; +AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; +AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; +AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; +AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; +AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; +AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; +AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; +AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; +AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; +AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; +AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; +AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; +AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; +AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; +AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; +AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; +AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; +AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; +AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; +AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; +AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; +AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; +AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; +AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; +AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; +AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; +AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; +AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; +AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; +AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; +AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; +AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; +AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; +AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; +AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; +AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; +AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; +AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; +AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; +AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; +AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; +AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; +AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; +AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; +AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; +AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; +AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; +AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; +AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; +AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; +AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; +AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; +AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; +AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; +AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; +AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; +AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; +AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; +AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; +AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; +AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; +AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; +AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; +AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; +AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; +AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; +AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; +AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; +AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; +AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; +AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; +AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; +AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; +AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; +AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; +AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; +AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; +AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; +AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; +AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; +AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; +AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; +AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; +AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; +AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; +AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; +AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; +AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; +AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; +AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; +AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; +AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; +AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; +AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; +AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; +AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; +AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; +AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; +AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; +AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; +AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; +AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; +AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; +AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; +AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; +AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; +AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; +AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; +AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; +AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; +AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; +AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; +AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; +AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; +AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; +AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; +AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; +AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; +AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; +AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; +AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; +AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; +AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; +AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; +AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; +AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;;; +AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; +AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; +AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; +AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; +AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; +AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; +AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; +AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; +AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; +AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; +AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; +AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; +ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; +ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; +ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; +ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; +ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; +ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; +ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; +ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; +ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; +ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; +ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; +ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; +ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; +ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; +ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; +ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; +ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; +ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; +ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; +ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; +ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; +ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; +ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; +ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; +ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; +ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; +ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; +ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; +ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; +ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; +ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; +ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; +ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; +ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; +ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; +ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; +ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; +ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; +ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; +ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; +ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; +ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; +ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; +ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; +ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; +ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +AC00;;Lo;0;L;;;;;N;;;;; +D7A3;;Lo;0;L;;;;;N;;;;; +D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; +D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; +D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; +D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; +D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; +D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; +D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; +D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; +D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; +D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; +D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; +D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; +D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; +D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; +D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; +D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; +D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; +D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; +D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; +D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; +D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; +D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; +D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; +D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; +D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; +D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; +D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; +D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; +D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; +D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; +D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; +D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; +D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; +D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; +D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; +D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; +D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; +D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; +D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; +D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; +D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; +D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; +D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; +D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; +D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; +D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; +D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; +D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; +D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; +D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; +D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; +D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; +D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; +D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; +D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; +D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; +D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; +D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; +D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; +D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; +D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; +D800;;Cs;0;L;;;;;N;;;;; +DB7F;;Cs;0;L;;;;;N;;;;; +DB80;;Cs;0;L;;;;;N;;;;; +DBFF;;Cs;0;L;;;;;N;;;;; +DC00;;Cs;0;L;;;;;N;;;;; +DFFF;;Cs;0;L;;;;;N;;;;; +E000;;Co;0;L;;;;;N;;;;; +F8FF;;Co;0;L;;;;;N;;;;; +F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; +F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; +F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; +F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; +F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; +F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; +F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; +F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; +F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; +F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; +F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; +F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; +F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; +F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; +F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; +F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; +F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; +F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; +F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; +F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; +F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; +F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; +F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; +F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; +F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; +F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; +F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; +F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; +F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; +F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; +F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; +F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; +F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; +F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; +F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; +F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; +F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; +F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; +F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; +F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; +F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; +F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; +F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; +F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; +F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; +F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; +F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; +F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; +F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; +F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; +F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; +F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; +F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; +F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; +F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; +F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; +F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; +F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; +F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; +F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; +F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; +F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; +F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; +F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; +F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; +F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; +F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; +F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; +F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; +F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; +F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; +F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; +F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; +F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; +F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; +F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; +F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; +F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; +F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; +F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; +F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; +F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; +F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; +F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; +F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; +F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; +F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; +F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; +F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; +F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; +F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; +F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; +F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; +F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; +F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; +F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; +F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; +F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; +F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; +F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; +F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; +F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; +F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; +F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; +F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; +F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; +F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; +F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; +F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; +F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; +F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; +F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; +F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; +F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; +F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; +F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; +F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; +F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; +F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; +F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; +F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; +F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; +F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; +F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; +F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; +F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; +F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; +F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; +F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; +F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; +F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; +F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; +F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; +F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; +F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; +F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; +F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; +F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; +F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; +F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; +F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; +F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; +F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; +F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; +F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; +F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; +F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; +F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; +F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; +F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; +F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; +F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; +F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; +F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; +F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; +F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; +F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; +F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; +F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; +F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; +F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; +F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; +F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; +F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; +F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; +F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; +F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; +F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; +F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; +F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; +F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; +F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; +F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; +F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; +F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; +F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; +F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; +F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; +F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; +F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; +F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; +F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; +F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; +F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; +F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; +F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; +F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; +F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; +F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; +F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; +F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; +F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; +F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; +F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; +F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; +F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; +F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; +F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; +F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; +F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; +F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; +F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; +F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; +F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; +F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; +F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; +F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; +F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; +F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; +F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; +F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; +F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; +F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; +F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; +F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; +F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; +F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; +F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; +F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; +F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; +F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; +F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; +F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; +F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; +F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; +F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; +F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; +F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; +F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; +F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; +F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; +F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; +F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; +F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; +F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; +F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; +F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; +F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; +F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; +F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; +F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; +F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; +F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; +F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; +F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; +F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; +F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; +F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; +F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; +F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; +F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; +F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; +F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; +F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; +F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; +F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; +FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; +FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; +FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; +FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; +FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; +FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; +FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; +FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; +FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; +FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; +FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; +FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; +FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; +FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; +FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; +FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; +FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; +FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; +FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; +FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; +FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; +FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; +FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; +FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; +FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; +FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; +FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; +FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; +FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; +FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; +FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; +FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; +FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; +FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; +FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; +FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; +FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; +FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; +FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; +FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; +FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; +FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; +FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; +FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; +FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; +FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; +FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; +FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; +FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; +FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; +FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; +FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; +FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; +FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; +FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; +FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; +FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; +FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; +FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; +FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; +FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; +FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; +FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; +FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; +FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; +FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; +FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; +FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; +FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; +FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; +FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; +FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; +FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; +FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; +FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; +FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; +FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; +FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; +FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; +FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; +FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; +FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; +FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; +FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; +FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; +FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; +FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; +FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; +FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; +FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; +FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; +FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; +FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; +FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; +FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; +FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; +FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; +FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; +FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; +FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; +FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; +FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; +FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; +FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; +FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; +FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; +FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; +FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; +FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; +FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; +FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; +FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; +FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; +FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; +FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; +FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; +FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; +FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; +FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; +FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; +FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; +FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; +FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; +FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; +FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; +FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; +FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; +FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; +FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; +FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; +FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; +FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; +FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; +FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; +FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; +FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; +FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; +FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; +FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; +FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; +FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; +FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; +FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; +FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; +FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; +FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; +FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; +FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; +FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; +FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; +FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; +FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; +FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; +FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; +FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; +FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; +FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; +FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; +FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; +FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; +FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; +FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; +FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; +FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; +FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; +FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; +FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; +FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; +FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; +FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; +FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; +FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; +FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; +FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; +FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; +FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; +FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; +FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; +FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; +FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; +FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; +FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; +FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; +FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; +FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; +FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; +FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; +FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; +FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; +FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; +FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; +FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; +FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; +FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; +FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; +FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; +FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; +FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; +FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; +FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; +FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; +FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; +FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; +FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; +FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; +FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; +FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; +FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; +FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; +FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; +FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; +FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; +FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; +FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; +FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; +FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; +FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; +FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; +FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; +FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; +FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; +FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; +FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; +FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; +FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; +FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; +FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; +FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; +FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; +FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; +FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; +FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; +FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; +FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; +FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; +FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; +FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; +FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; +FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; +FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; +FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; +FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; +FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; +FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; +FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; +FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; +FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; +FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; +FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; +FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; +FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; +FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; +FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; +FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; +FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; +FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; +FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; +FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; +FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; +FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; +FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; +FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; +FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; +FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; +FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; +FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; +FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; +FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; +FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; +FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; +FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; +FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; +FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; +FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; +FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; +FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; +FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; +FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; +FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; +FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; +FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; +FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; +FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; +FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; +FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; +FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; +FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; +FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; +FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; +FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; +FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; +FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; +FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; +FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; +FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; +FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; +FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; +FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; +FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; +FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; +FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; +FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; +FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; +FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; +FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; +FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; +FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; +FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; +FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; +FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; +FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; +FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; +FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; +FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; +FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; +FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; +FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; +FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; +FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; +FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; +FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; +FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; +FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; +FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; +FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; +FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; +FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; +FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; +FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; +FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; +FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; +FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; +FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; +FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; +FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; +FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; +FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; +FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; +FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; +FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; +FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; +FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; +FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; +FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; +FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; +FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; +FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; +FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; +FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; +FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; +FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; +FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; +FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; +FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; +FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; +FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; +FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; +FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; +FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; +FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; +FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; +FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; +FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; +FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; +FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; +FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; +FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; +FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; +FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; +FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; +FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; +FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; +FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; +FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; +FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; +FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; +FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; +FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; +FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; +FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; +FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; +FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; +FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; +FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; +FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; +FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; +FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; +FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; +FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; +FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; +FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; +FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; +FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; +FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; +FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; +FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; +FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; +FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; +FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; +FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; +FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; +FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; +FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; +FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; +FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; +FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; +FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; +FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; +FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; +FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; +FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; +FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; +FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; +FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; +FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; +FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; +FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; +FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; +FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; +FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; +FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; +FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; +FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; +FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; +FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; +FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; +FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; +FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; +FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; +FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; +FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; +FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; +FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; +FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; +FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; +FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; +FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; +FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; +FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; +FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; +FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; +FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; +FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; +FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; +FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; +FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; +FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; +FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; +FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; +FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; +FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; +FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; +FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; +FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; +FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; +FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; +FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; +FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; +FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; +FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; +FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; +FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; +FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; +FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; +FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; +FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; +FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; +FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; +FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; +FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; +FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; +FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; +FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; +FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; +FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; +FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; +FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; +FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; +FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; +FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; +FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; +FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; +FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; +FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; +FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; +FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; +FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; +FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; +FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; +FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; +FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; +FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; +FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; +FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; +FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; +FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; +FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; +FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; +FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; +FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; +FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; +FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; +FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; +FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; +FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; +FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; +FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; +FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; +FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; +FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; +FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; +FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; +FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; +FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; +FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; +FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; +FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; +FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; +FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; +FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; +FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; +FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; +FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; +FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; +FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; +FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; +FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; +FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; +FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; +FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; +FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; +FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; +FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; +FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; +FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; +FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; +FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; +FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; +FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; +FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; +FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; +FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; +FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; +FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; +FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; +FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; +FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; +FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; +FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; +FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; +FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; +FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; +FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; +FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; +FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; +FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; +FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; +FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; +FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; +FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; +FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; +FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; +FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; +FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; +FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; +FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; +FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; +FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; +FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; +FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; +FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; +FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; +FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; +FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; +FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; +FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; +FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; +FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; +FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; +FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; +FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; +FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; +FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; +FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; +FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; +FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; +FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; +FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; +FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; +FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; +FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; +FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; +FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; +FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; +FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; +FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; +FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; +FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; +FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; +FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; +FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; +FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; +FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; +FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; +FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; +FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; +FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; +FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; +FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; +FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; +FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; +FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; +FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; +FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; +FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; +FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; +FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; +FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; +FDFC;RIAL SIGN;Sc;0;AL; 0631 06CC 0627 0644;;;;N;;;;; +FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; +FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; +FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; +FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; +FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; +FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; +FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; +FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; +FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; +FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; +FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; +FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; +FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; +FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; +FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; +FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; +FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; +FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON; 002C;;;;N;;;;; +FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;;;;; +FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON; 003A;;;;N;;;;; +FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON; 3016;;;;N;;;;; +FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON; 3017;;;;N;;;;; +FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON; 2026;;;;N;;;;; +FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; +FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; +FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; +FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; +FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; +FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; +FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; +FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; +FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; +FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; +FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; +FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; +FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; +FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; +FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; +FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; +FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; +FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; +FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; +FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; +FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; +FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; +FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; +FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; +FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; +FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; +FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;;;;; +FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;;;;; +FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; +FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; +FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; +FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; +FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; +FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; +FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; +FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; +FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; +FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; +FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; +FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; +FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; +FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; +FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; +FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; +FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; +FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FE62;SMALL PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FE63;SMALL HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; +FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; +FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; +FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; +FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; +FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; +FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; +FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; +FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; +FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; +FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; +FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; +FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; +FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; +FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; +FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; +FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; +FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; +FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; +FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; +FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; +FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; +FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; +FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; +FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; +FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; +FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; +FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; +FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; +FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; +FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; +FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; +FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; +FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; +FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; +FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; +FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; +FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; +FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; +FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; +FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; +FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; +FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; +FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; +FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; +FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; +FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; +FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; +FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; +FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; +FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; +FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; +FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; +FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; +FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; +FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; +FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; +FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; +FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; +FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; +FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; +FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; +FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; +FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; +FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; +FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; +FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; +FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; +FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; +FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; +FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; +FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; +FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; +FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; +FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; +FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; +FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; +FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; +FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; +FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; +FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; +FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; +FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; +FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; +FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; +FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; +FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; +FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; +FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; +FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; +FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; +FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; +FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; +FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; +FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; +FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; +FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; +FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; +FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; +FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; +FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; +FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; +FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; +FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; +FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; +FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; +FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; +FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; +FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; +FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; +FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; +FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; +FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; +FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; +FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; +FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; +FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; +FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; +FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; +FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; +FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; +FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; +FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; +FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; +FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; +FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; +FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; +FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; +FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; +FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; +FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; +FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; +FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; +FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; +FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; +FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; +FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; +FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; +FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; +FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; +FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; +FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; +FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; +FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; +FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; +FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; +FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; +FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; +FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; +FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; +FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; +FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; +FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; +FF0F;FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; +FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; +FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; +FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; +FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; +FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; +FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; +FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; +FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; +FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; +FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; +FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; +FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; +FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; +FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; +FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; +FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; +FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; +FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; +FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; +FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; +FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; +FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; +FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; +FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; +FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; +FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; +FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; +FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; +FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; +FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; +FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; +FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; +FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; +FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; +FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; +FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; +FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; +FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; +FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; +FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 +FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 +FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 +FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 +FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 +FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 +FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 +FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 +FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 +FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A +FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B +FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C +FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D +FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E +FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F +FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 +FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 +FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 +FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 +FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 +FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 +FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 +FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 +FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 +FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 +FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A +FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; +FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; +FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; +FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; +FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON; 2985;;;;Y;;;;; +FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON; 2986;;;;Y;;;;; +FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; +FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; +FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; +FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; +FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON; 30FB;;;;N;;;;; +FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; +FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; +FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; +FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; +FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; +FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; +FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; +FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; +FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; +FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; +FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; +FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; +FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; +FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; +FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; +FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; +FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; +FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; +FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; +FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; +FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; +FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; +FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; +FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; +FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; +FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; +FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; +FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; +FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; +FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; +FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; +FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; +FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; +FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; +FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; +FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; +FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; +FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; +FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; +FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; +FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; +FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; +FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; +FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; +FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; +FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; +FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; +FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; +FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; +FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; +FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; +FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; +FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; +FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; +FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; +FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; +FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; +FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; +FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; +FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; +FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; +FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; +FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; +FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; +FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; +FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; +FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; +FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; +FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; +FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; +FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; +FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; +FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; +FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; +FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; +FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; +FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; +FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; +FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; +FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; +FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; +FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; +FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; +FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; +FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; +FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; +FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; +FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; +FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; +FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; +FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; +FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; +FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; +FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; +FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; +FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; +FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; +FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; +FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; +FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; +FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; +FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; +FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; +FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; +FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; +FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; +FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; +FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; +FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; +FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; +FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; +FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; +FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; +FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; +FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; +FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; +FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; +FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; +FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; +FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; +FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; +FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; +FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; +FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; +FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; +FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; +FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; +FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; +10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; +10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; +10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; +10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; +10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; +10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; +10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; +10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; +10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; +10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; +1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; +1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; +1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; +1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; +1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; +10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; +10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; +10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; +10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; +10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; +10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; +10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; +10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; +10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; +10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; +1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; +1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; +1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; +1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; +1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; +1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; +10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; +10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; +10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; +10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; +10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; +10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; +10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; +10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; +10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; +1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; +1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; +1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; +1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; +1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; +1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; +10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; +10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; +10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; +10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; +10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; +10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; +10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; +10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; +10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; +10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; +1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; +1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; +1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; +1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; +10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; +10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; +10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; +10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; +10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; +10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; +10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; +10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; +10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; +10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; +1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; +1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; +1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; +1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; +10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; +10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; +10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; +10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; +10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; +10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; +10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; +10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; +10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; +10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; +1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; +1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; +1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; +1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; +10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; +10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; +10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; +10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; +10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; +10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; +10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; +10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; +10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; +10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; +1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; +1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; +1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; +1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; +1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; +1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; +10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; +10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; +10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; +10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; +10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; +10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; +10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; +10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; +10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; +10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; +1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; +1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; +1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; +1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; +1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; +1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; +100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; +100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; +100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; +100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; +100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; +100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; +100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; +100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; +100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; +100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; +100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; +100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; +100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; +100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; +100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; +100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; +100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; +100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; +100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; +100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; +100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; +100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; +100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; +100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; +100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; +100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; +100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; +100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; +100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; +100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; +100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; +100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; +100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; +100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; +100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; +100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; +100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; +100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; +100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; +100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; +100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; +100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; +100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; +100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; +100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; +100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; +100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; +100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; +100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; +100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; +100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; +100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; +100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; +100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; +100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; +100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; +100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; +100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; +100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; +100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; +100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; +100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; +100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; +100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; +100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; +100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; +100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; +100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; +100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; +100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; +100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; +100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; +100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; +100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; +100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; +100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; +100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; +100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; +100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; +100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; +100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; +100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; +100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; +100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; +100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; +100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; +100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; +100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; +100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; +100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; +100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; +10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; +10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; +10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; +10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; +10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; +10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; +1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; +1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; +1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; +1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; +1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; +1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; +10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; +10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; +10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; +10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; +10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; +10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; +10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; +10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; +1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; +1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; +1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; +1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; +1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; +10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; +10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; +10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; +10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; +10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; +10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; +10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; +10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; +10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; +1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; +1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; +1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; +1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; +1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; +1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; +10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; +10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; +10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; +10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; +10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; +10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; +10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; +1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; +1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; +1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; +1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; +10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; +10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; +10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; +10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; +10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; +10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; +10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; +10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; +1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; +1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; +1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; +1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; +1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; +1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; +10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; +10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; +10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; +10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; +10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; +10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; +10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; +10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; +10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; +10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; +1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; +1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; +1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; +1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; +10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; +10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; +10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; +10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; +10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; +10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; +10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; +1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; +1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; +1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; +10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; +10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; +10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; +10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; +10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; +10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; +10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; +10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; +10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; +1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; +1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; +1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; +1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; +1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; +10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; +10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; +10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; +10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; +10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; +10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; +10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; +10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; +10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; +10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; +1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; +1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; +1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; +10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; +10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; +10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; +10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; +10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; +10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; +10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; +10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; +10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; +1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; +1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; +101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; +101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; +101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; +101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; +101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; +101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; +101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; +101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; +101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; +101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; +101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; +101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; +101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; +101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; +101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; +101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; +101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; +101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; +101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; +101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; +101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; +101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; +101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; +101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; +101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; +101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; +101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; +101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; +101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; +101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; +101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; +101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; +101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; +101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; +101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; +101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; +101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; +101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; +101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; +101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; +101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; +101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; +101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; +101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; +101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; +101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; +101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; +10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; +10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; +10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; +10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; +10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; +10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; +10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; +10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; +10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; +10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; +1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; +1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; +1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; +1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; +1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; +1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; +10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; +10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; +10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; +10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; +10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; +10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; +10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; +10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; +10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; +10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; +1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; +1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; +1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; +102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; +102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; +102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; +102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; +102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; +102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; +102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; +102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; +102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; +102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; +102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; +102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; +102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; +102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; +102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; +102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; +102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; +102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; +102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; +102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; +102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; +102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; +102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; +102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; +102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; +102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; +102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; +102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; +102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; +102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; +102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; +102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; +102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; +102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; +102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; +102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; +102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; +102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; +102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; +102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; +102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; +102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; +102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; +102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; +102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; +102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; +102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; +102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; +102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; +102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; +102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; +102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; +102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; +102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; +102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; +102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; +102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; +102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; +102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; +102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; +102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; +102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; +102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; +102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; +102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; +102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; +102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; +102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; +102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; +102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; +102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; +102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; +102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; +102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; +102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; +102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; +102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; +10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; +10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; +10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; +10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; +10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; +10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; +10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; +10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; +10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; +10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; +1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; +1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; +1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; +1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; +1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; +1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; +10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; +10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; +10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; +10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; +10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; +10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; +10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; +10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; +10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; +10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; +1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; +1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; +1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; +1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; +1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; +1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; +10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; +10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; +10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; +10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; +10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; +10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; +10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; +10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; +10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; +10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; +10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; +10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; +10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; +10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; +1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; +1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; +1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; +1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; +1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; +1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; +10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; +10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; +10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; +10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; +10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; +10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; +10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; +10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; +10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; +10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; +1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; +10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; +10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; +10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; +10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; +10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; +10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; +10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; +10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; +10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; +10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; +1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; +1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; +1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; +1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; +1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; +1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; +10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; +10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; +10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; +10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; +10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; +10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; +10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; +10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; +10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; +10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; +1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; +1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; +1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; +1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; +1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; +1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; +10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; +10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; +10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; +10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; +10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; +10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; +10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; +10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; +10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; +10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; +1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; +10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; +10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; +10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; +10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; +10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; +10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; +10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; +10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; +10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; +10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; +1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; +1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; +1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; +1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; +1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; +1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; +10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; +10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; +10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; +10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; +10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; +10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; +10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; +10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; +10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; +10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; +1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; +1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; +1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; +1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; +1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; +103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; +103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; +103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; +103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; +103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; +103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; +103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; +103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; +103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; +103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; +103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; +103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; +103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; +103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; +103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; +103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; +103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; +103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; +103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; +103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; +103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; +103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; +103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; +103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; +103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; +103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; +103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; +103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; +103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; +103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; +103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; +103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; +103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; +103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; +103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; +103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; +103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; +103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; +103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; +103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; +103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; +103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; +103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; +103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; +103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; +103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; +103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; +103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; +103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; +10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; +10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; +10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; +10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; +10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; +10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; +10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; +10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; +10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; +10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; +1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; +1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; +1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; +1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; +1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; +1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; +10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; +10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; +10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; +10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; +10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; +10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; +10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; +10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; +10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; +10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; +1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; +1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; +1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; +1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; +1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; +1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; +10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; +10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; +10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; +10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; +10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; +10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; +10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; +10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; +10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 +10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 +1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 +1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 +1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 +1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 +1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 +1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 +10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 +10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 +10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A +10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B +10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C +10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D +10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E +10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F +10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 +10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 +1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 +1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 +1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 +1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 +1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 +1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 +10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 +10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 +10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A +10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B +10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C +10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D +10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E +10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F +10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 +10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 +1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 +1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 +1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 +1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 +1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 +1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 +10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; +10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; +10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; +10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; +10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; +10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; +10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; +10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; +10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; +10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; +1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; +1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; +1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; +1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; +1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; +1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; +10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; +10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; +10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; +10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; +10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; +10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; +10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; +10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; +10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; +10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; +1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; +1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; +1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; +1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; +1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; +1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; +10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; +10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; +10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; +10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; +10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; +10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; +10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; +10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; +10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; +10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; +1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; +1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; +1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; +1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; +1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; +1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; +10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; +10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; +10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; +10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; +10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; +10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; +10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; +10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; +10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; +10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; +1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; +1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; +1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; +1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; +1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; +1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; +10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; +10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; +10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; +10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; +10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; +10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; +10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; +10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; +10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; +10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; +1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; +1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; +1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; +1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; +104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; +10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; +10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; +10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; +10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; +10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; +10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; +10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; +10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; +10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; +1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; +1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; +1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; +1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; +1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; +1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; +10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; +10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; +10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; +10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; +10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; +10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; +10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; +10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; +10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; +10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; +1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; +1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; +1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; +1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; +1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; +1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; +10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; +10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; +10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; +10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; +10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; +10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; +10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; +10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; +10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; +10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; +10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; +10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; +10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; +10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; +10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; +10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; +10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; +10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; +1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; +1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; +1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; +1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; +1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; +1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; +10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; +10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; +10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; +10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; +10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; +10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; +10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; +10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; +10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; +10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; +1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; +1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; +1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; +1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; +1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; +1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; +10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; +10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; +10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; +10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; +10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; +10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; +10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; +10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; +10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; +10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; +1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; +1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; +1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; +1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; +1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; +1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; +10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; +10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; +10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; +10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; +1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; +10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; +10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; +10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; +10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; +10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; +10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; +10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; +10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; +10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; +10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; +1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; +1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; +1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; +1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; +1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; +1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; +10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; +10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; +10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; +10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; +10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; +10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; +10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; +10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; +10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; +10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; +1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; +1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; +1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; +1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; +1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; +1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; +10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; +10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; +10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; +10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; +10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; +10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; +10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; +10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; +10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; +10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; +1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; +1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; +1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; +1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; +1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; +1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; +10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; +10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; +10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; +10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; +10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; +10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; +10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; +10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; +10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; +10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; +1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; +1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; +1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; +1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; +1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; +1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; +10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; +10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; +10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; +10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; +10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; +10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; +10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; +10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; +10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; +10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; +1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; +1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; +1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; +1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; +1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; +1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; +10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; +10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; +10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; +10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; +10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; +10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; +10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; +10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; +10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; +10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; +1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; +1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; +1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; +1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; +1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; +1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; +10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; +10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; +10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; +10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; +10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; +10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; +10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; +10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; +10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; +10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; +1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; +1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; +1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; +1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; +1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; +1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; +10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; +10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; +10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; +10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; +10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; +10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; +10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; +10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; +10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; +10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; +1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; +1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; +1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; +1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; +1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; +1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; +10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; +10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; +10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; +10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; +10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; +10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; +10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; +10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; +10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; +10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; +1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; +1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; +1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; +1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; +1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; +1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; +10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; +10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; +10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; +10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; +10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; +10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; +10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; +10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; +10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; +10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; +1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; +1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; +1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; +1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; +1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; +1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; +106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; +106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; +106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; +106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; +106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; +106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; +106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; +106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; +106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; +106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; +106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; +106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; +106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; +106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; +106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; +106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; +106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; +106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; +106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; +106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; +106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; +106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; +106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; +106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; +106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; +106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; +106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; +106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; +106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; +106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; +106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; +106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; +106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; +106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; +106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; +106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; +106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; +106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; +106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; +106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; +106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; +106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; +106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; +106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; +106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; +106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; +106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; +106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; +106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; +106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; +106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; +106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; +106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; +106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; +106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; +106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; +106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; +106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; +106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; +106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; +106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; +106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; +106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; +106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; +106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; +106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; +106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; +106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; +106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; +106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; +106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; +106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; +106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; +106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; +106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; +106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; +106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; +106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; +106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; +106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; +106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; +106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; +106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; +106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; +106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; +106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; +106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; +106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; +106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; +106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; +106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; +106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; +106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; +106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; +106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; +106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; +10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; +10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; +10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; +10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; +10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; +10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; +10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; +10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; +10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; +10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; +1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; +1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; +1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; +1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; +1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; +1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; +10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; +10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; +10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; +10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; +10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; +10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; +10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; +10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; +10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; +10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; +1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; +1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; +1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; +1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; +1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; +1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; +10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; +10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; +10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; +10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; +10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; +10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; +10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; +10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; +10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; +10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; +1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; +1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; +1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; +1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; +1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; +1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; +10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; +10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; +10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; +10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; +10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; +10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; +10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; +10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; +10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; +10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; +10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; +10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; +10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; +10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; +10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; +10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; +10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; +1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; +1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; +1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; +1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; +1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; +1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; +10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; +10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; +10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; +10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; +10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; +10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; +10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; +10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; +10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; +10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; +10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; +10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; +10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; +10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; +10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; +10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; +10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; +10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; +10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; +10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; +10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; +1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; +1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; +1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; +1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; +1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; +1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; +10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; +10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; +10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; +10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; +10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; +10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; +10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; +10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; +10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; +10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; +1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; +1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; +1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; +1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; +1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; +1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; +10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; +10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; +10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; +10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; +10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; +10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; +10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; +10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; +10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; +10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; +1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; +1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; +1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; +1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; +1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; +1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; +10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; +10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; +10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; +10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; +10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; +10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; +10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; +10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; +1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; +1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; +10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; +10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; +10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; +10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; +10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; +10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; +10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; +1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; +1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; +1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; +1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; +10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; +10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; +10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; +10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; +10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; +10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; +10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; +10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; +10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; +1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; +1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; +1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; +1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; +10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; +10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; +10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; +10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; +10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; +10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; +1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; +1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; +1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; +1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; +10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; +10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; +10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; +10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; +10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; +10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; +10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; +10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; +1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; +1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; +1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; +1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; +1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; +1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; +10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; +10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; +10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; +1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; +1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; +10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; +10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; +10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; +1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; +108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; +108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; +108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; +10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; +10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; +10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; +10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; +10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; +10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; +10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; +10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; +1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; +1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; +1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; +10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; +10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; +10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; +10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; +10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; +10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; +10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; +10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; +10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; +10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; +10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; +10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; +10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; +10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; +1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; +1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; +1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; +1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; +1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; +1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; +10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; +10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; +10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; +10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; +10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; +10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; +10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; +10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; +10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; +10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; +1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; +10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; +10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; +10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; +10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; +10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; +10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; +10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; +10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; +10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; +10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; +1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; +1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; +1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; +1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; +1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; +1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; +10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; +10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; +10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; +10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; +10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; +10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; +10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; +10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; +10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; +10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; +1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; +1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; +1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; +1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; +1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; +1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; +109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; +109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; +109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; +109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; +109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; +109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; +109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; +109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; +109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; +109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; +109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; +109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; +109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; +109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; +109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; +109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; +109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; +109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; +109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; +109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; +109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; +109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; +109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; +109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; +109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; +10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; +10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; +10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; +10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; +10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; +10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; +10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; +10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; +10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; +10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; +10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; +10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; +10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; +10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; +10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; +10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; +10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; +10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; +10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; +10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; +10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; +10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; +10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; +10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; +10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; +10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; +10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; +10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; +10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; +10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; +10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; +10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; +10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; +10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; +10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; +10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; +10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; +10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; +10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; +10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; +10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; +10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; +10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; +10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; +10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; +10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; +10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; +10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; +10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; +10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; +10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; +10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; +10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; +10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; +10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; +10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; +10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; +10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; +10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; +10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; +10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; +10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; +10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; +10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; +10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; +10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; +10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; +10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; +10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; +10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; +10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; +10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; +10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; +10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; +10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; +10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; +10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; +10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; +10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; +10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; +10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; +10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; +10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; +10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; +10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; +10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; +10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; +10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; +10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; +10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; +10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; +10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; +10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; +10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; +10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; +10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; +10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; +10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; +10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; +10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; +10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; +10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; +10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; +10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; +10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; +10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; +10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; +10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; +10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; +10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; +10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; +10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; +10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; +10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; +10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; +10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; +10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; +10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; +10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; +10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; +10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; +10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; +10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; +10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; +10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; +10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; +10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; +10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; +10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; +10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; +10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; +10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; +10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; +10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; +10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; +10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; +10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; +10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; +10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; +10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; +10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; +10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; +10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; +10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; +10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; +10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; +10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; +10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; +10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; +10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; +10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; +10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; +10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; +10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; +10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; +10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; +10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; +10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; +10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; +10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; +10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; +10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; +10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; +10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; +10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; +10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; +10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; +10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; +10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; +10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; +10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; +10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; +10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; +10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; +10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; +10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; +10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; +10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; +10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; +10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; +10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; +10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; +10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; +10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; +10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; +10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; +10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; +10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; +10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; +10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; +10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; +10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; +10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; +10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; +10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; +10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; +10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; +10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; +10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; +10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; +10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; +10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; +10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; +10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; +10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; +10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; +10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; +10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; +10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; +10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; +10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; +10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; +10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; +10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; +10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; +10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; +10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; +10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; +10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; +10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; +10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; +10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; +10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; +10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; +10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; +10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; +10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; +10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; +10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; +10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; +10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; +10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; +10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; +10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; +10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; +10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; +10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; +10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; +10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; +10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; +10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; +10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; +10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; +10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; +10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; +10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; +10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; +10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; +10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; +10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; +10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; +10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; +10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; +10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; +10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; +10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; +10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; +10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; +10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; +10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; +10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; +10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; +10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; +10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; +10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; +10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; +10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; +10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; +10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; +10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; +10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; +10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; +10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; +10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; +10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; +10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; +10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; +10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; +10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; +10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; +10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; +10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; +10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; +10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; +10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; +10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; +10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; +10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; +10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; +10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; +10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; +10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; +10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; +10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; +10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; +10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; +10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; +10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; +10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; +10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; +10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; +10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; +10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; +10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; +10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; +10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; +10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; +10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; +10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; +10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; +10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; +10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; +10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; +10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; +11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; +11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; +11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; +11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; +11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; +11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; +1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; +1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; +11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; +11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; +11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; +11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; +11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; +11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; +11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; +11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; +11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; +11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; +1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; +1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; +1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; +1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; +1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; +11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; +11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; +11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; +11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; +11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; +11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; +11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; +11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; +11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; +1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; +1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; +1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; +1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; +1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; +1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; +11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; +11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; +11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; +11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; +11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; +11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; +11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; +11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; +11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; +1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; +11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; +11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; +1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; +1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; +1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; +1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; +11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; +11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; +11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; +11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; +11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; +11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; +11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; +11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; +1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; +1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; +1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; +1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; +1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; +1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; +11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; +11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; +11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; +11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; +11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; +11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; +11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; +11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; +11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; +11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; +11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; +11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; +11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; +11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; +1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; +1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; +1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; +1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; +1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; +1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; +11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; +11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; +11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; +11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; +11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; +11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; +11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; +11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; +11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; +1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; +1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; +1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; +1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; +1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; +110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; +110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; +110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; +110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; +110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; +110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; +110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; +110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; +110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; +110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; +110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; +110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; +110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; +110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; +110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; +110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; +110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; +110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; +110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; +110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; +110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; +110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; +110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; +110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; +110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; +110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; +110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; +110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; +110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; +110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; +110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; +110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; +110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; +110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; +110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; +110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; +110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; +110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; +110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; +110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; +110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; +110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; +110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; +110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; +110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; +110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; +11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; +11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; +11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; +11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; +11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; +11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; +11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; +11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; +11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; +1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; +1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; +1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; +1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; +1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; +1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; +11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; +11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; +11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; +11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; +11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; +11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; +11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; +11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; +11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; +11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; +1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; +1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; +1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; +1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; +1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; +1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; +11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; +11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; +11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; +11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; +11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; +11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; +11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; +11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; +11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; +1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; +11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; +11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; +11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; +11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; +11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; +11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; +11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; +11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; +11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; +11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; +11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; +11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; +11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; +11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; +11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; +11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; +11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; +1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; +1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; +1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; +1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; +1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; +11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; +11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; +11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; +11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; +11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; +11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; +1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; +1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; +1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; +1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; +1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; +11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; +11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; +11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; +11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; +11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; +11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; +11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; +11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; +11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; +11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; +11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; +11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; +1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; +1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; +11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; +11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; +11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; +11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; +11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; +11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; +11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; +11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; +11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; +11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; +1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; +1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; +1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; +1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; +111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; +111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; +111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; +111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; +111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; +111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; +111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; +111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; +111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; +111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; +111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; +111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; +111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; +111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; +111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; +111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; +111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; +111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; +111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; +111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; +111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; +111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; +111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; +111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; +111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; +111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; +111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; +111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; +111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; +111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; +111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; +111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; +111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; +111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; +111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; +111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; +111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; +111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; +111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; +111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; +111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; +111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; +111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; +11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; +11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; +11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; +11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; +11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; +11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; +11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; +11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; +11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; +11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; +1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; +1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; +1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; +1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; +1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; +1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; +11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; +11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; +11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; +11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; +11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; +11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; +11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; +1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; +1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; +1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; +1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; +1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; +1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; +11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; +11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; +11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; +11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; +11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; +11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; +11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; +11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; +11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; +11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; +1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; +1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; +1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; +11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; +11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; +1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; +1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; +1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; +112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; +112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; +112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; +112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; +112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; +112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; +112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; +112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; +112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; +112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; +112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; +112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; +112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; +112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; +112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; +112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; +112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; +112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; +112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; +112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; +112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; +112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; +112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; +112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; +112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; +112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; +112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; +112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; +112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; +112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; +112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; +112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; +112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; +112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; +112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; +112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; +112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; +112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; +112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; +112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; +112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; +112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; +112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; +112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; +112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; +112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; +112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; +11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; +11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; +11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; +11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; +11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; +1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; +1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; +11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; +11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; +11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; +11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; +11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; +11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; +11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; +11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; +1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; +1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; +1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; +1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; +1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; +1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; +11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; +11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; +11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; +11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; +11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; +11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; +11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; +11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; +11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; +1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; +1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; +1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; +1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; +1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; +1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; +11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; +11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; +11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; +11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; +11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; +11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; +11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; +11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; +1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; +11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; +11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; +11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; +1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; +1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; +1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; +1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; +11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; +11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; +11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; +11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; +11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; +11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; +1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; +1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; +1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; +11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; +11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; +11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; +11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; +11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; +11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; +11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; +11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; +11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; +11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; +11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; +11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; +11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; +1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; +1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; +1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; +1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; +11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; +11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; +11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; +11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; +11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; +11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; +11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; +11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; +11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; +11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; +1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; +1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; +1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; +1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; +1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; +1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; +114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; +114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; +114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; +114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; +114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; +114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; +114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; +114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; +114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; +114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; +114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; +114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; +114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; +114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; +114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; +114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; +114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; +114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; +114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; +114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; +114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; +114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; +114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; +114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; +114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; +114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; +11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; +11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; +11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; +11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; +11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; +11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; +1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; +1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; +1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; +1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; +1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; +11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; +11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; +11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; +11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; +11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; +11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; +11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; +11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; +11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; +11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; +1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; +1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; +1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; +1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; +1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; +1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; +115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; +115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; +115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; +115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; +115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; +115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; +115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; +115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; +115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; +115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; +115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; +115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; +115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; +115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; +115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; +115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; +115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; +115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; +115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; +115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; +115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; +115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; +115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; +115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; +115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; +115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; +115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; +11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; +11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; +11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; +11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; +11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; +11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; +11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; +11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; +11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; +1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; +1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; +1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; +1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; +1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; +1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; +11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; +11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; +11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; +11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; +11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; +11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; +11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; +11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; +11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; +11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; +1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; +1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; +1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; +1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; +1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; +1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; +11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; +11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; +11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; +11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; +11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; +11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; +11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; +11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; +11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; +11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; +1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; +1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; +1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; +1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; +1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; +1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; +11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; +11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; +11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; +11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; +11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; +11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; +11641;MODI DANDA;Po;0;L;;;;;N;;;;; +11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; +11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; +11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; +11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; +11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; +11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; +11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; +11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; +11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; +11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; +11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; +11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; +1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; +1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; +1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; +1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; +1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; +1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; +11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; +11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; +11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; +11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; +11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; +11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; +11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; +11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; +1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; +1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; +1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; +1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; +1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; +1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; +116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; +116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; +116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; +116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; +116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; +116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; +116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; +116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; +116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; +116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; +116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; +116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; +116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; +116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; +116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; +116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; +116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; +118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; +118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; +118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; +118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; +118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; +118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; +118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; +118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; +118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; +118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; +118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; +118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; +118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; +118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; +118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; +118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; +118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; +118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; +118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; +118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; +118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; +118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; +118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; +118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; +118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; +118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; +118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; +118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; +118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; +118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; +118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; +118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 +118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 +118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 +118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 +118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 +118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 +118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 +118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 +118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 +118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 +118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA +118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB +118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC +118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD +118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE +118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF +118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 +118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 +118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 +118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 +118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 +118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 +118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 +118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 +118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 +118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 +118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA +118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB +118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC +118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD +118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE +118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF +118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; +118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; +118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; +118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; +118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; +118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; +118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; +118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; +118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; +118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; +11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; +11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; +11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; +11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; +11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; +11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; +11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; +11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; +11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; +11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; +11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; +11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; +11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; +11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; +11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; +11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; +11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; +11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; +11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; +11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; +11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; +11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; +11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; +11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; +11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; +11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; +11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; +11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; +11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; +11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; +11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; +11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; +11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; +11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; +11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; +11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; +11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; +11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; +11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; +11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; +11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; +11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; +11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; +11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; +11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; +11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; +11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; +11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; +11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; +11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; +12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; +12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; +12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; +12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; +12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; +12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; +12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; +12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; +12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; +1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; +1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; +1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; +1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; +12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; +12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; +12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; +12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; +12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; +12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; +1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; +1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; +1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; +1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; +12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; +12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; +12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; +12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; +12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; +12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; +12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; +12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; +12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; +12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; +1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; +1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; +1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; +1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; +1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; +1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; +12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; +12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; +12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; +12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; +12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; +12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; +12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; +12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; +12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; +12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; +1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; +1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; +1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; +1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; +12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; +12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; +12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; +12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; +12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; +12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; +12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; +12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; +12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; +12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; +1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; +1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; +1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; +1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; +1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; +12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; +12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; +12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; +12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; +12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; +12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; +12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; +12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; +12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; +12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; +1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; +1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; +1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; +1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; +1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; +12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; +12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; +12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; +12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; +12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; +12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; +12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; +12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; +12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; +12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; +1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; +1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; +1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; +1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; +12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; +12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; +12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; +12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; +12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; +12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; +12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; +12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; +12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; +1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; +1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; +1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; +1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; +1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; +1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; +12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; +12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; +12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; +12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; +12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; +12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; +12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; +12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; +12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; +1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; +1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; +1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; +1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; +1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; +12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; +12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; +12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; +12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; +12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; +12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; +12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; +12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; +12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; +12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; +1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; +1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; +1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; +1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; +1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; +120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; +120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; +120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; +120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; +120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; +120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; +120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; +120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; +120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; +120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; +120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; +120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; +120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; +120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; +120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; +120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; +120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; +120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; +120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; +120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; +120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; +120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; +120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; +120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; +120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; +120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; +120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; +120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; +120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; +120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; +120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; +120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; +120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; +120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; +120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; +120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; +120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; +120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; +120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; +120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; +120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; +120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; +120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; +120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; +120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; +120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; +120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; +120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; +120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; +120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; +120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; +120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; +120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; +120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; +120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; +120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; +120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; +120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; +120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; +120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; +120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; +120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; +120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; +120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; +120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; +120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; +120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; +120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; +120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; +120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; +120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; +120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; +120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; +120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; +120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; +120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; +12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; +12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; +12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; +12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; +12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; +12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; +12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; +12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; +12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; +12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; +1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; +1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; +1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; +1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; +1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; +12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; +12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; +12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; +12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; +12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; +12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; +12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; +12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; +1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; +1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; +1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; +1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; +12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; +12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; +12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; +12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; +12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; +12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; +12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; +12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; +12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; +12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; +1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; +1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; +1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; +1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; +1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; +1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; +12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; +12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; +12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; +12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; +12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; +12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; +12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; +12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; +1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; +1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; +1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; +1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; +12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; +12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; +12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; +12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; +12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; +12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; +12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; +12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; +12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; +12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; +1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; +1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; +1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; +1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; +1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; +12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; +12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; +12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; +12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; +12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; +12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; +12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; +12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; +12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; +12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; +1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; +1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; +1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; +1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; +1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; +1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; +12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; +12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; +12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; +12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; +12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; +12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; +12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; +12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; +1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; +1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; +1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; +1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; +1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; +12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; +12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; +12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; +12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; +12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; +12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; +12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; +12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; +12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; +12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; +1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; +1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; +1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; +1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; +1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; +1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; +12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; +12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; +12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; +12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; +12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; +12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; +12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; +12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; +12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; +12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; +1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; +1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; +1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; +1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; +1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; +12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; +12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; +12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; +12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; +12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; +12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; +12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; +12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; +12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; +1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; +1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; +1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; +1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; +121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; +121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; +121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; +121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; +121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; +121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; +121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; +121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; +121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; +121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; +121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; +121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; +121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; +121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; +121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; +121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; +121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; +121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; +121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; +121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; +121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; +121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; +121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; +121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; +121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; +121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; +121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; +121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; +121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; +121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; +121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; +121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; +121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; +121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; +121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; +121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; +121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; +121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; +121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; +121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; +121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; +121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; +121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; +121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; +121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; +121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; +121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; +121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; +121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; +121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; +121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; +121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; +121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; +121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; +121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; +121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; +121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; +121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; +121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; +121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; +121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; +121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; +121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; +121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; +121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; +121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; +121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; +121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; +121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; +121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; +121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; +121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; +121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; +121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; +121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; +121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; +121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; +121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; +121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; +121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; +121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; +121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; +121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; +121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; +121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; +121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; +121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; +121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; +12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; +12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; +12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; +12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; +12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; +12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; +12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; +12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; +1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; +1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; +1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; +1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; +1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; +12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; +12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; +12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; +12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; +12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; +12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; +12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; +12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; +12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; +12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; +1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; +1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; +1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; +1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; +1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; +1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; +12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; +12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; +12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; +12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; +12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; +12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; +12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; +12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; +1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; +1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; +1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; +1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; +1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; +1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; +12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; +12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; +12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; +12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; +12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; +12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; +12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; +12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; +12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; +1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; +1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; +1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; +1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; +1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; +1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; +12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; +12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; +12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; +12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; +12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; +12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; +12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; +12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; +12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; +12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; +1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; +1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; +1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; +1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; +1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; +1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; +12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; +12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; +12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; +12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; +12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; +12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; +1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; +1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; +1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; +1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; +1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; +12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; +12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; +12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; +12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; +12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; +12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; +12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; +12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; +12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; +1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; +1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; +1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; +1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; +1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; +12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; +12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; +12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; +12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; +12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; +12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; +12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; +12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; +12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; +1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; +1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; +1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; +1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; +1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; +1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; +12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; +12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; +12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; +12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; +12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; +12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; +12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; +12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; +12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; +12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; +1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; +1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; +1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; +1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; +1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; +1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; +12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; +12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; +12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; +12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; +12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; +12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; +12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; +12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; +12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; +12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; +1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; +1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; +1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; +1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; +1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; +122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; +122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; +122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; +122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; +122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; +122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; +122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; +122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; +122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; +122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; +122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; +122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; +122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; +122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; +122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; +122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; +122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; +122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; +122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; +122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; +122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; +122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; +122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; +122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; +122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; +122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; +122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; +122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; +122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; +122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; +122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; +122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; +122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; +122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; +122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; +122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; +122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; +122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; +122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; +122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; +122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; +122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; +122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; +122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; +122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; +122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; +122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; +122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; +122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; +122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; +122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; +122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; +122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; +122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; +122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; +122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; +122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; +122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; +122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; +122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; +122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; +122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; +122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; +122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; +122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; +122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; +122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; +122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; +122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; +122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; +122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; +122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; +122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; +122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; +122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; +122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; +122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; +122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; +122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; +122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; +122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; +122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; +122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; +122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; +122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; +122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; +122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; +122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; +122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; +122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; +122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; +122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; +122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; +12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; +12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; +12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; +12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; +12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; +12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; +12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; +12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; +12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; +12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; +1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; +1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; +1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; +1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; +1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; +1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; +12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; +12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; +12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; +12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; +12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; +12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; +12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; +12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; +12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; +12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; +1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; +1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; +1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; +1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; +1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; +12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; +12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; +12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; +12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; +12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; +12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; +12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; +12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; +12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; +12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; +1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; +1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; +1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; +1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; +1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; +1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; +12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; +12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; +12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; +12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; +12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; +12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; +12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; +12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; +12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; +12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; +1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; +1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; +1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; +1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; +1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; +12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; +12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; +12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; +12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; +12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; +12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; +12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; +12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; +12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; +12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; +1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; +1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; +1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; +1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; +1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; +1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; +12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; +12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; +12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; +12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; +12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; +12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; +12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; +12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; +12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; +12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; +1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; +1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; +1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; +1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; +1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; +12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; +12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; +12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; +12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; +12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; +12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; +12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; +12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; +12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; +12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; +1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; +1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; +1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; +1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; +1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; +1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; +12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; +12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; +12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; +12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; +12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; +12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; +12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; +12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; +12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; +12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; +1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; +1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; +1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; +1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; +1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; +12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; +12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; +12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; +12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; +12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; +12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; +12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; +12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; +12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; +12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; +1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; +1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; +1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; +1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; +1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; +1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; +12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; +12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; +12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; +12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; +12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; +12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; +12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; +12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; +12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; +12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; +12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; +12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; +12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; +12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; +12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; +12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; +1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; +1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; +1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; +1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; +1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; +1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; +12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; +12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; +12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; +12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; +12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; +12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; +12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; +12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; +12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; +12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; +1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; +1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; +1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; +1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; +1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; +1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; +12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; +12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; +12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; +12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; +12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; +12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; +12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; +12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; +12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; +1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; +1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; +1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; +1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; +1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; +1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; +12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; +12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; +12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; +12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; +12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; +12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; +12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; +12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; +12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; +1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; +1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; +1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; +1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; +1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; +1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; +12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; +12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; +12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; +12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; +12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; +12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; +12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; +12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; +12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; +12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; +1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; +1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; +1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; +1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; +1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; +1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; +12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; +12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; +12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; +12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; +12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; +12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; +12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; +12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; +12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; +12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; +1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; +1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; +1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; +1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; +1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; +1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; +12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; +12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; +12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; +12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; +12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; +12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; +12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; +12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; +12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; +12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; +1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; +1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; +1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; +1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; +1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; +12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; +12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; +12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; +12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; +12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; +13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; +13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; +13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; +13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; +13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; +13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; +1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; +13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; +13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; +13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; +13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; +13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; +13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; +13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; +13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; +13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; +13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; +13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; +1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; +1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; +1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; +1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; +1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; +1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; +13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; +13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; +13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; +13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; +13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; +13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; +13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; +13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; +13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; +13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; +1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; +1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; +1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; +1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; +1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; +1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; +13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; +13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; +13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; +13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; +13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; +13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; +13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; +13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; +13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; +13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; +1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; +1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; +1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; +1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; +1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; +1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; +13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; +13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; +13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; +13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; +13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; +13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; +13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; +13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; +13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; +13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; +1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; +1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; +1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; +1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; +1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; +1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; +13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; +13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; +13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; +13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; +13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; +13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; +13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; +13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; +13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; +13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; +1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; +1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; +1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; +1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; +1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; +1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; +130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; +130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; +130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; +130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; +130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; +130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; +130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; +130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; +130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; +130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; +130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; +130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; +130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; +130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; +130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; +130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; +130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; +130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; +130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; +130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; +130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; +130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; +130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; +130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; +130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; +130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; +130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; +130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; +130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; +130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; +130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; +130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; +130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; +130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; +130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; +130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; +130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; +130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; +130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; +130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; +130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; +130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; +130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; +130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; +130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; +130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; +130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; +130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; +130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; +130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; +130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; +130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; +130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; +130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; +130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; +130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; +130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; +130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; +130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; +130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; +130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; +130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; +130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; +130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; +130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; +130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; +130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; +130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; +130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; +130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; +130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; +130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; +130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; +130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; +130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; +130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; +130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; +130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; +130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; +130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; +130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; +130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; +130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; +130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; +130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; +130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; +130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; +130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; +130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; +130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; +130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; +130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; +130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; +130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; +130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; +130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; +13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; +13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; +13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; +13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; +13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; +13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; +13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; +13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; +13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; +13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; +1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; +1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; +1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; +1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; +1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; +1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; +13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; +13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; +13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; +13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; +13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; +13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; +13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; +13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; +13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; +13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; +1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; +1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; +1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; +1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; +1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; +1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; +13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; +13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; +13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; +13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; +13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; +13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; +13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; +13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; +13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; +13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; +1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; +1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; +1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; +1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; +1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; +1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; +13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; +13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; +13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; +13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; +13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; +13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; +13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; +13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; +13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; +13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; +1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; +1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; +1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; +1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; +1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; +1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; +13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; +13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; +13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; +13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; +13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; +13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; +13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; +13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; +13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; +13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; +1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; +1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; +1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; +1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; +1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; +1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; +13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; +13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; +13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; +13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; +13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; +13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; +13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; +13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; +13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; +13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; +1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; +1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; +1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; +1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; +1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; +1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; +13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; +13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; +13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; +13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; +13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; +13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; +13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; +13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; +13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; +13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; +1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; +1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; +1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; +1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; +1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; +1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; +13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; +13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; +13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; +13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; +13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; +13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; +13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; +13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; +13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; +13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; +1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; +1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; +1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; +1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; +1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; +1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; +13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; +13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; +13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; +13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; +13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; +13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; +13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; +13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; +13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; +13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; +1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; +1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; +1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; +1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; +1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; +1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; +13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; +13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; +13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; +13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; +13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; +13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; +13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; +13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; +13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; +13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; +1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; +1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; +1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; +1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; +1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; +1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; +131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; +131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; +131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; +131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; +131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; +131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; +131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; +131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; +131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; +131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; +131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; +131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; +131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; +131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; +131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; +131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; +131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; +131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; +131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; +131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; +131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; +131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; +131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; +131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; +131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; +131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; +131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; +131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; +131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; +131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; +131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; +131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; +131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; +131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; +131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; +131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; +131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; +131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; +131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; +131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; +131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; +131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; +131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; +131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; +131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; +131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; +131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; +131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; +131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; +131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; +131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; +131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; +131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; +131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; +131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; +131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; +131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; +131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; +131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; +131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; +131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; +131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; +131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; +131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; +131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; +131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; +131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; +131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; +131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; +131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; +131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; +131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; +131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; +131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; +131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; +131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; +131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; +131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; +131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; +131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; +131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; +131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; +131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; +131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; +131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; +131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; +131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; +131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; +131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; +131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; +131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; +131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; +131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; +131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; +131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; +131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; +13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; +13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; +13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; +13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; +13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; +13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; +13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; +13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; +13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; +13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; +1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; +1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; +1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; +1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; +1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; +1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; +13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; +13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; +13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; +13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; +13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; +13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; +13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; +13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; +13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; +13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; +1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; +1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; +1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; +1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; +1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; +1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; +13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; +13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; +13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; +13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; +13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; +13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; +13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; +13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; +13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; +13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; +1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; +1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; +1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; +1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; +1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; +1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; +13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; +13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; +13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; +13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; +13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; +13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; +13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; +13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; +13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; +13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; +1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; +1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; +1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; +1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; +1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; +1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; +13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; +13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; +13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; +13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; +13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; +13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; +13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; +13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; +13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; +13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; +1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; +1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; +1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; +1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; +1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; +1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; +13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; +13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; +13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; +13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; +13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; +13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; +13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; +13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; +13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; +13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; +1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; +1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; +1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; +1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; +1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; +1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; +13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; +13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; +13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; +13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; +13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; +13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; +13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; +13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; +13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; +13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; +1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; +1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; +1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; +1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; +1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; +1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; +13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; +13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; +13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; +13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; +13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; +13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; +13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; +13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; +13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; +13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; +1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; +1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; +1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; +1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; +1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; +1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; +13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; +13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; +13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; +13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; +13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; +13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; +13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; +13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; +13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; +13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; +1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; +1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; +1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; +1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; +1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; +1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; +13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; +13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; +13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; +13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; +13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; +13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; +13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; +13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; +13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; +13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; +1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; +1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; +1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; +1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; +1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; +1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; +132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; +132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; +132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; +132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; +132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; +132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; +132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; +132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; +132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; +132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; +132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; +132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; +132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; +132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; +132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; +132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; +132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; +132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; +132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; +132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; +132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; +132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; +132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; +132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; +132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; +132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; +132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; +132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; +132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; +132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; +132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; +132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; +132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; +132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; +132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; +132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; +132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; +132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; +132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; +132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; +132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; +132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; +132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; +132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; +132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; +132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; +132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; +132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; +132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; +132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; +132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; +132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; +132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; +132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; +132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; +132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; +132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; +132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; +132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; +132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; +132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; +132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; +132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; +132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; +132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; +132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; +132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; +132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; +132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; +132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; +132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; +132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; +132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; +132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; +132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; +132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; +132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; +132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; +132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; +132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; +132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; +132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; +132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; +132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; +132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; +132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; +132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; +132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; +132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; +132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; +132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; +132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; +132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; +132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; +132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; +132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; +13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; +13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; +13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; +13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; +13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; +13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; +13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; +13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; +13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; +13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; +1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; +1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; +1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; +1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; +1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; +1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; +13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; +13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; +13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; +13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; +13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; +13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; +13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; +13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; +13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; +13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; +1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; +1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; +1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; +1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; +1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; +1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; +13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; +13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; +13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; +13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; +13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; +13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; +13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; +13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; +13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; +13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; +1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; +1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; +1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; +1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; +1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; +1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; +13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; +13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; +13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; +13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; +13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; +13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; +13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; +13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; +13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; +13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; +1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; +1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; +1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; +1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; +1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; +1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; +13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; +13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; +13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; +13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; +13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; +13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; +13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; +13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; +13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; +13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; +1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; +1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; +1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; +1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; +1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; +1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; +13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; +13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; +13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; +13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; +13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; +13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; +13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; +13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; +13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; +13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; +1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; +1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; +1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; +1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; +1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; +1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; +13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; +13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; +13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; +13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; +13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; +13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; +13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; +13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; +13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; +13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; +1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; +1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; +1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; +1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; +1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; +1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; +13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; +13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; +13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; +13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; +13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; +13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; +13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; +13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; +13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; +13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; +1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; +1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; +1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; +1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; +1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; +1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; +13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; +13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; +13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; +13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; +13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; +13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; +13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; +13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; +13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; +13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; +1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; +1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; +1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; +1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; +1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; +1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; +13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; +13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; +13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; +13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; +13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; +13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; +13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; +13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; +13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; +13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; +1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; +1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; +1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; +1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; +1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; +1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; +133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; +133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; +133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; +133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; +133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; +133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; +133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; +133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; +133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; +133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; +133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; +133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; +133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; +133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; +133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; +133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; +133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; +133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; +133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; +133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; +133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; +133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; +133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; +133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; +133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; +133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; +133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; +133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; +133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; +133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; +133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; +133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; +133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; +133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; +133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; +133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; +133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; +133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; +133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; +133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; +133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; +133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; +133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; +133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; +133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; +133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; +133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; +133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; +133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; +133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; +133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; +133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; +133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; +133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; +133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; +133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; +133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; +133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; +133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; +133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; +133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; +133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; +133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; +133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; +133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; +133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; +133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; +133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; +133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; +133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; +133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; +133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; +133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; +133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; +133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; +133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; +133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; +133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; +133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; +133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; +133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; +133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; +133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; +133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; +133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; +133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; +133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; +133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; +133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; +133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; +133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; +133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; +133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; +133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; +133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; +133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; +13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; +13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; +13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; +13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; +13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; +13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; +13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; +13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; +13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; +13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; +1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; +1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; +1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; +1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; +1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; +1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; +13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; +13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; +13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; +13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; +13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; +13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; +13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; +13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; +13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; +13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; +1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; +1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; +1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; +1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; +1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; +1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; +13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; +13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; +13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; +13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; +13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; +13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; +13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; +13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; +13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; +13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; +1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; +1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; +1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; +1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; +1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; +16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; +16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; +16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; +16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; +16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; +16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; +16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; +16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; +1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; +1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; +1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; +1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; +1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; +1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; +16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; +16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; +16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; +16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; +16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; +16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; +16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; +16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; +16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; +16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; +1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; +1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; +1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; +1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; +1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; +1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; +16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; +16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; +16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; +16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; +16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; +16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; +16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; +16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; +16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; +16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; +1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; +1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; +1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; +1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; +1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; +1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; +16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; +16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; +16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; +16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; +16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; +16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; +16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; +16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; +16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; +16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; +1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; +1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; +1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; +1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; +1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; +1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; +16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; +16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; +16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; +16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; +16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; +16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; +16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; +16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; +16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; +16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; +1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; +1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; +1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; +1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; +1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; +1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; +16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; +16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; +16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; +16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; +16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; +16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; +16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; +16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; +16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; +16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; +1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; +1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; +1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; +1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; +1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; +1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; +16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; +16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; +16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; +16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; +16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; +16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; +16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; +16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; +16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; +16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; +1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; +1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; +1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; +1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; +1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; +1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; +16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; +16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; +16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; +16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; +16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; +16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; +16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; +16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; +16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; +16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; +1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; +1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; +1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; +1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; +1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; +1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; +16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; +16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; +16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; +16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; +16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; +16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; +16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; +16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; +16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; +16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; +1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; +1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; +1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; +1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; +1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; +1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; +16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; +16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; +16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; +16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; +16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; +16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; +16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; +16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; +16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; +16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; +1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; +1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; +1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; +1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; +1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; +1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; +168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; +168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; +168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; +168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; +168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; +168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; +168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; +168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; +168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; +168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; +168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; +168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; +168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; +168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; +168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; +168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; +168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; +168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; +168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; +168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; +168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; +168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; +168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; +168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; +168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; +168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; +168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; +168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; +168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; +168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; +168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; +168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; +168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; +168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; +168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; +168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; +168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; +168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; +168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; +168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; +168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; +168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; +168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; +168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; +168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; +168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; +168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; +168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; +168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; +168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; +168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; +168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; +168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; +168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; +168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; +168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; +168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; +168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; +168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; +168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; +168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; +168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; +168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; +168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; +168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; +168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; +168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; +168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; +168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; +168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; +168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; +168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; +168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; +168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; +168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; +168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; +168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; +168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; +168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; +168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; +168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; +168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; +168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; +168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; +168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; +168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; +168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; +168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; +168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; +168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; +168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; +168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; +168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; +168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; +168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; +168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; +16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; +16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; +16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; +16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; +16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; +16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; +16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; +16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; +16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; +16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; +1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; +1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; +1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; +1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; +1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; +1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; +16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; +16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; +16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; +16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; +16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; +16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; +16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; +16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; +16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; +16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; +1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; +1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; +1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; +1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; +1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; +1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; +16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; +16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; +16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; +16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; +16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; +16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; +16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; +16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; +16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; +16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; +1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; +1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; +1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; +1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; +1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; +1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; +16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; +16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; +16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; +16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; +16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; +16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; +16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; +16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; +16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; +16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; +1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; +1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; +1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; +1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; +1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; +1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; +16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; +16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; +16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; +16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; +16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; +16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; +16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; +16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; +16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; +16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; +1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; +1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; +1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; +1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; +1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; +1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; +16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; +16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; +16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; +16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; +16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; +16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; +16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; +16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; +16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; +16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; +1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; +1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; +1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; +1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; +1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; +1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; +16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; +16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; +16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; +16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; +16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; +16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; +16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; +16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; +16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; +16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; +1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; +1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; +1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; +1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; +1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; +1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; +16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; +16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; +16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; +16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; +16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; +16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; +16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; +16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; +16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; +16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; +1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; +1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; +1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; +1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; +1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; +1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; +16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; +16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; +16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; +16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; +16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; +16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; +16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; +16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; +16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; +16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; +1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; +1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; +1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; +1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; +1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; +1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; +16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; +16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; +16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; +16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; +16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; +16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; +16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; +16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; +16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; +16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; +1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; +1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; +1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; +1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; +1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; +1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; +169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; +169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; +169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; +169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; +169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; +169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; +169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; +169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; +169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; +169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; +169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; +169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; +169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; +169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; +169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; +169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; +169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; +169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; +169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; +169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; +169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; +169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; +169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; +169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; +169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; +169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; +169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; +169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; +169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; +169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; +169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; +169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; +169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; +169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; +169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; +169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; +169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; +169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; +169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; +169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; +169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; +169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; +169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; +169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; +169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; +169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; +169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; +169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; +169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; +169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; +169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; +169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; +169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; +169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; +169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; +169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; +169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; +169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; +169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; +169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; +169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; +169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; +169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; +169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; +169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; +169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; +169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; +169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; +169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; +169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; +169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; +169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; +169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; +169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; +169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; +169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; +169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; +169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; +169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; +169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; +169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; +169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; +169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; +169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; +169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; +169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; +169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; +169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; +169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; +169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; +169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; +169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; +169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; +169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; +169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; +169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; +16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; +16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; +16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; +16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; +16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; +16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; +16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; +16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; +16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; +16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; +16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; +16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; +16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; +16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; +16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; +16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; +16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; +16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; +16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; +16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; +16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; +16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; +16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; +16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; +16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; +16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; +16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; +16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; +16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; +16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; +16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; +16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; +16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; +16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; +16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; +16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; +16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; +16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; +16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; +16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; +16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; +16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; +16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; +16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; +16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; +16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; +16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; +16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; +16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; +16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; +16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; +16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; +16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; +16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; +16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; +16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; +16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; +16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; +16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; +16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; +16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; +16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; +16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; +16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; +16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; +16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; +16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; +16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; +16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; +16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; +16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; +16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; +16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; +16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; +16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; +16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; +16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; +16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; +16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; +16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; +16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; +16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; +16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; +16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; +16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; +16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; +16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; +16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; +16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; +16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; +16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; +16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; +16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; +16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; +16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; +16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; +16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; +16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; +16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; +16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; +16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; +16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; +16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; +16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; +16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; +16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; +16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; +16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; +16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; +16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; +16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; +16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; +16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; +16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; +16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; +16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; +16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; +16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; +16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; +16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; +16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; +16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; +16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; +16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; +16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; +16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; +16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; +16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; +16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; +16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; +16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; +16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; +16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; +16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; +16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; +16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; +16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; +16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; +16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; +16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; +16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; +16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; +16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; +16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; +16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; +16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; +16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; +16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; +16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; +16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; +16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; +16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; +16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; +16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; +16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; +16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; +16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; +16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; +16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; +16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; +16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; +16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; +16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; +16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; +16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; +16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; +16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; +16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; +16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; +16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; +16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; +16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; +16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; +16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; +16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; +16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; +16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; +16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; +16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; +16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; +16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; +16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; +16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; +16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; +16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; +16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; +16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; +16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; +16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; +16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; +16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; +16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; +16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; +16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; +16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; +16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; +16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; +16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; +16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; +16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; +16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; +16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; +16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; +16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; +16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; +16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; +16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; +16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; +16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; +16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; +16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; +16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; +16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; +16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; +16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; +16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; +16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; +16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; +16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; +16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; +16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; +16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; +16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; +16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; +16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; +16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; +16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; +16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; +16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; +16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; +16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; +16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; +16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; +16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; +16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; +16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; +16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; +16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; +16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; +16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; +16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; +16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; +16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; +16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; +16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; +16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; +16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; +16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; +16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; +16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; +16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; +16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; +16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; +16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; +16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; +16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; +16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; +16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; +16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; +16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; +16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; +16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; +16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; +16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; +16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; +16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; +16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; +16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; +16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; +16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; +16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; +16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; +16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; +16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; +16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; +16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; +16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; +16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; +16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; +16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; +16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; +16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; +16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; +16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; +16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; +16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; +16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; +16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; +16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; +16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; +16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; +16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; +16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; +16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; +16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; +16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; +16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; +16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; +16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; +16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; +16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; +16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; +16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; +16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; +16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; +16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; +16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; +16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; +16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; +16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; +16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; +16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; +16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; +16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; +16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; +16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; +16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; +16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; +16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; +16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; +16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; +16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; +16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; +16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; +16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; +16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; +16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; +16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; +16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; +16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; +16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; +16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; +16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; +16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; +16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; +16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; +16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; +16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; +16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; +16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; +16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; +16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; +16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; +16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; +16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; +16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; +16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; +16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; +16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; +16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; +16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; +16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; +16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; +16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; +16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; +16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; +16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; +16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; +16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; +16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; +16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; +16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; +16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; +16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; +16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; +16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; +16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; +16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; +16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; +16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; +16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; +1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; +1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; +1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; +1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; +1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; +1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; +1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; +1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; +1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; +1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; +1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; +1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; +1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; +1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; +1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; +1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; +1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; +1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; +1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; +1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; +1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; +1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; +1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; +1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; +1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; +1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; +1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; +1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; +1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; +1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; +1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; +1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; +1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; +1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; +1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; +1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; +1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; +1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; +1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; +1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; +1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; +1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; +1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; +1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; +1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; +1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; +1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; +1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; +1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; +1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; +1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; +1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; +1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; +1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; +1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; +1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; +1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; +1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; +1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; +1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; +1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; +1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; +1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; +1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; +1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; +1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; +1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; +1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; +1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; +1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; +1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; +1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; +1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; +1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; +1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; +1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; +1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; +1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; +1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; +1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; +1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; +1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; +1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; +1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; +1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; +1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; +1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; +1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; +1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; +1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; +1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; +1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; +1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; +1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; +1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; +1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; +1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; +1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; +1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; +1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; +1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; +1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; +1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; +1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; +1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; +1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; +1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; +1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; +1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; +1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; +1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; +1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; +1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; +1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; +1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; +1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; +1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; +1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; +1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; +1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; +1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; +1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; +1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; +1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; +1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; +1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; +1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; +1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; +1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; +1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; +1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; +1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; +1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; +1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; +1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; +1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; +1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; +1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; +1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; +1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; +1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; +1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; +1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; +1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; +1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; +1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; +1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; +1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; +1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; +1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; +1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; +1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; +1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; +1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; +1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; +1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; +1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; +1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; +1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; +1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; +1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; +1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; +1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; +1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; +1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; +1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; +1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; +1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; +1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; +1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; +1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; +1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; +1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; +1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; +1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; +1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; +1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; +1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; +1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; +1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; +1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; +1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; +1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; +1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; +1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; +1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; +1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; +1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; +1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; +1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; +1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; +1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; +1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; +1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; +1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; +1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; +1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; +1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; +1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; +1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; +1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; +1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; +1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; +1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; +1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; +1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; +1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; +1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; +1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; +1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; +1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; +1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; +1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; +1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; +1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; +1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; +1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; +1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; +1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; +1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; +1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; +1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; +1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; +1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; +1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; +1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; +1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; +1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; +1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; +1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; +1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; +1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; +1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; +1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; +1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; +1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; +1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; +1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; +1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; +1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; +1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; +1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; +1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; +1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; +1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; +1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; +1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; +1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; +1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; +1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; +1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; +1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; +1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; +1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; +1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; +1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; +1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; +1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; +1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; +1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; +1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; +1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; +1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; +1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; +1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; +1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; +1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; +1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; +1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; +1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; +1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; +1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; +1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; +1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; +1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; +1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; +1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; +1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; +1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; +1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; +1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; +1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; +1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; +1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; +1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; +1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; +1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; +1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; +1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; +1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; +1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; +1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; +1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; +1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; +1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; +1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; +1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; +1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; +1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; +1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; +1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; +1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; +1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; +1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; +1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; +1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; +1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; +1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; +1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; +1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; +1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; +1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; +1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; +1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; +1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; +1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; +1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; +1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; +1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; +1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; +1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; +1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; +1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; +1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; +1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; +1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; +1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; +1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; +1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; +1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; +1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; +1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; +1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; +1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; +1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; +1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; +1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; +1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; +1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; +1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; +1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; +1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; +1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; +1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; +1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; +1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; +1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; +1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; +1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; +1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; +1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; +1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; +1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; +1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; +1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; +1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; +1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; +1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; +1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; +1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; +1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; +1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; +1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; +1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; +1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; +1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; +1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; +1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; +1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; +1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; +1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; +1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; +1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; +1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; +1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; +1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; +1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; +1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; +1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; +1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; +1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; +1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; +1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; +1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; +1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; +1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; +1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; +1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; +1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; +1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; +1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; +1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; +1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; +1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; +1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; +1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; +1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; +1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; +1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; +1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; +1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; +1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; +1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; +1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; +1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; +1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; +1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; +1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; +1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; +1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; +1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; +1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; +1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; +1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; +1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; +1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; +1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; +1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; +1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; +1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; +1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; +1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; +1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; +1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; +1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; +1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; +1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; +1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; +1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; +1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; +1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; +1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; +1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; +1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; +1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; +1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; +1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; +1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; +1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; +1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; +1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; +1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; +1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; +1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; +1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; +1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; +1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; +1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; +1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; +1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; +1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; +1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; +1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; +1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; +1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; +1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; +1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; +1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; +1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; +1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; +1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; +1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; +1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; +1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; +1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; +1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; +1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; +1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; +1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; +1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; +1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; +1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; +1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; +1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; +1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; +1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; +1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; +1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; +1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; +1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; +1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; +1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; +1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; +1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; +1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; +1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; +1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; +1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; +1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; +1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; +1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; +1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; +1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; +1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; +1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; +1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; +1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; +1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; +1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; +1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; +1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; +1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; +1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; +1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; +1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; +1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; +1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; +1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; +1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; +1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; +1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; +1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; +1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; +1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; +1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; +1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; +1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; +1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; +1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; +1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; +1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; +1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; +1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; +1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; +1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; +1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; +1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; +1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; +1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; +1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; +1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; +1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; +1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; +1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; +1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; +1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; +1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; +1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; +1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; +1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; +1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; +1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; +1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; +1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; +1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; +1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; +1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; +1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; +1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; +1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; +1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; +1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; +1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; +1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; +1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; +1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; +1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; +1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; +1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; +1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; +1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; +1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; +1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; +1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; +1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; +1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; +1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; +1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; +1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; +1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; +1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; +1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; +1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; +1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; +1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; +1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; +1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; +1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; +1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; +1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; +1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; +1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; +1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; +1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; +1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; +1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; +1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; +1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; +1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; +1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; +1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; +1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; +1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; +1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; +1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; +1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; +1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; +1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; +1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; +1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; +1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; +1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; +1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; +1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; +1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; +1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; +1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; +1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; +1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; +1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; +1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; +1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; +1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; +1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; +1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; +1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; +1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; +1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; +1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; +1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; +1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; +1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; +1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; +1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; +1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; +1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; +1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; +1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; +1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; +1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; +1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; +1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; +1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; +1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; +1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; +1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; +1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; +1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; +1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; +1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; +1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; +1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; +1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; +1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; +1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; +1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; +1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; +1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; +1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; +1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; +1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; +1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; +1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; +1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; +1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; +1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; +1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; +1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; +1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; +1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; +1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; +1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; +1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; +1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; +1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; +1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; +1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; +1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; +1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; +1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; +1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; +1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; +1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; +1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; +1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; +1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; +1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; +1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; +1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; +1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; +1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; +1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; +1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; +1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; +1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; +1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; +1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; +1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; +1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; +1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; +1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; +1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; +1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; +1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; +1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; +1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; +1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; +1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; +1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; +1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; +1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; +1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; +1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; +1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; +1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; +1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; +1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; +1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; +1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; +1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; +1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; +1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; +1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; +1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; +1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; +1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; +1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; +1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; +1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; +1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; +1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; +1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; +1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; +1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; +1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; +1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; +1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; +1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; +1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; +1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; +1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; +1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; +1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; +1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; +1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; +1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; +1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; +1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; +1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; +1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; +1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; +1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; +1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; +1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; +1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; +1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; +1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; +1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; +1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; +1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; +1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; +1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; +1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; +1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; +1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; +1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; +1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; +1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; +1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; +1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; +1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; +1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; +1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; +1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; +1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; +1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; +1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; +1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; +1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; +1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; +1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; +1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; +1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; +1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; +1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; +1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; +1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; +1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; +1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; +1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; +1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; +1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; +1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; +1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; +1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; +1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; +1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; +1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; +1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; +1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; +1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; +1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; +1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; +1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; +1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; +1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; +1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; +1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; +1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; +1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; +1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; +1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; +1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; +1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; +1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; +1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; +1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; +1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; +1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; +1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; +1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; +1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; +1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; +1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; +1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; +1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; +1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; +1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; +1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; +1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; +1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; +1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; +1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; +1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; +1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; +1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; +1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; +1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; +1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; +1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; +1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; +1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; +1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; +1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; +1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; +1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; +1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; +1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L; 03DC;;;;N;;;;; +1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L; 03DD;;;;N;;;;; +1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; +1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; +1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; +1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; +1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; +1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; +1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; +1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; +1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; +1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; +1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; +1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; +1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; +1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; +1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; +1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; +1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; +1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; +1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; +1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; +1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; +1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; +1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; +1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; +1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; +1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; +1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; +1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; +1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; +1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; +1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; +1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; +1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; +1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; +1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; +1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; +1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; +1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; +1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; +1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; +1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; +1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; +1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; +1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; +1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; +1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; +1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; +1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; +1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; +1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; +1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; +1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; +1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; +1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; +1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; +1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; +1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; +1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; +1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; +1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; +1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; +1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; +1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; +1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; +1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; +1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; +1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; +1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; +1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; +1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; +1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; +1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; +1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; +1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; +1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; +1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; +1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; +1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; +1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; +1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; +1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; +1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; +1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; +1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; +1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; +1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; +1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; +1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; +1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; +1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; +1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; +1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; +1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; +1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; +1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; +1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; +1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; +1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; +1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; +1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; +1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; +1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; +1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; +1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; +1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; +1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; +1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; +1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; +1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; +1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; +1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; +1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; +1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; +1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; +1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; +1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; +1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; +1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; +1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; +1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; +1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; +1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; +1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; +1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; +1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; +1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; +1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; +1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; +1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; +1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; +1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; +1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; +1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; +1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; +1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; +1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; +1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; +1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; +1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; +1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; +1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; +1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; +1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; +1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; +1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; +1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; +1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; +1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; +1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; +1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; +1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; +1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; +1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; +1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; +1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; +1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; +1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; +1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; +1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; +1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; +1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; +1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; +1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; +1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; +1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; +1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; +1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; +1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; +1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; +1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; +1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; +1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; +1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; +1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; +1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; +1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; +1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; +1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; +1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; +1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; +1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; +1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; +1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; +1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; +1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; +1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; +1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; +1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; +1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; +1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; +1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; +1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; +1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; +1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; +1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; +1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; +1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; +1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; +1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; +1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; +1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; +1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; +1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; +1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; +1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; +1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; +1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; +1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; +1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; +1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; +1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; +1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; +1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; +1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; +1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; +1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; +1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; +1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; +1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; +1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; +1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL; 0631;;;;N;;;;; +1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; +1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; +1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL; 0643;;;;N;;;;; +1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; +1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; +1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL; 0627;;;;N;;;;; +1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL; 0628;;;;N;;;;; +1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL; 062F;;;;N;;;;; +1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL; 0647;;;;N;;;;; +1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL; 0648;;;;N;;;;; +1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL; 062D;;;;N;;;;; +1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL; 0637;;;;N;;;;; +1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL; 064A;;;;N;;;;; +1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL; 0644;;;;N;;;;; +1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL; 0646;;;;N;;;;; +1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL; 0639;;;;N;;;;; +1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL; 0641;;;;N;;;;; +1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL; 0635;;;;N;;;;; +1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL; 0642;;;;N;;;;; +1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL; 0631;;;;N;;;;; +1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL; 062A;;;;N;;;;; +1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL; 062B;;;;N;;;;; +1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL; 0630;;;;N;;;;; +1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL; 0636;;;;N;;;;; +1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL; 0628;;;;N;;;;; +1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL; 062C;;;;N;;;;; +1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL; 062F;;;;N;;;;; +1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL; 0648;;;;N;;;;; +1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL; 0632;;;;N;;;;; +1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL; 062D;;;;N;;;;; +1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL; 0637;;;;N;;;;; +1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL; 064A;;;;N;;;;; +1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL; 0644;;;;N;;;;; +1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL; 0645;;;;N;;;;; +1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL; 0646;;;;N;;;;; +1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL; 0633;;;;N;;;;; +1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL; 0639;;;;N;;;;; +1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL; 0641;;;;N;;;;; +1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL; 0635;;;;N;;;;; +1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL; 0642;;;;N;;;;; +1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL; 0631;;;;N;;;;; +1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL; 0634;;;;N;;;;; +1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL; 062A;;;;N;;;;; +1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL; 062B;;;;N;;;;; +1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL; 062E;;;;N;;;;; +1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL; 0630;;;;N;;;;; +1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL; 0636;;;;N;;;;; +1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL; 0638;;;;N;;;;; +1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL; 063A;;;;N;;;;; +1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; +1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; +1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; +1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; +1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; +1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; +1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; +1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; +1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; +1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; +1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; +1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; +1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; +1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; +1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; +1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; +1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; +1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; +1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; +1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; +1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; +1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; +1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; +1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; +1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; +1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; +1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; +1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; +1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; +1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; +1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; +1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; +1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; +1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; +1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; +1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; +1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; +1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; +1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; +1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; +1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; +1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; +1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; +1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; +1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; +1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; +1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; +1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; +1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; +1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; +1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; +1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; +1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; +1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; +1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; +1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; +1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; +1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; +1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; +1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; +1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; +1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; +1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; +1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; +1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; +1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; +1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; +1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; +1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; +1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; +1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; +1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; +1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; +1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; +1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; +1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; +1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; +1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; +1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; +1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; +1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; +1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; +1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; +1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; +1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; +1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; +1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; +1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; +1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; +1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; +1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; +1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; +1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; +1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; +1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; +1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; +1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; +1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; +1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; +1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; +1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; +1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; +1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; +1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; +1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; +1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; +1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; +1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; +1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; +1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; +1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; +1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; +1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; +1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; +1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; +1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; +1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; +1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; +1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; +1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; +1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; +1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; +1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; +1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; +1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; +1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; +1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; +1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; +1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; +1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; +1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; +1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; +1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; +1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; +1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; +1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; +1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; +1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; +1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; +1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; +1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; +1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; +1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; +1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; +1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; +1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; +1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; +1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; +1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; +1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; +1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; +1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; +1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; +1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; +1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; +1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; +1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; +1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; +1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; +1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; +1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; +1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; +1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; +1F100;DIGIT ZERO FULL STOP;No;0;EN; 0030 002E;;0;0;N;;;;; +1F101;DIGIT ZERO COMMA;No;0;EN; 0030 002C;;0;0;N;;;;; +1F102;DIGIT ONE COMMA;No;0;EN; 0031 002C;;1;1;N;;;;; +1F103;DIGIT TWO COMMA;No;0;EN; 0032 002C;;2;2;N;;;;; +1F104;DIGIT THREE COMMA;No;0;EN; 0033 002C;;3;3;N;;;;; +1F105;DIGIT FOUR COMMA;No;0;EN; 0034 002C;;4;4;N;;;;; +1F106;DIGIT FIVE COMMA;No;0;EN; 0035 002C;;5;5;N;;;;; +1F107;DIGIT SIX COMMA;No;0;EN; 0036 002C;;6;6;N;;;;; +1F108;DIGIT SEVEN COMMA;No;0;EN; 0037 002C;;7;7;N;;;;; +1F109;DIGIT EIGHT COMMA;No;0;EN; 0038 002C;;8;8;N;;;;; +1F10A;DIGIT NINE COMMA;No;0;EN; 0039 002C;;9;9;N;;;;; +1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; +1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L; 0028 0041 0029;;;;N;;;;; +1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L; 0028 0042 0029;;;;N;;;;; +1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L; 0028 0043 0029;;;;N;;;;; +1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L; 0028 0044 0029;;;;N;;;;; +1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L; 0028 0045 0029;;;;N;;;;; +1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L; 0028 0046 0029;;;;N;;;;; +1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L; 0028 0047 0029;;;;N;;;;; +1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L; 0028 0048 0029;;;;N;;;;; +1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L; 0028 0049 0029;;;;N;;;;; +1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L; 0028 004A 0029;;;;N;;;;; +1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L; 0028 004B 0029;;;;N;;;;; +1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L; 0028 004C 0029;;;;N;;;;; +1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L; 0028 004D 0029;;;;N;;;;; +1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L; 0028 004E 0029;;;;N;;;;; +1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L; 0028 004F 0029;;;;N;;;;; +1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L; 0028 0050 0029;;;;N;;;;; +1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L; 0028 0051 0029;;;;N;;;;; +1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L; 0028 0052 0029;;;;N;;;;; +1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L; 0028 0053 0029;;;;N;;;;; +1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L; 0028 0054 0029;;;;N;;;;; +1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L; 0028 0055 0029;;;;N;;;;; +1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L; 0028 0056 0029;;;;N;;;;; +1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L; 0028 0057 0029;;;;N;;;;; +1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L; 0028 0058 0029;;;;N;;;;; +1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L; 0028 0059 0029;;;;N;;;;; +1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L; 0028 005A 0029;;;;N;;;;; +1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L; 3014 0053 3015;;;;N;;;;; +1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F12D;CIRCLED CD;So;0;L; 0043 0044;;;;N;;;;; +1F12E;CIRCLED WZ;So;0;L; 0057 005A;;;;N;;;;; +1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; +1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; +1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; +1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; +1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; +1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; +1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; +1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; +1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; +1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; +1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; +1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; +1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; +1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; +1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; +1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; +1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; +1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; +1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; +1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; +1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; +1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; +1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; +1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; +1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; +1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; +1F14A;SQUARED HV;So;0;L; 0048 0056;;;;N;;;;; +1F14B;SQUARED MV;So;0;L; 004D 0056;;;;N;;;;; +1F14C;SQUARED SD;So;0;L; 0053 0044;;;;N;;;;; +1F14D;SQUARED SS;So;0;L; 0053 0053;;;;N;;;;; +1F14E;SQUARED PPV;So;0;L; 0050 0050 0056;;;;N;;;;; +1F14F;SQUARED WC;So;0;L; 0057 0043;;;;N;;;;; +1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F16A;RAISED MC SIGN;So;0;ON; 004D 0043;;;;N;;;;; +1F16B;RAISED MD SIGN;So;0;ON; 004D 0044;;;;N;;;;; +1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; +1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; +1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; +1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; +1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; +1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; +1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; +1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; +1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; +1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; +1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; +1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; +1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; +1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; +1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; +1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; +1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; +1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; +1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; +1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; +1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; +1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; +1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; +1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; +1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; +1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; +1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; +1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; +1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; +1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; +1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; +1F190;SQUARE DJ;So;0;L; 0044 004A;;;;N;;;;; +1F191;SQUARED CL;So;0;L;;;;;N;;;;; +1F192;SQUARED COOL;So;0;L;;;;;N;;;;; +1F193;SQUARED FREE;So;0;L;;;;;N;;;;; +1F194;SQUARED ID;So;0;L;;;;;N;;;;; +1F195;SQUARED NEW;So;0;L;;;;;N;;;;; +1F196;SQUARED NG;So;0;L;;;;;N;;;;; +1F197;SQUARED OK;So;0;L;;;;;N;;;;; +1F198;SQUARED SOS;So;0;L;;;;;N;;;;; +1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; +1F19A;SQUARED VS;So;0;L;;;;;N;;;;; +1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; +1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; +1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; +1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; +1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; +1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; +1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; +1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; +1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; +1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; +1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; +1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; +1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; +1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; +1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; +1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; +1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; +1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; +1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; +1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; +1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; +1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; +1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; +1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; +1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; +1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; +1F200;SQUARE HIRAGANA HOKA;So;0;L; 307B 304B;;;;N;;;;; +1F201;SQUARED KATAKANA KOKO;So;0;L; 30B3 30B3;;;;N;;;;; +1F202;SQUARED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; +1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L; 624B;;;;N;;;;; +1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L; 5B57;;;;N;;;;; +1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L; 53CC;;;;N;;;;; +1F213;SQUARED KATAKANA DE;So;0;L; 30C7;;;;N;;;;; +1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 4E8C;;;;N;;;;; +1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L; 591A;;;;N;;;;; +1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L; 89E3;;;;N;;;;; +1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L; 5929;;;;N;;;;; +1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L; 4EA4;;;;N;;;;; +1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L; 6620;;;;N;;;;; +1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L; 7121;;;;N;;;;; +1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L; 6599;;;;N;;;;; +1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L; 524D;;;;N;;;;; +1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L; 5F8C;;;;N;;;;; +1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L; 518D;;;;N;;;;; +1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L; 65B0;;;;N;;;;; +1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L; 521D;;;;N;;;;; +1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L; 7D42;;;;N;;;;; +1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L; 751F;;;;N;;;;; +1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L; 8CA9;;;;N;;;;; +1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L; 58F0;;;;N;;;;; +1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L; 5439;;;;N;;;;; +1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L; 6F14;;;;N;;;;; +1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L; 6295;;;;N;;;;; +1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L; 6355;;;;N;;;;; +1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L; 4E00;;;;N;;;;; +1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 4E09;;;;N;;;;; +1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L; 904A;;;;N;;;;; +1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L; 5DE6;;;;N;;;;; +1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L; 4E2D;;;;N;;;;; +1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L; 53F3;;;;N;;;;; +1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L; 6307;;;;N;;;;; +1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L; 8D70;;;;N;;;;; +1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 6253;;;;N;;;;; +1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L; 7981;;;;N;;;;; +1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L; 7A7A;;;;N;;;;; +1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L; 5408;;;;N;;;;; +1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L; 6E80;;;;N;;;;; +1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L; 6709;;;;N;;;;; +1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L; 6708;;;;N;;;;; +1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L; 7533;;;;N;;;;; +1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L; 5272;;;;N;;;;; +1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L; 55B6;;;;N;;;;; +1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L; 3014 672C 3015;;;;N;;;;; +1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 3014 4E09 3015;;;;N;;;;; +1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 3014 4E8C 3015;;;;N;;;;; +1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L; 3014 5B89 3015;;;;N;;;;; +1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L; 3014 70B9 3015;;;;N;;;;; +1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 3014 6253 3015;;;;N;;;;; +1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L; 3014 76D7 3015;;;;N;;;;; +1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L; 3014 52DD 3015;;;;N;;;;; +1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; +1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; +1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; +1F300;CYCLONE;So;0;ON;;;;;N;;;;; +1F301;FOGGY;So;0;ON;;;;;N;;;;; +1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; +1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; +1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; +1F305;SUNRISE;So;0;ON;;;;;N;;;;; +1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; +1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; +1F308;RAINBOW;So;0;ON;;;;;N;;;;; +1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; +1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; +1F30B;VOLCANO;So;0;ON;;;;;N;;;;; +1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; +1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; +1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; +1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; +1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; +1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; +1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; +1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; +1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; +1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; +1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; +1F321;THERMOMETER;So;0;ON;;;;;N;;;;; +1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; +1F323;WHITE SUN;So;0;ON;;;;;N;;;;; +1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; +1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; +1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; +1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; +1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; +1F32B;FOG;So;0;ON;;;;;N;;;;; +1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F330;CHESTNUT;So;0;ON;;;;;N;;;;; +1F331;SEEDLING;So;0;ON;;;;;N;;;;; +1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; +1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; +1F334;PALM TREE;So;0;ON;;;;;N;;;;; +1F335;CACTUS;So;0;ON;;;;;N;;;;; +1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; +1F337;TULIP;So;0;ON;;;;;N;;;;; +1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; +1F339;ROSE;So;0;ON;;;;;N;;;;; +1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; +1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; +1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; +1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; +1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; +1F33F;HERB;So;0;ON;;;;;N;;;;; +1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; +1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; +1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; +1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; +1F344;MUSHROOM;So;0;ON;;;;;N;;;;; +1F345;TOMATO;So;0;ON;;;;;N;;;;; +1F346;AUBERGINE;So;0;ON;;;;;N;;;;; +1F347;GRAPES;So;0;ON;;;;;N;;;;; +1F348;MELON;So;0;ON;;;;;N;;;;; +1F349;WATERMELON;So;0;ON;;;;;N;;;;; +1F34A;TANGERINE;So;0;ON;;;;;N;;;;; +1F34B;LEMON;So;0;ON;;;;;N;;;;; +1F34C;BANANA;So;0;ON;;;;;N;;;;; +1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; +1F34E;RED APPLE;So;0;ON;;;;;N;;;;; +1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; +1F350;PEAR;So;0;ON;;;;;N;;;;; +1F351;PEACH;So;0;ON;;;;;N;;;;; +1F352;CHERRIES;So;0;ON;;;;;N;;;;; +1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; +1F354;HAMBURGER;So;0;ON;;;;;N;;;;; +1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; +1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; +1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; +1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; +1F359;RICE BALL;So;0;ON;;;;;N;;;;; +1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; +1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; +1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; +1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; +1F35E;BREAD;So;0;ON;;;;;N;;;;; +1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; +1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; +1F361;DANGO;So;0;ON;;;;;N;;;;; +1F362;ODEN;So;0;ON;;;;;N;;;;; +1F363;SUSHI;So;0;ON;;;;;N;;;;; +1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; +1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; +1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; +1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; +1F368;ICE CREAM;So;0;ON;;;;;N;;;;; +1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; +1F36A;COOKIE;So;0;ON;;;;;N;;;;; +1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; +1F36C;CANDY;So;0;ON;;;;;N;;;;; +1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; +1F36E;CUSTARD;So;0;ON;;;;;N;;;;; +1F36F;HONEY POT;So;0;ON;;;;;N;;;;; +1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; +1F371;BENTO BOX;So;0;ON;;;;;N;;;;; +1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; +1F373;COOKING;So;0;ON;;;;;N;;;;; +1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; +1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; +1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; +1F377;WINE GLASS;So;0;ON;;;;;N;;;;; +1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; +1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; +1F37A;BEER MUG;So;0;ON;;;;;N;;;;; +1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; +1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; +1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F380;RIBBON;So;0;ON;;;;;N;;;;; +1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; +1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; +1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; +1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; +1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; +1F386;FIREWORKS;So;0;ON;;;;;N;;;;; +1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; +1F388;BALLOON;So;0;ON;;;;;N;;;;; +1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; +1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; +1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; +1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; +1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; +1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; +1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; +1F390;WIND CHIME;So;0;ON;;;;;N;;;;; +1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; +1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; +1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; +1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; +1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; +1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; +1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; +1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; +1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; +1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; +1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; +1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; +1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; +1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; +1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; +1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; +1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; +1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; +1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; +1F3A6;CINEMA;So;0;ON;;;;;N;;;;; +1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; +1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; +1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; +1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; +1F3AB;TICKET;So;0;ON;;;;;N;;;;; +1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; +1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; +1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; +1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; +1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; +1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; +1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; +1F3B3;BOWLING;So;0;ON;;;;;N;;;;; +1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; +1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; +1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; +1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; +1F3B8;GUITAR;So;0;ON;;;;;N;;;;; +1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; +1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; +1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; +1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; +1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; +1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; +1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; +1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; +1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; +1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; +1F3C3;RUNNER;So;0;ON;;;;;N;;;;; +1F3C4;SURFER;So;0;ON;;;;;N;;;;; +1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; +1F3C6;TROPHY;So;0;ON;;;;;N;;;;; +1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; +1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; +1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; +1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; +1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; +1F3CC;GOLFER;So;0;ON;;;;;N;;;;; +1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; +1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; +1F3D5;CAMPING;So;0;ON;;;;;N;;;;; +1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; +1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; +1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; +1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; +1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; +1F3DC;DESERT;So;0;ON;;;;;N;;;;; +1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; +1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; +1F3DF;STADIUM;So;0;ON;;;;;N;;;;; +1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; +1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; +1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; +1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; +1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; +1F3E6;BANK;So;0;ON;;;;;N;;;;; +1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; +1F3E8;HOTEL;So;0;ON;;;;;N;;;;; +1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; +1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; +1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; +1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; +1F3ED;FACTORY;So;0;ON;;;;;N;;;;; +1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; +1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; +1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; +1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; +1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; +1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; +1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; +1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; +1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; +1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F400;RAT;So;0;ON;;;;;N;;;;; +1F401;MOUSE;So;0;ON;;;;;N;;;;; +1F402;OX;So;0;ON;;;;;N;;;;; +1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; +1F404;COW;So;0;ON;;;;;N;;;;; +1F405;TIGER;So;0;ON;;;;;N;;;;; +1F406;LEOPARD;So;0;ON;;;;;N;;;;; +1F407;RABBIT;So;0;ON;;;;;N;;;;; +1F408;CAT;So;0;ON;;;;;N;;;;; +1F409;DRAGON;So;0;ON;;;;;N;;;;; +1F40A;CROCODILE;So;0;ON;;;;;N;;;;; +1F40B;WHALE;So;0;ON;;;;;N;;;;; +1F40C;SNAIL;So;0;ON;;;;;N;;;;; +1F40D;SNAKE;So;0;ON;;;;;N;;;;; +1F40E;HORSE;So;0;ON;;;;;N;;;;; +1F40F;RAM;So;0;ON;;;;;N;;;;; +1F410;GOAT;So;0;ON;;;;;N;;;;; +1F411;SHEEP;So;0;ON;;;;;N;;;;; +1F412;MONKEY;So;0;ON;;;;;N;;;;; +1F413;ROOSTER;So;0;ON;;;;;N;;;;; +1F414;CHICKEN;So;0;ON;;;;;N;;;;; +1F415;DOG;So;0;ON;;;;;N;;;;; +1F416;PIG;So;0;ON;;;;;N;;;;; +1F417;BOAR;So;0;ON;;;;;N;;;;; +1F418;ELEPHANT;So;0;ON;;;;;N;;;;; +1F419;OCTOPUS;So;0;ON;;;;;N;;;;; +1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; +1F41B;BUG;So;0;ON;;;;;N;;;;; +1F41C;ANT;So;0;ON;;;;;N;;;;; +1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; +1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; +1F41F;FISH;So;0;ON;;;;;N;;;;; +1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; +1F421;BLOWFISH;So;0;ON;;;;;N;;;;; +1F422;TURTLE;So;0;ON;;;;;N;;;;; +1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; +1F424;BABY CHICK;So;0;ON;;;;;N;;;;; +1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; +1F426;BIRD;So;0;ON;;;;;N;;;;; +1F427;PENGUIN;So;0;ON;;;;;N;;;;; +1F428;KOALA;So;0;ON;;;;;N;;;;; +1F429;POODLE;So;0;ON;;;;;N;;;;; +1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; +1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; +1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; +1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; +1F42E;COW FACE;So;0;ON;;;;;N;;;;; +1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; +1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; +1F431;CAT FACE;So;0;ON;;;;;N;;;;; +1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; +1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; +1F434;HORSE FACE;So;0;ON;;;;;N;;;;; +1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; +1F436;DOG FACE;So;0;ON;;;;;N;;;;; +1F437;PIG FACE;So;0;ON;;;;;N;;;;; +1F438;FROG FACE;So;0;ON;;;;;N;;;;; +1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; +1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; +1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; +1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; +1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; +1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; +1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; +1F440;EYES;So;0;ON;;;;;N;;;;; +1F441;EYE;So;0;ON;;;;;N;;;;; +1F442;EAR;So;0;ON;;;;;N;;;;; +1F443;NOSE;So;0;ON;;;;;N;;;;; +1F444;MOUTH;So;0;ON;;;;;N;;;;; +1F445;TONGUE;So;0;ON;;;;;N;;;;; +1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; +1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; +1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; +1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; +1F451;CROWN;So;0;ON;;;;;N;;;;; +1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; +1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; +1F454;NECKTIE;So;0;ON;;;;;N;;;;; +1F455;T-SHIRT;So;0;ON;;;;;N;;;;; +1F456;JEANS;So;0;ON;;;;;N;;;;; +1F457;DRESS;So;0;ON;;;;;N;;;;; +1F458;KIMONO;So;0;ON;;;;;N;;;;; +1F459;BIKINI;So;0;ON;;;;;N;;;;; +1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; +1F45B;PURSE;So;0;ON;;;;;N;;;;; +1F45C;HANDBAG;So;0;ON;;;;;N;;;;; +1F45D;POUCH;So;0;ON;;;;;N;;;;; +1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; +1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; +1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; +1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; +1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; +1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; +1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F466;BOY;So;0;ON;;;;;N;;;;; +1F467;GIRL;So;0;ON;;;;;N;;;;; +1F468;MAN;So;0;ON;;;;;N;;;;; +1F469;WOMAN;So;0;ON;;;;;N;;;;; +1F46A;FAMILY;So;0;ON;;;;;N;;;;; +1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; +1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; +1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; +1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; +1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; +1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; +1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; +1F474;OLDER MAN;So;0;ON;;;;;N;;;;; +1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; +1F476;BABY;So;0;ON;;;;;N;;;;; +1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; +1F478;PRINCESS;So;0;ON;;;;;N;;;;; +1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; +1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; +1F47B;GHOST;So;0;ON;;;;;N;;;;; +1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; +1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; +1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; +1F47F;IMP;So;0;ON;;;;;N;;;;; +1F480;SKULL;So;0;ON;;;;;N;;;;; +1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; +1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; +1F483;DANCER;So;0;ON;;;;;N;;;;; +1F484;LIPSTICK;So;0;ON;;;;;N;;;;; +1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; +1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; +1F487;HAIRCUT;So;0;ON;;;;;N;;;;; +1F488;BARBER POLE;So;0;ON;;;;;N;;;;; +1F489;SYRINGE;So;0;ON;;;;;N;;;;; +1F48A;PILL;So;0;ON;;;;;N;;;;; +1F48B;KISS MARK;So;0;ON;;;;;N;;;;; +1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; +1F48D;RING;So;0;ON;;;;;N;;;;; +1F48E;GEM STONE;So;0;ON;;;;;N;;;;; +1F48F;KISS;So;0;ON;;;;;N;;;;; +1F490;BOUQUET;So;0;ON;;;;;N;;;;; +1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; +1F492;WEDDING;So;0;ON;;;;;N;;;;; +1F493;BEATING HEART;So;0;ON;;;;;N;;;;; +1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; +1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; +1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; +1F497;GROWING HEART;So;0;ON;;;;;N;;;;; +1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; +1F499;BLUE HEART;So;0;ON;;;;;N;;;;; +1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; +1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; +1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; +1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; +1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; +1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; +1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; +1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; +1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; +1F4A3;BOMB;So;0;ON;;;;;N;;;;; +1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; +1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; +1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; +1F4A7;DROPLET;So;0;ON;;;;;N;;;;; +1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; +1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; +1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; +1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; +1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; +1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; +1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; +1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; +1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; +1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; +1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; +1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; +1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; +1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; +1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; +1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; +1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; +1F4BA;SEAT;So;0;ON;;;;;N;;;;; +1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; +1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; +1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; +1F4C0;DVD;So;0;ON;;;;;N;;;;; +1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; +1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; +1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; +1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; +1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; +1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; +1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; +1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; +1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; +1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; +1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; +1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; +1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; +1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; +1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; +1F4D2;LEDGER;So;0;ON;;;;;N;;;;; +1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; +1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; +1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; +1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; +1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; +1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; +1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; +1F4DA;BOOKS;So;0;ON;;;;;N;;;;; +1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; +1F4DC;SCROLL;So;0;ON;;;;;N;;;;; +1F4DD;MEMO;So;0;ON;;;;;N;;;;; +1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F4DF;PAGER;So;0;ON;;;;;N;;;;; +1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; +1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; +1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; +1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; +1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; +1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; +1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; +1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; +1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; +1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; +1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; +1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; +1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; +1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; +1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; +1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; +1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; +1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; +1F4F7;CAMERA;So;0;ON;;;;;N;;;;; +1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; +1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; +1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; +1F4FB;RADIO;So;0;ON;;;;;N;;;;; +1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; +1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; +1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; +1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; +1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; +1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F508;SPEAKER;So;0;ON;;;;;N;;;;; +1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F50B;BATTERY;So;0;ON;;;;;N;;;;; +1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; +1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; +1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; +1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; +1F511;KEY;So;0;ON;;;;;N;;;;; +1F512;LOCK;So;0;ON;;;;;N;;;;; +1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; +1F514;BELL;So;0;ON;;;;;N;;;;; +1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; +1F516;BOOKMARK;So;0;ON;;;;;N;;;;; +1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; +1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; +1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; +1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; +1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; +1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; +1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; +1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; +1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; +1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; +1F525;FIRE;So;0;ON;;;;;N;;;;; +1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; +1F527;WRENCH;So;0;ON;;;;;N;;;;; +1F528;HAMMER;So;0;ON;;;;;N;;;;; +1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; +1F52A;HOCHO;So;0;ON;;;;;N;;;;; +1F52B;PISTOL;So;0;ON;;;;;N;;;;; +1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; +1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; +1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; +1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; +1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; +1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; +1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; +1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; +1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; +1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; +1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; +1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; +1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; +1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; +1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; +1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; +1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; +1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; +1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; +1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; +1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; +1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; +1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; +1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; +1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; +1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; +1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; +1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; +1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; +1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; +1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; +1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; +1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; +1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; +1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; +1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; +1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; +1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; +1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; +1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; +1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; +1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; +1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; +1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56B;BULLHORN;So;0;ON;;;;;N;;;;; +1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; +1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; +1F56E;BOOK;So;0;ON;;;;;N;;;;; +1F56F;CANDLE;So;0;ON;;;;;N;;;;; +1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; +1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; +1F572;NO PIRACY;So;0;ON;;;;;N;;;;; +1F573;HOLE;So;0;ON;;;;;N;;;;; +1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; +1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; +1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; +1F577;SPIDER;So;0;ON;;;;;N;;;;; +1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; +1F579;JOYSTICK;So;0;ON;;;;;N;;;;; +1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; +1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; +1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; +1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; +1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; +1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; +1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; +1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; +1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; +1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; +1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; +1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; +1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; +1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; +1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; +1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; +1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; +1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; +1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; +1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; +1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; +1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; +1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; +1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; +1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; +1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; +1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; +1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; +1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; +1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; +1F5A8;PRINTER;So;0;ON;;;;;N;;;;; +1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; +1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; +1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; +1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; +1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; +1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; +1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; +1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; +1F5B5;SCREEN;So;0;ON;;;;;N;;;;; +1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; +1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; +1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; +1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; +1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; +1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; +1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; +1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; +1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; +1F5C0;FOLDER;So;0;ON;;;;;N;;;;; +1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; +1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; +1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; +1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; +1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; +1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; +1F5C8;NOTE;So;0;ON;;;;;N;;;;; +1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; +1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; +1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; +1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; +1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; +1F5CF;PAGE;So;0;ON;;;;;N;;;;; +1F5D0;PAGES;So;0;ON;;;;;N;;;;; +1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; +1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; +1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; +1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; +1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; +1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; +1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; +1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; +1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; +1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; +1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; +1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; +1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; +1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; +1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; +1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; +1F5E2;LIPS;So;0;ON;;;;;N;;;;; +1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; +1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; +1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; +1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; +1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; +1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; +1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; +1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; +1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; +1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; +1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; +1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; +1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; +1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; +1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; +1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; +1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; +1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; +1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; +1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; +1F5FF;MOYAI;So;0;ON;;;;;N;;;;; +1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; +1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; +1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; +1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; +1F609;WINKING FACE;So;0;ON;;;;;N;;;;; +1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; +1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; +1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; +1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; +1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; +1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; +1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; +1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; +1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; +1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; +1F617;KISSING FACE;So;0;ON;;;;;N;;;;; +1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; +1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; +1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; +1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; +1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; +1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; +1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; +1F621;POUTING FACE;So;0;ON;;;;;N;;;;; +1F622;CRYING FACE;So;0;ON;;;;;N;;;;; +1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; +1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; +1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; +1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; +1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; +1F629;WEARY FACE;So;0;ON;;;;;N;;;;; +1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; +1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; +1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; +1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; +1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; +1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; +1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; +1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; +1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; +1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; +1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; +1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; +1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; +1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; +1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; +1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; +1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; +1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; +1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; +1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; +1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; +1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; +1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; +1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; +1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; +1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; +1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; +1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; +1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; +1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; +1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; +1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; +1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; +1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; +1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; +1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; +1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; +1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; +1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; +1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; +1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; +1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; +1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; +1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; +1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; +1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; +1F680;ROCKET;So;0;ON;;;;;N;;;;; +1F681;HELICOPTER;So;0;ON;;;;;N;;;;; +1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; +1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; +1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; +1F686;TRAIN;So;0;ON;;;;;N;;;;; +1F687;METRO;So;0;ON;;;;;N;;;;; +1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; +1F689;STATION;So;0;ON;;;;;N;;;;; +1F68A;TRAM;So;0;ON;;;;;N;;;;; +1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; +1F68C;BUS;So;0;ON;;;;;N;;;;; +1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; +1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; +1F68F;BUS STOP;So;0;ON;;;;;N;;;;; +1F690;MINIBUS;So;0;ON;;;;;N;;;;; +1F691;AMBULANCE;So;0;ON;;;;;N;;;;; +1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F693;POLICE CAR;So;0;ON;;;;;N;;;;; +1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; +1F695;TAXI;So;0;ON;;;;;N;;;;; +1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; +1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; +1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; +1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; +1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; +1F69C;TRACTOR;So;0;ON;;;;;N;;;;; +1F69D;MONORAIL;So;0;ON;;;;;N;;;;; +1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; +1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; +1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; +1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; +1F6A2;SHIP;So;0;ON;;;;;N;;;;; +1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; +1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; +1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; +1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; +1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; +1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; +1F6AA;DOOR;So;0;ON;;;;;N;;;;; +1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; +1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; +1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; +1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; +1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; +1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; +1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; +1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; +1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; +1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; +1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; +1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; +1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; +1F6BD;TOILET;So;0;ON;;;;;N;;;;; +1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; +1F6BF;SHOWER;So;0;ON;;;;;N;;;;; +1F6C0;BATH;So;0;ON;;;;;N;;;;; +1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; +1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; +1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; +1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; +1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; +1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; +1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; +1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; +1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; +1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; +1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; +1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; +1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; +1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; +1F6E1;SHIELD;So;0;ON;;;;;N;;;;; +1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; +1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; +1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; +1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; +1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; +1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; +1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; +1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; +1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; +1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; +1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; +1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; +1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; +1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; +1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; +1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; +1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; +1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; +1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; +1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; +1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; +1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; +1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; +1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; +1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; +1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; +1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; +1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; +1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; +1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; +1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; +1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; +1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; +1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; +1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; +1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; +1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; +1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; +1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; +1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; +1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; +1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; +1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; +1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; +1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; +1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; +1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; +1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; +1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; +1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; +1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; +1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; +1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; +1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; +1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; +1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; +1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; +1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; +1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; +1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; +1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; +1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; +1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; +1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; +1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; +1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; +1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; +1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; +1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; +1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; +1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; +1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; +1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; +1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; +1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; +1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; +1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; +1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; +1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; +1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; +1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; +1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; +1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; +1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; +1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; +1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; +1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; +1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; +1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; +1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; +1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; +1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; +1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; +1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; +1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; +1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; +1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; +1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; +1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; +1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; +1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; +1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; +1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; +1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; +1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; +1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; +1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; +1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; +1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; +1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; +1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; +1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; +1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; +1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; +1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; +1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; +1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; +1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; +1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; +1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; +1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; +1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; +1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; +1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; +1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; +1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; +1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; +1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; +1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; +1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; +1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; +1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; +1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; +1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; +1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; +1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; +1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; +1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; +1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; +1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; +1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; +1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; +1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; +1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; +1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; +1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; +1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; +1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; +1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; +1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; +1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; +1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; +1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; +1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; +1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; +1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; +1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; +1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; +1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; +1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; +1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; +1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; +1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; +1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; +1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; +1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; +1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; +1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; +1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +20000;;Lo;0;L;;;;;N;;;;; +2A6D6;;Lo;0;L;;;;;N;;;;; +2A700;;Lo;0;L;;;;;N;;;;; +2B734;;Lo;0;L;;;;;N;;;;; +2B740;;Lo;0;L;;;;;N;;;;; +2B81D;;Lo;0;L;;;;;N;;;;; +2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; +2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; +2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; +2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; +2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; +2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; +2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; +2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; +2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; +2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; +2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; +2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; +2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; +2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; +2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; +2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; +2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; +2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; +2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; +2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; +2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; +2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; +2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; +2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; +2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; +2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; +2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; +2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; +2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; +2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; +2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; +2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; +2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; +2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; +2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; +2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; +2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; +2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; +2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; +2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; +2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; +2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; +2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; +2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; +2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; +2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; +2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; +2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; +2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; +2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; +2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; +2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; +2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; +2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; +2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; +2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; +2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; +2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; +2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; +2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; +2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; +2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; +2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; +2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; +2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; +2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; +2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; +2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; +2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; +2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; +2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; +2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; +2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; +2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; +2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; +2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; +2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; +2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; +2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; +2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; +2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; +2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; +2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; +2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; +2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; +2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; +2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; +2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; +2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; +2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; +2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; +2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; +2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; +2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; +2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; +2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; +2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; +2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; +2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; +2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; +2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; +2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; +2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; +2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; +2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; +2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; +2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; +2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; +2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; +2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; +2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; +2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; +2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; +2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; +2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; +2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; +2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; +2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; +2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; +2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; +2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; +2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; +2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; +2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; +2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; +2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; +2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; +2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; +2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; +2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; +2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; +2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; +2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; +2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; +2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; +2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; +2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; +2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; +2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; +2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; +2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; +2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; +2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; +2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; +2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; +2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; +2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; +2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; +2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; +2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; +2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; +2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; +2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; +2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; +2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; +2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; +2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; +2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; +2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; +2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; +2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; +2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; +2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; +2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; +2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; +2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; +2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; +2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; +2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; +2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; +2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; +2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; +2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; +2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; +2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; +2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; +2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; +2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; +2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; +2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; +2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; +2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; +2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; +2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; +2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; +2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; +2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; +2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; +2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; +2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; +2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; +2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; +2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; +2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; +2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; +2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; +2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; +2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; +2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; +2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; +2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; +2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; +2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; +2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; +2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; +2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; +2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; +2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; +2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; +2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; +2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; +2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; +2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; +2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; +2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; +2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; +2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; +2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; +2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; +2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; +2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; +2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; +2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; +2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; +2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; +2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; +2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; +2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; +2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; +2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; +2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; +2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; +2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; +2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; +2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; +2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; +2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; +2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; +2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; +2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; +2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; +2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; +2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; +2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; +2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; +2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; +2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; +2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; +2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; +2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; +2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; +2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; +2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; +2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; +2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; +2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; +2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; +2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; +2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; +2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; +2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; +2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; +2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; +2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; +2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; +2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; +2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; +2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; +2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; +2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; +2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; +2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; +2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; +2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; +2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; +2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; +2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; +2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; +2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; +2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; +2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; +2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; +2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; +2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; +2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; +2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; +2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; +2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; +2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; +2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; +2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; +2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; +2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; +2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; +2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; +2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; +2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; +2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; +2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; +2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; +2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; +2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; +2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; +2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; +2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; +2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; +2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; +2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; +2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; +2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; +2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; +2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; +2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; +2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; +2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; +2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; +2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; +2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; +2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; +2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; +2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; +2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; +2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; +2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; +2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; +2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; +2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; +2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; +2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; +2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; +2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; +2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; +2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; +2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; +2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; +2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; +2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; +2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; +2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; +2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; +2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; +2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; +2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; +2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; +2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; +2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; +2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; +2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; +2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; +2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; +2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; +2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; +2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; +2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; +2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; +2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; +2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; +2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; +2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; +2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; +2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; +2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; +2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; +2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; +2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; +2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; +2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; +2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; +2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; +2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; +2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; +2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; +2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; +2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; +2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; +2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; +2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; +2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; +2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; +2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; +2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; +2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; +2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; +2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; +2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; +2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; +2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; +2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; +2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; +2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; +2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; +2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; +2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; +2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; +2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; +2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; +2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; +2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; +2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; +2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; +2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; +2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; +2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; +2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; +2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; +2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; +2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; +2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; +2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; +2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; +2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; +2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; +2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; +2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; +2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; +2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; +2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; +2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; +2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; +2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; +2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; +2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; +2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; +2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; +2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; +2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; +2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; +2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; +2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; +2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; +2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; +2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; +2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; +2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; +2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; +2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; +2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; +2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; +2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; +2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; +2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; +2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; +2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; +2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; +2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; +2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; +2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; +2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; +2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; +2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; +2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; +2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; +2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; +2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; +2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; +2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; +2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; +2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; +2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; +2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; +2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; +2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; +2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; +2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; +2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; +2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; +2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; +2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; +2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; +2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; +2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; +2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; +2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; +2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; +2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; +2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; +2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; +2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; +2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; +2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; +2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; +2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; +2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; +2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; +2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; +2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; +2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; +2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; +2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; +2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; +2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; +2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; +2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; +2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; +2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; +2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; +2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; +2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; +2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; +2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; +2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; +2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; +2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; +2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; +2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; +2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; +2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; +2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; +2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; +2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; +2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; +2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; +2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; +2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; +2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; +2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; +2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; +2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; +2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; +2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; +2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; +2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; +2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; +2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; +2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; +2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; +2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; +2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; +2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; +2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; +2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; +2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; +2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; +2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; +2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; +2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; +2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; +2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; +2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; +2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; +2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; +2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; +E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; +E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; +E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; +E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; +E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; +E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; +E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; +E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; +E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; +E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; +E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; +E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; +E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; +E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; +E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; +E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; +E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; +E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; +E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; +E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; +E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; +E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; +E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; +E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; +E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; +E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; +E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; +E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; +E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; +E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; +E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; +E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; +E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; +E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; +E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; +E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; +E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; +E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; +E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; +E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; +E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; +E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; +E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; +E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; +E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; +E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; +E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; +E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; +E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; +E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; +E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; +E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; +E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; +E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; +E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; +E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; +E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; +E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; +E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; +E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; +E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; +E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; +E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; +E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; +E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; +E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; +E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; +E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; +E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; +E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; +E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; +E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; +E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; +E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; +E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; +E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; +E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; +E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; +E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; +E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; +E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; +E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; +E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; +E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; +E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; +E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; +E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; +E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; +E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; +E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; +E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; +E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; +E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; +E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; +E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; +E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; +E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; +E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; +E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; +E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; +E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; +E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; +E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; +E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; +E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; +E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; +E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; +E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; +E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; +E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; +E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; +E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; +E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; +E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; +E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; +E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; +E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; +E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; +E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; +E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; +E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; +E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; +E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; +E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; +E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; +E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; +E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; +E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; +E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; +E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; +E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; +E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; +E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; +E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; +E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; +E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; +E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; +E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; +E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; +E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; +E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; +E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; +E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; +E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; +E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; +E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; +E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; +E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; +E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; +E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; +E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; +E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; +E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; +E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; +E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; +E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; +E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; +E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; +E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; +E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; +E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; +E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; +E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; +E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; +E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; +E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; +E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; +E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; +E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; +E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; +E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; +E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; +E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; +E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; +E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; +E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; +E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; +E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; +E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; +E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; +E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; +E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; +E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; +E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; +E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; +E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; +E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; +E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; +E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; +E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; +E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; +E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; +E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; +E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; +E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; +E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; +E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; +E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; +E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; +E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; +E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; +E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; +E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; +E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; +E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; +E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; +E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; +E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; +E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; +E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; +E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; +E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; +E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; +E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; +E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; +E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; +E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; +E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; +E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; +E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; +E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; +E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; +E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; +E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; +E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; +E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; +E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; +E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; +E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; +E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; +E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; +E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; +E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; +E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; +E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; +E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; +E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; +E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; +E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; +E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; +E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; +E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; +E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; +E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; +E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; +E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; +E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; +E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; +E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; +E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; +E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; +E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; +E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; +E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; +E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; +E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; +E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; +E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; +E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; +E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; +E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; +E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; +E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; +E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; +E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; +E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; +E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; +E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; +E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; +E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; +E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; +E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; +E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; +E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; +E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; +E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; +E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; +E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; +E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; +E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; +E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; +E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; +E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; +E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; +E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; +E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; +E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; +E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; +E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; +E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; +E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; +E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; +E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; +E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; +E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; +E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; +E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; +E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; +E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; +E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; +E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; +E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; +E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; +E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; +E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; +E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; +E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; +E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; +E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; +E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; +E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; +E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; +E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; +E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; +E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; +E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; +E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; +E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; +E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; +E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; +E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; +E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; +E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; +E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; +E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; +E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; +E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; +E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; +E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; +E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; +E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; +E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; +F0000;;Co;0;L;;;;;N;;;;; +FFFFD;;Co;0;L;;;;;N;;;;; +100000;;Co;0;L;;;;;N;;;;; +10FFFD;;Co;0;L;;;;;N;;;;; diff --git a/unicode/unicode-copyright.txt b/unicode/unicode-copyright.txt new file mode 100644 index 0000000000..1a7f162552 --- /dev/null +++ b/unicode/unicode-copyright.txt @@ -0,0 +1,47 @@ +The files Blocks.txt and UnicodeData.txt in this directory were +retrieved from the following URLs on Saturday, February 7, 2015. + +http://www.unicode.org/Public/7.0.0/ucd/Blocks.txt +http://www.unicode.org/Public/7.0.0/ucd/UnicodeData.txt + +The below copyright notice applies to these files. + +======================================================================== + +COPYRIGHT AND PERMISSION NOTICE + +Copyright © 1991-2015 Unicode, Inc. All rights reserved. +Distributed under the Terms of Use in +http://www.unicode.org/copyright.html. + +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Unicode data files and any associated documentation +(the "Data Files") or Unicode software and any associated documentation +(the "Software") to deal in the Data Files or Software +without restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, and/or sell copies of +the Data Files or Software, and to permit persons to whom the Data Files +or Software are furnished to do so, provided that +(a) this copyright and permission notice appear with all copies +of the Data Files or Software, +(b) this copyright and permission notice appear in associated +documentation, and +(c) there is clear notice in each modified Data File or in the Software +as well as in the documentation associated with the Data File(s) or +Software that the data or software has been modified. + +THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF +ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE +WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT OF THIRD PARTY RIGHTS. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS +NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL +DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, +DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER +TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR +PERFORMANCE OF THE DATA FILES OR SOFTWARE. + +Except as contained in this notice, the name of a copyright holder +shall not be used in advertising or otherwise to promote the sale, +use or other dealings in these Data Files or Software without prior +written authorization of the copyright holder. \ No newline at end of file From eb42bc51fbb15c3faf3e1a8b59aa695c75c9f035 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 11:28:40 -0800 Subject: [PATCH 0434/1838] CodePointFilter parameterless ctor should be empty, not Basic Latin --- src/Microsoft.Framework.WebEncoders/CodePointFilter.cs | 3 +-- src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs | 2 +- .../JavaScriptStringEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders/UrlEncoder.cs | 2 +- .../CodePointFilterTests.cs | 8 ++------ 5 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index 7fd1201b4b..1fee0fbf1b 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -15,12 +15,11 @@ namespace Microsoft.Framework.WebEncoders private AllowedCharsBitmap _allowedCharsBitmap; /// - /// Instantiates the filter allowing only the 'Basic Latin' block of characters through. + /// Instantiates an empty filter. /// public CodePointFilter() { _allowedCharsBitmap = new AllowedCharsBitmap(); - AllowBlock(UnicodeBlocks.BasicLatin); } /// diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 20a504d38d..bea418b83f 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -120,7 +120,7 @@ namespace Microsoft.Framework.WebEncoders HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new HtmlUnicodeEncoder(new CodePointFilter()); + encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index eb6ba16dae..3779c32801 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -124,7 +124,7 @@ namespace Microsoft.Framework.WebEncoders JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter()); + encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index d3c66a26b3..4497939c71 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -163,7 +163,7 @@ namespace Microsoft.Framework.WebEncoders UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new UrlUnicodeEncoder(new CodePointFilter()); + encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs index e0dfbfb92a..e2fdf8dd7b 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -11,17 +11,13 @@ namespace Microsoft.Framework.WebEncoders public class CodePointFilterTests { [Fact] - public void Ctor_Parameterless_DefaultsToBasicLatin() + public void Ctor_Parameterless_CreatesEmptyFilter() { // Act var filter = new CodePointFilter(); // Assert - for (int i = 0; i <= 0x007F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0080; i <= Char.MaxValue; i++) + for (int i = 0; i <= Char.MaxValue; i++) { Assert.False(filter.IsCharacterAllowed((char)i)); } From 6bf5eabd9f862b1052743268f3fb576908d674b9 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 27 Feb 2015 11:29:38 -0800 Subject: [PATCH 0435/1838] Hosting API review # 2 1. Moving HostingUtilities and PipelineInstance into internal namespaces. 2. Renaming some properties in IHostingEnvironment 3. Renaming IHttpContextAccessor HttpContext into Value. Addresses: https://github.com/aspnet/Hosting/issues/159 https://github.com/aspnet/Hosting/issues/157 https://github.com/aspnet/Hosting/issues/161 --- .../IHostingEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 1 + src/Microsoft.AspNet.Hosting/HostingEnvironment.cs | 9 +++++---- .../{ => Internal}/HostingUtilities.cs | 2 +- .../{ => Internal}/PipelineInstance.cs | 2 +- src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs | 1 + src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- .../Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- .../HostingUtilitiesTests.cs | 1 + test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 10 files changed, 15 insertions(+), 11 deletions(-) rename src/Microsoft.AspNet.Hosting/{ => Internal}/HostingUtilities.cs (97%) rename src/Microsoft.AspNet.Hosting/{ => Internal}/PipelineInstance.cs (96%) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs index c946e5d3ff..c38028a604 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs @@ -9,8 +9,8 @@ namespace Microsoft.AspNet.Hosting { string EnvironmentName { get; set; } - string WebRoot { get; } + string WebRootPath { get; } - IFileProvider WebRootFileProvider { get; set; } + IFileProvider WebRootFileProvider { get; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 930b5d1851..1970e48bef 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 47d805f99b..03a7317453 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FileProviders; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -14,8 +15,8 @@ namespace Microsoft.AspNet.Hosting public HostingEnvironment(IApplicationEnvironment appEnvironment, IEnumerable configures) { EnvironmentName = DefaultEnvironmentName; - WebRoot = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); - WebRootFileProvider = new PhysicalFileProvider(WebRoot); + WebRootPath = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); + WebRootFileProvider = new PhysicalFileProvider(WebRootPath); foreach (var configure in configures) { configure.Configure(this); @@ -24,8 +25,8 @@ namespace Microsoft.AspNet.Hosting public string EnvironmentName { get; set; } - public string WebRoot { get; private set; } + public string WebRootPath { get; private set; } - public IFileProvider WebRootFileProvider { get; set; } + public IFileProvider WebRootFileProvider { get; private set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs similarity index 97% rename from src/Microsoft.AspNet.Hosting/HostingUtilities.cs rename to src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs index 5b90b251a2..7b48d72b8f 100644 --- a/src/Microsoft.AspNet.Hosting/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs @@ -6,7 +6,7 @@ using System.IO; using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNet.Hosting.Internal { public static class HostingUtilities { diff --git a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs similarity index 96% rename from src/Microsoft.AspNet.Hosting/PipelineInstance.cs rename to src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs index 3d14ee404c..9b8a84ca4b 100644 --- a/src/Microsoft.AspNet.Hosting/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs @@ -7,7 +7,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Builder; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNet.Hosting.Internal { public class PipelineInstance : IDisposable { diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index 9354eff0a8..a11f8011e5 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -4,6 +4,7 @@ using System; using System.Linq; using System.Reflection; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Server diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index f95de3279a..165e5a7da4 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -92,7 +92,7 @@ namespace Microsoft.AspNet.Hosting.Startup { if (string.IsNullOrEmpty(applicationName)) { - throw new ArgumentException("applicationName"); + throw new ArgumentException("Value cannot be null or empty.", "applicationName"); } var assembly = Assembly.Load(new AssemblyName(applicationName)); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 2af5628080..99be47cbf7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Hosting { var services = HostingServices.Create().BuildServiceProvider(); var env = services.GetRequiredService(); - Assert.Equal(Path.GetFullPath("testroot"), env.WebRoot); + Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs index 08daee6c9b..06cf95333b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.AspNet.Hosting.Internal; using Xunit; namespace Microsoft.AspNet.Hosting.Tests diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 0a31db1b21..8d52493b27 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.TestHost TestServer server = TestServer.Create(app => { var env = app.ApplicationServices.GetRequiredService(); - Assert.Equal(Directory.GetCurrentDirectory(), env.WebRoot); + Assert.Equal(Directory.GetCurrentDirectory(), env.WebRootPath); }); } From a1dbce90652bb017b82b272d6cb2d20adbfbee20 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 12:55:55 -0800 Subject: [PATCH 0436/1838] Rename AddEncoders -> AddWebEncoders --- .../EncoderServiceCollectionExtensions.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 9b8a84b98e..44bc002053 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -10,12 +10,12 @@ namespace Microsoft.Framework.DependencyInjection { public static class EncoderServiceCollectionExtensions { - public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services) + public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services) { - return AddEncoders(services, configuration: null); + return AddWebEncoders(services, configuration: null); } - public static IServiceCollection AddEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) { services.AddOptions(configuration); services.TryAdd(EncoderServices.GetDefaultServices(configuration)); From 04707ccaa00c31967208aa076a7a59aac45e3283 Mon Sep 17 00:00:00 2001 From: Levi B Date: Fri, 27 Feb 2015 14:15:41 -0800 Subject: [PATCH 0437/1838] Add unit tests for the service provider extensions --- .../EncoderServiceCollectionExtensions.cs | 13 ++- .../EncoderServices.cs | 10 +- ...EncoderOptions.cs => WebEncoderOptions.cs} | 2 +- .../project.json | 1 - .../CommonTestEncoder.cs | 103 ++++++++++++++++++ ...EncoderServiceCollectionExtensionsTests.cs | 88 +++++++++++++++ .../EncoderServiceProviderExtensionsTests.cs | 97 +++++++++++++++++ 7 files changed, 299 insertions(+), 15 deletions(-) rename src/Microsoft.Framework.WebEncoders/{EncoderOptions.cs => WebEncoderOptions.cs} (94%) create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 44bc002053..aae3ffbcf2 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; @@ -12,13 +11,17 @@ namespace Microsoft.Framework.DependencyInjection { public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services) { - return AddWebEncoders(services, configuration: null); + return AddWebEncoders(services, configureOptions: null); } - public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, IConfiguration configuration) + public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, Action configureOptions) { - services.AddOptions(configuration); - services.TryAdd(EncoderServices.GetDefaultServices(configuration)); + services.AddOptions(); + services.TryAdd(EncoderServices.GetDefaultServices()); + if (configureOptions != null) + { + services.Configure(configureOptions); + } return services; } } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs index 0b9d6820d3..0f90180228 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -13,12 +12,7 @@ namespace Microsoft.Framework.WebEncoders { public static IEnumerable GetDefaultServices() { - return GetDefaultServices(configuration: null); - } - - public static IEnumerable GetDefaultServices(IConfiguration configuration) - { - var describe = new ServiceDescriber(configuration); + var describe = new ServiceDescriber(); // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching @@ -31,7 +25,7 @@ namespace Microsoft.Framework.WebEncoders { return serviceProvider => { - var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; + var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); }; } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs b/src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs similarity index 94% rename from src/Microsoft.Framework.WebEncoders/EncoderOptions.cs rename to src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs index e2547359cf..a172ca954c 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderOptions.cs +++ b/src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs @@ -8,7 +8,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). /// - public sealed class EncoderOptions + public sealed class WebEncoderOptions { /// /// Specifies which code points are allowed to be represented unescaped by the encoders. diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 15a2417f33..34f87f5fe2 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,7 +5,6 @@ "allowUnsafe": true }, "dependencies": { - "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs new file mode 100644 index 0000000000..0d38957303 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs @@ -0,0 +1,103 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Dummy encoder used for unit testing. + /// + public sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder + { + /// + /// Returns "HtmlEncode[[value]]". + /// + public string HtmlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "JavaScriptStringEncode[[value]]". + /// + public string JavaScriptStringEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "UrlEncode[[value]]". + /// + public string UrlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) + { + return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); + } + + private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); + } + + private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs new file mode 100644 index 0000000000..41ab636a64 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -0,0 +1,88 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.DependencyInjection.Fallback; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderServiceCollectionExtensionsTests + { + [Fact] + public void AddWebEncoders_WithoutOptions_RegistersDefaultEncoders() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act + serviceCollection.AddWebEncoders(); + + // Assert + var serviceProvider = serviceCollection.BuildServiceProvider(); + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + } + + [Fact] + public void AddWebEncoders_WithOptions_RegistersEncodersWithCustomCodeFilter() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act + serviceCollection.AddWebEncoders(options => + { + options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + }); + + // Assert + var serviceProvider = serviceCollection.BuildServiceProvider(); + + var htmlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("abcde", htmlEncoder.HtmlEncode("abcde")); + Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + + var javaScriptStringEncoder = serviceProvider.GetRequiredService(); + Assert.Equal(@"a\u0062c\u0064e", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); + Assert.Same(javaScriptStringEncoder, serviceProvider.GetRequiredService()); // as singleton instance + + var urlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); + Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + } + + [Fact] + public void AddWebEncoders_DoesNotOverrideExistingRegisteredEncoders() + { + // Arrange + var serviceCollection = new ServiceCollection(); + + // Act + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + // we don't register an existing URL encoder + serviceCollection.AddWebEncoders(options => + { + options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + }); + + // Assert + var serviceProvider = serviceCollection.BuildServiceProvider(); + + var htmlEncoder = serviceProvider.GetHtmlEncoder(); + Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.HtmlEncode("abcde")); + + var javaScriptStringEncoder = serviceProvider.GetJavaScriptStringEncoder(); + Assert.Equal("JavaScriptStringEncode[[abcde]]", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); + + var urlEncoder = serviceProvider.GetUrlEncoder(); + Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs new file mode 100644 index 0000000000..3a6b144b29 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -0,0 +1,97 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Moq; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class EncoderServiceProviderExtensionsTests + { + [Fact] + public void GetHtmlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + { + // Arrange + var serviceProvider = new Mock().Object; + + // Act + var retVal = serviceProvider.GetHtmlEncoder(); + + // Assert + Assert.Same(HtmlEncoder.Default, retVal); + } + + [Fact] + public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + { + // Arrange + var expectedEncoder = new Mock().Object; + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(o => o.GetService(typeof(IHtmlEncoder))).Returns(expectedEncoder); + + // Act + var retVal = mockServiceProvider.Object.GetHtmlEncoder(); + + // Assert + Assert.Same(expectedEncoder, retVal); + } + + [Fact] + public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + { + // Arrange + var serviceProvider = new Mock().Object; + + // Act + var retVal = serviceProvider.GetJavaScriptStringEncoder(); + + // Assert + Assert.Same(JavaScriptStringEncoder.Default, retVal); + } + + [Fact] + public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + { + // Arrange + var expectedEncoder = new Mock().Object; + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(o => o.GetService(typeof(IJavaScriptStringEncoder))).Returns(expectedEncoder); + + // Act + var retVal = mockServiceProvider.Object.GetJavaScriptStringEncoder(); + + // Assert + Assert.Same(expectedEncoder, retVal); + } + + [Fact] + public void GetUrlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + { + // Arrange + var serviceProvider = new Mock().Object; + + // Act + var retVal = serviceProvider.GetUrlEncoder(); + + // Assert + Assert.Same(UrlEncoder.Default, retVal); + } + + [Fact] + public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + { + // Arrange + var expectedEncoder = new Mock().Object; + var mockServiceProvider = new Mock(); + mockServiceProvider.Setup(o => o.GetService(typeof(IUrlEncoder))).Returns(expectedEncoder); + + // Act + var retVal = mockServiceProvider.Object.GetUrlEncoder(); + + // Assert + Assert.Same(expectedEncoder, retVal); + } + } +} From ba2c06072e39a2e21e1f34a0e048e35266f16e61 Mon Sep 17 00:00:00 2001 From: "Anthony W. Juckel" Date: Sat, 28 Feb 2015 01:18:27 -0600 Subject: [PATCH 0438/1838] Remove space from ISignOutContext filename --- .../Security/{ISignOutContext .cs => ISignOutContext.cs} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/Microsoft.AspNet.Http.Interfaces/Security/{ISignOutContext .cs => ISignOutContext.cs} (100%) diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext .cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs From 16c8d51d0b2cf0b35342b430fd77392eb59cbc9a Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Sun, 1 Mar 2015 22:55:27 -0800 Subject: [PATCH 0439/1838] Fixes #76 - improve error messages in Hosting Removed the TODOs from messages, and generally made them more readable. --- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- .../Server/ServerLoader.cs | 8 ++-- .../Startup/StartupLoader.cs | 42 ++++++++++--------- ...StartupWithConfigureServicesNotResolved.cs | 18 ++++++++ .../StartupManagerTests.cs | 20 ++++++++- 5 files changed, 65 insertions(+), 25 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index db44580208..d050fbf10c 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Hosting catch (Exception ex) { var logger = loggerFactory.Create(); - logger.WriteError("TODO: Dispose threw an exception", ex); + logger.WriteError("Dispose threw an exception.", ex); } shutdownHandle.Set(); }); diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index a11f8011e5..fd7c9a41ea 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Hosting.Server var assembly = Assembly.Load(new AssemblyName(assemblyName)); if (assembly == null) { - throw new Exception(String.Format("TODO: assembly {0} failed to load message", assemblyName)); + throw new Exception(string.Format("The assembly {0} failed to load.", assemblyName)); } Type type = null; @@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Hosting.Server if (type == null) { - throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "")); + throw new Exception(string.Format("The type {0} failed to load.", typeName ?? "")); } } else @@ -59,14 +59,14 @@ namespace Microsoft.AspNet.Hosting.Server if (type == null) { - throw new Exception(String.Format("TODO: type {0} failed to load message", typeName ?? "")); + throw new Exception(String.Format("The type {0} failed to load.", typeName ?? "")); } interfaceInfo = type.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory))); if (interfaceInfo == null) { - throw new Exception("TODO: IServerFactory interface not found"); + throw new Exception(string.Format("The type '{0}' does not implement the '{1}' interface.", type, typeof(IServerFactory).FullName)); } } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 165e5a7da4..ba6c013f12 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -31,9 +31,10 @@ namespace Microsoft.AspNet.Hosting.Startup { if (required) { - throw new Exception(string.Format("TODO: {0} or {1} method not found", + throw new Exception(string.Format("A method named '{0}' or '{1}' in the type '{2}' could not be found.", methodNameWithEnv, - methodNameWithNoEnv)); + methodNameWithNoEnv, + startupType.FullName)); } return null; @@ -42,8 +43,10 @@ namespace Microsoft.AspNet.Hosting.Startup { if (required) { - throw new Exception(string.Format("TODO: {0} method does not return " + returnType.Name, - methodInfo.Name)); + throw new Exception(string.Format("The '{0}' method in the type '{1}' must have a return type of '{2}'.", + methodInfo.Name, + startupType.FullName, + returnType.Name)); } return null; } @@ -75,10 +78,11 @@ namespace Microsoft.AspNet.Hosting.Startup catch (Exception) { throw new Exception(string.Format( - "TODO: Unable to resolve service for {0} method {1} {2}", - methodInfo.Name, + "Could not resolve a service of type '{0}' for the parameter '{1}' of method '{2}' on type '{3}'.", + parameterInfo.ParameterType.FullName, parameterInfo.Name, - parameterInfo.ParameterType.FullName)); + methodInfo.Name, + methodInfo.DeclaringType.FullName)); } } } @@ -98,26 +102,26 @@ namespace Microsoft.AspNet.Hosting.Startup var assembly = Assembly.Load(new AssemblyName(applicationName)); if (assembly == null) { - throw new Exception(String.Format("TODO: assembly {0} failed to load message", applicationName)); + throw new Exception(String.Format("The assembly '{0}' failed to load.", applicationName)); } - var startupName1 = "Startup" + environmentName; - var startupName2 = "Startup"; + var startupNameWithEnv = "Startup" + environmentName; + var startupNameWithoutEnv = "Startup"; // Check the most likely places first var type = - assembly.GetType(startupName1) ?? - assembly.GetType(applicationName + "." + startupName1) ?? - assembly.GetType(startupName2) ?? - assembly.GetType(applicationName + "." + startupName2); + assembly.GetType(startupNameWithEnv) ?? + assembly.GetType(applicationName + "." + startupNameWithEnv) ?? + assembly.GetType(startupNameWithoutEnv) ?? + assembly.GetType(applicationName + "." + startupNameWithoutEnv); if (type == null) { // Full scan var definedTypes = assembly.DefinedTypes.ToList(); - var startupType1 = definedTypes.Where(info => info.Name.Equals(startupName1, StringComparison.Ordinal)); - var startupType2 = definedTypes.Where(info => info.Name.Equals(startupName2, StringComparison.Ordinal)); + var startupType1 = definedTypes.Where(info => info.Name.Equals(startupNameWithEnv, StringComparison.Ordinal)); + var startupType2 = definedTypes.Where(info => info.Name.Equals(startupNameWithoutEnv, StringComparison.Ordinal)); var typeInfo = startupType1.Concat(startupType2).FirstOrDefault(); if (typeInfo != null) @@ -128,9 +132,9 @@ namespace Microsoft.AspNet.Hosting.Startup if (type == null) { - throw new Exception(String.Format("TODO: {0} or {1} class not found in assembly {2}", - startupName1, - startupName2, + throw new Exception(String.Format("A type named '{0}' or '{1}' could not be found in assembly '{2}'.", + startupNameWithEnv, + startupNameWithoutEnv, applicationName)); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs new file mode 100644 index 0000000000..8679e62093 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupWithConfigureServicesNotResolved + { + public StartupWithConfigureServicesNotResolved() + { + } + + public void Configure(IApplicationBuilder builder, int notAService) + { + } + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 188333960a..db19ddc403 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -114,7 +114,25 @@ namespace Microsoft.AspNet.Hosting.Tests var diagnosticMessages = new List(); var ex = Assert.Throws(() => loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); - Assert.True(ex.Message.Contains("ConfigureBoom or Configure method not found")); + Assert.Equal("A method named 'ConfigureBoom' or 'Configure' in the type 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' could not be found.", ex.Message); + } + + [Fact] + public void StartupWithConfigureServicesNotResolvedThrows() + { + var serviceCollection = HostingServices.Create(); + var services = serviceCollection.BuildServiceProvider(); + var loader = services.GetRequiredService(); + var diagnosticMessages = new List(); + + var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithConfigureServicesNotResolved", diagnosticMessages); + + + var app = new ApplicationBuilder(services); + + var ex = Assert.Throws(() => startup.Invoke(app)); + + Assert.Equal("Could not resolve a service of type 'System.Int32' for the parameter 'notAService' of method 'Configure' on type 'Microsoft.AspNet.Hosting.Fakes.StartupWithConfigureServicesNotResolved'.", ex.Message); } [Fact] From d6535eeba0511723ed484e91ab985769845d841e Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 2 Mar 2015 10:38:37 -0800 Subject: [PATCH 0440/1838] Rename IHttpContextAccessor.Value to IHttpContextAccessor.HttpContext Fixes: https://github.com/aspnet/Hosting/issues/160 --- src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs | 4 ++-- src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs | 2 +- src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs index 4507d384cf..59b5cbd8fa 100644 --- a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting #if ASPNET50 private const string LogicalDataKey = "__HttpContext_Current__"; - public HttpContext Value + public HttpContext HttpContext { get { @@ -32,7 +32,7 @@ namespace Microsoft.AspNet.Hosting #elif ASPNETCORE50 private AsyncLocal _httpContextCurrent = new AsyncLocal(); - public HttpContext Value + public HttpContext HttpContext { get { diff --git a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs index 563808d7f8..8b1719880b 100644 --- a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs @@ -7,6 +7,6 @@ namespace Microsoft.AspNet.Hosting { public interface IHttpContextAccessor { - HttpContext Value { get; set; } + HttpContext HttpContext { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs index 9b8a84ca4b..b2f67c2eca 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Hosting.Internal public Task Invoke(IFeatureCollection featureCollection) { var httpContext = _httpContextFactory.CreateHttpContext(featureCollection); - _contextAccessor.Value = httpContext; + _contextAccessor.HttpContext = httpContext; return _requestDelegate(httpContext); } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 8d52493b27..9838e1d0b3 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.TestHost app.Run(context => { var accessor = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("HasContext:"+(accessor.Value != null)); + return context.Response.WriteAsync("HasContext:"+(accessor.HttpContext != null)); }); }); From de1e8763dd3fbd4ca94aa44171aa34741c536c66 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 2 Mar 2015 15:25:52 -0800 Subject: [PATCH 0441/1838] Security -> Authentication AuthN renames and design changes --- .../AuthenticateContext.cs | 26 ++++---- .../ChallengeContext.cs | 13 ++-- .../DescribeSchemesContext.cs} | 11 ++-- .../HttpAuthenticationFeature.cs | 4 +- .../Authentication/SignInContext.cs | 38 ++++++++++++ .../Authentication/SignOutContext.cs | 31 ++++++++++ .../DefaultHttpContext.cs | 37 ++++++------ .../DefaultHttpResponse.cs | 37 +++++------- .../Security/SignInContext.cs | 36 ----------- .../Security/SignOutContext.cs | 32 ---------- .../Security/IAuthenticateContext.cs | 8 +-- .../Security/IAuthenticationHandler.cs | 4 +- .../Security/IChallengeContext.cs | 4 +- ...eContext.cs => IDescribeSchemesContext.cs} | 4 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- .../Security/ISignInContext.cs | 8 ++- .../Security/ISignOutContext.cs | 8 +-- .../AuthenticateResult.cs | 17 ++---- .../AuthenticationDescription.cs | 10 ++-- .../AuthenticationProperties.cs | 2 +- src/Microsoft.AspNet.Http/HttpContext.cs | 16 ++--- src/Microsoft.AspNet.Http/HttpResponse.cs | 60 +++++-------------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +- .../OwinFeatureCollection.cs | 2 +- .../DefaultHttpContextTests.cs | 59 ++++++++++++++++-- 25 files changed, 238 insertions(+), 235 deletions(-) rename src/Microsoft.AspNet.Http.Core/{Security => Authentication}/AuthenticateContext.cs (50%) rename src/Microsoft.AspNet.Http.Core/{Security => Authentication}/ChallengeContext.cs (72%) rename src/Microsoft.AspNet.Http.Core/{Security/AuthTypeContext.cs => Authentication/DescribeSchemesContext.cs} (72%) rename src/Microsoft.AspNet.Http.Core/{Security => Authentication}/HttpAuthenticationFeature.cs (83%) create mode 100644 src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs create mode 100644 src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs rename src/Microsoft.AspNet.Http.Interfaces/Security/{IAuthTypeContext.cs => IDescribeSchemesContext.cs} (73%) rename src/Microsoft.AspNet.Http/{Security => Authentication}/AuthenticateResult.cs (72%) rename src/Microsoft.AspNet.Http/{Security => Authentication}/AuthenticationDescription.cs (86%) rename src/Microsoft.AspNet.Http/{Security => Authentication}/AuthenticationProperties.cs (99%) diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs similarity index 50% rename from src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 95dd14a8d2..938722725e 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -1,30 +1,26 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; -using System.Linq; using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { public class AuthenticateContext : IAuthenticateContext { private List _results; private List _accepted; - public AuthenticateContext([NotNull] IEnumerable authenticationTypes) + public AuthenticateContext([NotNull] IEnumerable authenticationSchemes) { - AuthenticationTypes = authenticationTypes; + AuthenticationSchemes = authenticationSchemes; _results = new List(); _accepted = new List(); } - public IEnumerable AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationSchemes { get; private set; } public IEnumerable Results { @@ -36,16 +32,16 @@ namespace Microsoft.AspNet.Http.Core.Security get { return _accepted; } } - public void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description) + public void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - _accepted.Add(descrip.AuthenticationType); // may not match identity.AuthType - _results.Add(new AuthenticationResult(identity, new AuthenticationProperties(properties), descrip)); + _accepted.Add(descrip.AuthenticationScheme); // may not match identity.AuthType + _results.Add(new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip)); } - public void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description) + public void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description) { - _accepted.Add(authenticationType); + _accepted.Add(authenticationScheme); } } } diff --git a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs similarity index 72% rename from src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index aa9a424fc4..db2efec1af 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -3,25 +3,22 @@ using System; using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { public class ChallengeContext : IChallengeContext { private List _accepted; - public ChallengeContext([NotNull] IEnumerable authenticationTypes, IDictionary properties) + public ChallengeContext([NotNull] IEnumerable authenticationSchemes, IDictionary properties) { - AuthenticationTypes = authenticationTypes; + AuthenticationSchemes = authenticationSchemes; Properties = properties ?? new Dictionary(StringComparer.Ordinal); _accepted = new List(); } - public IEnumerable AuthenticationTypes { get; private set; } + public IEnumerable AuthenticationSchemes { get; private set; } public IDictionary Properties { get; private set; } diff --git a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs similarity index 72% rename from src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs index df792fc74f..419d4d930f 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/AuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs @@ -1,18 +1,17 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Interfaces.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { - public class AuthTypeContext : IAuthTypeContext + public class DescribeSchemesContext : IDescribeSchemesContext { private List _results; - public AuthTypeContext() + public DescribeSchemesContext() { _results = new List(); } diff --git a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs similarity index 83% rename from src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs index f0989c420c..4c3071e7b9 100644 --- a/src/Microsoft.AspNet.Http.Core/Security/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; -namespace Microsoft.AspNet.Http.Core.Security +namespace Microsoft.AspNet.Http.Core.Authentication { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs new file mode 100644 index 0000000000..1738456e03 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.AspNet.Http.Interfaces.Authentication; + +namespace Microsoft.AspNet.Http.Core.Authentication +{ + public class SignInContext : ISignInContext + { + private bool _accepted; + + public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary dictionary) + { + AuthenticationScheme = authenticationScheme; + Principal = principal; + Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + } + + public ClaimsPrincipal Principal { get; } + + public IDictionary Properties { get; } + + public string AuthenticationScheme { get; } + + public bool Accepted + { + get { return _accepted; } + } + + public void Accept(IDictionary description) + { + _accepted = true; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs new file mode 100644 index 0000000000..200a348f03 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http.Interfaces.Authentication; + +namespace Microsoft.AspNet.Http.Core.Authentication +{ + public class SignOutContext : ISignOutContext + { + private bool _accepted; + + public SignOutContext(string authenticationScheme) + { + AuthenticationScheme = authenticationScheme; + } + + public string AuthenticationScheme { get; } + + public bool Accepted + { + get { return _accepted; } + } + + public void Accept() + { + _accepted = true; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 2de1680de3..4b91833cca 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -9,14 +9,13 @@ using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Security; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Security; +using Microsoft.AspNet.Http.Core.Authentication; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core { @@ -201,7 +200,7 @@ namespace Microsoft.AspNet.Http.Core _features[type] = instance; } - public override IEnumerable GetAuthenticationTypes() + public override IEnumerable GetAuthenticationSchemes() { var handler = HttpAuthenticationFeature.Handler; if (handler == null) @@ -209,46 +208,46 @@ namespace Microsoft.AspNet.Http.Core return new AuthenticationDescription[0]; } - var authTypeContext = new AuthTypeContext(); - handler.GetDescriptions(authTypeContext); - return authTypeContext.Results; + var describeContext = new DescribeSchemesContext(); + handler.GetDescriptions(describeContext); + return describeContext.Results; } - public override IEnumerable Authenticate([NotNull] IEnumerable authenticationTypes) + public override IEnumerable Authenticate([NotNull] IEnumerable authenticationSchemes) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationTypes); + var authenticateContext = new AuthenticateContext(authenticationSchemes); if (handler != null) { handler.Authenticate(authenticateContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); + IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; } - public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationTypes) + public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationSchemes) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationTypes); + var authenticateContext = new AuthenticateContext(authenticationSchemes); if (handler != null) { await handler.AuthenticateAsync(authenticateContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(authenticateContext.Accepted); + IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); if (leftovers.Any()) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); } return authenticateContext.Results; @@ -264,4 +263,4 @@ namespace Microsoft.AspNet.Http.Core return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } ); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 7e44614704..13cecb1eee 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -6,17 +6,14 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Claims; -using System.Text; -using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Security; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Security; +using Microsoft.AspNet.Http.Core.Authentication; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core { @@ -129,58 +126,56 @@ namespace Microsoft.AspNet.Http.Core Headers.Set(Constants.Headers.Location, location); } - public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationTypes) + public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationSchemes) { HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationTypes, properties == null ? null : properties.Dictionary); + var challengeContext = new ChallengeContext(authenticationSchemes, properties == null ? null : properties.Dictionary); if (handler != null) { handler.Challenge(challengeContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(challengeContext.Accepted); + IEnumerable leftovers = authenticationSchemes.Except(challengeContext.Accepted); if (leftovers.Any()) { throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); } } - public override void SignIn(AuthenticationProperties properties, [NotNull] IEnumerable identities) + public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; - var signInContext = new SignInContext(identities, properties == null ? null : properties.Dictionary); + var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); if (handler != null) { handler.SignIn(signInContext); } // Verify all types ack'd - IEnumerable leftovers = identities.Select(identity => identity.AuthenticationType).Except(signInContext.Accepted); - if (leftovers.Any()) + if (!signInContext.Accepted) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } } - public override void SignOut([NotNull] IEnumerable authenticationTypes) + public override void SignOut(string authenticationScheme) { var handler = HttpAuthenticationFeature.Handler; - var signOutContext = new SignOutContext(authenticationTypes); + var signOutContext = new SignOutContext(authenticationScheme); if (handler != null) { handler.SignOut(signOutContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationTypes.Except(signOutContext.Accepted); - if (leftovers.Any()) + if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } } } diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs deleted file mode 100644 index 0e9383e97c..0000000000 --- a/src/Microsoft.AspNet.Http.Core/Security/SignInContext.cs +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Security; - -namespace Microsoft.AspNet.Http.Core.Security -{ - public class SignInContext : ISignInContext - { - private List _accepted; - - public SignInContext([NotNull] IEnumerable identities, IDictionary dictionary) - { - Identities = identities; - Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); - _accepted = new List(); - } - - public IEnumerable Identities { get; private set; } - - public IDictionary Properties { get; private set; } - - public IEnumerable Accepted - { - get { return _accepted; } - } - - public void Accept(string authenticationType, IDictionary description) - { - _accepted.Add(authenticationType); - } - } -} diff --git a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs deleted file mode 100644 index c2ed25f04a..0000000000 --- a/src/Microsoft.AspNet.Http.Core/Security/SignOutContext.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces.Security; - -namespace Microsoft.AspNet.Http.Core.Security -{ - public class SignOutContext : ISignOutContext - { - private List _accepted; - - public SignOutContext([NotNull] IEnumerable authenticationTypes) - { - AuthenticationTypes = authenticationTypes; - _accepted = new List(); - } - - public IEnumerable AuthenticationTypes { get; private set; } - - public IEnumerable Accepted - { - get { return _accepted; } - } - - public void Accept(string authenticationType, IDictionary description) - { - _accepted.Add(authenticationType); - } - } -} diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 3e09a1aa5e..86a1b7add1 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -4,14 +4,14 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IAuthenticateContext { - IEnumerable AuthenticationTypes { get; } + IEnumerable AuthenticationSchemes { get; } - void Authenticated(ClaimsIdentity identity, IDictionary properties, IDictionary description); + void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description); - void NotAuthenticated(string authenticationType, IDictionary properties, IDictionary description); + void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index 32ed5f2cf8..856433f41a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -3,11 +3,11 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IAuthenticationHandler { - void GetDescriptions(IAuthTypeContext context); + void GetDescriptions(IDescribeSchemesContext context); void Authenticate(IAuthenticateContext context); Task AuthenticateAsync(IAuthenticateContext context); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index cb44dc300b..602d1eead3 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -3,11 +3,11 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IChallengeContext { - IEnumerable AuthenticationTypes {get;} + IEnumerable AuthenticationSchemes {get;} IDictionary Properties {get;} void Accept(string authenticationType, IDictionary description); diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs similarity index 73% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs index ef952847b0..7b06b47a6f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthTypeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs @@ -3,9 +3,9 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { - public interface IAuthTypeContext + public interface IDescribeSchemesContext { void Accept(IDictionary description); } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index 183ebe9d2f..be9ffb4e22 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index c6d1b4efc0..ee6603be66 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -4,13 +4,15 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface ISignInContext { - IEnumerable Identities { get; } + //IEnumerable Principals { get; } + ClaimsPrincipal Principal { get; } IDictionary Properties { get; } + string AuthenticationScheme { get; } - void Accept(string authenticationType, IDictionary description); + void Accept(IDictionary description); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs index 426c601e24..b9720a941d 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs @@ -1,14 +1,12 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Interfaces.Security +namespace Microsoft.AspNet.Http.Interfaces.Authentication { public interface ISignOutContext { - IEnumerable AuthenticationTypes { get; } + string AuthenticationScheme { get; } - void Accept(string authenticationType, IDictionary description); + void Accept(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs similarity index 72% rename from src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs index 38b48dcf0e..e1d3918dbc 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs @@ -1,11 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Security.Claims; -using System.Security.Principal; -namespace Microsoft.AspNet.Http.Security +namespace Microsoft.AspNet.Http.Authentication { /// /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. @@ -18,21 +16,18 @@ namespace Microsoft.AspNet.Http.Security /// Assigned to Identity. May be null. /// Assigned to Properties. Contains extra information carried along with the identity. /// Assigned to Description. Contains information describing the authentication provider. - public AuthenticationResult(IIdentity identity, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) + public AuthenticationResult(ClaimsPrincipal principal, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) { - if (identity != null) - { - Identity = identity as ClaimsIdentity ?? new ClaimsIdentity(identity); - } + Principal = principal; Properties = properties; Description = description; } /// - /// Contains the claims that were authenticated by the given AuthenticationType. If the authentication - /// type was not successful the Identity property will be null. + /// Contains the claims that were authenticated by the given AuthenticationScheme. If the authentication + /// scheme was not successful the Identity property will be null. /// - public ClaimsIdentity Identity { get; private set; } + public ClaimsPrincipal Principal { get; private set; } /// /// Contains extra values that were provided with the original SignIn call. diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs similarity index 86% rename from src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs index 2d7d4f0c73..7df6a014c0 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Http.Security +namespace Microsoft.AspNet.Http.Authentication { /// /// Contains information describing an authentication provider. @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Security public class AuthenticationDescription { private const string CaptionPropertyKey = "Caption"; - private const string AuthenticationTypePropertyKey = "AuthenticationType"; + private const string AuthenticationSchemePropertyKey = "AuthenticationScheme"; /// /// Initializes a new instance of the class @@ -40,10 +40,10 @@ namespace Microsoft.AspNet.Http.Security /// /// Gets or sets the name used to reference the authentication middleware instance. /// - public string AuthenticationType + public string AuthenticationScheme { - get { return GetString(AuthenticationTypePropertyKey); } - set { Dictionary[AuthenticationTypePropertyKey] = value; } + get { return GetString(AuthenticationSchemePropertyKey); } + set { Dictionary[AuthenticationSchemePropertyKey] = value; } } /// diff --git a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs index afb9aca66a..475dd027d9 100644 --- a/src/Microsoft.AspNet.Http/Security/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Globalization; -namespace Microsoft.AspNet.Http.Security +namespace Microsoft.AspNet.Http.Authentication { /// /// Dictionary used to store state values about the authentication session. diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index 094b6671eb..c76019744e 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -8,7 +8,7 @@ using System.Net.WebSockets; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Security; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http { @@ -52,21 +52,21 @@ namespace Microsoft.AspNet.Http SetFeature(typeof(T), instance); } - public abstract IEnumerable GetAuthenticationTypes(); + public abstract IEnumerable GetAuthenticationSchemes(); - public virtual AuthenticationResult Authenticate(string authenticationType) + public virtual AuthenticationResult Authenticate(string authenticationScheme) { - return Authenticate(new[] { authenticationType }).SingleOrDefault(); + return Authenticate(new[] { authenticationScheme }).SingleOrDefault(); } - public abstract IEnumerable Authenticate(IEnumerable authenticationTypes); + public abstract IEnumerable Authenticate(IEnumerable authenticationSchemes); - public virtual async Task AuthenticateAsync(string authenticationType) + public virtual async Task AuthenticateAsync(string authenticationScheme) { - return (await AuthenticateAsync(new[] { authenticationType })).SingleOrDefault(); + return (await AuthenticateAsync(new[] { authenticationScheme })).SingleOrDefault(); } - public abstract Task> AuthenticateAsync(IEnumerable authenticationTypes); + public abstract Task> AuthenticateAsync(IEnumerable authenticationSchemes); public virtual Task AcceptWebSocketAsync() { diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index d0156b4ee9..047b09825d 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Security.Claims; -using Microsoft.AspNet.Http.Security; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http { @@ -44,70 +44,40 @@ namespace Microsoft.AspNet.Http Challenge(properties, new string[0]); } - public virtual void Challenge(string authenticationType) + public virtual void Challenge(string authenticationScheme) { - Challenge(new[] { authenticationType }); + Challenge(new[] { authenticationScheme }); } - public virtual void Challenge(AuthenticationProperties properties, string authenticationType) + public virtual void Challenge(AuthenticationProperties properties, string authenticationScheme) { - Challenge(properties, new[] { authenticationType }); + Challenge(properties, new[] { authenticationScheme }); } - public virtual void Challenge(params string[] authenticationTypes) + public virtual void Challenge(params string[] authenticationSchemes) { - Challenge((IEnumerable)authenticationTypes); + Challenge((IEnumerable)authenticationSchemes); } - public virtual void Challenge(IEnumerable authenticationTypes) + public virtual void Challenge(IEnumerable authenticationSchemes) { - Challenge(properties: null, authenticationTypes: authenticationTypes); + Challenge(properties: null, authenticationSchemes: authenticationSchemes); } - public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationTypes) + public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationSchemes) { - Challenge(properties, (IEnumerable)authenticationTypes); + Challenge(properties, (IEnumerable)authenticationSchemes); } - public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationTypes); + public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationSchemes); - public virtual void SignIn(ClaimsIdentity identity) - { - SignIn(properties: null, identity: identity); - } - - public virtual void SignIn(AuthenticationProperties properties, ClaimsIdentity identity) - { - SignIn(properties, new[] { identity }); - } - - public virtual void SignIn(params ClaimsIdentity[] identities) - { - SignIn(properties: null, identities: (IEnumerable)identities); - } - - public virtual void SignIn(IEnumerable identities) - { - SignIn(properties: null, identities: identities); - } - - public virtual void SignIn(AuthenticationProperties properties, params ClaimsIdentity[] identities) - { - SignIn(properties, (IEnumerable)identities); - } - - public abstract void SignIn(AuthenticationProperties properties, IEnumerable identities); + public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); public virtual void SignOut() { - SignOut(new string[0]); + SignOut(authenticationScheme: null); } - public virtual void SignOut(string authenticationType) - { - SignOut(new[] { authenticationType }); - } - - public abstract void SignOut(IEnumerable authenticationTypes); + public abstract void SignOut(string authenticationScheme); } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 148d80fcc0..f64f274333 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,9 +14,9 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; -using Microsoft.AspNet.Http.Core.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 469933cf64..11d5892cb1 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -16,7 +16,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Security; +using Microsoft.AspNet.Http.Interfaces.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 146967c135..5e637e1cca 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -3,13 +3,12 @@ using System; using System.Collections.Generic; -using System.IO; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http.Core.Authentication; +using Microsoft.AspNet.Http.Interfaces.Authentication; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests @@ -66,7 +65,7 @@ namespace Microsoft.AspNet.Http.Core.Tests public void SignInWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Response.SignIn(new ClaimsIdentity("Foo"))); + Assert.Throws(() => context.Response.SignIn("Foo", new ClaimsPrincipal())); } [Fact] @@ -78,6 +77,58 @@ namespace Microsoft.AspNet.Http.Core.Tests Assert.Throws(() => context.Response.SignOut("Foo")); } + [Fact] + public void SignInOutIn() + { + var context = CreateContext(); + var handler = new AuthHandler(); + context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); + var user = new ClaimsPrincipal(); + context.Response.SignIn("ignored", user); + Assert.True(handler.SignedIn); + context.Response.SignOut("ignored"); + Assert.False(handler.SignedIn); + context.Response.SignIn("ignored", user); + Assert.True(handler.SignedIn); + } + + private class AuthHandler : IAuthenticationHandler + { + public bool SignedIn { get; set; } + + public void Authenticate(IAuthenticateContext context) + { + throw new NotImplementedException(); + } + + public Task AuthenticateAsync(IAuthenticateContext context) + { + throw new NotImplementedException(); + } + + public void Challenge(IChallengeContext context) + { + throw new NotImplementedException(); + } + + public void GetDescriptions(IDescribeSchemesContext context) + { + throw new NotImplementedException(); + } + + public void SignIn(ISignInContext context) + { + SignedIn = true; + context.Accept(new Dictionary()); + } + + public void SignOut(ISignOutContext context) + { + SignedIn = false; + context.Accept(); + } + } + private HttpContext CreateContext() { var context = new DefaultHttpContext(); From fde3b0d2af5a7d8b595ef4f42e793c6263482caa Mon Sep 17 00:00:00 2001 From: Praburaj Date: Tue, 3 Mar 2015 12:02:42 -0800 Subject: [PATCH 0442/1838] OwinFeature collection throws NotSupported exception as the featurecollection is immutable Addresses: https://github.com/aspnet/HttpAbstractions/issues/207 --- src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 8089252955..74312601df 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Hosting.Builder { public HttpContext CreateHttpContext(IFeatureCollection featureCollection) { - return new DefaultHttpContext(featureCollection); + return new DefaultHttpContext(new FeatureCollection(featureCollection)); } } } \ No newline at end of file From f2d345855b872764eb42e53515b6ea4329a6bd15 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Tue, 3 Mar 2015 14:07:10 -0800 Subject: [PATCH 0443/1838] Adding a test for mutable feature collection --- .../HttpContextFactoryFacts.cs | 44 +++++++++++++++++++ .../project.json | 5 ++- 2 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs new file mode 100644 index 0000000000..b6ab156902 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Owin; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class HttpContextFactoryFacts + { + [Fact] + public void Mutable_FeatureCollection_Wrapped_For_OwinFeatureCollection() + { + var env = new Dictionary(); + var contextFactory = new HttpContextFactory(); + var context = contextFactory.CreateHttpContext(new OwinFeatureCollection(env)); + + // Setting a feature will throw if the above feature collection is not wrapped in a mutable feature collection. + context.SetFeature(new CustomFeature(100)); + Assert.Equal(100, context.GetFeature().Value); + } + + private interface ICustomFeature + { + int Value { get; } + } + + private class CustomFeature : ICustomFeature + { + private readonly int _value; + public CustomFeature(int value) + { + _value = value; + } + + public int Value + { + get { return _value; } + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 8adf1a1d0e..49c5506d3a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,14 +1,15 @@ { "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", + "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.RequestContainer": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" }, "frameworks": { - "aspnet50": { } + "aspnet50": {} }, "commands": { "test": "xunit.runner.kre" }, "webroot": "testroot" -} +} \ No newline at end of file From ae23f7c7bc956d40040c7a7a45aa2dedd293ebc4 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 2 Mar 2015 16:38:38 -0800 Subject: [PATCH 0444/1838] Adding a feature to get the traceidentifier for a request Addresses : https://github.com/aspnet/HttpAbstractions/issues/117 Related changes in Helios & weblistener in separate PRs. --- .../IRequestIdentifierFeature.cs | 18 ++++++++++++++++++ src/Microsoft.AspNet.Owin/OwinConstants.cs | 8 ++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 7 +++++-- .../OwinFeatureCollection.cs | 19 ++++++++++++++++++- 4 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs new file mode 100644 index 0000000000..642dca1210 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http.Interfaces +{ + /// + /// Feature to identify a request. + /// + public interface IRequestIdentifierFeature + { + /// + /// Identifier to trace a request. + /// + Guid TraceIdentifier { get; } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index b86dfc1a75..98ed1c42bd 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -20,6 +20,14 @@ namespace Microsoft.AspNet.Owin #endregion + #region OWIN v1.1.0 - 3.2.1 Request Data + + // OWIN 1.1.0 http://owin.org/html/owin.html + + public const string RequestId = "owin.RequestId"; + + #endregion + #region OWIN v1.0.0 - 3.2.2. Response Data // http://owin.org/spec/owin-1.0.0.html diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index f64f274333..7e17a7d108 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Owin { OwinConstants.Security.User, new FeatureMap(feature => feature.User, ()=> null, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), () => new HttpAuthenticationFeature()) - }, + } }; // owin.CallCancelled is required but the feature may not be present. @@ -113,6 +113,9 @@ namespace Microsoft.AspNet.Owin } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN + + // The request identifier is a string per the spec. + _entries[OwinConstants.RequestId] = new FeatureMap(feature => feature.TraceIdentifier.ToString()); } // Public in case there's a new/custom feature interface that needs to be added. @@ -369,7 +372,7 @@ namespace Microsoft.AspNet.Owin } public FeatureMap(Func getter, Func defaultFactory, Action setter) - : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory,(feature, value) => setter((TFeature)feature, value)) + : base(typeof(TFeature), feature => getter((TFeature)feature), defaultFactory, (feature, value) => setter((TFeature)feature, value)) { } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 11d5892cb1..af443bcce9 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -32,7 +32,8 @@ namespace Microsoft.AspNet.Owin IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, IHttpWebSocketFeature, - IOwinEnvironmentFeature + IOwinEnvironmentFeature, + IRequestIdentifierFeature { public IDictionary Environment { get; set; } private bool _headersSent; @@ -427,6 +428,22 @@ namespace Microsoft.AspNet.Owin get { return true; } } + Guid IRequestIdentifierFeature.TraceIdentifier + { + get + { + var requestId = Prop(OwinConstants.RequestId); + Guid requestIdentifier; + + if (requestId != null && Guid.TryParse(requestId, out requestIdentifier)) + { + return requestIdentifier; + } + + return Guid.Empty; + } + } + public bool Remove(KeyValuePair item) { throw new NotSupportedException(); From 718d923c7dd1d1039fba3a5d987793226de117b7 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Wed, 4 Mar 2015 15:48:31 -0800 Subject: [PATCH 0445/1838] Adding IApplicationLifetime to the manifest Since IApplicationLifetime is not added to the manifest, while calling HostingServices.Create() before invoking ConfigureServices() we end up creating a new instance of IApplicationLifetime. So the Cancellationtoken that hosting triggers on appshutdown is different from what the app is exposed. --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 9 +++++++-- .../UseRequestServicesFacts.cs | 14 ++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 46b0f94703..1a5ac71846 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -45,8 +45,13 @@ namespace Microsoft.AspNet.Hosting public HostingManifest(IServiceProvider fallback) { var manifest = fallback.GetRequiredService(); - Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor) } - .Concat(manifest.Services).Distinct(); + Services = new Type[] { + typeof(ITypeActivator), + typeof(IHostingEnvironment), + typeof(ILoggerFactory), + typeof(IHttpContextAccessor), + typeof(IApplicationLifetime) + }.Concat(manifest.Services).Distinct(); } public IEnumerable Services { get; private set; } diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 44cd34f8f9..10859e7323 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -3,8 +3,6 @@ using System; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.RequestContainer; using Microsoft.Framework.DependencyInjection; @@ -81,14 +79,11 @@ namespace Microsoft.AspNet.Hosting.Tests } [Theory] - [InlineData(typeof(IHostingEngine))] - [InlineData(typeof(IServerLoader))] - [InlineData(typeof(IApplicationBuilderFactory))] - [InlineData(typeof(IHttpContextFactory))] [InlineData(typeof(ITypeActivator))] - [InlineData(typeof(IApplicationLifetime))] + [InlineData(typeof(IHostingEnvironment))] [InlineData(typeof(ILoggerFactory))] [InlineData(typeof(IHttpContextAccessor))] + [InlineData(typeof(IApplicationLifetime))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) { var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); @@ -96,7 +91,10 @@ namespace Microsoft.AspNet.Hosting.Tests builder.UseRequestServices(); - Assert.NotNull(builder.ApplicationServices.GetRequiredService(service)); + var fromAppServices = builder.ApplicationServices.GetRequiredService(service); + + Assert.NotNull(fromAppServices); + Assert.Equal(baseServiceProvider.GetRequiredService(service), fromAppServices); } } } \ No newline at end of file From 2af733266701c735bd2d56d8b6df7bfc57d7e166 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Wed, 4 Mar 2015 15:58:19 -0800 Subject: [PATCH 0446/1838] Adding ILogger<> to the manifest Change from Hao. --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 1 + test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 1a5ac71846..d3556c06eb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -49,6 +49,7 @@ namespace Microsoft.AspNet.Hosting typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), + typeof(ILogger<>), typeof(IHttpContextAccessor), typeof(IApplicationLifetime) }.Concat(manifest.Services).Distinct(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 10859e7323..b5b8111942 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -82,6 +82,7 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(typeof(ITypeActivator))] [InlineData(typeof(IHostingEnvironment))] [InlineData(typeof(ILoggerFactory))] + [InlineData(typeof(ILogger))] [InlineData(typeof(IHttpContextAccessor))] [InlineData(typeof(IApplicationLifetime))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) From 5655751d8402e27bf4f840fe376bb38db2dee80c Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 4 Mar 2015 17:05:50 -0800 Subject: [PATCH 0447/1838] Logging API changes --- src/Microsoft.AspNet.Hosting/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index d050fbf10c..c0816b1151 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -66,8 +66,8 @@ namespace Microsoft.AspNet.Hosting } catch (Exception ex) { - var logger = loggerFactory.Create(); - logger.WriteError("Dispose threw an exception.", ex); + var logger = loggerFactory.CreateLogger(); + logger.LogError("Dispose threw an exception.", ex); } shutdownHandle.Set(); }); From c632c8a6a4befa43bbe49f7b7caa71f38ea9cb6f Mon Sep 17 00:00:00 2001 From: Praburaj Date: Wed, 4 Mar 2015 17:48:08 -0800 Subject: [PATCH 0448/1838] Reverting change to include ILogger<> from manifest This seems to cause MVC to fail. --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 1 - test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs | 1 - 2 files changed, 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index d3556c06eb..1a5ac71846 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -49,7 +49,6 @@ namespace Microsoft.AspNet.Hosting typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), - typeof(ILogger<>), typeof(IHttpContextAccessor), typeof(IApplicationLifetime) }.Concat(manifest.Services).Distinct(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index b5b8111942..10859e7323 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -82,7 +82,6 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData(typeof(ITypeActivator))] [InlineData(typeof(IHostingEnvironment))] [InlineData(typeof(ILoggerFactory))] - [InlineData(typeof(ILogger))] [InlineData(typeof(IHttpContextAccessor))] [InlineData(typeof(IApplicationLifetime))] public void UseRequestServicesHostingImportedServicesAreDefined(Type service) From 20848da93f87d7140e4ff87456f711f7081576eb Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 4 Mar 2015 18:08:36 -0800 Subject: [PATCH 0449/1838] React to DI changes --- .../EncoderServices.cs | 13 +++++++------ .../UseWithServicesTests.cs | 9 ++++----- .../EncoderServiceCollectionExtensionsTests.cs | 1 - 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs index 0f90180228..a19116daf2 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -10,15 +9,17 @@ namespace Microsoft.Framework.WebEncoders { public static class EncoderServices { - public static IEnumerable GetDefaultServices() + public static IServiceCollection GetDefaultServices() { - var describe = new ServiceDescriber(); + var services = new ServiceCollection(); // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - yield return describe.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); - yield return describe.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); - yield return describe.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); + services.AddSingleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); + services.AddSingleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); + services.AddSingleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); + + return services; } private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index d2393592ad..7cf66aa951 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -2,13 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Xunit; -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; -using Microsoft.AspNet.Http.Core; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http.Core; +using Microsoft.Framework.DependencyInjection; +using Xunit; namespace Microsoft.AspNet.Http.Extensions.Tests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index 41ab636a64..d629184281 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -4,7 +4,6 @@ using System; using Xunit; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.Framework.WebEncoders { From 7adf11b7bc6eff92fb0322ed8221108c40e60e33 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 4 Mar 2015 18:25:49 -0800 Subject: [PATCH 0450/1838] React to DI changes --- .../HostingServicesCollectionExtensions.cs | 27 +++++++++---------- src/Microsoft.AspNet.Hosting/Program.cs | 1 - .../Startup/StartupLoader.cs | 1 - .../ContainerExtensions.cs | 3 +-- src/Microsoft.AspNet.TestHost/TestServer.cs | 1 - .../Fakes/Startup.cs | 1 - .../HostingEngineTests.cs | 1 - .../HostingServicesFacts.cs | 1 - .../StartupManagerTests.cs | 1 - .../UseRequestServicesFacts.cs | 1 - .../TestClientTests.cs | 2 +- .../TestServerTests.cs | 1 - 12 files changed, 14 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 1c698d3f49..6445c1e4b1 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -13,33 +13,30 @@ namespace Microsoft.Framework.DependencyInjection public static class HostingServicesExtensions { // REVIEW: Logging doesn't depend on DI, where should this live? - public static IServiceCollection AddLogging(this IServiceCollection services, IConfiguration config = null) + public static IServiceCollection AddLogging(this IServiceCollection services) { - var describe = new ServiceDescriber(config); - services.TryAdd(describe.Singleton()); - services.TryAdd(describe.Singleton(typeof(ILogger<>), typeof(Logger<>))); + services.TryAdd(ServiceDescriptor.Singleton()); + services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>))); return services; } public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) { - var describer = new ServiceDescriber(configuration); + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(describer.Transient()); - services.TryAdd(describer.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(describer.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(describer.Transient()); - services.TryAdd(describer.Transient()); - - services.TryAdd(describer.Instance(new ApplicationLifetime())); + services.TryAdd(ServiceDescriptor.Instance(new ApplicationLifetime())); services.AddTypeActivator(configuration); // TODO: Do we expect this to be provide by the runtime eventually? - services.AddLogging(configuration); - services.TryAdd(describer.Singleton()); - services.TryAdd(describer.Singleton()); + services.AddLogging(); + services.TryAdd(ServiceDescriptor.Singleton()); + services.TryAdd(ServiceDescriptor.Singleton()); // REVIEW: don't try add because we pull out IEnumerable? services.AddInstance(new ConfigureHostingEnvironment(configuration)); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index d050fbf10c..cec49ddb7f 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -7,7 +7,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Logging; using Microsoft.Framework.Runtime; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index ba6c013f12..bed2a0190d 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -8,7 +8,6 @@ using System.Linq; using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 06d89995f2..35701937ac 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using Microsoft.AspNet.RequestContainer; using Microsoft.AspNet.Hosting; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; namespace Microsoft.AspNet.Builder { @@ -29,7 +28,7 @@ namespace Microsoft.AspNet.Builder // Note: Manifests are lost after UseServices, services are flattened into ApplicationServices - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IEnumerable applicationServices) + public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IServiceCollection applicationServices) { return builder.UseServices(services => services.Add(applicationServices)); } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index a626723572..b7350e7c13 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -11,7 +11,6 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; using Microsoft.Framework.Runtime.Infrastructure; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index efcb11537a..8f61d7e4c3 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -3,7 +3,6 @@ using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.OptionsModel; using System; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 99be47cbf7..d66e77a396 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -10,7 +10,6 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Server; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Xunit; namespace Microsoft.AspNet.Hosting diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 5e6e733da8..1ccae6b90c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Runtime; using Xunit; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index db19ddc403..cefc9877e7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -7,7 +7,6 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.OptionsModel; using Xunit; diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index 10859e7323..bc557d59e7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -6,7 +6,6 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http.Core; using Microsoft.AspNet.RequestContainer; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Microsoft.Framework.Logging; using Xunit; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 467aca2005..b392bac6ad 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection.Fallback; +using Microsoft.Framework.DependencyInjection; using Xunit; namespace Microsoft.AspNet.TestHost diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 9838e1d0b3..c9ef3bdf96 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -10,7 +10,6 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.DependencyInjection.Fallback; using Xunit; namespace Microsoft.AspNet.TestHost From 02ed770353b67f443a023eac18453b44ce1c04fd Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 4 Mar 2015 17:05:50 -0800 Subject: [PATCH 0451/1838] Logging API changes --- src/Microsoft.AspNet.Hosting/Program.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index cec49ddb7f..65658f606b 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -65,8 +65,8 @@ namespace Microsoft.AspNet.Hosting } catch (Exception ex) { - var logger = loggerFactory.Create(); - logger.WriteError("Dispose threw an exception.", ex); + var logger = loggerFactory.CreateLogger(); + logger.LogError("Dispose threw an exception.", ex); } shutdownHandle.Set(); }); From a6ced0c60cf315f268fb371eeb4e927767ed922e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 4 Mar 2015 21:23:59 -0800 Subject: [PATCH 0452/1838] Removed configuration parameter from AddTypeActivator --- .../HostingServicesCollectionExtensions.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 6445c1e4b1..893736db02 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -32,7 +32,8 @@ namespace Microsoft.Framework.DependencyInjection services.TryAdd(ServiceDescriptor.Instance(new ApplicationLifetime())); - services.AddTypeActivator(configuration); + services.AddTypeActivator(); + // TODO: Do we expect this to be provide by the runtime eventually? services.AddLogging(); services.TryAdd(ServiceDescriptor.Singleton()); From d0980738e31cb80bab28c264feb5732ec41929e7 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 5 Mar 2015 02:20:20 -0800 Subject: [PATCH 0453/1838] Removed AddLogging since it comes from Logging now --- .../HostingServicesCollectionExtensions.cs | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 893736db02..4ee17b7f65 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -6,20 +6,11 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.Logging; namespace Microsoft.Framework.DependencyInjection { public static class HostingServicesExtensions { - // REVIEW: Logging doesn't depend on DI, where should this live? - public static IServiceCollection AddLogging(this IServiceCollection services) - { - services.TryAdd(ServiceDescriptor.Singleton()); - services.TryAdd(ServiceDescriptor.Singleton(typeof(ILogger<>), typeof(Logger<>))); - return services; - } - public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) { services.TryAdd(ServiceDescriptor.Transient()); From f7c78b8fbc29260a560bdd208b78462b7ef91728 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 5 Mar 2015 12:23:14 -0800 Subject: [PATCH 0454/1838] Make it easier to add hosting services Fixes https://github.com/aspnet/Hosting/issues/145 --- .../ConfigureHostingEnvironment.cs | 2 +- .../HostingServices.cs | 42 +++++++++--- .../HostingServicesCollectionExtensions.cs | 7 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 14 +++- .../HostingServicesFacts.cs | 67 +++++++++++++++++++ .../Microsoft.AspNet.Hosting.Tests.kproj | 2 +- .../TestServerTests.cs | 47 ++++++++++++- 7 files changed, 165 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs index a714c2cfef..892eaab372 100644 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting public void Configure(IHostingEnvironment hostingEnv) { - hostingEnv.EnvironmentName = _config.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; + hostingEnv.EnvironmentName = _config?.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 1a5ac71846..108e7ae881 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -14,44 +14,66 @@ namespace Microsoft.AspNet.Hosting { public static class HostingServices { - private static IServiceCollection Import(IServiceProvider fallbackProvider) + private static IServiceCollection Import(IServiceProvider fallbackProvider, Action configureHostServices) { var services = new ServiceCollection(); + if (configureHostServices != null) + { + configureHostServices(services); + } var manifest = fallbackProvider.GetRequiredService(); foreach (var service in manifest.Services) { services.AddTransient(service, sp => fallbackProvider.GetService(service)); } + services.AddSingleton(sp => new HostingManifest(services)); return services; } - public static IServiceCollection Create(IConfiguration configuration = null) + public static IServiceCollection Create() { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configuration); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: null); } - public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration = null) + public static IServiceCollection Create(IServiceProvider fallbackServices) { - configuration = configuration ?? new Configuration(); - var services = Import(fallbackServices); + return Create(fallbackServices, configureHostServices: null, configuration: null); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices) + { + return Create(fallbackServices, configureHostServices, configuration: null); + } + + public static IServiceCollection Create(Action configureHostServices, IConfiguration configuration) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: configuration); + } + + public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices, IConfiguration configuration) + { + var services = Import(fallbackServices, configureHostServices); services.AddHosting(configuration); - services.AddSingleton(sp => new HostingManifest(fallbackServices)); return services; } // Manifest exposes the fallback manifest in addition to ITypeActivator, IHostingEnvironment, and ILoggerFactory private class HostingManifest : IServiceManifest { - public HostingManifest(IServiceProvider fallback) + public HostingManifest(IServiceCollection hostServices) { - var manifest = fallback.GetRequiredService(); Services = new Type[] { typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor), typeof(IApplicationLifetime) - }.Concat(manifest.Services).Distinct(); + }.Concat(hostServices.Select(s => s.ServiceType)).Distinct(); } public IEnumerable Services { get; private set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 4ee17b7f65..8510ab43a5 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -11,7 +11,12 @@ namespace Microsoft.Framework.DependencyInjection { public static class HostingServicesExtensions { - public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration = null) + public static IServiceCollection AddHosting(this IServiceCollection services) + { + return services.AddHosting(configuration: null); + } + + public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration) { services.TryAdd(ServiceDescriptor.Transient()); services.TryAdd(ServiceDescriptor.Transient()); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index b7350e7c13..2a6517a4a2 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -47,12 +47,22 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(Action app) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app); + return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices: null); + } + + public static TestServer Create(Action app, Action configureHostServices) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices); } public static TestServer Create(IServiceProvider serviceProvider, Action app) { - var appServices = HostingServices.Create(serviceProvider).BuildServiceProvider(); + return Create(serviceProvider, app, configureHostServices: null); + } + + public static TestServer Create(IServiceProvider serviceProvider, Action app, Action configureHostServices) + { + var appServices = HostingServices.Create(serviceProvider, configureHostServices).BuildServiceProvider(); var config = new Configuration(); return new TestServer(config, appServices, app); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 1ccae6b90c..ebb9b1a892 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -52,6 +52,73 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services } + [Fact] + public void CreateCanAddAdditionalServices() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddTransient(); + fallbackServices.AddTransient(); // Don't register in manifest + + fallbackServices.AddInstance(new ServiceManifest( + new Type[] { + typeof(IFakeService), + })); + + var instance = new FakeService(); + var factoryInstance = new FakeFactoryService(instance); + + var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), + additionalHostServices => + { + additionalHostServices.AddSingleton(); + additionalHostServices.AddInstance(instance); + additionalHostServices.AddSingleton(serviceProvider => factoryInstance); + }); + + // Act + var provider = services.BuildServiceProvider(); + var singleton = provider.GetRequiredService(); + var transient = provider.GetRequiredService(); + var factory = provider.GetRequiredService(); + var manifest = provider.GetRequiredService(); + + // Assert + Assert.Same(singleton, provider.GetRequiredService()); + Assert.NotSame(transient, provider.GetRequiredService()); + Assert.Same(instance, provider.GetRequiredService()); + Assert.Same(factoryInstance, factory); + Assert.Same(factory.FakeService, instance); + Assert.Null(provider.GetService()); + Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services + Assert.Contains(typeof(IFakeSingletonService), manifest.Services); + Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); + Assert.Contains(typeof(IFactoryService), manifest.Services); + } + + [Fact] + public void CreateAdditionalServicesDoNotOverrideFallback() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddTransient(); + + fallbackServices.AddInstance(new ServiceManifest( + new Type[] { + typeof(IFakeService), + })); + + var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), + additionalHostServices => additionalHostServices.AddSingleton()); + + // Act + var provider = services.BuildServiceProvider(); + var stillTransient = provider.GetRequiredService(); + + // Assert + Assert.NotSame(stillTransient, provider.GetRequiredService()); + } + [Fact] public void CanHideImportedServices() { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj index 766519fb73..59c5545a1f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj @@ -12,7 +12,7 @@ 2.0 - 23533 + 18007 \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index c9ef3bdf96..899d3be45a 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -10,6 +10,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Logging; using Xunit; namespace Microsoft.AspNet.TestHost @@ -36,10 +37,25 @@ namespace Microsoft.AspNet.TestHost Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); } + [Fact] + public async Task CanAccessLogger() + { + TestServer server = TestServer.Create(app => + { + app.Run(context => + { + var logger = app.ApplicationServices.GetRequiredService>(); + return context.Response.WriteAsync("FoundLogger:" + (logger != null)); + }); + }); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("FoundLogger:True", result); + } + [Fact] public async Task CanAccessHttpContext() { - var services = new ServiceCollection().BuildServiceProvider(); TestServer server = TestServer.Create(app => { app.Run(context => @@ -53,6 +69,35 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("HasContext:True", result); } + public class ContextHolder + { + public ContextHolder(IHttpContextAccessor accessor) + { + Accessor = accessor; + } + + public IHttpContextAccessor Accessor { get; set; } + } + + [Fact] + public async Task CanAddNewHostServices() + { + TestServer server = TestServer.Create(app => + { + var a = app.ApplicationServices.GetRequiredService(); + + app.Run(context => + { + var b = app.ApplicationServices.GetRequiredService(); + var accessor = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); + }); + }, newHostServices => newHostServices.AddSingleton()); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("HasContext:True", result); + } + [Fact] public async Task CreateInvokesApp() { From 09ccc84a17b9ab248db0111da8867aae6ba29f1d Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 5 Mar 2015 14:29:22 -0800 Subject: [PATCH 0455/1838] DI API changes --- .../UseMiddlewareExtensions.cs | 3 +-- .../UseWithServicesTests.cs | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index 8a9de346ab..6425c20dc2 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -22,8 +22,7 @@ namespace Microsoft.AspNet.Builder var applicationServices = builder.ApplicationServices; return builder.Use(next => { - var typeActivator = applicationServices.GetRequiredService(); - var instance = typeActivator.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); var parameters = methodinfo.GetParameters(); if (parameters[0].ParameterType != typeof(HttpContext)) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 7cf66aa951..66b5bb0ef4 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -38,7 +38,6 @@ namespace Microsoft.AspNet.Http.Extensions.Tests { var services = new ServiceCollection() .AddScoped() - .AddTransient() .BuildServiceProvider(); var builder = new ApplicationBuilder(services); @@ -101,7 +100,6 @@ namespace Microsoft.AspNet.Http.Extensions.Tests { var services = new ServiceCollection() .AddScoped() - .AddTransient() .BuildServiceProvider(); var builder = new ApplicationBuilder(services); builder.UseMiddleware(); From ca9d6bcd7764adcd3168fe94dd45ce226c239b47 Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 5 Mar 2015 14:39:19 -0800 Subject: [PATCH 0456/1838] DI API changes --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 1 - .../HostingServicesCollectionExtensions.cs | 2 -- test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs | 1 - 3 files changed, 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 108e7ae881..35f5be77c9 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -68,7 +68,6 @@ namespace Microsoft.AspNet.Hosting public HostingManifest(IServiceCollection hostServices) { Services = new Type[] { - typeof(ITypeActivator), typeof(IHostingEnvironment), typeof(ILoggerFactory), typeof(IHttpContextAccessor), diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs index 8510ab43a5..ba3336d541 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs @@ -28,8 +28,6 @@ namespace Microsoft.Framework.DependencyInjection services.TryAdd(ServiceDescriptor.Instance(new ApplicationLifetime())); - services.AddTypeActivator(); - // TODO: Do we expect this to be provide by the runtime eventually? services.AddLogging(); services.TryAdd(ServiceDescriptor.Singleton()); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs index bc557d59e7..0e235a45db 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs @@ -78,7 +78,6 @@ namespace Microsoft.AspNet.Hosting.Tests } [Theory] - [InlineData(typeof(ITypeActivator))] [InlineData(typeof(IHostingEnvironment))] [InlineData(typeof(ILoggerFactory))] [InlineData(typeof(IHttpContextAccessor))] From d5e1b198dcbc2a6a5097f2ad28ceb1ab536208d5 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Thu, 5 Mar 2015 16:22:18 -0800 Subject: [PATCH 0457/1838] Rename Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http --- .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/HttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- .../Collections/SessionCollection.cs | 2 +- src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs | 3 +-- src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs | 1 - src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs | 4 ++-- src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/QueryFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs | 2 +- .../IHttpApplicationFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs | 2 +- .../IHttpClientCertificateFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs | 2 +- .../IRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/ISession.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs | 2 +- src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs | 2 +- .../ITlsTokenBindingFeature.cs | 2 +- .../IWebSocketAcceptContext.cs | 2 +- .../Security/IAuthenticateContext.cs | 2 +- .../Security/IAuthenticationHandler.cs | 2 +- .../Security/IChallengeContext.cs | 2 +- .../Security/IDescribeSchemesContext.cs | 2 +- .../Security/IHttpAuthenticationFeature.cs | 2 +- .../Security/ISignInContext.cs | 2 +- .../Security/ISignOutContext.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- .../DefaultHttpContextTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 3 +-- test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs | 1 - .../MapPredicateMiddlewareTests.cs | 1 - .../Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs | 2 +- 50 files changed, 50 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 938722725e..858da030a4 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index db2efec1af..00c5a1c6fb 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs index 419d4d930f..7cb613ecb3 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs index 4c3071e7b9..f67075e371 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs index 1738456e03..b5d8361ad6 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs index 200a348f03..2abccf3cfb 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs index 52ad9af615..0c7485096c 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 4b91833cca..d178aa90e0 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -13,8 +13,7 @@ using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 4c89f0f457..5b59cad761 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -8,7 +8,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 13cecb1eee..ff1fa8e0ae 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -11,8 +11,8 @@ using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs index ae9fb236c9..cefd16584c 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs index 4a5c6c7634..58d48c49bc 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index d9bfb76406..484f41b1a9 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index ea0aa45cf7..6286bdd1da 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs index d4bf2d180a..b3c6354392 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs index 48e3cd7c71..aa857b1205 100644 --- a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs index 1548e74397..3032d47b6e 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpApplicationFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs index d78b7e6e8c..1ce5e33dd0 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpBufferingFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs index c49de2b9e2..da8fd38115 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpClientCertificateFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs index dc1f8bd0ac..bf3a370357 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs index 9f2d3d3c06..0e85c3e60a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs index 351e6eb5be..bd7a6012a3 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index ecdbd93c2f..cd5ffc4ec6 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs index 76e9b832e8..c5b3ddceec 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpSendFileFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs index 6441c8915a..0d6a0bd33a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs @@ -4,7 +4,7 @@ using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpUpgradeFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index 8b79bde6d7..3e86058140 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -4,7 +4,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IHttpWebSocketFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs index 642dca1210..e7fe2c20f6 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { /// /// Feature to identify a request. diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs index 90d4e15566..cc8e6cd886 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISession.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface ISession { diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs index ff162b8491..ece1363017 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface ISessionFactory { diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs index ffe6e91eac..3173f44e3d 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { // TODO: Is there any reason not to flatten the Factory down into the Feature? public interface ISessionFeature diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs index d5211d9464..111f6ec8fc 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { /// /// Provides information regarding TLS token binding parameters. diff --git a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs index 1ae4306712..81f041bb27 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces +namespace Microsoft.AspNet.Http { public interface IWebSocketAcceptContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs index 86a1b7add1..71c2b97a30 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticateContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs index 856433f41a..76b3e8cb1b 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticationHandler { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs index 602d1eead3..3c6f2058de 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IChallengeContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs index 7b06b47a6f..96f395cb37 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IDescribeSchemesContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs index be9ffb4e22..053f5d8e12 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs index ee6603be66..c79860279d 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface ISignInContext { diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs index b9720a941d..4fbca12a3a 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Interfaces.Authentication +namespace Microsoft.AspNet.Http.Authentication { public interface ISignOutContext { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 7e17a7d108..072f779b98 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -15,8 +15,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index af443bcce9..7d30044171 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -15,8 +15,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 20e73c2967..07b58bc27e 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 063f43eead..56bc445f77 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 1d43a8a85c..8a7d7aa0cf 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 5e637e1cca..0393392f1b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -8,7 +8,7 @@ using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Interfaces.Authentication; +using Microsoft.AspNet.Http.Authentication; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs index 7c5557bb2a..4ec7dff00f 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs @@ -1,11 +1,10 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; using Xunit; namespace Microsoft.AspNet.Http.Core.Tests diff --git a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs index 91846bc000..0fd91f5cd4 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs index ae1a7c5985..9bf4faaab6 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs @@ -4,7 +4,6 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs index bc94b5717c..1c0537beda 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Interfaces; using Microsoft.AspNet.Http.Core; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 93becf8a60..f86ce513dc 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Xunit; namespace Microsoft.AspNet.Owin From eeda8e3d7398e882d931ddefb55a7a4e16f5a2e4 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Thu, 5 Mar 2015 16:17:13 -0800 Subject: [PATCH 0458/1838] Rename Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 1 - src/Microsoft.AspNet.TestHost/RequestFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index f190c0b539..a1e281a7ca 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -13,7 +13,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core; -using Microsoft.AspNet.Http.Interfaces; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index f23df6716a..3c043c6e98 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 8c8aa08e60..de9765b383 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 9956339096..c92a8ca35c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -10,7 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core; -using Microsoft.AspNet.Http.Interfaces; +using Microsoft.AspNet.Http; using Xunit; namespace Microsoft.AspNet.TestHost From 9988d5205e6244e444b2e14f597b204c01224364 Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 5 Mar 2015 14:37:40 -0800 Subject: [PATCH 0459/1838] GetXyzEncoder() shouldn't throw if IServiceProvider is null Also remove dependency on full DI; use Interfaces instead --- .../EncoderServiceProviderExtensions.cs | 13 ++++++------- .../EncoderServices.cs | 13 +++++-------- src/Microsoft.Framework.WebEncoders/project.json | 2 +- .../project.json | 1 + 4 files changed, 13 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs index a7982bdf7a..97a04d1c66 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs @@ -3,7 +3,6 @@ using System; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -19,9 +18,9 @@ namespace Microsoft.Framework.WebEncoders /// This method is guaranteed never to return null. /// It will return a default encoder instance if the service provider does not contain one. /// - public static IHtmlEncoder GetHtmlEncoder([NotNull] this IServiceProvider serviceProvider) + public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider.GetService() ?? HtmlEncoder.Default; + return serviceProvider?.GetService() ?? HtmlEncoder.Default; } /// @@ -31,9 +30,9 @@ namespace Microsoft.Framework.WebEncoders /// This method is guaranteed never to return null. /// It will return a default encoder instance if the service provider does not contain one. /// - public static IJavaScriptStringEncoder GetJavaScriptStringEncoder([NotNull] this IServiceProvider serviceProvider) + public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider) { - return serviceProvider.GetService() ?? JavaScriptStringEncoder.Default; + return serviceProvider?.GetService() ?? JavaScriptStringEncoder.Default; } /// @@ -43,9 +42,9 @@ namespace Microsoft.Framework.WebEncoders /// This method is guaranteed never to return null. /// It will return a default encoder instance if the service provider does not contain one. /// - public static IUrlEncoder GetUrlEncoder([NotNull] this IServiceProvider serviceProvider) + public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider.GetService() ?? UrlEncoder.Default; + return serviceProvider?.GetService() ?? UrlEncoder.Default; } } } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs index a19116daf2..d7759f5134 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -9,17 +10,13 @@ namespace Microsoft.Framework.WebEncoders { public static class EncoderServices { - public static IServiceCollection GetDefaultServices() + public static IEnumerable GetDefaultServices() { - var services = new ServiceCollection(); - // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - services.AddSingleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); - services.AddSingleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); - services.AddSingleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); - - return services; + yield return ServiceDescriptor.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); + yield return ServiceDescriptor.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); + yield return ServiceDescriptor.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); } private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 34f87f5fe2..0c83429959 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,7 +5,7 @@ "allowUnsafe": true }, "dependencies": { - "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index e4e4d9f445..33115bacc1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", "Moq": "4.2.1312.1622", "Newtonsoft.Json": "6.0.6", From 28cc37de96d8593e81ba5666db546ede764196f5 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 6 Mar 2015 08:53:31 -0800 Subject: [PATCH 0460/1838] Add another Create overload that was missing --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 35f5be77c9..e49d792fee 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -40,6 +40,11 @@ namespace Microsoft.AspNet.Hosting return Create(fallbackServices, configureHostServices: null, configuration: null); } + public static IServiceCollection Create(Action configureHostServices) + { + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration: null); + } + public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices) { return Create(fallbackServices, configureHostServices, configuration: null); From 89a1ec1cb5460f7f7cce6b8c0d6270625dd792fa Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Fri, 6 Mar 2015 15:04:18 -0800 Subject: [PATCH 0461/1838] Apply `configureHostServices` after the `fallbackProvider` - allows MVC to override `IApplicationEnvironment` in functional tests --- src/Microsoft.AspNet.Hosting/HostingServices.cs | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index e49d792fee..55859c9a84 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -17,16 +17,19 @@ namespace Microsoft.AspNet.Hosting private static IServiceCollection Import(IServiceProvider fallbackProvider, Action configureHostServices) { var services = new ServiceCollection(); - if (configureHostServices != null) - { - configureHostServices(services); - } var manifest = fallbackProvider.GetRequiredService(); foreach (var service in manifest.Services) { services.AddTransient(service, sp => fallbackProvider.GetService(service)); } + services.AddSingleton(sp => new HostingManifest(services)); + + if (configureHostServices != null) + { + configureHostServices(services); + } + return services; } From 9618dfa272b18488060c3add9063cf1f8008b151 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Fri, 6 Mar 2015 15:55:47 -0800 Subject: [PATCH 0462/1838] Correct one unit test --- .../HostingServicesFacts.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index ebb9b1a892..25baae8074 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Hosting.Tests } [Fact] - public void CreateAdditionalServicesDoNotOverrideFallback() + public void CreateAdditionalServicesOverridesFallback() { // Arrange var fallbackServices = new ServiceCollection(); @@ -108,15 +108,15 @@ namespace Microsoft.AspNet.Hosting.Tests typeof(IFakeService), })); - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), + var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), additionalHostServices => additionalHostServices.AddSingleton()); // Act var provider = services.BuildServiceProvider(); - var stillTransient = provider.GetRequiredService(); + var singleton = provider.GetRequiredService(); // Assert - Assert.NotSame(stillTransient, provider.GetRequiredService()); + Assert.Same(singleton, provider.GetRequiredService()); } [Fact] From ee55e382606f37c77b2e2c10365602e982c18f58 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Fri, 6 Mar 2015 16:44:55 -0800 Subject: [PATCH 0463/1838] CR comments - change order a bit and add a unit test --- .../HostingServices.cs | 4 +-- .../HostingServicesFacts.cs | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs index 55859c9a84..6a321a0098 100644 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ b/src/Microsoft.AspNet.Hosting/HostingServices.cs @@ -23,13 +23,13 @@ namespace Microsoft.AspNet.Hosting services.AddTransient(service, sp => fallbackProvider.GetService(service)); } - services.AddSingleton(sp => new HostingManifest(services)); - if (configureHostServices != null) { configureHostServices(services); } + services.AddSingleton(sp => new HostingManifest(services)); + return services; } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs index 25baae8074..a0fff83ac5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs @@ -119,6 +119,33 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Same(singleton, provider.GetRequiredService()); } + [Fact] + public void CreateAdditionalServices_IncludesServicesInManifest() + { + // Arrange + var fallbackServices = new ServiceCollection(); + fallbackServices.AddTransient(); + fallbackServices.AddInstance(new ServiceManifest( + new Type[] { + typeof(IFakeService), + })); + var expectedInstance = new FakeService(); + var services = HostingServices.Create( + fallbackServices.BuildServiceProvider(), + additionalHostServices => additionalHostServices.AddInstance(expectedInstance)); + + // Act + var provider = services.BuildServiceProvider(); + var instance = provider.GetRequiredService(); + var anotherInstance = provider.GetRequiredService(); + var manifest = provider.GetRequiredService(); + + // Assert + Assert.Same(expectedInstance, instance); + Assert.Same(expectedInstance, anotherInstance); + Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); + } + [Fact] public void CanHideImportedServices() { From 19df67f33e89043f1eb2d75e3de6a0d2eab0e762 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:29 -0700 Subject: [PATCH 0464/1838] Update aspnet50/aspnetcore50 => dnx451/dnxcore50. --- src/Microsoft.AspNet.Hosting.Interfaces/project.json | 6 +++--- src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs | 10 +++++----- src/Microsoft.AspNet.Hosting/project.json | 6 +++--- src/Microsoft.AspNet.RequestContainer/project.json | 6 +++--- src/Microsoft.AspNet.TestHost/ResponseStream.cs | 6 +++--- src/Microsoft.AspNet.TestHost/project.json | 6 +++--- test/Microsoft.AspNet.Hosting.Tests/project.json | 6 +++--- test/Microsoft.AspNet.TestHost.Tests/project.json | 4 ++-- 8 files changed, 25 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index 6f33dd5cea..bb1e04e39b 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -7,7 +7,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*" }, "frameworks": { - "aspnet50": {}, - "aspnetcore50": {} + "dnx451": {}, + "dnxcore50": {} } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs index 59b5cbd8fa..5b1e0ef9e1 100644 --- a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs @@ -1,11 +1,11 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -#if ASPNET50 +#if DNX451 using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting; -#elif ASPNETCORE50 +#elif DNXCORE50 using System.Threading; #endif using Microsoft.AspNet.Http; @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Hosting { public class HttpContextAccessor : IHttpContextAccessor { -#if ASPNET50 +#if DNX451 private const string LogicalDataKey = "__HttpContext_Current__"; public HttpContext HttpContext @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Hosting } } -#elif ASPNETCORE50 +#elif DNXCORE50 private AsyncLocal _httpContextCurrent = new AsyncLocal(); public HttpContext HttpContext { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index f4deb14aca..03a441eba0 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { @@ -11,8 +11,8 @@ "Newtonsoft.Json": "6.0.6" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Console": "4.0.0-beta-*" } diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index 076064ad98..b2729bd744 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 enables per-request scoping of services.", "dependencies": { @@ -7,8 +7,8 @@ "Microsoft.Framework.OptionsModel": "1.0.0-*" }, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "System.Threading": "4.0.10-beta-*" } diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index 64e64c0c64..a3b555bd70 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.TestHost _readLock.Release(); } } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { // TODO: This option doesn't preserve the state object. @@ -258,7 +258,7 @@ namespace Microsoft.AspNet.TestHost _writeLock.Release(); } } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { Write(buffer, offset, count); diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index c63c7dba59..c6360f74da 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,16 +1,16 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 web server for writing and running tests.", "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*" }, "frameworks": { - "aspnet50": { + "dnx451": { "frameworkAssemblies": { "System.Net.Http": "" } }, - "aspnetcore50": { + "dnxcore50": { "dependencies": { "System.Diagnostics.Contracts": "4.0.0-beta-*", "System.Net.Http": "4.0.0-beta-*" diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 49c5506d3a..22e492d189 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", @@ -6,10 +6,10 @@ "xunit.runner.kre": "1.0.0-*" }, "frameworks": { - "aspnet50": {} + "dnx451": {} }, "commands": { "test": "xunit.runner.kre" }, "webroot": "testroot" -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index cf98630c3f..df5be3e395 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.TestHost": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" @@ -7,6 +7,6 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { } + "dnx451": { } } } From 1bf2c7c7f3468da6a2b8b1d6af9f117d33878b07 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:29 -0700 Subject: [PATCH 0465/1838] Update K_BUILD_VERSION/kre/KRE/.k => DNX_BUILD_VERSION/dnx/DNX/.dnx. --- build.cmd | 4 ++-- .../ContainerExtensions.cs | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/build.cmd b/build.cmd index 86ca5bbbf1..49ba0692de 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ -@echo off +@echo off cd %~dp0 SETLOCAL @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_KRE_INSTALL%"=="1" goto run +IF "%SKIP_DNX_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs index 35701937ac..919df65864 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Builder public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) { - // Import services from hosting/KRE as fallback + // Import services from hosting/DNX as fallback var serviceCollection = HostingServices.Create(builder.ApplicationServices); builder.ApplicationServices = configureServices(serviceCollection); @@ -52,4 +52,4 @@ namespace Microsoft.AspNet.Builder return builder.UseMiddleware(); } } -} \ No newline at end of file +} From fc5f2c55cfb65520b8babb92aa54c38fb04faa67 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:30 -0700 Subject: [PATCH 0466/1838] Update kvm/KVM/Kvm => dnvm/DNVM/Dnvm. --- build.cmd | 6 +++--- build.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 49ba0692de..77be0a6627 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index c7873ef58e..74cb3421e6 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/kvm.sh + source packages/KoreBuild/build/dnvm.sh fi if ! type k > /dev/null 2>&1; then - kvm upgrade + dnvm upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From 8385418d913f3134f2e3c498ade39ba397804f27 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:30 -0700 Subject: [PATCH 0467/1838] Update build.sh to use dnvm correctly. --- build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 74cb3421e6..a9ce06d087 100755 --- a/build.sh +++ b/build.sh @@ -27,7 +27,7 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi -if ! type k > /dev/null 2>&1; then +if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi @@ -36,3 +36,4 @@ if ! type k > /dev/null 2>&1; then fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" + From 0ad48b90b2531bb1cdca9906fa29131ef879a8aa Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:39 -0700 Subject: [PATCH 0468/1838] Update aspnet50/aspnetcore50 => dnx451/dnxcore50. --- src/Microsoft.AspNet.FeatureModel/project.json | 6 +++--- src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs | 6 +++--- src/Microsoft.AspNet.Http.Core/project.json | 6 +++--- src/Microsoft.AspNet.Http.Extensions/project.json | 6 +++--- src/Microsoft.AspNet.Http.Interfaces/project.json | 6 +++--- src/Microsoft.AspNet.Http/project.json | 6 +++--- src/Microsoft.AspNet.Owin/project.json | 6 +++--- src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs | 4 ++-- .../FileBufferingReadStream.cs | 6 +++--- src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs | 6 +++--- src/Microsoft.AspNet.WebUtilities/project.json | 6 +++--- src/Microsoft.Framework.WebEncoders/project.json | 6 +++--- src/Microsoft.Net.Http.Headers/project.json | 4 ++-- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Core.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 4 ++-- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 6 +++--- test/Microsoft.Framework.WebEncoders.Tests/project.json | 4 ++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 4 ++-- 21 files changed, 54 insertions(+), 54 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 72c7319d68..f00900df49 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { }, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.Linq": "4.0.0-beta-*", diff --git a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs index 06755f543d..ec692ee014 100644 --- a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs @@ -110,7 +110,7 @@ namespace Microsoft.AspNet.Http.Core _position += read; return read; } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -159,7 +159,7 @@ namespace Microsoft.AspNet.Http.Core { throw new NotSupportedException(); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -196,4 +196,4 @@ namespace Microsoft.AspNet.Http.Core } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 91374fa6c6..baa2f4758e 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", @@ -11,8 +11,8 @@ }, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index be234399ec..3f874d1efe 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { @@ -7,9 +7,9 @@ "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks" : { - "aspnet50" : { + "dnx451" : { }, - "aspnetcore50" : { + "dnxcore50" : { "dependencies": { "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index 3b6666ff83..0ce04e727c 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -1,9 +1,9 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Net.Primitives": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3adb7472e8..87ca4473e4 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,10 +1,10 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": {}, "frameworks": { - "aspnet50": {}, - "aspnetcore50": { + "dnx451": {}, + "dnxcore50": { "dependencies": { "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 19cc720380..fa41857380 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { @@ -7,8 +7,8 @@ "Microsoft.AspNet.Http.Core": "1.0.0-*" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.ComponentModel": "4.0.0-beta-*", diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 847873e2d1..2e6e39b6d2 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -144,7 +144,7 @@ namespace Microsoft.AspNet.WebUtilities { _inner.Write(buffer, offset, count); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return _inner.BeginWrite(buffer, offset, count, callback, state); @@ -193,7 +193,7 @@ namespace Microsoft.AspNet.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } -#if ASPNET50 +#if DNX451 // We only anticipate using ReadAsync public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 2f23ab5247..aecd6e9ee5 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.WebUtilities return read; } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -199,7 +199,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -245,4 +245,4 @@ namespace Microsoft.AspNet.WebUtilities } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index d72809ef81..1bbf55e57c 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -109,7 +109,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -147,7 +147,7 @@ namespace Microsoft.AspNet.WebUtilities } return read; } -#if ASPNET50 +#if DNX451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { var tcs = new TaskCompletionSource(state); @@ -317,4 +317,4 @@ namespace Microsoft.AspNet.WebUtilities return matchCount > 0; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 3a4c42267f..953d2480d0 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,11 +1,11 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 0c83429959..93344aa0cf 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "Contains encoders for HTML, JavaScript, and URLs.", "compilationOptions": { @@ -11,8 +11,8 @@ }, "frameworks": { "net45": { }, - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index c0c551004b..6b8f2051ec 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -4,8 +4,8 @@ }, "frameworks" : { "net45" : { }, - "aspnet50" : { }, - "aspnetcore50" : { + "dnx451" : { }, + "dnxcore50" : { "dependencies": { "System.Collections": "4.0.10-beta-*", "System.Diagnostics.Contracts": "4.0.0-beta-*", diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 6dfc567e0b..71618f4eaa 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", @@ -9,7 +9,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index df6823dc6d..8046fb859b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", @@ -10,7 +10,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Moq": "4.2.1312.1622" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index ddf07a3826..b50c960ccc 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", @@ -10,7 +10,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index f6549fc724..4b174469d8 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", @@ -10,7 +10,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index f0caf021ab..bb7860d070 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", @@ -11,7 +11,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index d449b763bd..e9abf2ad1c 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", @@ -9,7 +9,7 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 33115bacc1..215984718a 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", @@ -13,7 +13,7 @@ "allowUnsafe": true }, "frameworks": { - "aspnet50": { } + "dnx451": { } }, "resources": "..\\..\\unicode\\UnicodeData.txt" } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4ffa75e704..c448522419 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -8,8 +8,8 @@ "test": "xunit.runner.kre" }, "frameworks": { - "aspnet50": { }, - "aspnetcore50": { + "dnx451": { }, + "dnxcore50": { "dependencies": { "System.Diagnostics.Debug": "4.0.10-beta-*" } From d69b1000b64903876b12d4a9cbba3eb3e708f00d Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:41 -0700 Subject: [PATCH 0469/1838] Update K_BUILD_VERSION/kre/KRE/.k => DNX_BUILD_VERSION/dnx/DNX/.dnx. --- build.cmd | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.cmd b/build.cmd index 86ca5bbbf1..49ba0692de 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ -@echo off +@echo off cd %~dp0 SETLOCAL @@ -19,7 +19,7 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion -IF "%SKIP_KRE_INSTALL%"=="1" goto run +IF "%SKIP_DNX_INSTALL%"=="1" goto run CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 From e2329ae1024d8c9fffec500585cd7d1af3ce4687 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:43 -0700 Subject: [PATCH 0470/1838] Update kvm/KVM/Kvm => dnvm/DNVM/Dnvm. --- build.cmd | 6 +++--- build.sh | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 49ba0692de..77be0a6627 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\kvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\kvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -x86 :run -CALL packages\KoreBuild\build\kvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm use default -runtime CLR -x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index c7873ef58e..74cb3421e6 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild @@ -28,11 +28,11 @@ if test ! -d packages/KoreBuild; then fi if ! type k > /dev/null 2>&1; then - source packages/KoreBuild/build/kvm.sh + source packages/KoreBuild/build/dnvm.sh fi if ! type k > /dev/null 2>&1; then - kvm upgrade + dnvm upgrade fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" From d2b303d4f0235446991522999d8e5460711f9de5 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Sun, 8 Mar 2015 12:50:43 -0700 Subject: [PATCH 0471/1838] Update build.sh to use dnvm correctly. --- build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 74cb3421e6..a9ce06d087 100755 --- a/build.sh +++ b/build.sh @@ -27,7 +27,7 @@ if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion fi -if ! type k > /dev/null 2>&1; then +if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi @@ -36,3 +36,4 @@ if ! type k > /dev/null 2>&1; then fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" + From de25ccc9cd7e1dbb3d50d49e65aeb1e8afdfb57c Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 9 Mar 2015 01:31:50 -0700 Subject: [PATCH 0472/1838] Temporarily update struct => class. - Will be reverted back as denoted by issue: https://github.com/aspnet/HttpAbstractions/issues/222 --- src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs index 67918e5122..e05a917c56 100644 --- a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -6,7 +6,7 @@ using System.Diagnostics; namespace Microsoft.Framework.WebEncoders { - internal struct AllowedCharsBitmap + internal class AllowedCharsBitmap { private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); private uint[] _allowedCharsBitmap; @@ -34,7 +34,7 @@ namespace Microsoft.Framework.WebEncoders // Creates a deep copy of this bitmap public AllowedCharsBitmap Clone() { - AllowedCharsBitmap retVal; + var retVal = new AllowedCharsBitmap(); retVal._allowedCharsBitmap = (uint[])this._allowedCharsBitmap.Clone(); return retVal; } From 48c6facf2966056e25e3854423802df0f5708eda Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 9 Mar 2015 12:54:37 -0700 Subject: [PATCH 0473/1838] Remove BOM from project.json, *.cmd, *.sh and *.shade files. --- build.cmd | 2 +- build.sh | 2 +- src/Microsoft.AspNet.Hosting.Interfaces/project.json | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.RequestContainer/project.json | 2 +- src/Microsoft.AspNet.TestHost/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- test/Microsoft.AspNet.TestHost.Tests/project.json | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.cmd b/build.cmd index 77be0a6627..68a732c182 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ -@echo off +@echo off cd %~dp0 SETLOCAL diff --git a/build.sh b/build.sh index a9ce06d087..ec3263114a 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index bb1e04e39b..496ff1441a 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 03a441eba0..9d97fb6f7d 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "dependencies": { diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json index b2729bd744..fdb20e9e8f 100644 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ b/src/Microsoft.AspNet.RequestContainer/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 enables per-request scoping of services.", "dependencies": { diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index c6360f74da..28acab776a 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 web server for writing and running tests.", "dependencies": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 22e492d189..ae45cb6fa0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index df5be3e395..68b0f58d1f 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.TestHost": "1.0.0-*", "xunit.runner.kre": "1.0.0-*" From 973bf7865e8beaa986f746316ad071090e6b9329 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 9 Mar 2015 12:54:49 -0700 Subject: [PATCH 0474/1838] Remove BOM from project.json, *.cmd, *.sh and *.shade files. --- build.cmd | 2 +- build.sh | 2 +- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http.Core/project.json | 2 +- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http.Interfaces/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- src/Microsoft.Framework.WebEncoders/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Core.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 2 +- test/Microsoft.AspNet.Http.Tests/project.json | 2 +- test/Microsoft.AspNet.Owin.Tests/project.json | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 2 +- test/Microsoft.Framework.WebEncoders.Tests/project.json | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/build.cmd b/build.cmd index 77be0a6627..68a732c182 100644 --- a/build.cmd +++ b/build.cmd @@ -1,4 +1,4 @@ -@echo off +@echo off cd %~dp0 SETLOCAL diff --git a/build.sh b/build.sh index a9ce06d087..ec3263114a 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/bin/bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index f00900df49..5513054416 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index baa2f4758e..c611f9a806 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,4 +1,4 @@ - + { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 3f874d1efe..f761ed5f65 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index 0ce04e727c..b327b3a467 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", "frameworks": { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 87ca4473e4..a8c1d8aad3 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": {}, diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index fa41857380..90a7af6c7f 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 953d2480d0..45068efbf3 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 93344aa0cf..2c1b7ba06d 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "Contains encoders for HTML, JavaScript, and URLs.", "compilationOptions": { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 6b8f2051ec..fd40eace65 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { }, diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 71618f4eaa..0713f60e97 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index 8046fb859b..d7c027a570 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index b50c960ccc..0e102e3708 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 4b174469d8..a62cd2769e 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index bb7860d070..9dd6d491be 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index e9abf2ad1c..11ef7dc59e 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 215984718a..9c62c1dacd 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index c448522419..297c316376 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "dependencies": { "Microsoft.Net.Http.Headers": "1.0.0-*", From 9463b08d7b6d9650c44beeca08e3c2b84ce8f615 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 15:02:33 -0700 Subject: [PATCH 0475/1838] Move SendFile HttpResponse extensions to Microsoft.AspNet.Http.Extensions Addresses: https://github.com/aspnet/HttpAbstractions/issues/221 --- .../Properties/Resources.Designer.cs | 46 +++++++ .../Resources.resx | 123 ++++++++++++++++++ .../SendFileResponseExtensions.cs | 57 ++++++++ .../project.json | 1 + .../SendFileResponseExtensionsTests.cs | 63 +++++++++ 5 files changed, 290 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Resources.resx create mode 100644 src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..a0d5a215a3 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs @@ -0,0 +1,46 @@ +// +namespace Microsoft.AspNet.Http.Extensions +{ + using System.Globalization; + using System.Reflection; + using System.Resources; + + internal static class Resources + { + private static readonly ResourceManager _resourceManager + = new ResourceManager("Microsoft.AspNet.Http.Extensions.Resources", typeof(Resources).GetTypeInfo().Assembly); + + /// + /// This server does not support the sendfile.SendAsync extension. + /// + internal static string Exception_SendFileNotSupported + { + get { return GetString("Exception_SendFileNotSupported"); } + } + + /// + /// This server does not support the sendfile.SendAsync extension. + /// + internal static string FormatException_SendFileNotSupported() + { + return GetString("Exception_SendFileNotSupported"); + } + + private static string GetString(string name, params string[] formatterNames) + { + var value = _resourceManager.GetString(name); + + System.Diagnostics.Debug.Assert(value != null); + + if (formatterNames != null) + { + for (var i = 0; i < formatterNames.Length; i++) + { + value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); + } + } + + return value; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Resources.resx b/src/Microsoft.AspNet.Http.Extensions/Resources.resx new file mode 100644 index 0000000000..2059135d60 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Resources.resx @@ -0,0 +1,123 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + This server does not support the sendfile.SendAsync extension. + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs new file mode 100644 index 0000000000..2dcbdafc8a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Extensions; + +namespace Microsoft.AspNet.Http +{ + /// + /// Provides extensions for HttpResponse exposing the SendFile extension. + /// + public static class SendFileResponseExtensions + { + /// + /// Checks if the SendFile extension is supported. + /// + /// + /// True if sendfile feature exists in the response. + public static bool SupportsSendFile([NotNull] this HttpResponse response) + { + return response.HttpContext.GetFeature() != null; + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// + /// + public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName) + { + return response.SendFileAsync(fileName, 0, null, CancellationToken.None); + } + + /// + /// Sends the given file using the SendFile extension. + /// + /// + /// The full or relative path to the file. + /// The offset in the file. + /// The number of types to send, or null to send the remainder of the file. + /// + /// + public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) + { + var sendFile = response.HttpContext.GetFeature(); + if (sendFile == null) + { + throw new NotSupportedException(Resources.Exception_SendFileNotSupported); + } + + return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index f761ed5f65..f2d71e2528 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,6 +3,7 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs new file mode 100644 index 0000000000..f42fec5efa --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. + +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Core; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions.Tests +{ + public class SendFileResponseExtensionsTests + { + [Fact] + public void SendFileSupport() + { + var context = new DefaultHttpContext(); + var response = context.Response; + Assert.False(response.SupportsSendFile()); + context.SetFeature(new FakeSendFileFeature()); + Assert.True(response.SupportsSendFile()); + } + + [Fact] + public Task SendFileWhenNotSupported() + { + var response = new DefaultHttpContext().Response; + return Assert.ThrowsAsync(() => response.SendFileAsync("foo")); + } + + [Fact] + public async Task SendFileWorks() + { + var context = new DefaultHttpContext(); + var response = context.Response; + var fakeFeature = new FakeSendFileFeature(); + context.SetFeature(fakeFeature); + + await response.SendFileAsync("bob", 1, 3, CancellationToken.None); + + Assert.Equal("bob", fakeFeature.name); + Assert.Equal(1, fakeFeature.offset); + Assert.Equal(3, fakeFeature.length); + Assert.Equal(CancellationToken.None, fakeFeature.token); + } + + private class FakeSendFileFeature : IHttpSendFileFeature + { + public string name = null; + public long offset = 0; + public long? length = null; + public CancellationToken token; + + public Task SendFileAsync(string path, long offset, long? length, CancellationToken cancellation) + { + this.name = path; + this.offset = offset; + this.length = length; + this.token = cancellation; + return Task.FromResult(0); + } + } + } +} From 58c45cd379774cf1fd683a12465cb52094b7193d Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 6 Mar 2015 17:20:47 -0800 Subject: [PATCH 0476/1838] SignOutContext needs AuthenticationProperties --- .../Authentication/SignOutContext.cs | 5 ++++- .../DefaultHttpResponse.cs | 15 +++++++++------ .../Security/ISignOutContext.cs | 4 ++++ src/Microsoft.AspNet.Http/HttpResponse.cs | 6 ++++-- .../DefaultHttpContextTests.cs | 2 ++ 5 files changed, 23 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs index 2abccf3cfb..3676102e03 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -11,13 +11,16 @@ namespace Microsoft.AspNet.Http.Core.Authentication { private bool _accepted; - public SignOutContext(string authenticationScheme) + public SignOutContext([NotNull] string authenticationScheme, IDictionary properties) { AuthenticationScheme = authenticationScheme; + Properties = properties ?? new Dictionary(StringComparer.Ordinal); } public string AuthenticationScheme { get; } + public IDictionary Properties { get; } + public bool Accepted { get { return _accepted; } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index ff1fa8e0ae..fd2dab86ed 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -7,13 +7,11 @@ using System.IO; using System.Linq; using System.Security.Claims; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core { @@ -162,11 +160,11 @@ namespace Microsoft.AspNet.Http.Core } } - public override void SignOut(string authenticationScheme) + public override void SignOut(string authenticationScheme, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; - var signOutContext = new SignOutContext(authenticationScheme); + var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); if (handler != null) { handler.SignOut(signOutContext); @@ -178,5 +176,10 @@ namespace Microsoft.AspNet.Http.Core throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } } + + public override void SignOut(string authenticationScheme) + { + SignOut(authenticationScheme, properties: null); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs index 4fbca12a3a..2bb7036026 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs @@ -1,12 +1,16 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; + namespace Microsoft.AspNet.Http.Authentication { public interface ISignOutContext { string AuthenticationScheme { get; } + IDictionary Properties { get; } + void Accept(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 047b09825d..85dec115e7 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Http public virtual void Challenge(IEnumerable authenticationSchemes) { - Challenge(properties: null, authenticationSchemes: authenticationSchemes); + Challenge(properties: null, authenticationSchemes: authenticationSchemes); } public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationSchemes) @@ -75,9 +75,11 @@ namespace Microsoft.AspNet.Http public virtual void SignOut() { - SignOut(authenticationScheme: null); + SignOut(authenticationScheme: null, properties: null); } public abstract void SignOut(string authenticationScheme); + + public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); } } diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs index 0393392f1b..02b040af69 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs @@ -90,6 +90,8 @@ namespace Microsoft.AspNet.Http.Core.Tests Assert.False(handler.SignedIn); context.Response.SignIn("ignored", user); Assert.True(handler.SignedIn); + context.Response.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + Assert.False(handler.SignedIn); } private class AuthHandler : IAuthenticationHandler From 062214538e69566c46a0552efc5f60face5ce1f4 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 20:50:46 -0700 Subject: [PATCH 0477/1838] Renaming Nuget.org feed key name to Nuget. fixes https://github.com/aspnet/Universe/issues/174 --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..da57d47267 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,6 @@ - + - + \ No newline at end of file From ed380ef61cfed669198ab4ddf0b129cf4278d9af Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 20:51:37 -0700 Subject: [PATCH 0478/1838] Renaming Nuget.org feed key name to Nuget. fixes https://github.com/aspnet/Universe/issues/174 --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index f41e9c631d..da57d47267 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,6 @@ - + - + \ No newline at end of file From 64077026c7357ee20ff90062317716ad3cd9f39d Mon Sep 17 00:00:00 2001 From: Levi B Date: Sat, 7 Mar 2015 13:29:03 -0800 Subject: [PATCH 0479/1838] API cleanup: Rename UnicodeBlock -> UnicodeRange Also clean up related doc comments --- .../CodePointFilter.cs | 173 +- .../HtmlEncoder.cs | 13 +- .../JavaScriptStringEncoder.cs | 13 +- .../UnicodeBlock.cs | 66 - .../UnicodeBlocks.cs | 64 - .../UnicodeBlocks.generated.cs | 2336 ----------------- .../UnicodeRange.cs | 64 + .../UnicodeRanges.cs | 51 + .../UnicodeRanges.generated.cs | 1406 ++++++++++ .../UrlEncoder.cs | 17 +- .../CodePointFilterTests.cs | 240 +- .../EncoderExtensionsTests.cs | 6 +- .../HtmlEncoderTests.cs | 14 +- .../JavaScriptStringEncoderTests.cs | 20 +- .../UnicodeBlockTests.cs | 86 - .../UnicodeBlocksTests.cs | 210 -- .../UnicodeEncoderBaseTests.cs | 46 +- .../UnicodeRangeTests.cs | 69 + .../UnicodeRangesTests.cs | 210 ++ .../UrlEncoderTests.cs | 16 +- .../UnicodeTablesGenerator/Program.cs | 18 +- 21 files changed, 2083 insertions(+), 3055 deletions(-) delete mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs delete mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs delete mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeRange.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs create mode 100644 src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs delete mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs delete mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index 1fee0fbf1b..f9c57f1873 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -15,7 +15,7 @@ namespace Microsoft.Framework.WebEncoders private AllowedCharsBitmap _allowedCharsBitmap; /// - /// Instantiates an empty filter. + /// Instantiates an empty filter (allows no code points through by default). /// public CodePointFilter() { @@ -23,7 +23,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates the filter by cloning the allow list of another filter. + /// Instantiates the filter by cloning the allow list of another . /// public CodePointFilter([NotNull] ICodePointFilter other) { @@ -40,53 +40,17 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates the filter where only the provided Unicode character blocks are - /// allowed by the filter. + /// Instantiates the filter where only the character ranges specified by + /// are allowed by the filter. /// - /// - public CodePointFilter(params UnicodeBlock[] allowedBlocks) + public CodePointFilter(params UnicodeRange[] allowedRanges) { _allowedCharsBitmap = new AllowedCharsBitmap(); - AllowBlocks(allowedBlocks); + AllowRanges(allowedRanges); } /// - /// Allows all characters in the specified Unicode character block through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowBlock([NotNull] UnicodeBlock block) - { - int firstCodePoint = block.FirstCodePoint; - int blockSize = block.BlockSize; - for (int i = 0; i < blockSize; i++) - { - _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Allows all characters in the specified Unicode character blocks through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowBlocks(params UnicodeBlock[] blocks) - { - if (blocks != null) - { - for (int i = 0; i < blocks.Length; i++) - { - AllowBlock(blocks[i]); - } - } - return this; - } - - /// - /// Allows the specified character through the filter. + /// Allows the character specified by through the filter. /// /// /// The 'this' instance. @@ -98,7 +62,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Allows the specified characters through the filter. + /// Allows all characters specified by through the filter. /// /// /// The 'this' instance. @@ -116,7 +80,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Allows all characters in the specified string through the filter. + /// Allows all characters in the string through the filter. /// /// /// The 'this' instance. @@ -131,7 +95,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Allows all characters approved by the specified filter through this filter. + /// Allows all characters specified by through the filter. /// /// /// The 'this' instance. @@ -151,7 +115,42 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows all characters through the filter. + /// Allows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowRange([NotNull] UnicodeRange range) + { + int firstCodePoint = range.FirstCodePoint; + int rangeSize = range.RangeSize; + for (int i = 0; i < rangeSize; i++) + { + _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Allows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter AllowRanges(params UnicodeRange[] ranges) + { + if (ranges != null) + { + for (int i = 0; i < ranges.Length; i++) + { + AllowRange(ranges[i]); + } + } + return this; + } + + /// + /// Resets this filter by disallowing all characters. /// /// /// The 'this' instance. @@ -163,42 +162,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows all characters in the specified Unicode character block through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidBlock([NotNull] UnicodeBlock block) - { - int firstCodePoint = block.FirstCodePoint; - int blockSize = block.BlockSize; - for (int i = 0; i < blockSize; i++) - { - _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Disallows all characters in the specified Unicode character blocks through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidBlocks(params UnicodeBlock[] blocks) - { - if (blocks != null) - { - for (int i = 0; i < blocks.Length; i++) - { - ForbidBlock(blocks[i]); - } - } - return this; - } - - /// - /// Disallows the specified character through the filter. + /// Disallows the character through the filter. /// /// /// The 'this' instance. @@ -210,7 +174,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows the specified characters through the filter. + /// Disallows all characters specified by through the filter. /// /// /// The 'this' instance. @@ -228,7 +192,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Disallows all characters in the specified string through the filter. + /// Disallows all characters in the string through the filter. /// /// /// The 'this' instance. @@ -242,6 +206,41 @@ namespace Microsoft.Framework.WebEncoders return this; } + /// + /// Disallows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidRange([NotNull] UnicodeRange range) + { + int firstCodePoint = range.FirstCodePoint; + int rangeSize = range.RangeSize; + for (int i = 0; i < rangeSize; i++) + { + _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); + } + return this; + } + + /// + /// Disallows all characters specified by through the filter. + /// + /// + /// The 'this' instance. + /// + public CodePointFilter ForbidRanges(params UnicodeRange[] ranges) + { + if (ranges != null) + { + for (int i = 0; i < ranges.Length; i++) + { + ForbidRange(ranges[i]); + } + } + return this; + } + /// /// Retrieves the bitmap of allowed characters from this filter. /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification. @@ -266,13 +265,13 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Returns a value stating whether the given character is allowed through the filter. + /// Returns a value stating whether the character is allowed through the filter. /// public bool IsCharacterAllowed(char c) { return _allowedCharsBitmap.IsCharacterAllowed(c); } - + /// /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible. /// diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index bea418b83f..4e30ba2505 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -26,7 +26,7 @@ namespace Microsoft.Framework.WebEncoders private readonly HtmlUnicodeEncoder _innerUnicodeEncoder; /// - /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// Instantiates an encoder using as its allow list. /// public HtmlEncoder() : this(HtmlUnicodeEncoder.BasicLatin) @@ -34,11 +34,11 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// Instantiates an encoder specifying which Unicode character ranges are allowed to /// pass through the encoder unescaped. /// - public HtmlEncoder(params UnicodeBlock[] allowedBlocks) - : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + public HtmlEncoder(params UnicodeRange[] allowedRanges) + : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges))) { } @@ -57,8 +57,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// A default instance of the HtmlEncoder, equivalent to allowing only - /// the 'Basic Latin' character range. + /// The default , which uses as its allow list. /// public static HtmlEncoder Default { @@ -120,7 +119,7 @@ namespace Microsoft.Framework.WebEncoders HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); + encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 3779c32801..1703a5447a 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -26,7 +26,7 @@ namespace Microsoft.Framework.WebEncoders private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder; /// - /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// Instantiates an encoder using as its allow list. /// public JavaScriptStringEncoder() : this(JavaScriptStringUnicodeEncoder.BasicLatin) @@ -34,11 +34,11 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// Instantiates an encoder specifying which Unicode character ranges are allowed to /// pass through the encoder unescaped. /// - public JavaScriptStringEncoder(params UnicodeBlock[] allowedBlocks) - : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedBlocks))) + public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges) + : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges))) { } @@ -57,8 +57,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// A default instance of the JavaScriptStringEncoder, equivalent to allowing only - /// the 'Basic Latin' character range. + /// The default , which uses as its allow list. /// public static JavaScriptStringEncoder Default { @@ -124,7 +123,7 @@ namespace Microsoft.Framework.WebEncoders JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); + encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs deleted file mode 100644 index 26f84d86a0..0000000000 --- a/src/Microsoft.Framework.WebEncoders/UnicodeBlock.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Represents a range of Unicode code points. - /// - /// - /// Currently only the Basic Multilingual Plane is supported. - /// - public sealed class UnicodeBlock - { - /// - /// Creates a new representation of a Unicode block given the first code point - /// in the block and the number of code points in the block. - /// - public UnicodeBlock(int firstCodePoint, int blockSize) - { - // Parameter checking: the first code point must be U+nnn0, the block size must - // be a multiple of 16 bytes, and we can't span planes. - // See http://unicode.org/faq/blocks_ranges.html for more info. - if (firstCodePoint < 0 || firstCodePoint > 0xFFFF || ((firstCodePoint & 0xF) != 0)) - { - throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); - } - if (blockSize < 0 || (blockSize % 16 != 0) || ((long)firstCodePoint + (long)blockSize > 0x10000)) - { - throw new ArgumentOutOfRangeException(nameof(blockSize)); - } - - FirstCodePoint = firstCodePoint; - BlockSize = blockSize; - } - - /// - /// The number of code points in this block. - /// - public int BlockSize { get; } - - /// - /// The first code point in this block. - /// - public int FirstCodePoint { get; } - - public static UnicodeBlock FromCharacterRange(char firstChar, char lastChar) - { - // Parameter checking: the first code point must be U+nnn0 and the last - // code point must be U+nnnF. We already can't span planes since 'char' - // allows only Basic Multilingual Plane characters. - // See http://unicode.org/faq/blocks_ranges.html for more info. - if ((firstChar & 0xF) != 0) - { - throw new ArgumentOutOfRangeException(nameof(firstChar)); - } - if (lastChar < firstChar || (lastChar & 0xF) != 0xF) - { - throw new ArgumentOutOfRangeException(nameof(lastChar)); - } - - return new UnicodeBlock(firstChar, 1 + (int)(lastChar - firstChar)); - } - } -} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs deleted file mode 100644 index 2217e2db93..0000000000 --- a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Contains predefined Unicode code point filters. - /// - public static partial class UnicodeBlocks - { - /// - /// Represents an empty Unicode block. - /// - /// - /// This block contains no code points. - /// - public static UnicodeBlock None - { - get - { - return Volatile.Read(ref _none) ?? CreateEmptyBlock(ref _none); - } - } - private static UnicodeBlock _none; - - /// - /// Represents a block containing all characters in the Unicode Basic Multilingual Plane (U+0000..U+FFFF). - /// - public static UnicodeBlock All - { - get - { - return Volatile.Read(ref _all) ?? CreateBlock(ref _all, '\u0000', '\uFFFF'); - } - } - private static UnicodeBlock _all; - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeBlock CreateBlock(ref UnicodeBlock block, char first, char last) - { - // If the block hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'block' value. - Debug.Assert(last > first, "Code points were specified out of order."); - var newBlock = UnicodeBlock.FromCharacterRange(first, last); - Volatile.Write(ref block, newBlock); - return newBlock; - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeBlock CreateEmptyBlock(ref UnicodeBlock block) - { - // If the block hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'block' value. - var newBlock = new UnicodeBlock(0, 0); - Volatile.Write(ref block, newBlock); - return newBlock; - } - } -} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs b/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs deleted file mode 100644 index d3404759c5..0000000000 --- a/src/Microsoft.Framework.WebEncoders/UnicodeBlocks.generated.cs +++ /dev/null @@ -1,2336 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; - -namespace Microsoft.Framework.WebEncoders -{ - public static partial class UnicodeBlocks - { - /// - /// Represents the 'Basic Latin' Unicode block (U+0000..U+007F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BasicLatin - { - get - { - return Volatile.Read(ref _basicLatin) ?? CreateBlock(ref _basicLatin, first: '\u0000', last: '\u007F'); - } - } - private static UnicodeBlock _basicLatin; - - /// - /// Represents the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Latin1Supplement - { - get - { - return Volatile.Read(ref _latin1Supplement) ?? CreateBlock(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); - } - } - private static UnicodeBlock _latin1Supplement; - - /// - /// Represents the 'Latin Extended-A' Unicode block (U+0100..U+017F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedA - { - get - { - return Volatile.Read(ref _latinExtendedA) ?? CreateBlock(ref _latinExtendedA, first: '\u0100', last: '\u017F'); - } - } - private static UnicodeBlock _latinExtendedA; - - /// - /// Represents the 'Latin Extended-B' Unicode block (U+0180..U+024F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedB - { - get - { - return Volatile.Read(ref _latinExtendedB) ?? CreateBlock(ref _latinExtendedB, first: '\u0180', last: '\u024F'); - } - } - private static UnicodeBlock _latinExtendedB; - - /// - /// Represents the 'IPA Extensions' Unicode block (U+0250..U+02AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. - /// - public static UnicodeBlock IPAExtensions - { - get - { - return Volatile.Read(ref _ipaExtensions) ?? CreateBlock(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); - } - } - private static UnicodeBlock _ipaExtensions; - - /// - /// Represents the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SpacingModifierLetters - { - get - { - return Volatile.Read(ref _spacingModifierLetters) ?? CreateBlock(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); - } - } - private static UnicodeBlock _spacingModifierLetters; - - /// - /// Represents the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarks - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateBlock(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); - } - } - private static UnicodeBlock _combiningDiacriticalMarks; - - /// - /// Represents the 'Greek and Coptic' Unicode block (U+0370..U+03FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GreekandCoptic - { - get - { - return Volatile.Read(ref _greekandCoptic) ?? CreateBlock(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); - } - } - private static UnicodeBlock _greekandCoptic; - - /// - /// Represents the 'Cyrillic' Unicode block (U+0400..U+04FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Cyrillic - { - get - { - return Volatile.Read(ref _cyrillic) ?? CreateBlock(ref _cyrillic, first: '\u0400', last: '\u04FF'); - } - } - private static UnicodeBlock _cyrillic; - - /// - /// Represents the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CyrillicSupplement - { - get - { - return Volatile.Read(ref _cyrillicSupplement) ?? CreateBlock(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); - } - } - private static UnicodeBlock _cyrillicSupplement; - - /// - /// Represents the 'Armenian' Unicode block (U+0530..U+058F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Armenian - { - get - { - return Volatile.Read(ref _armenian) ?? CreateBlock(ref _armenian, first: '\u0530', last: '\u058F'); - } - } - private static UnicodeBlock _armenian; - - /// - /// Represents the 'Hebrew' Unicode block (U+0590..U+05FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Hebrew - { - get - { - return Volatile.Read(ref _hebrew) ?? CreateBlock(ref _hebrew, first: '\u0590', last: '\u05FF'); - } - } - private static UnicodeBlock _hebrew; - - /// - /// Represents the 'Arabic' Unicode block (U+0600..U+06FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Arabic - { - get - { - return Volatile.Read(ref _arabic) ?? CreateBlock(ref _arabic, first: '\u0600', last: '\u06FF'); - } - } - private static UnicodeBlock _arabic; - - /// - /// Represents the 'Syriac' Unicode block (U+0700..U+074F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Syriac - { - get - { - return Volatile.Read(ref _syriac) ?? CreateBlock(ref _syriac, first: '\u0700', last: '\u074F'); - } - } - private static UnicodeBlock _syriac; - - /// - /// Represents the 'Arabic Supplement' Unicode block (U+0750..U+077F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicSupplement - { - get - { - return Volatile.Read(ref _arabicSupplement) ?? CreateBlock(ref _arabicSupplement, first: '\u0750', last: '\u077F'); - } - } - private static UnicodeBlock _arabicSupplement; - - /// - /// Represents the 'Thaana' Unicode block (U+0780..U+07BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Thaana - { - get - { - return Volatile.Read(ref _thaana) ?? CreateBlock(ref _thaana, first: '\u0780', last: '\u07BF'); - } - } - private static UnicodeBlock _thaana; - - /// - /// Represents the 'NKo' Unicode block (U+07C0..U+07FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock NKo - { - get - { - return Volatile.Read(ref _nKo) ?? CreateBlock(ref _nKo, first: '\u07C0', last: '\u07FF'); - } - } - private static UnicodeBlock _nKo; - - /// - /// Represents the 'Samaritan' Unicode block (U+0800..U+083F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Samaritan - { - get - { - return Volatile.Read(ref _samaritan) ?? CreateBlock(ref _samaritan, first: '\u0800', last: '\u083F'); - } - } - private static UnicodeBlock _samaritan; - - /// - /// Represents the 'Mandaic' Unicode block (U+0840..U+085F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Mandaic - { - get - { - return Volatile.Read(ref _mandaic) ?? CreateBlock(ref _mandaic, first: '\u0840', last: '\u085F'); - } - } - private static UnicodeBlock _mandaic; - - /// - /// Represents the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicExtendedA - { - get - { - return Volatile.Read(ref _arabicExtendedA) ?? CreateBlock(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); - } - } - private static UnicodeBlock _arabicExtendedA; - - /// - /// Represents the 'Devanagari' Unicode block (U+0900..U+097F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Devanagari - { - get - { - return Volatile.Read(ref _devanagari) ?? CreateBlock(ref _devanagari, first: '\u0900', last: '\u097F'); - } - } - private static UnicodeBlock _devanagari; - - /// - /// Represents the 'Bengali' Unicode block (U+0980..U+09FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Bengali - { - get - { - return Volatile.Read(ref _bengali) ?? CreateBlock(ref _bengali, first: '\u0980', last: '\u09FF'); - } - } - private static UnicodeBlock _bengali; - - /// - /// Represents the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Gurmukhi - { - get - { - return Volatile.Read(ref _gurmukhi) ?? CreateBlock(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); - } - } - private static UnicodeBlock _gurmukhi; - - /// - /// Represents the 'Gujarati' Unicode block (U+0A80..U+0AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Gujarati - { - get - { - return Volatile.Read(ref _gujarati) ?? CreateBlock(ref _gujarati, first: '\u0A80', last: '\u0AFF'); - } - } - private static UnicodeBlock _gujarati; - - /// - /// Represents the 'Oriya' Unicode block (U+0B00..U+0B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Oriya - { - get - { - return Volatile.Read(ref _oriya) ?? CreateBlock(ref _oriya, first: '\u0B00', last: '\u0B7F'); - } - } - private static UnicodeBlock _oriya; - - /// - /// Represents the 'Tamil' Unicode block (U+0B80..U+0BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tamil - { - get - { - return Volatile.Read(ref _tamil) ?? CreateBlock(ref _tamil, first: '\u0B80', last: '\u0BFF'); - } - } - private static UnicodeBlock _tamil; - - /// - /// Represents the 'Telugu' Unicode block (U+0C00..U+0C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Telugu - { - get - { - return Volatile.Read(ref _telugu) ?? CreateBlock(ref _telugu, first: '\u0C00', last: '\u0C7F'); - } - } - private static UnicodeBlock _telugu; - - /// - /// Represents the 'Kannada' Unicode block (U+0C80..U+0CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Kannada - { - get - { - return Volatile.Read(ref _kannada) ?? CreateBlock(ref _kannada, first: '\u0C80', last: '\u0CFF'); - } - } - private static UnicodeBlock _kannada; - - /// - /// Represents the 'Malayalam' Unicode block (U+0D00..U+0D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Malayalam - { - get - { - return Volatile.Read(ref _malayalam) ?? CreateBlock(ref _malayalam, first: '\u0D00', last: '\u0D7F'); - } - } - private static UnicodeBlock _malayalam; - - /// - /// Represents the 'Sinhala' Unicode block (U+0D80..U+0DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Sinhala - { - get - { - return Volatile.Read(ref _sinhala) ?? CreateBlock(ref _sinhala, first: '\u0D80', last: '\u0DFF'); - } - } - private static UnicodeBlock _sinhala; - - /// - /// Represents the 'Thai' Unicode block (U+0E00..U+0E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Thai - { - get - { - return Volatile.Read(ref _thai) ?? CreateBlock(ref _thai, first: '\u0E00', last: '\u0E7F'); - } - } - private static UnicodeBlock _thai; - - /// - /// Represents the 'Lao' Unicode block (U+0E80..U+0EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Lao - { - get - { - return Volatile.Read(ref _lao) ?? CreateBlock(ref _lao, first: '\u0E80', last: '\u0EFF'); - } - } - private static UnicodeBlock _lao; - - /// - /// Represents the 'Tibetan' Unicode block (U+0F00..U+0FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tibetan - { - get - { - return Volatile.Read(ref _tibetan) ?? CreateBlock(ref _tibetan, first: '\u0F00', last: '\u0FFF'); - } - } - private static UnicodeBlock _tibetan; - - /// - /// Represents the 'Myanmar' Unicode block (U+1000..U+109F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Myanmar - { - get - { - return Volatile.Read(ref _myanmar) ?? CreateBlock(ref _myanmar, first: '\u1000', last: '\u109F'); - } - } - private static UnicodeBlock _myanmar; - - /// - /// Represents the 'Georgian' Unicode block (U+10A0..U+10FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Georgian - { - get - { - return Volatile.Read(ref _georgian) ?? CreateBlock(ref _georgian, first: '\u10A0', last: '\u10FF'); - } - } - private static UnicodeBlock _georgian; - - /// - /// Represents the 'Hangul Jamo' Unicode block (U+1100..U+11FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulJamo - { - get - { - return Volatile.Read(ref _hangulJamo) ?? CreateBlock(ref _hangulJamo, first: '\u1100', last: '\u11FF'); - } - } - private static UnicodeBlock _hangulJamo; - - /// - /// Represents the 'Ethiopic' Unicode block (U+1200..U+137F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Ethiopic - { - get - { - return Volatile.Read(ref _ethiopic) ?? CreateBlock(ref _ethiopic, first: '\u1200', last: '\u137F'); - } - } - private static UnicodeBlock _ethiopic; - - /// - /// Represents the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EthiopicSupplement - { - get - { - return Volatile.Read(ref _ethiopicSupplement) ?? CreateBlock(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); - } - } - private static UnicodeBlock _ethiopicSupplement; - - /// - /// Represents the 'Cherokee' Unicode block (U+13A0..U+13FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Cherokee - { - get - { - return Volatile.Read(ref _cherokee) ?? CreateBlock(ref _cherokee, first: '\u13A0', last: '\u13FF'); - } - } - private static UnicodeBlock _cherokee; - - /// - /// Represents the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock UnifiedCanadianAboriginalSyllabics - { - get - { - return Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); - } - } - private static UnicodeBlock _unifiedCanadianAboriginalSyllabics; - - /// - /// Represents the 'Ogham' Unicode block (U+1680..U+169F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Ogham - { - get - { - return Volatile.Read(ref _ogham) ?? CreateBlock(ref _ogham, first: '\u1680', last: '\u169F'); - } - } - private static UnicodeBlock _ogham; - - /// - /// Represents the 'Runic' Unicode block (U+16A0..U+16FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Runic - { - get - { - return Volatile.Read(ref _runic) ?? CreateBlock(ref _runic, first: '\u16A0', last: '\u16FF'); - } - } - private static UnicodeBlock _runic; - - /// - /// Represents the 'Tagalog' Unicode block (U+1700..U+171F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tagalog - { - get - { - return Volatile.Read(ref _tagalog) ?? CreateBlock(ref _tagalog, first: '\u1700', last: '\u171F'); - } - } - private static UnicodeBlock _tagalog; - - /// - /// Represents the 'Hanunoo' Unicode block (U+1720..U+173F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Hanunoo - { - get - { - return Volatile.Read(ref _hanunoo) ?? CreateBlock(ref _hanunoo, first: '\u1720', last: '\u173F'); - } - } - private static UnicodeBlock _hanunoo; - - /// - /// Represents the 'Buhid' Unicode block (U+1740..U+175F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Buhid - { - get - { - return Volatile.Read(ref _buhid) ?? CreateBlock(ref _buhid, first: '\u1740', last: '\u175F'); - } - } - private static UnicodeBlock _buhid; - - /// - /// Represents the 'Tagbanwa' Unicode block (U+1760..U+177F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tagbanwa - { - get - { - return Volatile.Read(ref _tagbanwa) ?? CreateBlock(ref _tagbanwa, first: '\u1760', last: '\u177F'); - } - } - private static UnicodeBlock _tagbanwa; - - /// - /// Represents the 'Khmer' Unicode block (U+1780..U+17FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Khmer - { - get - { - return Volatile.Read(ref _khmer) ?? CreateBlock(ref _khmer, first: '\u1780', last: '\u17FF'); - } - } - private static UnicodeBlock _khmer; - - /// - /// Represents the 'Mongolian' Unicode block (U+1800..U+18AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Mongolian - { - get - { - return Volatile.Read(ref _mongolian) ?? CreateBlock(ref _mongolian, first: '\u1800', last: '\u18AF'); - } - } - private static UnicodeBlock _mongolian; - - /// - /// Represents the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock UnifiedCanadianAboriginalSyllabicsExtended - { - get - { - return Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateBlock(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); - } - } - private static UnicodeBlock _unifiedCanadianAboriginalSyllabicsExtended; - - /// - /// Represents the 'Limbu' Unicode block (U+1900..U+194F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Limbu - { - get - { - return Volatile.Read(ref _limbu) ?? CreateBlock(ref _limbu, first: '\u1900', last: '\u194F'); - } - } - private static UnicodeBlock _limbu; - - /// - /// Represents the 'Tai Le' Unicode block (U+1950..U+197F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. - /// - public static UnicodeBlock TaiLe - { - get - { - return Volatile.Read(ref _taiLe) ?? CreateBlock(ref _taiLe, first: '\u1950', last: '\u197F'); - } - } - private static UnicodeBlock _taiLe; - - /// - /// Represents the 'New Tai Lue' Unicode block (U+1980..U+19DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock NewTaiLue - { - get - { - return Volatile.Read(ref _newTaiLue) ?? CreateBlock(ref _newTaiLue, first: '\u1980', last: '\u19DF'); - } - } - private static UnicodeBlock _newTaiLue; - - /// - /// Represents the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KhmerSymbols - { - get - { - return Volatile.Read(ref _khmerSymbols) ?? CreateBlock(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); - } - } - private static UnicodeBlock _khmerSymbols; - - /// - /// Represents the 'Buginese' Unicode block (U+1A00..U+1A1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Buginese - { - get - { - return Volatile.Read(ref _buginese) ?? CreateBlock(ref _buginese, first: '\u1A00', last: '\u1A1F'); - } - } - private static UnicodeBlock _buginese; - - /// - /// Represents the 'Tai Tham' Unicode block (U+1A20..U+1AAF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. - /// - public static UnicodeBlock TaiTham - { - get - { - return Volatile.Read(ref _taiTham) ?? CreateBlock(ref _taiTham, first: '\u1A20', last: '\u1AAF'); - } - } - private static UnicodeBlock _taiTham; - - /// - /// Represents the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarksExtended - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateBlock(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); - } - } - private static UnicodeBlock _combiningDiacriticalMarksExtended; - - /// - /// Represents the 'Balinese' Unicode block (U+1B00..U+1B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Balinese - { - get - { - return Volatile.Read(ref _balinese) ?? CreateBlock(ref _balinese, first: '\u1B00', last: '\u1B7F'); - } - } - private static UnicodeBlock _balinese; - - /// - /// Represents the 'Sundanese' Unicode block (U+1B80..U+1BBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Sundanese - { - get - { - return Volatile.Read(ref _sundanese) ?? CreateBlock(ref _sundanese, first: '\u1B80', last: '\u1BBF'); - } - } - private static UnicodeBlock _sundanese; - - /// - /// Represents the 'Batak' Unicode block (U+1BC0..U+1BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Batak - { - get - { - return Volatile.Read(ref _batak) ?? CreateBlock(ref _batak, first: '\u1BC0', last: '\u1BFF'); - } - } - private static UnicodeBlock _batak; - - /// - /// Represents the 'Lepcha' Unicode block (U+1C00..U+1C4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Lepcha - { - get - { - return Volatile.Read(ref _lepcha) ?? CreateBlock(ref _lepcha, first: '\u1C00', last: '\u1C4F'); - } - } - private static UnicodeBlock _lepcha; - - /// - /// Represents the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. - /// - public static UnicodeBlock OlChiki - { - get - { - return Volatile.Read(ref _olChiki) ?? CreateBlock(ref _olChiki, first: '\u1C50', last: '\u1C7F'); - } - } - private static UnicodeBlock _olChiki; - - /// - /// Represents the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SundaneseSupplement - { - get - { - return Volatile.Read(ref _sundaneseSupplement) ?? CreateBlock(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); - } - } - private static UnicodeBlock _sundaneseSupplement; - - /// - /// Represents the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock VedicExtensions - { - get - { - return Volatile.Read(ref _vedicExtensions) ?? CreateBlock(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); - } - } - private static UnicodeBlock _vedicExtensions; - - /// - /// Represents the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock PhoneticExtensions - { - get - { - return Volatile.Read(ref _phoneticExtensions) ?? CreateBlock(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); - } - } - private static UnicodeBlock _phoneticExtensions; - - /// - /// Represents the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock PhoneticExtensionsSupplement - { - get - { - return Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateBlock(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); - } - } - private static UnicodeBlock _phoneticExtensionsSupplement; - - /// - /// Represents the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarksSupplement - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateBlock(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); - } - } - private static UnicodeBlock _combiningDiacriticalMarksSupplement; - - /// - /// Represents the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedAdditional - { - get - { - return Volatile.Read(ref _latinExtendedAdditional) ?? CreateBlock(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); - } - } - private static UnicodeBlock _latinExtendedAdditional; - - /// - /// Represents the 'Greek Extended' Unicode block (U+1F00..U+1FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GreekExtended - { - get - { - return Volatile.Read(ref _greekExtended) ?? CreateBlock(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); - } - } - private static UnicodeBlock _greekExtended; - - /// - /// Represents the 'General Punctuation' Unicode block (U+2000..U+206F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GeneralPunctuation - { - get - { - return Volatile.Read(ref _generalPunctuation) ?? CreateBlock(ref _generalPunctuation, first: '\u2000', last: '\u206F'); - } - } - private static UnicodeBlock _generalPunctuation; - - /// - /// Represents the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SuperscriptsandSubscripts - { - get - { - return Volatile.Read(ref _superscriptsandSubscripts) ?? CreateBlock(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); - } - } - private static UnicodeBlock _superscriptsandSubscripts; - - /// - /// Represents the 'Currency Symbols' Unicode block (U+20A0..U+20CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CurrencySymbols - { - get - { - return Volatile.Read(ref _currencySymbols) ?? CreateBlock(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); - } - } - private static UnicodeBlock _currencySymbols; - - /// - /// Represents the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningDiacriticalMarksforSymbols - { - get - { - return Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateBlock(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); - } - } - private static UnicodeBlock _combiningDiacriticalMarksforSymbols; - - /// - /// Represents the 'Letterlike Symbols' Unicode block (U+2100..U+214F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LetterlikeSymbols - { - get - { - return Volatile.Read(ref _letterlikeSymbols) ?? CreateBlock(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); - } - } - private static UnicodeBlock _letterlikeSymbols; - - /// - /// Represents the 'Number Forms' Unicode block (U+2150..U+218F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. - /// - public static UnicodeBlock NumberForms - { - get - { - return Volatile.Read(ref _numberForms) ?? CreateBlock(ref _numberForms, first: '\u2150', last: '\u218F'); - } - } - private static UnicodeBlock _numberForms; - - /// - /// Represents the 'Arrows' Unicode block (U+2190..U+21FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Arrows - { - get - { - return Volatile.Read(ref _arrows) ?? CreateBlock(ref _arrows, first: '\u2190', last: '\u21FF'); - } - } - private static UnicodeBlock _arrows; - - /// - /// Represents the 'Mathematical Operators' Unicode block (U+2200..U+22FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MathematicalOperators - { - get - { - return Volatile.Read(ref _mathematicalOperators) ?? CreateBlock(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); - } - } - private static UnicodeBlock _mathematicalOperators; - - /// - /// Represents the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousTechnical - { - get - { - return Volatile.Read(ref _miscellaneousTechnical) ?? CreateBlock(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); - } - } - private static UnicodeBlock _miscellaneousTechnical; - - /// - /// Represents the 'Control Pictures' Unicode block (U+2400..U+243F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ControlPictures - { - get - { - return Volatile.Read(ref _controlPictures) ?? CreateBlock(ref _controlPictures, first: '\u2400', last: '\u243F'); - } - } - private static UnicodeBlock _controlPictures; - - /// - /// Represents the 'Optical Character Recognition' Unicode block (U+2440..U+245F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. - /// - public static UnicodeBlock OpticalCharacterRecognition - { - get - { - return Volatile.Read(ref _opticalCharacterRecognition) ?? CreateBlock(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); - } - } - private static UnicodeBlock _opticalCharacterRecognition; - - /// - /// Represents the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EnclosedAlphanumerics - { - get - { - return Volatile.Read(ref _enclosedAlphanumerics) ?? CreateBlock(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); - } - } - private static UnicodeBlock _enclosedAlphanumerics; - - /// - /// Represents the 'Box Drawing' Unicode block (U+2500..U+257F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BoxDrawing - { - get - { - return Volatile.Read(ref _boxDrawing) ?? CreateBlock(ref _boxDrawing, first: '\u2500', last: '\u257F'); - } - } - private static UnicodeBlock _boxDrawing; - - /// - /// Represents the 'Block Elements' Unicode block (U+2580..U+259F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BlockElements - { - get - { - return Volatile.Read(ref _blockElements) ?? CreateBlock(ref _blockElements, first: '\u2580', last: '\u259F'); - } - } - private static UnicodeBlock _blockElements; - - /// - /// Represents the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GeometricShapes - { - get - { - return Volatile.Read(ref _geometricShapes) ?? CreateBlock(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); - } - } - private static UnicodeBlock _geometricShapes; - - /// - /// Represents the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousSymbols - { - get - { - return Volatile.Read(ref _miscellaneousSymbols) ?? CreateBlock(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); - } - } - private static UnicodeBlock _miscellaneousSymbols; - - /// - /// Represents the 'Dingbats' Unicode block (U+2700..U+27BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Dingbats - { - get - { - return Volatile.Read(ref _dingbats) ?? CreateBlock(ref _dingbats, first: '\u2700', last: '\u27BF'); - } - } - private static UnicodeBlock _dingbats; - - /// - /// Represents the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousMathematicalSymbolsA - { - get - { - return Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); - } - } - private static UnicodeBlock _miscellaneousMathematicalSymbolsA; - - /// - /// Represents the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalArrowsA - { - get - { - return Volatile.Read(ref _supplementalArrowsA) ?? CreateBlock(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); - } - } - private static UnicodeBlock _supplementalArrowsA; - - /// - /// Represents the 'Braille Patterns' Unicode block (U+2800..U+28FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BraillePatterns - { - get - { - return Volatile.Read(ref _braillePatterns) ?? CreateBlock(ref _braillePatterns, first: '\u2800', last: '\u28FF'); - } - } - private static UnicodeBlock _braillePatterns; - - /// - /// Represents the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalArrowsB - { - get - { - return Volatile.Read(ref _supplementalArrowsB) ?? CreateBlock(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); - } - } - private static UnicodeBlock _supplementalArrowsB; - - /// - /// Represents the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousMathematicalSymbolsB - { - get - { - return Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateBlock(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); - } - } - private static UnicodeBlock _miscellaneousMathematicalSymbolsB; - - /// - /// Represents the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalMathematicalOperators - { - get - { - return Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateBlock(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); - } - } - private static UnicodeBlock _supplementalMathematicalOperators; - - /// - /// Represents the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MiscellaneousSymbolsandArrows - { - get - { - return Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateBlock(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); - } - } - private static UnicodeBlock _miscellaneousSymbolsandArrows; - - /// - /// Represents the 'Glagolitic' Unicode block (U+2C00..U+2C5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Glagolitic - { - get - { - return Volatile.Read(ref _glagolitic) ?? CreateBlock(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); - } - } - private static UnicodeBlock _glagolitic; - - /// - /// Represents the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedC - { - get - { - return Volatile.Read(ref _latinExtendedC) ?? CreateBlock(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); - } - } - private static UnicodeBlock _latinExtendedC; - - /// - /// Represents the 'Coptic' Unicode block (U+2C80..U+2CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Coptic - { - get - { - return Volatile.Read(ref _coptic) ?? CreateBlock(ref _coptic, first: '\u2C80', last: '\u2CFF'); - } - } - private static UnicodeBlock _coptic; - - /// - /// Represents the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock GeorgianSupplement - { - get - { - return Volatile.Read(ref _georgianSupplement) ?? CreateBlock(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); - } - } - private static UnicodeBlock _georgianSupplement; - - /// - /// Represents the 'Tifinagh' Unicode block (U+2D30..U+2D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Tifinagh - { - get - { - return Volatile.Read(ref _tifinagh) ?? CreateBlock(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); - } - } - private static UnicodeBlock _tifinagh; - - /// - /// Represents the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EthiopicExtended - { - get - { - return Volatile.Read(ref _ethiopicExtended) ?? CreateBlock(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); - } - } - private static UnicodeBlock _ethiopicExtended; - - /// - /// Represents the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CyrillicExtendedA - { - get - { - return Volatile.Read(ref _cyrillicExtendedA) ?? CreateBlock(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); - } - } - private static UnicodeBlock _cyrillicExtendedA; - - /// - /// Represents the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SupplementalPunctuation - { - get - { - return Volatile.Read(ref _supplementalPunctuation) ?? CreateBlock(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); - } - } - private static UnicodeBlock _supplementalPunctuation; - - /// - /// Represents the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKRadicalsSupplement - { - get - { - return Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateBlock(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); - } - } - private static UnicodeBlock _cjkRadicalsSupplement; - - /// - /// Represents the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KangxiRadicals - { - get - { - return Volatile.Read(ref _kangxiRadicals) ?? CreateBlock(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); - } - } - private static UnicodeBlock _kangxiRadicals; - - /// - /// Represents the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock IdeographicDescriptionCharacters - { - get - { - return Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateBlock(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); - } - } - private static UnicodeBlock _ideographicDescriptionCharacters; - - /// - /// Represents the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKSymbolsandPunctuation - { - get - { - return Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateBlock(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); - } - } - private static UnicodeBlock _cjkSymbolsandPunctuation; - - /// - /// Represents the 'Hiragana' Unicode block (U+3040..U+309F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Hiragana - { - get - { - return Volatile.Read(ref _hiragana) ?? CreateBlock(ref _hiragana, first: '\u3040', last: '\u309F'); - } - } - private static UnicodeBlock _hiragana; - - /// - /// Represents the 'Katakana' Unicode block (U+30A0..U+30FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Katakana - { - get - { - return Volatile.Read(ref _katakana) ?? CreateBlock(ref _katakana, first: '\u30A0', last: '\u30FF'); - } - } - private static UnicodeBlock _katakana; - - /// - /// Represents the 'Bopomofo' Unicode block (U+3100..U+312F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Bopomofo - { - get - { - return Volatile.Read(ref _bopomofo) ?? CreateBlock(ref _bopomofo, first: '\u3100', last: '\u312F'); - } - } - private static UnicodeBlock _bopomofo; - - /// - /// Represents the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulCompatibilityJamo - { - get - { - return Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateBlock(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); - } - } - private static UnicodeBlock _hangulCompatibilityJamo; - - /// - /// Represents the 'Kanbun' Unicode block (U+3190..U+319F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Kanbun - { - get - { - return Volatile.Read(ref _kanbun) ?? CreateBlock(ref _kanbun, first: '\u3190', last: '\u319F'); - } - } - private static UnicodeBlock _kanbun; - - /// - /// Represents the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock BopomofoExtended - { - get - { - return Volatile.Read(ref _bopomofoExtended) ?? CreateBlock(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); - } - } - private static UnicodeBlock _bopomofoExtended; - - /// - /// Represents the 'CJK Strokes' Unicode block (U+31C0..U+31EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKStrokes - { - get - { - return Volatile.Read(ref _cjkStrokes) ?? CreateBlock(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); - } - } - private static UnicodeBlock _cjkStrokes; - - /// - /// Represents the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KatakanaPhoneticExtensions - { - get - { - return Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateBlock(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); - } - } - private static UnicodeBlock _katakanaPhoneticExtensions; - - /// - /// Represents the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EnclosedCJKLettersandMonths - { - get - { - return Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateBlock(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); - } - } - private static UnicodeBlock _enclosedCJKLettersandMonths; - - /// - /// Represents the 'CJK Compatibility' Unicode block (U+3300..U+33FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKCompatibility - { - get - { - return Volatile.Read(ref _cjkCompatibility) ?? CreateBlock(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); - } - } - private static UnicodeBlock _cjkCompatibility; - - /// - /// Represents the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKUnifiedIdeographsExtensionA - { - get - { - return Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateBlock(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); - } - } - private static UnicodeBlock _cjkUnifiedIdeographsExtensionA; - - /// - /// Represents the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock YijingHexagramSymbols - { - get - { - return Volatile.Read(ref _yijingHexagramSymbols) ?? CreateBlock(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); - } - } - private static UnicodeBlock _yijingHexagramSymbols; - - /// - /// Represents the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKUnifiedIdeographs - { - get - { - return Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateBlock(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); - } - } - private static UnicodeBlock _cjkUnifiedIdeographs; - - /// - /// Represents the 'Yi Syllables' Unicode block (U+A000..U+A48F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. - /// - public static UnicodeBlock YiSyllables - { - get - { - return Volatile.Read(ref _yiSyllables) ?? CreateBlock(ref _yiSyllables, first: '\uA000', last: '\uA48F'); - } - } - private static UnicodeBlock _yiSyllables; - - /// - /// Represents the 'Yi Radicals' Unicode block (U+A490..U+A4CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. - /// - public static UnicodeBlock YiRadicals - { - get - { - return Volatile.Read(ref _yiRadicals) ?? CreateBlock(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); - } - } - private static UnicodeBlock _yiRadicals; - - /// - /// Represents the 'Lisu' Unicode block (U+A4D0..U+A4FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Lisu - { - get - { - return Volatile.Read(ref _lisu) ?? CreateBlock(ref _lisu, first: '\uA4D0', last: '\uA4FF'); - } - } - private static UnicodeBlock _lisu; - - /// - /// Represents the 'Vai' Unicode block (U+A500..U+A63F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Vai - { - get - { - return Volatile.Read(ref _vai) ?? CreateBlock(ref _vai, first: '\uA500', last: '\uA63F'); - } - } - private static UnicodeBlock _vai; - - /// - /// Represents the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CyrillicExtendedB - { - get - { - return Volatile.Read(ref _cyrillicExtendedB) ?? CreateBlock(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); - } - } - private static UnicodeBlock _cyrillicExtendedB; - - /// - /// Represents the 'Bamum' Unicode block (U+A6A0..U+A6FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Bamum - { - get - { - return Volatile.Read(ref _bamum) ?? CreateBlock(ref _bamum, first: '\uA6A0', last: '\uA6FF'); - } - } - private static UnicodeBlock _bamum; - - /// - /// Represents the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ModifierToneLetters - { - get - { - return Volatile.Read(ref _modifierToneLetters) ?? CreateBlock(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); - } - } - private static UnicodeBlock _modifierToneLetters; - - /// - /// Represents the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedD - { - get - { - return Volatile.Read(ref _latinExtendedD) ?? CreateBlock(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); - } - } - private static UnicodeBlock _latinExtendedD; - - /// - /// Represents the 'Syloti Nagri' Unicode block (U+A800..U+A82F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SylotiNagri - { - get - { - return Volatile.Read(ref _sylotiNagri) ?? CreateBlock(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); - } - } - private static UnicodeBlock _sylotiNagri; - - /// - /// Represents the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CommonIndicNumberForms - { - get - { - return Volatile.Read(ref _commonIndicNumberForms) ?? CreateBlock(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); - } - } - private static UnicodeBlock _commonIndicNumberForms; - - /// - /// Represents the 'Phags-pa' Unicode block (U+A840..U+A87F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Phagspa - { - get - { - return Volatile.Read(ref _phagspa) ?? CreateBlock(ref _phagspa, first: '\uA840', last: '\uA87F'); - } - } - private static UnicodeBlock _phagspa; - - /// - /// Represents the 'Saurashtra' Unicode block (U+A880..U+A8DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Saurashtra - { - get - { - return Volatile.Read(ref _saurashtra) ?? CreateBlock(ref _saurashtra, first: '\uA880', last: '\uA8DF'); - } - } - private static UnicodeBlock _saurashtra; - - /// - /// Represents the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock DevanagariExtended - { - get - { - return Volatile.Read(ref _devanagariExtended) ?? CreateBlock(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); - } - } - private static UnicodeBlock _devanagariExtended; - - /// - /// Represents the 'Kayah Li' Unicode block (U+A900..U+A92F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock KayahLi - { - get - { - return Volatile.Read(ref _kayahLi) ?? CreateBlock(ref _kayahLi, first: '\uA900', last: '\uA92F'); - } - } - private static UnicodeBlock _kayahLi; - - /// - /// Represents the 'Rejang' Unicode block (U+A930..U+A95F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Rejang - { - get - { - return Volatile.Read(ref _rejang) ?? CreateBlock(ref _rejang, first: '\uA930', last: '\uA95F'); - } - } - private static UnicodeBlock _rejang; - - /// - /// Represents the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulJamoExtendedA - { - get - { - return Volatile.Read(ref _hangulJamoExtendedA) ?? CreateBlock(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); - } - } - private static UnicodeBlock _hangulJamoExtendedA; - - /// - /// Represents the 'Javanese' Unicode block (U+A980..U+A9DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Javanese - { - get - { - return Volatile.Read(ref _javanese) ?? CreateBlock(ref _javanese, first: '\uA980', last: '\uA9DF'); - } - } - private static UnicodeBlock _javanese; - - /// - /// Represents the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MyanmarExtendedB - { - get - { - return Volatile.Read(ref _myanmarExtendedB) ?? CreateBlock(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); - } - } - private static UnicodeBlock _myanmarExtendedB; - - /// - /// Represents the 'Cham' Unicode block (U+AA00..U+AA5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Cham - { - get - { - return Volatile.Read(ref _cham) ?? CreateBlock(ref _cham, first: '\uAA00', last: '\uAA5F'); - } - } - private static UnicodeBlock _cham; - - /// - /// Represents the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MyanmarExtendedA - { - get - { - return Volatile.Read(ref _myanmarExtendedA) ?? CreateBlock(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); - } - } - private static UnicodeBlock _myanmarExtendedA; - - /// - /// Represents the 'Tai Viet' Unicode block (U+AA80..U+AADF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. - /// - public static UnicodeBlock TaiViet - { - get - { - return Volatile.Read(ref _taiViet) ?? CreateBlock(ref _taiViet, first: '\uAA80', last: '\uAADF'); - } - } - private static UnicodeBlock _taiViet; - - /// - /// Represents the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MeeteiMayekExtensions - { - get - { - return Volatile.Read(ref _meeteiMayekExtensions) ?? CreateBlock(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); - } - } - private static UnicodeBlock _meeteiMayekExtensions; - - /// - /// Represents the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock EthiopicExtendedA - { - get - { - return Volatile.Read(ref _ethiopicExtendedA) ?? CreateBlock(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); - } - } - private static UnicodeBlock _ethiopicExtendedA; - - /// - /// Represents the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. - /// - public static UnicodeBlock LatinExtendedE - { - get - { - return Volatile.Read(ref _latinExtendedE) ?? CreateBlock(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); - } - } - private static UnicodeBlock _latinExtendedE; - - /// - /// Represents the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock MeeteiMayek - { - get - { - return Volatile.Read(ref _meeteiMayek) ?? CreateBlock(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); - } - } - private static UnicodeBlock _meeteiMayek; - - /// - /// Represents the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulSyllables - { - get - { - return Volatile.Read(ref _hangulSyllables) ?? CreateBlock(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); - } - } - private static UnicodeBlock _hangulSyllables; - - /// - /// Represents the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HangulJamoExtendedB - { - get - { - return Volatile.Read(ref _hangulJamoExtendedB) ?? CreateBlock(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); - } - } - private static UnicodeBlock _hangulJamoExtendedB; - - /// - /// Represents the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKCompatibilityIdeographs - { - get - { - return Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateBlock(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); - } - } - private static UnicodeBlock _cjkCompatibilityIdeographs; - - /// - /// Represents the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock AlphabeticPresentationForms - { - get - { - return Volatile.Read(ref _alphabeticPresentationForms) ?? CreateBlock(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); - } - } - private static UnicodeBlock _alphabeticPresentationForms; - - /// - /// Represents the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicPresentationFormsA - { - get - { - return Volatile.Read(ref _arabicPresentationFormsA) ?? CreateBlock(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); - } - } - private static UnicodeBlock _arabicPresentationFormsA; - - /// - /// Represents the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock VariationSelectors - { - get - { - return Volatile.Read(ref _variationSelectors) ?? CreateBlock(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); - } - } - private static UnicodeBlock _variationSelectors; - - /// - /// Represents the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. - /// - public static UnicodeBlock VerticalForms - { - get - { - return Volatile.Read(ref _verticalForms) ?? CreateBlock(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); - } - } - private static UnicodeBlock _verticalForms; - - /// - /// Represents the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CombiningHalfMarks - { - get - { - return Volatile.Read(ref _combiningHalfMarks) ?? CreateBlock(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); - } - } - private static UnicodeBlock _combiningHalfMarks; - - /// - /// Represents the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. - /// - public static UnicodeBlock CJKCompatibilityForms - { - get - { - return Volatile.Read(ref _cjkCompatibilityForms) ?? CreateBlock(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); - } - } - private static UnicodeBlock _cjkCompatibilityForms; - - /// - /// Represents the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. - /// - public static UnicodeBlock SmallFormVariants - { - get - { - return Volatile.Read(ref _smallFormVariants) ?? CreateBlock(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); - } - } - private static UnicodeBlock _smallFormVariants; - - /// - /// Represents the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. - /// - public static UnicodeBlock ArabicPresentationFormsB - { - get - { - return Volatile.Read(ref _arabicPresentationFormsB) ?? CreateBlock(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); - } - } - private static UnicodeBlock _arabicPresentationFormsB; - - /// - /// Represents the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. - /// - public static UnicodeBlock HalfwidthandFullwidthForms - { - get - { - return Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateBlock(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); - } - } - private static UnicodeBlock _halfwidthandFullwidthForms; - - /// - /// Represents the 'Specials' Unicode block (U+FFF0..U+FFFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. - /// - public static UnicodeBlock Specials - { - get - { - return Volatile.Read(ref _specials) ?? CreateBlock(ref _specials, first: '\uFFF0', last: '\uFFFF'); - } - } - private static UnicodeBlock _specials; - } -} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs b/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs new file mode 100644 index 0000000000..04474ef759 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs @@ -0,0 +1,64 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Represents a contiguous range of Unicode code points. + /// + /// + /// Currently only the Basic Multilingual Plane is supported. + /// + public sealed class UnicodeRange + { + /// + /// Creates a new . + /// + /// The first code point in the range. + /// The number of code points in the range. + public UnicodeRange(int firstCodePoint, int rangeSize) + { + // Parameter checking: the first code point and last code point must + // lie within the BMP. See http://unicode.org/faq/blocks_ranges.html for more info. + if (firstCodePoint < 0 || firstCodePoint > 0xFFFF) + { + throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); + } + if (rangeSize < 0 || ((long)firstCodePoint + (long)rangeSize > 0x10000)) + { + throw new ArgumentOutOfRangeException(nameof(rangeSize)); + } + + FirstCodePoint = firstCodePoint; + RangeSize = rangeSize; + } + + /// + /// The first code point in this range. + /// + public int FirstCodePoint { get; } + + /// + /// The number of code points in this range. + /// + public int RangeSize { get; } + + /// + /// Creates a new from a span of characters. + /// + /// The first character in the range. + /// The last character in the range. + /// The representing this span. + public static UnicodeRange FromSpan(char firstChar, char lastChar) + { + if (lastChar < firstChar) + { + throw new ArgumentOutOfRangeException(nameof(lastChar)); + } + + return new UnicodeRange(firstChar, 1 + (int)(lastChar - firstChar)); + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs new file mode 100644 index 0000000000..ccfac4b876 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs @@ -0,0 +1,51 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Runtime.CompilerServices; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Contains predefined instances which correspond to blocks + /// from the Unicode 7.0 specification. + /// + public static partial class UnicodeRanges + { + /// + /// An empty . This range contains no code points. + /// + public static UnicodeRange None => Volatile.Read(ref _none) ?? CreateEmptyRange(ref _none); + private static UnicodeRange _none; + + /// + /// A which contains all characters in the Unicode Basic + /// Multilingual Plane (U+0000..U+FFFF). + /// + public static UnicodeRange All => Volatile.Read(ref _all) ?? CreateRange(ref _all, '\u0000', '\uFFFF'); + private static UnicodeRange _all; + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeRange CreateEmptyRange(ref UnicodeRange range) + { + // If the range hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'range' value. + var newRange = new UnicodeRange(0, 0); + Volatile.Write(ref range, newRange); + return newRange; + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method + private static UnicodeRange CreateRange(ref UnicodeRange range, char first, char last) + { + // If the range hasn't been created, create it now. + // It's ok if two threads race and one overwrites the other's 'range' value. + Debug.Assert(last > first, "Code points were specified out of order."); + var newRange = UnicodeRange.FromSpan(first, last); + Volatile.Write(ref range, newRange); + return newRange; + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs new file mode 100644 index 0000000000..d5aced410b --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs @@ -0,0 +1,1406 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; + +namespace Microsoft.Framework.WebEncoders +{ + public static partial class UnicodeRanges + { + /// + /// A corresponding to the 'Basic Latin' Unicode block (U+0000..U+007F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. + /// + public static UnicodeRange BasicLatin => Volatile.Read(ref _basicLatin) ?? CreateRange(ref _basicLatin, first: '\u0000', last: '\u007F'); + private static UnicodeRange _basicLatin; + + /// + /// A corresponding to the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. + /// + public static UnicodeRange Latin1Supplement => Volatile.Read(ref _latin1Supplement) ?? CreateRange(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); + private static UnicodeRange _latin1Supplement; + + /// + /// A corresponding to the 'Latin Extended-A' Unicode block (U+0100..U+017F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedA => Volatile.Read(ref _latinExtendedA) ?? CreateRange(ref _latinExtendedA, first: '\u0100', last: '\u017F'); + private static UnicodeRange _latinExtendedA; + + /// + /// A corresponding to the 'Latin Extended-B' Unicode block (U+0180..U+024F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedB => Volatile.Read(ref _latinExtendedB) ?? CreateRange(ref _latinExtendedB, first: '\u0180', last: '\u024F'); + private static UnicodeRange _latinExtendedB; + + /// + /// A corresponding to the 'IPA Extensions' Unicode block (U+0250..U+02AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. + /// + public static UnicodeRange IPAExtensions => Volatile.Read(ref _ipaExtensions) ?? CreateRange(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); + private static UnicodeRange _ipaExtensions; + + /// + /// A corresponding to the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. + /// + public static UnicodeRange SpacingModifierLetters => Volatile.Read(ref _spacingModifierLetters) ?? CreateRange(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); + private static UnicodeRange _spacingModifierLetters; + + /// + /// A corresponding to the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarks => Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateRange(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); + private static UnicodeRange _combiningDiacriticalMarks; + + /// + /// A corresponding to the 'Greek and Coptic' Unicode block (U+0370..U+03FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. + /// + public static UnicodeRange GreekandCoptic => Volatile.Read(ref _greekandCoptic) ?? CreateRange(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); + private static UnicodeRange _greekandCoptic; + + /// + /// A corresponding to the 'Cyrillic' Unicode block (U+0400..U+04FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. + /// + public static UnicodeRange Cyrillic => Volatile.Read(ref _cyrillic) ?? CreateRange(ref _cyrillic, first: '\u0400', last: '\u04FF'); + private static UnicodeRange _cyrillic; + + /// + /// A corresponding to the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. + /// + public static UnicodeRange CyrillicSupplement => Volatile.Read(ref _cyrillicSupplement) ?? CreateRange(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); + private static UnicodeRange _cyrillicSupplement; + + /// + /// A corresponding to the 'Armenian' Unicode block (U+0530..U+058F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. + /// + public static UnicodeRange Armenian => Volatile.Read(ref _armenian) ?? CreateRange(ref _armenian, first: '\u0530', last: '\u058F'); + private static UnicodeRange _armenian; + + /// + /// A corresponding to the 'Hebrew' Unicode block (U+0590..U+05FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. + /// + public static UnicodeRange Hebrew => Volatile.Read(ref _hebrew) ?? CreateRange(ref _hebrew, first: '\u0590', last: '\u05FF'); + private static UnicodeRange _hebrew; + + /// + /// A corresponding to the 'Arabic' Unicode block (U+0600..U+06FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. + /// + public static UnicodeRange Arabic => Volatile.Read(ref _arabic) ?? CreateRange(ref _arabic, first: '\u0600', last: '\u06FF'); + private static UnicodeRange _arabic; + + /// + /// A corresponding to the 'Syriac' Unicode block (U+0700..U+074F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. + /// + public static UnicodeRange Syriac => Volatile.Read(ref _syriac) ?? CreateRange(ref _syriac, first: '\u0700', last: '\u074F'); + private static UnicodeRange _syriac; + + /// + /// A corresponding to the 'Arabic Supplement' Unicode block (U+0750..U+077F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicSupplement => Volatile.Read(ref _arabicSupplement) ?? CreateRange(ref _arabicSupplement, first: '\u0750', last: '\u077F'); + private static UnicodeRange _arabicSupplement; + + /// + /// A corresponding to the 'Thaana' Unicode block (U+0780..U+07BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. + /// + public static UnicodeRange Thaana => Volatile.Read(ref _thaana) ?? CreateRange(ref _thaana, first: '\u0780', last: '\u07BF'); + private static UnicodeRange _thaana; + + /// + /// A corresponding to the 'NKo' Unicode block (U+07C0..U+07FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. + /// + public static UnicodeRange NKo => Volatile.Read(ref _nKo) ?? CreateRange(ref _nKo, first: '\u07C0', last: '\u07FF'); + private static UnicodeRange _nKo; + + /// + /// A corresponding to the 'Samaritan' Unicode block (U+0800..U+083F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. + /// + public static UnicodeRange Samaritan => Volatile.Read(ref _samaritan) ?? CreateRange(ref _samaritan, first: '\u0800', last: '\u083F'); + private static UnicodeRange _samaritan; + + /// + /// A corresponding to the 'Mandaic' Unicode block (U+0840..U+085F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. + /// + public static UnicodeRange Mandaic => Volatile.Read(ref _mandaic) ?? CreateRange(ref _mandaic, first: '\u0840', last: '\u085F'); + private static UnicodeRange _mandaic; + + /// + /// A corresponding to the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicExtendedA => Volatile.Read(ref _arabicExtendedA) ?? CreateRange(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); + private static UnicodeRange _arabicExtendedA; + + /// + /// A corresponding to the 'Devanagari' Unicode block (U+0900..U+097F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. + /// + public static UnicodeRange Devanagari => Volatile.Read(ref _devanagari) ?? CreateRange(ref _devanagari, first: '\u0900', last: '\u097F'); + private static UnicodeRange _devanagari; + + /// + /// A corresponding to the 'Bengali' Unicode block (U+0980..U+09FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. + /// + public static UnicodeRange Bengali => Volatile.Read(ref _bengali) ?? CreateRange(ref _bengali, first: '\u0980', last: '\u09FF'); + private static UnicodeRange _bengali; + + /// + /// A corresponding to the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Gurmukhi => Volatile.Read(ref _gurmukhi) ?? CreateRange(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); + private static UnicodeRange _gurmukhi; + + /// + /// A corresponding to the 'Gujarati' Unicode block (U+0A80..U+0AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Gujarati => Volatile.Read(ref _gujarati) ?? CreateRange(ref _gujarati, first: '\u0A80', last: '\u0AFF'); + private static UnicodeRange _gujarati; + + /// + /// A corresponding to the 'Oriya' Unicode block (U+0B00..U+0B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Oriya => Volatile.Read(ref _oriya) ?? CreateRange(ref _oriya, first: '\u0B00', last: '\u0B7F'); + private static UnicodeRange _oriya; + + /// + /// A corresponding to the 'Tamil' Unicode block (U+0B80..U+0BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tamil => Volatile.Read(ref _tamil) ?? CreateRange(ref _tamil, first: '\u0B80', last: '\u0BFF'); + private static UnicodeRange _tamil; + + /// + /// A corresponding to the 'Telugu' Unicode block (U+0C00..U+0C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Telugu => Volatile.Read(ref _telugu) ?? CreateRange(ref _telugu, first: '\u0C00', last: '\u0C7F'); + private static UnicodeRange _telugu; + + /// + /// A corresponding to the 'Kannada' Unicode block (U+0C80..U+0CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Kannada => Volatile.Read(ref _kannada) ?? CreateRange(ref _kannada, first: '\u0C80', last: '\u0CFF'); + private static UnicodeRange _kannada; + + /// + /// A corresponding to the 'Malayalam' Unicode block (U+0D00..U+0D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Malayalam => Volatile.Read(ref _malayalam) ?? CreateRange(ref _malayalam, first: '\u0D00', last: '\u0D7F'); + private static UnicodeRange _malayalam; + + /// + /// A corresponding to the 'Sinhala' Unicode block (U+0D80..U+0DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Sinhala => Volatile.Read(ref _sinhala) ?? CreateRange(ref _sinhala, first: '\u0D80', last: '\u0DFF'); + private static UnicodeRange _sinhala; + + /// + /// A corresponding to the 'Thai' Unicode block (U+0E00..U+0E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Thai => Volatile.Read(ref _thai) ?? CreateRange(ref _thai, first: '\u0E00', last: '\u0E7F'); + private static UnicodeRange _thai; + + /// + /// A corresponding to the 'Lao' Unicode block (U+0E80..U+0EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Lao => Volatile.Read(ref _lao) ?? CreateRange(ref _lao, first: '\u0E80', last: '\u0EFF'); + private static UnicodeRange _lao; + + /// + /// A corresponding to the 'Tibetan' Unicode block (U+0F00..U+0FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tibetan => Volatile.Read(ref _tibetan) ?? CreateRange(ref _tibetan, first: '\u0F00', last: '\u0FFF'); + private static UnicodeRange _tibetan; + + /// + /// A corresponding to the 'Myanmar' Unicode block (U+1000..U+109F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. + /// + public static UnicodeRange Myanmar => Volatile.Read(ref _myanmar) ?? CreateRange(ref _myanmar, first: '\u1000', last: '\u109F'); + private static UnicodeRange _myanmar; + + /// + /// A corresponding to the 'Georgian' Unicode block (U+10A0..U+10FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Georgian => Volatile.Read(ref _georgian) ?? CreateRange(ref _georgian, first: '\u10A0', last: '\u10FF'); + private static UnicodeRange _georgian; + + /// + /// A corresponding to the 'Hangul Jamo' Unicode block (U+1100..U+11FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulJamo => Volatile.Read(ref _hangulJamo) ?? CreateRange(ref _hangulJamo, first: '\u1100', last: '\u11FF'); + private static UnicodeRange _hangulJamo; + + /// + /// A corresponding to the 'Ethiopic' Unicode block (U+1200..U+137F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. + /// + public static UnicodeRange Ethiopic => Volatile.Read(ref _ethiopic) ?? CreateRange(ref _ethiopic, first: '\u1200', last: '\u137F'); + private static UnicodeRange _ethiopic; + + /// + /// A corresponding to the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. + /// + public static UnicodeRange EthiopicSupplement => Volatile.Read(ref _ethiopicSupplement) ?? CreateRange(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); + private static UnicodeRange _ethiopicSupplement; + + /// + /// A corresponding to the 'Cherokee' Unicode block (U+13A0..U+13FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Cherokee => Volatile.Read(ref _cherokee) ?? CreateRange(ref _cherokee, first: '\u13A0', last: '\u13FF'); + private static UnicodeRange _cherokee; + + /// + /// A corresponding to the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. + /// + public static UnicodeRange UnifiedCanadianAboriginalSyllabics => Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); + private static UnicodeRange _unifiedCanadianAboriginalSyllabics; + + /// + /// A corresponding to the 'Ogham' Unicode block (U+1680..U+169F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. + /// + public static UnicodeRange Ogham => Volatile.Read(ref _ogham) ?? CreateRange(ref _ogham, first: '\u1680', last: '\u169F'); + private static UnicodeRange _ogham; + + /// + /// A corresponding to the 'Runic' Unicode block (U+16A0..U+16FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Runic => Volatile.Read(ref _runic) ?? CreateRange(ref _runic, first: '\u16A0', last: '\u16FF'); + private static UnicodeRange _runic; + + /// + /// A corresponding to the 'Tagalog' Unicode block (U+1700..U+171F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tagalog => Volatile.Read(ref _tagalog) ?? CreateRange(ref _tagalog, first: '\u1700', last: '\u171F'); + private static UnicodeRange _tagalog; + + /// + /// A corresponding to the 'Hanunoo' Unicode block (U+1720..U+173F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. + /// + public static UnicodeRange Hanunoo => Volatile.Read(ref _hanunoo) ?? CreateRange(ref _hanunoo, first: '\u1720', last: '\u173F'); + private static UnicodeRange _hanunoo; + + /// + /// A corresponding to the 'Buhid' Unicode block (U+1740..U+175F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. + /// + public static UnicodeRange Buhid => Volatile.Read(ref _buhid) ?? CreateRange(ref _buhid, first: '\u1740', last: '\u175F'); + private static UnicodeRange _buhid; + + /// + /// A corresponding to the 'Tagbanwa' Unicode block (U+1760..U+177F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tagbanwa => Volatile.Read(ref _tagbanwa) ?? CreateRange(ref _tagbanwa, first: '\u1760', last: '\u177F'); + private static UnicodeRange _tagbanwa; + + /// + /// A corresponding to the 'Khmer' Unicode block (U+1780..U+17FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. + /// + public static UnicodeRange Khmer => Volatile.Read(ref _khmer) ?? CreateRange(ref _khmer, first: '\u1780', last: '\u17FF'); + private static UnicodeRange _khmer; + + /// + /// A corresponding to the 'Mongolian' Unicode block (U+1800..U+18AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. + /// + public static UnicodeRange Mongolian => Volatile.Read(ref _mongolian) ?? CreateRange(ref _mongolian, first: '\u1800', last: '\u18AF'); + private static UnicodeRange _mongolian; + + /// + /// A corresponding to the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. + /// + public static UnicodeRange UnifiedCanadianAboriginalSyllabicsExtended => Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); + private static UnicodeRange _unifiedCanadianAboriginalSyllabicsExtended; + + /// + /// A corresponding to the 'Limbu' Unicode block (U+1900..U+194F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. + /// + public static UnicodeRange Limbu => Volatile.Read(ref _limbu) ?? CreateRange(ref _limbu, first: '\u1900', last: '\u194F'); + private static UnicodeRange _limbu; + + /// + /// A corresponding to the 'Tai Le' Unicode block (U+1950..U+197F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. + /// + public static UnicodeRange TaiLe => Volatile.Read(ref _taiLe) ?? CreateRange(ref _taiLe, first: '\u1950', last: '\u197F'); + private static UnicodeRange _taiLe; + + /// + /// A corresponding to the 'New Tai Lue' Unicode block (U+1980..U+19DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. + /// + public static UnicodeRange NewTaiLue => Volatile.Read(ref _newTaiLue) ?? CreateRange(ref _newTaiLue, first: '\u1980', last: '\u19DF'); + private static UnicodeRange _newTaiLue; + + /// + /// A corresponding to the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. + /// + public static UnicodeRange KhmerSymbols => Volatile.Read(ref _khmerSymbols) ?? CreateRange(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); + private static UnicodeRange _khmerSymbols; + + /// + /// A corresponding to the 'Buginese' Unicode block (U+1A00..U+1A1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Buginese => Volatile.Read(ref _buginese) ?? CreateRange(ref _buginese, first: '\u1A00', last: '\u1A1F'); + private static UnicodeRange _buginese; + + /// + /// A corresponding to the 'Tai Tham' Unicode block (U+1A20..U+1AAF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. + /// + public static UnicodeRange TaiTham => Volatile.Read(ref _taiTham) ?? CreateRange(ref _taiTham, first: '\u1A20', last: '\u1AAF'); + private static UnicodeRange _taiTham; + + /// + /// A corresponding to the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarksExtended => Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateRange(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); + private static UnicodeRange _combiningDiacriticalMarksExtended; + + /// + /// A corresponding to the 'Balinese' Unicode block (U+1B00..U+1B7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Balinese => Volatile.Read(ref _balinese) ?? CreateRange(ref _balinese, first: '\u1B00', last: '\u1B7F'); + private static UnicodeRange _balinese; + + /// + /// A corresponding to the 'Sundanese' Unicode block (U+1B80..U+1BBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Sundanese => Volatile.Read(ref _sundanese) ?? CreateRange(ref _sundanese, first: '\u1B80', last: '\u1BBF'); + private static UnicodeRange _sundanese; + + /// + /// A corresponding to the 'Batak' Unicode block (U+1BC0..U+1BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Batak => Volatile.Read(ref _batak) ?? CreateRange(ref _batak, first: '\u1BC0', last: '\u1BFF'); + private static UnicodeRange _batak; + + /// + /// A corresponding to the 'Lepcha' Unicode block (U+1C00..U+1C4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Lepcha => Volatile.Read(ref _lepcha) ?? CreateRange(ref _lepcha, first: '\u1C00', last: '\u1C4F'); + private static UnicodeRange _lepcha; + + /// + /// A corresponding to the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. + /// + public static UnicodeRange OlChiki => Volatile.Read(ref _olChiki) ?? CreateRange(ref _olChiki, first: '\u1C50', last: '\u1C7F'); + private static UnicodeRange _olChiki; + + /// + /// A corresponding to the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange SundaneseSupplement => Volatile.Read(ref _sundaneseSupplement) ?? CreateRange(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); + private static UnicodeRange _sundaneseSupplement; + + /// + /// A corresponding to the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. + /// + public static UnicodeRange VedicExtensions => Volatile.Read(ref _vedicExtensions) ?? CreateRange(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); + private static UnicodeRange _vedicExtensions; + + /// + /// A corresponding to the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. + /// + public static UnicodeRange PhoneticExtensions => Volatile.Read(ref _phoneticExtensions) ?? CreateRange(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); + private static UnicodeRange _phoneticExtensions; + + /// + /// A corresponding to the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. + /// + public static UnicodeRange PhoneticExtensionsSupplement => Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateRange(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); + private static UnicodeRange _phoneticExtensionsSupplement; + + /// + /// A corresponding to the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarksSupplement => Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateRange(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); + private static UnicodeRange _combiningDiacriticalMarksSupplement; + + /// + /// A corresponding to the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedAdditional => Volatile.Read(ref _latinExtendedAdditional) ?? CreateRange(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); + private static UnicodeRange _latinExtendedAdditional; + + /// + /// A corresponding to the 'Greek Extended' Unicode block (U+1F00..U+1FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. + /// + public static UnicodeRange GreekExtended => Volatile.Read(ref _greekExtended) ?? CreateRange(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); + private static UnicodeRange _greekExtended; + + /// + /// A corresponding to the 'General Punctuation' Unicode block (U+2000..U+206F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. + /// + public static UnicodeRange GeneralPunctuation => Volatile.Read(ref _generalPunctuation) ?? CreateRange(ref _generalPunctuation, first: '\u2000', last: '\u206F'); + private static UnicodeRange _generalPunctuation; + + /// + /// A corresponding to the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. + /// + public static UnicodeRange SuperscriptsandSubscripts => Volatile.Read(ref _superscriptsandSubscripts) ?? CreateRange(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); + private static UnicodeRange _superscriptsandSubscripts; + + /// + /// A corresponding to the 'Currency Symbols' Unicode block (U+20A0..U+20CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CurrencySymbols => Volatile.Read(ref _currencySymbols) ?? CreateRange(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); + private static UnicodeRange _currencySymbols; + + /// + /// A corresponding to the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningDiacriticalMarksforSymbols => Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateRange(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); + private static UnicodeRange _combiningDiacriticalMarksforSymbols; + + /// + /// A corresponding to the 'Letterlike Symbols' Unicode block (U+2100..U+214F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. + /// + public static UnicodeRange LetterlikeSymbols => Volatile.Read(ref _letterlikeSymbols) ?? CreateRange(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); + private static UnicodeRange _letterlikeSymbols; + + /// + /// A corresponding to the 'Number Forms' Unicode block (U+2150..U+218F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. + /// + public static UnicodeRange NumberForms => Volatile.Read(ref _numberForms) ?? CreateRange(ref _numberForms, first: '\u2150', last: '\u218F'); + private static UnicodeRange _numberForms; + + /// + /// A corresponding to the 'Arrows' Unicode block (U+2190..U+21FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. + /// + public static UnicodeRange Arrows => Volatile.Read(ref _arrows) ?? CreateRange(ref _arrows, first: '\u2190', last: '\u21FF'); + private static UnicodeRange _arrows; + + /// + /// A corresponding to the 'Mathematical Operators' Unicode block (U+2200..U+22FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. + /// + public static UnicodeRange MathematicalOperators => Volatile.Read(ref _mathematicalOperators) ?? CreateRange(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); + private static UnicodeRange _mathematicalOperators; + + /// + /// A corresponding to the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousTechnical => Volatile.Read(ref _miscellaneousTechnical) ?? CreateRange(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); + private static UnicodeRange _miscellaneousTechnical; + + /// + /// A corresponding to the 'Control Pictures' Unicode block (U+2400..U+243F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. + /// + public static UnicodeRange ControlPictures => Volatile.Read(ref _controlPictures) ?? CreateRange(ref _controlPictures, first: '\u2400', last: '\u243F'); + private static UnicodeRange _controlPictures; + + /// + /// A corresponding to the 'Optical Character Recognition' Unicode block (U+2440..U+245F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. + /// + public static UnicodeRange OpticalCharacterRecognition => Volatile.Read(ref _opticalCharacterRecognition) ?? CreateRange(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); + private static UnicodeRange _opticalCharacterRecognition; + + /// + /// A corresponding to the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. + /// + public static UnicodeRange EnclosedAlphanumerics => Volatile.Read(ref _enclosedAlphanumerics) ?? CreateRange(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); + private static UnicodeRange _enclosedAlphanumerics; + + /// + /// A corresponding to the 'Box Drawing' Unicode block (U+2500..U+257F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. + /// + public static UnicodeRange BoxDrawing => Volatile.Read(ref _boxDrawing) ?? CreateRange(ref _boxDrawing, first: '\u2500', last: '\u257F'); + private static UnicodeRange _boxDrawing; + + /// + /// A corresponding to the 'Block Elements' Unicode block (U+2580..U+259F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. + /// + public static UnicodeRange BlockElements => Volatile.Read(ref _blockElements) ?? CreateRange(ref _blockElements, first: '\u2580', last: '\u259F'); + private static UnicodeRange _blockElements; + + /// + /// A corresponding to the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange GeometricShapes => Volatile.Read(ref _geometricShapes) ?? CreateRange(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); + private static UnicodeRange _geometricShapes; + + /// + /// A corresponding to the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousSymbols => Volatile.Read(ref _miscellaneousSymbols) ?? CreateRange(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); + private static UnicodeRange _miscellaneousSymbols; + + /// + /// A corresponding to the 'Dingbats' Unicode block (U+2700..U+27BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. + /// + public static UnicodeRange Dingbats => Volatile.Read(ref _dingbats) ?? CreateRange(ref _dingbats, first: '\u2700', last: '\u27BF'); + private static UnicodeRange _dingbats; + + /// + /// A corresponding to the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousMathematicalSymbolsA => Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateRange(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); + private static UnicodeRange _miscellaneousMathematicalSymbolsA; + + /// + /// A corresponding to the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalArrowsA => Volatile.Read(ref _supplementalArrowsA) ?? CreateRange(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); + private static UnicodeRange _supplementalArrowsA; + + /// + /// A corresponding to the 'Braille Patterns' Unicode block (U+2800..U+28FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. + /// + public static UnicodeRange BraillePatterns => Volatile.Read(ref _braillePatterns) ?? CreateRange(ref _braillePatterns, first: '\u2800', last: '\u28FF'); + private static UnicodeRange _braillePatterns; + + /// + /// A corresponding to the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalArrowsB => Volatile.Read(ref _supplementalArrowsB) ?? CreateRange(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); + private static UnicodeRange _supplementalArrowsB; + + /// + /// A corresponding to the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousMathematicalSymbolsB => Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateRange(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); + private static UnicodeRange _miscellaneousMathematicalSymbolsB; + + /// + /// A corresponding to the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalMathematicalOperators => Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateRange(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); + private static UnicodeRange _supplementalMathematicalOperators; + + /// + /// A corresponding to the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. + /// + public static UnicodeRange MiscellaneousSymbolsandArrows => Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateRange(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); + private static UnicodeRange _miscellaneousSymbolsandArrows; + + /// + /// A corresponding to the 'Glagolitic' Unicode block (U+2C00..U+2C5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Glagolitic => Volatile.Read(ref _glagolitic) ?? CreateRange(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); + private static UnicodeRange _glagolitic; + + /// + /// A corresponding to the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedC => Volatile.Read(ref _latinExtendedC) ?? CreateRange(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); + private static UnicodeRange _latinExtendedC; + + /// + /// A corresponding to the 'Coptic' Unicode block (U+2C80..U+2CFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. + /// + public static UnicodeRange Coptic => Volatile.Read(ref _coptic) ?? CreateRange(ref _coptic, first: '\u2C80', last: '\u2CFF'); + private static UnicodeRange _coptic; + + /// + /// A corresponding to the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. + /// + public static UnicodeRange GeorgianSupplement => Volatile.Read(ref _georgianSupplement) ?? CreateRange(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); + private static UnicodeRange _georgianSupplement; + + /// + /// A corresponding to the 'Tifinagh' Unicode block (U+2D30..U+2D7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. + /// + public static UnicodeRange Tifinagh => Volatile.Read(ref _tifinagh) ?? CreateRange(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); + private static UnicodeRange _tifinagh; + + /// + /// A corresponding to the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. + /// + public static UnicodeRange EthiopicExtended => Volatile.Read(ref _ethiopicExtended) ?? CreateRange(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); + private static UnicodeRange _ethiopicExtended; + + /// + /// A corresponding to the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CyrillicExtendedA => Volatile.Read(ref _cyrillicExtendedA) ?? CreateRange(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); + private static UnicodeRange _cyrillicExtendedA; + + /// + /// A corresponding to the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange SupplementalPunctuation => Volatile.Read(ref _supplementalPunctuation) ?? CreateRange(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); + private static UnicodeRange _supplementalPunctuation; + + /// + /// A corresponding to the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKRadicalsSupplement => Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateRange(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); + private static UnicodeRange _cjkRadicalsSupplement; + + /// + /// A corresponding to the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. + /// + public static UnicodeRange KangxiRadicals => Volatile.Read(ref _kangxiRadicals) ?? CreateRange(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); + private static UnicodeRange _kangxiRadicals; + + /// + /// A corresponding to the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. + /// + public static UnicodeRange IdeographicDescriptionCharacters => Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateRange(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); + private static UnicodeRange _ideographicDescriptionCharacters; + + /// + /// A corresponding to the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKSymbolsandPunctuation => Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateRange(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); + private static UnicodeRange _cjkSymbolsandPunctuation; + + /// + /// A corresponding to the 'Hiragana' Unicode block (U+3040..U+309F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. + /// + public static UnicodeRange Hiragana => Volatile.Read(ref _hiragana) ?? CreateRange(ref _hiragana, first: '\u3040', last: '\u309F'); + private static UnicodeRange _hiragana; + + /// + /// A corresponding to the 'Katakana' Unicode block (U+30A0..U+30FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Katakana => Volatile.Read(ref _katakana) ?? CreateRange(ref _katakana, first: '\u30A0', last: '\u30FF'); + private static UnicodeRange _katakana; + + /// + /// A corresponding to the 'Bopomofo' Unicode block (U+3100..U+312F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. + /// + public static UnicodeRange Bopomofo => Volatile.Read(ref _bopomofo) ?? CreateRange(ref _bopomofo, first: '\u3100', last: '\u312F'); + private static UnicodeRange _bopomofo; + + /// + /// A corresponding to the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulCompatibilityJamo => Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateRange(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); + private static UnicodeRange _hangulCompatibilityJamo; + + /// + /// A corresponding to the 'Kanbun' Unicode block (U+3190..U+319F). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. + /// + public static UnicodeRange Kanbun => Volatile.Read(ref _kanbun) ?? CreateRange(ref _kanbun, first: '\u3190', last: '\u319F'); + private static UnicodeRange _kanbun; + + /// + /// A corresponding to the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange BopomofoExtended => Volatile.Read(ref _bopomofoExtended) ?? CreateRange(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); + private static UnicodeRange _bopomofoExtended; + + /// + /// A corresponding to the 'CJK Strokes' Unicode block (U+31C0..U+31EF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKStrokes => Volatile.Read(ref _cjkStrokes) ?? CreateRange(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); + private static UnicodeRange _cjkStrokes; + + /// + /// A corresponding to the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. + /// + public static UnicodeRange KatakanaPhoneticExtensions => Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateRange(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); + private static UnicodeRange _katakanaPhoneticExtensions; + + /// + /// A corresponding to the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. + /// + public static UnicodeRange EnclosedCJKLettersandMonths => Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateRange(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); + private static UnicodeRange _enclosedCJKLettersandMonths; + + /// + /// A corresponding to the 'CJK Compatibility' Unicode block (U+3300..U+33FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKCompatibility => Volatile.Read(ref _cjkCompatibility) ?? CreateRange(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); + private static UnicodeRange _cjkCompatibility; + + /// + /// A corresponding to the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKUnifiedIdeographsExtensionA => Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateRange(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); + private static UnicodeRange _cjkUnifiedIdeographsExtensionA; + + /// + /// A corresponding to the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange YijingHexagramSymbols => Volatile.Read(ref _yijingHexagramSymbols) ?? CreateRange(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); + private static UnicodeRange _yijingHexagramSymbols; + + /// + /// A corresponding to the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKUnifiedIdeographs => Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateRange(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); + private static UnicodeRange _cjkUnifiedIdeographs; + + /// + /// A corresponding to the 'Yi Syllables' Unicode block (U+A000..U+A48F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. + /// + public static UnicodeRange YiSyllables => Volatile.Read(ref _yiSyllables) ?? CreateRange(ref _yiSyllables, first: '\uA000', last: '\uA48F'); + private static UnicodeRange _yiSyllables; + + /// + /// A corresponding to the 'Yi Radicals' Unicode block (U+A490..U+A4CF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. + /// + public static UnicodeRange YiRadicals => Volatile.Read(ref _yiRadicals) ?? CreateRange(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); + private static UnicodeRange _yiRadicals; + + /// + /// A corresponding to the 'Lisu' Unicode block (U+A4D0..U+A4FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Lisu => Volatile.Read(ref _lisu) ?? CreateRange(ref _lisu, first: '\uA4D0', last: '\uA4FF'); + private static UnicodeRange _lisu; + + /// + /// A corresponding to the 'Vai' Unicode block (U+A500..U+A63F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. + /// + public static UnicodeRange Vai => Volatile.Read(ref _vai) ?? CreateRange(ref _vai, first: '\uA500', last: '\uA63F'); + private static UnicodeRange _vai; + + /// + /// A corresponding to the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. + /// + public static UnicodeRange CyrillicExtendedB => Volatile.Read(ref _cyrillicExtendedB) ?? CreateRange(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); + private static UnicodeRange _cyrillicExtendedB; + + /// + /// A corresponding to the 'Bamum' Unicode block (U+A6A0..U+A6FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Bamum => Volatile.Read(ref _bamum) ?? CreateRange(ref _bamum, first: '\uA6A0', last: '\uA6FF'); + private static UnicodeRange _bamum; + + /// + /// A corresponding to the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. + /// + public static UnicodeRange ModifierToneLetters => Volatile.Read(ref _modifierToneLetters) ?? CreateRange(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); + private static UnicodeRange _modifierToneLetters; + + /// + /// A corresponding to the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedD => Volatile.Read(ref _latinExtendedD) ?? CreateRange(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); + private static UnicodeRange _latinExtendedD; + + /// + /// A corresponding to the 'Syloti Nagri' Unicode block (U+A800..U+A82F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. + /// + public static UnicodeRange SylotiNagri => Volatile.Read(ref _sylotiNagri) ?? CreateRange(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); + private static UnicodeRange _sylotiNagri; + + /// + /// A corresponding to the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. + /// + public static UnicodeRange CommonIndicNumberForms => Volatile.Read(ref _commonIndicNumberForms) ?? CreateRange(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); + private static UnicodeRange _commonIndicNumberForms; + + /// + /// A corresponding to the 'Phags-pa' Unicode block (U+A840..U+A87F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. + /// + public static UnicodeRange Phagspa => Volatile.Read(ref _phagspa) ?? CreateRange(ref _phagspa, first: '\uA840', last: '\uA87F'); + private static UnicodeRange _phagspa; + + /// + /// A corresponding to the 'Saurashtra' Unicode block (U+A880..U+A8DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. + /// + public static UnicodeRange Saurashtra => Volatile.Read(ref _saurashtra) ?? CreateRange(ref _saurashtra, first: '\uA880', last: '\uA8DF'); + private static UnicodeRange _saurashtra; + + /// + /// A corresponding to the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. + /// + public static UnicodeRange DevanagariExtended => Volatile.Read(ref _devanagariExtended) ?? CreateRange(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); + private static UnicodeRange _devanagariExtended; + + /// + /// A corresponding to the 'Kayah Li' Unicode block (U+A900..U+A92F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. + /// + public static UnicodeRange KayahLi => Volatile.Read(ref _kayahLi) ?? CreateRange(ref _kayahLi, first: '\uA900', last: '\uA92F'); + private static UnicodeRange _kayahLi; + + /// + /// A corresponding to the 'Rejang' Unicode block (U+A930..U+A95F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. + /// + public static UnicodeRange Rejang => Volatile.Read(ref _rejang) ?? CreateRange(ref _rejang, first: '\uA930', last: '\uA95F'); + private static UnicodeRange _rejang; + + /// + /// A corresponding to the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulJamoExtendedA => Volatile.Read(ref _hangulJamoExtendedA) ?? CreateRange(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); + private static UnicodeRange _hangulJamoExtendedA; + + /// + /// A corresponding to the 'Javanese' Unicode block (U+A980..U+A9DF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. + /// + public static UnicodeRange Javanese => Volatile.Read(ref _javanese) ?? CreateRange(ref _javanese, first: '\uA980', last: '\uA9DF'); + private static UnicodeRange _javanese; + + /// + /// A corresponding to the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MyanmarExtendedB => Volatile.Read(ref _myanmarExtendedB) ?? CreateRange(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); + private static UnicodeRange _myanmarExtendedB; + + /// + /// A corresponding to the 'Cham' Unicode block (U+AA00..U+AA5F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. + /// + public static UnicodeRange Cham => Volatile.Read(ref _cham) ?? CreateRange(ref _cham, first: '\uAA00', last: '\uAA5F'); + private static UnicodeRange _cham; + + /// + /// A corresponding to the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. + /// + public static UnicodeRange MyanmarExtendedA => Volatile.Read(ref _myanmarExtendedA) ?? CreateRange(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); + private static UnicodeRange _myanmarExtendedA; + + /// + /// A corresponding to the 'Tai Viet' Unicode block (U+AA80..U+AADF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. + /// + public static UnicodeRange TaiViet => Volatile.Read(ref _taiViet) ?? CreateRange(ref _taiViet, first: '\uAA80', last: '\uAADF'); + private static UnicodeRange _taiViet; + + /// + /// A corresponding to the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MeeteiMayekExtensions => Volatile.Read(ref _meeteiMayekExtensions) ?? CreateRange(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); + private static UnicodeRange _meeteiMayekExtensions; + + /// + /// A corresponding to the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. + /// + public static UnicodeRange EthiopicExtendedA => Volatile.Read(ref _ethiopicExtendedA) ?? CreateRange(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); + private static UnicodeRange _ethiopicExtendedA; + + /// + /// A corresponding to the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. + /// + public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); + private static UnicodeRange _latinExtendedE; + + /// + /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. + /// + public static UnicodeRange MeeteiMayek => Volatile.Read(ref _meeteiMayek) ?? CreateRange(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); + private static UnicodeRange _meeteiMayek; + + /// + /// A corresponding to the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulSyllables => Volatile.Read(ref _hangulSyllables) ?? CreateRange(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); + private static UnicodeRange _hangulSyllables; + + /// + /// A corresponding to the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. + /// + public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); + private static UnicodeRange _hangulJamoExtendedB; + + /// + /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKCompatibilityIdeographs => Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateRange(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); + private static UnicodeRange _cjkCompatibilityIdeographs; + + /// + /// A corresponding to the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. + /// + public static UnicodeRange AlphabeticPresentationForms => Volatile.Read(ref _alphabeticPresentationForms) ?? CreateRange(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); + private static UnicodeRange _alphabeticPresentationForms; + + /// + /// A corresponding to the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicPresentationFormsA => Volatile.Read(ref _arabicPresentationFormsA) ?? CreateRange(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); + private static UnicodeRange _arabicPresentationFormsA; + + /// + /// A corresponding to the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. + /// + public static UnicodeRange VariationSelectors => Volatile.Read(ref _variationSelectors) ?? CreateRange(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); + private static UnicodeRange _variationSelectors; + + /// + /// A corresponding to the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. + /// + public static UnicodeRange VerticalForms => Volatile.Read(ref _verticalForms) ?? CreateRange(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); + private static UnicodeRange _verticalForms; + + /// + /// A corresponding to the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. + /// + public static UnicodeRange CombiningHalfMarks => Volatile.Read(ref _combiningHalfMarks) ?? CreateRange(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); + private static UnicodeRange _combiningHalfMarks; + + /// + /// A corresponding to the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. + /// + public static UnicodeRange CJKCompatibilityForms => Volatile.Read(ref _cjkCompatibilityForms) ?? CreateRange(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); + private static UnicodeRange _cjkCompatibilityForms; + + /// + /// A corresponding to the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. + /// + public static UnicodeRange SmallFormVariants => Volatile.Read(ref _smallFormVariants) ?? CreateRange(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); + private static UnicodeRange _smallFormVariants; + + /// + /// A corresponding to the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. + /// + public static UnicodeRange ArabicPresentationFormsB => Volatile.Read(ref _arabicPresentationFormsB) ?? CreateRange(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); + private static UnicodeRange _arabicPresentationFormsB; + + /// + /// A corresponding to the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. + /// + public static UnicodeRange HalfwidthandFullwidthForms => Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateRange(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); + private static UnicodeRange _halfwidthandFullwidthForms; + + /// + /// A corresponding to the 'Specials' Unicode block (U+FFF0..U+FFFF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. + /// + public static UnicodeRange Specials => Volatile.Read(ref _specials) ?? CreateRange(ref _specials, first: '\uFFF0', last: '\uFFFF'); + private static UnicodeRange _specials; + } +} diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 4497939c71..90f1bf2abc 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -26,7 +26,7 @@ namespace Microsoft.Framework.WebEncoders private readonly UrlUnicodeEncoder _innerUnicodeEncoder; /// - /// Instantiates an encoder using the 'Basic Latin' code table as the allow list. + /// Instantiates an encoder using as its allow list. /// public UrlEncoder() : this(UrlUnicodeEncoder.BasicLatin) @@ -34,11 +34,11 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder specifying which Unicode character blocks are allowed to + /// Instantiates an encoder specifying which Unicode character ranges are allowed to /// pass through the encoder unescaped. /// - public UrlEncoder(params UnicodeBlock[] allowedBlocks) - : this(new UrlUnicodeEncoder(new CodePointFilter(allowedBlocks))) + public UrlEncoder(params UnicodeRange[] allowedRanges) + : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges))) { } @@ -57,8 +57,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// A default instance of the UrlEncoder, equivalent to allowing only - /// the 'Basic Latin' character range. + /// The default which uses as its allow list. /// public static UrlEncoder Default { @@ -133,8 +132,8 @@ namespace Microsoft.Framework.WebEncoders // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" // / "*" / "+" / "," / ";" / "=" // - // From this list, the base encoder blocks "&", "'", "+", - // and we'll additionally block "=" since it has special meaning + // From this list, the base encoder forbids "&", "'", "+", + // and we'll additionally forbid "=" since it has special meaning // in x-www-form-urlencoded representations. // // This means that the full list of allowed characters from the @@ -163,7 +162,7 @@ namespace Microsoft.Framework.WebEncoders UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); if (encoder == null) { - encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeBlocks.BasicLatin)); + encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); Volatile.Write(ref _basicLatinSingleton, encoder); } return encoder; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs index e2fdf8dd7b..d8de51865d 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -43,7 +43,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_OtherCodePointFilterAsConcreteType_Clones() { // Arrange - var originalFilter = new CodePointFilter(UnicodeBlocks.None).AllowChar('x'); + var originalFilter = new CodePointFilter().AllowChar('x'); // Act var newFilter = new CodePointFilter(originalFilter).AllowChar('y'); @@ -56,10 +56,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_UnicodeBlocks() + public void Ctor_UnicodeRanges() { // Act - var filter = new CodePointFilter(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); + var filter = new CodePointFilter(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); // Assert for (int i = 0; i < 0x0100; i++) @@ -84,64 +84,6 @@ namespace Microsoft.Framework.WebEncoders } } - [Fact] - public void AllowBlock() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None); - - // Act - var retVal = filter.AllowBlock(UnicodeBlocks.LatinExtendedA); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowBlocks() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None); - - // Act - var retVal = filter.AllowBlocks(UnicodeBlocks.LatinExtendedA, UnicodeBlocks.LatinExtendedC); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i < 0x2C60; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C60; i <= 0x2C7F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C80; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - [Fact] public void AllowChar() { @@ -195,7 +137,7 @@ namespace Microsoft.Framework.WebEncoders public void AllowFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); // Act var retVal = filter.AllowFilter(new OddCodePointFilter()); @@ -212,6 +154,64 @@ namespace Microsoft.Framework.WebEncoders } } + [Fact] + public void AllowRange() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowRange(UnicodeRanges.LatinExtendedA); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + + [Fact] + public void AllowRanges() + { + // Arrange + var filter = new CodePointFilter(); + + // Act + var retVal = filter.AllowRanges(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + for (int i = 0; i < 0x0100; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0100; i <= 0x017F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x0180; i < 0x2C60; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C60; i <= 0x2C7F; i++) + { + Assert.True(filter.IsCharacterAllowed((char)i)); + } + for (int i = 0x2C80; i <= Char.MaxValue; i++) + { + Assert.False(filter.IsCharacterAllowed((char)i)); + } + } + [Fact] public void Clear() { @@ -234,13 +234,64 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void ForbidBlock() + public void ForbidChar() + { + // Arrange + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); + + // Act + var retVal = filter.ForbidChar('x'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.True(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_Array() + { + // Arrange + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); + + // Act + var retVal = filter.ForbidChars('x', 'z'); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidChars_String() + { + // Arrange + var filter = new CodePointFilter(UnicodeRanges.BasicLatin); + + // Act + var retVal = filter.ForbidChars("xz"); + + // Assert + Assert.Same(filter, retVal); // returns 'this' instance + Assert.True(filter.IsCharacterAllowed('w')); + Assert.False(filter.IsCharacterAllowed('x')); + Assert.True(filter.IsCharacterAllowed('y')); + Assert.False(filter.IsCharacterAllowed('z')); + } + + [Fact] + public void ForbidRange() { // Arrange var filter = new CodePointFilter(new OddCodePointFilter()); // Act - var retVal = filter.ForbidBlock(UnicodeBlocks.Specials); + var retVal = filter.ForbidRange(UnicodeRanges.Specials); // Assert Assert.Same(filter, retVal); // returns 'this' instance @@ -255,13 +306,13 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void ForbidBlocks() + public void ForbidRanges() { // Arrange var filter = new CodePointFilter(new OddCodePointFilter()); // Act - var retVal = filter.ForbidBlocks(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + var retVal = filter.ForbidRanges(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); // Assert Assert.Same(filter, retVal); // returns 'this' instance @@ -279,68 +330,17 @@ namespace Microsoft.Framework.WebEncoders } } - [Fact] - public void ForbidChar() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); - - // Act - var retVal = filter.ForbidChar('x'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.True(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_Array() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); - - // Act - var retVal = filter.ForbidChars('x', 'z'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_String() - { - // Arrange - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin); - - // Act - var retVal = filter.ForbidChars("xz"); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - [Fact] public void GetAllowedCodePoints() { // Arrange - var expected = Enumerable.Range(UnicodeBlocks.BasicLatin.FirstCodePoint, UnicodeBlocks.BasicLatin.BlockSize) - .Concat(Enumerable.Range(UnicodeBlocks.Specials.FirstCodePoint, UnicodeBlocks.Specials.BlockSize)) + var expected = Enumerable.Range(UnicodeRanges.BasicLatin.FirstCodePoint, UnicodeRanges.BasicLatin.RangeSize) + .Concat(Enumerable.Range(UnicodeRanges.Specials.FirstCodePoint, UnicodeRanges.Specials.RangeSize)) .Except(new int[] { 'x' }) .OrderBy(i => i) .ToArray(); - var filter = new CodePointFilter(UnicodeBlocks.BasicLatin, UnicodeBlocks.Specials); + var filter = new CodePointFilter(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); filter.ForbidChar('x'); // Act diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs index d4351a169e..8c5cfd83ac 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -19,7 +19,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_PositiveTestCase() { // Arrange - IHtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + IHtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); StringWriter writer = new StringWriter(); // Act @@ -39,7 +39,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_PositiveTestCase() { // Arrange - IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); StringWriter writer = new StringWriter(); // Act @@ -59,7 +59,7 @@ namespace Microsoft.Framework.WebEncoders public void UrlEncode_PositiveTestCase() { // Arrange - IUrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + IUrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); StringWriter writer = new StringWriter(); // Act diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs index 6da944dc07..ee0c3231d9 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCodePointFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); HtmlEncoder encoder = new HtmlEncoder(filter); // Act & assert @@ -28,10 +28,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); // Act & assert Assert.Equal("a", encoder.HtmlEncode("a")); @@ -55,7 +55,7 @@ namespace Microsoft.Framework.WebEncoders public void Default_EquivalentToBasicLatin() { // Arrange - HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeBlocks.BasicLatin); + HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeRanges.BasicLatin); HtmlEncoder testEncoder = HtmlEncoder.Default; // Act & assert @@ -90,7 +90,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // Act string retVal = encoder.HtmlEncode(input); @@ -103,7 +103,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -165,7 +165,7 @@ namespace Microsoft.Framework.WebEncoders public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeBlocks.All); // allow all codepoints + HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs index 470a5b2311..dbb9f91e68 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCodePointFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter); // Act & assert @@ -28,10 +28,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); // Act & assert Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a")); @@ -55,7 +55,7 @@ namespace Microsoft.Framework.WebEncoders public void Default_EquivalentToBasicLatin() { // Arrange - JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeBlocks.BasicLatin); + JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeRanges.BasicLatin); JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default; // Act & assert @@ -97,7 +97,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // Act string retVal = encoder.JavaScriptStringEncode(input); @@ -110,7 +110,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -183,7 +183,7 @@ namespace Microsoft.Framework.WebEncoders public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); // allow all codepoints + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; @@ -290,7 +290,7 @@ namespace Microsoft.Framework.WebEncoders // \u-escape these characters instead of using \' and \". // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // Act string retVal = encoder.JavaScriptStringEncode(input); @@ -306,8 +306,8 @@ namespace Microsoft.Framework.WebEncoders // by never emitting HTML-sensitive characters unescaped. // Arrange - JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeBlocks.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeRanges.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); // Act & assert for (int i = 0; i <= 0x10FFFF; i++) diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs deleted file mode 100644 index 5dee8d76bb..0000000000 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlockTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using Xunit; - -namespace Microsoft.Framework.WebEncoders -{ - public class UnicodeBlockTests - { - [Theory] - [InlineData(-1, 16)] - [InlineData(1, 16)] - [InlineData(0x10000, 16)] - public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int blockSize) - { - var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); - Assert.Equal("firstCodePoint", ex.ParamName); - } - - [Theory] - [InlineData(0x0100, -1)] - [InlineData(0x0100, 15)] - [InlineData(0x0100, 0x10000)] - public void Ctor_FailureCase_BlockSize(int firstCodePoint, int blockSize) - { - var ex = Assert.Throws(() => new UnicodeBlock(firstCodePoint, blockSize)); - Assert.Equal("blockSize", ex.ParamName); - } - - [Fact] - public void Ctor_SuccessCase() - { - // Act - var block = new UnicodeBlock(0x0100, 128); // Latin Extended-A - - // Assert - Assert.Equal(0x0100, block.FirstCodePoint); - Assert.Equal(128, block.BlockSize); - } - - [Theory] - [InlineData('\u0001', '\u0002')] - public void FromCharacterRange_FailureCases_FirstChar(char firstChar, char lastChar) - { - var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); - Assert.Equal("firstChar", ex.ParamName); - } - - [Theory] - [InlineData('\u0100', '\u007F')] - [InlineData('\u0100', '\u0100')] - [InlineData('\u0100', '\u010E')] - public void FromCharacterRange_FailureCases_LastChar(char firstChar, char lastChar) - { - var ex = Assert.Throws(() => UnicodeBlock.FromCharacterRange(firstChar, lastChar)); - Assert.Equal("lastChar", ex.ParamName); - } - - [Fact] - public void FromCharacterRange_SuccessCase() - { - // Act - var block = UnicodeBlock.FromCharacterRange('\u0180', '\u024F'); // Latin Extended-B - - // Assert - Assert.Equal(0x0180, block.FirstCodePoint); - Assert.Equal(208, block.BlockSize); - } - - [Fact] - public void FromCharacterRange_SuccessCase_All() - { - // Act - var block = UnicodeBlock.FromCharacterRange('\u0000', '\uFFFF'); - - // Assert - Assert.Equal(0, block.FirstCodePoint); - Assert.Equal(0x10000, block.BlockSize); - } - } -} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs deleted file mode 100644 index c4eb4591e3..0000000000 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeBlocksTests.cs +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Reflection; -using Xunit; - -namespace Microsoft.Framework.WebEncoders -{ - public class UnicodeBlocksTests - { - [Fact] - public void Block_None() - { - UnicodeBlock block = UnicodeBlocks.None; - Assert.NotNull(block); - - // Test 1: the block should be empty - Assert.Equal(0, block.FirstCodePoint); - Assert.Equal(0, block.BlockSize); - - // Test 2: calling the property multiple times should cache and return the same block instance - UnicodeBlock block2 = UnicodeBlocks.None; - Assert.Same(block, block2); - } - - [Fact] - public void Block_All() - { - Block_Unicode('\u0000', '\uFFFF', nameof(UnicodeBlocks.All)); - } - - [Theory] - [InlineData('\u0000', '\u007F', nameof(UnicodeBlocks.BasicLatin))] - [InlineData('\u0080', '\u00FF', nameof(UnicodeBlocks.Latin1Supplement))] - [InlineData('\u0100', '\u017F', nameof(UnicodeBlocks.LatinExtendedA))] - [InlineData('\u0180', '\u024F', nameof(UnicodeBlocks.LatinExtendedB))] - [InlineData('\u0250', '\u02AF', nameof(UnicodeBlocks.IPAExtensions))] - [InlineData('\u02B0', '\u02FF', nameof(UnicodeBlocks.SpacingModifierLetters))] - [InlineData('\u0300', '\u036F', nameof(UnicodeBlocks.CombiningDiacriticalMarks))] - [InlineData('\u0370', '\u03FF', nameof(UnicodeBlocks.GreekandCoptic))] - [InlineData('\u0400', '\u04FF', nameof(UnicodeBlocks.Cyrillic))] - [InlineData('\u0500', '\u052F', nameof(UnicodeBlocks.CyrillicSupplement))] - [InlineData('\u0530', '\u058F', nameof(UnicodeBlocks.Armenian))] - [InlineData('\u0590', '\u05FF', nameof(UnicodeBlocks.Hebrew))] - [InlineData('\u0600', '\u06FF', nameof(UnicodeBlocks.Arabic))] - [InlineData('\u0700', '\u074F', nameof(UnicodeBlocks.Syriac))] - [InlineData('\u0750', '\u077F', nameof(UnicodeBlocks.ArabicSupplement))] - [InlineData('\u0780', '\u07BF', nameof(UnicodeBlocks.Thaana))] - [InlineData('\u07C0', '\u07FF', nameof(UnicodeBlocks.NKo))] - [InlineData('\u0800', '\u083F', nameof(UnicodeBlocks.Samaritan))] - [InlineData('\u0840', '\u085F', nameof(UnicodeBlocks.Mandaic))] - [InlineData('\u08A0', '\u08FF', nameof(UnicodeBlocks.ArabicExtendedA))] - [InlineData('\u0900', '\u097F', nameof(UnicodeBlocks.Devanagari))] - [InlineData('\u0980', '\u09FF', nameof(UnicodeBlocks.Bengali))] - [InlineData('\u0A00', '\u0A7F', nameof(UnicodeBlocks.Gurmukhi))] - [InlineData('\u0A80', '\u0AFF', nameof(UnicodeBlocks.Gujarati))] - [InlineData('\u0B00', '\u0B7F', nameof(UnicodeBlocks.Oriya))] - [InlineData('\u0B80', '\u0BFF', nameof(UnicodeBlocks.Tamil))] - [InlineData('\u0C00', '\u0C7F', nameof(UnicodeBlocks.Telugu))] - [InlineData('\u0C80', '\u0CFF', nameof(UnicodeBlocks.Kannada))] - [InlineData('\u0D00', '\u0D7F', nameof(UnicodeBlocks.Malayalam))] - [InlineData('\u0D80', '\u0DFF', nameof(UnicodeBlocks.Sinhala))] - [InlineData('\u0E00', '\u0E7F', nameof(UnicodeBlocks.Thai))] - [InlineData('\u0E80', '\u0EFF', nameof(UnicodeBlocks.Lao))] - [InlineData('\u0F00', '\u0FFF', nameof(UnicodeBlocks.Tibetan))] - [InlineData('\u1000', '\u109F', nameof(UnicodeBlocks.Myanmar))] - [InlineData('\u10A0', '\u10FF', nameof(UnicodeBlocks.Georgian))] - [InlineData('\u1100', '\u11FF', nameof(UnicodeBlocks.HangulJamo))] - [InlineData('\u1200', '\u137F', nameof(UnicodeBlocks.Ethiopic))] - [InlineData('\u1380', '\u139F', nameof(UnicodeBlocks.EthiopicSupplement))] - [InlineData('\u13A0', '\u13FF', nameof(UnicodeBlocks.Cherokee))] - [InlineData('\u1400', '\u167F', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabics))] - [InlineData('\u1680', '\u169F', nameof(UnicodeBlocks.Ogham))] - [InlineData('\u16A0', '\u16FF', nameof(UnicodeBlocks.Runic))] - [InlineData('\u1700', '\u171F', nameof(UnicodeBlocks.Tagalog))] - [InlineData('\u1720', '\u173F', nameof(UnicodeBlocks.Hanunoo))] - [InlineData('\u1740', '\u175F', nameof(UnicodeBlocks.Buhid))] - [InlineData('\u1760', '\u177F', nameof(UnicodeBlocks.Tagbanwa))] - [InlineData('\u1780', '\u17FF', nameof(UnicodeBlocks.Khmer))] - [InlineData('\u1800', '\u18AF', nameof(UnicodeBlocks.Mongolian))] - [InlineData('\u18B0', '\u18FF', nameof(UnicodeBlocks.UnifiedCanadianAboriginalSyllabicsExtended))] - [InlineData('\u1900', '\u194F', nameof(UnicodeBlocks.Limbu))] - [InlineData('\u1950', '\u197F', nameof(UnicodeBlocks.TaiLe))] - [InlineData('\u1980', '\u19DF', nameof(UnicodeBlocks.NewTaiLue))] - [InlineData('\u19E0', '\u19FF', nameof(UnicodeBlocks.KhmerSymbols))] - [InlineData('\u1A00', '\u1A1F', nameof(UnicodeBlocks.Buginese))] - [InlineData('\u1A20', '\u1AAF', nameof(UnicodeBlocks.TaiTham))] - [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksExtended))] - [InlineData('\u1B00', '\u1B7F', nameof(UnicodeBlocks.Balinese))] - [InlineData('\u1B80', '\u1BBF', nameof(UnicodeBlocks.Sundanese))] - [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeBlocks.Batak))] - [InlineData('\u1C00', '\u1C4F', nameof(UnicodeBlocks.Lepcha))] - [InlineData('\u1C50', '\u1C7F', nameof(UnicodeBlocks.OlChiki))] - [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeBlocks.SundaneseSupplement))] - [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeBlocks.VedicExtensions))] - [InlineData('\u1D00', '\u1D7F', nameof(UnicodeBlocks.PhoneticExtensions))] - [InlineData('\u1D80', '\u1DBF', nameof(UnicodeBlocks.PhoneticExtensionsSupplement))] - [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeBlocks.CombiningDiacriticalMarksSupplement))] - [InlineData('\u1E00', '\u1EFF', nameof(UnicodeBlocks.LatinExtendedAdditional))] - [InlineData('\u1F00', '\u1FFF', nameof(UnicodeBlocks.GreekExtended))] - [InlineData('\u2000', '\u206F', nameof(UnicodeBlocks.GeneralPunctuation))] - [InlineData('\u2070', '\u209F', nameof(UnicodeBlocks.SuperscriptsandSubscripts))] - [InlineData('\u20A0', '\u20CF', nameof(UnicodeBlocks.CurrencySymbols))] - [InlineData('\u20D0', '\u20FF', nameof(UnicodeBlocks.CombiningDiacriticalMarksforSymbols))] - [InlineData('\u2100', '\u214F', nameof(UnicodeBlocks.LetterlikeSymbols))] - [InlineData('\u2150', '\u218F', nameof(UnicodeBlocks.NumberForms))] - [InlineData('\u2190', '\u21FF', nameof(UnicodeBlocks.Arrows))] - [InlineData('\u2200', '\u22FF', nameof(UnicodeBlocks.MathematicalOperators))] - [InlineData('\u2300', '\u23FF', nameof(UnicodeBlocks.MiscellaneousTechnical))] - [InlineData('\u2400', '\u243F', nameof(UnicodeBlocks.ControlPictures))] - [InlineData('\u2440', '\u245F', nameof(UnicodeBlocks.OpticalCharacterRecognition))] - [InlineData('\u2460', '\u24FF', nameof(UnicodeBlocks.EnclosedAlphanumerics))] - [InlineData('\u2500', '\u257F', nameof(UnicodeBlocks.BoxDrawing))] - [InlineData('\u2580', '\u259F', nameof(UnicodeBlocks.BlockElements))] - [InlineData('\u25A0', '\u25FF', nameof(UnicodeBlocks.GeometricShapes))] - [InlineData('\u2600', '\u26FF', nameof(UnicodeBlocks.MiscellaneousSymbols))] - [InlineData('\u2700', '\u27BF', nameof(UnicodeBlocks.Dingbats))] - [InlineData('\u27C0', '\u27EF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsA))] - [InlineData('\u27F0', '\u27FF', nameof(UnicodeBlocks.SupplementalArrowsA))] - [InlineData('\u2800', '\u28FF', nameof(UnicodeBlocks.BraillePatterns))] - [InlineData('\u2900', '\u297F', nameof(UnicodeBlocks.SupplementalArrowsB))] - [InlineData('\u2980', '\u29FF', nameof(UnicodeBlocks.MiscellaneousMathematicalSymbolsB))] - [InlineData('\u2A00', '\u2AFF', nameof(UnicodeBlocks.SupplementalMathematicalOperators))] - [InlineData('\u2B00', '\u2BFF', nameof(UnicodeBlocks.MiscellaneousSymbolsandArrows))] - [InlineData('\u2C00', '\u2C5F', nameof(UnicodeBlocks.Glagolitic))] - [InlineData('\u2C60', '\u2C7F', nameof(UnicodeBlocks.LatinExtendedC))] - [InlineData('\u2C80', '\u2CFF', nameof(UnicodeBlocks.Coptic))] - [InlineData('\u2D00', '\u2D2F', nameof(UnicodeBlocks.GeorgianSupplement))] - [InlineData('\u2D30', '\u2D7F', nameof(UnicodeBlocks.Tifinagh))] - [InlineData('\u2D80', '\u2DDF', nameof(UnicodeBlocks.EthiopicExtended))] - [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeBlocks.CyrillicExtendedA))] - [InlineData('\u2E00', '\u2E7F', nameof(UnicodeBlocks.SupplementalPunctuation))] - [InlineData('\u2E80', '\u2EFF', nameof(UnicodeBlocks.CJKRadicalsSupplement))] - [InlineData('\u2F00', '\u2FDF', nameof(UnicodeBlocks.KangxiRadicals))] - [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeBlocks.IdeographicDescriptionCharacters))] - [InlineData('\u3000', '\u303F', nameof(UnicodeBlocks.CJKSymbolsandPunctuation))] - [InlineData('\u3040', '\u309F', nameof(UnicodeBlocks.Hiragana))] - [InlineData('\u30A0', '\u30FF', nameof(UnicodeBlocks.Katakana))] - [InlineData('\u3100', '\u312F', nameof(UnicodeBlocks.Bopomofo))] - [InlineData('\u3130', '\u318F', nameof(UnicodeBlocks.HangulCompatibilityJamo))] - [InlineData('\u3190', '\u319F', nameof(UnicodeBlocks.Kanbun))] - [InlineData('\u31A0', '\u31BF', nameof(UnicodeBlocks.BopomofoExtended))] - [InlineData('\u31C0', '\u31EF', nameof(UnicodeBlocks.CJKStrokes))] - [InlineData('\u31F0', '\u31FF', nameof(UnicodeBlocks.KatakanaPhoneticExtensions))] - [InlineData('\u3200', '\u32FF', nameof(UnicodeBlocks.EnclosedCJKLettersandMonths))] - [InlineData('\u3300', '\u33FF', nameof(UnicodeBlocks.CJKCompatibility))] - [InlineData('\u3400', '\u4DBF', nameof(UnicodeBlocks.CJKUnifiedIdeographsExtensionA))] - [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeBlocks.YijingHexagramSymbols))] - [InlineData('\u4E00', '\u9FFF', nameof(UnicodeBlocks.CJKUnifiedIdeographs))] - [InlineData('\uA000', '\uA48F', nameof(UnicodeBlocks.YiSyllables))] - [InlineData('\uA490', '\uA4CF', nameof(UnicodeBlocks.YiRadicals))] - [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeBlocks.Lisu))] - [InlineData('\uA500', '\uA63F', nameof(UnicodeBlocks.Vai))] - [InlineData('\uA640', '\uA69F', nameof(UnicodeBlocks.CyrillicExtendedB))] - [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeBlocks.Bamum))] - [InlineData('\uA700', '\uA71F', nameof(UnicodeBlocks.ModifierToneLetters))] - [InlineData('\uA720', '\uA7FF', nameof(UnicodeBlocks.LatinExtendedD))] - [InlineData('\uA800', '\uA82F', nameof(UnicodeBlocks.SylotiNagri))] - [InlineData('\uA830', '\uA83F', nameof(UnicodeBlocks.CommonIndicNumberForms))] - [InlineData('\uA840', '\uA87F', nameof(UnicodeBlocks.Phagspa))] - [InlineData('\uA880', '\uA8DF', nameof(UnicodeBlocks.Saurashtra))] - [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeBlocks.DevanagariExtended))] - [InlineData('\uA900', '\uA92F', nameof(UnicodeBlocks.KayahLi))] - [InlineData('\uA930', '\uA95F', nameof(UnicodeBlocks.Rejang))] - [InlineData('\uA960', '\uA97F', nameof(UnicodeBlocks.HangulJamoExtendedA))] - [InlineData('\uA980', '\uA9DF', nameof(UnicodeBlocks.Javanese))] - [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeBlocks.MyanmarExtendedB))] - [InlineData('\uAA00', '\uAA5F', nameof(UnicodeBlocks.Cham))] - [InlineData('\uAA60', '\uAA7F', nameof(UnicodeBlocks.MyanmarExtendedA))] - [InlineData('\uAA80', '\uAADF', nameof(UnicodeBlocks.TaiViet))] - [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeBlocks.MeeteiMayekExtensions))] - [InlineData('\uAB00', '\uAB2F', nameof(UnicodeBlocks.EthiopicExtendedA))] - [InlineData('\uAB30', '\uAB6F', nameof(UnicodeBlocks.LatinExtendedE))] - [InlineData('\uABC0', '\uABFF', nameof(UnicodeBlocks.MeeteiMayek))] - [InlineData('\uAC00', '\uD7AF', nameof(UnicodeBlocks.HangulSyllables))] - [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeBlocks.HangulJamoExtendedB))] - [InlineData('\uF900', '\uFAFF', nameof(UnicodeBlocks.CJKCompatibilityIdeographs))] - [InlineData('\uFB00', '\uFB4F', nameof(UnicodeBlocks.AlphabeticPresentationForms))] - [InlineData('\uFB50', '\uFDFF', nameof(UnicodeBlocks.ArabicPresentationFormsA))] - [InlineData('\uFE00', '\uFE0F', nameof(UnicodeBlocks.VariationSelectors))] - [InlineData('\uFE10', '\uFE1F', nameof(UnicodeBlocks.VerticalForms))] - [InlineData('\uFE20', '\uFE2F', nameof(UnicodeBlocks.CombiningHalfMarks))] - [InlineData('\uFE30', '\uFE4F', nameof(UnicodeBlocks.CJKCompatibilityForms))] - [InlineData('\uFE50', '\uFE6F', nameof(UnicodeBlocks.SmallFormVariants))] - [InlineData('\uFE70', '\uFEFF', nameof(UnicodeBlocks.ArabicPresentationFormsB))] - [InlineData('\uFF00', '\uFFEF', nameof(UnicodeBlocks.HalfwidthandFullwidthForms))] - [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeBlocks.Specials))] - public void Block_Unicode(char first, char last, string blockName) - { - Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 - Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF - Assert.True(first < last); // code point ranges should be ordered - - var propInfo = typeof(UnicodeBlocks).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); - Assert.NotNull(propInfo); - - UnicodeBlock block = (UnicodeBlock)propInfo.GetValue(null); - Assert.NotNull(block); - - // Test 1: the block should span the range first..last - Assert.Equal(first, block.FirstCodePoint); - Assert.Equal(last, block.FirstCodePoint + block.BlockSize - 1); - - // Test 2: calling the property multiple times should cache and return the same block instance - UnicodeBlock block2 = (UnicodeBlock)propInfo.GetValue(null); - Assert.Same(block, block2); - } - } -} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index 06e2fc0c73..07944d7c35 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -16,7 +16,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCustomFilters() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter); // Act & assert @@ -30,10 +30,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols)); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols)); // Act & assert Assert.Equal("[U+0061]", encoder.Encode("a")); @@ -45,7 +45,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); const string input = "Hello <>&\'\"+ there!"; const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!"; @@ -57,7 +57,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -120,7 +120,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); // allow all codepoints + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; @@ -137,7 +137,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_EmptyStringInput_ReturnsEmptyString() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // Act & assert Assert.Equal("", encoder.Encode("")); @@ -147,7 +147,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); string input = "Hello, there!"; // Act & assert @@ -158,7 +158,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_NullInput_ReturnsNull() { // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // Act & assert Assert.Null(encoder.Encode(null)); @@ -167,25 +167,25 @@ namespace Microsoft.Framework.WebEncoders [Fact] public void Encode_WithCharsRequiringEncodingAtBeginning() { - Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("&Hello, there!")); + Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("&Hello, there!")); } [Fact] public void Encode_WithCharsRequiringEncodingAtEnd() { - Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, there!&")); + Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, there!&")); } [Fact] public void Encode_WithCharsRequiringEncodingInMiddle() { - Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, &there!")); + Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, &there!")); } [Fact] public void Encode_WithCharsRequiringEncodingInterspersed() { - Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeBlocks.All).Encode("Hello, !")); + Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, !")); } [Fact] @@ -222,7 +222,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_AllCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -236,7 +236,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_AllCharsInvalid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); StringWriter output = new StringWriter(); // Act @@ -250,7 +250,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_SomeCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -294,7 +294,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_AllCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -308,7 +308,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); var mockWriter = new Mock(MockBehavior.Strict); mockWriter.Setup(o => o.Write("abc")).Verifiable(); @@ -323,7 +323,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_AllCharsInvalid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.None); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); StringWriter output = new StringWriter(); // Act @@ -337,7 +337,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_SomeCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -351,7 +351,7 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_EntireString_SomeCharsValid() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeBlocks.All); + CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); StringWriter output = new StringWriter(); // Act @@ -392,8 +392,8 @@ namespace Microsoft.Framework.WebEncoders { } - public CustomUnicodeEncoderBase(params UnicodeBlock[] allowedBlocks) - : this(new CodePointFilter(allowedBlocks)) + public CustomUnicodeEncoderBase(params UnicodeRange[] allowedRanges) + : this(new CodePointFilter(allowedRanges)) { } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs new file mode 100644 index 0000000000..cb3197ae71 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs @@ -0,0 +1,69 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeRangeTests + { + [Theory] + [InlineData(-1, 16)] + [InlineData(0x10000, 16)] + public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int rangeSize) + { + var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); + Assert.Equal("firstCodePoint", ex.ParamName); + } + + [Theory] + [InlineData(0x0100, -1)] + [InlineData(0x0100, 0x10000)] + public void Ctor_FailureCase_RangeSize(int firstCodePoint, int rangeSize) + { + var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); + Assert.Equal("rangeSize", ex.ParamName); + } + + [Fact] + public void Ctor_SuccessCase() + { + // Act + var range = new UnicodeRange(0x0100, 128); // Latin Extended-A + + // Assert + Assert.Equal(0x0100, range.FirstCodePoint); + Assert.Equal(128, range.RangeSize); + } + + [Fact] + public void FromSpan_FailureCase() + { + var ex = Assert.Throws(() => UnicodeRange.FromSpan('\u0020', '\u0010')); + Assert.Equal("lastChar", ex.ParamName); + } + + [Fact] + public void FromSpan_SuccessCase() + { + // Act + var range = UnicodeRange.FromSpan('\u0180', '\u024F'); // Latin Extended-B + + // Assert + Assert.Equal(0x0180, range.FirstCodePoint); + Assert.Equal(208, range.RangeSize); + } + + [Fact] + public void FromSpan_SuccessCase_All() + { + // Act + var range = UnicodeRange.FromSpan('\u0000', '\uFFFF'); + + // Assert + Assert.Equal(0, range.FirstCodePoint); + Assert.Equal(0x10000, range.RangeSize); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs new file mode 100644 index 0000000000..ac9e55bdac --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs @@ -0,0 +1,210 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Xunit; + +namespace Microsoft.Framework.WebEncoders +{ + public class UnicodeRangesTests + { + [Fact] + public void Range_None() + { + UnicodeRange range = UnicodeRanges.None; + Assert.NotNull(range); + + // Test 1: the range should be empty + Assert.Equal(0, range.FirstCodePoint); + Assert.Equal(0, range.RangeSize); + + // Test 2: calling the property multiple times should cache and return the same range instance + UnicodeRange range2 = UnicodeRanges.None; + Assert.Same(range, range2); + } + + [Fact] + public void Range_All() + { + Range_Unicode('\u0000', '\uFFFF', nameof(UnicodeRanges.All)); + } + + [Theory] + [InlineData('\u0000', '\u007F', nameof(UnicodeRanges.BasicLatin))] + [InlineData('\u0080', '\u00FF', nameof(UnicodeRanges.Latin1Supplement))] + [InlineData('\u0100', '\u017F', nameof(UnicodeRanges.LatinExtendedA))] + [InlineData('\u0180', '\u024F', nameof(UnicodeRanges.LatinExtendedB))] + [InlineData('\u0250', '\u02AF', nameof(UnicodeRanges.IPAExtensions))] + [InlineData('\u02B0', '\u02FF', nameof(UnicodeRanges.SpacingModifierLetters))] + [InlineData('\u0300', '\u036F', nameof(UnicodeRanges.CombiningDiacriticalMarks))] + [InlineData('\u0370', '\u03FF', nameof(UnicodeRanges.GreekandCoptic))] + [InlineData('\u0400', '\u04FF', nameof(UnicodeRanges.Cyrillic))] + [InlineData('\u0500', '\u052F', nameof(UnicodeRanges.CyrillicSupplement))] + [InlineData('\u0530', '\u058F', nameof(UnicodeRanges.Armenian))] + [InlineData('\u0590', '\u05FF', nameof(UnicodeRanges.Hebrew))] + [InlineData('\u0600', '\u06FF', nameof(UnicodeRanges.Arabic))] + [InlineData('\u0700', '\u074F', nameof(UnicodeRanges.Syriac))] + [InlineData('\u0750', '\u077F', nameof(UnicodeRanges.ArabicSupplement))] + [InlineData('\u0780', '\u07BF', nameof(UnicodeRanges.Thaana))] + [InlineData('\u07C0', '\u07FF', nameof(UnicodeRanges.NKo))] + [InlineData('\u0800', '\u083F', nameof(UnicodeRanges.Samaritan))] + [InlineData('\u0840', '\u085F', nameof(UnicodeRanges.Mandaic))] + [InlineData('\u08A0', '\u08FF', nameof(UnicodeRanges.ArabicExtendedA))] + [InlineData('\u0900', '\u097F', nameof(UnicodeRanges.Devanagari))] + [InlineData('\u0980', '\u09FF', nameof(UnicodeRanges.Bengali))] + [InlineData('\u0A00', '\u0A7F', nameof(UnicodeRanges.Gurmukhi))] + [InlineData('\u0A80', '\u0AFF', nameof(UnicodeRanges.Gujarati))] + [InlineData('\u0B00', '\u0B7F', nameof(UnicodeRanges.Oriya))] + [InlineData('\u0B80', '\u0BFF', nameof(UnicodeRanges.Tamil))] + [InlineData('\u0C00', '\u0C7F', nameof(UnicodeRanges.Telugu))] + [InlineData('\u0C80', '\u0CFF', nameof(UnicodeRanges.Kannada))] + [InlineData('\u0D00', '\u0D7F', nameof(UnicodeRanges.Malayalam))] + [InlineData('\u0D80', '\u0DFF', nameof(UnicodeRanges.Sinhala))] + [InlineData('\u0E00', '\u0E7F', nameof(UnicodeRanges.Thai))] + [InlineData('\u0E80', '\u0EFF', nameof(UnicodeRanges.Lao))] + [InlineData('\u0F00', '\u0FFF', nameof(UnicodeRanges.Tibetan))] + [InlineData('\u1000', '\u109F', nameof(UnicodeRanges.Myanmar))] + [InlineData('\u10A0', '\u10FF', nameof(UnicodeRanges.Georgian))] + [InlineData('\u1100', '\u11FF', nameof(UnicodeRanges.HangulJamo))] + [InlineData('\u1200', '\u137F', nameof(UnicodeRanges.Ethiopic))] + [InlineData('\u1380', '\u139F', nameof(UnicodeRanges.EthiopicSupplement))] + [InlineData('\u13A0', '\u13FF', nameof(UnicodeRanges.Cherokee))] + [InlineData('\u1400', '\u167F', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabics))] + [InlineData('\u1680', '\u169F', nameof(UnicodeRanges.Ogham))] + [InlineData('\u16A0', '\u16FF', nameof(UnicodeRanges.Runic))] + [InlineData('\u1700', '\u171F', nameof(UnicodeRanges.Tagalog))] + [InlineData('\u1720', '\u173F', nameof(UnicodeRanges.Hanunoo))] + [InlineData('\u1740', '\u175F', nameof(UnicodeRanges.Buhid))] + [InlineData('\u1760', '\u177F', nameof(UnicodeRanges.Tagbanwa))] + [InlineData('\u1780', '\u17FF', nameof(UnicodeRanges.Khmer))] + [InlineData('\u1800', '\u18AF', nameof(UnicodeRanges.Mongolian))] + [InlineData('\u18B0', '\u18FF', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabicsExtended))] + [InlineData('\u1900', '\u194F', nameof(UnicodeRanges.Limbu))] + [InlineData('\u1950', '\u197F', nameof(UnicodeRanges.TaiLe))] + [InlineData('\u1980', '\u19DF', nameof(UnicodeRanges.NewTaiLue))] + [InlineData('\u19E0', '\u19FF', nameof(UnicodeRanges.KhmerSymbols))] + [InlineData('\u1A00', '\u1A1F', nameof(UnicodeRanges.Buginese))] + [InlineData('\u1A20', '\u1AAF', nameof(UnicodeRanges.TaiTham))] + [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeRanges.CombiningDiacriticalMarksExtended))] + [InlineData('\u1B00', '\u1B7F', nameof(UnicodeRanges.Balinese))] + [InlineData('\u1B80', '\u1BBF', nameof(UnicodeRanges.Sundanese))] + [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeRanges.Batak))] + [InlineData('\u1C00', '\u1C4F', nameof(UnicodeRanges.Lepcha))] + [InlineData('\u1C50', '\u1C7F', nameof(UnicodeRanges.OlChiki))] + [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeRanges.SundaneseSupplement))] + [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeRanges.VedicExtensions))] + [InlineData('\u1D00', '\u1D7F', nameof(UnicodeRanges.PhoneticExtensions))] + [InlineData('\u1D80', '\u1DBF', nameof(UnicodeRanges.PhoneticExtensionsSupplement))] + [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeRanges.CombiningDiacriticalMarksSupplement))] + [InlineData('\u1E00', '\u1EFF', nameof(UnicodeRanges.LatinExtendedAdditional))] + [InlineData('\u1F00', '\u1FFF', nameof(UnicodeRanges.GreekExtended))] + [InlineData('\u2000', '\u206F', nameof(UnicodeRanges.GeneralPunctuation))] + [InlineData('\u2070', '\u209F', nameof(UnicodeRanges.SuperscriptsandSubscripts))] + [InlineData('\u20A0', '\u20CF', nameof(UnicodeRanges.CurrencySymbols))] + [InlineData('\u20D0', '\u20FF', nameof(UnicodeRanges.CombiningDiacriticalMarksforSymbols))] + [InlineData('\u2100', '\u214F', nameof(UnicodeRanges.LetterlikeSymbols))] + [InlineData('\u2150', '\u218F', nameof(UnicodeRanges.NumberForms))] + [InlineData('\u2190', '\u21FF', nameof(UnicodeRanges.Arrows))] + [InlineData('\u2200', '\u22FF', nameof(UnicodeRanges.MathematicalOperators))] + [InlineData('\u2300', '\u23FF', nameof(UnicodeRanges.MiscellaneousTechnical))] + [InlineData('\u2400', '\u243F', nameof(UnicodeRanges.ControlPictures))] + [InlineData('\u2440', '\u245F', nameof(UnicodeRanges.OpticalCharacterRecognition))] + [InlineData('\u2460', '\u24FF', nameof(UnicodeRanges.EnclosedAlphanumerics))] + [InlineData('\u2500', '\u257F', nameof(UnicodeRanges.BoxDrawing))] + [InlineData('\u2580', '\u259F', nameof(UnicodeRanges.BlockElements))] + [InlineData('\u25A0', '\u25FF', nameof(UnicodeRanges.GeometricShapes))] + [InlineData('\u2600', '\u26FF', nameof(UnicodeRanges.MiscellaneousSymbols))] + [InlineData('\u2700', '\u27BF', nameof(UnicodeRanges.Dingbats))] + [InlineData('\u27C0', '\u27EF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsA))] + [InlineData('\u27F0', '\u27FF', nameof(UnicodeRanges.SupplementalArrowsA))] + [InlineData('\u2800', '\u28FF', nameof(UnicodeRanges.BraillePatterns))] + [InlineData('\u2900', '\u297F', nameof(UnicodeRanges.SupplementalArrowsB))] + [InlineData('\u2980', '\u29FF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsB))] + [InlineData('\u2A00', '\u2AFF', nameof(UnicodeRanges.SupplementalMathematicalOperators))] + [InlineData('\u2B00', '\u2BFF', nameof(UnicodeRanges.MiscellaneousSymbolsandArrows))] + [InlineData('\u2C00', '\u2C5F', nameof(UnicodeRanges.Glagolitic))] + [InlineData('\u2C60', '\u2C7F', nameof(UnicodeRanges.LatinExtendedC))] + [InlineData('\u2C80', '\u2CFF', nameof(UnicodeRanges.Coptic))] + [InlineData('\u2D00', '\u2D2F', nameof(UnicodeRanges.GeorgianSupplement))] + [InlineData('\u2D30', '\u2D7F', nameof(UnicodeRanges.Tifinagh))] + [InlineData('\u2D80', '\u2DDF', nameof(UnicodeRanges.EthiopicExtended))] + [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeRanges.CyrillicExtendedA))] + [InlineData('\u2E00', '\u2E7F', nameof(UnicodeRanges.SupplementalPunctuation))] + [InlineData('\u2E80', '\u2EFF', nameof(UnicodeRanges.CJKRadicalsSupplement))] + [InlineData('\u2F00', '\u2FDF', nameof(UnicodeRanges.KangxiRadicals))] + [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeRanges.IdeographicDescriptionCharacters))] + [InlineData('\u3000', '\u303F', nameof(UnicodeRanges.CJKSymbolsandPunctuation))] + [InlineData('\u3040', '\u309F', nameof(UnicodeRanges.Hiragana))] + [InlineData('\u30A0', '\u30FF', nameof(UnicodeRanges.Katakana))] + [InlineData('\u3100', '\u312F', nameof(UnicodeRanges.Bopomofo))] + [InlineData('\u3130', '\u318F', nameof(UnicodeRanges.HangulCompatibilityJamo))] + [InlineData('\u3190', '\u319F', nameof(UnicodeRanges.Kanbun))] + [InlineData('\u31A0', '\u31BF', nameof(UnicodeRanges.BopomofoExtended))] + [InlineData('\u31C0', '\u31EF', nameof(UnicodeRanges.CJKStrokes))] + [InlineData('\u31F0', '\u31FF', nameof(UnicodeRanges.KatakanaPhoneticExtensions))] + [InlineData('\u3200', '\u32FF', nameof(UnicodeRanges.EnclosedCJKLettersandMonths))] + [InlineData('\u3300', '\u33FF', nameof(UnicodeRanges.CJKCompatibility))] + [InlineData('\u3400', '\u4DBF', nameof(UnicodeRanges.CJKUnifiedIdeographsExtensionA))] + [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeRanges.YijingHexagramSymbols))] + [InlineData('\u4E00', '\u9FFF', nameof(UnicodeRanges.CJKUnifiedIdeographs))] + [InlineData('\uA000', '\uA48F', nameof(UnicodeRanges.YiSyllables))] + [InlineData('\uA490', '\uA4CF', nameof(UnicodeRanges.YiRadicals))] + [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeRanges.Lisu))] + [InlineData('\uA500', '\uA63F', nameof(UnicodeRanges.Vai))] + [InlineData('\uA640', '\uA69F', nameof(UnicodeRanges.CyrillicExtendedB))] + [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeRanges.Bamum))] + [InlineData('\uA700', '\uA71F', nameof(UnicodeRanges.ModifierToneLetters))] + [InlineData('\uA720', '\uA7FF', nameof(UnicodeRanges.LatinExtendedD))] + [InlineData('\uA800', '\uA82F', nameof(UnicodeRanges.SylotiNagri))] + [InlineData('\uA830', '\uA83F', nameof(UnicodeRanges.CommonIndicNumberForms))] + [InlineData('\uA840', '\uA87F', nameof(UnicodeRanges.Phagspa))] + [InlineData('\uA880', '\uA8DF', nameof(UnicodeRanges.Saurashtra))] + [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeRanges.DevanagariExtended))] + [InlineData('\uA900', '\uA92F', nameof(UnicodeRanges.KayahLi))] + [InlineData('\uA930', '\uA95F', nameof(UnicodeRanges.Rejang))] + [InlineData('\uA960', '\uA97F', nameof(UnicodeRanges.HangulJamoExtendedA))] + [InlineData('\uA980', '\uA9DF', nameof(UnicodeRanges.Javanese))] + [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeRanges.MyanmarExtendedB))] + [InlineData('\uAA00', '\uAA5F', nameof(UnicodeRanges.Cham))] + [InlineData('\uAA60', '\uAA7F', nameof(UnicodeRanges.MyanmarExtendedA))] + [InlineData('\uAA80', '\uAADF', nameof(UnicodeRanges.TaiViet))] + [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))] + [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))] + [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))] + [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))] + [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))] + [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))] + [InlineData('\uF900', '\uFAFF', nameof(UnicodeRanges.CJKCompatibilityIdeographs))] + [InlineData('\uFB00', '\uFB4F', nameof(UnicodeRanges.AlphabeticPresentationForms))] + [InlineData('\uFB50', '\uFDFF', nameof(UnicodeRanges.ArabicPresentationFormsA))] + [InlineData('\uFE00', '\uFE0F', nameof(UnicodeRanges.VariationSelectors))] + [InlineData('\uFE10', '\uFE1F', nameof(UnicodeRanges.VerticalForms))] + [InlineData('\uFE20', '\uFE2F', nameof(UnicodeRanges.CombiningHalfMarks))] + [InlineData('\uFE30', '\uFE4F', nameof(UnicodeRanges.CJKCompatibilityForms))] + [InlineData('\uFE50', '\uFE6F', nameof(UnicodeRanges.SmallFormVariants))] + [InlineData('\uFE70', '\uFEFF', nameof(UnicodeRanges.ArabicPresentationFormsB))] + [InlineData('\uFF00', '\uFFEF', nameof(UnicodeRanges.HalfwidthandFullwidthForms))] + [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeRanges.Specials))] + public void Range_Unicode(char first, char last, string blockName) + { + Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 + Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF + Assert.True(first < last); // code point ranges should be ordered + + var propInfo = typeof(UnicodeRanges).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); + Assert.NotNull(propInfo); + + UnicodeRange range = (UnicodeRange)propInfo.GetValue(null); + Assert.NotNull(range); + + // Test 1: the range should span the range first..last + Assert.Equal(first, range.FirstCodePoint); + Assert.Equal(last, range.FirstCodePoint + range.RangeSize - 1); + + // Test 2: calling the property multiple times should cache and return the same range instance + UnicodeRange range2 = (UnicodeRange)propInfo.GetValue(null); + Assert.Same(range, range2); + } + } +} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs index fd649ffc08..2141bba7d7 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -18,7 +18,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_WithCodePointFilter() { // Arrange - var filter = new CodePointFilter(UnicodeBlocks.None).AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); + var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); UrlEncoder encoder = new UrlEncoder(filter); // Act & assert @@ -32,10 +32,10 @@ namespace Microsoft.Framework.WebEncoders } [Fact] - public void Ctor_WithUnicodeBlocks() + public void Ctor_WithUnicodeRanges() { // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.Latin1Supplement, UnicodeBlocks.MiscellaneousSymbols); + UrlEncoder encoder = new UrlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); // Act & assert Assert.Equal("%61", encoder.UrlEncode("a")); @@ -59,7 +59,7 @@ namespace Microsoft.Framework.WebEncoders public void Default_EquivalentToBasicLatin() { // Arrange - UrlEncoder controlEncoder = new UrlEncoder(UnicodeBlocks.BasicLatin); + UrlEncoder controlEncoder = new UrlEncoder(UnicodeRanges.BasicLatin); UrlEncoder testEncoder = UrlEncoder.Default; // Act & assert @@ -88,7 +88,7 @@ namespace Microsoft.Framework.WebEncoders public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars() { // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); + UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // Act & assert - BMP chars for (int i = 0; i <= 0xFFFF; i++) @@ -168,7 +168,7 @@ namespace Microsoft.Framework.WebEncoders public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() { // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeBlocks.All); // allow all codepoints + UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // allow all codepoints // "abcde" const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; @@ -271,8 +271,8 @@ namespace Microsoft.Framework.WebEncoders // by never emitting HTML-sensitive characters unescaped. // Arrange - UrlEncoder urlEncoder = new UrlEncoder(UnicodeBlocks.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeBlocks.All); + UrlEncoder urlEncoder = new UrlEncoder(UnicodeRanges.All); + HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); // Act & assert for (int i = 0; i <= 0x10FFFF; i++) diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs index 02c740a785..76e4d7bd15 100644 --- a/unicode/Generators/UnicodeTablesGenerator/Program.cs +++ b/unicode/Generators/UnicodeTablesGenerator/Program.cs @@ -20,22 +20,16 @@ namespace UnicodeTablesGenerator { private const string _codePointFiltersGeneratedFormat = @" /// -/// Represents the '{0}' Unicode block (U+{1}..U+{2}). +/// A corresponding to the '{0}' Unicode block (U+{1}..U+{2}). /// /// /// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block. /// -public static UnicodeBlock {3} -{{ - get - {{ - return Volatile.Read(ref _{4}) ?? CreateBlock(ref _{4}, first: '\u{1}', last: '\u{2}'); - }} -}} -private static UnicodeBlock _{4}; +public static UnicodeRange {3} => Volatile.Read(ref _{4}) ?? CreateRange(ref _{4}, first: '\u{1}', last: '\u{2}'); +private static UnicodeRange _{4}; "; - private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeBlocks.{0}))]"; + private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeRanges.{0}))]"; private static void Main() { @@ -73,8 +67,8 @@ private static UnicodeBlock _{4}; testCodeBuilder.AppendLine(); } - File.WriteAllText("UnicodeBlocks.generated.txt", runtimeCodeBuilder.ToString()); - File.WriteAllText("UnicodeBlocksTests.generated.txt", testCodeBuilder.ToString()); + File.WriteAllText("UnicodeRanges.generated.txt", runtimeCodeBuilder.ToString()); + File.WriteAllText("UnicodeRangesTests.generated.txt", testCodeBuilder.ToString()); } private static string RemoveAllNonAlphanumeric(string blockName) From ae456401a833a82d1e13e4d94b5af84fa73af8d5 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 10 Mar 2015 11:47:36 -0700 Subject: [PATCH 0480/1838] Change AllowedCharsBitmap back to a struct. I also experimented with having a fixed uint[] field inside the struct, but this actually ended up having worse performance than a proper uint[] array reference since it defeated some of the JITter's optimizations. --- .../AllowedCharsBitmap.cs | 21 ++++++++++++------- .../CodePointFilter.cs | 6 +++--- .../AllowedCharsBitmapTests.cs | 10 ++++----- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs index e05a917c56..3ad3312ae9 100644 --- a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs @@ -6,14 +6,15 @@ using System.Diagnostics; namespace Microsoft.Framework.WebEncoders { - internal class AllowedCharsBitmap + internal struct AllowedCharsBitmap { private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); - private uint[] _allowedCharsBitmap; + private readonly uint[] _allowedCharsBitmap; - public AllowedCharsBitmap() + private AllowedCharsBitmap(uint[] allowedCharsBitmap) { - _allowedCharsBitmap = new uint[ALLOWED_CHARS_BITMAP_LENGTH]; + Debug.Assert(allowedCharsBitmap != null); + _allowedCharsBitmap = allowedCharsBitmap; } // Marks a character as allowed (can be returned unencoded) @@ -34,9 +35,13 @@ namespace Microsoft.Framework.WebEncoders // Creates a deep copy of this bitmap public AllowedCharsBitmap Clone() { - var retVal = new AllowedCharsBitmap(); - retVal._allowedCharsBitmap = (uint[])this._allowedCharsBitmap.Clone(); - return retVal; + return new AllowedCharsBitmap((uint[])_allowedCharsBitmap.Clone()); + } + + // should be called in place of the ctor + public static AllowedCharsBitmap CreateNew() + { + return new AllowedCharsBitmap(new uint[ALLOWED_CHARS_BITMAP_LENGTH]); } // Marks a character as forbidden (must be returned encoded) @@ -47,7 +52,7 @@ namespace Microsoft.Framework.WebEncoders int offset = (int)(codePoint & 0x1FU); _allowedCharsBitmap[index] &= ~(0x1U << offset); } - + public void ForbidUndefinedCharacters() { // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs index f9c57f1873..da5991e7e2 100644 --- a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs @@ -19,7 +19,7 @@ namespace Microsoft.Framework.WebEncoders /// public CodePointFilter() { - _allowedCharsBitmap = new AllowedCharsBitmap(); + _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); } /// @@ -34,7 +34,7 @@ namespace Microsoft.Framework.WebEncoders } else { - _allowedCharsBitmap = new AllowedCharsBitmap(); + _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); AllowFilter(other); } } @@ -45,7 +45,7 @@ namespace Microsoft.Framework.WebEncoders /// public CodePointFilter(params UnicodeRange[] allowedRanges) { - _allowedCharsBitmap = new AllowedCharsBitmap(); + _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); AllowRanges(allowedRanges); } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs index 0810fb82d8..e26046b239 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -12,7 +12,7 @@ namespace Microsoft.Framework.WebEncoders public void Ctor_EmptyByDefault() { // Act - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); // Assert for (int i = 0; i <= Char.MaxValue; i++) @@ -25,7 +25,7 @@ namespace Microsoft.Framework.WebEncoders public void Allow_Forbid_ZigZag() { // Arrange - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); // Act // The only chars which are allowed are those whose code points are multiples of 3 or 7 @@ -58,7 +58,7 @@ namespace Microsoft.Framework.WebEncoders public void Clear_ForbidsEverything() { // Arrange - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); for (int i = 1; i <= Char.MaxValue; i++) { bitmap.AllowCharacter((char)i); @@ -78,7 +78,7 @@ namespace Microsoft.Framework.WebEncoders public void Clone_MakesDeepCopy() { // Arrange - var originalBitmap = new AllowedCharsBitmap(); + var originalBitmap = AllowedCharsBitmap.CreateNew(); originalBitmap.AllowCharacter('x'); // Act @@ -99,7 +99,7 @@ namespace Microsoft.Framework.WebEncoders // We only allow odd-numbered characters in this test so that // we can validate that we properly merged the two bitmaps together // rather than simply overwriting the target. - var bitmap = new AllowedCharsBitmap(); + var bitmap = AllowedCharsBitmap.CreateNew(); for (int i = 1; i <= Char.MaxValue; i += 2) { bitmap.AllowCharacter((char)i); From 332900b175457afa71f55baf4a5851c2fcd0271c Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 10 Mar 2015 13:57:55 -0700 Subject: [PATCH 0481/1838] Allow XyzEncoder.Default to be settable. --- .../HtmlEncoder.cs | 30 ++++++++++++++----- .../JavaScriptStringEncoder.cs | 30 ++++++++++++++----- .../UrlEncoder.cs | 30 ++++++++++++++----- 3 files changed, 66 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 4e30ba2505..6331189706 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Framework.WebEncoders @@ -57,20 +58,33 @@ namespace Microsoft.Framework.WebEncoders } /// - /// The default , which uses as its allow list. + /// A default instance of . /// + /// + /// This normally corresponds to . However, this property is + /// settable so that a developer can change the default implementation application-wide. + /// public static HtmlEncoder Default { get { - HtmlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); - if (defaultEncoder == null) - { - defaultEncoder = new HtmlEncoder(); - Volatile.Write(ref _defaultEncoder, defaultEncoder); - } - return defaultEncoder; + return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Volatile.Write(ref _defaultEncoder, value); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us + private static HtmlEncoder CreateDefaultEncoderSlow() + { + var onDemandEncoder = new HtmlEncoder(); + return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; } /// diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 1703a5447a..26bc175b81 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Framework.WebEncoders @@ -57,20 +58,33 @@ namespace Microsoft.Framework.WebEncoders } /// - /// The default , which uses as its allow list. + /// A default instance of . /// + /// + /// This normally corresponds to . However, this property is + /// settable so that a developer can change the default implementation application-wide. + /// public static JavaScriptStringEncoder Default { get { - JavaScriptStringEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); - if (defaultEncoder == null) - { - defaultEncoder = new JavaScriptStringEncoder(); - Volatile.Write(ref _defaultEncoder, defaultEncoder); - } - return defaultEncoder; + return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Volatile.Write(ref _defaultEncoder, value); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us + private static JavaScriptStringEncoder CreateDefaultEncoderSlow() + { + var onDemandEncoder = new JavaScriptStringEncoder(); + return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; } /// diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 90f1bf2abc..3f487e2533 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics; using System.IO; +using System.Runtime.CompilerServices; using System.Threading; namespace Microsoft.Framework.WebEncoders @@ -57,20 +58,33 @@ namespace Microsoft.Framework.WebEncoders } /// - /// The default which uses as its allow list. + /// A default instance of . /// + /// + /// This normally corresponds to . However, this property is + /// settable so that a developer can change the default implementation application-wide. + /// public static UrlEncoder Default { get { - UrlEncoder defaultEncoder = Volatile.Read(ref _defaultEncoder); - if (defaultEncoder == null) - { - defaultEncoder = new UrlEncoder(); - Volatile.Write(ref _defaultEncoder, defaultEncoder); - } - return defaultEncoder; + return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Volatile.Write(ref _defaultEncoder, value); + } + } + + [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us + private static UrlEncoder CreateDefaultEncoderSlow() + { + var onDemandEncoder = new UrlEncoder(); + return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; } /// From 543e0f4863054b97ad46cc4f5360d143bcce80f3 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 10 Mar 2015 18:06:59 -0700 Subject: [PATCH 0482/1838] Code comment cleanup. --- src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs | 8 ++++++-- .../JavaScriptStringEncoder.cs | 8 ++++++-- src/Microsoft.Framework.WebEncoders/UrlEncoder.cs | 8 ++++++-- 3 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs index 6331189706..8f6c976dd1 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs @@ -28,6 +28,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using as its allow list. + /// Any character not in the range will be escaped. /// public HtmlEncoder() : this(HtmlUnicodeEncoder.BasicLatin) @@ -36,7 +37,8 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. + /// pass through the encoder unescaped. Any character not in the set of ranges specified + /// by will be escaped. /// public HtmlEncoder(params UnicodeRange[] allowedRanges) : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges))) @@ -44,7 +46,9 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom code point filter. + /// Instantiates an encoder using a custom code point filter. Any character not in the + /// set returned by 's + /// method will be escaped. /// public HtmlEncoder(ICodePointFilter filter) : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs index 26bc175b81..acc9241b63 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs @@ -28,6 +28,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using as its allow list. + /// Any character not in the range will be escaped. /// public JavaScriptStringEncoder() : this(JavaScriptStringUnicodeEncoder.BasicLatin) @@ -36,7 +37,8 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. + /// pass through the encoder unescaped. Any character not in the set of ranges specified + /// by will be escaped. /// public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges) : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges))) @@ -44,7 +46,9 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom code point filter. + /// Instantiates an encoder using a custom code point filter. Any character not in the + /// set returned by 's + /// method will be escaped. /// public JavaScriptStringEncoder(ICodePointFilter filter) : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs index 3f487e2533..dbda74917d 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs @@ -28,6 +28,7 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder using as its allow list. + /// Any character not in the range will be escaped. /// public UrlEncoder() : this(UrlUnicodeEncoder.BasicLatin) @@ -36,7 +37,8 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. + /// pass through the encoder unescaped. Any character not in the set of ranges specified + /// by will be escaped. /// public UrlEncoder(params UnicodeRange[] allowedRanges) : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges))) @@ -44,7 +46,9 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Instantiates an encoder using a custom code point filter. + /// Instantiates an encoder using a custom code point filter. Any character not in the + /// set returned by 's + /// method will be escaped. /// public UrlEncoder(ICodePointFilter filter) : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) From a6670114b16c90295af312427f05420fc9a63763 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 6 Mar 2015 13:05:20 -0800 Subject: [PATCH 0483/1838] Adding more fallbacks for BufferingHelper temporary folder location Fixes: https://github.com/aspnet/HttpAbstractions/issues/168 --- .../BufferingHelper.cs | 9 +++------ .../BufferingHelperTests.cs | 19 +++++++++++++++++++ 2 files changed, 22 insertions(+), 6 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs diff --git a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs index 58ef9c509e..32dde60d46 100644 --- a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs @@ -3,7 +3,6 @@ using System; using System.IO; -using Microsoft.AspNet.Http; using Microsoft.AspNet.WebUtilities; namespace Microsoft.AspNet.Http.Core @@ -16,11 +15,9 @@ namespace Microsoft.AspNet.Http.Core { get { - var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP"); - if (string.IsNullOrEmpty(temp)) - { - temp = Environment.GetEnvironmentVariable("TEMP"); - } + // Look for folders in the following order. + var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. + Path.GetTempPath(); // Fall back. if (!Directory.Exists(temp)) { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs new file mode 100644 index 0000000000..362849193c --- /dev/null +++ b/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Xunit; + +namespace Microsoft.AspNet.Http.Core.Tests +{ + public class BufferingHelperTests + { + [Fact] + public void GetTempDirectory_Returns_Valid_Location() + { + var tempDirectory = BufferingHelper.TempDirectory; + Assert.NotNull(tempDirectory); + Assert.True(Directory.Exists(tempDirectory)); + } + } +} \ No newline at end of file From e3e0f1a1c365af479caaffbf0a11790dbb7ed910 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 11 Mar 2015 14:07:29 -0700 Subject: [PATCH 0484/1838] Update .kproj => .xproj. --- Hosting.sln | 12 +++---- ...Microsoft.AspNet.Hosting.Interfaces.xproj} | 0 ...g.kproj => Microsoft.AspNet.Hosting.xproj} | 0 ...> Microsoft.AspNet.RequestContainer.xproj} | 0 ....kproj => Microsoft.AspNet.TestHost.xproj} | 0 ...j => Microsoft.AspNet.Hosting.Tests.xproj} | 34 +++++++++---------- ... => Microsoft.AspNet.TestHost.Tests.xproj} | 34 +++++++++---------- 7 files changed, 40 insertions(+), 40 deletions(-) rename src/Microsoft.AspNet.Hosting.Interfaces/{Microsoft.AspNet.Hosting.Interfaces.kproj => Microsoft.AspNet.Hosting.Interfaces.xproj} (100%) rename src/Microsoft.AspNet.Hosting/{Microsoft.AspNet.Hosting.kproj => Microsoft.AspNet.Hosting.xproj} (100%) rename src/Microsoft.AspNet.RequestContainer/{Microsoft.AspNet.RequestContainer.kproj => Microsoft.AspNet.RequestContainer.xproj} (100%) rename src/Microsoft.AspNet.TestHost/{Microsoft.AspNet.TestHost.kproj => Microsoft.AspNet.TestHost.xproj} (100%) rename test/Microsoft.AspNet.Hosting.Tests/{Microsoft.AspNet.Hosting.Tests.kproj => Microsoft.AspNet.Hosting.Tests.xproj} (97%) rename test/Microsoft.AspNet.TestHost.Tests/{Microsoft.AspNet.TestHost.Tests.kproj => Microsoft.AspNet.TestHost.Tests.xproj} (98%) diff --git a/Hosting.sln b/Hosting.sln index 33c4336fb9..b698bea6b8 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -7,22 +7,22 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFF EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{FEB39027-9158-4DE2-997F-7ADAEF8188D0}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost.Tests", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.kproj", "{0ACB2719-9484-49B5-B8E3-117091192511}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost.Tests", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.xproj", "{0ACB2719-9484-49B5-B8E3-117091192511}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.kproj", "{1A415A3F-1081-45DB-809B-EE19CEA02DC0}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.xproj", "{1A415A3F-1081-45DB-809B-EE19CEA02DC0}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.kproj", "{3944F036-7E75-47E8-AA52-C4B89A64EC3A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.xproj", "{3944F036-7E75-47E8-AA52-C4B89A64EC3A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Tests", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.kproj", "{D4F18D58-52B1-435D-A012-10F2CDF158C4}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Tests", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.xproj", "{D4F18D58-52B1-435D-A012-10F2CDF158C4}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.RequestContainer", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.kproj", "{374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.RequestContainer", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.xproj", "{374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A66E3673-3976-4152-B902-2D0EC1428EA2}" ProjectSection(SolutionItems) = preProject global.json = global.json EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.kproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.kproj b/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.kproj rename to src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.kproj rename to src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.xproj similarity index 100% rename from src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.kproj rename to src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.xproj diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj similarity index 100% rename from src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.kproj rename to src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj similarity index 97% rename from test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj rename to test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj index 59c5545a1f..8f9318a85a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.kproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj @@ -1,18 +1,18 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - d4f18d58-52b1-435d-a012-10f2cdf158c4 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - 18007 - - + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + d4f18d58-52b1-435d-a012-10f2cdf158c4 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + 18007 + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj similarity index 98% rename from test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj rename to test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj index 04d1606ca3..b70af08ea5 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.kproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj @@ -1,17 +1,17 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 0acb2719-9484-49b5-b8e3-117091192511 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 0acb2719-9484-49b5-b8e3-117091192511 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + From 12f90869c04c57d6b3a2e7f38fbb6dc4183d421c Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 11 Mar 2015 14:07:45 -0700 Subject: [PATCH 0485/1838] Update .kproj => .xproj. --- HttpAbstractions.sln | 34 +++++++++---------- ...oj => Microsoft.AspNet.FeatureModel.xproj} | 0 ...kproj => Microsoft.AspNet.Http.Core.xproj} | 0 ...=> Microsoft.AspNet.Http.Extensions.xproj} | 0 ...=> Microsoft.AspNet.Http.Interfaces.xproj} | 0 ...Http.kproj => Microsoft.AspNet.Http.xproj} | 0 ...Owin.kproj => Microsoft.AspNet.Owin.xproj} | 0 ...oj => Microsoft.AspNet.WebUtilities.xproj} | 0 ... => Microsoft.Framework.WebEncoders.xproj} | 0 ...kproj => Microsoft.Net.Http.Headers.xproj} | 0 ...Microsoft.AspNet.FeatureModel.Tests.xproj} | 0 ...=> Microsoft.AspNet.Http.Core.Tests.xproj} | 0 ...rosoft.AspNet.Http.Extensions.Tests.xproj} | 0 ...proj => Microsoft.AspNet.Http.Tests.xproj} | 0 ...proj => Microsoft.AspNet.Owin.Tests.xproj} | 0 ...Microsoft.AspNet.WebUtilities.Tests.xproj} | 0 ...crosoft.Framework.WebEncoders.Tests.xproj} | 0 ...=> Microsoft.Net.Http.Headers.Tests.xproj} | 0 18 files changed, 17 insertions(+), 17 deletions(-) rename src/Microsoft.AspNet.FeatureModel/{Microsoft.AspNet.FeatureModel.kproj => Microsoft.AspNet.FeatureModel.xproj} (100%) rename src/Microsoft.AspNet.Http.Core/{Microsoft.AspNet.Http.Core.kproj => Microsoft.AspNet.Http.Core.xproj} (100%) rename src/Microsoft.AspNet.Http.Extensions/{Microsoft.AspNet.Http.Extensions.kproj => Microsoft.AspNet.Http.Extensions.xproj} (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Microsoft.AspNet.Http.Interfaces.kproj => Microsoft.AspNet.Http.Interfaces.xproj} (100%) rename src/Microsoft.AspNet.Http/{Microsoft.AspNet.Http.kproj => Microsoft.AspNet.Http.xproj} (100%) rename src/Microsoft.AspNet.Owin/{Microsoft.AspNet.Owin.kproj => Microsoft.AspNet.Owin.xproj} (100%) rename src/Microsoft.AspNet.WebUtilities/{Microsoft.AspNet.WebUtilities.kproj => Microsoft.AspNet.WebUtilities.xproj} (100%) rename src/Microsoft.Framework.WebEncoders/{Microsoft.Framework.WebEncoders.kproj => Microsoft.Framework.WebEncoders.xproj} (100%) rename src/Microsoft.Net.Http.Headers/{Microsoft.Net.Http.Headers.kproj => Microsoft.Net.Http.Headers.xproj} (100%) rename test/Microsoft.AspNet.FeatureModel.Tests/{Microsoft.AspNet.FeatureModel.Tests.kproj => Microsoft.AspNet.FeatureModel.Tests.xproj} (100%) rename test/Microsoft.AspNet.Http.Core.Tests/{Microsoft.AspNet.Http.Core.Tests.kproj => Microsoft.AspNet.Http.Core.Tests.xproj} (100%) rename test/Microsoft.AspNet.Http.Extensions.Tests/{Microsoft.AspNet.Http.Extensions.Tests.kproj => Microsoft.AspNet.Http.Extensions.Tests.xproj} (100%) rename test/Microsoft.AspNet.Http.Tests/{Microsoft.AspNet.Http.Tests.kproj => Microsoft.AspNet.Http.Tests.xproj} (100%) rename test/Microsoft.AspNet.Owin.Tests/{Microsoft.AspNet.Owin.Tests.kproj => Microsoft.AspNet.Owin.Tests.xproj} (100%) rename test/Microsoft.AspNet.WebUtilities.Tests/{Microsoft.AspNet.WebUtilities.Tests.kproj => Microsoft.AspNet.WebUtilities.Tests.xproj} (100%) rename test/Microsoft.Framework.WebEncoders.Tests/{Microsoft.Framework.WebEncoders.Tests.kproj => Microsoft.Framework.WebEncoders.Tests.xproj} (100%) rename test/Microsoft.Net.Http.Headers.Tests/{Microsoft.Net.Http.Headers.Tests.kproj => Microsoft.Net.Http.Headers.Tests.xproj} (100%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 042139d424..cf16a26dce 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -7,39 +7,39 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.kproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.kproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.kproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.kproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.kproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.kproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.kproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.kproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.kproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.kproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.kproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.kproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.kproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.kproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.xproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.kproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.kproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.kproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj similarity index 100% rename from src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.kproj rename to src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.kproj rename to src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.kproj rename to src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.kproj rename to src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj similarity index 100% rename from src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.kproj rename to src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj similarity index 100% rename from src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.kproj rename to src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.kproj rename to src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.kproj rename to src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj similarity index 100% rename from src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.kproj rename to src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.kproj rename to test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.kproj rename to test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.kproj rename to test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.kproj rename to test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.kproj rename to test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.kproj rename to test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj similarity index 100% rename from test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.kproj rename to test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj similarity index 100% rename from test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.kproj rename to test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj From ebcb6196b879336f6fb8c9f378569229e3590d76 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 11 Mar 2015 16:58:25 -0700 Subject: [PATCH 0486/1838] Do not use deprecated `dnvm -x86` switch --- build.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 68a732c182..41025afb26 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 :run -CALL packages\KoreBuild\build\dnvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From c27c85c7ac0ba49caf8c357fe8f153146d90619d Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 11 Mar 2015 16:58:26 -0700 Subject: [PATCH 0487/1838] Do not use deprecated `dnvm -x86` switch --- build.cmd | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 68a732c182..41025afb26 100644 --- a/build.cmd +++ b/build.cmd @@ -20,9 +20,9 @@ IF EXIST packages\KoreBuild goto run .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -x86 -CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -x86 +CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 :run -CALL packages\KoreBuild\build\dnvm use default -runtime CLR -x86 +CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* From a06d05ffae07a9a17b77208b9e617283c91b8a3a Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 12 Mar 2015 16:27:02 -0700 Subject: [PATCH 0488/1838] Update xunit.runner.kre => xunit.runner.aspnet. --- test/Microsoft.AspNet.FeatureModel.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Core.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Http.Tests/project.json | 4 ++-- test/Microsoft.AspNet.Owin.Tests/project.json | 4 ++-- test/Microsoft.AspNet.WebUtilities.Tests/project.json | 4 ++-- test/Microsoft.Framework.WebEncoders.Tests/project.json | 4 ++-- test/Microsoft.Net.Http.Headers.Tests/project.json | 4 ++-- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 0713f60e97..3b35b808af 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -3,10 +3,10 @@ "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index d7c027a570..f943dd78c7 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 0e102e3708..e3518a3c7d 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index a62cd2769e..5c51fc5e3f 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 9dd6d491be..3dbc5de4e6 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -5,10 +5,10 @@ "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 11ef7dc59e..29994be207 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -3,10 +3,10 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 9c62c1dacd..5fb71938d1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -4,10 +4,10 @@ "Microsoft.Framework.WebEncoders": "1.0.0-*", "Moq": "4.2.1312.1622", "Newtonsoft.Json": "6.0.6", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "compilationOptions": { "allowUnsafe": true diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 297c316376..0fc76424a5 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -2,10 +2,10 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.Net.Http.Headers": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { }, From a10acfd4cdc896493896a61be034bd6b5e5f3f7b Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 12 Mar 2015 17:17:33 -0700 Subject: [PATCH 0489/1838] Update xunit.runner.kre => xunit.runner.aspnet. --- test/Microsoft.AspNet.Hosting.Tests/project.json | 4 ++-- test/Microsoft.AspNet.TestHost.Tests/project.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index ae45cb6fa0..a87f3cffd7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -3,13 +3,13 @@ "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.RequestContainer": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "frameworks": { "dnx451": {} }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "webroot": "testroot" } diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 68b0f58d1f..968dba2a54 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,10 +1,10 @@ { "dependencies": { "Microsoft.AspNet.TestHost": "1.0.0-*", - "xunit.runner.kre": "1.0.0-*" + "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { - "test": "xunit.runner.kre" + "test": "xunit.runner.aspnet" }, "frameworks": { "dnx451": { } From 8ca2728ef8b330f73765f2e6a4ecc0059782e17b Mon Sep 17 00:00:00 2001 From: Levi B Date: Thu, 12 Mar 2015 11:01:47 -0700 Subject: [PATCH 0490/1838] Split encoders into two packages to resolve layering issues The core package has no external dependencies aside from NetFX-produced packages --- HttpAbstractions.sln | 17 ++++++++++++- .../AllowedCharsBitmap.cs | 0 .../CodePointFilter.cs | 0 .../EncoderCommon.cs | 0 .../EncoderExtensions.cs | 0 .../EncoderServiceProviderExtensions.cs | 21 ++++++++------- .../HexUtil.cs | 0 .../HtmlEncoder.cs | 3 ++- .../ICodePointFilter.cs | 0 .../IHtmlEncoder.cs | 0 .../IJavaScriptStringEncoder.cs | 0 .../IUrlEncoder.cs | 0 .../JavaScriptStringEncoder.cs | 3 ++- ...Microsoft.Framework.WebEncoders.Core.xproj | 17 +++++++++++++ .../Properties/AssemblyInfo.cs | 0 .../UnicodeEncoderBase.cs | 0 .../UnicodeHelpers.cs | 0 .../UnicodeRange.cs | 0 .../UnicodeRanges.cs | 0 .../UnicodeRanges.generated.cs | 0 .../UrlEncoder.cs | 3 ++- .../WebEncoderOptions.cs | 0 .../unicode-7.0.0-defined-characters.bin | Bin .../project.json | 24 ++++++++++++++++++ .../project.json | 19 +++----------- 25 files changed, 77 insertions(+), 30 deletions(-) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/AllowedCharsBitmap.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/CodePointFilter.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/EncoderCommon.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/EncoderExtensions.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/EncoderServiceProviderExtensions.cs (50%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/HexUtil.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/HtmlEncoder.cs (98%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/ICodePointFilter.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/IHtmlEncoder.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/IJavaScriptStringEncoder.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/IUrlEncoder.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/JavaScriptStringEncoder.cs (98%) create mode 100644 src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeEncoderBase.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeHelpers.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeRange.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeRanges.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UnicodeRanges.generated.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/UrlEncoder.cs (98%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/WebEncoderOptions.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Framework.WebEncoders.Core}/compiler/resources/unicode-7.0.0-defined-characters.bin (100%) create mode 100644 src/Microsoft.Framework.WebEncoders.Core/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index cf16a26dce..dbc423e462 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22609.0 +VisualStudioVersion = 14.0.22710.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -41,6 +41,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEnco EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Core", "src\Microsoft.Framework.WebEncoders.Core\Microsoft.Framework.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -229,6 +231,18 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.ActiveCfg = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.Build.0 = Debug|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.Build.0 = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU + {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -251,5 +265,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/AllowedCharsBitmap.cs rename to src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs diff --git a/src/Microsoft.Framework.WebEncoders/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/CodePointFilter.cs rename to src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderCommon.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/EncoderCommon.cs rename to src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/EncoderExtensions.cs rename to src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs similarity index 50% rename from src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs rename to src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs index 97a04d1c66..c9f57a59a9 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs @@ -2,49 +2,48 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.DependencyInjection; namespace Microsoft.Framework.WebEncoders { /// - /// Contains extension methods for fetching encoders from a service provider. + /// Contains extension methods for fetching encoders from an . /// public static class EncoderServiceProviderExtensions { /// - /// Retrieves an IHtmlEncoder from a service provider. + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. - /// It will return a default encoder instance if the service provider does not contain one. + /// It will return a default encoder instance if does not contain one or is null. /// public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider?.GetService() ?? HtmlEncoder.Default; + return (IHtmlEncoder)serviceProvider?.GetService(typeof(IHtmlEncoder)) ?? HtmlEncoder.Default; } /// - /// Retrieves an IJavaScriptStringEncoder from a service provider. + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. - /// It will return a default encoder instance if the service provider does not contain one. + /// It will return a default encoder instance if does not contain one or is null. /// public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider) { - return serviceProvider?.GetService() ?? JavaScriptStringEncoder.Default; + return (IJavaScriptStringEncoder)serviceProvider?.GetService(typeof(IJavaScriptStringEncoder)) ?? JavaScriptStringEncoder.Default; } /// - /// Retrieves an IUrlEncoder from a service provider. + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. - /// It will return a default encoder instance if the service provider does not contain one. + /// It will return a default encoder instance if does not contain one or is null. /// public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) { - return serviceProvider?.GetService() ?? UrlEncoder.Default; + return (IUrlEncoder)serviceProvider?.GetService(typeof(IUrlEncoder)) ?? UrlEncoder.Default; } } } diff --git a/src/Microsoft.Framework.WebEncoders/HexUtil.cs b/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/HexUtil.cs rename to src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs diff --git a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs index 8f6c976dd1..b176b66346 100644 --- a/src/Microsoft.Framework.WebEncoders/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -50,7 +51,7 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public HtmlEncoder(ICodePointFilter filter) + public HtmlEncoder([NotNull] ICodePointFilter filter) : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } diff --git a/src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/ICodePointFilter.cs rename to src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs diff --git a/src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/IHtmlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs diff --git a/src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/IJavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs diff --git a/src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/IUrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs diff --git a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs index acc9241b63..189d9ac08f 100644 --- a/src/Microsoft.Framework.WebEncoders/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -50,7 +51,7 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public JavaScriptStringEncoder(ICodePointFilter filter) + public JavaScriptStringEncoder([NotNull] ICodePointFilter filter) : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) { } diff --git a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj new file mode 100644 index 0000000000..9ae58fa6a5 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj @@ -0,0 +1,17 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + be9112cb-d87d-4080-9cc3-24492d49cbe6 + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs rename to src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeEncoderBase.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeHelpers.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRange.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeRange.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeRanges.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs diff --git a/src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/UnicodeRanges.generated.cs rename to src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs diff --git a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders/UrlEncoder.cs rename to src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index dbda74917d..c29fa70ba8 100644 --- a/src/Microsoft.Framework.WebEncoders/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -50,7 +51,7 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public UrlEncoder(ICodePointFilter filter) + public UrlEncoder([NotNull] ICodePointFilter filter) : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) { } diff --git a/src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs b/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/WebEncoderOptions.cs rename to src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs diff --git a/src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin similarity index 100% rename from src/Microsoft.Framework.WebEncoders/compiler/resources/unicode-7.0.0-defined-characters.bin rename to src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json new file mode 100644 index 0000000000..5b43df9eb3 --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -0,0 +1,24 @@ +{ + "version": "1.0.0-*", + "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", + "compilationOptions": { + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, + "frameworks": { + "net45": { }, + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.ComponentModel": "4.0.0-*", + "System.Diagnostics.Debug": "4.0.10-*", + "System.IO": "4.0.10-*", + "System.Reflection": "4.0.10-*", + "System.Runtime.Extensions": "4.0.10-*", + "System.Threading": "4.0.10-*" + } + } + } +} diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 2c1b7ba06d..612cd69ddd 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,26 +1,15 @@ { "version": "1.0.0-*", - "description": "Contains encoders for HTML, JavaScript, and URLs.", - "compilationOptions": { - "allowUnsafe": true - }, + "description": "Contains registration and configuration APIs for the core framework encoders.", "dependencies": { "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "net45": { }, "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Threading": "4.0.10-beta-*" - } - } + "dnxcore50": { } } } From ca07b6e2fd254c05501e08190fc760e2df4be5fc Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 9 Mar 2015 13:21:05 -0700 Subject: [PATCH 0491/1838] Using new encoders over the old encoders. --- .../Authentication/AuthenticateContext.cs | 1 - .../Authentication/DescribeSchemesContext.cs | 1 - .../Collections/ResponseCookies.cs | 10 +-- .../Collections/SessionCollection.cs | 2 - .../QueryFeature.cs | 2 - .../RequestCookiesFeature.cs | 4 +- .../ResponseCookiesFeature.cs | 2 - src/Microsoft.AspNet.Http.Core/project.json | 67 +++++++++---------- .../QueryBuilder.cs | 6 +- .../project.json | 7 +- src/Microsoft.AspNet.Http/PathString.cs | 3 +- src/Microsoft.AspNet.Http/QueryString.cs | 3 +- src/Microsoft.AspNet.Http/project.json | 52 +++++++------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 3 +- .../QueryHelpers.cs | 7 +- .../project.json | 1 + 16 files changed, 83 insertions(+), 88 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 858da030a4..b623f15c50 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs index 7cb613ecb3..6da55ce724 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index 35aa02b17c..8066450f98 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -5,8 +5,8 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http.Core.Collections { @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value) { - Headers.AppendValues(Constants.Headers.SetCookie, Uri.EscapeDataString(key) + "=" + Uri.EscapeDataString(value) + "; path=/"); + Headers.AppendValues(Constants.Headers.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); } /// @@ -49,9 +49,9 @@ namespace Microsoft.AspNet.Http.Core.Collections bool expiresHasValue = options.Expires.HasValue; string setCookieValue = string.Concat( - Uri.EscapeDataString(key), + UrlEncoder.Default.UrlEncode(key), "=", - Uri.EscapeDataString(value ?? string.Empty), + UrlEncoder.Default.UrlEncode(value ?? string.Empty), !domainHasValue ? null : "; domain=", !domainHasValue ? null : options.Domain, !pathHasValue ? null : "; path=", @@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Http.Core.Collections { Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); - var deleteCookies = new[] { Uri.EscapeDataString(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; + var deleteCookies = new[] { UrlEncoder.Default.UrlEncode(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); if (existingValues == null || existingValues.Count == 0) { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs index 0c7485096c..df58e4a63f 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs @@ -4,8 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index 484f41b1a9..16923fe544 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -3,8 +3,6 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index 6286bdd1da..192c5f866f 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -4,11 +4,9 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs index b3c6354392..11e3c098fa 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index c611f9a806..569d667698 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,35 +1,34 @@ - -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", - "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" - - }, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal" : "4.0.0-beta-*", - "System.Text.Encoding": "4.0.10-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature implementations.", + "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Text.Encoding": "4.0.10-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" + } + } } - } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index a4afbba272..98550eb832 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections; using System.Collections.Generic; using System.Text; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http.Extensions { @@ -45,9 +45,9 @@ namespace Microsoft.AspNet.Http.Extensions var pair = _params[i]; builder.Append(first ? "?" : "&"); first = false; - builder.Append(Uri.EscapeDataString(pair.Key)); + builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); builder.Append("="); - builder.Append(Uri.EscapeDataString(pair.Value)); + builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); } return builder.ToString(); diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index f2d71e2528..383484ef75 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,12 +5,13 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, - "frameworks" : { - "dnx451" : { + "frameworks": { + "dnx451": { }, - "dnxcore50" : { + "dnxcore50": { "dependencies": { "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index 2963c64d8f..8a7f5d945c 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http { @@ -65,7 +66,7 @@ namespace Microsoft.AspNet.Http public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. - return HasValue ? String.Join("/", _value.Split('/').Select(Uri.EscapeDataString)) : String.Empty; + return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.UrlEncode)) : string.Empty; } /// diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index c32e3bb037..6b61d92f99 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http { @@ -38,7 +39,7 @@ namespace Microsoft.AspNet.Http /// The un-encoded parameter value public QueryString(string name, string value) { - _value = "?" + Uri.EscapeDataString(name) + '=' + Uri.EscapeDataString(value); + _value = "?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value); } /// diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index a8c1d8aad3..30d577d013 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,26 +1,28 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", - "dependencies": {}, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal" : "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "dependencies": { + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", + "System.Collections": "4.0.10-beta-*", + "System.ComponentModel": "4.0.0-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.IO": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" + } + } } - } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 072f779b98..4e37f6b218 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,9 +14,8 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Core.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 1414ef8f17..d7584b536a 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.WebUtilities { @@ -19,7 +20,7 @@ namespace Microsoft.AspNet.WebUtilities public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { bool hasQuery = uri.IndexOf('?') != -1; - return uri + (hasQuery ? "&" : "?") + Uri.EscapeDataString(name) + "=" + Uri.EscapeDataString(value); + return uri + (hasQuery ? "&" : "?") + UrlEncoder.Default.UrlEncode(name) + "=" + UrlEncoder.Default.UrlEncode(value); } /// @@ -36,9 +37,9 @@ namespace Microsoft.AspNet.WebUtilities foreach (var parameter in queryString) { sb.Append(hasQuery ? '&' : '?'); - sb.Append(Uri.EscapeDataString(parameter.Key)); + sb.Append(UrlEncoder.Default.UrlEncode(parameter.Key)); sb.Append('='); - sb.Append(Uri.EscapeDataString(parameter.Value)); + sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value)); hasQuery = true; } return sb.ToString(); diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 45068efbf3..19bedc2195 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, From b77e9d2d9ccdf78e4cd0941af53aff08931b8374 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 13 Mar 2015 17:44:51 -0700 Subject: [PATCH 0492/1838] Using [NotNull] attribute from the Common repo package --- .../FeatureCollection.cs | 1 + .../NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.FeatureModel/project.json | 9 +++++---- .../Authentication/AuthenticateContext.cs | 1 + .../Authentication/ChallengeContext.cs | 1 + .../Authentication/SignInContext.cs | 1 + .../Authentication/SignOutContext.cs | 1 + src/Microsoft.AspNet.Http.Core/BufferingHelper.cs | 1 + .../Collections/FormCollection.cs | 2 +- .../Collections/HeaderDictionary.cs | 3 +-- .../Collections/ReadableStringCollection.cs | 3 +-- .../Collections/ResponseCookies.cs | 1 + src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs | 6 +++--- .../DefaultHttpResponse.cs | 1 + src/Microsoft.AspNet.Http.Core/FormFeature.cs | 3 +-- .../Infrastructure/ParsingHelpers.cs | 2 +- src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.Http.Core/QueryFeature.cs | 1 + .../ReferenceReadStream.cs | 1 + .../RequestCookiesFeature.cs | 1 + src/Microsoft.AspNet.Http.Core/project.json | 1 + .../FormFileExtensions.cs | 1 + .../HeaderDictionaryTypeExtensions.cs | 1 + .../HttpResponseSendingExtensions.cs | 1 + .../NotNullAttribute.cs | 12 ------------ .../RequestHeaders.cs | 1 + .../ResponseHeaders.cs | 1 + .../SendFileResponseExtensions.cs | 1 + src/Microsoft.AspNet.Http.Extensions/project.json | 1 + .../Authentication/AuthenticateResult.cs | 1 + .../Authentication/AuthenticationDescription.cs | 1 + .../Extensions/MapExtensions.cs | 1 + .../Extensions/MapMiddleware.cs | 1 + .../Extensions/MapWhenExtensions.cs | 1 + .../Extensions/MapWhenMiddleware.cs | 1 + .../Extensions/RunExtensions.cs | 1 + src/Microsoft.AspNet.Http/FragmentString.cs | 1 + src/Microsoft.AspNet.Http/HostString.cs | 1 + .../HttpResponseWritingExtensions.cs | 1 + src/Microsoft.AspNet.Http/NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.Http/PathString.cs | 1 + src/Microsoft.AspNet.Http/QueryString.cs | 1 + src/Microsoft.AspNet.Http/project.json | 1 + src/Microsoft.AspNet.Owin/NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 1 + src/Microsoft.AspNet.Owin/project.json | 3 ++- .../BufferedReadStream.cs | 1 + .../FileBufferingReadStream.cs | 1 + src/Microsoft.AspNet.WebUtilities/FormReader.cs | 1 + .../KeyValueAccumulator.cs | 1 + src/Microsoft.AspNet.WebUtilities/MultipartReader.cs | 1 + .../MultipartReaderStream.cs | 1 + .../NotNullAttribute.cs | 12 ------------ src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 1 + src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 1 + src/Microsoft.AspNet.WebUtilities/project.json | 1 + src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs | 1 + .../GenericHeaderParser.cs | 2 ++ src/Microsoft.Net.Http.Headers/NotNullAttribute.cs | 12 ------------ .../SetCookieHeaderValue.cs | 1 + .../StringWithQualityHeaderValueComparer.cs | 1 + src/Microsoft.Net.Http.Headers/project.json | 1 + 62 files changed, 63 insertions(+), 100 deletions(-) delete mode 100644 src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Http/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.Owin/NotNullAttribute.cs delete mode 100644 src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs delete mode 100644 src/Microsoft.Net.Http.Headers/NotNullAttribute.cs diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index b86a3832b1..28e01101ff 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -6,6 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Reflection; using System.Threading; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.FeatureModel { diff --git a/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs b/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs deleted file mode 100644 index 3869edda12..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.FeatureModel -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 5513054416..1d28c1258f 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,8 +1,9 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature infrastructure.", - "dependencies": { - }, + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature infrastructure.", + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, "frameworks": { "dnx451": {}, "dnxcore50": { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index b623f15c50..1fa87a6417 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index 00c5a1c6fb..7b86337ccd 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs index b5d8361ad6..6d067c3919 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs index 3676102e03..318be62c70 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { diff --git a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs index 32dde60d46..3c0120f725 100644 --- a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs @@ -4,6 +4,7 @@ using System; using System.IO; using Microsoft.AspNet.WebUtilities; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs index 55d7b321a0..ffef8fcaa2 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs index 72dc55ec36..487f1c4190 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs @@ -5,9 +5,8 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs index 91f3b8c8f3..38aa497e12 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs @@ -1,10 +1,9 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Collections { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index 8066450f98..056df67640 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http.Core.Collections diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index d178aa90e0..90dff4c588 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -9,12 +9,12 @@ using System.Security.Claims; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index fd2dab86ed..fda8dd0ff3 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -12,6 +12,7 @@ using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/FormFeature.cs b/src/Microsoft.AspNet.Http.Core/FormFeature.cs index a0f1d5db07..33f84e3745 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/FormFeature.cs @@ -4,13 +4,12 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.WebUtilities; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs index 85208daa0d..d9c9a3540e 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs @@ -6,8 +6,8 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Infrastructure { diff --git a/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs deleted file mode 100644 index 2328b5d5d8..0000000000 --- a/src/Microsoft.AspNet.Http.Core/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http.Core -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs index 16923fe544..bda0ab5fc4 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/QueryFeature.cs @@ -6,6 +6,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.WebUtilities; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs index ec692ee014..4b1093a66a 100644 --- a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index 192c5f866f..a04d2b7016 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -7,6 +7,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core { diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 569d667698..61d978811d 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -6,6 +6,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index e97059c66b..358be0ad3a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -4,6 +4,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index fc4438c018..02178a65cd 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs index b97da7c13b..40d4f1c3c7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs b/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs deleted file mode 100644 index d43b93e4e4..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index eeeef90b24..21499b8092 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 4169f237a7..c88430eed8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Extensions; +using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 2dcbdafc8a..029ce3d4be 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Extensions; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 383484ef75..1a418e3bdf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,6 +5,7 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs index e1d3918dbc..9488cd52c4 100644 --- a/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs index 7df6a014c0..81653dd166 100644 --- a/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Globalization; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs index 9696b99da7..5f71a1b792 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs index 5bf26af0b8..5e2d8891b7 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs index 63e65a0a11..117b8cacc1 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs @@ -8,6 +8,7 @@ using Microsoft.AspNet.Builder.Extensions; namespace Microsoft.AspNet.Builder { + using Microsoft.Framework.Internal; using Predicate = Func; using PredicateAsync = Func>; diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs index 51606e609c..b4f5c78b0b 100644 --- a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs @@ -3,6 +3,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs index 4b74158aae..c0cb5af259 100644 --- a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNet.Http; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http/FragmentString.cs index f40ba626a1..32b4ba6f52 100644 --- a/src/Microsoft.AspNet.Http/FragmentString.cs +++ b/src/Microsoft.AspNet.Http/FragmentString.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http/HostString.cs index c91ce65a5b..55fdb988ec 100644 --- a/src/Microsoft.AspNet.Http/HostString.cs +++ b/src/Microsoft.AspNet.Http/HostString.cs @@ -4,6 +4,7 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs index 464513f895..1035c1aaaa 100644 --- a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http/NotNullAttribute.cs b/src/Microsoft.AspNet.Http/NotNullAttribute.cs deleted file mode 100644 index d43b93e4e4..0000000000 --- a/src/Microsoft.AspNet.Http/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http/PathString.cs index 8a7f5d945c..5e6f03ec70 100644 --- a/src/Microsoft.AspNet.Http/PathString.cs +++ b/src/Microsoft.AspNet.Http/PathString.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http/QueryString.cs index 6b61d92f99..48d68b292a 100644 --- a/src/Microsoft.AspNet.Http/QueryString.cs +++ b/src/Microsoft.AspNet.Http/QueryString.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 30d577d013..33d1c1c46a 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Owin/NotNullAttribute.cs b/src/Microsoft.AspNet.Owin/NotNullAttribute.cs deleted file mode 100644 index a42aa58d4a..0000000000 --- a/src/Microsoft.AspNet.Owin/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Owin -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7d30044171..0c7af1986a 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -20,6 +20,7 @@ using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Owin { + using Microsoft.Framework.Internal; using SendFileFunc = Func; public class OwinFeatureCollection : diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 90a7af6c7f..e7274c329b 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -4,7 +4,8 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*" + "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 2e6e39b6d2..2ffc33ad46 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -6,6 +6,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index aecd6e9ee5..26fba82548 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 1682e7c5b2..dd11b0cff2 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -7,6 +7,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index 4c9d629a47..286f2a8a6f 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 766e5361dc..d9966ffd48 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 1bbf55e57c..bb8e07c25e 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -7,6 +7,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs b/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs deleted file mode 100644 index d489cf36b3..0000000000 --- a/src/Microsoft.AspNet.WebUtilities/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.WebUtilities -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index d7584b536a..8266dc4fb5 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.Text; +using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.WebUtilities diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index f73c3c249f..2a559d0ec9 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 19bedc2195..d47cde29be 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index c4c1207380..a7911d164f 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index c8e5f933e2..5796d89fae 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.Framework.Internal; + namespace Microsoft.Net.Http.Headers { internal sealed class GenericHeaderParser : BaseHeaderParser diff --git a/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs b/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs deleted file mode 100644 index a725ce11fe..0000000000 --- a/src/Microsoft.Net.Http.Headers/NotNullAttribute.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Net.Http.Headers -{ - [AttributeUsage(AttributeTargets.Parameter, AllowMultiple = false)] - internal sealed class NotNullAttribute : Attribute - { - } -} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 3556454156..568f204fa7 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; +using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index d7a3def9e1..982a97b131 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index fd40eace65..07da653d6f 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,6 +1,7 @@ { "version": "1.0.0-*", "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks" : { "net45" : { }, From 93deb0b440ad2a1b6ff40cd747d6c3de704e458e Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 13 Mar 2015 16:29:05 -0700 Subject: [PATCH 0493/1838] Remove dependency on DependencyInjection and instead use DependencyInjection.Interfaces on Http.Extensions Fixes: https://github.com/aspnet/HttpAbstractions/issues/228 --- src/Microsoft.AspNet.Http.Extensions/project.json | 3 ++- test/Microsoft.AspNet.Http.Extensions.Tests/project.json | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1a418e3bdf..415597b029 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" @@ -14,6 +14,7 @@ }, "dnxcore50": { "dependencies": { + "System.IO.FileSystem": "4.0.0-beta-*", "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index e3518a3c7d..a5bc898aaa 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -4,6 +4,7 @@ "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.Framework.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From 3b0d5fd422e46691cdeddefc5ebd17053c63b932 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 16 Mar 2015 13:13:50 -0700 Subject: [PATCH 0494/1838] Add extension method for getting environment name Fixes: https://github.com/aspnet/Hosting/issues/100 --- .../HostingEnvironmentExtensions.cs | 27 +++++++++++++++++++ .../project.json | 5 ++-- .../HostingEngineTests.cs | 26 ++++++++++++++++++ 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs new file mode 100644 index 0000000000..b39316a281 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Hosting +{ + public static class HostingEnvironmentExtensions + { + /// + /// Compares the current hosting environment name against the specified value. + /// + /// An instance of service. + /// Environment name to validate against. + /// True if the specified name is same as the current environment. + public static bool IsEnvironment( + [NotNull]this IHostingEnvironment hostingEnvironment, + [NotNull]string environmentName) + { + return string.Equals( + hostingEnvironment.EnvironmentName, + environmentName, + StringComparison.OrdinalIgnoreCase); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index 496ff1441a..e21eb01c51 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -4,10 +4,11 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel": "1.0.0-*" + "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": {}, "dnxcore50": {} } -} +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index d66e77a396..d6e1e64be5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -63,6 +63,32 @@ namespace Microsoft.AspNet.Hosting Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } + [Fact] + public void Validate_Environment_Name() + { + var services = HostingServices.Create().BuildServiceProvider(); + var env = services.GetRequiredService(); + Assert.Equal("Development", env.EnvironmentName); + + var config = new Configuration() + .AddCommandLine(new string[] { "--ASPNET_ENV", "Overridden_Environment" }); + + services = HostingServices.Create(fallbackServices: null, configuration: config) + .BuildServiceProvider(); + + env = services.GetRequiredService(); + Assert.Equal("Overridden_Environment", env.EnvironmentName); + } + + [Fact] + public void IsEnvironment_Extension_Is_Case_Insensitive() + { + var services = HostingServices.Create().BuildServiceProvider(); + var env = services.GetRequiredService(); + Assert.True(env.IsEnvironment("Development")); + Assert.True(env.IsEnvironment("developMent")); + } + public void Initialize(IApplicationBuilder builder) { From 08ddbe853130fe10bdde6f8b529e5a885e0974be Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 16 Mar 2015 14:26:46 -0700 Subject: [PATCH 0495/1838] Auth cleanup - Rename Security folder -> Authentication - Change Authenticate to only take one scheme to match other APIs, the params overload did not make it any cleaner to consume (since it didn't produce a combined ClaimsPrincipal anyways) --- .../Authentication/AuthenticateContext.cs | 28 ++++++++----------- .../DefaultHttpContext.cs | 23 +++++++-------- .../IAuthenticateContext.cs | 4 +-- .../IAuthenticationHandler.cs | 0 .../IChallengeContext.cs | 0 .../IDescribeSchemesContext.cs | 0 .../IHttpAuthenticationFeature.cs | 1 + .../ISignInContext.cs | 0 .../ISignOutContext.cs | 0 src/Microsoft.AspNet.Http/HttpContext.cs | 14 ++-------- 10 files changed, 27 insertions(+), 43 deletions(-) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IAuthenticateContext.cs (71%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IAuthenticationHandler.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IChallengeContext.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IDescribeSchemesContext.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/IHttpAuthenticationFeature.cs (99%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/ISignInContext.cs (100%) rename src/Microsoft.AspNet.Http.Interfaces/{Security => Authentication}/ISignOutContext.cs (100%) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs index 1fa87a6417..ed0dd55eb7 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNet.Http.Authentication; @@ -10,24 +11,19 @@ namespace Microsoft.AspNet.Http.Core.Authentication { public class AuthenticateContext : IAuthenticateContext { - private List _results; - private List _accepted; + private AuthenticationResult _result; + private bool _accepted; - public AuthenticateContext([NotNull] IEnumerable authenticationSchemes) + public AuthenticateContext([NotNull] string authenticationScheme) { - AuthenticationSchemes = authenticationSchemes; - _results = new List(); - _accepted = new List(); + AuthenticationScheme = authenticationScheme; } - public IEnumerable AuthenticationSchemes { get; private set; } + public string AuthenticationScheme { get; private set; } - public IEnumerable Results - { - get { return _results; } - } + public AuthenticationResult Result { get; set; } - public IEnumerable Accepted + public bool Accepted { get { return _accepted; } } @@ -35,13 +31,13 @@ namespace Microsoft.AspNet.Http.Core.Authentication public void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { var descrip = new AuthenticationDescription(description); - _accepted.Add(descrip.AuthenticationScheme); // may not match identity.AuthType - _results.Add(new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip)); + _accepted = true; + Result = new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip); } - public void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description) + public void NotAuthenticated() { - _accepted.Add(authenticationScheme); + _accepted = true; } } } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 90dff4c588..5ff30f1fc5 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -212,44 +212,41 @@ namespace Microsoft.AspNet.Http.Core return describeContext.Results; } - public override IEnumerable Authenticate([NotNull] IEnumerable authenticationSchemes) + public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationSchemes); + var authenticateContext = new AuthenticateContext(authenticationScheme); if (handler != null) { handler.Authenticate(authenticateContext); } - // Verify all types ack'd - IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); - if (leftovers.Any()) + if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } - return authenticateContext.Results; + return authenticateContext.Result; } - public override async Task> AuthenticateAsync([NotNull] IEnumerable authenticationSchemes) + public override async Task AuthenticateAsync([NotNull] string authenticationScheme) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationSchemes); + var authenticateContext = new AuthenticateContext(authenticationScheme); if (handler != null) { await handler.AuthenticateAsync(authenticateContext); } // Verify all types ack'd - IEnumerable leftovers = authenticationSchemes.Except(authenticateContext.Accepted); - if (leftovers.Any()) + if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication schemes were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); } - return authenticateContext.Results; + return authenticateContext.Result; } public override Task AcceptWebSocketAsync(string subProtocol) diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs similarity index 71% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs index 71c2b97a30..ecf8b56788 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs @@ -8,10 +8,10 @@ namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticateContext { - IEnumerable AuthenticationSchemes { get; } + string AuthenticationScheme { get; } void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description); - void NotAuthenticated(string authenticationScheme, IDictionary properties, IDictionary description); + void NotAuthenticated(); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IAuthenticationHandler.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IChallengeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IDescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs index 053f5d8e12..fb14959790 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Security/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs @@ -8,6 +8,7 @@ namespace Microsoft.AspNet.Http.Authentication public interface IHttpAuthenticationFeature { ClaimsPrincipal User { get; set; } + IAuthenticationHandler Handler { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/ISignInContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Security/ISignOutContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index c76019744e..c69f882f91 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -54,19 +54,9 @@ namespace Microsoft.AspNet.Http public abstract IEnumerable GetAuthenticationSchemes(); - public virtual AuthenticationResult Authenticate(string authenticationScheme) - { - return Authenticate(new[] { authenticationScheme }).SingleOrDefault(); - } + public abstract AuthenticationResult Authenticate(string authenticationScheme); - public abstract IEnumerable Authenticate(IEnumerable authenticationSchemes); - - public virtual async Task AuthenticateAsync(string authenticationScheme) - { - return (await AuthenticateAsync(new[] { authenticationScheme })).SingleOrDefault(); - } - - public abstract Task> AuthenticateAsync(IEnumerable authenticationSchemes); + public abstract Task AuthenticateAsync(string authenticationScheme); public virtual Task AcceptWebSocketAsync() { From f63702754fc0c7ce827b2e2be6519b4ec3ef6497 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 19 Feb 2015 14:39:21 -0800 Subject: [PATCH 0496/1838] [Fixes #160] Added OnResponseCompleted to HttpResponse --- src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs | 5 +++++ src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs | 5 +++++ src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs | 1 + src/Microsoft.AspNet.Http/HttpResponse.cs | 2 ++ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 5 +++++ 5 files changed, 18 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index fda8dd0ff3..6e23c35b15 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -111,6 +111,11 @@ namespace Microsoft.AspNet.Http.Core HttpResponseFeature.OnSendingHeaders(callback, state); } + public override void OnResponseCompleted(Action callback, object state) + { + HttpResponseFeature.OnResponseCompleted(callback, state); + } + public override void Redirect(string location, bool permanent) { if (permanent) diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs index 58d48c49bc..509677f4a7 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs @@ -34,5 +34,10 @@ namespace Microsoft.AspNet.Http.Core { throw new NotSupportedException(); } + + public void OnResponseCompleted(Action callback, object state) + { + throw new NotSupportedException(); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs index cd5ffc4ec6..921e70700e 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs @@ -15,5 +15,6 @@ namespace Microsoft.AspNet.Http Stream Body { get; set; } bool HeadersSent { get; } void OnSendingHeaders(Action callback, object state); + void OnResponseCompleted(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 85dec115e7..5fd8e099e0 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -27,6 +27,8 @@ namespace Microsoft.AspNet.Http public abstract void OnSendingHeaders(Action callback, object state); + public abstract void OnResponseCompleted(Action callback, object state); + public virtual void Redirect(string location) { Redirect(location, permanent: false); diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 0c7af1986a..50d58adb9c 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -157,6 +157,11 @@ namespace Microsoft.AspNet.Owin register(callback, state); } + void IHttpResponseFeature.OnResponseCompleted(Action callback, object state) + { + throw new NotSupportedException(); + } + IPAddress IHttpConnectionFeature.RemoteIpAddress { get { return IPAddress.Parse(Prop(OwinConstants.CommonKeys.RemoteIpAddress)); } From de44c3be996514ba13c8ea92f1f7c159b6b57c58 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Thu, 19 Feb 2015 14:33:26 -0800 Subject: [PATCH 0497/1838] React to aspnet/HttpAbstractions#160 - Implementing OnResponseCompleted in TestHost --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 1 + src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index a1e281a7ca..8d8855d81e 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -174,6 +174,7 @@ namespace Microsoft.AspNet.TestHost if (!_responseTcs.Task.IsCompleted) { var response = GenerateResponse(); + _responseFeature.FireOnResponseCompleted(); // Dispatch, as TrySetResult will synchronously execute the waiters callback and block our Write. Task.Factory.StartNew(() => _responseTcs.TrySetResult(response)); } diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index de9765b383..b8bf81dcba 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -11,6 +11,7 @@ namespace Microsoft.AspNet.TestHost internal class ResponseFeature : IHttpResponseFeature { private Action _sendingHeaders = () => { }; + private Action _responseCompleted = () => { }; public ResponseFeature() { @@ -42,10 +43,25 @@ namespace Microsoft.AspNet.TestHost }; } + public void OnResponseCompleted(Action callback, object state) + { + var prior = _responseCompleted; + _responseCompleted = () => + { + callback(state); + prior(); + }; + } + public void FireOnSendingHeaders() { _sendingHeaders(); HeadersSent = true; } + + public void FireOnResponseCompleted() + { + _responseCompleted(); + } } } From 1e9d57f80ca883881804292448fff4de8b112733 Mon Sep 17 00:00:00 2001 From: Levi B Date: Tue, 17 Mar 2015 16:50:02 -0700 Subject: [PATCH 0498/1838] UrlEncoder should always encode the U+003A COLON character Provides extra defense-in-depth in case an application is using this API to encode a relative URL, otherwise the part before the colon could inadvertently be treated as a scheme. --- .../UrlEncoder.cs | 26 +++++++++++++++---- .../UrlEncoderTests.cs | 3 +-- 2 files changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index c29fa70ba8..d347345303 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -131,12 +131,24 @@ namespace Microsoft.Framework.WebEncoders : base(filter, MaxOutputCharsPerInputChar) { // Per RFC 3987, Sec. 2.2, we want encodings that are safe for - // 'isegment', 'iquery', and 'ifragment'. The only thing these - // all have in common is 'ipchar', which is defined as such: + // four particular components: 'isegment', 'ipath-noscheme', + // 'iquery', and 'ifragment'. The relevant definitions are below. + // + // ipath-noscheme = isegment-nz-nc *( "/" isegment ) + // + // isegment = *ipchar + // + // isegment-nz-nc = 1*( iunreserved / pct-encoded / sub-delims + // / "@" ) + // ; non-zero-length segment without any colon ":" // // ipchar = iunreserved / pct-encoded / sub-delims / ":" // / "@" // + // iquery = *( ipchar / iprivate / "/" / "?" ) + // + // ifragment = *( ipchar / "/" / "?" ) + // // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar // // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF @@ -151,15 +163,19 @@ namespace Microsoft.Framework.WebEncoders // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" // / "*" / "+" / "," / ";" / "=" // - // From this list, the base encoder forbids "&", "'", "+", + // The only common characters between these four components are the + // intersection of 'isegment-nz-nc' and 'ipchar', which is really + // just 'isegment-nz-nc' (colons forbidden). + // + // From this list, the base encoder already forbids "&", "'", "+", // and we'll additionally forbid "=" since it has special meaning // in x-www-form-urlencoded representations. // // This means that the full list of allowed characters from the // Basic Latin set is: - // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / ":" / "@" + // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / "@" - const string forbiddenChars = @" #%/=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder + const string forbiddenChars = @" #%/:=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder foreach (char c in forbiddenChars) { ForbidCharacter(c); diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs index 2141bba7d7..0d37e4f934 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -123,8 +123,7 @@ namespace Microsoft.Framework.WebEncoders case '_': case '~': - // ipchar - case ':': + // isegment-nz-nc case '@': // sub-delims From 19b75b688ad8df06772041b3f8cef88388935699 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 19 Mar 2015 10:57:34 -0700 Subject: [PATCH 0499/1838] Rework hosting - IStartupFilter support - Rework HostingEngine - AutoRequestScope by default via (IStartupFilter) - RIP RequestContainer --- Hosting.sln | 15 +- .../IHostingEnvironment.cs | 2 +- .../ConfigureHostingEnvironment.cs | 23 -- .../HostingContext.cs | 11 +- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 207 +++++++++++++---- .../HostingEnvironment.cs | 10 +- .../HostingServices.cs | 89 -------- .../HostingServicesCollectionExtensions.cs | 42 ---- .../IHostingEngine.cs | 12 - .../AutoRequestServicesStartupFilter.cs | 21 ++ .../Internal/PipelineInstance.cs | 37 --- .../Internal}/RequestServicesContainer.cs | 2 +- .../RequestServicesContainerMiddleware.cs} | 11 +- src/Microsoft.AspNet.Hosting/Program.cs | 24 +- .../Startup/ApplicationStartup.cs | 125 +++++++++++ .../Startup/ConfigureDelegate.cs | 60 +++++ .../Startup/ConfigureServicesDelegate.cs | 43 ++++ .../{IStartupLoader.cs => IStartupFilter.cs} | 9 +- .../Startup/StartupLoader.cs | 174 --------------- .../Startup/StartupMethods.cs | 22 ++ src/Microsoft.AspNet.Hosting/project.json | 1 + .../ContainerExtensions.cs | 55 ----- .../Microsoft.AspNet.RequestContainer.xproj | 17 -- .../project.json | 17 -- src/Microsoft.AspNet.TestHost/TestServer.cs | 59 +++-- .../Fakes/StartupUseServices.cs | 30 --- .../Fakes/StartupWithNullConfigureServices.cs | 16 ++ .../HostingEngineTests.cs | 122 ++++++---- .../HostingServicesFacts.cs | 210 ------------------ .../StartupManagerTests.cs | 96 ++------ .../UseRequestServicesFacts.cs | 98 -------- .../project.json | 2 +- .../ClientHandlerTests.cs | 1 - .../TestApplicationEnvironment.cs | 37 --- .../TestClientTests.cs | 14 +- .../TestServerTests.cs | 22 +- 36 files changed, 654 insertions(+), 1082 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs delete mode 100644 src/Microsoft.AspNet.Hosting/HostingServices.cs delete mode 100644 src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs delete mode 100644 src/Microsoft.AspNet.Hosting/IHostingEngine.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs rename src/{Microsoft.AspNet.RequestContainer => Microsoft.AspNet.Hosting/Internal}/RequestServicesContainer.cs (98%) rename src/{Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs => Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs} (67%) create mode 100644 src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs rename src/Microsoft.AspNet.Hosting/Startup/{IStartupLoader.cs => IStartupFilter.cs} (54%) delete mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs delete mode 100644 src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs delete mode 100644 src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.xproj delete mode 100644 src/Microsoft.AspNet.RequestContainer/project.json delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs delete mode 100644 test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs diff --git a/Hosting.sln b/Hosting.sln index b698bea6b8..1110900290 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22530.0 +VisualStudioVersion = 14.0.22710.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -15,8 +15,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting", EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Tests", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.xproj", "{D4F18D58-52B1-435D-A012-10F2CDF158C4}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.RequestContainer", "src\Microsoft.AspNet.RequestContainer\Microsoft.AspNet.RequestContainer.xproj", "{374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A66E3673-3976-4152-B902-2D0EC1428EA2}" ProjectSection(SolutionItems) = preProject global.json = global.json @@ -74,16 +72,6 @@ Global {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D4F18D58-52B1-435D-A012-10F2CDF158C4}.Release|x86.ActiveCfg = Release|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Any CPU.Build.0 = Debug|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Debug|x86.ActiveCfg = Debug|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Any CPU.ActiveCfg = Release|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Any CPU.Build.0 = Release|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814}.Release|x86.ActiveCfg = Release|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Any CPU.Build.0 = Debug|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -105,7 +93,6 @@ Global {1A415A3F-1081-45DB-809B-EE19CEA02DC0} = {E0497F39-AFFB-4819-A116-E39E361915AB} {3944F036-7E75-47E8-AA52-C4B89A64EC3A} = {E0497F39-AFFB-4819-A116-E39E361915AB} {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} - {374A5B0C-3E93-4A23-A4A0-EE2AB6DF7814} = {E0497F39-AFFB-4819-A116-E39E361915AB} {BB780FBB-7842-4759-8DE7-96FA2E5571C1} = {E0497F39-AFFB-4819-A116-E39E361915AB} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs index c38028a604..393c963e20 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Hosting { public interface IHostingEnvironment { - string EnvironmentName { get; set; } + string EnvironmentName { get; set; } string WebRootPath { get; } diff --git a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs deleted file mode 100644 index 892eaab372..0000000000 --- a/src/Microsoft.AspNet.Hosting/ConfigureHostingEnvironment.cs +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Microsoft.Framework.ConfigurationModel; - -namespace Microsoft.AspNet.Hosting -{ - internal class ConfigureHostingEnvironment : IConfigureHostingEnvironment - { - private IConfiguration _config; - private const string EnvironmentKey = "ASPNET_ENV"; - - public ConfigureHostingEnvironment(IConfiguration config) - { - _config = config; - } - - public void Configure(IHostingEnvironment hostingEnv) - { - hostingEnv.EnvironmentName = _config?.Get(EnvironmentKey) ?? hostingEnv.EnvironmentName; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs index f5dd096850..3ff679a6b3 100644 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ b/src/Microsoft.AspNet.Hosting/HostingContext.cs @@ -4,22 +4,29 @@ using System; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting { public class HostingContext { - public IApplicationLifetime ApplicationLifetime { get; set; } public IConfiguration Configuration { get; set; } public IApplicationBuilder Builder { get; set; } public string ApplicationName { get; set; } + public string WebRootPath { get; set; } public string EnvironmentName { get; set; } - public Action ApplicationStartup { get; set; } + public StartupMethods StartupMethods { get; set; } public RequestDelegate ApplicationDelegate { get; set; } + public IServiceCollection Services { get; } = new ServiceCollection(); + + // Result of ConfigureServices + public IServiceProvider ApplicationServices { get; set; } + public string ServerFactoryLocation { get; set; } public IServerFactory ServerFactory { get; set; } public IServerInformation Server { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 1970e48bef..01fae429d5 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -9,51 +9,116 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Runtime; +using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.Hosting { - public class HostingEngine : IHostingEngine + public class HostingEngine { - private readonly IServerLoader _serverManager; - private readonly IStartupLoader _startupLoader; - private readonly IApplicationBuilderFactory _builderFactory; - private readonly IHttpContextFactory _httpContextFactory; - private readonly IHttpContextAccessor _contextAccessor; + private const string EnvironmentKey = "ASPNET_ENV"; - public HostingEngine( - IServerLoader serverManager, - IStartupLoader startupLoader, - IApplicationBuilderFactory builderFactory, - IHttpContextFactory httpContextFactory, - IHttpContextAccessor contextAccessor) + private readonly IServiceProvider _fallbackServices; + private readonly ApplicationLifetime _appLifetime; + private readonly IApplicationEnvironment _applicationEnvironment; + private readonly HostingEnvironment _hostingEnvironment; + + private IServerLoader _serverLoader; + private IApplicationBuilderFactory _builderFactory; + + public HostingEngine() : this(fallbackServices: null) { } + + public HostingEngine(IServiceProvider fallbackServices) { - _serverManager = serverManager; - _startupLoader = startupLoader; - _builderFactory = builderFactory; - _httpContextFactory = httpContextFactory; - _contextAccessor = contextAccessor; + _fallbackServices = fallbackServices ?? CallContextServiceLocator.Locator.ServiceProvider; + _appLifetime = new ApplicationLifetime(); + _applicationEnvironment = _fallbackServices.GetRequiredService(); + _hostingEnvironment = new HostingEnvironment(_applicationEnvironment); + _fallbackServices = new WrappingServiceProvider(_fallbackServices, _hostingEnvironment, _appLifetime); } public IDisposable Start(HostingContext context) { + EnsureContextDefaults(context); + EnsureApplicationServices(context); EnsureBuilder(context); EnsureServerFactory(context); InitalizeServerFactory(context); EnsureApplicationDelegate(context); - var applicationLifetime = (ApplicationLifetime)context.ApplicationLifetime; - var pipeline = new PipelineInstance(_httpContextFactory, context.ApplicationDelegate, _contextAccessor); - var server = context.ServerFactory.Start(context.Server, pipeline.Invoke); + var contextFactory = context.ApplicationServices.GetRequiredService(); + var contextAccessor = context.ApplicationServices.GetRequiredService(); + var server = context.ServerFactory.Start(context.Server, + features => + { + var httpContext = contextFactory.CreateHttpContext(features); + contextAccessor.HttpContext = httpContext; + return context.ApplicationDelegate(httpContext); + }); return new Disposable(() => { - applicationLifetime.NotifyStopping(); + _appLifetime.NotifyStopping(); server.Dispose(); - pipeline.Dispose(); - applicationLifetime.NotifyStopped(); + _appLifetime.NotifyStopped(); }); } + private void EnsureContextDefaults(HostingContext context) + { + if (context.ApplicationName == null) + { + context.ApplicationName = _applicationEnvironment.ApplicationName; + } + + if (context.EnvironmentName == null) + { + context.EnvironmentName = context.Configuration?.Get(EnvironmentKey) ?? HostingEnvironment.DefaultEnvironmentName; + } + + _hostingEnvironment.EnvironmentName = context.EnvironmentName; + + if (context.WebRootPath != null) + { + _hostingEnvironment.WebRootPath = context.WebRootPath; + } + } + + private void EnsureApplicationServices(HostingContext context) + { + if (context.ApplicationServices != null) + { + return; + } + + EnsureStartupMethods(context); + + context.ApplicationServices = context.StartupMethods.ConfigureServicesDelegate(CreateHostingServices(context)); + } + + private void EnsureStartupMethods(HostingContext context) + { + if (context.StartupMethods != null) + { + return; + } + + var diagnosticMessages = new List(); + context.StartupMethods = ApplicationStartup.LoadStartupMethods( + _fallbackServices, + context.ApplicationName, + context.EnvironmentName, + diagnosticMessages); + + if (context.StartupMethods == null) + { + throw new ArgumentException( + diagnosticMessages.Aggregate("Failed to find an entry point for the web application.", (a, b) => a + "\r\n" + b), + nameof(context)); + } + } + private void EnsureBuilder(HostingContext context) { if (context.Builder != null) @@ -61,7 +126,13 @@ namespace Microsoft.AspNet.Hosting return; } + if (_builderFactory == null) + { + _builderFactory = context.ApplicationServices.GetRequiredService(); + } + context.Builder = _builderFactory.CreateBuilder(); + context.Builder.ApplicationServices = context.ApplicationServices; } private void EnsureServerFactory(HostingContext context) @@ -71,7 +142,12 @@ namespace Microsoft.AspNet.Hosting return; } - context.ServerFactory = _serverManager.LoadServerFactory(context.ServerFactoryLocation); + if (_serverLoader == null) + { + _serverLoader = context.ApplicationServices.GetRequiredService(); + } + + context.ServerFactory = _serverLoader.LoadServerFactory(context.ServerFactoryLocation); } private void InitalizeServerFactory(HostingContext context) @@ -87,6 +163,32 @@ namespace Microsoft.AspNet.Hosting } } + private IServiceCollection CreateHostingServices(HostingContext context) + { + var services = Import(_fallbackServices); + + services.TryAdd(ServiceDescriptor.Transient()); + + services.TryAdd(ServiceDescriptor.Transient()); + services.TryAdd(ServiceDescriptor.Transient()); + + // TODO: Do we expect this to be provide by the runtime eventually? + services.AddLogging(); + services.TryAdd(ServiceDescriptor.Singleton()); + + // Apply user services + services.Add(context.Services); + + // Jamming in app lifetime and hosting env since these must not be replaceable + services.AddInstance(_appLifetime); + services.AddInstance(_hostingEnvironment); + + // Conjure up a RequestServices + services.AddTransient(); + + return services; + } + private void EnsureApplicationDelegate(HostingContext context) { if (context.ApplicationDelegate != null) @@ -94,30 +196,59 @@ namespace Microsoft.AspNet.Hosting return; } - EnsureApplicationStartup(context); + // REVIEW: should we call EnsureApplicationServices? + var startupFilters = context.ApplicationServices.GetService>(); + var configure = context.StartupMethods.ConfigureDelegate; + foreach (var filter in startupFilters) + { + configure = filter.Configure(context.Builder, configure); + } + + configure(context.Builder); - context.ApplicationStartup.Invoke(context.Builder); context.ApplicationDelegate = context.Builder.Build(); } - private void EnsureApplicationStartup(HostingContext context) + private static IServiceCollection Import(IServiceProvider fallbackProvider) { - if (context.ApplicationStartup != null) + var services = new ServiceCollection(); + var manifest = fallbackProvider.GetRequiredService(); + foreach (var service in manifest.Services) { - return; + services.AddTransient(service, sp => fallbackProvider.GetService(service)); } - var diagnosticMessages = new List(); - context.ApplicationStartup = _startupLoader.LoadStartup( - context.ApplicationName, - context.EnvironmentName, - diagnosticMessages); + return services; + } - if (context.ApplicationStartup == null) + private class WrappingServiceProvider : IServiceProvider + { + private readonly IServiceProvider _sp; + private readonly IHostingEnvironment _hostingEnvironment; + private readonly IApplicationLifetime _applicationLifetime; + + public WrappingServiceProvider(IServiceProvider sp, + IHostingEnvironment hostingEnvironment, + IApplicationLifetime applicationLifetime) { - throw new ArgumentException( - diagnosticMessages.Aggregate("Failed to find an entry point for the web application.", (a, b) => a + "\r\n" + b), - nameof(context)); + _sp = sp; + _hostingEnvironment = hostingEnvironment; + _applicationLifetime = applicationLifetime; + } + + public object GetService(Type serviceType) + { + if (serviceType == typeof(IHostingEnvironment)) + { + return _hostingEnvironment; + } + + if (serviceType == typeof(IApplicationLifetime)) + { + return _applicationLifetime; + } + + return _sp.GetService(serviceType); } } diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 03a7317453..b7a0249319 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -10,22 +10,18 @@ namespace Microsoft.AspNet.Hosting { public class HostingEnvironment : IHostingEnvironment { - private const string DefaultEnvironmentName = "Development"; + internal const string DefaultEnvironmentName = "Development"; - public HostingEnvironment(IApplicationEnvironment appEnvironment, IEnumerable configures) + public HostingEnvironment(IApplicationEnvironment appEnvironment) { EnvironmentName = DefaultEnvironmentName; WebRootPath = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); WebRootFileProvider = new PhysicalFileProvider(WebRootPath); - foreach (var configure in configures) - { - configure.Configure(this); - } } public string EnvironmentName { get; set; } - public string WebRootPath { get; private set; } + public string WebRootPath { get; set; } public IFileProvider WebRootFileProvider { get; private set; } } diff --git a/src/Microsoft.AspNet.Hosting/HostingServices.cs b/src/Microsoft.AspNet.Hosting/HostingServices.cs deleted file mode 100644 index 6a321a0098..0000000000 --- a/src/Microsoft.AspNet.Hosting/HostingServices.cs +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; -using Microsoft.Framework.Runtime; -using Microsoft.Framework.Runtime.Infrastructure; - -namespace Microsoft.AspNet.Hosting -{ - public static class HostingServices - { - private static IServiceCollection Import(IServiceProvider fallbackProvider, Action configureHostServices) - { - var services = new ServiceCollection(); - var manifest = fallbackProvider.GetRequiredService(); - foreach (var service in manifest.Services) - { - services.AddTransient(service, sp => fallbackProvider.GetService(service)); - } - - if (configureHostServices != null) - { - configureHostServices(services); - } - - services.AddSingleton(sp => new HostingManifest(services)); - - return services; - } - - public static IServiceCollection Create() - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: null); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices) - { - return Create(fallbackServices, configureHostServices: null, configuration: null); - } - - public static IServiceCollection Create(Action configureHostServices) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration: null); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices) - { - return Create(fallbackServices, configureHostServices, configuration: null); - } - - public static IServiceCollection Create(Action configureHostServices, IConfiguration configuration) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices, configuration); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, IConfiguration configuration) - { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureHostServices: null, configuration: configuration); - } - - public static IServiceCollection Create(IServiceProvider fallbackServices, Action configureHostServices, IConfiguration configuration) - { - var services = Import(fallbackServices, configureHostServices); - services.AddHosting(configuration); - return services; - } - - // Manifest exposes the fallback manifest in addition to ITypeActivator, IHostingEnvironment, and ILoggerFactory - private class HostingManifest : IServiceManifest - { - public HostingManifest(IServiceCollection hostServices) - { - Services = new Type[] { - typeof(IHostingEnvironment), - typeof(ILoggerFactory), - typeof(IHttpContextAccessor), - typeof(IApplicationLifetime) - }.Concat(hostServices.Select(s => s.ServiceType)).Distinct(); - } - - public IEnumerable Services { get; private set; } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs deleted file mode 100644 index ba3336d541..0000000000 --- a/src/Microsoft.AspNet.Hosting/HostingServicesCollectionExtensions.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.ConfigurationModel; - -namespace Microsoft.Framework.DependencyInjection -{ - public static class HostingServicesExtensions - { - public static IServiceCollection AddHosting(this IServiceCollection services) - { - return services.AddHosting(configuration: null); - } - - public static IServiceCollection AddHosting(this IServiceCollection services, IConfiguration configuration) - { - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - - services.TryAdd(ServiceDescriptor.Transient()); - - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - - services.TryAdd(ServiceDescriptor.Instance(new ApplicationLifetime())); - - // TODO: Do we expect this to be provide by the runtime eventually? - services.AddLogging(); - services.TryAdd(ServiceDescriptor.Singleton()); - services.TryAdd(ServiceDescriptor.Singleton()); - - // REVIEW: don't try add because we pull out IEnumerable? - services.AddInstance(new ConfigureHostingEnvironment(configuration)); - - return services; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs deleted file mode 100644 index ba6c74ecd1..0000000000 --- a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Hosting -{ - public interface IHostingEngine - { - IDisposable Start(HostingContext context); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs b/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs new file mode 100644 index 0000000000..0d28da169c --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Startup; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class AutoRequestServicesStartupFilter : IStartupFilter + { + public Action Configure(IApplicationBuilder app, Action next) + { + return builder => + { + app.UseMiddleware(); + next(builder); + }; + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs b/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs deleted file mode 100644 index b2f67c2eca..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/PipelineInstance.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading.Tasks; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Hosting.Builder; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public class PipelineInstance : IDisposable - { - private readonly IHttpContextFactory _httpContextFactory; - private readonly RequestDelegate _requestDelegate; - private readonly IHttpContextAccessor _contextAccessor; - - public PipelineInstance(IHttpContextFactory httpContextFactory, RequestDelegate requestDelegate, IHttpContextAccessor contextAccessor) - { - _httpContextFactory = httpContextFactory; - _requestDelegate = requestDelegate; - _contextAccessor = contextAccessor; - } - - public Task Invoke(IFeatureCollection featureCollection) - { - var httpContext = _httpContextFactory.CreateHttpContext(featureCollection); - _contextAccessor.HttpContext = httpContext; - return _requestDelegate(httpContext); - } - - public void Dispose() - { - // TODO: application notification of disposal - } - } -} diff --git a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs similarity index 98% rename from src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs rename to src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs index 747aae5012..716c2ed3be 100644 --- a/src/Microsoft.AspNet.RequestContainer/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs @@ -5,7 +5,7 @@ using System; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -namespace Microsoft.AspNet.RequestContainer +namespace Microsoft.AspNet.Hosting.Internal { public class RequestServicesContainer : IDisposable { diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs similarity index 67% rename from src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs rename to src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs index 097acf6d1b..8ffd9f7a06 100644 --- a/src/Microsoft.AspNet.RequestContainer/ContainerMiddleware.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -6,14 +6,14 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.RequestContainer +namespace Microsoft.AspNet.Hosting.Internal { - public class ContainerMiddleware + public class RequestServicesContainerMiddleware { private readonly RequestDelegate _next; private readonly IServiceProvider _services; - public ContainerMiddleware(RequestDelegate next, IServiceProvider services) + public RequestServicesContainerMiddleware(RequestDelegate next, IServiceProvider services) { _services = services; _next = next; @@ -21,11 +21,6 @@ namespace Microsoft.AspNet.RequestContainer public async Task Invoke(HttpContext httpContext) { - if (httpContext.RequestServices != null) - { - throw new Exception("TODO: nested request container scope? this is probably a mistake on your part?"); - } - using (var container = RequestServicesContainer.EnsureRequestServices(httpContext, _services)) { await _next.Invoke(httpContext); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 65658f606b..47211a65ed 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -33,29 +33,19 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var services = HostingServices.Create(_serviceProvider, config) - .BuildServiceProvider(); - - var appEnv = services.GetRequiredService(); - var hostingEnv = services.GetRequiredService(); - var applicationLifetime = services.GetRequiredService(); - var context = new HostingContext() { - ApplicationLifetime = applicationLifetime, Configuration = config, - ServerFactoryLocation = config.Get("server"), // TODO: Key names - ApplicationName = config.Get("app") // TODO: Key names - ?? appEnv.ApplicationName, - EnvironmentName = hostingEnv.EnvironmentName, + ServerFactoryLocation = config.Get("server"), + ApplicationName = config.Get("app") }; - var engine = services.GetRequiredService(); - var loggerFactory = services.GetRequiredService(); - var appShutdownService = _serviceProvider.GetRequiredService(); - var shutdownHandle = new ManualResetEvent(false); - + var engine = new HostingEngine(_serviceProvider); + var serverShutdown = engine.Start(context); + var loggerFactory = context.ApplicationServices.GetRequiredService(); + var appShutdownService = context.ApplicationServices.GetRequiredService(); + var shutdownHandle = new ManualResetEvent(false); appShutdownService.ShutdownRequested.Register(() => { diff --git a/src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs b/src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs new file mode 100644 index 0000000000..811afb5590 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs @@ -0,0 +1,125 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using System.Linq; +using System.Reflection; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public static class ApplicationStartup + { + internal static ConfigureServicesDelegate DefaultBuildServiceProvider = s => s.BuildServiceProvider(); + + public static StartupMethods LoadStartupMethods( + IServiceProvider services, + string applicationName, + string environmentName, + IList diagnosticMessages) + { + if (string.IsNullOrEmpty(applicationName)) + { + throw new ArgumentException("Value cannot be null or empty.", "applicationName"); + } + + var assembly = Assembly.Load(new AssemblyName(applicationName)); + if (assembly == null) + { + throw new InvalidOperationException(String.Format("The assembly '{0}' failed to load.", applicationName)); + } + + var startupNameWithEnv = "Startup" + environmentName; + var startupNameWithoutEnv = "Startup"; + + // Check the most likely places first + var type = + assembly.GetType(startupNameWithEnv) ?? + assembly.GetType(applicationName + "." + startupNameWithEnv) ?? + assembly.GetType(startupNameWithoutEnv) ?? + assembly.GetType(applicationName + "." + startupNameWithoutEnv); + + if (type == null) + { + // Full scan + var definedTypes = assembly.DefinedTypes.ToList(); + + var startupType1 = definedTypes.Where(info => info.Name.Equals(startupNameWithEnv, StringComparison.Ordinal)); + var startupType2 = definedTypes.Where(info => info.Name.Equals(startupNameWithoutEnv, StringComparison.Ordinal)); + + var typeInfo = startupType1.Concat(startupType2).FirstOrDefault(); + if (typeInfo != null) + { + type = typeInfo.AsType(); + } + } + + if (type == null) + { + throw new InvalidOperationException(String.Format("A type named '{0}' or '{1}' could not be found in assembly '{2}'.", + startupNameWithEnv, + startupNameWithoutEnv, + applicationName)); + } + + var configureMethod = FindConfigureDelegate(type, environmentName); + var servicesMethod = FindConfigureServicesDelegate(type, environmentName); + + object instance = null; + if (!configureMethod.MethodInfo.IsStatic || (servicesMethod != null && !servicesMethod.MethodInfo.IsStatic)) + { + instance = ActivatorUtilities.GetServiceOrCreateInstance(services, type); + } + + return new StartupMethods(configureMethod.Build(instance), servicesMethod?.Build(instance)); + } + + + public static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName) + { + var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true); + return new ConfigureBuilder(configureMethod); + } + + public static ConfigureServicesBuilder FindConfigureServicesDelegate(Type startupType, string environmentName) + { + var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) + ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), required: false); + return servicesMethod == null ? null : new ConfigureServicesBuilder(servicesMethod); + } + + private static MethodInfo FindMethod(Type startupType, string methodName, string environmentName, Type returnType = null, bool required = true) + { + var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); + var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); + var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) + ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + if (methodInfo == null) + { + if (required) + { + throw new InvalidOperationException(string.Format("A method named '{0}' or '{1}' in the type '{2}' could not be found.", + methodNameWithEnv, + methodNameWithNoEnv, + startupType.FullName)); + + } + return null; + } + if (returnType != null && methodInfo.ReturnType != returnType) + { + if (required) + { + throw new InvalidOperationException(string.Format("The '{0}' method in the type '{1}' must have a return type of '{2}'.", + methodInfo.Name, + startupType.FullName, + returnType.Name)); + } + return null; + } + return methodInfo; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs new file mode 100644 index 0000000000..415302a961 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs @@ -0,0 +1,60 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Startup +{ + // TODO: replace all Action eventually with this + public delegate void ConfigureDelegate(IApplicationBuilder builder); + + public class ConfigureBuilder + { + public ConfigureBuilder(MethodInfo configure) + { + MethodInfo = configure; + } + + public MethodInfo MethodInfo { get; } + + public Action Build(object instance) + { + return builder => Invoke(instance, builder); + } + + private void Invoke(object instance, IApplicationBuilder builder) + { + var serviceProvider = builder.ApplicationServices; + var parameterInfos = MethodInfo.GetParameters(); + var parameters = new object[parameterInfos.Length]; + for (var index = 0; index != parameterInfos.Length; ++index) + { + var parameterInfo = parameterInfos[index]; + if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) + { + parameters[index] = builder; + } + else + { + try + { + parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); + } + catch (Exception) + { + throw new Exception(string.Format( + "Could not resolve a service of type '{0}' for the parameter '{1}' of method '{2}' on type '{3}'.", + parameterInfo.ParameterType.FullName, + parameterInfo.Name, + MethodInfo.Name, + MethodInfo.DeclaringType.FullName)); + } + } + } + MethodInfo.Invoke(instance, parameters); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs new file mode 100644 index 0000000000..c55eee4c6f --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs @@ -0,0 +1,43 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public delegate IServiceProvider ConfigureServicesDelegate(IServiceCollection services); + + public class ConfigureServicesBuilder + { + public ConfigureServicesBuilder(MethodInfo configureServices) + { + MethodInfo = configureServices; + } + + public MethodInfo MethodInfo { get; } + + public ConfigureServicesDelegate Build(object instance) + { + return services => Invoke(instance, services); + } + + private IServiceProvider Invoke(object instance, IServiceCollection exportServices) + { + var parameterInfos = MethodInfo.GetParameters(); + var parameters = new object[parameterInfos.Length]; + for (var index = 0; index != parameterInfos.Length; ++index) + { + var parameterInfo = parameterInfos[index]; + if (exportServices != null && parameterInfo.ParameterType == typeof(IServiceCollection)) + { + parameters[index] = exportServices; + } + } + + // REVIEW: We null ref if exportServices is null, cuz it should not be null + return MethodInfo.Invoke(instance, parameters) as IServiceProvider ?? exportServices.BuildServiceProvider(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs similarity index 54% rename from src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs rename to src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs index 24667a0c42..943c8aed32 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs @@ -2,16 +2,13 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.AspNet.Builder; namespace Microsoft.AspNet.Hosting.Startup { - public interface IStartupLoader + public interface IStartupFilter { - Action LoadStartup( - string applicationName, - string environmentName, - IList diagnosticMessages); + // TODO: replace with ConfigureDelegate? + Action Configure(IApplicationBuilder app, Action next); } } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs deleted file mode 100644 index bed2a0190d..0000000000 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.Linq; -using System.Reflection; -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; - -namespace Microsoft.AspNet.Hosting.Startup -{ - public class StartupLoader : IStartupLoader - { - private readonly IServiceProvider _services; - - public StartupLoader(IServiceProvider services) - { - _services = services; - } - - private MethodInfo FindMethod(Type startupType, string methodName, string environmentName, Type returnType = null, bool required = true) - { - var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); - var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); - var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) - ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); - if (methodInfo == null) - { - if (required) - { - throw new Exception(string.Format("A method named '{0}' or '{1}' in the type '{2}' could not be found.", - methodNameWithEnv, - methodNameWithNoEnv, - startupType.FullName)); - - } - return null; - } - if (returnType != null && methodInfo.ReturnType != returnType) - { - if (required) - { - throw new Exception(string.Format("The '{0}' method in the type '{1}' must have a return type of '{2}'.", - methodInfo.Name, - startupType.FullName, - returnType.Name)); - } - return null; - } - return methodInfo; - } - - private object Invoke(MethodInfo methodInfo, object instance, IApplicationBuilder builder, IServiceCollection services = null) - { - var serviceProvider = builder.ApplicationServices ?? _services; - var parameterInfos = methodInfo.GetParameters(); - var parameters = new object[parameterInfos.Length]; - for (var index = 0; index != parameterInfos.Length; ++index) - { - var parameterInfo = parameterInfos[index]; - if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) - { - parameters[index] = builder; - } - else if (services != null && parameterInfo.ParameterType == typeof(IServiceCollection)) - { - parameters[index] = services; - } - else - { - try - { - parameters[index] = serviceProvider.GetRequiredService(parameterInfo.ParameterType); - } - catch (Exception) - { - throw new Exception(string.Format( - "Could not resolve a service of type '{0}' for the parameter '{1}' of method '{2}' on type '{3}'.", - parameterInfo.ParameterType.FullName, - parameterInfo.Name, - methodInfo.Name, - methodInfo.DeclaringType.FullName)); - } - } - } - return methodInfo.Invoke(instance, parameters); - } - - public Action LoadStartup( - string applicationName, - string environmentName, - IList diagnosticMessages) - { - if (string.IsNullOrEmpty(applicationName)) - { - throw new ArgumentException("Value cannot be null or empty.", "applicationName"); - } - - var assembly = Assembly.Load(new AssemblyName(applicationName)); - if (assembly == null) - { - throw new Exception(String.Format("The assembly '{0}' failed to load.", applicationName)); - } - - var startupNameWithEnv = "Startup" + environmentName; - var startupNameWithoutEnv = "Startup"; - - // Check the most likely places first - var type = - assembly.GetType(startupNameWithEnv) ?? - assembly.GetType(applicationName + "." + startupNameWithEnv) ?? - assembly.GetType(startupNameWithoutEnv) ?? - assembly.GetType(applicationName + "." + startupNameWithoutEnv); - - if (type == null) - { - // Full scan - var definedTypes = assembly.DefinedTypes.ToList(); - - var startupType1 = definedTypes.Where(info => info.Name.Equals(startupNameWithEnv, StringComparison.Ordinal)); - var startupType2 = definedTypes.Where(info => info.Name.Equals(startupNameWithoutEnv, StringComparison.Ordinal)); - - var typeInfo = startupType1.Concat(startupType2).FirstOrDefault(); - if (typeInfo != null) - { - type = typeInfo.AsType(); - } - } - - if (type == null) - { - throw new Exception(String.Format("A type named '{0}' or '{1}' could not be found in assembly '{2}'.", - startupNameWithEnv, - startupNameWithoutEnv, - applicationName)); - } - - var configureMethod = FindMethod(type, "Configure{0}", environmentName, typeof(void), required: true); - var servicesMethod = FindMethod(type, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) - ?? FindMethod(type, "Configure{0}Services", environmentName, typeof(void), required: false); - - object instance = null; - if (!configureMethod.IsStatic || (servicesMethod != null && !servicesMethod.IsStatic)) - { - instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, type); - } - return builder => - { - if (servicesMethod != null) - { - var services = HostingServices.Create(builder.ApplicationServices); - if (servicesMethod.ReturnType == typeof(IServiceProvider)) - { - // IServiceProvider ConfigureServices(IServiceCollection) - builder.ApplicationServices = (Invoke(servicesMethod, instance, builder, services) as IServiceProvider) - ?? builder.ApplicationServices; - } - else - { - // void ConfigureServices(IServiceCollection) - Invoke(servicesMethod, instance, builder, services); - if (builder != null) - { - builder.ApplicationServices = services.BuildServiceProvider(); - } - } - } - Invoke(configureMethod, instance, builder); - }; - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs new file mode 100644 index 0000000000..4b3a5c9c5c --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs @@ -0,0 +1,22 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public class StartupMethods + { + // TODO: switch to ConfigureDelegate eventually + public StartupMethods(Action configure, ConfigureServicesDelegate configureServices) + { + ConfigureDelegate = configure; + ConfigureServicesDelegate = configureServices ?? ApplicationStartup.DefaultBuildServiceProvider; + } + + public ConfigureServicesDelegate ConfigureServicesDelegate { get; } + public Action ConfigureDelegate { get; } + + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 9d97fb6f7d..4763927417 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,6 +6,7 @@ "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Microsoft.AspNet.FileProviders": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Newtonsoft.Json": "6.0.6" diff --git a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs b/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs deleted file mode 100644 index 919df65864..0000000000 --- a/src/Microsoft.AspNet.RequestContainer/ContainerExtensions.cs +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.RequestContainer; -using Microsoft.AspNet.Hosting; -using Microsoft.Framework.DependencyInjection; - -namespace Microsoft.AspNet.Builder -{ - public static class ContainerExtensions - { - public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder) - { - return builder.UseMiddleware(); - } - - // Review: what do we use these for? - - public static IApplicationBuilder UseRequestServices(this IApplicationBuilder builder, IServiceProvider applicationServices) - { - // REVIEW: should this be doing fallback? - builder.ApplicationServices = applicationServices; - - return builder.UseMiddleware(); - } - - // Note: Manifests are lost after UseServices, services are flattened into ApplicationServices - - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, IServiceCollection applicationServices) - { - return builder.UseServices(services => services.Add(applicationServices)); - } - - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Action configureServices) - { - return builder.UseServices(serviceCollection => - { - configureServices(serviceCollection); - return serviceCollection.BuildServiceProvider(); - }); - } - - public static IApplicationBuilder UseServices(this IApplicationBuilder builder, Func configureServices) - { - // Import services from hosting/DNX as fallback - var serviceCollection = HostingServices.Create(builder.ApplicationServices); - - builder.ApplicationServices = configureServices(serviceCollection); - - return builder.UseMiddleware(); - } - } -} diff --git a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.xproj b/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.xproj deleted file mode 100644 index 9740be9106..0000000000 --- a/src/Microsoft.AspNet.RequestContainer/Microsoft.AspNet.RequestContainer.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 374a5b0c-3e93-4a23-a4a0-ee2ab6df7814 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - diff --git a/src/Microsoft.AspNet.RequestContainer/project.json b/src/Microsoft.AspNet.RequestContainer/project.json deleted file mode 100644 index fdb20e9e8f..0000000000 --- a/src/Microsoft.AspNet.RequestContainer/project.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 enables per-request scoping of services.", - "dependencies": { - "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.AspNet.Hosting": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*" - }, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "System.Threading": "4.0.10-beta-*" - } - }, - } -} diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 2a6517a4a2..0cc7b83a65 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -8,10 +8,10 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime; using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.TestHost @@ -25,46 +25,63 @@ namespace Microsoft.AspNet.TestHost private IDisposable _appInstance; private bool _disposed = false; - public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action appStartup) + // REVIEW: we can configure services via AppStartup or via hostContext.Services + public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action configureApp, ConfigureServicesDelegate configureServices) { - var appEnv = serviceProvider.GetRequiredService(); - var applicationLifetime = serviceProvider.GetRequiredService(); - - HostingContext hostContext = new HostingContext() + var hostContext = new HostingContext() { - ApplicationName = appEnv.ApplicationName, - ApplicationLifetime = applicationLifetime, + ApplicationName = "Test App", Configuration = config, ServerFactory = this, - ApplicationStartup = appStartup + StartupMethods = new StartupMethods(configureApp, configureServices) }; - var engine = serviceProvider.GetRequiredService(); - _appInstance = engine.Start(hostContext); + _appInstance = new HostingEngine(serviceProvider).Start(hostContext); } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); - public static TestServer Create(Action app) + public static TestServer Create(Action configureApp) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices: null); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureApp, configureServices: null); } - public static TestServer Create(Action app, Action configureHostServices) + public static TestServer Create(Action configureApp, Action configureServices) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, app, configureHostServices); + return Create(CallContextServiceLocator.Locator.ServiceProvider, configureApp, + sc => + { + if (configureServices != null) + { + configureServices(sc); + } + return sc.BuildServiceProvider(); + }); } - public static TestServer Create(IServiceProvider serviceProvider, Action app) + public static TestServer Create(IServiceProvider serviceProvider, Action configureApp) { - return Create(serviceProvider, app, configureHostServices: null); + return Create(serviceProvider, configureApp, configureServices: null); } - public static TestServer Create(IServiceProvider serviceProvider, Action app, Action configureHostServices) + public static TestServer Create(IServiceProvider serviceProvider, Action configureApp, Action configureServices) { - var appServices = HostingServices.Create(serviceProvider, configureHostServices).BuildServiceProvider(); + return Create(serviceProvider, configureApp, + sc => + { + if (configureServices != null) + { + configureServices(sc); + } + return sc.BuildServiceProvider(); + }); + } + + public static TestServer Create(IServiceProvider serviceProvider, Action configureApp, ConfigureServicesDelegate configureServices) + { + // REVIEW: do we need an overload that takes Config for Create? var config = new Configuration(); - return new TestServer(config, appServices, app); + return new TestServer(config, serviceProvider, configureApp, configureServices); } public HttpMessageHandler CreateHandler() @@ -124,7 +141,7 @@ namespace Microsoft.AspNet.TestHost { public string Name { - get { return TestServer.ServerName; } + get { return ServerName; } } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs deleted file mode 100644 index bfd85da550..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupUseServices.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; - -namespace Microsoft.AspNet.Hosting.Fakes -{ - public class StartupUseServices - { - public StartupUseServices() - { - } - - public void ConfigureUseServicesServices(IServiceCollection services) - { - services.Configure(o => o.Configured = true); - services.AddTransient(); - } - - public void Configure(IApplicationBuilder builder) - { - builder.UseServices(services => - { - services.AddTransient(); - services.Configure(o => o.Message = "Configured"); - }); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs new file mode 100644 index 0000000000..b14bf11e99 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs @@ -0,0 +1,16 @@ +using System; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupWithNullConfigureServices + { + public IServiceProvider ConfigureServices(IServiceCollection services) + { + return null; + } + + public void Configure(IApplicationBuilder app) { } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index d6e1e64be5..078bc3681e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -18,32 +18,16 @@ namespace Microsoft.AspNet.Hosting { private readonly IList _startInstances = new List(); - [Fact] - public void HostingEngineCanBeResolvedWithDefaultServices() - { - var services = HostingServices.Create().BuildServiceProvider(); - - var engine = services.GetRequiredService(); - - Assert.NotNull(engine); - } - [Fact] public void HostingEngineCanBeStarted() { - var services = HostingServices.Create().BuildServiceProvider(); - - var engine = services.GetRequiredService(); - var applicationLifetime = services.GetRequiredService(); - var context = new HostingContext { - ApplicationLifetime = applicationLifetime, ServerFactory = this, ApplicationName = "Microsoft.AspNet.Hosting.Tests" }; - var engineStart = engine.Start(context); + var engineStart = new HostingEngine().Start(context); Assert.NotNull(engineStart); Assert.Equal(1, _startInstances.Count); @@ -54,39 +38,97 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void ApplicationNameDefaultsToApplicationEnvironmentName() + { + var context = new HostingContext + { + ServerFactory = this + }; + + var engine = new HostingEngine(); + + using (engine.Start(context)) + { + Assert.Equal("Microsoft.AspNet.Hosting.Tests", context.ApplicationName); + } + } + + [Fact] + public void EnvDefaultsToDevelopmentIfNoConfig() + { + var context = new HostingContext + { + ServerFactory = this + }; + + var engine = new HostingEngine(); + + using (engine.Start(context)) + { + Assert.Equal("Development", context.EnvironmentName); + var env = context.ApplicationServices.GetRequiredService(); + Assert.Equal("Development", env.EnvironmentName); + } + } + + [Fact] + public void EnvDefaultsToDevelopmentConfigValueIfSpecified() + { + var vals = new Dictionary + { + { "ASPNET_ENV", "Staging" } + }; + + var config = new Configuration() + .Add(new MemoryConfigurationSource(vals)); + + var context = new HostingContext + { + ServerFactory = this, + Configuration = config + }; + + var engine = new HostingEngine(); + + using (engine.Start(context)) + { + Assert.Equal("Staging", context.EnvironmentName); + var env = context.ApplicationServices.GetRequiredService(); + Assert.Equal("Staging", env.EnvironmentName); + } + } + [Fact] public void WebRootCanBeResolvedFromTheProjectJson() { - var services = HostingServices.Create().BuildServiceProvider(); - var env = services.GetRequiredService(); + var context = new HostingContext + { + ServerFactory = this + }; + + var engineStart = new HostingEngine().Start(context); + var env = context.ApplicationServices.GetRequiredService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } - [Fact] - public void Validate_Environment_Name() - { - var services = HostingServices.Create().BuildServiceProvider(); - var env = services.GetRequiredService(); - Assert.Equal("Development", env.EnvironmentName); - - var config = new Configuration() - .AddCommandLine(new string[] { "--ASPNET_ENV", "Overridden_Environment" }); - - services = HostingServices.Create(fallbackServices: null, configuration: config) - .BuildServiceProvider(); - - env = services.GetRequiredService(); - Assert.Equal("Overridden_Environment", env.EnvironmentName); - } - [Fact] public void IsEnvironment_Extension_Is_Case_Insensitive() { - var services = HostingServices.Create().BuildServiceProvider(); - var env = services.GetRequiredService(); - Assert.True(env.IsEnvironment("Development")); - Assert.True(env.IsEnvironment("developMent")); + var context = new HostingContext + { + ServerFactory = this + }; + + var engine = new HostingEngine(); + + using (engine.Start(context)) + { + var env = context.ApplicationServices.GetRequiredService(); + Assert.True(env.IsEnvironment("Development")); + Assert.True(env.IsEnvironment("developMent")); + } } public void Initialize(IApplicationBuilder builder) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs deleted file mode 100644 index a0fff83ac5..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingServicesFacts.cs +++ /dev/null @@ -1,210 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.Hosting.Fakes; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime; -using Xunit; - -namespace Microsoft.AspNet.Hosting.Tests -{ - public class HostingServicesFacts - { - [Fact] - public void CreateImportsServices() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddSingleton(); - var instance = new FakeService(); - var factoryInstance = new FakeFactoryService(instance); - fallbackServices.AddInstance(instance); - fallbackServices.AddTransient(); - fallbackServices.AddSingleton(serviceProvider => factoryInstance); - fallbackServices.AddTransient(); // Don't register in manifest - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeServiceInstance), - typeof(IFakeService), - typeof(IFakeSingletonService), - typeof(IFactoryService), - typeof(INonexistentService) - })); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider()); - - // Act - var provider = services.BuildServiceProvider(); - var singleton = provider.GetRequiredService(); - var transient = provider.GetRequiredService(); - var factory = provider.GetRequiredService(); - - // Assert - Assert.Same(singleton, provider.GetRequiredService()); - Assert.NotSame(transient, provider.GetRequiredService()); - Assert.Same(instance, provider.GetRequiredService()); - Assert.Same(factoryInstance, factory); - Assert.Same(factory.FakeService, instance); - Assert.Null(provider.GetService()); - Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services - } - - [Fact] - public void CreateCanAddAdditionalServices() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - fallbackServices.AddTransient(); // Don't register in manifest - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - - var instance = new FakeService(); - var factoryInstance = new FakeFactoryService(instance); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), - additionalHostServices => - { - additionalHostServices.AddSingleton(); - additionalHostServices.AddInstance(instance); - additionalHostServices.AddSingleton(serviceProvider => factoryInstance); - }); - - // Act - var provider = services.BuildServiceProvider(); - var singleton = provider.GetRequiredService(); - var transient = provider.GetRequiredService(); - var factory = provider.GetRequiredService(); - var manifest = provider.GetRequiredService(); - - // Assert - Assert.Same(singleton, provider.GetRequiredService()); - Assert.NotSame(transient, provider.GetRequiredService()); - Assert.Same(instance, provider.GetRequiredService()); - Assert.Same(factoryInstance, factory); - Assert.Same(factory.FakeService, instance); - Assert.Null(provider.GetService()); - Assert.Null(provider.GetService()); // Make sure we don't leak non manifest services - Assert.Contains(typeof(IFakeSingletonService), manifest.Services); - Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); - Assert.Contains(typeof(IFactoryService), manifest.Services); - } - - [Fact] - public void CreateAdditionalServicesOverridesFallback() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider(), - additionalHostServices => additionalHostServices.AddSingleton()); - - // Act - var provider = services.BuildServiceProvider(); - var singleton = provider.GetRequiredService(); - - // Assert - Assert.Same(singleton, provider.GetRequiredService()); - } - - [Fact] - public void CreateAdditionalServices_IncludesServicesInManifest() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddTransient(); - fallbackServices.AddInstance(new ServiceManifest( - new Type[] { - typeof(IFakeService), - })); - var expectedInstance = new FakeService(); - var services = HostingServices.Create( - fallbackServices.BuildServiceProvider(), - additionalHostServices => additionalHostServices.AddInstance(expectedInstance)); - - // Act - var provider = services.BuildServiceProvider(); - var instance = provider.GetRequiredService(); - var anotherInstance = provider.GetRequiredService(); - var manifest = provider.GetRequiredService(); - - // Assert - Assert.Same(expectedInstance, instance); - Assert.Same(expectedInstance, anotherInstance); - Assert.Contains(typeof(IFakeServiceInstance), manifest.Services); - } - - [Fact] - public void CanHideImportedServices() - { - // Arrange - var fallbackServices = new ServiceCollection(); - var fallbackInstance = new FakeService(); - fallbackServices.AddInstance(fallbackInstance); - fallbackServices.AddInstance(new ServiceManifest(new Type[] { typeof(IFakeService) })); - - var services = HostingServices.Create(fallbackServices.BuildServiceProvider()); - var realInstance = new FakeService(); - services.AddInstance(realInstance); - - // Act - var provider = services.BuildServiceProvider(); - - // Assert - Assert.Equal(realInstance, provider.GetRequiredService()); - } - - [Fact] - public void CreateThrowsWithNoManifest() - { - // Arrange - var fallbackServices = new ServiceCollection(); - fallbackServices.AddSingleton(); - var instance = new FakeService(); - fallbackServices.AddInstance(instance); - fallbackServices.AddTransient(); - - // Act - var exception = Assert.Throws(() => HostingServices.Create(fallbackServices.BuildServiceProvider())); - - - // Assert - Assert.Equal($"No service for type '{typeof(IServiceManifest).FullName}' has been registered.", - exception.Message); - } - - private class ServiceManifest : IServiceManifest - { - public ServiceManifest(IEnumerable services) - { - Services = services; - } - - public IEnumerable Services { get; private set; } - } - - private class FakeFactoryService : IFactoryService - { - public FakeFactoryService(FakeService service) - { - FakeService = service; - } - - public IFakeService FakeService { get; private set; } - - public int Value { get; private set; } - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index cefc9877e7..a7ecf91aaa 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -12,7 +12,6 @@ using Xunit; namespace Microsoft.AspNet.Hosting.Tests { - public class StartupManagerTests : IFakeStartupCallback { private readonly IList _configurationMethodCalledList = new List(); @@ -20,16 +19,16 @@ namespace Microsoft.AspNet.Hosting.Tests [Fact] public void StartupClassMayHaveHostingServicesInjected() { - var serviceCollection = new ServiceCollection().AddHosting(); + var serviceCollection = new ServiceCollection(); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var loader = services.GetRequiredService(); - var diagnosticMessages = new List(); - var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithServices", diagnosticMessages); + var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "WithServices", diagnosticMessages); - startup.Invoke(new ApplicationBuilder(services)); + var app = new ApplicationBuilder(services); + app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); + startup.ConfigureDelegate(app); Assert.Equal(2, _configurationMethodCalledList.Count); } @@ -45,15 +44,14 @@ namespace Microsoft.AspNet.Hosting.Tests [InlineData("BaseClass")] public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { - var services = HostingServices.Create().BuildServiceProvider(); - var loader = services.GetRequiredService(); + var services = new ServiceCollection().BuildServiceProvider(); var diagnosticMesssages = new List(); - var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", environment ?? "", diagnosticMesssages); + var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", environment ?? "", diagnosticMesssages); var app = new ApplicationBuilder(services); - - startup.Invoke(app); + app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); + startup.ConfigureDelegate(app); var options = app.ApplicationServices.GetRequiredService>().Options; Assert.NotNull(options); @@ -61,92 +59,46 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Equal(environment, options.Environment); } - [Theory] - [InlineData("Null")] - [InlineData("FallbackProvider")] - public void StartupClassConfigureServicesThatFallsbackToApplicationServices(string env) - { - var services = HostingServices.Create().BuildServiceProvider(); - var loader = services.GetRequiredService(); - var diagnosticMessages = new List(); - - var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", env, diagnosticMessages); - - var app = new ApplicationBuilder(services); - - startup.Invoke(app); - - Assert.Equal(services, app.ApplicationServices); - } - - // REVIEW: With the manifest change, Since the ConfigureServices are not imported, UseServices will mask what's in ConfigureServices - // This will throw since ConfigureServices consumes manifest and then UseServices will blow up - [Fact(Skip = "Review Failure")] - public void StartupClassWithConfigureServicesAndUseServicesHidesConfigureServices() - { - var services = HostingServices.Create().BuildServiceProvider(); - var loader = services.GetRequiredService(); - var diagnosticMessages = new List(); - - var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "UseServices", diagnosticMessages); - - var app = new ApplicationBuilder(services); - - startup.Invoke(app); - - Assert.NotNull(app.ApplicationServices.GetRequiredService()); - Assert.Null(app.ApplicationServices.GetService()); - - var options = app.ApplicationServices.GetRequiredService>().Options; - Assert.NotNull(options); - Assert.Equal("Configured", options.Message); - Assert.False(options.Configured); // Options never resolved from inner containers - } - [Fact] public void StartupWithNoConfigureThrows() { - var serviceCollection = HostingServices.Create(); + var serviceCollection = new ServiceCollection(); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var loader = services.GetRequiredService(); var diagnosticMessages = new List(); - var ex = Assert.Throws(() => loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); + var ex = Assert.Throws(() => ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); Assert.Equal("A method named 'ConfigureBoom' or 'Configure' in the type 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' could not be found.", ex.Message); } [Fact] - public void StartupWithConfigureServicesNotResolvedThrows() + public void StartupClassCanHandleConfigureServicesThatReturnsNull() { - var serviceCollection = HostingServices.Create(); + var serviceCollection = new ServiceCollection(); var services = serviceCollection.BuildServiceProvider(); - var loader = services.GetRequiredService(); + var diagnosticMessages = new List(); - - var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithConfigureServicesNotResolved", diagnosticMessages); - + var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "WithNullConfigureServices", diagnosticMessages); var app = new ApplicationBuilder(services); - - var ex = Assert.Throws(() => startup.Invoke(app)); - - Assert.Equal("Could not resolve a service of type 'System.Int32' for the parameter 'notAService' of method 'Configure' on type 'Microsoft.AspNet.Hosting.Fakes.StartupWithConfigureServicesNotResolved'.", ex.Message); + app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); + Assert.NotNull(app.ApplicationServices); + startup.ConfigureDelegate(app); + Assert.NotNull(app.ApplicationServices); } [Fact] public void StartupClassWithConfigureServicesShouldMakeServiceAvailableInConfigure() { - var serviceCollection = HostingServices.Create(); + var serviceCollection = new ServiceCollection(); var services = serviceCollection.BuildServiceProvider(); - var loader = services.GetRequiredService(); - - var app = new ApplicationBuilder(services); var diagnosticMessages = new List(); - var startup = loader.LoadStartup("Microsoft.AspNet.Hosting.Tests", "WithConfigureServices", diagnosticMessages); + var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "WithConfigureServices", diagnosticMessages); - startup.Invoke(app); + var app = new ApplicationBuilder(services); + app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); + startup.ConfigureDelegate(app); var foo = app.ApplicationServices.GetRequiredService(); Assert.True(foo.Invoked); diff --git a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs deleted file mode 100644 index 0e235a45db..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/UseRequestServicesFacts.cs +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http.Core; -using Microsoft.AspNet.RequestContainer; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; -using Xunit; - -namespace Microsoft.AspNet.Hosting.Tests -{ - public class RequestServicesContainerFacts - { - [Fact] - public void RequestServicesAvailableOnlyAfterRequestServices() - { - var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); - var builder = new ApplicationBuilder(baseServiceProvider); - - bool foundRequestServicesBefore = false; - builder.Use(next => async c => - { - foundRequestServicesBefore = c.RequestServices != null; - await next.Invoke(c); - }); - builder.UseRequestServices(); - bool foundRequestServicesAfter = false; - builder.Use(next => async c => - { - foundRequestServicesAfter = c.RequestServices != null; - await next.Invoke(c); - }); - - var context = new DefaultHttpContext(); - builder.Build().Invoke(context); - Assert.False(foundRequestServicesBefore); - Assert.True(foundRequestServicesAfter); - } - - [Theory] - [InlineData(true)] - [InlineData(false)] - public void EnsureRequestServicesSetsRequestServices(bool initializeApplicationServices) - { - var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); - var builder = new ApplicationBuilder(baseServiceProvider); - - bool foundRequestServicesBefore = false; - builder.Use(next => async c => - { - foundRequestServicesBefore = c.RequestServices != null; - await next.Invoke(c); - }); - builder.Use(next => async c => - { - using (var container = RequestServicesContainer.EnsureRequestServices(c, baseServiceProvider)) - { - await next.Invoke(c); - } - }); - bool foundRequestServicesAfter = false; - builder.Use(next => async c => - { - foundRequestServicesAfter = c.RequestServices != null; - await next.Invoke(c); - }); - - var context = new DefaultHttpContext(); - if (initializeApplicationServices) - { - context.ApplicationServices = baseServiceProvider; - } - builder.Build().Invoke(context); - Assert.False(foundRequestServicesBefore); - Assert.True(foundRequestServicesAfter); - } - - [Theory] - [InlineData(typeof(IHostingEnvironment))] - [InlineData(typeof(ILoggerFactory))] - [InlineData(typeof(IHttpContextAccessor))] - [InlineData(typeof(IApplicationLifetime))] - public void UseRequestServicesHostingImportedServicesAreDefined(Type service) - { - var baseServiceProvider = HostingServices.Create().BuildServiceProvider(); - var builder = new ApplicationBuilder(baseServiceProvider); - - builder.UseRequestServices(); - - var fromAppServices = builder.ApplicationServices.GetRequiredService(service); - - Assert.NotNull(fromAppServices); - Assert.Equal(baseServiceProvider.GetRequiredService(service), fromAppServices); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index a87f3cffd7..aa3d3b7bb0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", - "Microsoft.AspNet.RequestContainer": "1.0.0-*", + "Microsoft.Framework.OptionsModel": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "frameworks": { diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index c92a8ca35c..74838032eb 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -10,7 +10,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Core; -using Microsoft.AspNet.Http; using Xunit; namespace Microsoft.AspNet.TestHost diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs b/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs deleted file mode 100644 index de715c253c..0000000000 --- a/test/Microsoft.AspNet.TestHost.Tests/TestApplicationEnvironment.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Runtime.Versioning; -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.TestHost -{ - public class TestApplicationEnvironment : IApplicationEnvironment - { - public string ApplicationName - { - get { return "Test App environment"; } - } - - public string Version - { - get { return "1.0.0"; } - } - - public string ApplicationBasePath - { - get { return Environment.CurrentDirectory; } - } - - public string Configuration - { - get { return "Test"; } - } - - public FrameworkName RuntimeFramework - { - get { return new FrameworkName(".NETFramework", new Version(4, 5)); } - } - } -} diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index b392bac6ad..19b54c06f5 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -20,9 +20,7 @@ namespace Microsoft.AspNet.TestHost public TestClientTests() { - _services = HostingServices.Create().BuildServiceProvider(); - - _server = TestServer.Create(_services, app => app.Run(ctx => Task.FromResult(0))); + _server = TestServer.Create(app => app.Run(ctx => Task.FromResult(0))); } [Fact] @@ -32,7 +30,7 @@ namespace Microsoft.AspNet.TestHost var expected = "GET Response"; RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(expected); - var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var server = TestServer.Create(app => app.Run(appDelegate)); var client = server.CreateClient(); // Act @@ -53,7 +51,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var server = TestServer.Create(app => app.Run(appDelegate)); var client = server.CreateClient(); // Act @@ -74,7 +72,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var server = TestServer.Create(app => app.Run(appDelegate)); var client = server.CreateClient(); // Act @@ -90,7 +88,7 @@ namespace Microsoft.AspNet.TestHost // Arrange RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " PUT Response"); - var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var server = TestServer.Create(app => app.Run(appDelegate)); var client = server.CreateClient(); // Act @@ -107,7 +105,7 @@ namespace Microsoft.AspNet.TestHost // Arrange RequestDelegate appDelegate = async ctx => await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " POST Response"); - var server = TestServer.Create(_services, app => app.Run(appDelegate)); + var server = TestServer.Create(app => app.Run(appDelegate)); var client = server.CreateClient(); // Act diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 899d3be45a..f3a3fc0bef 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -21,10 +21,8 @@ namespace Microsoft.AspNet.TestHost public void CreateWithDelegate() { // Arrange - var services = HostingServices.Create().BuildServiceProvider(); - // Act & Assert (Does not throw) - TestServer.Create(services, app => { }); + TestServer.Create(app => { }); } [Fact] @@ -37,6 +35,21 @@ namespace Microsoft.AspNet.TestHost Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); } + [Fact] + public async Task RequestServicesAutoCreated() + { + TestServer server = TestServer.Create(app => + { + app.Run(context => + { + return context.Response.WriteAsync("RequestServices:" + (context.RequestServices != null)); + }); + }); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("RequestServices:True", result); + } + [Fact] public async Task CanAccessLogger() { @@ -92,7 +105,8 @@ namespace Microsoft.AspNet.TestHost var accessor = app.ApplicationServices.GetRequiredService(); return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); }); - }, newHostServices => newHostServices.AddSingleton()); + }, + services => services.AddSingleton().BuildServiceProvider()); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); From f35bfcd271a284edd8921e9528e820bd72f892f7 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Sat, 21 Mar 2015 07:18:40 -0700 Subject: [PATCH 0500/1838] Adding MapPath extension --- .../HostingEnvironmentExtensions.cs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs index b39316a281..0af82fee14 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting @@ -23,5 +24,23 @@ namespace Microsoft.AspNet.Hosting environmentName, StringComparison.OrdinalIgnoreCase); } + + /// + /// Gives the physical path corresponding to the given virtual path. + /// + /// An instance of service. + /// Path relative to the root. + /// Physical path corresponding to virtual path. + public static string MapPath( + [NotNull]this IHostingEnvironment hostingEnvironment, + string virtualPath) + { + if (virtualPath == null) + { + return hostingEnvironment.WebRootPath; + } + + return Path.Combine(hostingEnvironment.WebRootPath, virtualPath); + } } } \ No newline at end of file From 0dbbd2f655b7b7490a799881bd02b77629e70c9e Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 23 Mar 2015 17:19:27 -0700 Subject: [PATCH 0501/1838] Adding some tests for the MapPath extension method And looks like I pushed the MapPath extension change too soon. I had to fix an issue in the path for forward and backward slash. For example if an application tries to do MapPath("/resource") then this code does not work cross plat unless the directory separator characters are fixed appropriately. Fixed it and also added some test coverage. --- .../HostingEnvironmentExtensions.cs | 2 ++ .../HostingEngineTests.cs | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs index 0af82fee14..8de0d9f97a 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs @@ -40,6 +40,8 @@ namespace Microsoft.AspNet.Hosting return hostingEnvironment.WebRootPath; } + // On windows replace / with \. + virtualPath = virtualPath.Replace('/', Path.DirectorySeparatorChar); return Path.Combine(hostingEnvironment.WebRootPath, virtualPath); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 078bc3681e..7bebf1c0e7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -131,6 +131,32 @@ namespace Microsoft.AspNet.Hosting } } + [Theory] + [InlineData(null, "")] + [InlineData("", "")] + [InlineData("/", "/")] + [InlineData(@"\", @"\")] + [InlineData("sub", "sub")] + [InlineData("sub/sub2/sub3", @"sub/sub2/sub3")] + [InlineData(@"sub/sub2\sub3\", @"sub/sub2/sub3/")] + public void MapPath_Facts(string virtualPath, string expectedSuffix) + { + var context = new HostingContext + { + ServerFactory = this + }; + + var engine = new HostingEngine(); + + using (engine.Start(context)) + { + var env = context.ApplicationServices.GetRequiredService(); + var mappedPath = env.MapPath(virtualPath); + expectedSuffix = expectedSuffix.Replace('/', Path.DirectorySeparatorChar); + Assert.Equal(Path.Combine(env.WebRootPath, expectedSuffix), mappedPath); + } + } + public void Initialize(IApplicationBuilder builder) { From 65ef65e2d8f2021fa44acbb72eb3f9d232e44977 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Tue, 24 Mar 2015 13:08:04 -0700 Subject: [PATCH 0502/1838] PR feedback on IsEnvironment extension removing [NotNull] on environmentName parameter. String.Equals is expected to handle this appropriately. --- .../HostingEnvironmentExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs index 8de0d9f97a..9e9b5fd2ce 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting /// True if the specified name is same as the current environment. public static bool IsEnvironment( [NotNull]this IHostingEnvironment hostingEnvironment, - [NotNull]string environmentName) + string environmentName) { return string.Equals( hostingEnvironment.EnvironmentName, From 6f5bf881d5dd50abdd5bd4c9ceaa40bec24f78c7 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 24 Mar 2015 21:31:30 -0700 Subject: [PATCH 0503/1838] Remove k command and use dnx instead --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index ec3263114a..d81164353c 100755 --- a/build.sh +++ b/build.sh @@ -31,7 +31,7 @@ if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi -if ! type k > /dev/null 2>&1; then +if ! type dnx > /dev/null 2>&1; then dnvm upgrade fi From 5afe55dc39282a852b9fd2d52120820b9f440e59 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Tue, 24 Mar 2015 21:31:44 -0700 Subject: [PATCH 0504/1838] Remove k command and use dnx instead --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index ec3263114a..d81164353c 100755 --- a/build.sh +++ b/build.sh @@ -31,7 +31,7 @@ if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi -if ! type k > /dev/null 2>&1; then +if ! type dnx > /dev/null 2>&1; then dnvm upgrade fi From fd86bf74c5c02faa77878e513501d3b7b210c707 Mon Sep 17 00:00:00 2001 From: suhasj Date: Wed, 25 Mar 2015 11:46:42 -0700 Subject: [PATCH 0505/1838] Updating to release NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..1978dc065a 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + - \ No newline at end of file + From b62578d4a151cfdce01cfa2dfe9dc83f85a63f26 Mon Sep 17 00:00:00 2001 From: suhasj Date: Wed, 25 Mar 2015 11:46:49 -0700 Subject: [PATCH 0506/1838] Updating to release NuGet.config --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..1978dc065a 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@  - + - \ No newline at end of file + From 77e2dc263f11655312d4c73bb8e22d7b6254d485 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 30 Mar 2015 18:05:51 -0700 Subject: [PATCH 0507/1838] Hosting rework #2 - Merge HostingContext and HostingEngine - Cleanup usage via builder pattern --- .../IConfigureHostingEnvironment.cs | 12 - .../IHostingEnvironment.cs | 7 +- .../ApplicationLifetime.cs | 4 - .../HostingContext.cs | 34 -- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 300 ++++++++---------- .../HostingEnvironment.cs | 13 +- .../HostingEnvironmentExtensions.cs | 18 ++ .../HostingFactory.cs | 35 ++ .../IHostingEngine.cs | 32 ++ .../IHostingFactory.cs | 12 + .../IHttpContextAccessor.cs | 1 + ...RootHostingServiceCollectionInitializer.cs | 66 ++++ src/Microsoft.AspNet.Hosting/Program.cs | 17 +- .../Startup/IStartupLoader.cs | 16 + ...ApplicationStartup.cs => StartupLoader.cs} | 61 ++-- .../Startup/StartupMethods.cs | 8 +- src/Microsoft.AspNet.Hosting/WebHost.cs | 63 ++++ src/Microsoft.AspNet.TestHost/TestServer.cs | 111 ++++--- .../TestServerBuilder.cs | 126 ++++++++ .../HostingEngineTests.cs | 137 ++++---- .../Microsoft.AspNet.Hosting.Tests.xproj | 3 + .../StartupManagerTests.cs | 77 ++++- .../project.json | 1 + .../Microsoft.AspNet.TestHost.Tests.xproj | 7 +- .../RequestBuilderTests.cs | 4 +- .../TestServerTests.cs | 120 ++++++- 26 files changed, 887 insertions(+), 398 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs delete mode 100644 src/Microsoft.AspNet.Hosting/HostingContext.cs create mode 100644 src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs create mode 100644 src/Microsoft.AspNet.Hosting/HostingFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/IHostingEngine.cs create mode 100644 src/Microsoft.AspNet.Hosting/IHostingFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs create mode 100644 src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs rename src/Microsoft.AspNet.Hosting/Startup/{ApplicationStartup.cs => StartupLoader.cs} (76%) create mode 100644 src/Microsoft.AspNet.Hosting/WebHost.cs create mode 100644 src/Microsoft.AspNet.TestHost/TestServerBuilder.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs deleted file mode 100644 index 6ea92fde03..0000000000 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IConfigureHostingEnvironment.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.Hosting -{ - public interface IConfigureHostingEnvironment - { - void Configure(IHostingEnvironment hostingEnv); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs index 393c963e20..da774985c4 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs @@ -7,10 +7,13 @@ namespace Microsoft.AspNet.Hosting { public interface IHostingEnvironment { + // This must be settable! string EnvironmentName { get; set; } - string WebRootPath { get; } + // This must be settable! + string WebRootPath { get; set; } - IFileProvider WebRootFileProvider { get; } + // This must be settable! + IFileProvider WebRootFileProvider { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs index 3d9fa53b8b..a8bb03860b 100644 --- a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs @@ -14,10 +14,6 @@ namespace Microsoft.AspNet.Hosting private readonly CancellationTokenSource _stoppingSource = new CancellationTokenSource(); private readonly CancellationTokenSource _stoppedSource = new CancellationTokenSource(); - public ApplicationLifetime() - { - } - /// /// Triggered when the application host is performing a graceful shutdown. /// Request may still be in flight. Shutdown will block until this event completes. diff --git a/src/Microsoft.AspNet.Hosting/HostingContext.cs b/src/Microsoft.AspNet.Hosting/HostingContext.cs deleted file mode 100644 index 3ff679a6b3..0000000000 --- a/src/Microsoft.AspNet.Hosting/HostingContext.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.DependencyInjection; - -namespace Microsoft.AspNet.Hosting -{ - public class HostingContext - { - public IConfiguration Configuration { get; set; } - - public IApplicationBuilder Builder { get; set; } - - public string ApplicationName { get; set; } - public string WebRootPath { get; set; } - public string EnvironmentName { get; set; } - public StartupMethods StartupMethods { get; set; } - public RequestDelegate ApplicationDelegate { get; set; } - - public IServiceCollection Services { get; } = new ServiceCollection(); - - // Result of ConfigureServices - public IServiceProvider ApplicationServices { get; set; } - - public string ServerFactoryLocation { get; set; } - public IServerFactory ServerFactory { get; set; } - public IServerInformation Server { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 01fae429d5..69ca5e6883 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -5,251 +5,219 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading; +using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime; -using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.Hosting { - public class HostingEngine + public class HostingEngine : IHostingEngine { - private const string EnvironmentKey = "ASPNET_ENV"; + private readonly IServiceCollection _applicationServiceCollection; + private readonly IStartupLoader _startupLoader; + private readonly ApplicationLifetime _applicationLifetime; + private readonly IHostingEnvironment _hostingEnvironment; + private readonly IConfiguration _config; - private readonly IServiceProvider _fallbackServices; - private readonly ApplicationLifetime _appLifetime; - private readonly IApplicationEnvironment _applicationEnvironment; - private readonly HostingEnvironment _hostingEnvironment; + // Start/ApplicationServices block use methods + private bool _useDisabled; private IServerLoader _serverLoader; private IApplicationBuilderFactory _builderFactory; + private IApplicationBuilder _builder; + private IServiceProvider _applicationServices; - public HostingEngine() : this(fallbackServices: null) { } + // Only one of these should be set + private string _startupAssemblyName; + private StartupMethods _startup; - public HostingEngine(IServiceProvider fallbackServices) + // Only one of these should be set + private string _serverFactoryLocation; + private IServerFactory _serverFactory; + private IServerInformation _serverInstance; + + public HostingEngine(IServiceCollection appServices, IStartupLoader startupLoader, IConfiguration config, IHostingEnvironment hostingEnv, string appName) { - _fallbackServices = fallbackServices ?? CallContextServiceLocator.Locator.ServiceProvider; - _appLifetime = new ApplicationLifetime(); - _applicationEnvironment = _fallbackServices.GetRequiredService(); - _hostingEnvironment = new HostingEnvironment(_applicationEnvironment); - _fallbackServices = new WrappingServiceProvider(_fallbackServices, _hostingEnvironment, _appLifetime); + _config = config ?? new Configuration(); + _applicationServiceCollection = appServices; + _startupLoader = startupLoader; + _startupAssemblyName = appName; + _applicationLifetime = new ApplicationLifetime(); + _hostingEnvironment = hostingEnv; } - public IDisposable Start(HostingContext context) + public virtual IDisposable Start() { - EnsureContextDefaults(context); - EnsureApplicationServices(context); - EnsureBuilder(context); - EnsureServerFactory(context); - InitalizeServerFactory(context); - EnsureApplicationDelegate(context); + EnsureApplicationServices(); + EnsureBuilder(); + EnsureServer(); - var contextFactory = context.ApplicationServices.GetRequiredService(); - var contextAccessor = context.ApplicationServices.GetRequiredService(); - var server = context.ServerFactory.Start(context.Server, + var applicationDelegate = BuildApplicationDelegate(); + + var _contextFactory = _applicationServices.GetRequiredService(); + var _contextAccessor = _applicationServices.GetRequiredService(); + var server = _serverFactory.Start(_serverInstance, features => { - var httpContext = contextFactory.CreateHttpContext(features); - contextAccessor.HttpContext = httpContext; - return context.ApplicationDelegate(httpContext); + var httpContext = _contextFactory.CreateHttpContext(features); + _contextAccessor.HttpContext = httpContext; + return applicationDelegate(httpContext); }); return new Disposable(() => { - _appLifetime.NotifyStopping(); + _applicationLifetime.NotifyStopping(); server.Dispose(); - _appLifetime.NotifyStopped(); + _applicationLifetime.NotifyStopped(); }); } - private void EnsureContextDefaults(HostingContext context) + private void EnsureApplicationServices() { - if (context.ApplicationName == null) - { - context.ApplicationName = _applicationEnvironment.ApplicationName; - } + _useDisabled = true; + EnsureStartup(); - if (context.EnvironmentName == null) - { - context.EnvironmentName = context.Configuration?.Get(EnvironmentKey) ?? HostingEnvironment.DefaultEnvironmentName; - } + _applicationServiceCollection.AddInstance(_applicationLifetime); - _hostingEnvironment.EnvironmentName = context.EnvironmentName; - - if (context.WebRootPath != null) - { - _hostingEnvironment.WebRootPath = context.WebRootPath; - } + _applicationServices = _startup.ConfigureServicesDelegate(_applicationServiceCollection); } - private void EnsureApplicationServices(HostingContext context) + private void EnsureStartup() { - if (context.ApplicationServices != null) - { - return; - } - - EnsureStartupMethods(context); - - context.ApplicationServices = context.StartupMethods.ConfigureServicesDelegate(CreateHostingServices(context)); - } - - private void EnsureStartupMethods(HostingContext context) - { - if (context.StartupMethods != null) + if (_startup != null) { return; } var diagnosticMessages = new List(); - context.StartupMethods = ApplicationStartup.LoadStartupMethods( - _fallbackServices, - context.ApplicationName, - context.EnvironmentName, + _startup = _startupLoader.Load( + _startupAssemblyName, + _hostingEnvironment.EnvironmentName, diagnosticMessages); - if (context.StartupMethods == null) + if (_startup == null) { throw new ArgumentException( - diagnosticMessages.Aggregate("Failed to find an entry point for the web application.", (a, b) => a + "\r\n" + b), - nameof(context)); + diagnosticMessages.Aggregate("Failed to find a startup entry point for the web application.", (a, b) => a + "\r\n" + b), + _startupAssemblyName); } } - private void EnsureBuilder(HostingContext context) + private void EnsureBuilder() { - if (context.Builder != null) - { - return; - } - if (_builderFactory == null) { - _builderFactory = context.ApplicationServices.GetRequiredService(); + _builderFactory = _applicationServices.GetRequiredService(); } - context.Builder = _builderFactory.CreateBuilder(); - context.Builder.ApplicationServices = context.ApplicationServices; + _builder = _builderFactory.CreateBuilder(); + _builder.ApplicationServices = _applicationServices; } - private void EnsureServerFactory(HostingContext context) + private void EnsureServer() { - if (context.ServerFactory != null) + if (_serverFactory == null) { - return; + // Blow up if we don't have a server set at this point + if (_serverFactoryLocation == null) + { + throw new InvalidOperationException("UseStartup() is required for Start()"); + } + + _serverFactory = _applicationServices.GetRequiredService().LoadServerFactory(_serverFactoryLocation); } - if (_serverLoader == null) - { - _serverLoader = context.ApplicationServices.GetRequiredService(); - } - - context.ServerFactory = _serverLoader.LoadServerFactory(context.ServerFactoryLocation); + _serverInstance = _serverFactory.Initialize(_config); + _builder.Server = _serverInstance; } - private void InitalizeServerFactory(HostingContext context) + private RequestDelegate BuildApplicationDelegate() { - if (context.Server == null) - { - context.Server = context.ServerFactory.Initialize(context.Configuration); - } - - if (context.Builder.Server == null) - { - context.Builder.Server = context.Server; - } - } - - private IServiceCollection CreateHostingServices(HostingContext context) - { - var services = Import(_fallbackServices); - - services.TryAdd(ServiceDescriptor.Transient()); - - services.TryAdd(ServiceDescriptor.Transient()); - services.TryAdd(ServiceDescriptor.Transient()); - - // TODO: Do we expect this to be provide by the runtime eventually? - services.AddLogging(); - services.TryAdd(ServiceDescriptor.Singleton()); - - // Apply user services - services.Add(context.Services); - - // Jamming in app lifetime and hosting env since these must not be replaceable - services.AddInstance(_appLifetime); - services.AddInstance(_hostingEnvironment); - - // Conjure up a RequestServices - services.AddTransient(); - - return services; - } - - private void EnsureApplicationDelegate(HostingContext context) - { - if (context.ApplicationDelegate != null) - { - return; - } - - // REVIEW: should we call EnsureApplicationServices? - var startupFilters = context.ApplicationServices.GetService>(); - var configure = context.StartupMethods.ConfigureDelegate; + var startupFilters = _applicationServices.GetService>(); + var configure = _startup.ConfigureDelegate; foreach (var filter in startupFilters) { - configure = filter.Configure(context.Builder, configure); + configure = filter.Configure(_builder, configure); } - configure(context.Builder); + configure(_builder); - context.ApplicationDelegate = context.Builder.Build(); + return _builder.Build(); } - private static IServiceCollection Import(IServiceProvider fallbackProvider) + public IServiceProvider ApplicationServices { - var services = new ServiceCollection(); - var manifest = fallbackProvider.GetRequiredService(); - foreach (var service in manifest.Services) + get { - services.AddTransient(service, sp => fallbackProvider.GetService(service)); + EnsureApplicationServices(); + return _applicationServices; } - - return services; } - private class WrappingServiceProvider : IServiceProvider + private void CheckUseAllowed() { - private readonly IServiceProvider _sp; - private readonly IHostingEnvironment _hostingEnvironment; - private readonly IApplicationLifetime _applicationLifetime; - - public WrappingServiceProvider(IServiceProvider sp, - IHostingEnvironment hostingEnvironment, - IApplicationLifetime applicationLifetime) + if (_useDisabled) { - _sp = sp; - _hostingEnvironment = hostingEnvironment; - _applicationLifetime = applicationLifetime; + throw new InvalidOperationException("HostingEngine has already been started."); } + } - public object GetService(Type serviceType) - { - if (serviceType == typeof(IHostingEnvironment)) - { - return _hostingEnvironment; - } + // Consider cutting + public IHostingEngine UseEnvironment(string environment) + { + CheckUseAllowed(); + _hostingEnvironment.EnvironmentName = environment; + return this; + } - if (serviceType == typeof(IApplicationLifetime)) - { - return _applicationLifetime; - } + public IHostingEngine UseServer(string assemblyName) + { + CheckUseAllowed(); + _serverFactoryLocation = assemblyName; + return this; + } - return _sp.GetService(serviceType); - } + public IHostingEngine UseServer(IServerFactory factory) + { + CheckUseAllowed(); + _serverFactory = factory; + return this; + } + + public IHostingEngine UseStartup(string startupAssemblyName) + { + CheckUseAllowed(); + _startupAssemblyName = startupAssemblyName; + return this; + } + + public IHostingEngine UseStartup(Action configureApp) + { + return UseStartup(configureApp, configureServices: null); + } + + public IHostingEngine UseStartup(Action configureApp, ConfigureServicesDelegate configureServices) + { + CheckUseAllowed(); + _startup = new StartupMethods(configureApp, configureServices); + return this; + } + + public IHostingEngine UseStartup(Action configureApp, Action configureServices) + { + CheckUseAllowed(); + _startup = new StartupMethods(configureApp, + services => { + if (configureServices != null) + { + configureServices(services); + } + return services.BuildServiceProvider(); + }); + return this; } private class Disposable : IDisposable diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index b7a0249319..dac9b27d89 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -1,10 +1,8 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Hosting.Internal; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting { @@ -12,17 +10,10 @@ namespace Microsoft.AspNet.Hosting { internal const string DefaultEnvironmentName = "Development"; - public HostingEnvironment(IApplicationEnvironment appEnvironment) - { - EnvironmentName = DefaultEnvironmentName; - WebRootPath = HostingUtilities.GetWebRoot(appEnvironment.ApplicationBasePath); - WebRootFileProvider = new PhysicalFileProvider(WebRootPath); - } - - public string EnvironmentName { get; set; } + public string EnvironmentName { get; set; } = DefaultEnvironmentName; public string WebRootPath { get; set; } - public IFileProvider WebRootFileProvider { get; private set; } + public IFileProvider WebRootFileProvider { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs new file mode 100644 index 0000000000..cd18889034 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.FileProviders; +using Microsoft.AspNet.Hosting.Internal; + +namespace Microsoft.AspNet.Hosting +{ + public static class HostingEnvironmentExtensions + { + public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, string environmentName) + { + hostingEnvironment.WebRootPath = HostingUtilities.GetWebRoot(applicationBasePath); + hostingEnvironment.WebRootFileProvider = new PhysicalFileProvider(hostingEnvironment.WebRootPath); + hostingEnvironment.EnvironmentName = environmentName ?? hostingEnvironment.EnvironmentName; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingFactory.cs b/src/Microsoft.AspNet.Hosting/HostingFactory.cs new file mode 100644 index 0000000000..1b77dc7e59 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/HostingFactory.cs @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + public class HostingFactory : IHostingFactory + { + public const string EnvironmentKey = "ASPNET_ENV"; + + private readonly RootHostingServiceCollectionInitializer _serviceInitializer; + private readonly IStartupLoader _startupLoader; + private readonly IApplicationEnvironment _applicationEnvironment; + private readonly IHostingEnvironment _hostingEnvironment; + + public HostingFactory(RootHostingServiceCollectionInitializer initializer, IStartupLoader startupLoader, IApplicationEnvironment appEnv, IHostingEnvironment hostingEnv) + { + _serviceInitializer = initializer; + _startupLoader = startupLoader; + _applicationEnvironment = appEnv; + _hostingEnvironment = hostingEnv; + } + + public IHostingEngine Create(IConfiguration config) + { + _hostingEnvironment.Initialize(_applicationEnvironment.ApplicationBasePath, config?[EnvironmentKey]); + + return new HostingEngine(_serviceInitializer.Build(), _startupLoader, config, _hostingEnvironment, _applicationEnvironment.ApplicationName); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs new file mode 100644 index 0000000000..dbd6577b05 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public interface IHostingEngine + { + IDisposable Start(); + + // Accessing this will block Use methods + IServiceProvider ApplicationServices { get; } + + // Use methods blow up after any of the above methods are called + IHostingEngine UseEnvironment(string environment); + + // Mutually exclusive + IHostingEngine UseServer(string assemblyName); + IHostingEngine UseServer(IServerFactory factory); + + // Mutually exclusive + IHostingEngine UseStartup(string startupAssemblyName); + IHostingEngine UseStartup(Action configureApp); + IHostingEngine UseStartup(Action configureApp, ConfigureServicesDelegate configureServices); + IHostingEngine UseStartup(Action configureApp, Action configureServices); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingFactory.cs b/src/Microsoft.AspNet.Hosting/IHostingFactory.cs new file mode 100644 index 0000000000..f44b02c1db --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IHostingFactory.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Framework.ConfigurationModel; + +namespace Microsoft.AspNet.Hosting +{ + public interface IHostingFactory + { + IHostingEngine Create(IConfiguration config); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs index 8b1719880b..f406c8e3b3 100644 --- a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs @@ -5,6 +5,7 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting { + // REVIEW: move to interfaces public interface IHttpContextAccessor { HttpContext HttpContext { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs b/src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs new file mode 100644 index 0000000000..3e9a9babec --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Logging; +using Microsoft.Framework.Runtime; +using Microsoft.Framework.Runtime.Infrastructure; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class RootHostingServiceCollectionInitializer + { + private readonly IServiceProvider _fallbackServices; + private readonly Action _configureServices; + private readonly IHostingEnvironment _hostingEnvironment; + private readonly ILoggerFactory _loggerFactory; + + public RootHostingServiceCollectionInitializer(IServiceProvider fallbackServices, Action configureServices) + { + _fallbackServices = fallbackServices; + _configureServices = configureServices; + _hostingEnvironment = new HostingEnvironment(); + _loggerFactory = new LoggerFactory(); + } + + public IServiceCollection Build() + { + var services = new ServiceCollection(); + + // Import from manifest + var manifest = _fallbackServices.GetRequiredService(); + foreach (var service in manifest.Services) + { + services.AddTransient(service, sp => _fallbackServices.GetService(service)); + } + + services.AddInstance(_hostingEnvironment); + services.AddInstance(this); + services.AddInstance(_loggerFactory); + + services.AddTransient(); + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddSingleton(); + services.AddLogging(); + + // Conjure up a RequestServices + services.AddTransient(); + + if (_configureServices != null) + { + _configureServices(services); + } + + return services; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 47211a65ed..555fc241a8 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -33,18 +33,13 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var context = new HostingContext() - { - Configuration = config, - ServerFactoryLocation = config.Get("server"), - ApplicationName = config.Get("app") - }; - - var engine = new HostingEngine(_serviceProvider); + var engine = WebHost.CreateEngine(_serviceProvider, config) + .UseServer(config.Get("server")) + .UseStartup(config.Get("app")); - var serverShutdown = engine.Start(context); - var loggerFactory = context.ApplicationServices.GetRequiredService(); - var appShutdownService = context.ApplicationServices.GetRequiredService(); + var serverShutdown = engine.Start(); + var loggerFactory = engine.ApplicationServices.GetRequiredService(); + var appShutdownService = engine.ApplicationServices.GetRequiredService(); var shutdownHandle = new ManualResetEvent(false); appShutdownService.ShutdownRequested.Register(() => diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs new file mode 100644 index 0000000000..cab29b61ce --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -0,0 +1,16 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.AspNet.Hosting.Startup +{ + public interface IStartupLoader + { + StartupMethods Load( + string startupAssemblyName, + string environmentName, + IList diagnosticMessages); + } +} diff --git a/src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs similarity index 76% rename from src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs rename to src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 811afb5590..6ebc09f04e 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ApplicationStartup.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -10,25 +10,46 @@ using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { - public static class ApplicationStartup + public class StartupLoader : IStartupLoader { - internal static ConfigureServicesDelegate DefaultBuildServiceProvider = s => s.BuildServiceProvider(); + private readonly IServiceProvider _services; - public static StartupMethods LoadStartupMethods( - IServiceProvider services, - string applicationName, + public StartupLoader(IServiceProvider services) + { + _services = services; + } + + public StartupMethods Load( + Type startupType, string environmentName, IList diagnosticMessages) { - if (string.IsNullOrEmpty(applicationName)) + var configureMethod = FindConfigureDelegate(startupType, environmentName); + var servicesMethod = FindConfigureServicesDelegate(startupType, environmentName); + + object instance = null; + if (!configureMethod.MethodInfo.IsStatic || (servicesMethod != null && !servicesMethod.MethodInfo.IsStatic)) { - throw new ArgumentException("Value cannot be null or empty.", "applicationName"); + instance = ActivatorUtilities.GetServiceOrCreateInstance(_services, startupType); } - var assembly = Assembly.Load(new AssemblyName(applicationName)); + return new StartupMethods(configureMethod.Build(instance), servicesMethod?.Build(instance)); + } + + public StartupMethods Load( + string startupAssemblyName, + string environmentName, + IList diagnosticMessages) + { + if (string.IsNullOrEmpty(startupAssemblyName)) + { + throw new ArgumentException("Value cannot be null or empty.", nameof(startupAssemblyName)); + } + + var assembly = Assembly.Load(new AssemblyName(startupAssemblyName)); if (assembly == null) { - throw new InvalidOperationException(String.Format("The assembly '{0}' failed to load.", applicationName)); + throw new InvalidOperationException(String.Format("The assembly '{0}' failed to load.", startupAssemblyName)); } var startupNameWithEnv = "Startup" + environmentName; @@ -37,9 +58,9 @@ namespace Microsoft.AspNet.Hosting.Startup // Check the most likely places first var type = assembly.GetType(startupNameWithEnv) ?? - assembly.GetType(applicationName + "." + startupNameWithEnv) ?? + assembly.GetType(startupAssemblyName + "." + startupNameWithEnv) ?? assembly.GetType(startupNameWithoutEnv) ?? - assembly.GetType(applicationName + "." + startupNameWithoutEnv); + assembly.GetType(startupAssemblyName + "." + startupNameWithoutEnv); if (type == null) { @@ -61,29 +82,19 @@ namespace Microsoft.AspNet.Hosting.Startup throw new InvalidOperationException(String.Format("A type named '{0}' or '{1}' could not be found in assembly '{2}'.", startupNameWithEnv, startupNameWithoutEnv, - applicationName)); + startupAssemblyName)); } - var configureMethod = FindConfigureDelegate(type, environmentName); - var servicesMethod = FindConfigureServicesDelegate(type, environmentName); - - object instance = null; - if (!configureMethod.MethodInfo.IsStatic || (servicesMethod != null && !servicesMethod.MethodInfo.IsStatic)) - { - instance = ActivatorUtilities.GetServiceOrCreateInstance(services, type); - } - - return new StartupMethods(configureMethod.Build(instance), servicesMethod?.Build(instance)); + return Load(type, environmentName, diagnosticMessages); } - - public static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName) + private static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName) { var configureMethod = FindMethod(startupType, "Configure{0}", environmentName, typeof(void), required: true); return new ConfigureBuilder(configureMethod); } - public static ConfigureServicesBuilder FindConfigureServicesDelegate(Type startupType, string environmentName) + private static ConfigureServicesBuilder FindConfigureServicesDelegate(Type startupType, string environmentName) { var servicesMethod = FindMethod(startupType, "Configure{0}Services", environmentName, typeof(IServiceProvider), required: false) ?? FindMethod(startupType, "Configure{0}Services", environmentName, typeof(void), required: false); diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs index 4b3a5c9c5c..4644b5a55e 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs @@ -3,16 +3,22 @@ using System; using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { public class StartupMethods { + internal static ConfigureServicesDelegate DefaultBuildServiceProvider = s => s.BuildServiceProvider(); + + public StartupMethods(Action configure) + : this(configure, configureServices: null) { } + // TODO: switch to ConfigureDelegate eventually public StartupMethods(Action configure, ConfigureServicesDelegate configureServices) { ConfigureDelegate = configure; - ConfigureServicesDelegate = configureServices ?? ApplicationStartup.DefaultBuildServiceProvider; + ConfigureServicesDelegate = configureServices ?? DefaultBuildServiceProvider; } public ConfigureServicesDelegate ConfigureServicesDelegate { get; } diff --git a/src/Microsoft.AspNet.Hosting/WebHost.cs b/src/Microsoft.AspNet.Hosting/WebHost.cs new file mode 100644 index 0000000000..c1d331e0c4 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebHost.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Runtime.Infrastructure; + +namespace Microsoft.AspNet.Hosting +{ + public static class WebHost + { + public static IHostingEngine CreateEngine() + { + return CreateEngine(new Configuration()); + } + + public static IHostingEngine CreateEngine(Action configureServices) + { + return CreateEngine(new Configuration(), configureServices); + } + + public static IHostingEngine CreateEngine(IConfiguration config) + { + return CreateEngine(config, configureServices: null); + } + + public static IHostingEngine CreateEngine(IConfiguration config, Action configureServices) + { + return CreateEngine(fallbackServices: null, config: config, configureServices: configureServices); + } + + public static IHostingEngine CreateEngine(IServiceProvider fallbackServices, IConfiguration config) + { + return CreateEngine(fallbackServices, config, configureServices: null); + } + + public static IHostingEngine CreateEngine(IServiceProvider fallbackServices, IConfiguration config, Action configureServices) + { + return CreateFactory(fallbackServices, configureServices).Create(config); + } + + public static IHostingFactory CreateFactory() + { + return CreateFactory(fallbackServices: null, configureServices: null); + } + + public static IHostingFactory CreateFactory(Action configureServices) + { + return CreateFactory(fallbackServices: null, configureServices: configureServices); + } + + public static IHostingFactory CreateFactory(IServiceProvider fallbackServices, Action configureServices) + { + fallbackServices = fallbackServices ?? CallContextServiceLocator.Locator.ServiceProvider; + return new RootHostingServiceCollectionInitializer(fallbackServices, configureServices) + .Build() + .BuildServiceProvider() + .GetRequiredService(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 0cc7b83a65..0e3a9927b5 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -12,7 +12,6 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.TestHost { @@ -25,63 +24,95 @@ namespace Microsoft.AspNet.TestHost private IDisposable _appInstance; private bool _disposed = false; - // REVIEW: we can configure services via AppStartup or via hostContext.Services - public TestServer(IConfiguration config, IServiceProvider serviceProvider, Action configureApp, ConfigureServicesDelegate configureServices) + public TestServer(IHostingEngine engine) { - var hostContext = new HostingContext() - { - ApplicationName = "Test App", - Configuration = config, - ServerFactory = this, - StartupMethods = new StartupMethods(configureApp, configureServices) - }; - - _appInstance = new HostingEngine(serviceProvider).Start(hostContext); + _appInstance = engine.UseServer(this).Start(); } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); + public static TestServer Create() + { + return Create(fallbackServices: null, config: null, configureApp: null, configureServices: null); + } + public static TestServer Create(Action configureApp) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureApp, configureServices: null); + return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: null); } public static TestServer Create(Action configureApp, Action configureServices) { - return Create(CallContextServiceLocator.Locator.ServiceProvider, configureApp, - sc => + return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: configureServices); + } + + public static TestServer Create(IServiceProvider fallbackServices, Action configureApp, ConfigureServicesDelegate configureServices) + { + return CreateBuilder(fallbackServices, config: null, configureApp: configureApp, configureServices: configureServices).Build(); + } + + public static TestServer Create(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) + { + return CreateBuilder(fallbackServices, config, configureApp, configureServices).Build(); + } + + public static TestServer Create() where TStartup : class + { + return Create(fallbackServices: null, config: null, configureApp: null, configureServices: null); + } + + public static TestServer Create(Action configureApp) where TStartup : class + { + return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: null); + } + + public static TestServer Create(Action configureApp, Action configureServices) where TStartup : class + { + return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: configureServices); + } + + public static TestServer Create(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) where TStartup : class + { + var builder = CreateBuilder(fallbackServices, config, configureApp, configureServices); + builder.StartupType = typeof(TStartup); + return builder.Build(); + } + + public static TestServerBuilder CreateBuilder() where TStartup : class + { + var builder = CreateBuilder(fallbackServices: null, config: null, configureApp: null, configureServices: null); + builder.StartupType = typeof(TStartup); + return builder; + } + + public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) where TStartup : class + { + var builder = CreateBuilder(fallbackServices, config, configureApp, configureServices); + builder.StartupType = typeof(TStartup); + return builder; + } + + public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) + { + return CreateBuilder(fallbackServices, config, configureApp, + services => { if (configureServices != null) { - configureServices(sc); + configureServices(services); } - return sc.BuildServiceProvider(); + return services.BuildServiceProvider(); }); } - public static TestServer Create(IServiceProvider serviceProvider, Action configureApp) + public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, ConfigureServicesDelegate configureServices) { - return Create(serviceProvider, configureApp, configureServices: null); - } - - public static TestServer Create(IServiceProvider serviceProvider, Action configureApp, Action configureServices) - { - return Create(serviceProvider, configureApp, - sc => - { - if (configureServices != null) - { - configureServices(sc); - } - return sc.BuildServiceProvider(); - }); - } - - public static TestServer Create(IServiceProvider serviceProvider, Action configureApp, ConfigureServicesDelegate configureServices) - { - // REVIEW: do we need an overload that takes Config for Create? - var config = new Configuration(); - return new TestServer(config, serviceProvider, configureApp, configureServices); + return new TestServerBuilder + { + FallbackServices = fallbackServices, + Startup = new StartupMethods(configureApp, configureServices), + Config = config + }; } public HttpMessageHandler CreateHandler() @@ -145,4 +176,4 @@ namespace Microsoft.AspNet.TestHost } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/TestServerBuilder.cs b/src/Microsoft.AspNet.TestHost/TestServerBuilder.cs new file mode 100644 index 0000000000..74425f89f5 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/TestServerBuilder.cs @@ -0,0 +1,126 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Runtime.Versioning; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Runtime; +using Microsoft.Framework.Runtime.Infrastructure; + +namespace Microsoft.AspNet.TestHost +{ + public class TestServerBuilder + { + public IServiceProvider FallbackServices { get; set; } + public string Environment { get; set; } + public string ApplicationName { get; set; } + public string ApplicationBasePath { get; set; } + + public Type StartupType { get; set; } + public string StartupAssemblyName { get; set; } + public IConfiguration Config { get; set; } + + public IServiceCollection AdditionalServices { get; } = new ServiceCollection(); + + public StartupMethods Startup { get; set; } + + public TestServer Build() + { + var fallbackServices = FallbackServices ?? CallContextServiceLocator.Locator.ServiceProvider; + var config = Config ?? new Configuration(); + if (Environment != null) + { + config[HostingFactory.EnvironmentKey] = Environment; + } + if (ApplicationName != null || ApplicationBasePath != null) + { + var appEnv = new TestApplicationEnvironment(fallbackServices.GetRequiredService()); + appEnv.ApplicationBasePath = ApplicationBasePath; + appEnv.ApplicationName = ApplicationName; + AdditionalServices.AddInstance(appEnv); + } + + var engine = WebHost.CreateEngine(fallbackServices, + config, + services => services.Add(AdditionalServices)); + if (StartupType != null) + { + Startup = new StartupLoader(fallbackServices).Load(StartupType, Environment, new List()); + } + if (Startup != null) + { + engine.UseStartup(Startup.ConfigureDelegate, Startup.ConfigureServicesDelegate); + } + else if (StartupAssemblyName != null) + { + engine.UseStartup(StartupAssemblyName); + } + + return new TestServer(engine); + } + + private class TestApplicationEnvironment : IApplicationEnvironment + { + private readonly IApplicationEnvironment _appEnv; + private string _appName; + private string _appBasePath; + + public TestApplicationEnvironment(IApplicationEnvironment appEnv) + { + _appEnv = appEnv; + } + + public string ApplicationBasePath + { + get + { + return _appBasePath ?? _appEnv.ApplicationBasePath; + } + set + { + _appBasePath = value; + } + } + + public string ApplicationName + { + get + { + return _appName ?? _appEnv.ApplicationName; + } + set + { + _appName = value; + } + } + + public string Configuration + { + get + { + return _appEnv.Configuration; + } + } + + public FrameworkName RuntimeFramework + { + get + { + return _appEnv.RuntimeFramework; + } + } + + public string Version + { + get + { + throw new NotImplementedException(); + } + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 7bebf1c0e7..6e2547f0ed 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -8,8 +8,10 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.OptionsModel; using Xunit; namespace Microsoft.AspNet.Hosting @@ -18,58 +20,60 @@ namespace Microsoft.AspNet.Hosting { private readonly IList _startInstances = new List(); + [Fact] + public void HostingEngineThrowsWithNoServer() + { + Assert.Throws(() => WebHost.CreateEngine().Start()); + } + [Fact] public void HostingEngineCanBeStarted() { - var context = new HostingContext - { - ServerFactory = this, - ApplicationName = "Microsoft.AspNet.Hosting.Tests" - }; + var engine = WebHost.CreateEngine() + .UseServer(this) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Start(); - var engineStart = new HostingEngine().Start(context); - - Assert.NotNull(engineStart); + Assert.NotNull(engine); Assert.Equal(1, _startInstances.Count); Assert.Equal(0, _startInstances[0].DisposeCalls); - engineStart.Dispose(); + engine.Dispose(); Assert.Equal(1, _startInstances[0].DisposeCalls); } [Fact] - public void ApplicationNameDefaultsToApplicationEnvironmentName() + public void CanReplaceHostingFactory() { - var context = new HostingContext - { - ServerFactory = this - }; + var factory = WebHost.CreateFactory(services => services.AddTransient()); - var engine = new HostingEngine(); + Assert.NotNull(factory as TestEngineFactory); + } - using (engine.Start(context)) - { - Assert.Equal("Microsoft.AspNet.Hosting.Tests", context.ApplicationName); - } + [Fact] + public void CanReplaceStartupLoader() + { + var engine = WebHost.CreateEngine(services => services.AddTransient()) + .UseServer(this) + .UseStartup("Microsoft.AspNet.Hosting.Tests"); + + Assert.Throws(() => engine.Start()); + } + + [Fact] + public void CanCreateApplicationServicesWithAddedServices() + { + var engineStart = WebHost.CreateEngine(services => services.AddOptions()); + Assert.NotNull(engineStart.ApplicationServices.GetRequiredService>()); } [Fact] public void EnvDefaultsToDevelopmentIfNoConfig() { - var context = new HostingContext - { - ServerFactory = this - }; - - var engine = new HostingEngine(); - - using (engine.Start(context)) - { - Assert.Equal("Development", context.EnvironmentName); - var env = context.ApplicationServices.GetRequiredService(); - Assert.Equal("Development", env.EnvironmentName); - } + var engine = WebHost.CreateEngine(new Configuration()); + var env = engine.ApplicationServices.GetRequiredService(); + Assert.Equal("Development", env.EnvironmentName); } [Fact] @@ -83,32 +87,16 @@ namespace Microsoft.AspNet.Hosting var config = new Configuration() .Add(new MemoryConfigurationSource(vals)); - var context = new HostingContext - { - ServerFactory = this, - Configuration = config - }; - - var engine = new HostingEngine(); - - using (engine.Start(context)) - { - Assert.Equal("Staging", context.EnvironmentName); - var env = context.ApplicationServices.GetRequiredService(); - Assert.Equal("Staging", env.EnvironmentName); - } + var engine = WebHost.CreateEngine(config); + var env = engine.ApplicationServices.GetRequiredService(); + Assert.Equal("Staging", env.EnvironmentName); } [Fact] public void WebRootCanBeResolvedFromTheProjectJson() { - var context = new HostingContext - { - ServerFactory = this - }; - - var engineStart = new HostingEngine().Start(context); - var env = context.ApplicationServices.GetRequiredService(); + var engine = WebHost.CreateEngine().UseServer(this); + var env = engine.ApplicationServices.GetRequiredService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } @@ -116,16 +104,11 @@ namespace Microsoft.AspNet.Hosting [Fact] public void IsEnvironment_Extension_Is_Case_Insensitive() { - var context = new HostingContext - { - ServerFactory = this - }; + var engine = WebHost.CreateEngine().UseServer(this); - var engine = new HostingEngine(); - - using (engine.Start(context)) + using (engine.Start()) { - var env = context.ApplicationServices.GetRequiredService(); + var env = engine.ApplicationServices.GetRequiredService(); Assert.True(env.IsEnvironment("Development")); Assert.True(env.IsEnvironment("developMent")); } @@ -141,27 +124,17 @@ namespace Microsoft.AspNet.Hosting [InlineData(@"sub/sub2\sub3\", @"sub/sub2/sub3/")] public void MapPath_Facts(string virtualPath, string expectedSuffix) { - var context = new HostingContext - { - ServerFactory = this - }; + var engine = WebHost.CreateEngine().UseServer(this); - var engine = new HostingEngine(); - - using (engine.Start(context)) + using (engine.Start()) { - var env = context.ApplicationServices.GetRequiredService(); + var env = engine.ApplicationServices.GetRequiredService(); var mappedPath = env.MapPath(virtualPath); expectedSuffix = expectedSuffix.Replace('/', Path.DirectorySeparatorChar); Assert.Equal(Path.Combine(env.WebRootPath, expectedSuffix), mappedPath); } } - public void Initialize(IApplicationBuilder builder) - { - - } - public IServerInformation Initialize(IConfiguration configuration) { return null; @@ -190,5 +163,21 @@ namespace Microsoft.AspNet.Hosting DisposeCalls += 1; } } + + private class TestLoader : IStartupLoader + { + public StartupMethods Load(string startupAssemblyName, string environmentName, IList diagnosticMessages) + { + throw new NotImplementedException(); + } + } + + private class TestEngineFactory : IHostingFactory + { + public IHostingEngine Create(IConfiguration config) + { + throw new NotImplementedException(); + } + } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj index 8f9318a85a..d4b7ee1bcd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj @@ -14,5 +14,8 @@ 2.0 18007 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index a7ecf91aaa..cce2931e22 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -3,6 +3,8 @@ using System; using System.Collections.Generic; +using System.Diagnostics; +using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Startup; @@ -24,7 +26,7 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "WithServices", diagnosticMessages); + var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "WithServices", diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); @@ -47,7 +49,7 @@ namespace Microsoft.AspNet.Hosting.Tests var services = new ServiceCollection().BuildServiceProvider(); var diagnosticMesssages = new List(); - var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", environment ?? "", diagnosticMesssages); + var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", environment ?? "", diagnosticMesssages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); @@ -67,7 +69,7 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var ex = Assert.Throws(() => ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); + var ex = Assert.Throws(() => new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); Assert.Equal("A method named 'ConfigureBoom' or 'Configure' in the type 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' could not be found.", ex.Message); } @@ -78,7 +80,7 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "WithNullConfigureServices", diagnosticMessages); + var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "WithNullConfigureServices", diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); @@ -94,7 +96,7 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = ApplicationStartup.LoadStartupMethods(services, "Microsoft.AspNet.Hosting.Tests", "WithConfigureServices", diagnosticMessages); + var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "WithConfigureServices", diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); @@ -104,6 +106,71 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.True(foo.Invoked); } + [Fact] + public void StartupLoaderCanLoadByType() + { + var serviceCollection = new ServiceCollection(); + var services = serviceCollection.BuildServiceProvider(); + + var diagnosticMessages = new List(); + var startup = new StartupLoader(services).Load(typeof(TestStartup), "", diagnosticMessages); + + var app = new ApplicationBuilder(services); + app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); + startup.ConfigureDelegate(app); + + var foo = app.ApplicationServices.GetRequiredService(); + Assert.Equal("Configure", foo.Message); + } + + [Fact] + public void StartupLoaderCanLoadByTypeWithEnvironment() + { + var serviceCollection = new ServiceCollection(); + var services = serviceCollection.BuildServiceProvider(); + + var diagnosticMessages = new List(); + var startup = new StartupLoader(services).Load(typeof(TestStartup), "No", diagnosticMessages); + + var app = new ApplicationBuilder(services); + app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); + + var ex = Assert.Throws(() => startup.ConfigureDelegate(app)); + Assert.IsAssignableFrom(typeof(InvalidOperationException), ex.InnerException); + } + + public class SimpleService + { + public SimpleService() + { + } + + public string Message { get; set; } + } + + public class TestStartup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddSingleton(); + } + + public void ConfigureNoServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app) + { + var service = app.ApplicationServices.GetRequiredService(); + service.Message = "Configure"; + } + + public void ConfigureNo(IApplicationBuilder app) + { + var service = app.ApplicationServices.GetRequiredService(); + } + } + public void ConfigurationMethodCalled(object instance) { _configurationMethodCalledList.Add(instance); diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index aa3d3b7bb0..6dc7086527 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -3,6 +3,7 @@ "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "frameworks": { diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj index b70af08ea5..55caa51ccf 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -13,5 +13,8 @@ 2.0 + + + - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs index 0f637c7d24..6a005fd0dc 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public void AddRequestHeader() { - TestServer server = TestServer.Create(app => { }); + var server = TestServer.Create(app => { }); server.CreateRequest("/") .AddHeader("Host", "MyHost:90") .And(request => @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public void AddContentHeaders() { - TestServer server = TestServer.Create(app => { }); + var server = TestServer.Create(app => { }); server.CreateRequest("/") .AddHeader("Content-Type", "Test/Value") .And(request => diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index f3a3fc0bef..72f7277990 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -2,15 +2,21 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics; using System.IO; using System.Net; using System.Net.Http; +using System.Runtime.Versioning; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; +using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; +using Microsoft.Framework.Runtime; +using Microsoft.Framework.Runtime.Infrastructure; using Xunit; namespace Microsoft.AspNet.TestHost @@ -32,7 +38,7 @@ namespace Microsoft.AspNet.TestHost var services = new ServiceCollection().BuildServiceProvider(); // Act & Assert - Assert.Throws(() => TestServer.Create(services, new Startup().Configuration)); + Assert.Throws(() => TestServer.Create(services, new Configuration(), new Startup().Configure, configureServices: null)); } [Fact] @@ -50,6 +56,54 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("RequestServices:True", result); } + [Fact] + public async Task CanChangeApplicationName() + { + var fallbackServices = CallContextServiceLocator.Locator.ServiceProvider; + var appName = "gobblegobble"; + + var builder = TestServer.CreateBuilder(fallbackServices, new Configuration(), + app => + { + app.Run(context => + { + var appEnv = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("AppName:" + appEnv.ApplicationName); + }); + }, + configureServices: null); + + builder.ApplicationName = appName; + var server = builder.Build(); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("AppName:" + appName, result); + } + + [Fact] + public async Task CanChangeAppPath() + { + var fallbackServices = CallContextServiceLocator.Locator.ServiceProvider; + var appPath = "."; + + var builder = TestServer.CreateBuilder(fallbackServices, new Configuration(), + app => + { + app.Run(context => + { + var env = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("AppPath:" + env.ApplicationBasePath); + }); + }, + configureServices: null); + + builder.ApplicationBasePath = appPath; + var server = builder.Build(); + + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("AppPath:" + appPath, result); + } + [Fact] public async Task CanAccessLogger() { @@ -97,16 +151,13 @@ namespace Microsoft.AspNet.TestHost { TestServer server = TestServer.Create(app => { - var a = app.ApplicationServices.GetRequiredService(); - app.Run(context => { - var b = app.ApplicationServices.GetRequiredService(); var accessor = app.ApplicationServices.GetRequiredService(); return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); }); }, - services => services.AddSingleton().BuildServiceProvider()); + services => services.AddSingleton()); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -188,19 +239,70 @@ namespace Microsoft.AspNet.TestHost Assert.Throws(() => { string result = server.CreateClient().GetStringAsync("/path").Result; }); } + [Fact] + public async Task CanCreateViaStartupType() + { + TestServer server = TestServer.Create(); + HttpResponseMessage result = await server.CreateClient().GetAsync("/"); + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal("FoundService:True", await result.Content.ReadAsStringAsync()); + } + + [Fact] + public async Task CanCreateViaStartupTypeAndSpecifyEnv() + { + var builder = TestServer.CreateBuilder(); + builder.Environment = "Foo"; + var server = builder.Build(); + HttpResponseMessage result = await server.CreateClient().GetAsync("/"); + Assert.Equal(HttpStatusCode.OK, result.StatusCode); + Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); + } + public class Startup { - public void Configuration(IApplicationBuilder builder) + public void Configure(IApplicationBuilder builder) { builder.Run(ctx => ctx.Response.WriteAsync("Startup")); } } - public class AnotherStartup + public class SimpleService { - public void Configuration(IApplicationBuilder builder) + public SimpleService() { - builder.Run(ctx => ctx.Response.WriteAsync("Another Startup")); + } + + public string Message { get; set; } + } + + public class TestStartup + { + public void ConfigureServices(IServiceCollection services) + { + services.AddSingleton(); + } + + public void ConfigureFooServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app) + { + app.Run(context => + { + var service = app.ApplicationServices.GetRequiredService(); + return context.Response.WriteAsync("FoundService:" + (service != null)); + }); + } + + public void ConfigureFoo(IApplicationBuilder app) + { + app.Run(context => + { + var service = app.ApplicationServices.GetService(); + return context.Response.WriteAsync("FoundFoo:" + (service != null)); + }); } } } From fd9f845dc96c49c3fc838ef4c2f41fb9945b8e19 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 30 Mar 2015 20:46:23 -0700 Subject: [PATCH 0508/1838] Don't blast null values into UseStartup/Server --- src/Microsoft.AspNet.Hosting/Program.cs | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 555fc241a8..6c4a24ae1c 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -33,10 +33,18 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var engine = WebHost.CreateEngine(_serviceProvider, config) - .UseServer(config.Get("server")) - .UseStartup(config.Get("app")); - + var engine = WebHost.CreateEngine(_serviceProvider, config); + var server = config.Get("server"); + if (server != null) + { + engine.UseServer(server); + } + var startup = config.Get("app"); + if (startup != null) + { + engine.UseStartup(startup); + } + var serverShutdown = engine.Start(); var loggerFactory = engine.ApplicationServices.GetRequiredService(); var appShutdownService = engine.ApplicationServices.GetRequiredService(); From 04e5a558abcb454274112b9ba26eb11c8c2926e7 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 1 Apr 2015 02:34:01 -0700 Subject: [PATCH 0509/1838] Move interfaces around - Moved IServerFactory to Microsoft.AspNet.Server.Interfaces - Moved IHttpContextAccessor to Microsoft.AspNet.Hosting.Interfaces - Fixed dependencies so that they are minimal #172 --- Hosting.sln | 15 ++++++++++++++ .../IHttpContextAccessor.cs | 1 - .../project.json | 2 -- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 3 +-- src/Microsoft.AspNet.Hosting/project.json | 9 ++++++--- .../IServerFactory.cs | 0 .../Microsoft.AspNet.Server.Interfaces.xproj | 20 +++++++++++++++++++ .../project.json | 13 ++++++++++++ 8 files changed, 55 insertions(+), 8 deletions(-) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNet.Hosting.Interfaces}/IHttpContextAccessor.cs (90%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Server.Interfaces}/IServerFactory.cs (100%) create mode 100644 src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj create mode 100644 src/Microsoft.AspNet.Server.Interfaces/project.json diff --git a/Hosting.sln b/Hosting.sln index 1110900290..392ee75154 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -22,6 +22,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Interfaces", "src\Microsoft.AspNet.Server.Interfaces\Microsoft.AspNet.Server.Interfaces.xproj", "{3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -84,6 +86,18 @@ Global {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|x86.ActiveCfg = Release|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|x86.Build.0 = Release|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|x86.Build.0 = Debug|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Any CPU.Build.0 = Release|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|x86.ActiveCfg = Release|Any CPU + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -94,5 +108,6 @@ Global {3944F036-7E75-47E8-AA52-C4B89A64EC3A} = {E0497F39-AFFB-4819-A116-E39E361915AB} {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} {BB780FBB-7842-4759-8DE7-96FA2E5571C1} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF} = {E0497F39-AFFB-4819-A116-E39E361915AB} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs similarity index 90% rename from src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs index f406c8e3b3..8b1719880b 100644 --- a/src/Microsoft.AspNet.Hosting/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs @@ -5,7 +5,6 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Hosting { - // REVIEW: move to interfaces public interface IHttpContextAccessor { HttpContext HttpContext { get; set; } diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index e21eb01c51..1bd0d4e29b 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -2,9 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 69ca5e6883..0f6826737c 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -24,8 +24,7 @@ namespace Microsoft.AspNet.Hosting // Start/ApplicationServices block use methods private bool _useDisabled; - - private IServerLoader _serverLoader; + private IApplicationBuilderFactory _builderFactory; private IApplicationBuilder _builder; private IServiceProvider _applicationServices; diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 4763927417..f4f5871964 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,14 +1,17 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", + "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { - "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Microsoft.AspNet.FileProviders": "1.0.0-*", + "Microsoft.AspNet.Server.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Newtonsoft.Json": "6.0.6" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Server.Interfaces/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IServerFactory.cs rename to src/Microsoft.AspNet.Server.Interfaces/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj b/src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj new file mode 100644 index 0000000000..8561614f22 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + 3dcd2cb4-0e15-4bb5-9a24-091e00694dcf + Microsoft.AspNet.Server.Interfaces + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + diff --git a/src/Microsoft.AspNet.Server.Interfaces/project.json b/src/Microsoft.AspNet.Server.Interfaces/project.json new file mode 100644 index 0000000000..90fc3f0f67 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Interfaces/project.json @@ -0,0 +1,13 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*", + "Microsoft.AspNet.FeatureModel": "1.0.0-*" + }, + + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From 4b8f02d7af32a1366aa9e65edd4f46f6eee19d73 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 1 Apr 2015 03:24:20 -0700 Subject: [PATCH 0510/1838] Sort dependencies --- src/Microsoft.AspNet.Server.Interfaces/project.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Interfaces/project.json b/src/Microsoft.AspNet.Server.Interfaces/project.json index 90fc3f0f67..88b8b45a6a 100644 --- a/src/Microsoft.AspNet.Server.Interfaces/project.json +++ b/src/Microsoft.AspNet.Server.Interfaces/project.json @@ -1,9 +1,9 @@ { "version": "1.0.0-*", "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*", - "Microsoft.AspNet.FeatureModel": "1.0.0-*" + "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*" }, "frameworks": { From 8639f3edbca5159bb10aa97740f1420bad220d93 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 1 Apr 2015 03:45:02 -0700 Subject: [PATCH 0511/1838] Renamed M.A.Server.Interfaces -> M.A.Hosting.Server.Interfaces --- Hosting.sln | 28 +++++++++---------- .../IServerFactory.cs | 0 ...ft.AspNet.Hosting.Server.Interfaces.xproj} | 14 +++++----- .../project.json | 0 src/Microsoft.AspNet.Hosting/project.json | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) rename src/{Microsoft.AspNet.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Interfaces}/IServerFactory.cs (100%) rename src/{Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj => Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj} (56%) rename src/{Microsoft.AspNet.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Interfaces}/project.json (100%) diff --git a/Hosting.sln b/Hosting.sln index 392ee75154..fd29a14db9 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -22,7 +22,7 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Interfaces", "src\Microsoft.AspNet.Server.Interfaces\Microsoft.AspNet.Server.Interfaces.xproj", "{3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Interfaces", "src\Microsoft.AspNet.Hosting.Server.Interfaces\Microsoft.AspNet.Hosting.Server.Interfaces.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -86,18 +86,18 @@ Global {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|x86.ActiveCfg = Release|Any CPU {BB780FBB-7842-4759-8DE7-96FA2E5571C1}.Release|x86.Build.0 = Release|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|x86.ActiveCfg = Debug|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Debug|x86.Build.0 = Debug|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Any CPU.Build.0 = Release|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|x86.ActiveCfg = Release|Any CPU - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF}.Release|x86.Build.0 = Release|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Debug|x86.ActiveCfg = Debug|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Debug|x86.Build.0 = Debug|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|Any CPU.Build.0 = Release|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|x86.ActiveCfg = Release|Any CPU + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -108,6 +108,6 @@ Global {3944F036-7E75-47E8-AA52-C4B89A64EC3A} = {E0497F39-AFFB-4819-A116-E39E361915AB} {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} {BB780FBB-7842-4759-8DE7-96FA2E5571C1} = {E0497F39-AFFB-4819-A116-E39E361915AB} - {3DCD2CB4-0E15-4BB5-9A24-091E00694DCF} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {FDBBA081-5248-4FC0-9E08-B46BEF3FA438} = {E0497F39-AFFB-4819-A116-E39E361915AB} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Server.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Interfaces/IServerFactory.cs rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj similarity index 56% rename from src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj index 8561614f22..17228558fd 100644 --- a/src/Microsoft.AspNet.Server.Interfaces/Microsoft.AspNet.Server.Interfaces.xproj +++ b/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj @@ -1,20 +1,20 @@  - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - 3dcd2cb4-0e15-4bb5-9a24-091e00694dcf - Microsoft.AspNet.Server.Interfaces - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ + fdbba081-5248-4fc0-9e08-b46bef3fa438 + + + + 2.0 - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json similarity index 100% rename from src/Microsoft.AspNet.Server.Interfaces/project.json rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index f4f5871964..09c50d4135 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -4,8 +4,8 @@ "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { "Microsoft.AspNet.FileProviders": "1.0.0-*", - "Microsoft.AspNet.Server.Interfaces": "1.0.0-*", "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Hosting.Server.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", From 13d3d5042ef340dea5ccc88fc7490becb0b27aeb Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 1 Apr 2015 15:44:53 -0700 Subject: [PATCH 0512/1838] Add travis and appveyor CI support. --- .travis.yml | 3 +++ appveyor.yml | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 .travis.yml create mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..0f4cb93e59 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: csharp +script: + - ./build.sh verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..88cb9ef145 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,5 @@ +build_script: + - build.cmd verify +clone_depth: 1 +test: off +deploy: off \ No newline at end of file From ac9db0ff3538279083121bc4d7b7963cd4d64bdc Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 1 Apr 2015 15:45:04 -0700 Subject: [PATCH 0513/1838] Add travis and appveyor CI support. --- .travis.yml | 3 +++ appveyor.yml | 5 +++++ 2 files changed, 8 insertions(+) create mode 100644 .travis.yml create mode 100644 appveyor.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000000..0f4cb93e59 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,3 @@ +language: csharp +script: + - ./build.sh verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 0000000000..88cb9ef145 --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,5 @@ +build_script: + - build.cmd verify +clone_depth: 1 +test: off +deploy: off \ No newline at end of file From 9fffd3ebeb39910b9986ef6d68ed0e1731cb7e46 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 1 Apr 2015 16:28:58 -0700 Subject: [PATCH 0514/1838] Turn off sudo for .travis.yml. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0f4cb93e59..5939a529e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ language: csharp +sudo: false script: - ./build.sh verify \ No newline at end of file From adfad921c57f867d61aa0a212231a64bff7fdce6 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 1 Apr 2015 17:05:57 -0700 Subject: [PATCH 0515/1838] Turn off sudo for .travis.yml. --- .travis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.travis.yml b/.travis.yml index 0f4cb93e59..5939a529e5 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,3 +1,4 @@ language: csharp +sudo: false script: - ./build.sh verify \ No newline at end of file From 7a41c727115694c493368a6e0df320153ccc9d48 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 1 Apr 2015 18:43:56 -0700 Subject: [PATCH 0516/1838] Adding status badges --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 8bf71cfc4d..057175f9dd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ Hosting ======= +AppVeyor: [![AppVeyor](https://ci.appveyor.com/api/projects/status/99mq30o3hcs9p39n/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/Hosting/branch/dev) + +Travis: [![Travis](https://travis-ci.org/aspnet/Hosting.svg?branch=dev)](https://travis-ci.org/aspnet/Hosting) The Hosting repo contains code required to host an ASP.NET 5 application, it is the entry point used when self-hosting an application. From fd85a8b3a5254b3e4b3cce52dfec61dd010f00d6 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 1 Apr 2015 18:47:56 -0700 Subject: [PATCH 0517/1838] Adding status badges --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index e9ec88786b..8ed5ec4edc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ HttpAbstractions ================ +AppVeyor: [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) + +Travis: [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) Contains HTTP abstractions for ASP.NET 5 such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. From 2b07b1a5fa4895d485720dfbadbeadcdfe212b5f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 1 Apr 2015 21:59:14 -0700 Subject: [PATCH 0518/1838] Added test that injects IHostingEnvironment #221 --- .../Fakes/StartupWithHostingEnvironment.cs | 18 ++++++++++++++++++ .../HostingEngineTests.cs | 15 +++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs new file mode 100644 index 0000000000..9ddda3881c --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs @@ -0,0 +1,18 @@ +using System; +using Microsoft.AspNet.Builder; + +namespace Microsoft.AspNet.Hosting.Tests.Fakes +{ + public class StartupWithHostingEnvironment + { + public StartupWithHostingEnvironment(IHostingEnvironment env) + { + env.EnvironmentName = "Changed"; + } + + public void Configure(IApplicationBuilder app, IHostingEnvironment env) + { + + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 6e2547f0ed..da2cb518e5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -43,6 +43,21 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void HostingEngineInjectsHostingEnvironment() + { + var engine = WebHost.CreateEngine() + .UseServer(this) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .UseEnvironment("WithHostingEnvironment"); + + using (var server = engine.Start()) + { + var env = engine.ApplicationServices.GetRequiredService(); + Assert.Equal("Changed", env.EnvironmentName); + } + } + [Fact] public void CanReplaceHostingFactory() { From e75f40bd24d5e3d52647918b651851f22a50ab4b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 2 Apr 2015 00:12:41 -0700 Subject: [PATCH 0519/1838] Fix paths in map path test --- .../HostingEngineTests.cs | 15 ++++++++++++++- test/Microsoft.AspNet.Hosting.Tests/project.json | 1 + 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index da2cb518e5..01de9f14ed 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -9,6 +9,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Testing.xunit; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.OptionsModel; @@ -136,8 +137,20 @@ namespace Microsoft.AspNet.Hosting [InlineData(@"\", @"\")] [InlineData("sub", "sub")] [InlineData("sub/sub2/sub3", @"sub/sub2/sub3")] - [InlineData(@"sub/sub2\sub3\", @"sub/sub2/sub3/")] public void MapPath_Facts(string virtualPath, string expectedSuffix) + { + RunMapPath(virtualPath, expectedSuffix); + } + + [ConditionalTheory] + [OSSkipCondition(OperatingSystems.Unix | OperatingSystems.MacOSX)] + [InlineData(@"sub/sub2\sub3\", @"sub/sub2/sub3/")] + public void MapPath_Windows_Facts(string virtualPath, string expectedSuffix) + { + RunMapPath(virtualPath, expectedSuffix); + } + + private void RunMapPath(string virtualPath, string expectedSuffix) { var engine = WebHost.CreateEngine().UseServer(this); diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 6dc7086527..0d307555cb 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" From ef49606ea644b9db5b638d7c2fe8483706d45f26 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 2 Apr 2015 09:20:11 -0700 Subject: [PATCH 0520/1838] Update global.json, sources=>projects --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 840c36f6ad..983ba0401e 100644 --- a/global.json +++ b/global.json @@ -1,3 +1,3 @@ { - "sources": ["src"] -} \ No newline at end of file + "projects": ["src"] +} From d95202528b54d364921be66cf3aefe0b230d96b8 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 2 Apr 2015 09:20:13 -0700 Subject: [PATCH 0521/1838] Update global.json, sources=>projects --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 840c36f6ad..983ba0401e 100644 --- a/global.json +++ b/global.json @@ -1,3 +1,3 @@ { - "sources": ["src"] -} \ No newline at end of file + "projects": ["src"] +} From 8be4a1a0af015c5b33229df66bdded90df682a09 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 2 Apr 2015 13:49:26 -0700 Subject: [PATCH 0522/1838] Update .xproj files for Microsoft.Web.AspNet.* -> Microsoft.DNX.* rename --- .../Microsoft.AspNet.Hosting.Interfaces.xproj | 7 ++----- .../Microsoft.AspNet.Hosting.xproj | 8 ++++---- .../Microsoft.AspNet.TestHost.xproj | 8 ++++---- .../Microsoft.AspNet.Hosting.Tests.xproj | 4 ++-- .../Microsoft.AspNet.TestHost.Tests.xproj | 8 ++++---- 5 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj index b50140bec2..d7e8b6e399 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj +++ b/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj @@ -4,17 +4,14 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - + bb780fbb-7842-4759-8de7-96fa2e5571c1 - Microsoft.AspNet.Hosting.Interfaces ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ - 2.0 - + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj index e98519ce8c..9c87bfc28c 100644 --- a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj +++ b/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 3944f036-7e75-47e8-aa52-c4b89a64ec3a ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj index 67078fd3b5..947a955cd1 100644 --- a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj +++ b/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 1a415a3f-1081-45db-809b-ee19cea02dc0 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj index 8f9318a85a..e9c9c0dcac 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj +++ b/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + d4f18d58-52b1-435d-a012-10f2cdf158c4 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -14,5 +14,5 @@ 2.0 18007 - + \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj index b70af08ea5..781dbf794a 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj +++ b/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 0acb2719-9484-49b5-b8e3-117091192511 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file From c6bf89a04e76eacf1b65046049d076e16bdb3294 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 2 Apr 2015 13:49:26 -0700 Subject: [PATCH 0523/1838] Update .xproj files for Microsoft.Web.AspNet.* -> Microsoft.DNX.* rename --- .../Microsoft.AspNet.FeatureModel.xproj | 6 +++--- .../Microsoft.AspNet.Http.Core.xproj | 6 +++--- .../Microsoft.AspNet.Http.Extensions.xproj | 6 +++--- .../Microsoft.AspNet.Http.Interfaces.xproj | 6 +++--- src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj | 6 +++--- src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj | 6 +++--- .../Microsoft.AspNet.WebUtilities.xproj | 6 +++--- .../Microsoft.Framework.WebEncoders.Core.xproj | 6 +++--- .../Microsoft.Framework.WebEncoders.xproj | 6 +++--- .../Microsoft.Net.Http.Headers.xproj | 6 +++--- .../Microsoft.AspNet.FeatureModel.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.Http.Core.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.Http.Extensions.Tests.xproj | 6 +++--- .../Microsoft.AspNet.Http.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.Owin.Tests.xproj | 8 ++++---- .../Microsoft.AspNet.WebUtilities.Tests.xproj | 6 +++--- .../Microsoft.Framework.WebEncoders.Tests.xproj | 6 +++--- .../Microsoft.Net.Http.Headers.Tests.xproj | 6 +++--- 18 files changed, 58 insertions(+), 58 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj index f75392129d..bd9dcea294 100644 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj +++ b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 32a4c918-30ee-41db-8e26-8a3bb88ed231 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj index b50c4e7764..447e54485b 100644 --- a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj +++ b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + bcf0f967-8753-4438-bd07-aadca9ce509a ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj index 64be73c1ea..31d24d7bf6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj +++ b/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + ccc4363e-81e2-4058-94dd-00494e9e992a ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj index bd80d293f8..2326ea959f 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj +++ b/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + d9128247-8f97-48b8-a863-f1f21a029fce ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj index aead60bd2e..67db5d869b 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj index e668c3289a..cf782585d1 100644 --- a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj +++ b/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 59bed991-f207-48ed-b24c-0a1d9c986c01 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj index 77c0886660..5f79a271e0 100644 --- a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj +++ b/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + a2fb7838-0031-4fad-ba3e-83c30b3af406 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj index 9ae58fa6a5..559ec64868 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj +++ b/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + be9112cb-d87d-4080-9cc3-24492d49cbe6 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj index 9a3c5e9646..084e7901ea 100644 --- a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj +++ b/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + dd2ce416-765e-4000-a03e-c2ff165da1b6 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj index 8750df3e9b..182749e71e 100644 --- a/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj +++ b/src/Microsoft.Net.Http.Headers/Microsoft.Net.Http.Headers.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 60aa2fdb-8121-4826-8d00-9a143fefaf66 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj index 048ee0ea9b..6bd0b3bd59 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + c5d2bae1-e182-48a0-aa74-1af14b782bf7 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj index 1e73261367..c438cb7050 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + aa99af26-f7b1-4a6b-a922-5c25539f6391 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj index 3fa25da029..38294666a7 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + ae25ef21-7f91-4b86-b73e-af746821d339 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj index f307eafd3c..424d3a7f9b 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + f16692b8-9f38-4dca-a582-e43172b989c6 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj index 135f58392d..0a5d033908 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj @@ -1,10 +1,10 @@ - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 16219571-3268-4d12-8689-12b7163dba13 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj index 2592290c21..8476f5e9a6 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 93c10e50-bcbb-4d8e-9492-d46e1396225b ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj index f91eeecab2..d456c7e180 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj +++ b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + 7ae2731d-43cd-4cf8-850a-4914de2ce930 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj index dfb42bfc9a..a0a2089ec3 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj @@ -4,7 +4,7 @@ 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + e6bb7ad1-bd10-4a23-b780-f4a86adf00d1 ..\..\artifacts\obj\$(MSBuildProjectName) @@ -13,5 +13,5 @@ 2.0 - - + + \ No newline at end of file From ee511e4181c96271df179691963f610b93352cac Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Fri, 3 Apr 2015 12:29:47 -0700 Subject: [PATCH 0524/1838] Update .xproj files for Microsoft.Web.AspNet.* -> Microsoft.DNX.* rename - one new file --- ...Microsoft.AspNet.Hosting.Server.Interfaces.xproj | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj index 17228558fd..815bc0ce57 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj +++ b/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj @@ -1,20 +1,17 @@  - + 14.0 $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - + fdbba081-5248-4fc0-9e08-b46bef3fa438 - - - - - + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ 2.0 - + \ No newline at end of file From f0fcaa91fe8a8fcded5bc07a52d87ef3d7476427 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Fri, 3 Apr 2015 17:11:10 -0700 Subject: [PATCH 0525/1838] Fix AppVeyor git line ending config --- appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 88cb9ef145..3fab83e134 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,3 +1,5 @@ +init: + - git config --global core.autocrlf true build_script: - build.cmd verify clone_depth: 1 From 0ca6960a3250924b9b499b915bc784b000ba0c06 Mon Sep 17 00:00:00 2001 From: Wei Wang Date: Fri, 3 Apr 2015 17:11:45 -0700 Subject: [PATCH 0526/1838] Fix AppVeyor git line ending config --- appveyor.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/appveyor.yml b/appveyor.yml index 88cb9ef145..3fab83e134 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,3 +1,5 @@ +init: + - git config --global core.autocrlf true build_script: - build.cmd verify clone_depth: 1 From 1f127d25c3fb45a101814bab102ab241c71de60c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 6 Apr 2015 07:41:05 -0700 Subject: [PATCH 0527/1838] * Adding TimeSpan to DateTimeOffset so test succeeds in non-PST timezones * Removing unused dependency from project.json --- .../ContentDispositionHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/project.json | 6 +----- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index 41bb2bdaae..da906e8171 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -324,7 +324,7 @@ namespace Microsoft.Net.Http.Headers contentDisposition.FileName = "my File Name"; Assert.Equal("inline; name=myname; filename=\"my File Name\"", contentDisposition.ToString()); - contentDisposition.CreationDate = new DateTimeOffset(new DateTime(2011, 2, 15)); + contentDisposition.CreationDate = new DateTimeOffset(new DateTime(2011, 2, 15), new TimeSpan(-8, 0, 0)); Assert.Equal("inline; name=myname; filename=\"my File Name\"; creation-date=" + "\"Tue, 15 Feb 2011 08:00:00 GMT\"", contentDisposition.ToString()); diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 0fc76424a5..4859085a96 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -9,10 +9,6 @@ }, "frameworks": { "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*" - } - } + "dnxcore50": { } } } From c24a40517fe95829ed615414de6405d3e938aa8f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 11:25:26 -0700 Subject: [PATCH 0528/1838] #246 Fix multipart test on linux. --- .../FormFeatureTests.cs | 45 +++--- .../MultipartReaderTests.cs | 140 +++++++++--------- 2 files changed, 90 insertions(+), 95 deletions(-) diff --git a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs index 7f1224c1b7..254a6800ea 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs @@ -96,31 +96,32 @@ namespace Microsoft.AspNet.Http.Core private const string MultipartContentType = "multipart/form-data; boundary=WebKitFormBoundary5pDRpGheQXaM8k3T"; private const string EmptyMultipartForm = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; + // Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF. private const string MultipartFormWithField = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""description"" - -Foo ---WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; private const string MultipartFormWithFile = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" -Content-Type: text/html - -Hello World ---WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Hello World\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; private const string MultipartFormWithFieldAndFile = -@"--WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""description"" - -Foo ---WebKitFormBoundary5pDRpGheQXaM8k3T -Content-Disposition: form-data; name=""myfile1""; filename=""temp.html"" -Content-Type: text/html - -Hello World ---WebKitFormBoundary5pDRpGheQXaM8k3T--"; +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"description\"\r\n" + +"\r\n" + +"Foo\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T\r\n" + +"Content-Disposition: form-data; name=\"myfile1\"; filename=\"temp.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Hello World\r\n" + +"--WebKitFormBoundary5pDRpGheQXaM8k3T--"; [Fact] public async Task ReadForm_EmptyMultipart_ReturnsParsedFormCollection() diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs index 49a5abedd0..2dd618cdf1 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -11,72 +11,68 @@ namespace Microsoft.AspNet.WebUtilities public class MultipartReaderTests { private const string Boundary = "9051914041544843365972754266"; + // Note that CRLF (\r\n) is required. You can't use multi-line C# strings here because the line breaks on Linux are just LF. private const string OnePartBody = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; private const string OnePartBodyWithTrailingWhitespace = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266 \r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; // It's non-compliant but common to leave off the last CRLF. private const string OnePartBodyWithoutFinalCRLF = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266--"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--"; private const string TwoPartBody = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file1""; filename=""a.txt"" -Content-Type: text/plain - -Content of a.txt. - ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365972754266--\r\n"; private const string TwoPartBodyWithUnicodeFileName = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file1""; filename=""a色.txt"" -Content-Type: text/plain - -Content of a.txt. - ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a色.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365972754266--\r\n"; private const string ThreePartBody = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" - -text default ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file1""; filename=""a.txt"" -Content-Type: text/plain - -Content of a.txt. - ---9051914041544843365972754266 -Content-Disposition: form-data; name=""file2""; filename=""a.html"" -Content-Type: text/html - -Content of a.html. - ---9051914041544843365972754266-- -"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file1\"; filename=\"a.txt\"\r\n" + +"Content-Type: text/plain\r\n" + +"\r\n" + +"Content of a.txt.\r\n" + +"\r\n" + +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"file2\"; filename=\"a.html\"\r\n" + +"Content-Type: text/html\r\n" + +"\r\n" + +"Content of a.html.\r\n" + +"\r\n" + +"--9051914041544843365972754266--\r\n"; private static MemoryStream MakeStream(string text) { @@ -225,15 +221,14 @@ Content-Type: text/html public async Task MutipartReader_ReadInvalidUtf8Header_ReplacementCharacters() { var body1 = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" filename=""a"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\" filename=\"a"; var body2 = -@".txt"" - -text default ---9051914041544843365972754266-- -"; +".txt\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; var stream = new MemoryStream(); var bytes = Encoding.UTF8.GetBytes(body1); stream.Write(bytes, 0, bytes.Length); @@ -261,15 +256,14 @@ text default public async Task MutipartReader_ReadInvalidUtf8SurrogateHeader_ReplacementCharacters() { var body1 = -@"--9051914041544843365972754266 -Content-Disposition: form-data; name=""text"" filename=""a"; +"--9051914041544843365972754266\r\n" + +"Content-Disposition: form-data; name=\"text\" filename=\"a"; var body2 = -@".txt"" - -text default ---9051914041544843365972754266-- -"; +".txt\"\r\n" + +"\r\n" + +"text default\r\n" + +"--9051914041544843365972754266--\r\n"; var stream = new MemoryStream(); var bytes = Encoding.UTF8.GetBytes(body1); stream.Write(bytes, 0, bytes.Length); From 31dae8140527295d30195637ac2376426f33dd7f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 11:56:27 -0700 Subject: [PATCH 0529/1838] Short circuit empty inputs. --- src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index 2a559d0ec9..de801b29d4 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -41,6 +41,12 @@ namespace Microsoft.AspNet.WebUtilities { ValidateParameters(input.Length, offset, count); + // Special-case empty input + if (count == 0) + { + return new byte[0]; + } + // Assumption: input is base64url encoded without padding and contains no whitespace. // First, we need to add the padding characters back. From b62dde23e6b11534669541f28633d26741a48c35 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 12:09:27 -0700 Subject: [PATCH 0530/1838] Add quotes in project.json file. --- test/Microsoft.Framework.WebEncoders.Tests/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 5fb71938d1..b24bd45764 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -10,7 +10,7 @@ "test": "xunit.runner.aspnet" }, "compilationOptions": { - "allowUnsafe": true + "allowUnsafe": "true" }, "frameworks": { "dnx451": { } From 957a77219c464fad02ec4c771ec9689d3a6fe232 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 12:41:01 -0700 Subject: [PATCH 0531/1838] Use MemberData instead of InlineData. --- .../UnicodeHelpersTests.cs | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 9a2671023a..1984a61a53 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -29,15 +29,26 @@ namespace Microsoft.Framework.WebEncoders Assert.Same(retVal1, retVal2); } + public static TheoryData Utf16ScalarValues + { + get + { + var dataset = new TheoryData(); + dataset.Add(1, "a", (int)'a'); // normal BMP char, end of string + dataset.Add(2, "ab", (int)'a'); // normal BMP char, not end of string + dataset.Add(3, "\uDFFF", UnicodeReplacementChar); // trailing surrogate, end of string + dataset.Add(4, "\uDFFFx", UnicodeReplacementChar); // trailing surrogate, not end of string + dataset.Add(5, "\uD800", UnicodeReplacementChar); // leading surrogate, end of string + dataset.Add(6, "\uD800x", UnicodeReplacementChar); // leading surrogate, not end of string, followed by non-surrogate + dataset.Add(7, "\uD800\uD800", UnicodeReplacementChar); // leading surrogate, not end of string, followed by leading surrogate + dataset.Add(8, "\uD800\uDFFF", 0x103FF); // leading surrogate, not end of string, followed by trailing surrogate + + return dataset; + } + } + [Theory] - [InlineData(1, "a", (int)'a')] // normal BMP char, end of string - [InlineData(2, "ab", (int)'a')] // normal BMP char, not end of string - [InlineData(3, "\uDFFF", UnicodeReplacementChar)] // trailing surrogate, end of string - [InlineData(4, "\uDFFFx", UnicodeReplacementChar)] // trailing surrogate, not end of string - [InlineData(5, "\uD800", UnicodeReplacementChar)] // leading surrogate, end of string - [InlineData(6, "\uD800x", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by non-surrogate - [InlineData(7, "\uD800\uD800", UnicodeReplacementChar)] // leading surrogate, not end of string, followed by leading surrogate - [InlineData(8, "\uD800\uDFFF", 0x103FF)] // leading surrogate, not end of string, followed by trailing surrogate + [MemberData(nameof(Utf16ScalarValues))] public void GetScalarValueFromUtf16(int unused, string input, int expectedResult) { // The 'unused' parameter exists because the xunit runner can't distinguish From 8da763a14a0eb7d05f950722102add00b7d5e861 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 6 Apr 2015 13:52:08 -0700 Subject: [PATCH 0532/1838] Disable false positive date parser test. --- .../RangeConditionHeaderValueTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs index b47b03b026..14a65efdd2 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -112,7 +112,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] @@ -141,7 +141,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] + // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] From 6c9055cadcd1a715482751c75660e05cadb693ee Mon Sep 17 00:00:00 2001 From: Levi B Date: Wed, 1 Apr 2015 11:45:52 -0700 Subject: [PATCH 0533/1838] Fix CJK Ideographs and Hangul Syllables representation Characters in these blocks weren't correctly identified as assigned characters, which caused the encoders to always encode them, even if the ranges were in the allow list. --- .../unicode-7.0.0-defined-characters.bin | Bin 8192 -> 8192 bytes .../UnicodeHelpersTests.cs | 28 ++++++- .../DefinedCharListGenerator/Program.cs | 77 +++++++++++++++++- 3 files changed, 101 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin index c9b36c871d6146d5c25044cd405807c15641d3f3..06530d73cf6848c91b0f41b326dccf833192412a 100644 GIT binary patch delta 148 zcmZp0XmHrjz&3dS%Q+-`hRL2`@= retVal.Length) { continue; // don't care about supplementary chars } + if (name.EndsWith(", First>", StringComparison.Ordinal) || name.EndsWith(", Last>", StringComparison.Ordinal)) + { + // ignore spans - we'll handle them separately + continue; + } + if (codePoint == (uint)' ') { retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char @@ -184,6 +190,24 @@ namespace Microsoft.Framework.WebEncoders } } + // Handle known spans from Unicode 7.0.0's UnicodeData.txt + + // CJK Ideograph Extension A + for (int i = '\u3400'; i <= '\u4DB5'; i++) + { + retVal[i] = true; + } + // CJK Ideograph + for (int i = '\u4E00'; i <= '\u9FCC'; i++) + { + retVal[i] = true; + } + // Hangul Syllable + for (int i = '\uAC00'; i <= '\uD7A3'; i++) + { + retVal[i] = true; + } + // Finally, we need to make sure we've seen every category which contains // allowed characters. This provides extra defense against having a typo // in the list of categories. diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs index f98dd32f5b..edcd0f3602 100644 --- a/unicode/Generators/DefinedCharListGenerator/Program.cs +++ b/unicode/Generators/DefinedCharListGenerator/Program.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; @@ -19,6 +20,7 @@ namespace DefinedCharListGenerator const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1]; + Dictionary spans = new Dictionary(); // Read all defined characters from the input file. string[] allLines = File.ReadAllLines("UnicodeData.txt"); @@ -28,11 +30,33 @@ namespace DefinedCharListGenerator foreach (string line in allLines) { string[] splitLine = line.Split(new char[] { ';' }, 4); + uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); + string rawName = splitLine[1]; + string category = splitLine[2]; + + // spans go into their own dictionary for later processing + string spanName; + bool isStartOfSpan; + if (IsSpanDefinition(rawName, out spanName, out isStartOfSpan)) + { + if (isStartOfSpan) + { + spans.Add(spanName, new Span() { FirstCodePoint = codepoint, Category = category }); + } + else + { + var existingSpan = spans[spanName]; + Debug.Assert(existingSpan.FirstCodePoint != 0, "We should've seen the start of this span already."); + Debug.Assert(existingSpan.LastCodePoint == 0, "We shouldn't have seen the end of this span already."); + Debug.Assert(existingSpan.Category == category, "Span start Unicode category doesn't match span end Unicode category."); + existingSpan.LastCodePoint = codepoint; + } + continue; + } // We only allow certain categories of code points. // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case - uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); - string category = splitLine[2]; + if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category))) { continue; @@ -42,6 +66,21 @@ namespace DefinedCharListGenerator definedChars[codepoint] = true; } + // Next, populate characters that weren't defined on their own lines + // but which are instead defined as members of a named span. + foreach (var span in spans.Values) + { + if (IsAllowedUnicodeCategory(span.Category)) + { + Debug.Assert(span.FirstCodePoint <= MAX_UNICODE_CHAR); + Debug.Assert(span.LastCodePoint <= MAX_UNICODE_CHAR); + for (uint i = span.FirstCodePoint; i <= span.LastCodePoint; i++) + { + definedChars[i] = true; + } + } + } + // Finally, write the list of defined characters out as a bitmap. // Each consecutive block of 8 chars is written as a single byte. // For instance, the first byte of the output file contains the @@ -103,5 +142,39 @@ namespace DefinedCharListGenerator || category == "So" || category == "Cf"; /* other */ } + + private static bool IsSpanDefinition(string rawName, out string spanName, out bool isStartOfSpan) + { + // Spans are represented within angle brackets, such as the following: + // DC00;;Cs;0;L;;;;;N;;;;; + // DFFF;;Cs;0;L;;;;;N;;;;; + if (rawName.StartsWith("<", StringComparison.Ordinal)) + { + if (rawName.EndsWith(", First>", StringComparison.Ordinal)) + { + spanName = rawName.Substring(1, rawName.Length - 1 - ", First>".Length); + isStartOfSpan = true; + return true; + } + else if (rawName.EndsWith(", Last>", StringComparison.Ordinal)) + { + spanName = rawName.Substring(1, rawName.Length - 1 - ", Last>".Length); + isStartOfSpan = false; + return true; + } + } + + // not surrounded by <>, or or some other non-span + spanName = null; + isStartOfSpan = false; + return false; + } + + private class Span + { + public uint FirstCodePoint; + public uint LastCodePoint; + public string Category; + } } } From 40490593ce68dc2e078c020710d54588e89f3425 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 7 Apr 2015 14:45:23 -0700 Subject: [PATCH 0534/1838] Add serviceable attribute to projects. aspnet/DNX#1600 --- .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs | 3 ++- 3 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs index 5eb8f1ffac..23c410c805 100644 --- a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs @@ -35,4 +35,5 @@ using System.Runtime.InteropServices; // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("12A3EDBB-65B6-4D47-98FC-2B80CEC71E51")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.TestHost.Tests")] \ No newline at end of file +[assembly: InternalsVisibleTo("Microsoft.AspNet.TestHost.Tests")] +[assembly: AssemblyMetadata("Serviceable", "True")] From e2e14681d120f328e6e02232f7cd26326cd8839a Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 7 Apr 2015 14:45:42 -0700 Subject: [PATCH 0535/1838] Add serviceable attribute to projects. aspnet/DNX#1600 --- .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 6 ++++++ .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 6 ++++++ src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 6 ++++++ 10 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs index 9ee9efbfa5..694179e207 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -1,7 +1,9 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Reflection; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] +[assembly: AssemblyMetadata("Serviceable", "True")] diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..f5c6f4a83a --- /dev/null +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; + +[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file From 992f4bab5d4cb22caed2b42cfd575ceabba838ee Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 7 Apr 2015 16:15:15 -0700 Subject: [PATCH 0536/1838] Update .travis.yml and appveyor.yml to build quietly. --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5939a529e5..947bf868ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: csharp sudo: false script: - - ./build.sh verify \ No newline at end of file + - ./build.sh --quiet verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 3fab83e134..636a7618d3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ init: - git config --global core.autocrlf true build_script: - - build.cmd verify + - build.cmd --quiet verify clone_depth: 1 test: off deploy: off \ No newline at end of file From e0b09418722e2bcf1b7130f6229d84efebedbe2e Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Tue, 7 Apr 2015 16:15:21 -0700 Subject: [PATCH 0537/1838] Update .travis.yml and appveyor.yml to build quietly. --- .travis.yml | 2 +- appveyor.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5939a529e5..947bf868ee 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,4 @@ language: csharp sudo: false script: - - ./build.sh verify \ No newline at end of file + - ./build.sh --quiet verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 3fab83e134..636a7618d3 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ init: - git config --global core.autocrlf true build_script: - - build.cmd verify + - build.cmd --quiet verify clone_depth: 1 test: off deploy: off \ No newline at end of file From 043b0f204cbf6d3adda028c809461f681ec78b04 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 8 Apr 2015 14:22:51 -0700 Subject: [PATCH 0538/1838] Replace WebSocket dependency. Remove chained dependencies. --- src/Microsoft.AspNet.Http.Core/project.json | 15 +-------------- src/Microsoft.AspNet.Http.Interfaces/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 5 +---- 3 files changed, 3 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 61d978811d..2658e2f517 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -14,21 +14,8 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Text.Encoding": "4.0.10-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Text.Encoding": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index b327b3a467..3af7b3bdfb 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -5,8 +5,8 @@ "dnx451": {}, "dnxcore50": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets" : "4.0.0-beta-*", "System.Security.Claims": "4.0.0-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*" diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 33d1c1c46a..aad1a478bc 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -9,16 +9,13 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "Microsoft.Net.WebSocketAbstractions": "1.0.0-*", "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", "System.Diagnostics.Tools": "4.0.0-beta-*", "System.Globalization": "4.0.10-beta-*", "System.Globalization.Extensions": "4.0.0-beta-*", - "System.IO": "4.0.10-beta-*", "System.Linq": "4.0.0-beta-*", + "System.Net.WebSockets" : "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", From f337f8cd04459e541431df04d859b705f3d2f6f7 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 8 Apr 2015 14:27:38 -0700 Subject: [PATCH 0539/1838] Add TestServer.CreateBuilder overload --- src/Microsoft.AspNet.TestHost/TestServer.cs | 10 ++++++++-- .../Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 4 ---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 0e3a9927b5..f290092609 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -105,16 +105,22 @@ namespace Microsoft.AspNet.TestHost }); } - public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, ConfigureServicesDelegate configureServices) + public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config) { return new TestServerBuilder { FallbackServices = fallbackServices, - Startup = new StartupMethods(configureApp, configureServices), Config = config }; } + public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, ConfigureServicesDelegate configureServices) + { + var builder = CreateBuilder(fallbackServices, config); + builder.Startup = new StartupMethods(configureApp, configureServices); + return builder; + } + public HttpMessageHandler CreateHandler() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 19b54c06f5..c710d01da1 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -1,21 +1,17 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection; using Xunit; namespace Microsoft.AspNet.TestHost { public class TestClientTests { - private readonly IServiceProvider _services; private readonly TestServer _server; public TestClientTests() From fab55afca53f956e928df0aff5b09f7aa0fff674 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 8 Apr 2015 14:55:34 -0700 Subject: [PATCH 0540/1838] Update resource names --- src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs | 5 ++++- .../UnicodeHelpersTests.cs | 5 ++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs index 549f912e1a..2aa3dac0e0 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs @@ -34,7 +34,10 @@ namespace Microsoft.Framework.WebEncoders private static uint[] CreateDefinedCharacterBitmap() { // The stream should be exactly 8KB in size. - var stream = typeof(UnicodeHelpers).GetTypeInfo().Assembly.GetManifestResourceStream("compiler/resources/unicode-7.0.0-defined-characters.bin"); + var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly; + var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-7.0.0-defined-characters.bin"; + + var stream = assembly.GetManifestResourceStream(resourceName); if (stream.Length != 8 * 1024) { Environment.FailFast("Corrupt data detected."); diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 6be7c93bbc..4d34a40e96 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -157,7 +157,10 @@ namespace Microsoft.Framework.WebEncoders HashSet seenCategories = new HashSet(); bool[] retVal = new bool[0x10000]; - string[] allLines = new StreamReader(typeof(UnicodeHelpersTests).GetTypeInfo().Assembly.GetManifestResourceStream("../../unicode/UnicodeData.txt")).ReadAllLines(); + + var assembly = typeof(UnicodeHelpersTests).GetTypeInfo().Assembly; + var resourceName = assembly.GetName().Name + ".UnicodeData.txt"; + string[] allLines = new StreamReader(assembly.GetManifestResourceStream(resourceName)).ReadAllLines(); foreach (string line in allLines) { From 58f759ac25521207f8a1bd632c3740972cdf8e1e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 10 Apr 2015 09:51:01 -0700 Subject: [PATCH 0541/1838] Move IServerInformation to Hosting. --- src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs | 6 +++--- src/Microsoft.AspNet.Http/IApplicationBuilder.cs | 2 +- src/Microsoft.AspNet.Http/IServerInformation.cs | 10 ---------- 3 files changed, 4 insertions(+), 14 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs index 71f6ef267b..e7a00106c2 100644 --- a/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs @@ -36,15 +36,15 @@ namespace Microsoft.AspNet.Builder } } - public IServerInformation Server + public object Server { get { - return GetProperty(Constants.BuilderProperties.ServerInformation); + return GetProperty(Constants.BuilderProperties.ServerInformation); } set { - SetProperty(Constants.BuilderProperties.ServerInformation, value); + SetProperty(Constants.BuilderProperties.ServerInformation, value); } } diff --git a/src/Microsoft.AspNet.Http/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs index bed7c50f0d..cfecfd9728 100644 --- a/src/Microsoft.AspNet.Http/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/IApplicationBuilder.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Builder { IServiceProvider ApplicationServices { get; set; } - IServerInformation Server { get; set; } + object Server { get; set; } IDictionary Properties { get; set; } diff --git a/src/Microsoft.AspNet.Http/IServerInformation.cs b/src/Microsoft.AspNet.Http/IServerInformation.cs deleted file mode 100644 index e99042e637..0000000000 --- a/src/Microsoft.AspNet.Http/IServerInformation.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Builder -{ - public interface IServerInformation - { - string Name { get; } - } -} From 7fb8053700a467e0f3551fd26c55359f9ba1646b Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 10 Apr 2015 10:03:04 -0700 Subject: [PATCH 0542/1838] Move IServerInformation to Server.Interfaces. --- .../IServerFactory.cs | 1 - .../IServerInformation.cs | 10 ++++++++++ .../project.json | 1 - 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs index f389a1ec4c..fe46b8fc69 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs @@ -3,7 +3,6 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.Framework.ConfigurationModel; diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs new file mode 100644 index 0000000000..c30e0d00e3 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs @@ -0,0 +1,10 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Server +{ + public interface IServerInformation + { + string Name { get; } + } +} diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json index 88b8b45a6a..fd590e5417 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json @@ -2,7 +2,6 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*" }, From 03c47ad58205cba94483d969c6bf44ad323741be Mon Sep 17 00:00:00 2001 From: Ryan Meyer Date: Fri, 10 Apr 2015 16:05:44 -0700 Subject: [PATCH 0543/1838] Spelling mistake. Sorry I was looking at this code trying to track down a bug somewhere else and noticed a spelling mistake for a local variable. I know I tend to be anal about spelling, so figured I'd at least point it out. --- src/Microsoft.AspNet.Http.Core/FormFeature.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/FormFeature.cs b/src/Microsoft.AspNet.Http.Core/FormFeature.cs index 33f84e3745..3be19c7ebb 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/FormFeature.cs @@ -48,8 +48,8 @@ namespace Microsoft.AspNet.Http.Core return true; } - var conentType = ContentType; - return HasApplicationFormContentType(conentType) || HasMultipartFormContentType(conentType); + var contentType = ContentType; + return HasApplicationFormContentType(contentType) || HasMultipartFormContentType(contentType); } } From 09d6ab03bc537c18a53f857a98699d0326ee60f7 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 9 Apr 2015 15:54:43 -0700 Subject: [PATCH 0544/1838] Re-use public constants for header names. --- .../Collections/ResponseCookies.cs | 16 ++++++++-------- .../DefaultHttpContext.cs | 5 ++--- .../DefaultHttpRequest.cs | 10 +++++----- .../DefaultHttpResponse.cs | 10 +++++----- .../Infrastructure/Constants.cs | 19 ------------------- .../Infrastructure/ParsingHelpers.cs | 8 ++++---- .../RequestCookiesFeature.cs | 4 ++-- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 1 + 8 files changed, 27 insertions(+), 46 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index 056df67640..cfdd8798c7 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core.Collections { @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value) { - Headers.AppendValues(Constants.Headers.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); + Headers.AppendValues(HeaderNames.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); } /// @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Http.Core.Collections !expiresHasValue ? null : options.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss ", CultureInfo.InvariantCulture) + "GMT", !options.Secure ? null : "; secure", !options.HttpOnly ? null : "; HttpOnly"); - Headers.AppendValues("Set-Cookie", setCookieValue); + Headers.AppendValues(HeaderNames.SetCookie, setCookieValue); } /// @@ -73,14 +73,14 @@ namespace Microsoft.AspNet.Http.Core.Collections Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); var deleteCookies = new[] { UrlEncoder.Default.UrlEncode(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; - IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + IList existingValues = Headers.GetValues(HeaderNames.SetCookie); if (existingValues == null || existingValues.Count == 0) { - Headers.SetValues(Constants.Headers.SetCookie, deleteCookies); + Headers.SetValues(HeaderNames.SetCookie, deleteCookies); } else { - Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); + Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); } } @@ -112,10 +112,10 @@ namespace Microsoft.AspNet.Http.Core.Collections rejectPredicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); } - IList existingValues = Headers.GetValues(Constants.Headers.SetCookie); + IList existingValues = Headers.GetValues(HeaderNames.SetCookie); if (existingValues != null) { - Headers.SetValues(Constants.Headers.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); + Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); } Append(key, string.Empty, new CookieOptions diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 5ff30f1fc5..304099c3ff 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net.WebSockets; using System.Security.Claims; using System.Threading; @@ -13,8 +12,8 @@ using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -169,7 +168,7 @@ namespace Microsoft.AspNet.Http.Core { get { - return Request.Headers.GetValues(Constants.Headers.WebSocketSubProtocols) ?? EmptyList; + return Request.Headers.GetValues(HeaderNames.WebSocketSubProtocols) ?? EmptyList; } } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 5b59cad761..03dca77785 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -6,10 +6,10 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -113,7 +113,7 @@ namespace Microsoft.AspNet.Http.Core public override bool IsHttps { - get { return string.Equals("https", Scheme, StringComparison.OrdinalIgnoreCase); } + get { return string.Equals(Constants.Https, Scheme, StringComparison.OrdinalIgnoreCase); } } public override HostString Host @@ -145,8 +145,8 @@ namespace Microsoft.AspNet.Http.Core public override string ContentType { - get { return Headers[Constants.Headers.ContentType]; } - set { Headers[Constants.Headers.ContentType] = value; } + get { return Headers[HeaderNames.ContentType]; } + set { Headers[HeaderNames.ContentType] = value; } } public override bool HasFormContentType diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 6e23c35b15..0cb23010a0 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -11,8 +11,8 @@ using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -80,18 +80,18 @@ namespace Microsoft.AspNet.Http.Core { get { - var contentType = Headers[Constants.Headers.ContentType]; + var contentType = Headers[HeaderNames.ContentType]; return contentType; } set { if (string.IsNullOrWhiteSpace(value)) { - HttpResponseFeature.Headers.Remove(Constants.Headers.ContentType); + HttpResponseFeature.Headers.Remove(HeaderNames.ContentType); } else { - HttpResponseFeature.Headers[Constants.Headers.ContentType] = new[] { value }; + HttpResponseFeature.Headers[HeaderNames.ContentType] = new[] { value }; } } } @@ -127,7 +127,7 @@ namespace Microsoft.AspNet.Http.Core HttpResponseFeature.StatusCode = 302; } - Headers.Set(Constants.Headers.Location, location); + Headers.Set(HeaderNames.Location, location); } public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationSchemes) diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs index c918c4de33..67c3aecb76 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs @@ -7,25 +7,6 @@ namespace Microsoft.AspNet.Http.Infrastructure { internal const string Https = "HTTPS"; - internal const string HttpDateFormat = "r"; - - internal static class Headers - { - internal const string ContentType = "Content-Type"; - internal const string CacheControl = "Cache-Control"; - internal const string MediaType = "Media-Type"; - internal const string Accept = "Accept"; - internal const string AcceptCharset = "Accept-Charset"; - internal const string Host = "Host"; - internal const string ETag = "ETag"; - internal const string Location = "Location"; - internal const string ContentLength = "Content-Length"; - internal const string Cookie = "Cookie"; - internal const string SetCookie = "Set-Cookie"; - internal const string Expires = "Expires"; - internal const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; - } - internal static class BuilderProperties { internal static string ServerInformation = "server.Information"; diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs index d9c9a3540e..0831839bd7 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs @@ -6,8 +6,8 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core.Infrastructure { @@ -775,7 +775,7 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; - string rawValue = headers.Get(Constants.Headers.ContentLength); + string rawValue = headers.Get(HeaderNames.ContentLength); if (!string.IsNullOrWhiteSpace(rawValue) && long.TryParse(rawValue, styles, CultureInfo.InvariantCulture, out value)) { @@ -789,11 +789,11 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure { if (value.HasValue) { - headers[Constants.Headers.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); + headers[HeaderNames.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); } else { - headers.Remove(Constants.Headers.ContentLength); + headers.Remove(HeaderNames.ContentLength); } } } diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index a04d2b7016..46d7a4f249 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -6,8 +6,8 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; -using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core { @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Core } var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, Constants.Headers.Cookie) ?? string.Empty; + string cookiesHeader = ParsingHelpers.GetHeader(headers, HeaderNames.Cookie) ?? string.Empty; if (_cookiesCollection == null) { diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index 53f1d53dc9..d7f83090b8 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -54,6 +54,7 @@ namespace Microsoft.Net.Http.Headers public const string Vary = "Vary"; public const string Via = "Via"; public const string Warning = "Warning"; + public const string WebSocketSubProtocols = "Sec-WebSocket-Protocol"; public const string WWWAuthenticate = "WWW-Authenticate"; } } \ No newline at end of file From e818783ba4b818542a681be4a206dc40804c33a6 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 10 Apr 2015 12:06:09 -0700 Subject: [PATCH 0545/1838] #167: Update cookie APIs to use shared core. --- .../Collections/RequestCookiesCollection.cs | 28 +++-- .../Collections/ResponseCookies.cs | 47 ++++---- .../Infrastructure/ParsingHelpers.cs | 107 ------------------ .../RequestCookiesFeature.cs | 19 ++-- 4 files changed, 48 insertions(+), 153 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs index 36a91735a3..6f43aa3d07 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs @@ -4,8 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Core.Collections { @@ -73,12 +72,20 @@ namespace Microsoft.AspNet.Http.Core.Collections return _dictionary.TryGetValue(key, out value) ? new[] { value } : null; } - private static readonly char[] SemicolonAndComma = { ';', ',' }; - - public void Reparse(string cookiesHeader) + public void Reparse(IList values) { _dictionary.Clear(); - ParsingHelpers.ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, _dictionary); + + IList cookies; + if (CookieHeaderValue.TryParseList(values, out cookies)) + { + foreach (var cookie in cookies) + { + var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); + var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); + _dictionary[name] = value; + } + } } public IEnumerator> GetEnumerator() @@ -93,14 +100,5 @@ namespace Microsoft.AspNet.Http.Core.Collections { return GetEnumerator(); } - - private static readonly Action AddCookieCallback = (name, value, state) => - { - var dictionary = (IDictionary)state; - if (!dictionary.ContainsKey(name)) - { - dictionary.Add(name, value); - } - }; } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs index cfdd8798c7..45da572ccb 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Globalization; using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; @@ -34,7 +33,11 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value) { - Headers.AppendValues(HeaderNames.SetCookie, UrlEncoder.Default.UrlEncode(key) + "=" + UrlEncoder.Default.UrlEncode(value) + "; path=/"); + Headers.AppendValues(HeaderNames.SetCookie, + new SetCookieHeaderValue( + UrlEncoder.Default.UrlEncode(key), + UrlEncoder.Default.UrlEncode(value)) + { Path = "/" }.ToString()); } /// @@ -45,23 +48,17 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Append(string key, string value, [NotNull] CookieOptions options) { - bool domainHasValue = !string.IsNullOrEmpty(options.Domain); - bool pathHasValue = !string.IsNullOrEmpty(options.Path); - bool expiresHasValue = options.Expires.HasValue; - - string setCookieValue = string.Concat( - UrlEncoder.Default.UrlEncode(key), - "=", - UrlEncoder.Default.UrlEncode(value ?? string.Empty), - !domainHasValue ? null : "; domain=", - !domainHasValue ? null : options.Domain, - !pathHasValue ? null : "; path=", - !pathHasValue ? null : options.Path, - !expiresHasValue ? null : "; expires=", - !expiresHasValue ? null : options.Expires.Value.ToString("ddd, dd-MMM-yyyy HH:mm:ss ", CultureInfo.InvariantCulture) + "GMT", - !options.Secure ? null : "; secure", - !options.HttpOnly ? null : "; HttpOnly"); - Headers.AppendValues(HeaderNames.SetCookie, setCookieValue); + Headers.AppendValues(HeaderNames.SetCookie, + new SetCookieHeaderValue( + UrlEncoder.Default.UrlEncode(key), + UrlEncoder.Default.UrlEncode(value)) + { + Domain = options.Domain, + Path = options.Path, + Expires = options.Expires, + Secure = options.Secure, + HttpOnly = options.HttpOnly, + }.ToString()); } /// @@ -70,9 +67,10 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Delete(string key) { - Func predicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; + Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - var deleteCookies = new[] { UrlEncoder.Default.UrlEncode(key) + "=; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; + var deleteCookies = new[] { encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; IList existingValues = Headers.GetValues(HeaderNames.SetCookie); if (existingValues == null || existingValues.Count == 0) { @@ -91,6 +89,7 @@ namespace Microsoft.AspNet.Http.Core.Collections /// public void Delete(string key, [NotNull] CookieOptions options) { + var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); @@ -98,18 +97,18 @@ namespace Microsoft.AspNet.Http.Core.Collections if (domainHasValue) { rejectPredicate = value => - value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && value.IndexOf("domain=" + options.Domain, StringComparison.OrdinalIgnoreCase) != -1; } else if (pathHasValue) { rejectPredicate = value => - value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase) && + value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && value.IndexOf("path=" + options.Path, StringComparison.OrdinalIgnoreCase) != -1; } else { - rejectPredicate = value => value.StartsWith(key + "=", StringComparison.OrdinalIgnoreCase); + rejectPredicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); } IList existingValues = Headers.GetValues(HeaderNames.SetCookie); diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs index 0831839bd7..cf6a955d86 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs @@ -496,71 +496,6 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure internal static class ParsingHelpers { - private static readonly Action AddCookieCallback = (name, value, state) => - { - var dictionary = (IDictionary)state; - if (!dictionary.ContainsKey(name)) - { - dictionary.Add(name, value); - } - }; - - private static readonly char[] SemicolonAndComma = new[] { ';', ',' }; - - internal static T GetItem(HttpRequest request, string key) - { - object value; - return request.HttpContext.Items.TryGetValue(key, out value) ? (T)value : default(T); - } - - internal static void SetItem(HttpRequest request, string key, T value) - { - request.HttpContext.Items[key] = value; - } - - internal static void ParseCookies(string cookiesHeader, IDictionary cookiesCollection) - { - ParseDelimited(cookiesHeader, SemicolonAndComma, AddCookieCallback, cookiesCollection); - } - - internal static void ParseDelimited(string text, char[] delimiters, Action callback, object state) - { - int textLength = text.Length; - int equalIndex = text.IndexOf('='); - if (equalIndex == -1) - { - equalIndex = textLength; - } - int scanIndex = 0; - while (scanIndex < textLength) - { - int delimiterIndex = text.IndexOfAny(delimiters, scanIndex); - if (delimiterIndex == -1) - { - delimiterIndex = textLength; - } - if (equalIndex < delimiterIndex) - { - while (scanIndex != equalIndex && char.IsWhiteSpace(text[scanIndex])) - { - ++scanIndex; - } - string name = text.Substring(scanIndex, equalIndex - scanIndex); - string value = text.Substring(equalIndex + 1, delimiterIndex - equalIndex - 1); - callback( - Uri.UnescapeDataString(name.Replace('+', ' ')), - Uri.UnescapeDataString(value.Replace('+', ' ')), - state); - equalIndex = text.IndexOf('=', delimiterIndex); - if (equalIndex == -1) - { - equalIndex = textLength; - } - } - scanIndex = delimiterIndex + 1; - } - } - public static string GetHeader(IDictionary headers, string key) { string[] values = GetHeaderUnmodified(headers, key); @@ -729,48 +664,6 @@ namespace Microsoft.AspNet.Http.Core.Infrastructure } } - private static readonly Action AppendItemCallback = (name, value, state) => - { - var dictionary = (IDictionary>)state; - - List existing; - if (!dictionary.TryGetValue(name, out existing)) - { - dictionary.Add(name, new List(1) { value }); - } - else - { - existing.Add(value); - } - }; - - internal static string GetJoinedValue(IDictionary store, string key) - { - string[] values = GetUnmodifiedValues(store, key); - return values == null ? null : string.Join(",", values); - } - - internal static string[] GetUnmodifiedValues([NotNull] IDictionary store, string key) - { - string[] values; - return store.TryGetValue(key, out values) ? values : null; - } - - //internal static string GetHost(HttpRequest request) - //{ - // IHeaderDictionary headers = request.Headers; - - // string host = GetHeader(headers, "Host"); - // if (!string.IsNullOrWhiteSpace(host)) - // { - // return host; - // } - - // string localIpAddress = request.LocalIpAddress ?? "localhost"; - // var localPort = request.Get(OwinConstants.CommonKeys.LocalPort); - // return string.IsNullOrWhiteSpace(localPort) ? localIpAddress : (localIpAddress + ":" + localPort); - //} - public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs index 46d7a4f249..4a22b22a93 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Core.Collections; using Microsoft.AspNet.Http.Core.Infrastructure; @@ -15,7 +16,7 @@ namespace Microsoft.AspNet.Http.Core { private readonly IFeatureCollection _features; private readonly FeatureReference _request = FeatureReference.Default; - private string _cookiesHeader; + private string[] _cookieHeaders; private RequestCookiesCollection _cookiesCollection; private IReadableStringCollection _cookies; @@ -44,18 +45,22 @@ namespace Microsoft.AspNet.Http.Core } var headers = _request.Fetch(_features).Headers; - string cookiesHeader = ParsingHelpers.GetHeader(headers, HeaderNames.Cookie) ?? string.Empty; + string[] values; + if (!headers.TryGetValue(HeaderNames.Cookie, out values)) + { + values = new string[0]; + } if (_cookiesCollection == null) { + _cookieHeaders = values; _cookiesCollection = new RequestCookiesCollection(); - _cookiesCollection.Reparse(cookiesHeader); - _cookiesHeader = cookiesHeader; + _cookiesCollection.Reparse(values); } - else if (!string.Equals(_cookiesHeader, cookiesHeader, StringComparison.Ordinal)) + else if (!Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) { - _cookiesCollection.Reparse(cookiesHeader); - _cookiesHeader = cookiesHeader; + _cookieHeaders = values; + _cookiesCollection.Reparse(values); } return _cookiesCollection; From 98e70636fe67a37c17b3cb12b94065fd3de7ef80 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Wed, 15 Apr 2015 11:10:18 -0700 Subject: [PATCH 0546/1838] Adding a description for hosting interfaces package. Fixes: https://github.com/aspnet/Hosting/issues/193 --- src/Microsoft.AspNet.Hosting.Interfaces/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index 1bd0d4e29b..12c554a356 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 Hosting interfaces.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", From c69c289abf85a42c5eff156f1a571efd26ce407f Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 15 Apr 2015 11:15:40 -0700 Subject: [PATCH 0547/1838] Simplify Challenge flow --- .../Authentication/ChallengeContext.cs | 19 +++++++------ .../DefaultHttpResponse.cs | 10 +++---- .../Authentication/IChallengeContext.cs | 6 ++-- src/Microsoft.AspNet.Http/HttpResponse.cs | 28 +++---------------- 4 files changed, 21 insertions(+), 42 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs index 7b86337ccd..b47feedf45 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs @@ -4,33 +4,34 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Authentication; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Core.Authentication { public class ChallengeContext : IChallengeContext { - private List _accepted; + private bool _accepted; - public ChallengeContext([NotNull] IEnumerable authenticationSchemes, IDictionary properties) + public ChallengeContext(string authenticationScheme, IDictionary properties) { - AuthenticationSchemes = authenticationSchemes; + AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - _accepted = new List(); + + // The default Challenge with no scheme is always accepted + _accepted = string.IsNullOrEmpty(authenticationScheme); } - public IEnumerable AuthenticationSchemes { get; private set; } + public string AuthenticationScheme { get; private set; } public IDictionary Properties { get; private set; } - public IEnumerable Accepted + public bool Accepted { get { return _accepted; } } - public void Accept(string authenticationType, IDictionary description) + public void Accept() { - _accepted.Add(authenticationType); + _accepted = true; } } } diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs index 0cb23010a0..1c91cd5a0c 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs @@ -130,22 +130,20 @@ namespace Microsoft.AspNet.Http.Core Headers.Set(HeaderNames.Location, location); } - public override void Challenge(AuthenticationProperties properties, [NotNull] IEnumerable authenticationSchemes) + public override void Challenge(AuthenticationProperties properties, string authenticationScheme) { HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationSchemes, properties == null ? null : properties.Dictionary); + var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); if (handler != null) { handler.Challenge(challengeContext); } - // Verify all types ack'd - IEnumerable leftovers = authenticationSchemes.Except(challengeContext.Accepted); - if (leftovers.Any()) + if (!challengeContext.Accepted) { - throw new InvalidOperationException("The following authentication types were not accepted: " + string.Join(", ", leftovers)); + throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs index 3c6f2058de..26a90fefb2 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs @@ -7,9 +7,9 @@ namespace Microsoft.AspNet.Http.Authentication { public interface IChallengeContext { - IEnumerable AuthenticationSchemes {get;} - IDictionary Properties {get;} + string AuthenticationScheme { get; } + IDictionary Properties { get; } - void Accept(string authenticationType, IDictionary description); + void Accept(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http/HttpResponse.cs index 5fd8e099e0..97c0a63e50 100644 --- a/src/Microsoft.AspNet.Http/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http/HttpResponse.cs @@ -38,40 +38,20 @@ namespace Microsoft.AspNet.Http public virtual void Challenge() { - Challenge(new string[0]); + Challenge(properties: null, authenticationScheme: null); } public virtual void Challenge(AuthenticationProperties properties) { - Challenge(properties, new string[0]); + Challenge(properties, ""); } public virtual void Challenge(string authenticationScheme) { - Challenge(new[] { authenticationScheme }); + Challenge(properties: null, authenticationScheme: authenticationScheme); } - public virtual void Challenge(AuthenticationProperties properties, string authenticationScheme) - { - Challenge(properties, new[] { authenticationScheme }); - } - - public virtual void Challenge(params string[] authenticationSchemes) - { - Challenge((IEnumerable)authenticationSchemes); - } - - public virtual void Challenge(IEnumerable authenticationSchemes) - { - Challenge(properties: null, authenticationSchemes: authenticationSchemes); - } - - public virtual void Challenge(AuthenticationProperties properties, params string[] authenticationSchemes) - { - Challenge(properties, (IEnumerable)authenticationSchemes); - } - - public abstract void Challenge(AuthenticationProperties properties, IEnumerable authenticationSchemes); + public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); From 22a1cab976dce5dfdc2a96a40fe459145e4f7cfe Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 16 Apr 2015 11:41:41 -0700 Subject: [PATCH 0548/1838] #149 - Expose connection information as 1st class. --- .../DefaultConnectionInfo.cs | 76 +++++++++++++++++++ .../DefaultHttpContext.cs | 4 + .../DefaultHttpRequest.cs | 12 --- .../HttpClientCertificateFeature.cs | 23 ++++++ .../HttpConnectionFeature.cs | 24 ++++++ src/Microsoft.AspNet.Http.Core/project.json | 1 - src/Microsoft.AspNet.Http/ConnectionInfo.cs | 27 +++++++ src/Microsoft.AspNet.Http/HttpContext.cs | 4 +- src/Microsoft.AspNet.Http/project.json | 2 + 9 files changed, 159 insertions(+), 14 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs create mode 100644 src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs create mode 100644 src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs create mode 100644 src/Microsoft.AspNet.Http/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs new file mode 100644 index 0000000000..4cd327a9fe --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs @@ -0,0 +1,76 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Core.Infrastructure; + +namespace Microsoft.AspNet.Http.Core +{ + public class DefaultConnectionInfo : ConnectionInfo + { + private readonly IFeatureCollection _features; + + private FeatureReference _connection = FeatureReference.Default; + private FeatureReference _clientCertificate = FeatureReference.Default; + + public DefaultConnectionInfo(IFeatureCollection features) + { + _features = features; + } + + private IHttpConnectionFeature HttpConnectionFeature + { + get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); } + } + + private IHttpClientCertificateFeature HttpClientCertificateFeature + { + get { return _clientCertificate.Fetch(_features) ?? _clientCertificate.Update(_features, new HttpClientCertificateFeature()); } + } + + public override IPAddress RemoteIpAddress + { + get { return HttpConnectionFeature.RemoteIpAddress; } + set { HttpConnectionFeature.RemoteIpAddress = value; } + } + + public override int RemotePort + { + get { return HttpConnectionFeature.RemotePort; } + set { HttpConnectionFeature.RemotePort = value; } + } + + public override IPAddress LocalIpAddress + { + get { return HttpConnectionFeature.LocalIpAddress; } + set { HttpConnectionFeature.LocalIpAddress = value; } + } + + public override int LocalPort + { + get { return HttpConnectionFeature.LocalPort; } + set { HttpConnectionFeature.LocalPort = value; } + } + + public override bool IsLocal + { + get { return HttpConnectionFeature.IsLocal; } + set { HttpConnectionFeature.IsLocal = value; } + } + + public override X509Certificate ClientCertificate + { + get { return HttpClientCertificateFeature.ClientCertificate; } + set { HttpClientCertificateFeature.ClientCertificate = value; } + } + + public override Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()) + { + return HttpClientCertificateFeature.GetClientCertificateAsync(cancellationToken); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs index 304099c3ff..e8382c0022 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs @@ -23,6 +23,7 @@ namespace Microsoft.AspNet.Http.Core private readonly HttpRequest _request; private readonly HttpResponse _response; + private readonly ConnectionInfo _connection; private FeatureReference _items; private FeatureReference _serviceProviders; @@ -44,6 +45,7 @@ namespace Microsoft.AspNet.Http.Core _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); + _connection = new DefaultConnectionInfo(features); _items = FeatureReference.Default; _serviceProviders = FeatureReference.Default; @@ -87,6 +89,8 @@ namespace Microsoft.AspNet.Http.Core public override HttpResponse Response { get { return _response; } } + public override ConnectionInfo Connection { get { return _connection; } } + public override ClaimsPrincipal User { get diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs index 03dca77785..3e5e95e03a 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs @@ -19,8 +19,6 @@ namespace Microsoft.AspNet.Http.Core private readonly IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; - private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _clientCertificate = FeatureReference.Default; private FeatureReference _query = FeatureReference.Default; private FeatureReference _form = FeatureReference.Default; private FeatureReference _cookies = FeatureReference.Default; @@ -36,16 +34,6 @@ namespace Microsoft.AspNet.Http.Core get { return _request.Fetch(_features); } } - private IHttpConnectionFeature HttpConnectionFeature - { - get { return _connection.Fetch(_features); } - } - - private IHttpClientCertificateFeature HttpClientCertificateFeature - { - get { return _clientCertificate.Fetch(_features); } - } - private IQueryFeature QueryFeature { get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); } diff --git a/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs new file mode 100644 index 0000000000..dbdc0f14a9 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http.Core +{ + public class HttpClientCertificateFeature : IHttpClientCertificateFeature + { + public HttpClientCertificateFeature() + { + } + + public X509Certificate ClientCertificate { get; set; } + + public Task GetClientCertificateAsync(CancellationToken cancellationToken) + { + return Task.FromResult(ClientCertificate); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs new file mode 100644 index 0000000000..efe3e3aee6 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; + +namespace Microsoft.AspNet.Http.Core +{ + public class HttpConnectionFeature : IHttpConnectionFeature + { + public HttpConnectionFeature() + { + } + + public bool IsLocal { get; set; } + + public IPAddress LocalIpAddress { get; set; } + + public int LocalPort { get; set; } + + public IPAddress RemoteIpAddress { get; set; } + + public int RemotePort { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index 2658e2f517..a241a92cfb 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -7,7 +7,6 @@ "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http/ConnectionInfo.cs b/src/Microsoft.AspNet.Http/ConnectionInfo.cs new file mode 100644 index 0000000000..54175ec2f2 --- /dev/null +++ b/src/Microsoft.AspNet.Http/ConnectionInfo.cs @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Net; +using System.Security.Cryptography.X509Certificates; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + public abstract class ConnectionInfo + { + public abstract IPAddress RemoteIpAddress { get; set; } + + public abstract int RemotePort { get; set; } + + public abstract IPAddress LocalIpAddress { get; set; } + + public abstract int LocalPort { get; set; } + + public abstract bool IsLocal { get; set; } + + public abstract X509Certificate ClientCertificate { get; set; } + + public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http/HttpContext.cs index c69f882f91..47f595df17 100644 --- a/src/Microsoft.AspNet.Http/HttpContext.cs +++ b/src/Microsoft.AspNet.Http/HttpContext.cs @@ -18,8 +18,10 @@ namespace Microsoft.AspNet.Http public abstract HttpResponse Response { get; } + public abstract ConnectionInfo Connection { get; } + public abstract ClaimsPrincipal User { get; set; } - + public abstract IDictionary Items { get; } public abstract IServiceProvider ApplicationServices { get; set; } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index aad1a478bc..0a94666c50 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -14,10 +14,12 @@ "System.Globalization": "4.0.10-beta-*", "System.Globalization.Extensions": "4.0.0-beta-*", "System.Linq": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", "System.Net.WebSockets" : "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", "System.Security.Principal": "4.0.0-beta-*", "System.Threading.Tasks": "4.0.10-beta-*" } From d111e24da71abdcaa0a60a2c4a057926759d5d8c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 16 Apr 2015 12:07:50 -0700 Subject: [PATCH 0549/1838] #190 - Swap Http and Http.Core package names. Remove Http.Core namespace. --- HttpAbstractions.sln | 10 +++--- .../Authentication/AuthenticateResult.cs | 0 .../AuthenticationDescription.cs | 0 .../AuthenticationProperties.cs | 0 .../ConnectionInfo.cs | 0 .../CookieOptions.cs | 0 .../Extensions/MapExtensions.cs | 0 .../Extensions/MapMiddleware.cs | 0 .../Extensions/MapOptions.cs | 0 .../Extensions/MapWhenExtensions.cs | 0 .../Extensions/MapWhenMiddleware.cs | 0 .../Extensions/MapWhenOptions.cs | 0 .../Extensions/RunExtensions.cs | 0 .../Extensions/UseExtensions.cs | 0 .../FragmentString.cs | 0 .../HostString.cs | 0 .../HttpContext.cs | 0 .../HttpRequest.cs | 0 .../HttpResponse.cs | 0 .../HttpResponseWritingExtensions.cs | 0 .../IApplicationBuilder.cs | 0 .../IFormCollection.cs | 0 .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IHeaderDictionary.cs | 0 .../IReadableStringCollection.cs | 0 .../IResponseCookies.cs | 0 .../ISessionCollection.cs | 0 .../Microsoft.AspNet.Http.Core.xproj | 2 +- .../PathString.cs | 0 .../QueryString.cs | 0 .../RequestDelegate.cs | 0 src/Microsoft.AspNet.Http.Core/project.json | 23 ++++++++----- .../project.json | 2 +- .../ApplicationBuilder.cs | 0 .../Authentication/AuthenticateContext.cs | 4 +-- .../Authentication/ChallengeContext.cs | 4 +-- .../Authentication/DescribeSchemesContext.cs | 5 ++- .../HttpAuthenticationFeature.cs | 3 +- .../Authentication/SignInContext.cs | 3 +- .../Authentication/SignOutContext.cs | 3 +- .../BufferingHelper.cs | 2 +- .../Collections/FormCollection.cs | 2 +- .../Collections/FormFileCollection.cs | 3 +- .../Collections/HeaderDictionary.cs | 4 +-- .../Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 2 +- .../Collections/RequestCookiesCollection.cs | 2 +- .../Collections/ResponseCookies.cs | 2 +- .../Collections/SessionCollection.cs | 2 +- .../DefaultConnectionInfo.cs | 4 +-- .../DefaultHttpContext.cs | 7 ++-- .../DefaultHttpRequest.cs | 5 ++- .../DefaultHttpResponse.cs | 7 ++-- .../FormFeature.cs | 4 +-- .../FormFile.cs | 3 +- .../HttpClientCertificateFeature.cs | 2 +- .../HttpConnectionFeature.cs | 2 +- .../HttpRequestFeature.cs | 3 +- .../HttpResponseFeature.cs | 3 +- .../IFormFeature.cs | 2 +- .../IItemsFeature.cs | 2 +- .../IQueryFeature.cs | 4 +-- .../IRequestCookiesFeature.cs | 4 +-- .../IResponseCookiesFeature.cs | 5 +-- .../IServiceProvidersFeature.cs | 2 +- .../Infrastructure/Constants.cs | 0 .../Infrastructure/FeatureReference.cs | 2 +- .../Infrastructure/ParsingHelpers.cs | 2 +- .../ItemsFeature.cs | 2 +- .../Microsoft.AspNet.Http.xproj | 2 +- .../QueryFeature.cs | 6 ++-- .../ReferenceReadStream.cs | 2 +- .../RequestCookiesFeature.cs | 6 ++-- .../ResponseCookiesFeature.cs | 6 ++-- .../ServiceProvidersFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 4 +-- src/Microsoft.AspNet.Http/project.json | 23 +++++-------- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 1 - src/Microsoft.AspNet.Owin/project.json | 2 -- .../project.json | 4 +-- .../HttpResponseWritingExtensionsTests.cs | 1 - .../MapPathMiddlewareTests.cs | 1 - .../MapPredicateMiddlewareTests.cs | 1 - .../Microsoft.AspNet.Http.Core.Tests.xproj | 2 +- .../PathStringTests.cs | 0 .../project.json | 33 ++++++++----------- .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../HttpResponseSendingExtensionsTests.cs | 1 - .../SendFileResponseExtensionsTests.cs | 1 - .../UseWithServicesTests.cs | 1 - .../project.json | 2 -- .../ApplicationBuilderTests.cs | 2 +- .../BufferingHelperTests.cs | 2 +- .../DefaultHttpContextTests.cs | 3 +- .../DefaultHttpRequestTests.cs | 3 +- .../FormFeatureTests.cs | 2 +- .../HeaderDictionaryTests.cs | 4 +-- .../Microsoft.AspNet.Http.Tests.xproj | 2 +- .../QueryFeatureTests.cs | 3 +- test/Microsoft.AspNet.Http.Tests/project.json | 32 +++++++++--------- .../OwinEnvironmentTests.cs | 1 - test/Microsoft.AspNet.Owin.Tests/project.json | 3 -- 104 files changed, 129 insertions(+), 177 deletions(-) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Authentication/AuthenticateResult.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/CookieOptions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/FragmentString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HostString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpContext.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IFormCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IFormFile.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IReadableStringCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/ISessionCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/PathString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/QueryString.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Core}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/AuthenticateContext.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/ChallengeContext.cs (91%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/DescribeSchemesContext.cs (87%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/HttpAuthenticationFeature.cs (85%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/SignInContext.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Authentication/SignOutContext.cs (90%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/BufferingHelper.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/FormCollection.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/FormFileCollection.cs (93%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/HeaderDictionary.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/ItemsDictionary.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/ReadableStringCollection.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/RequestCookiesCollection.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/ResponseCookies.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Collections/SessionCollection.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultConnectionInfo.cs (96%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultHttpContext.cs (98%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultHttpRequest.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/DefaultHttpResponse.cs (97%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/FormFeature.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/FormFile.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpClientCertificateFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpConnectionFeature.cs (93%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpRequestFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/HttpResponseFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IFormFeature.cs (96%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IItemsFeature.cs (89%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IQueryFeature.cs (80%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IRequestCookiesFeature.cs (81%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IResponseCookiesFeature.cs (71%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/IServiceProvidersFeature.cs (90%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Infrastructure/Constants.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Infrastructure/FeatureReference.cs (95%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/Infrastructure/ParsingHelpers.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ItemsFeature.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/QueryFeature.cs (92%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ReferenceReadStream.cs (99%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/RequestCookiesFeature.cs (94%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ResponseCookiesFeature.cs (88%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/ServiceProvidersFeature.cs (91%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http}/WebSocketAcceptContext.cs (82%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/HttpResponseWritingExtensionsTests.cs (97%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/MapPathMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/MapPredicateMiddlewareTests.cs (99%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNet.Http.Core.Tests}/PathStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/ApplicationBuilderTests.cs (95%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/BufferingHelperTests.cs (92%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/DefaultHttpContextTests.cs (98%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/DefaultHttpRequestTests.cs (98%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/FormFeatureTests.cs (99%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/HeaderDictionaryTests.cs (91%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Tests}/QueryFeatureTests.cs (93%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index dbc423e462..18c4d05c9f 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,25 +1,25 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22710.0 +VisualStudioVersion = 14.0.22807.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNet.Http/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ConnectionInfo.cs rename to src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http/CookieOptions.cs b/src/Microsoft.AspNet.Http.Core/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/CookieOptions.cs rename to src/Microsoft.AspNet.Http.Core/CookieOptions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapOptions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/RunExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Extensions/UseExtensions.cs rename to src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Http/FragmentString.cs b/src/Microsoft.AspNet.Http.Core/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/FragmentString.cs rename to src/Microsoft.AspNet.Http.Core/FragmentString.cs diff --git a/src/Microsoft.AspNet.Http/HostString.cs b/src/Microsoft.AspNet.Http.Core/HostString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HostString.cs rename to src/Microsoft.AspNet.Http.Core/HostString.cs diff --git a/src/Microsoft.AspNet.Http/HttpContext.cs b/src/Microsoft.AspNet.Http.Core/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpContext.cs rename to src/Microsoft.AspNet.Http.Core/HttpContext.cs diff --git a/src/Microsoft.AspNet.Http/HttpRequest.cs b/src/Microsoft.AspNet.Http.Core/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpRequest.cs rename to src/Microsoft.AspNet.Http.Core/HttpRequest.cs diff --git a/src/Microsoft.AspNet.Http/HttpResponse.cs b/src/Microsoft.AspNet.Http.Core/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpResponse.cs rename to src/Microsoft.AspNet.Http.Core/HttpResponse.cs diff --git a/src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IApplicationBuilder.cs rename to src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http/IFormCollection.cs b/src/Microsoft.AspNet.Http.Core/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IFormCollection.cs rename to src/Microsoft.AspNet.Http.Core/IFormCollection.cs diff --git a/src/Microsoft.AspNet.Http/IFormFile.cs b/src/Microsoft.AspNet.Http.Core/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IFormFile.cs rename to src/Microsoft.AspNet.Http.Core/IFormFile.cs diff --git a/src/Microsoft.AspNet.Http/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IFormFileCollection.cs rename to src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IHeaderDictionary.cs rename to src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IReadableStringCollection.cs rename to src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs diff --git a/src/Microsoft.AspNet.Http/IResponseCookies.cs b/src/Microsoft.AspNet.Http.Core/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http/IResponseCookies.cs rename to src/Microsoft.AspNet.Http.Core/IResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Core/ISessionCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ISessionCollection.cs rename to src/Microsoft.AspNet.Http.Core/ISessionCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj index 447e54485b..67db5d869b 100644 --- a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj +++ b/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj @@ -6,7 +6,7 @@ - bcf0f967-8753-4438-bd07-aadca9ce509a + 22071333-15ba-4d16-a1d5-4d5b1a83fbdd ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.AspNet.Http/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/PathString.cs rename to src/Microsoft.AspNet.Http.Core/PathString.cs diff --git a/src/Microsoft.AspNet.Http/QueryString.cs b/src/Microsoft.AspNet.Http.Core/QueryString.cs similarity index 100% rename from src/Microsoft.AspNet.Http/QueryString.cs rename to src/Microsoft.AspNet.Http.Core/QueryString.cs diff --git a/src/Microsoft.AspNet.Http/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Core/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Http/RequestDelegate.cs rename to src/Microsoft.AspNet.Http.Core/RequestDelegate.cs diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Core/project.json index a241a92cfb..4f562544c9 100644 --- a/src/Microsoft.AspNet.Http.Core/project.json +++ b/src/Microsoft.AspNet.Http.Core/project.json @@ -1,20 +1,27 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Net.Http.Headers": "1.0.0-*" + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Text.Encoding": "4.0.10-beta-*" + "System.Collections": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets" : "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 415597b029..4055d3b43d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/ApplicationBuilder.cs rename to src/Microsoft.AspNet.Http/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs index ed0dd55eb7..91d530dfad 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs @@ -1,13 +1,11 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class AuthenticateContext : IAuthenticateContext { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs similarity index 91% rename from src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs index b47feedf45..0a137bb645 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs @@ -3,9 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class ChallengeContext : IChallengeContext { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs similarity index 87% rename from src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs index 6da55ce724..6e4907949d 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Authentication; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class DescribeSchemesContext : IDescribeSchemesContext { @@ -19,7 +18,7 @@ namespace Microsoft.AspNet.Http.Core.Authentication { get { return _results; } } - + public void Accept(IDictionary description) { _results.Add(new AuthenticationDescription(description)); diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs similarity index 85% rename from src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs index f67075e371..0a56cf4eaf 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs rename to src/Microsoft.AspNet.Http/Authentication/SignInContext.cs index 6d067c3919..1a77db412b 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs @@ -4,10 +4,9 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class SignInContext : ISignInContext { diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs similarity index 90% rename from src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs rename to src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs index 318be62c70..d78820980e 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs @@ -3,10 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Authentication; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Authentication +namespace Microsoft.AspNet.Http.Authentication { public class SignOutContext : ISignOutContext { diff --git a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/BufferingHelper.cs rename to src/Microsoft.AspNet.Http/BufferingHelper.cs index 3c0120f725..37c93d8392 100644 --- a/src/Microsoft.AspNet.Http.Core/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -6,7 +6,7 @@ using System.IO; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public static class BufferingHelper { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs rename to src/Microsoft.AspNet.Http/Collections/FormCollection.cs index ffef8fcaa2..fed0bb1b1c 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs similarity index 93% rename from src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs rename to src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs index d33992bff8..2844d1c60d 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs rename to src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs index 487f1c4190..ffff7d724f 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs @@ -5,10 +5,10 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs rename to src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs index 06c27fbc1e..ead480bdf1 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs index 38aa497e12..4977d04e08 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs @@ -5,7 +5,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs index 6f43aa3d07..0610faa880 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs rename to src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs index 45da572ccb..1636d4e739 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs @@ -8,7 +8,7 @@ using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs rename to src/Microsoft.AspNet.Http/Collections/SessionCollection.cs index df58e4a63f..d2147c6c4b 100644 --- a/src/Microsoft.AspNet.Http.Core/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core.Collections +namespace Microsoft.AspNet.Http.Collections { public class SessionCollection : ISessionCollection { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs similarity index 96% rename from src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs rename to src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 4cd327a9fe..f400f6aaff 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -6,9 +6,9 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultConnectionInfo : ConnectionInfo { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs similarity index 98% rename from src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs rename to src/Microsoft.AspNet.Http/DefaultHttpContext.cs index e8382c0022..81aef590ff 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -9,13 +9,12 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultHttpContext : HttpContext { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs rename to src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 3e5e95e03a..8f2a20e55c 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -6,12 +6,11 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs similarity index 97% rename from src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs rename to src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 1c91cd5a0c..a5a3e9a438 100644 --- a/src/Microsoft.AspNet.Http.Core/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -8,13 +8,12 @@ using System.Linq; using System.Security.Claims; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Core.Authentication; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNet.Http.Core/FormFeature.cs b/src/Microsoft.AspNet.Http/FormFeature.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/FormFeature.cs rename to src/Microsoft.AspNet.Http/FormFeature.cs index 3be19c7ebb..a8c490100f 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/FormFeature.cs @@ -7,12 +7,12 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNet.Http.Core/FormFile.cs b/src/Microsoft.AspNet.Http/FormFile.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/FormFile.cs rename to src/Microsoft.AspNet.Http/FormFile.cs index bbf0a52699..25e1081b2a 100644 --- a/src/Microsoft.AspNet.Http.Core/FormFile.cs +++ b/src/Microsoft.AspNet.Http/FormFile.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs index dbdc0f14a9..22ef21f704 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpClientCertificateFeature : IHttpClientCertificateFeature { diff --git a/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs similarity index 93% rename from src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http/HttpConnectionFeature.cs index efe3e3aee6..8f1a7c0123 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpConnectionFeature : IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs rename to src/Microsoft.AspNet.Http/HttpRequestFeature.cs index cefd16584c..e17746cc7d 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs @@ -4,9 +4,8 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs rename to src/Microsoft.AspNet.Http/HttpResponseFeature.cs index 509677f4a7..f0b9c7faeb 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs @@ -4,9 +4,8 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs b/src/Microsoft.AspNet.Http/IFormFeature.cs similarity index 96% rename from src/Microsoft.AspNet.Http.Core/IFormFeature.cs rename to src/Microsoft.AspNet.Http/IFormFeature.cs index 2447a8a3fe..0f8e97eb67 100644 --- a/src/Microsoft.AspNet.Http.Core/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IFormFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IItemsFeature.cs b/src/Microsoft.AspNet.Http/IItemsFeature.cs similarity index 89% rename from src/Microsoft.AspNet.Http.Core/IItemsFeature.cs rename to src/Microsoft.AspNet.Http/IItemsFeature.cs index a38a9cb720..876580ef79 100644 --- a/src/Microsoft.AspNet.Http.Core/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IItemsFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IQueryFeature.cs b/src/Microsoft.AspNet.Http/IQueryFeature.cs similarity index 80% rename from src/Microsoft.AspNet.Http.Core/IQueryFeature.cs rename to src/Microsoft.AspNet.Http/IQueryFeature.cs index 545200b3c5..086e9f189b 100644 --- a/src/Microsoft.AspNet.Http.Core/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/IQueryFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IQueryFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs similarity index 81% rename from src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs index d52e714c71..5ba34bb9a0 100644 --- a/src/Microsoft.AspNet.Http.Core/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs similarity index 71% rename from src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs index f33a15361b..b10b1c40c9 100644 --- a/src/Microsoft.AspNet.Http.Core/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs @@ -1,10 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core.Collections; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs similarity index 90% rename from src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs index 3435e53972..d2bb79b6c8 100644 --- a/src/Microsoft.AspNet.Http.Core/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Infrastructure/Constants.cs rename to src/Microsoft.AspNet.Http/Infrastructure/Constants.cs diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs similarity index 95% rename from src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs rename to src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs index f6db6e4fef..cea473a4ef 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs @@ -3,7 +3,7 @@ using Microsoft.AspNet.FeatureModel; -namespace Microsoft.AspNet.Http.Core.Infrastructure +namespace Microsoft.AspNet.Http.Infrastructure { internal struct FeatureReference { diff --git a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs index cf6a955d86..549bf51777 100644 --- a/src/Microsoft.AspNet.Http.Core/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core.Infrastructure +namespace Microsoft.AspNet.Http.Infrastructure { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNet.Http.Core/ItemsFeature.cs b/src/Microsoft.AspNet.Http/ItemsFeature.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/ItemsFeature.cs rename to src/Microsoft.AspNet.Http/ItemsFeature.cs index 50b32711a3..bb9d94ae15 100644 --- a/src/Microsoft.AspNet.Http.Core/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/ItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj index 67db5d869b..447e54485b 100644 --- a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj +++ b/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj @@ -6,7 +6,7 @@ - 22071333-15ba-4d16-a1d5-4d5b1a83fbdd + bcf0f967-8753-4438-bd07-aadca9ce509a ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs b/src/Microsoft.AspNet.Http/QueryFeature.cs similarity index 92% rename from src/Microsoft.AspNet.Http.Core/QueryFeature.cs rename to src/Microsoft.AspNet.Http/QueryFeature.cs index bda0ab5fc4..34643cf128 100644 --- a/src/Microsoft.AspNet.Http.Core/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/QueryFeature.cs @@ -3,12 +3,12 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs similarity index 99% rename from src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs rename to src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 4b1093a66a..5030e59ef3 100644 --- a/src/Microsoft.AspNet.Http.Core/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/RequestCookiesFeature.cs index 4a22b22a93..eb5e95ec79 100644 --- a/src/Microsoft.AspNet.Http.Core/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs @@ -5,12 +5,12 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs similarity index 88% rename from src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs index 11e3c098fa..651beded8d 100644 --- a/src/Microsoft.AspNet.Http.Core/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Collections; -using Microsoft.AspNet.Http.Core.Infrastructure; +using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Infrastructure; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs similarity index 91% rename from src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs index 9f218d9bbb..8a8c4b1551 100644 --- a/src/Microsoft.AspNet.Http.Core/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs similarity index 82% rename from src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs index aa857b1205..34747f900f 100644 --- a/src/Microsoft.AspNet.Http.Core/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs @@ -1,9 +1,7 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class WebSocketAcceptContext : IWebSocketAcceptContext { diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 0a94666c50..b554c9eabe 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,27 +1,20 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "description": "ASP.NET 5 HTTP feature implementations.", "dependencies": { + "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Net.WebSockets" : "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Diagnostics.Debug": "4.0.10-beta-*", + "System.Text.Encoding": "4.0.10-beta-*" } } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 4e37f6b218..75b1c88067 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -15,7 +15,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Core.Authentication; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index fe4b17d1ac..cfb647d88a 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -7,7 +7,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; -using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index e7274c329b..2fa0fca43b 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -3,8 +3,6 @@ "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 3b35b808af..320d7f0186 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -1,15 +1,13 @@ { "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { + "dnx451": { "dependencies": { "Shouldly": "1.1.1.1" } diff --git a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs similarity index 97% rename from test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs index c9692254f1..2388da9973 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,7 +3,6 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http diff --git a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs index 9bf4faaab6..e0d7b30689 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs @@ -4,7 +4,6 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs similarity index 99% rename from test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs index 1c0537beda..fef12361fd 100644 --- a/test/Microsoft.AspNet.Http.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Builder.Extensions diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj index c438cb7050..424d3a7f9b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj @@ -6,7 +6,7 @@ - aa99af26-f7b1-4a6b-a922-5c25539f6391 + f16692b8-9f38-4dca-a582-e43172b989c6 ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/test/Microsoft.AspNet.Http.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/PathStringTests.cs rename to test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Core.Tests/project.json index f943dd78c7..7faf925aae 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Core.Tests/project.json @@ -1,22 +1,17 @@ { - "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Moq": "4.2.1312.1622" - }, - "frameworkAssemblies": { - "System.Net.Http": "" - } - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Testing": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "Shouldly": "1.1.1.1" + } } + } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index a7e15c1844..ccd20be196 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Collections; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs index ce046ba3e7..6f30bc053a 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs @@ -4,7 +4,6 @@ using System.IO; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index f42fec5efa..07b6ed7163 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -3,7 +3,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Http.Extensions.Tests diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 66b5bb0ef4..0fa5e071cc 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http.Core; using Microsoft.Framework.DependencyInjection; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index a5bc898aaa..4287829625 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -2,8 +2,6 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, diff --git a/test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs similarity index 95% rename from test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 755eee5f76..21c1bd640d 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.Builder.Tests +namespace Microsoft.AspNet.Builder { public class ApplicationBuilderTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs similarity index 92% rename from test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs rename to test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs index 362849193c..7f35d274db 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs @@ -4,7 +4,7 @@ using System.IO; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class BufferingHelperTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs similarity index 98% rename from test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs rename to test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 02b040af69..d46ff5d6e7 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -7,11 +7,10 @@ using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Core.Authentication; using Microsoft.AspNet.Http.Authentication; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs similarity index 98% rename from test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 4ec7dff00f..69c0ea85e8 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -4,10 +4,9 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs similarity index 99% rename from test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 254a6800ea..270c364301 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.Http.Core +namespace Microsoft.AspNet.Http { public class FormFeatureTests { diff --git a/test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs similarity index 91% rename from test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs rename to test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 4bee6e446d..02082c9ec3 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Core.Collections; +using Microsoft.AspNet.Http.Collections; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj index 424d3a7f9b..c438cb7050 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj @@ -6,7 +6,7 @@ - f16692b8-9f38-4dca-a582-e43172b989c6 + aa99af26-f7b1-4a6b-a922-5c25539f6391 ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs similarity index 93% rename from test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 0fd91f5cd4..4a53e6205b 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -2,11 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; using Moq; using Xunit; -namespace Microsoft.AspNet.Http.Core.Tests +namespace Microsoft.AspNet.Http { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 5c51fc5e3f..42315e13eb 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,19 +1,19 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "Moq": "4.2.1312.1622" + }, + "frameworkAssemblies": { + "System.Net.Http": "" + } + } } - } } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index b98e99cfc1..68f7d7a103 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 3dbc5de4e6..79f1cafd16 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -1,10 +1,7 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From ee554439cf0c92073c0391715ed7e823aa9b2e24 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 16 Apr 2015 12:13:40 -0700 Subject: [PATCH 0550/1838] Handle Http.Core rename. --- src/Microsoft.AspNet.Hosting.Interfaces/project.json | 2 +- src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs | 1 - src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 1 - test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 1 - 5 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index 12c554a356..fa914dfcab 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 Hosting interfaces.", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Core": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 74312601df..f8411eee1a 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -3,7 +3,6 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 09c50d4135..8253c2503b 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,7 +6,7 @@ "Microsoft.AspNet.FileProviders": "1.0.0-*", "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", "Microsoft.AspNet.Hosting.Server.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 8d8855d81e..75a954296c 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -12,7 +12,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 74838032eb..f8772ee570 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -9,7 +9,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Core; using Xunit; namespace Microsoft.AspNet.TestHost From f5267fc14546c369c440db56569572568ae9a9d5 Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Thu, 16 Apr 2015 18:23:30 -0700 Subject: [PATCH 0551/1838] Rename SetInt & GetInt -> SetInt32 & GetInt32 Fixes #256 --- .../SessionCollectionExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs index d13f34be02..6a94e0f20c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Http { public static class SessionCollectionExtensions { - public static void SetInt(this ISessionCollection session, string key, int value) + public static void SetInt32(this ISessionCollection session, string key, int value) { var bytes = new byte[] { @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Http session.Set(key, bytes); } - public static int? GetInt(this ISessionCollection session, string key) + public static int? GetInt32(this ISessionCollection session, string key) { var data = session.Get(key); if (data == null || data.Length < 4) From 43c3913b86e60f6fd5dbfa1e0a4d72541909f4ee Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 12:18:09 -0700 Subject: [PATCH 0552/1838] #265 Remove setters for IApplcationBuilder.Properties and Server. --- .../IApplicationBuilder.cs | 4 ++-- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 12 +++++++----- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs index cfecfd9728..79e11d5a5c 100644 --- a/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs @@ -10,9 +10,9 @@ namespace Microsoft.AspNet.Builder { IServiceProvider ApplicationServices { get; set; } - object Server { get; set; } + object Server { get; } - IDictionary Properties { get; set; } + IDictionary Properties { get; } IApplicationBuilder Use(Func middleware); diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index e7a00106c2..3a284eb52a 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -19,6 +19,12 @@ namespace Microsoft.AspNet.Builder ApplicationServices = serviceProvider; } + public ApplicationBuilder(IServiceProvider serviceProvider, object server) + : this(serviceProvider) + { + SetProperty(Constants.BuilderProperties.ServerInformation, server); + } + private ApplicationBuilder(ApplicationBuilder builder) { Properties = builder.Properties; @@ -42,13 +48,9 @@ namespace Microsoft.AspNet.Builder { return GetProperty(Constants.BuilderProperties.ServerInformation); } - set - { - SetProperty(Constants.BuilderProperties.ServerInformation, value); - } } - public IDictionary Properties { get; set; } + public IDictionary Properties { get; } private T GetProperty(string key) { From 7d7cd5fde7a6679149e0197105c18fb9e9b1e1f4 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 12:28:02 -0700 Subject: [PATCH 0553/1838] #265 Remove some overloads for Run, Map, and MapWhen. --- .../Extensions/MapExtensions.cs | 13 ----- .../Extensions/MapWhenExtensions.cs | 26 +-------- .../Extensions/MapWhenMiddleware.cs | 20 ++----- .../Extensions/MapWhenOptions.cs | 5 -- .../Extensions/RunExtensions.cs | 20 ------- .../MapPathMiddlewareTests.cs | 16 +++--- .../MapPredicateMiddlewareTests.cs | 53 ------------------- 7 files changed, 12 insertions(+), 141 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs index 5f71a1b792..3a53395fda 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs @@ -10,19 +10,6 @@ namespace Microsoft.AspNet.Builder { public static class MapExtensions { - /// - /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of - /// continuing to the next component in the pipeline. - /// - /// - /// The path to match - /// The branch to take for positive path matches - /// - public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, [NotNull] string pathMatch, [NotNull] Action configuration) - { - return Map(app, new PathString(pathMatch), configuration); - } - /// /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of /// continuing to the next component in the pipeline. diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs index 117b8cacc1..30564a114b 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs @@ -5,12 +5,11 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { - using Microsoft.Framework.Internal; using Predicate = Func; - using PredicateAsync = Func>; /// /// Extension methods for the MapWhenMiddleware @@ -39,28 +38,5 @@ namespace Microsoft.AspNet.Builder }; return app.Use(next => new MapWhenMiddleware(next, options).Invoke); } - - /// - /// Branches the request pipeline based on the async result of the given predicate. - /// - /// - /// Invoked asynchronously with the request environment to determine if the branch should be taken - /// Configures a branch to take - /// - public static IApplicationBuilder MapWhenAsync([NotNull] this IApplicationBuilder app, [NotNull] PredicateAsync predicate, [NotNull] Action configuration) - { - // create branch - var branchBuilder = app.New(); - configuration(branchBuilder); - var branch = branchBuilder.Build(); - - // put middleware in pipeline - var options = new MapWhenOptions - { - PredicateAsync = predicate, - Branch = branch, - }; - return app.Use(next => new MapWhenMiddleware(next, options).Invoke); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs index b4f5c78b0b..ab0e2d3dbf 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs @@ -20,27 +20,13 @@ namespace Microsoft.AspNet.Builder.Extensions public async Task Invoke([NotNull] HttpContext context) { - if (_options.Predicate != null) + if (_options.Predicate(context)) { - if (_options.Predicate(context)) - { - await _options.Branch(context); - } - else - { - await _next(context); - } + await _options.Branch(context); } else { - if (await _options.PredicateAsync(context)) - { - await _options.Branch(context); - } - else - { - await _next(context); - } + await _next(context); } } } diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs index c94b15f181..27a9d9b1be 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs @@ -17,11 +17,6 @@ namespace Microsoft.AspNet.Builder.Extensions /// public Func Predicate { get; set; } - /// - /// The async user callback that determines if the branch should be taken - /// - public Func> PredicateAsync { get; set; } - /// /// The branch taken for a positive match /// diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs index c0cb5af259..ad103c3d1e 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs @@ -14,25 +14,5 @@ namespace Microsoft.AspNet.Builder { app.Use(_ => handler); } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1) => handler(ctx, s1)); - } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1, s2) => handler(ctx, s1, s2)); - } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1, s2, s3) => handler(ctx, s1, s2, s3)); - } - - public static void Run(this IApplicationBuilder app, Func handler) - { - app.Use((ctx, _, s1, s2, s3, s4) => handler(ctx, s1, s2, s3, s4)); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs index e0d7b30689..071e8fbdaf 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, UseSuccess); + builder.Map(new PathString(matchPath), UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); + builder.Map(new PathString(matchPath), subBuilder => subBuilder.Run(Success)); var app = builder.Build(); app.Invoke(context).Wait(); @@ -96,7 +96,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); + Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(new PathString(matchPath), map => { }).Build()); } [Theory] @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, UseNotImplemented); + builder.Map(new PathString(matchPath), UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(matchPath, UseNotImplemented); + builder.Map(new PathString(matchPath), UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -147,12 +147,12 @@ namespace Microsoft.AspNet.Builder.Extensions public void ChainedRoutes_Success() { var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map("/route1", map => + builder.Map(new PathString("/route1"), map => { - map.Map((string)"/subroute1", UseSuccess); + map.Map(new PathString("/subroute1"), UseSuccess); map.Run(NotImplemented); }); - builder.Map("/route2/subroute2", UseSuccess); + builder.Map(new PathString("/route2/subroute2"), UseSuccess); var app = builder.Build(); HttpContext context = CreateRequest(string.Empty, "/route1"); diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs index fef12361fd..29b6eac3ff 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs @@ -16,7 +16,6 @@ namespace Microsoft.AspNet.Builder.Extensions public class MapPredicateMiddlewareTests { private static readonly Predicate NotImplementedPredicate = new Predicate(envionment => { throw new NotImplementedException(); }); - private static readonly PredicateAsync NotImplementedPredicateAsync = new PredicateAsync(envionment => { throw new NotImplementedException(); }); private static Task Success(HttpContext context) { @@ -49,16 +48,6 @@ namespace Microsoft.AspNet.Builder.Extensions return false; } - private Task TruePredicateAsync(HttpContext context) - { - return Task.FromResult(true); - } - - private Task FalsePredicateAsync(HttpContext context) - { - return Task.FromResult(false); - } - [Fact] public void NullArguments_ArgumentNullException() { @@ -113,31 +102,6 @@ namespace Microsoft.AspNet.Builder.Extensions Assert.Equal(200, context.Response.StatusCode); } - [Fact] - public void PredicateAsyncTrueAction_BranchTaken() - { - HttpContext context = CreateRequest(); - var builder = new ApplicationBuilder(serviceProvider: null); - builder.MapWhenAsync(TruePredicateAsync, UseSuccess); - var app = builder.Build(); - app.Invoke(context).Wait(); - - Assert.Equal(200, context.Response.StatusCode); - } - - [Fact] - public void PredicateAsyncFalseAction_PassThrough() - { - HttpContext context = CreateRequest(); - var builder = new ApplicationBuilder(serviceProvider: null); - builder.MapWhenAsync(FalsePredicateAsync, UseNotImplemented); - builder.Run(Success); - var app = builder.Build(); - app.Invoke(context).Wait(); - - Assert.Equal(200, context.Response.StatusCode); - } - [Fact] public void ChainedPredicates_Success() { @@ -155,23 +119,6 @@ namespace Microsoft.AspNet.Builder.Extensions Assert.Equal(200, context.Response.StatusCode); } - [Fact] - public void ChainedPredicatesAsync_Success() - { - var builder = new ApplicationBuilder(serviceProvider: null); - builder.MapWhenAsync(TruePredicateAsync, map1 => - { - map1.MapWhenAsync((PredicateAsync)FalsePredicateAsync, UseNotImplemented); - map1.MapWhenAsync((PredicateAsync)TruePredicateAsync, map2 => map2.MapWhenAsync((PredicateAsync)TruePredicateAsync, UseSuccess)); - map1.Run(NotImplemented); - }); - var app = builder.Build(); - - HttpContext context = CreateRequest(); - app.Invoke(context).Wait(); - Assert.Equal(200, context.Response.StatusCode); - } - private HttpContext CreateRequest() { HttpContext context = new DefaultHttpContext(); From fc96d4d3a53a3f72fc9bab78a712f3e24b6d0a05 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 17 Apr 2015 12:25:57 -0700 Subject: [PATCH 0554/1838] Server deployment helpers in testing repo. --- Hosting.sln | 17 +- .../Common/DeploymentParameters.cs | 104 ++++++++ .../Common/DeploymentResult.cs | 34 +++ .../Common/DotnetArchitecture.cs | 11 + .../Common/DotnetFlavor.cs | 12 + .../Common/RetryHelper.cs | 74 ++++++ .../Common/ServerType.cs | 14 ++ .../Deployers/ApplicationDeployer.cs | 227 ++++++++++++++++++ .../Deployers/ApplicationDeployerFactory.cs | 57 +++++ .../Deployers/IApplicationDeployer.cs | 19 ++ .../Deployers/IISDeployer.cs | 213 ++++++++++++++++ .../Deployers/IISExpressDeployer.cs | 208 ++++++++++++++++ .../Deployers/MonoDeployer.cs | 111 +++++++++ .../Deployers/SelfHostDeployer.cs | 95 ++++++++ .../Microsoft.AspNet.Server.Testing.xproj | 20 ++ .../project.json | 31 +++ .../xunit/SkipIfCurrentRuntimeIsCoreClr.cs | 32 +++ ...fIISNativeVariationsNotEnabledAttribute.cs | 33 +++ .../SkipIfIISVariationsNotEnabledAttribute.cs | 33 +++ .../xunit/SkipOn32BitOSAttribute.cs | 33 +++ 20 files changed, 1377 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj create mode 100644 src/Microsoft.AspNet.Server.Testing/project.json create mode 100644 src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs create mode 100644 src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs diff --git a/Hosting.sln b/Hosting.sln index fd29a14db9..b7b4361fe4 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22710.0 +VisualStudioVersion = 14.0.22803.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -24,6 +24,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.In EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Interfaces", "src\Microsoft.AspNet.Hosting.Server.Interfaces\Microsoft.AspNet.Hosting.Server.Interfaces.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Testing", "src\Microsoft.AspNet.Server.Testing\Microsoft.AspNet.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -98,6 +100,18 @@ Global {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|Mixed Platforms.Build.0 = Release|Any CPU {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|x86.ActiveCfg = Release|Any CPU {FDBBA081-5248-4FC0-9E08-B46BEF3FA438}.Release|x86.Build.0 = Release|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Debug|x86.Build.0 = Debug|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Release|Any CPU.Build.0 = Release|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Release|x86.ActiveCfg = Release|Any CPU + {3DA89347-6731-4366-80C4-548F24E8607B}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -109,5 +123,6 @@ Global {D4F18D58-52B1-435D-A012-10F2CDF158C4} = {FEB39027-9158-4DE2-997F-7ADAEF8188D0} {BB780FBB-7842-4759-8DE7-96FA2E5571C1} = {E0497F39-AFFB-4819-A116-E39E361915AB} {FDBBA081-5248-4FC0-9E08-B46BEF3FA438} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {3DA89347-6731-4366-80C4-548F24E8607B} = {E0497F39-AFFB-4819-A116-E39E361915AB} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs new file mode 100644 index 0000000000..39278112b2 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs @@ -0,0 +1,104 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Parameters to control application deployment. + /// + public class DeploymentParameters + { + /// + /// Creates an instance of . + /// + /// Source code location of the target location to be deployed. + /// Where to be deployed on. + /// Flavor of the clr to run against. + /// Architecture of the DNX to be used. + public DeploymentParameters( + string applicationPath, + ServerType serverType, + RuntimeFlavor runtimeFlavor, + RuntimeArchitecture runtimeArchitecture) + { + if (string.IsNullOrEmpty(applicationPath)) + { + throw new ArgumentException("Value cannot be null.", "applicationPath"); + } + + if (!Directory.Exists(applicationPath)) + { + throw new DirectoryNotFoundException(string.Format("Application path {0} does not exist.", applicationPath)); + } + + ApplicationPath = applicationPath; + ServerType = serverType; + RuntimeFlavor = runtimeFlavor; + RuntimeArchitecture = runtimeArchitecture; + } + + public ServerType ServerType { get; private set; } + + public RuntimeFlavor RuntimeFlavor { get; private set; } + + public RuntimeArchitecture RuntimeArchitecture { get; private set; } + + /// + /// Suggested base url for the deployed application. The final deployed url could be + /// different than this. Use for the + /// deployed url. + /// + public string ApplicationBaseUriHint { get; set; } + + public string EnvironmentName { get; set; } + + public string ApplicationHostConfigTemplateContent { get; set; } + + public string ApplicationHostConfigLocation { get; set; } + + public string SiteName { get; set; } + + public string ApplicationPath { get; set; } + + /// + /// To publish the application before deployment. + /// + public bool PublishApplicationBeforeDeployment { get; set; } + + public string PublishedApplicationRootPath { get; set; } + + /// + /// Passes the --no-source option when publishing. + /// + public bool PublishWithNoSource { get; set; } + + public string DnxRuntime { get; set; } + + /// + /// Environment variables to be set before starting the host. + /// Not applicable for IIS Scenarios. + /// + public List> EnvironmentVariables { get; private set; } = new List>(); + + /// + /// For any application level cleanup to be invoked after performing host cleanup. + /// + public Action UserAdditionalCleanup { get; set; } + + public override string ToString() + { + return string.Format( + "[Variation] :: ServerType={0}, Runtime={1}, Arch={2}, BaseUrlHint={3}, Publish={4}, NoSource={5}", + ServerType, + RuntimeFlavor, + RuntimeArchitecture, + ApplicationBaseUriHint, + PublishApplicationBeforeDeployment, + PublishWithNoSource); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs new file mode 100644 index 0000000000..6a2c1a69d4 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Result of a deployment. + /// + public class DeploymentResult + { + /// + /// Base Uri of the deployment application. + /// + public string ApplicationBaseUri { get; set; } + + /// + /// The web root folder where the application is hosted. This path can be different from the + /// original application source location if published before deployment. + /// + public string WebRootLocation { get; set; } + + /// + /// Original deployment parameters used for this deployment. + /// + public DeploymentParameters DeploymentParameters { get; set; } + + /// + /// Triggered when the host process dies or pulled down. + /// + public CancellationToken HostShutdownToken { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs b/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs new file mode 100644 index 0000000000..11b1a3d5e3 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs @@ -0,0 +1,11 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Server.Testing +{ + public enum RuntimeArchitecture + { + x64, + x86 + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs b/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs new file mode 100644 index 0000000000..99913581b7 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Server.Testing +{ + public enum RuntimeFlavor + { + Clr, + CoreClr, + Mono + } +} diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs new file mode 100644 index 0000000000..1c6e6949dd --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.Testing +{ + public class RetryHelper + { + /// + /// Retries every 1 sec for 60 times by default. + /// + /// + /// + /// + /// + public static async Task RetryRequest( + Func> retryBlock, + ILogger logger, + CancellationToken cancellationToken = default(CancellationToken), + int retryCount = 60) + { + for (int retry = 0; retry < retryCount; retry++) + { + try + { + if (cancellationToken.IsCancellationRequested) + { + logger.LogInformation("Stopping retry as cancellation token is triggered."); + break; + } + + logger.LogWarning("Retry count {retryCount}..", retry + 1); + var response = await retryBlock(); + + if (response.StatusCode == HttpStatusCode.ServiceUnavailable) + { + // Automatically retry on 503. May be application is still booting. + logger.LogWarning("Retrying a service unavailable error."); + continue; + } + + return response; //Went through successfully + } + catch (Exception exception) + { + if (retry == retryCount - 1) + { + throw; + } + else + { + if (exception is HttpRequestException +#if DNX451 + || exception is System.Net.WebException +#endif + ) + { + logger.LogWarning("Failed to complete the request : {0}.", exception.Message); + await Task.Delay(1 * 1000); //Wait for a while before retry. + } + } + } + } + + return null; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs b/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs new file mode 100644 index 0000000000..9756b1496b --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Server.Testing +{ + public enum ServerType + { + IISExpress, + IIS, + IISNativeModule, + WebListener, + Kestrel + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs new file mode 100644 index 0000000000..c974840a22 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -0,0 +1,227 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Text.RegularExpressions; +using System.Threading; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Abstract base class of all deplolyers with a back bone implementation of some of the common helpers. + /// + public abstract class ApplicationDeployer : IApplicationDeployer + { + protected string ChosenRuntimePath { get; set; } + + protected string ChosenRuntimeName { get; set; } + + protected DeploymentParameters DeploymentParameters { get; private set; } + + protected ILogger Logger { get; private set; } + + protected Stopwatch StopWatch { get; private set; } = new Stopwatch(); + + public abstract DeploymentResult Deploy(); + + public ApplicationDeployer( + DeploymentParameters deploymentParameters, + ILogger logger) + { + DeploymentParameters = deploymentParameters; + Logger = logger; + } + + protected string PopulateChosenRuntimeInformation() + { + var runtimePath = Process.GetCurrentProcess().MainModule.FileName; + Logger.LogInformation(string.Empty); + Logger.LogInformation("Current runtime path is : {0}", runtimePath); + + var replaceStr = new StringBuilder(). + Append("dnx"). + Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr"). + Append("-win"). + Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64"). + ToString(); + + runtimePath = Regex.Replace(runtimePath, "dnx-(clr|coreclr)-win-(x86|x64)", replaceStr, RegexOptions.IgnoreCase); + ChosenRuntimePath = Path.GetDirectoryName(runtimePath); + + var runtimeDirectoryInfo = new DirectoryInfo(ChosenRuntimePath); + if (!runtimeDirectoryInfo.Exists) + { + throw new Exception( + string.Format("Requested runtime at location '{0}' does not exist. Please make sure it is installed before running test.", + runtimeDirectoryInfo.FullName)); + } + + ChosenRuntimeName = runtimeDirectoryInfo.Parent.Name; + Logger.LogInformation(string.Empty); + Logger.LogInformation("Changing to use runtime : {runtimeName}", ChosenRuntimeName); + return ChosenRuntimeName; + } + + protected void DnuPublish(string publishRoot = null) + { + DeploymentParameters.PublishedApplicationRootPath = Path.Combine(publishRoot ?? Path.GetTempPath(), Guid.NewGuid().ToString()); + + var parameters = + string.Format( + "publish {0} -o {1} --runtime {2} {3}", + DeploymentParameters.ApplicationPath, + DeploymentParameters.PublishedApplicationRootPath, + DeploymentParameters.DnxRuntime, + DeploymentParameters.PublishWithNoSource ? "--no-source" : string.Empty); + + Logger.LogInformation("Executing command dnu {args}", parameters); + + var startInfo = new ProcessStartInfo + { + FileName = Path.Combine(ChosenRuntimePath, "dnu.cmd"), + Arguments = parameters, + UseShellExecute = false, + CreateNoWindow = true + }; + + var hostProcess = Process.Start(startInfo); + hostProcess.WaitForExit(60 * 1000); + + DeploymentParameters.ApplicationPath = + (DeploymentParameters.ServerType == ServerType.IISExpress || + DeploymentParameters.ServerType == ServerType.IISNativeModule || + DeploymentParameters.ServerType == ServerType.IIS) ? + Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "wwwroot") : + Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "approot", "src", + new DirectoryInfo(DeploymentParameters.ApplicationPath).Name); + + Logger.LogInformation("dnu publish finished with exit code : {exitCode}", hostProcess.ExitCode); + } + + protected void CleanPublishedOutput() + { + try + { + // We've originally published the application in a temp folder. We need to delete it. + Directory.Delete(DeploymentParameters.PublishedApplicationRootPath, true); + } + catch (Exception exception) + { + Logger.LogWarning("Failed to delete directory : {error}", exception.Message); + } + } + + protected void ShutDownIfAnyHostProcess(Process hostProcess) + { + if (hostProcess != null && !hostProcess.HasExited) + { + // Shutdown the host process. + hostProcess.Kill(); + hostProcess.WaitForExit(5 * 1000); + if (!hostProcess.HasExited) + { + Logger.LogWarning("Unable to terminate the host process with process Id '{processId}", hostProcess.Id); + } + else + { + Logger.LogInformation("Successfully terminated host process with process Id '{processId}'", hostProcess.Id); + } + } + else + { + Logger.LogWarning("Host process already exited or never started successfully."); + } + } + + protected void AddEnvironmentVariablesToProcess(ProcessStartInfo startInfo) + { + var environment = +#if DNX451 + startInfo.EnvironmentVariables; +#elif DNXCORE50 + startInfo.Environment; +#endif + + SetEnvironmentVariable(environment, "ASPNET_ENV", DeploymentParameters.EnvironmentName); + + // Work around for https://github.com/aspnet/dnx/issues/1515 + if (DeploymentParameters.PublishWithNoSource) + { + SetEnvironmentVariable(environment, "DNX_PACKAGES", null); + } + + SetEnvironmentVariable(environment, "DNX_DEFAULT_LIB", null); + + foreach (var environmentVariable in DeploymentParameters.EnvironmentVariables) + { + SetEnvironmentVariable(environment, environmentVariable.Key, environmentVariable.Value); + } + } + +#if DNX451 + protected void SetEnvironmentVariable(System.Collections.Specialized.StringDictionary environment, string name, string value) + { +#elif DNXCORE50 + protected void SetEnvironmentVariable(System.Collections.Generic.IDictionary environment, string name, string value) + { +#endif + if (value == null) + { + Logger.LogInformation("Removing environment variable {name}", name); + environment.Remove(name); + } + else + { + Logger.LogInformation("SET {name}={value}", name, value); + environment[name] = value; + } + } + + protected void InvokeUserApplicationCleanup() + { + if (DeploymentParameters.UserAdditionalCleanup != null) + { + // User cleanup. + try + { + DeploymentParameters.UserAdditionalCleanup(DeploymentParameters); + } + catch (Exception exception) + { + Logger.LogWarning("User cleanup code failed with exception : {exception}", exception.Message); + } + } + } + + protected void TriggerHostShutdown(CancellationTokenSource hostShutdownSource) + { + Logger.LogInformation("Host process shutting down."); + try + { + hostShutdownSource.Cancel(); + } + catch (Exception) + { + // Suppress errors. + } + } + + protected void StartTimer() + { + Logger.LogInformation("Deploying {VariationDetails}", DeploymentParameters.ToString()); + StopWatch.Start(); + } + + protected void StopTimer() + { + StopWatch.Stop(); + Logger.LogInformation("[Time]: Total time taken for this test variation '{t}' seconds", StopWatch.Elapsed.TotalSeconds); + } + + public abstract void Dispose(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs new file mode 100644 index 0000000000..5308609815 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Factory to create an appropriate deployer based on . + /// + public class ApplicationDeployerFactory + { + /// + /// Creates a deployer instance based on settings in . + /// + /// + /// + /// + public static IApplicationDeployer Create(DeploymentParameters deploymentParameters, ILogger logger) + { + if (deploymentParameters == null) + { + throw new ArgumentNullException(nameof(deploymentParameters)); + } + + if (logger == null) + { + throw new ArgumentNullException(nameof(logger)); + } + + if (deploymentParameters.RuntimeFlavor == RuntimeFlavor.Mono) + { + return new MonoDeployer(deploymentParameters, logger); + } + + switch (deploymentParameters.ServerType) + { + case ServerType.IISExpress: + return new IISExpressDeployer(deploymentParameters, logger); +#if DNX451 + case ServerType.IIS: + case ServerType.IISNativeModule: + return new IISDeployer(deploymentParameters, logger); +#endif + case ServerType.WebListener: + case ServerType.Kestrel: + return new SelfHostDeployer(deploymentParameters, logger); + default: + throw new NotSupportedException( + string.Format("Found no deployers suitable for server type '{0}' with the current runtime.", + deploymentParameters.ServerType) + ); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs new file mode 100644 index 0000000000..c027632ccd --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs @@ -0,0 +1,19 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Common operations on an application deployer. + /// + public interface IApplicationDeployer : IDisposable + { + /// + /// Deploys the application to the target with specified . + /// + /// + DeploymentResult Deploy(); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs new file mode 100644 index 0000000000..bdc5ac70c6 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -0,0 +1,213 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +#if DNX451 +using System; +using System.IO; +using System.Linq; +using System.Threading; +using System.Xml; +using Microsoft.Framework.Logging; +using Microsoft.Web.Administration; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Deployer for IIS. + /// + public class IISDeployer : ApplicationDeployer + { + private IISApplication _application; + private CancellationTokenSource _hostShutdownToken = new CancellationTokenSource(); + private static object _syncObject = new object(); + + public IISDeployer(DeploymentParameters startParameters, ILogger logger) + : base(startParameters, logger) + { + } + + public override DeploymentResult Deploy() + { + // Start timer + StartTimer(); + + // Only supports publish and run on IIS. + DeploymentParameters.PublishApplicationBeforeDeployment = true; + + _application = new IISApplication(DeploymentParameters, Logger); + + DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + + // Publish to IIS root\application folder. + DnuPublish(publishRoot: _application.WebSiteRootFolder); + + // Drop an ini file instead of setting environment variable. + SetAspEnvironmentWithIni(); + + // Setup the IIS Application. + if (DeploymentParameters.ServerType == ServerType.IISNativeModule) + { + TurnRammFarOnNativeModule(); + } + + lock (_syncObject) + { + // To prevent modifying the IIS setup concurrently. + _application.Deploy(); + } + + // Warm up time for IIS setup. + Thread.Sleep(1 * 1000); + Logger.LogInformation("Successfully finished IIS application directory setup."); + + return new DeploymentResult + { + WebRootLocation = DeploymentParameters.ApplicationPath, + DeploymentParameters = DeploymentParameters, + // Accomodate the vdir name. + ApplicationBaseUri = new UriBuilder(Uri.UriSchemeHttp, "localhost", IISApplication.Port, _application.VirtualDirectoryName).Uri.AbsoluteUri + "/", + HostShutdownToken = _hostShutdownToken.Token + }; + } + + private void SetAspEnvironmentWithIni() + { + // Drop a Microsoft.AspNet.Hosting.ini with ASPNET_ENV information. + Logger.LogInformation("Creating Microsoft.AspNet.Hosting.ini file with ASPNET_ENV."); + var iniFile = Path.Combine(DeploymentParameters.ApplicationPath, "Microsoft.AspNet.Hosting.ini"); + File.WriteAllText(iniFile, string.Format("ASPNET_ENV={0}", DeploymentParameters.EnvironmentName)); + } + + private void TurnRammFarOnNativeModule() + { + Logger.LogInformation("Turning runAllManagedModulesForAllRequests=true in web.config for native module."); + var webConfig = Path.Combine(DeploymentParameters.ApplicationPath, "web.config"); + var configuration = new XmlDocument(); + configuration.LoadXml(File.ReadAllText(webConfig)); + + // https://github.com/aspnet/Helios/issues/77 + var rammfarAttribute = configuration.CreateAttribute("runAllManagedModulesForAllRequests"); + rammfarAttribute.Value = "true"; + var modulesNode = configuration.CreateElement("modules"); + modulesNode.Attributes.Append(rammfarAttribute); + var systemWebServerNode = configuration.CreateElement("system.webServer"); + systemWebServerNode.AppendChild(modulesNode); + configuration.SelectSingleNode("//configuration").AppendChild(systemWebServerNode); + configuration.Save(webConfig); + } + + public override void Dispose() + { + if (_application != null) + { + lock (_syncObject) + { + // Sequentialize IIS operations. + _application.StopAndDeleteAppPool(); + } + + TriggerHostShutdown(_hostShutdownToken); + } + + CleanPublishedOutput(); + InvokeUserApplicationCleanup(); + + StopTimer(); + } + + private class IISApplication + { + private const string WEBSITE_NAME = "ASPNETTESTRUNS"; + private const string NATIVE_MODULE_MANAGED_RUNTIME_VERSION = "vCoreFX"; + + private readonly ServerManager _serverManager = new ServerManager(); + private readonly DeploymentParameters _deploymentParameters; + private readonly ILogger _logger; + private ApplicationPool _applicationPool; + private Application _application; + private Site _website; + + public string VirtualDirectoryName { get; set; } + + // Always create website with the same port. + public const int Port = 5100; + + public string WebSiteRootFolder + { + get + { + return Path.Combine( + Environment.GetEnvironmentVariable("SystemDrive") + @"\", + "inetpub", + WEBSITE_NAME); + } + } + + public IISApplication(DeploymentParameters deploymentParameters, ILogger logger) + { + _deploymentParameters = deploymentParameters; + _logger = logger; + } + + public void Deploy() + { + VirtualDirectoryName = new DirectoryInfo(_deploymentParameters.ApplicationPath).Parent.Name; + _applicationPool = CreateAppPool(VirtualDirectoryName); + _application = Website.Applications.Add("/" + VirtualDirectoryName, _deploymentParameters.ApplicationPath); + _application.ApplicationPoolName = _applicationPool.Name; + _serverManager.CommitChanges(); + } + + private Site Website + { + get + { + _website = _serverManager.Sites.Where(s => s.Name == WEBSITE_NAME).FirstOrDefault(); + if (_website == null) + { + _website = _serverManager.Sites.Add(WEBSITE_NAME, WebSiteRootFolder, Port); + } + + return _website; + } + } + + private ApplicationPool CreateAppPool(string appPoolName) + { + var applicationPool = _serverManager.ApplicationPools.Add(appPoolName); + if (_deploymentParameters.ServerType == ServerType.IISNativeModule) + { + // Not assigning a runtime version will choose v4.0 default. + applicationPool.ManagedRuntimeVersion = NATIVE_MODULE_MANAGED_RUNTIME_VERSION; + } + + applicationPool.Enable32BitAppOnWin64 = (_deploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86); + _logger.LogInformation("Created {bit} application pool '{name}' with runtime version {runtime}.", + _deploymentParameters.RuntimeArchitecture, applicationPool.Name, + string.IsNullOrEmpty(applicationPool.ManagedRuntimeVersion) ? "that is default" : applicationPool.ManagedRuntimeVersion); + return applicationPool; + } + + public void StopAndDeleteAppPool() + { + _logger.LogInformation("Stopping application pool '{name}' and deleting application.", _applicationPool.Name); + + if (_applicationPool != null) + { + _applicationPool.Stop(); + } + + // Remove the application from website. + if (_application != null) + { + _application = Website.Applications.Where(a => a.Path == _application.Path).FirstOrDefault(); + Website.Applications.Remove(_application); + _serverManager.ApplicationPools.Remove(_serverManager.ApplicationPools[_applicationPool.Name]); + _serverManager.CommitChanges(); + _logger.LogInformation("Successfully stopped application pool '{name}' and deleted application from IIS.", _applicationPool.Name); + } + } + } + } +} +#endif \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs new file mode 100644 index 0000000000..30dc94bfdc --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -0,0 +1,208 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using Microsoft.Framework.Logging; +using Microsoft.Framework.Runtime; +using Microsoft.Framework.Runtime.Infrastructure; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Deployment helper for IISExpress. + /// + public class IISExpressDeployer : ApplicationDeployer + { + private Process _hostProcess; + + public IISExpressDeployer(DeploymentParameters deploymentParameters, ILogger logger) + : base(deploymentParameters, logger) + { + } + + public override DeploymentResult Deploy() + { + // Start timer + StartTimer(); + + DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + + if (DeploymentParameters.PublishApplicationBeforeDeployment) + { + DnuPublish(); + } + + // Launch the host process. + var hostExitToken = StartIISExpress(); + + return new DeploymentResult + { + WebRootLocation = DeploymentParameters.ApplicationPath, + DeploymentParameters = DeploymentParameters, + // Right now this works only for urls like http://localhost:5001/. Does not work for http://localhost:5001/subpath. + ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint, + HostShutdownToken = hostExitToken + }; + } + + private CancellationToken StartIISExpress() + { + if (!string.IsNullOrWhiteSpace(DeploymentParameters.ApplicationHostConfigTemplateContent)) + { + // Pass on the applicationhost.config to iis express. With this don't need to pass in the /path /port switches as they are in the applicationHost.config + // We take a copy of the original specified applicationHost.Config to prevent modifying the one in the repo. + + DeploymentParameters.ApplicationHostConfigTemplateContent = + DeploymentParameters.ApplicationHostConfigTemplateContent + .Replace("[ApplicationPhysicalPath]", Path.Combine(DeploymentParameters.ApplicationPath, "wwwroot")) + .Replace("[PORT]", new Uri(DeploymentParameters.ApplicationBaseUriHint).Port.ToString()); + + DeploymentParameters.ApplicationHostConfigLocation = Path.GetTempFileName(); + + File.WriteAllText(DeploymentParameters.ApplicationHostConfigLocation, + DeploymentParameters.ApplicationHostConfigTemplateContent.Replace("[ApplicationPhysicalPath]", DeploymentParameters.ApplicationPath)); + } + + if (!DeploymentParameters.PublishApplicationBeforeDeployment) + { + CopyAspNetLoader(); + } + + var webroot = DeploymentParameters.ApplicationPath; + if (!webroot.EndsWith("wwwroot")) + { + webroot = Path.Combine(webroot, "wwwroot"); + } + + var parameters = string.IsNullOrWhiteSpace(DeploymentParameters.ApplicationHostConfigLocation) ? + string.Format("/port:{0} /path:\"{1}\" /trace:error", new Uri(DeploymentParameters.ApplicationBaseUriHint).Port, webroot) : + string.Format("/site:{0} /config:{1} /trace:error", DeploymentParameters.SiteName, DeploymentParameters.ApplicationHostConfigLocation); + + var iisExpressPath = GetIISExpressPath(); + + Logger.LogInformation("Executing command : {iisExpress} {args}", iisExpressPath, parameters); + + var startInfo = new ProcessStartInfo + { + FileName = iisExpressPath, + Arguments = parameters, + UseShellExecute = false, + CreateNoWindow = false + }; + + AddEnvironmentVariablesToProcess(startInfo); + + // IIS express figures out the DNX from %PATH%. +#if DNX451 + SetEnvironmentVariable(startInfo.EnvironmentVariables, "PATH", ChosenRuntimePath + ";" + startInfo.EnvironmentVariables["PATH"]); + SetEnvironmentVariable(startInfo.EnvironmentVariables, "DNX_APPBASE", DeploymentParameters.ApplicationPath); +#elif DNXCORE50 + SetEnvironmentVariable(startInfo.Environment, "PATH", ChosenRuntimePath + ";" + startInfo.Environment["PATH"]); + SetEnvironmentVariable(startInfo.Environment, "DNX_APPBASE", DeploymentParameters.ApplicationPath); +#endif + + _hostProcess = Process.Start(startInfo); + _hostProcess.EnableRaisingEvents = true; + var hostExitTokenSource = new CancellationTokenSource(); + _hostProcess.Exited += (sender, e) => + { + TriggerHostShutdown(hostExitTokenSource); + }; + + if (_hostProcess.HasExited) + { + Logger.LogError("Host process {processName} exited with code {exitCode} or failed to start.", startInfo.FileName, _hostProcess.ExitCode); + throw new Exception("Failed to start host"); + } + + Logger.LogInformation("Started iisexpress. Process Id : {processId}", _hostProcess.Id); + return hostExitTokenSource.Token; + } + + private void CopyAspNetLoader() + { + var libraryManager = (ILibraryManager)CallContextServiceLocator.Locator.ServiceProvider.GetService(typeof(ILibraryManager)); + var interopLibrary = libraryManager.GetLibraryInformation("Microsoft.AspNet.Loader.IIS.Interop"); + + if (interopLibrary == null) + { + throw new Exception( + string.Format("Include Microsoft.AspNet.Server.IIS package in your project.json to deploy in {0}.", + ServerType.IISExpress)); + } + + var aspNetLoaderSrcPath = Path.Combine(interopLibrary.Path, "tools", "AspNet.Loader.dll"); + var aspNetLoaderDestPath = Path.Combine(DeploymentParameters.ApplicationPath, "wwwroot", "bin", "AspNet.Loader.dll"); + + // Create bin directory if it does not exist. + Directory.CreateDirectory(new DirectoryInfo(aspNetLoaderDestPath).Parent.FullName); + + if (!File.Exists(aspNetLoaderDestPath)) + { + try + { + File.Copy(aspNetLoaderSrcPath, aspNetLoaderDestPath); + } + catch (IOException) + { + // Ignore file already exists exception. Sometimes multiple tests might try + // doing the same and one of them wins. + } + } + } + + private string GetIISExpressPath() + { + // Get path to program files + var iisExpressPath = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles(x86)"), "IIS Express", "iisexpress.exe"); + + // Get path to 64 bit of IIS Express + if (DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x64) + { + iisExpressPath = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles"), "IIS Express", "iisexpress.exe"); + + // If process is 32 bit, the path points to x86. Replace path to point to x64 + iisExpressPath = IntPtr.Size == 8 ? iisExpressPath : iisExpressPath.Replace(" (x86)", ""); + } + + if (!File.Exists(iisExpressPath)) + { + throw new Exception("Unable to find IISExpress on the machine"); + } + + return iisExpressPath; + } + + public override void Dispose() + { + ShutDownIfAnyHostProcess(_hostProcess); + + if (!string.IsNullOrWhiteSpace(DeploymentParameters.ApplicationHostConfigLocation) + && File.Exists(DeploymentParameters.ApplicationHostConfigLocation)) + { + // Delete the temp applicationHostConfig that we created. + try + { + File.Delete(DeploymentParameters.ApplicationHostConfigLocation); + } + catch (Exception exception) + { + // Ignore delete failures - just write a log. + Logger.LogWarning("Failed to delete '{config}'. Exception : {exception}", DeploymentParameters.ApplicationHostConfigLocation, exception.Message); + } + } + + if (DeploymentParameters.PublishApplicationBeforeDeployment) + { + CleanPublishedOutput(); + } + + InvokeUserApplicationCleanup(); + + StopTimer(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs new file mode 100644 index 0000000000..12f099596f --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -0,0 +1,111 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Deployer for Kestrel on Mono. + /// + public class MonoDeployer : ApplicationDeployer + { + private Process _hostProcess; + + public MonoDeployer(DeploymentParameters deploymentParameters, ILogger logger) + : base(deploymentParameters, logger) + { + } + + public override DeploymentResult Deploy() + { + // Start timer + StartTimer(); + + var path = Environment.GetEnvironmentVariable("PATH"); + var runtimeBin = path.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries). + Where(c => c.Contains("dnx-mono")).FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(runtimeBin)) + { + throw new Exception("Runtime not detected on the machine."); + } + + if (DeploymentParameters.PublishApplicationBeforeDeployment) + { + // We use full path to runtime to pack. + DeploymentParameters.DnxRuntime = new DirectoryInfo(runtimeBin).Parent.FullName; + DnuPublish(); + } + + // Launch the host process. + var hostExitToken = StartMonoHost(); + + return new DeploymentResult + { + WebRootLocation = DeploymentParameters.ApplicationPath, + DeploymentParameters = DeploymentParameters, + ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint, + HostShutdownToken = hostExitToken + }; + } + + private CancellationToken StartMonoHost() + { + if (DeploymentParameters.ServerType != ServerType.Kestrel) + { + throw new InvalidOperationException("kestrel is the only valid ServerType for Mono"); + } + + Logger.LogInformation("Executing command: dnx \"{appPath}\" kestrel --server.urls {url}", + DeploymentParameters.ApplicationPath, DeploymentParameters.ApplicationBaseUriHint); + + var startInfo = new ProcessStartInfo + { + FileName = "dnx", + Arguments = string.Format("\"{0}\" kestrel --server.urls {1}", DeploymentParameters.ApplicationPath, DeploymentParameters.ApplicationBaseUriHint), + UseShellExecute = false, + CreateNoWindow = true, + RedirectStandardInput = true + }; + + _hostProcess = Process.Start(startInfo); + _hostProcess.EnableRaisingEvents = true; + var hostExitTokenSource = new CancellationTokenSource(); + _hostProcess.Exited += (sender, e) => + { + Logger.LogError("Host process {processName} exited with code {exitCode}.", startInfo.FileName, _hostProcess.ExitCode); + TriggerHostShutdown(hostExitTokenSource); + }; + + Logger.LogInformation("Started {0}. Process Id : {1}", _hostProcess.MainModule.FileName, _hostProcess.Id); + + if (_hostProcess.HasExited) + { + Logger.LogError("Host process {processName} exited with code {exitCode} or failed to start.", startInfo.FileName, _hostProcess.ExitCode); + throw new Exception("Failed to start host"); + } + + return hostExitTokenSource.Token; + } + + public override void Dispose() + { + ShutDownIfAnyHostProcess(_hostProcess); + + if (DeploymentParameters.PublishApplicationBeforeDeployment) + { + CleanPublishedOutput(); + } + + InvokeUserApplicationCleanup(); + + StopTimer(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs new file mode 100644 index 0000000000..12252c8829 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Deployer for WebListener and Kestrel. + /// + public class SelfHostDeployer : ApplicationDeployer + { + private Process _hostProcess; + + public SelfHostDeployer(DeploymentParameters deploymentParameters, ILogger logger) + : base(deploymentParameters, logger) + { + } + + public override DeploymentResult Deploy() + { + // Start timer + StartTimer(); + + DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + + if (DeploymentParameters.PublishApplicationBeforeDeployment) + { + DnuPublish(); + } + + // Launch the host process. + var hostExitToken = StartSelfHost(); + + return new DeploymentResult + { + WebRootLocation = DeploymentParameters.ApplicationPath, + DeploymentParameters = DeploymentParameters, + ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint, + HostShutdownToken = hostExitToken + }; + } + + private CancellationToken StartSelfHost() + { + var commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; + Logger.LogInformation("Executing dnx.exe {appPath} {command} --server.urls {url}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint); + + var startInfo = new ProcessStartInfo + { + FileName = Path.Combine(ChosenRuntimePath, "dnx.exe"), + Arguments = string.Format("\"{0}\" {1} --server.urls {2}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint), + UseShellExecute = false, + CreateNoWindow = true + }; + + AddEnvironmentVariablesToProcess(startInfo); + + _hostProcess = Process.Start(startInfo); + _hostProcess.EnableRaisingEvents = true; + var hostExitTokenSource = new CancellationTokenSource(); + _hostProcess.Exited += (sender, e) => + { + TriggerHostShutdown(hostExitTokenSource); + }; + + if (_hostProcess.HasExited) + { + Logger.LogError("Host process {processName} exited with code {exitCode} or failed to start.", startInfo.FileName, _hostProcess.ExitCode); + throw new Exception("Failed to start host"); + } + + Logger.LogInformation("Started {fileName}. Process Id : {processId}", startInfo.FileName, _hostProcess.Id); + return hostExitTokenSource.Token; + } + + public override void Dispose() + { + ShutDownIfAnyHostProcess(_hostProcess); + + if (DeploymentParameters.PublishApplicationBeforeDeployment) + { + CleanPublishedOutput(); + } + + InvokeUserApplicationCleanup(); + + StopTimer(); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj b/src/Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj new file mode 100644 index 0000000000..6d890ba4ec --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 3da89347-6731-4366-80c4-548f24e8607b + + + + + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json new file mode 100644 index 0000000000..c4abcae964 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -0,0 +1,31 @@ +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", + "dependencies": { + "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Framework.Logging.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "Microsoft.Web.Administration": "7.0.0" + }, + "frameworkAssemblies": { + "System.Net.Http": "", + "System.Xml": "" + } + }, + "dnxcore50": { + "dependencies": { + "System.Diagnostics.Process": "4.0.0-beta-*", + "System.IO.FileSystem": "4.0.0-*", + "System.Net.Http": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Text.RegularExpressions": "4.0.10-beta-*", + "System.Threading": "4.0.10-beta-*", + "System.Threading.Thread": "4.0.0-*" + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs new file mode 100644 index 0000000000..7c1d5340aa --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs @@ -0,0 +1,32 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using Microsoft.AspNet.Testing.xunit; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Skips a test if the DNX used to run the test is CoreClr. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class SkipIfCurrentRuntimeIsCoreClrAttribute : Attribute, ITestCondition + { + public bool IsMet + { + get + { + return !Process.GetCurrentProcess().ProcessName.ToLower().Contains("coreclr"); + } + } + + public string SkipReason + { + get + { + return "Cannot run these test variations using CoreCLR DNX as helpers are not available on CoreCLR."; + } + } + } +} diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs new file mode 100644 index 0000000000..541fa684bc --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Testing.xunit; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Skip test if IIS native module is not enabled. To enable setup native module + /// and set environment variable IIS_NATIVE_VARIATIONS_ENABLED=true for the test process. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class SkipIfIISNativeVariationsNotEnabledAttribute : Attribute, ITestCondition + { + public bool IsMet + { + get + { + return Environment.GetEnvironmentVariable("IIS_NATIVE_VARIATIONS_ENABLED") == "true"; + } + } + + public string SkipReason + { + get + { + return "Skipping Native module test since native module variations are not enabled. " + + "To run the test, setup the native module and set the environment variable IIS_NATIVE_VARIATIONS_ENABLED=true."; + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs new file mode 100644 index 0000000000..dbfcbc5014 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Testing.xunit; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Skip test if IIS variations are not enabled. To enable set environment variable + /// IIS_VARIATIONS_ENABLED=true for the test process. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class SkipIfIISVariationsNotEnabledAttribute : Attribute, ITestCondition + { + public bool IsMet + { + get + { + return Environment.GetEnvironmentVariable("IIS_VARIATIONS_ENABLED") == "true"; + } + } + + public string SkipReason + { + get + { + return "Skipping IIS variation of tests. " + + "To run the IIS variations, setup IIS and set the environment variable IIS_VARIATIONS_ENABLED=true."; + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs new file mode 100644 index 0000000000..37be266e59 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.AspNet.Testing.xunit; + +namespace Microsoft.AspNet.Server.Testing +{ + /// + /// Skips a 64 bit test if the current Windows OS is 32-bit. + /// + [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] + public class SkipOn32BitOSAttribute : Attribute, ITestCondition + { + public bool IsMet + { + get + { + // Directory found only on 64-bit OS. + return Directory.Exists(Path.Combine(Environment.GetEnvironmentVariable("SystemRoot"), "SysWOW64")); + } + } + + public string SkipReason + { + get + { + return "Skipping the x64 test since Windows is 32-bit"; + } + } + } +} \ No newline at end of file From cd878d57c1fc750299cf3fdb392a2d0e1f65f9c7 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Fri, 17 Apr 2015 18:41:19 -0700 Subject: [PATCH 0555/1838] Removing some terms to clear the policheck. --- .../Deployers/ApplicationDeployer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index c974840a22..a5505c169c 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -12,7 +12,7 @@ using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Testing { /// - /// Abstract base class of all deplolyers with a back bone implementation of some of the common helpers. + /// Abstract base class of all deployers with implementation of some of the common helpers. /// public abstract class ApplicationDeployer : IApplicationDeployer { From df6f59a1d1f8e7e9ed30989fe5e7affb7b421a59 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 10:17:18 -0700 Subject: [PATCH 0556/1838] Logging the dnx and dnu paths while running selfhost or dnu publish. --- .../Deployers/ApplicationDeployer.cs | 10 ++++++++-- .../Deployers/SelfHostDeployer.cs | 7 +++++-- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index a5505c169c..27c1ff131c 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -78,11 +78,12 @@ namespace Microsoft.AspNet.Server.Testing DeploymentParameters.DnxRuntime, DeploymentParameters.PublishWithNoSource ? "--no-source" : string.Empty); - Logger.LogInformation("Executing command dnu {args}", parameters); + var dnuPath = Path.Combine(ChosenRuntimePath, "dnu.cmd"); + Logger.LogInformation("Executing command {dnu} {args}", dnuPath, parameters); var startInfo = new ProcessStartInfo { - FileName = Path.Combine(ChosenRuntimePath, "dnu.cmd"), + FileName = dnuPath, Arguments = parameters, UseShellExecute = false, CreateNoWindow = true @@ -91,6 +92,11 @@ namespace Microsoft.AspNet.Server.Testing var hostProcess = Process.Start(startInfo); hostProcess.WaitForExit(60 * 1000); + if (hostProcess.ExitCode != 0) + { + throw new Exception("dnu publish exited with exit code : {0}"); + } + DeploymentParameters.ApplicationPath = (DeploymentParameters.ServerType == ServerType.IISExpress || DeploymentParameters.ServerType == ServerType.IISNativeModule || diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 12252c8829..246e0ee3a6 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -48,11 +48,14 @@ namespace Microsoft.AspNet.Server.Testing private CancellationToken StartSelfHost() { var commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; - Logger.LogInformation("Executing dnx.exe {appPath} {command} --server.urls {url}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint); + var dnxPath = Path.Combine(ChosenRuntimePath, "dnx.exe"); + Logger.LogInformation("Executing {dnxexe} {appPath} {command} --server.urls {url}", + dnxPath, DeploymentParameters.ApplicationPath, + commandName, DeploymentParameters.ApplicationBaseUriHint); var startInfo = new ProcessStartInfo { - FileName = Path.Combine(ChosenRuntimePath, "dnx.exe"), + FileName = dnxPath, Arguments = string.Format("\"{0}\" {1} --server.urls {2}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint), UseShellExecute = false, CreateNoWindow = true From 0ab04fd319934f39ee922fd70ed1e991bb8a3a23 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 10:25:53 -0700 Subject: [PATCH 0557/1838] Setting exit code in exception message. --- .../Deployers/ApplicationDeployer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 27c1ff131c..94c3d4a0c7 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.Server.Testing if (hostProcess.ExitCode != 0) { - throw new Exception("dnu publish exited with exit code : {0}"); + throw new Exception(string.Format("dnu publish exited with exit code : {0}", hostProcess.ExitCode)); } DeploymentParameters.ApplicationPath = From 4030be585db1620a59e4105cbcae214351b3a6fb Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 20 Apr 2015 10:54:33 -0700 Subject: [PATCH 0558/1838] #265 Add implicit converters between string and PathString. --- src/Microsoft.AspNet.Http.Core/PathString.cs | 18 ++++++++++++++++++ .../MapPathMiddlewareTests.cs | 16 ++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs index 5e6f03ec70..11249afb91 100644 --- a/src/Microsoft.AspNet.Http.Core/PathString.cs +++ b/src/Microsoft.AspNet.Http.Core/PathString.cs @@ -236,5 +236,23 @@ namespace Microsoft.AspNet.Http { return left.Add(right); } + + /// + /// Implicitly creates a new PathString from the given string. + /// + /// + public static implicit operator PathString(string s) + { + return new PathString(s); + } + + /// + /// Implicitly calls ToString(). + /// + /// + public static implicit operator string(PathString path) + { + return path.ToString(); + } } } diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs index 071e8fbdaf..a54a89d09e 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), UseSuccess); + builder.Map(matchPath, UseSuccess); var app = builder.Build(); app.Invoke(context).Wait(); @@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), subBuilder => subBuilder.Run(Success)); + builder.Map(matchPath, subBuilder => subBuilder.Run(Success)); var app = builder.Build(); app.Invoke(context).Wait(); @@ -96,7 +96,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(new PathString(matchPath), map => { }).Build()); + Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); } [Theory] @@ -111,7 +111,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), UseNotImplemented); + builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -133,7 +133,7 @@ namespace Microsoft.AspNet.Builder.Extensions { HttpContext context = CreateRequest(basePath, requestPath); var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString(matchPath), UseNotImplemented); + builder.Map(matchPath, UseNotImplemented); builder.Run(Success); var app = builder.Build(); app.Invoke(context).Wait(); @@ -147,12 +147,12 @@ namespace Microsoft.AspNet.Builder.Extensions public void ChainedRoutes_Success() { var builder = new ApplicationBuilder(serviceProvider: null); - builder.Map(new PathString("/route1"), map => + builder.Map("/route1", map => { - map.Map(new PathString("/subroute1"), UseSuccess); + map.Map("/subroute1", UseSuccess); map.Run(NotImplemented); }); - builder.Map(new PathString("/route2/subroute2"), UseSuccess); + builder.Map("/route2/subroute2", UseSuccess); var app = builder.Build(); HttpContext context = CreateRequest(string.Empty, "/route1"); From 0e9f876d4e890ec1a43c621409371d473b25e7ca Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 11:11:00 -0700 Subject: [PATCH 0559/1838] Removing timeout for dnu publish Sometimes on slower machines that it takes more than this time especially when -no-source is turned on. --- .../Deployers/ApplicationDeployer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 94c3d4a0c7..409c5b6887 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -90,7 +90,7 @@ namespace Microsoft.AspNet.Server.Testing }; var hostProcess = Process.Start(startInfo); - hostProcess.WaitForExit(60 * 1000); + hostProcess.WaitForExit(); if (hostProcess.ExitCode != 0) { From 0737ea392f9747f80ebc0854cb29b544958994a1 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 20 Apr 2015 11:41:43 -0700 Subject: [PATCH 0560/1838] Add NotNull to Predicate setter. --- .../Extensions/MapWhenOptions.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs index 27a9d9b1be..86967a2c70 100644 --- a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs @@ -4,6 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -15,7 +16,12 @@ namespace Microsoft.AspNet.Builder.Extensions /// /// The user callback that determines if the branch should be taken /// - public Func Predicate { get; set; } + public Func Predicate + { + get; + [param: NotNull] + set; + } /// /// The branch taken for a positive match From 78e9ef27825e96f946a19f6fbc6cf7fc89cddfdf Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 13:51:00 -0700 Subject: [PATCH 0561/1838] Add more logging while starting dnx.exe or dnu.cmd --- .../Deployers/ApplicationDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 409c5b6887..e562df8492 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Server.Testing FileName = dnuPath, Arguments = parameters, UseShellExecute = false, - CreateNoWindow = true + CreateNoWindow = false }; var hostProcess = Process.Start(startInfo); diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 246e0ee3a6..5e971664f0 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -58,7 +58,7 @@ namespace Microsoft.AspNet.Server.Testing FileName = dnxPath, Arguments = string.Format("\"{0}\" {1} --server.urls {2}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint), UseShellExecute = false, - CreateNoWindow = true + CreateNoWindow = false }; AddEnvironmentVariablesToProcess(startInfo); From f3a4cf0ea7500a4ab84840a2aecdfe2d2a338c93 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 16:00:47 -0700 Subject: [PATCH 0562/1838] Fixing the CreateNoWindow=false issue on selfhost When CreateNoWindow is set to false, I see the selfhost process exiting immediately after start due to https://github.com/aspnet/Hosting/issues/140. To fix this I'm manually redirecting the stderror and stdoutput streams so test runs will have necessary logs. --- .../Deployers/SelfHostDeployer.cs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 5e971664f0..fe27167442 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -58,12 +58,19 @@ namespace Microsoft.AspNet.Server.Testing FileName = dnxPath, Arguments = string.Format("\"{0}\" {1} --server.urls {2}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint), UseShellExecute = false, - CreateNoWindow = false + // https://github.com/aspnet/Hosting/issues/140 causing host process to exit when this is made false. + CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true }; AddEnvironmentVariablesToProcess(startInfo); _hostProcess = Process.Start(startInfo); + _hostProcess.BeginErrorReadLine(); + _hostProcess.BeginOutputReadLine(); + _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; + _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; _hostProcess.EnableRaisingEvents = true; var hostExitTokenSource = new CancellationTokenSource(); _hostProcess.Exited += (sender, e) => From f92b1f36e1a082322ac816708b2103378578ef87 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 16:19:56 -0700 Subject: [PATCH 0563/1838] Redirecting output for all process starts to see correlation in logs. --- .../Deployers/ApplicationDeployer.cs | 11 +++++++++-- .../Deployers/IISExpressDeployer.cs | 11 +++++++++-- .../Deployers/SelfHostDeployer.cs | 8 ++++---- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index e562df8492..e3f1531052 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -86,10 +86,17 @@ namespace Microsoft.AspNet.Server.Testing FileName = dnuPath, Arguments = parameters, UseShellExecute = false, - CreateNoWindow = false + CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true }; - var hostProcess = Process.Start(startInfo); + var hostProcess = new Process() { StartInfo = startInfo }; + hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; + hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; + hostProcess.Start(); + hostProcess.BeginErrorReadLine(); + hostProcess.BeginOutputReadLine(); hostProcess.WaitForExit(); if (hostProcess.ExitCode != 0) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 30dc94bfdc..25cf0e7012 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -90,7 +90,9 @@ namespace Microsoft.AspNet.Server.Testing FileName = iisExpressPath, Arguments = parameters, UseShellExecute = false, - CreateNoWindow = false + CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true }; AddEnvironmentVariablesToProcess(startInfo); @@ -104,13 +106,18 @@ namespace Microsoft.AspNet.Server.Testing SetEnvironmentVariable(startInfo.Environment, "DNX_APPBASE", DeploymentParameters.ApplicationPath); #endif - _hostProcess = Process.Start(startInfo); + _hostProcess = new Process() { StartInfo = startInfo }; + _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; + _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; _hostProcess.EnableRaisingEvents = true; var hostExitTokenSource = new CancellationTokenSource(); _hostProcess.Exited += (sender, e) => { TriggerHostShutdown(hostExitTokenSource); }; + _hostProcess.Start(); + _hostProcess.BeginErrorReadLine(); + _hostProcess.BeginOutputReadLine(); if (_hostProcess.HasExited) { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index fe27167442..9663bc9ed6 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -58,7 +58,6 @@ namespace Microsoft.AspNet.Server.Testing FileName = dnxPath, Arguments = string.Format("\"{0}\" {1} --server.urls {2}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint), UseShellExecute = false, - // https://github.com/aspnet/Hosting/issues/140 causing host process to exit when this is made false. CreateNoWindow = true, RedirectStandardError = true, RedirectStandardOutput = true @@ -66,9 +65,7 @@ namespace Microsoft.AspNet.Server.Testing AddEnvironmentVariablesToProcess(startInfo); - _hostProcess = Process.Start(startInfo); - _hostProcess.BeginErrorReadLine(); - _hostProcess.BeginOutputReadLine(); + _hostProcess = new Process() { StartInfo = startInfo }; _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; _hostProcess.EnableRaisingEvents = true; @@ -77,6 +74,9 @@ namespace Microsoft.AspNet.Server.Testing { TriggerHostShutdown(hostExitTokenSource); }; + _hostProcess.Start(); + _hostProcess.BeginErrorReadLine(); + _hostProcess.BeginOutputReadLine(); if (_hostProcess.HasExited) { From 1a4dc9488adbfe6b954eb1387c11df2c9e898731 Mon Sep 17 00:00:00 2001 From: Praburaj Date: Mon, 20 Apr 2015 16:48:37 -0700 Subject: [PATCH 0564/1838] Trying to redirect the stdinput as well to see if this succeeds on CI --- .../Deployers/SelfHostDeployer.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 9663bc9ed6..3d366241b5 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -60,7 +60,9 @@ namespace Microsoft.AspNet.Server.Testing UseShellExecute = false, CreateNoWindow = true, RedirectStandardError = true, - RedirectStandardOutput = true + RedirectStandardOutput = true, + // Trying a work around for https://github.com/aspnet/Hosting/issues/140. + RedirectStandardInput = true }; AddEnvironmentVariablesToProcess(startInfo); From 5fac18b4184e0eb2effe519242271bf4cdc3cea5 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 12:18:50 -0700 Subject: [PATCH 0565/1838] HttpAbstractions#265 - Remove IApplicationBuilder.Server setter. --- .../Builder/ApplicationBuilderFactory.cs | 4 +-- .../Builder/IApplicationBuilderFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 25 +++++++++---------- 3 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs index 7bf1f59c23..acefa86bc7 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs @@ -15,9 +15,9 @@ namespace Microsoft.AspNet.Hosting.Builder _serviceProvider = serviceProvider; } - public IApplicationBuilder CreateBuilder() + public IApplicationBuilder CreateBuilder(object server) { - return new ApplicationBuilder(_serviceProvider); + return new ApplicationBuilder(_serviceProvider, server); } } } diff --git a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs index 45194717bc..c866b2d79d 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs @@ -7,6 +7,6 @@ namespace Microsoft.AspNet.Hosting.Builder { public interface IApplicationBuilderFactory { - IApplicationBuilder CreateBuilder(); + IApplicationBuilder CreateBuilder(object server); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 0f6826737c..4369057f46 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -51,8 +51,8 @@ namespace Microsoft.AspNet.Hosting public virtual IDisposable Start() { EnsureApplicationServices(); - EnsureBuilder(); EnsureServer(); + EnsureBuilder(); var applicationDelegate = BuildApplicationDelegate(); @@ -105,17 +105,6 @@ namespace Microsoft.AspNet.Hosting } } - private void EnsureBuilder() - { - if (_builderFactory == null) - { - _builderFactory = _applicationServices.GetRequiredService(); - } - - _builder = _builderFactory.CreateBuilder(); - _builder.ApplicationServices = _applicationServices; - } - private void EnsureServer() { if (_serverFactory == null) @@ -130,7 +119,17 @@ namespace Microsoft.AspNet.Hosting } _serverInstance = _serverFactory.Initialize(_config); - _builder.Server = _serverInstance; + } + + private void EnsureBuilder() + { + if (_builderFactory == null) + { + _builderFactory = _applicationServices.GetRequiredService(); + } + + _builder = _builderFactory.CreateBuilder(_serverInstance); + _builder.ApplicationServices = _applicationServices; } private RequestDelegate BuildApplicationDelegate() From d270525fde695ff0efed1a38c369402e92956bc0 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Wed, 25 Mar 2015 11:08:58 -0700 Subject: [PATCH 0566/1838] Create a logging scope having request id --- .../DefaultRequestIdentifierFeature.cs | 18 +++ src/Microsoft.AspNet.Hosting/HostingEngine.cs | 37 +++-- .../HostingEngineTests.cs | 134 ++++++++++++++++++ .../project.json | 1 + 4 files changed, 182 insertions(+), 8 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs new file mode 100644 index 0000000000..6baca0975d --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; + +namespace Microsoft.AspNet.Hosting +{ + public class DefaultRequestIdentifierFeature : IRequestIdentifierFeature + { + public DefaultRequestIdentifierFeature() + { + TraceIdentifier = Guid.NewGuid(); + } + + public Guid TraceIdentifier { get; } + } +} diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs index 4369057f46..4889150d04 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEngine.cs @@ -6,11 +6,14 @@ using System.Collections.Generic; using System.Linq; using System.Threading; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Hosting { @@ -24,7 +27,7 @@ namespace Microsoft.AspNet.Hosting // Start/ApplicationServices block use methods private bool _useDisabled; - + private IApplicationBuilderFactory _builderFactory; private IApplicationBuilder _builder; private IServiceProvider _applicationServices; @@ -56,14 +59,20 @@ namespace Microsoft.AspNet.Hosting var applicationDelegate = BuildApplicationDelegate(); - var _contextFactory = _applicationServices.GetRequiredService(); - var _contextAccessor = _applicationServices.GetRequiredService(); + var logger = _applicationServices.GetRequiredService>(); + var contextFactory = _applicationServices.GetRequiredService(); + var contextAccessor = _applicationServices.GetRequiredService(); var server = _serverFactory.Start(_serverInstance, - features => + async features => { - var httpContext = _contextFactory.CreateHttpContext(features); - _contextAccessor.HttpContext = httpContext; - return applicationDelegate(httpContext); + var httpContext = contextFactory.CreateHttpContext(features); + var requestIdentifier = GetRequestIdentifier(httpContext); + + using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) + { + contextAccessor.HttpContext = httpContext; + await applicationDelegate(httpContext); + } }); return new Disposable(() => @@ -163,6 +172,18 @@ namespace Microsoft.AspNet.Hosting } } + private Guid GetRequestIdentifier(HttpContext httpContext) + { + var requestIdentifierFeature = httpContext.GetFeature(); + if (requestIdentifierFeature == null) + { + requestIdentifierFeature = new DefaultRequestIdentifierFeature(); + httpContext.SetFeature(requestIdentifierFeature); + } + + return requestIdentifierFeature.TraceIdentifier; + } + // Consider cutting public IHostingEngine UseEnvironment(string environment) { @@ -207,7 +228,7 @@ namespace Microsoft.AspNet.Hosting public IHostingEngine UseStartup(Action configureApp, Action configureServices) { CheckUseAllowed(); - _startup = new StartupMethods(configureApp, + _startup = new StartupMethods(configureApp, services => { if (configureServices != null) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 01de9f14ed..07d946e490 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -7,12 +7,16 @@ using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Testing.xunit; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; +using Moq; using Xunit; namespace Microsoft.AspNet.Hosting @@ -150,6 +154,115 @@ namespace Microsoft.AspNet.Hosting RunMapPath(virtualPath, expectedSuffix); } + [Fact] + public void HostingEngine_CreatesDefaultRequestIdentifierFeature_IfNotPresent() + { + // Arrange + HttpContext httpContext = null; + var requestDelegate = new RequestDelegate(innerHttpContext => + { + httpContext = innerHttpContext; + return Task.FromResult(0); + }); + var featuresSupportedByHost = new FeatureCollection(); + var hostingEngine = CreateHostingEngine(featuresSupportedByHost, requestDelegate); + + // Act + var disposable = hostingEngine.Start(); + + // Assert + Assert.NotNull(httpContext); + Assert.IsType(httpContext.GetFeature()); + } + + [Fact] + public void Hosting_CreatesDefaultRequestIdentifierFeature_IfNotPresent_ForImmutableFeatureCollection() + { + // Arrange + HttpContext httpContext = null; + var requestDelegate = new RequestDelegate(innerHttpContext => + { + httpContext = innerHttpContext; + return Task.FromResult(0); + }); + var featuresSupportedByHost = new Mock(); + featuresSupportedByHost + .Setup(fc => fc.Add(It.IsAny(), It.IsAny())) + .Throws(new NotImplementedException()); + featuresSupportedByHost + .Setup(fc => fc.Add(new KeyValuePair(It.IsAny(), It.IsAny()))) + .Throws(new NotImplementedException()); + var hostingEngine = CreateHostingEngine(featuresSupportedByHost.Object, requestDelegate); + + // Act + var disposable = hostingEngine.Start(); + + // Assert + Assert.NotNull(httpContext); + Assert.IsType(httpContext.GetFeature()); + } + + [Fact] + public void HostingEngine_DoesNot_CreateDefaultRequestIdentifierFeature_IfPresent() + { + // Arrange + HttpContext httpContext = null; + var requestDelegate = new RequestDelegate(innerHttpContext => + { + httpContext = innerHttpContext; + return Task.FromResult(0); + }); + var featuresSupportedByHost = new FeatureCollection(); + var requestIdentifierFeature = new Mock().Object; + featuresSupportedByHost.Add(typeof(IRequestIdentifierFeature), requestIdentifierFeature); + var hostingEngine = CreateHostingEngine(featuresSupportedByHost, requestDelegate); + + // Act + var disposable = hostingEngine.Start(); + + // Assert + Assert.NotNull(httpContext); + Assert.Same(requestIdentifierFeature, httpContext.GetFeature()); + } + + private IHostingEngine CreateHostingEngine( + IFeatureCollection featuresSupportedByHost, + RequestDelegate requestDelegate) + { + var applicationBuilder = new Mock(); + applicationBuilder.Setup(appBuilder => appBuilder.Build()).Returns(requestDelegate); + var applicationBuilderFactory = new Mock(); + applicationBuilderFactory + .Setup(abf => abf.CreateBuilder(It.IsAny())) + .Returns(applicationBuilder.Object); + + var serviceCollection = new ServiceCollection(); + serviceCollection.Add( + new ServiceDescriptor(typeof(IApplicationBuilderFactory), applicationBuilderFactory.Object)); + serviceCollection.Add( + new ServiceDescriptor(typeof(ILogger), new Mock>().Object)); + serviceCollection.Add( + new ServiceDescriptor(typeof(IHttpContextFactory), new HttpContextFactory())); + serviceCollection.Add( + new ServiceDescriptor(typeof(IHttpContextAccessor), new Mock().Object)); + + var startupLoader = new Mock(); + var startupMethods = new StartupMethods( + (appBuilder) => { }, + (configureServices) => configureServices.BuildServiceProvider()); + startupLoader.Setup(sl => sl.Load(It.IsAny(), It.IsAny(), It.IsAny>())) + .Returns(startupMethods); + + var hostingEngine = new HostingEngine( + serviceCollection, + startupLoader.Object, + new Mock().Object, + new Mock().Object, + "TestAppName"); + + return hostingEngine.UseServer(new TestServerFactory(featuresSupportedByHost)); + } + private void RunMapPath(string virtualPath, string expectedSuffix) { var engine = WebHost.CreateEngine().UseServer(this); @@ -207,5 +320,26 @@ namespace Microsoft.AspNet.Hosting throw new NotImplementedException(); } } + + private class TestServerFactory : IServerFactory + { + private readonly IFeatureCollection _featuresSupportedByThisHost; + + public TestServerFactory(IFeatureCollection featuresSupportedByThisHost) + { + _featuresSupportedByThisHost = featuresSupportedByThisHost; + } + + public IServerInformation Initialize(IConfiguration configuration) + { + return null; + } + + public IDisposable Start(IServerInformation serverInformation, Func application) + { + application(_featuresSupportedByThisHost).Wait(); + return null; + } + } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 0d307555cb..de8dbc8b81 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -5,6 +5,7 @@ "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "frameworks": { From 86bd393d3d884872965daf535c8e005a2dcde66e Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 21 Apr 2015 10:23:22 -0700 Subject: [PATCH 0567/1838] Add string+PathString operator to prevent too much string<->PathString implicit conversion. --- src/Microsoft.AspNet.Http.Core/PathString.cs | 12 ++++++++++++ .../PathStringTests.cs | 14 ++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs index 11249afb91..fe33adc2ba 100644 --- a/src/Microsoft.AspNet.Http.Core/PathString.cs +++ b/src/Microsoft.AspNet.Http.Core/PathString.cs @@ -215,6 +215,18 @@ namespace Microsoft.AspNet.Http return !left.Equals(right, StringComparison.OrdinalIgnoreCase); } + /// + /// + /// The left parameter + /// The right parameter + /// The ToString combination of both values + public static string operator +(string left, PathString right) + { + // This overload exists to prevent the implicit string<->PathString converter from + // trying to call the PathString+PathString operator for things that are not path strings. + return string.Concat(left, right.ToString()); + } + /// /// Operator call through to Add /// diff --git a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs index d547c0a4ac..d4a5502cbb 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs @@ -50,5 +50,19 @@ namespace Microsoft.AspNet.Http // Assert Assert.Equal(expected, result.Value); } + + [Fact] + public void ImplicitStringConverters_WorksWithAdd() + { + var scheme = "http"; + var host = new HostString("localhost:80"); + var pathBase = new PathString("/base"); + var path = new PathString("/path"); + var query = new QueryString("?query"); + var fragment = new FragmentString("#frag"); + + var result = scheme + "://" + host + pathBase + path + query + fragment; + Assert.Equal("http://localhost:80/base/path?query#frag", result); + } } } From 65e57d28f31c9966e208ae3182c81b65008c639a Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 21 Apr 2015 11:08:54 -0700 Subject: [PATCH 0568/1838] Add PathString+string operator to prevent too much string<->PathString implicit conversion. --- src/Microsoft.AspNet.Http.Core/PathString.cs | 12 ++++++++++++ .../PathStringTests.cs | 6 ++++++ 2 files changed, 18 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Core/PathString.cs index fe33adc2ba..cff6e1d3c6 100644 --- a/src/Microsoft.AspNet.Http.Core/PathString.cs +++ b/src/Microsoft.AspNet.Http.Core/PathString.cs @@ -227,6 +227,18 @@ namespace Microsoft.AspNet.Http return string.Concat(left, right.ToString()); } + /// + /// + /// The left parameter + /// The right parameter + /// The ToString combination of both values + public static string operator +(PathString left, string right) + { + // This overload exists to prevent the implicit string<->PathString converter from + // trying to call the PathString+PathString operator for things that are not path strings. + return string.Concat(left.ToString(), right); + } + /// /// Operator call through to Add /// diff --git a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs index d4a5502cbb..720b3b0814 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs @@ -63,6 +63,12 @@ namespace Microsoft.AspNet.Http var result = scheme + "://" + host + pathBase + path + query + fragment; Assert.Equal("http://localhost:80/base/path?query#frag", result); + + result = pathBase + path + query + fragment; + Assert.Equal("/base/path?query#frag", result); + + result = path + "text"; + Assert.Equal("/pathtext", result); } } } From 1248c7a76b7067fe655011505f90d06dc49fa74b Mon Sep 17 00:00:00 2001 From: Praburaj Date: Tue, 21 Apr 2015 11:35:14 -0700 Subject: [PATCH 0569/1838] Assigning application pool runtime version to 4.0.30319 explicitly I'm noticing that leaving it to an empty value defaults to 4.0 runtime on Win8.1 and above. But on downlevel OSes this defaults to v2.0 app pool resulting in errors. Always assigning the app pool version explicitly. --- .../Deployers/IISDeployer.cs | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index bdc5ac70c6..45749a82ba 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -117,8 +117,9 @@ namespace Microsoft.AspNet.Server.Testing private class IISApplication { - private const string WEBSITE_NAME = "ASPNETTESTRUNS"; - private const string NATIVE_MODULE_MANAGED_RUNTIME_VERSION = "vCoreFX"; + private const string WebSiteName = "ASPNETTESTRUNS"; + private const string NativeModuleManagedRuntimeVersion = "vCoreFX"; + private const string Dotnet45RuntimeVersion = "v4.0.30319"; private readonly ServerManager _serverManager = new ServerManager(); private readonly DeploymentParameters _deploymentParameters; @@ -139,7 +140,7 @@ namespace Microsoft.AspNet.Server.Testing return Path.Combine( Environment.GetEnvironmentVariable("SystemDrive") + @"\", "inetpub", - WEBSITE_NAME); + WebSiteName); } } @@ -162,10 +163,10 @@ namespace Microsoft.AspNet.Server.Testing { get { - _website = _serverManager.Sites.Where(s => s.Name == WEBSITE_NAME).FirstOrDefault(); + _website = _serverManager.Sites.Where(s => s.Name == WebSiteName).FirstOrDefault(); if (_website == null) { - _website = _serverManager.Sites.Add(WEBSITE_NAME, WebSiteRootFolder, Port); + _website = _serverManager.Sites.Add(WebSiteName, WebSiteRootFolder, Port); } return _website; @@ -175,11 +176,10 @@ namespace Microsoft.AspNet.Server.Testing private ApplicationPool CreateAppPool(string appPoolName) { var applicationPool = _serverManager.ApplicationPools.Add(appPoolName); - if (_deploymentParameters.ServerType == ServerType.IISNativeModule) - { - // Not assigning a runtime version will choose v4.0 default. - applicationPool.ManagedRuntimeVersion = NATIVE_MODULE_MANAGED_RUNTIME_VERSION; - } + applicationPool.ManagedRuntimeVersion = + _deploymentParameters.ServerType == ServerType.IISNativeModule ? + NativeModuleManagedRuntimeVersion : + Dotnet45RuntimeVersion; applicationPool.Enable32BitAppOnWin64 = (_deploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86); _logger.LogInformation("Created {bit} application pool '{name}' with runtime version {runtime}.", From d4132d98fdd611d8f77e66f27fe8b37269d9ebb5 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Fri, 17 Apr 2015 15:13:30 -0700 Subject: [PATCH 0570/1838] Moved CommonTestEncoder to Testing repo --- .../CommonTestEncoder.cs | 103 ------------------ ...EncoderServiceCollectionExtensionsTests.cs | 1 + .../project.json | 1 + 3 files changed, 2 insertions(+), 103 deletions(-) delete mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs deleted file mode 100644 index 0d38957303..0000000000 --- a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Runtime.CompilerServices; - -namespace Microsoft.Framework.WebEncoders -{ - /// - /// Dummy encoder used for unit testing. - /// - public sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder - { - /// - /// Returns "HtmlEncode[[value]]". - /// - public string HtmlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "JavaScriptStringEncode[[value]]". - /// - public string JavaScriptStringEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "UrlEncode[[value]]". - /// - public string UrlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) - { - return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); - } - - private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); - } - - private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); - } - } -} diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index d629184281..b8ddbef391 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -4,6 +4,7 @@ using System; using Xunit; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.WebEncoders.Testing; namespace Microsoft.Framework.WebEncoders { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index b24bd45764..4acf0c6ad2 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "Moq": "4.2.1312.1622", "Newtonsoft.Json": "6.0.6", "xunit.runner.aspnet": "2.0.0-aspnet-*" From 25aed6f88e5bf5f3c9ca31d589648db5d7231561 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 22 Apr 2015 11:43:12 -0700 Subject: [PATCH 0571/1838] #274 Reorganize the strong header type extensions. Remove SendAsync extensions. --- .../HeaderDictionaryTypeExtensions.cs | 24 +-- .../HttpResponseSendingExtensions.cs | 153 ------------------ .../RequestHeaders.cs | 31 ++++ .../ResponseHeaders.cs | 31 ++++ .../HeaderDictionaryTypeExtensionsTest.cs | 76 ++++----- .../HttpResponseSendingExtensionsTests.cs | 86 ---------- 6 files changed, 108 insertions(+), 293 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs delete mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 02178a65cd..db8eb01b76 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -23,12 +23,14 @@ namespace Microsoft.AspNet.Http return new ResponseHeaders(response.Headers); } - public static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) + // These are all shared helpers used by both RequestHeaders and ResponseHeaders + + internal static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) { return headers.Get(name); } - public static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) + internal static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) { if (value == null) { @@ -40,7 +42,7 @@ namespace Microsoft.AspNet.Http } } - public static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) + internal static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) { if (values == null || values.Count == 0) { @@ -52,7 +54,7 @@ namespace Microsoft.AspNet.Http } } - public static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) + internal static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) { if (value.HasValue) { @@ -64,16 +66,6 @@ namespace Microsoft.AspNet.Http } } - public static void Append([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] object value) - { - headers.Append(name, value.ToString()); - } - - public static void AppendList([NotNull] this IHeaderDictionary headers, [NotNull] string name, [NotNull] IList values) - { - headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); - } - private static IDictionary KnownParsers = new Dictionary() { { typeof(CacheControlHeaderValue), new Func(value => { CacheControlHeaderValue result; return CacheControlHeaderValue.TryParse(value, out result) ? result : null; }) }, @@ -96,7 +88,7 @@ namespace Microsoft.AspNet.Http { typeof(SetCookieHeaderValue), new Func, IList>(value => { IList result; return SetCookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, }; - public static T Get([NotNull] this IHeaderDictionary headers, string name) + internal static T Get([NotNull] this IHeaderDictionary headers, string name) { object temp; if (KnownParsers.TryGetValue(typeof(T), out temp)) @@ -114,7 +106,7 @@ namespace Microsoft.AspNet.Http return GetViaReflection(value); } - public static IList GetList([NotNull] this IHeaderDictionary headers, string name) + internal static IList GetList([NotNull] this IHeaderDictionary headers, string name) { object temp; if (KnownListParsers.TryGetValue(typeof(T), out temp)) diff --git a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs deleted file mode 100644 index 40d4f1c3c7..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/HttpResponseSendingExtensions.cs +++ /dev/null @@ -1,153 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Framework.Internal; - -namespace Microsoft.AspNet.Http -{ - /// - /// Convenience methods for writing to the response. - /// - public static class HttpResponseSendingExtensions - { - /// - /// Sends a response with the given Content-Type and body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(text, Encoding.UTF8, contentType, cancellationToken); - } - - /// - /// Sends a response with the given Content-Type, encoding, and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - if (string.IsNullOrEmpty(contentType)) - { - throw new ArgumentException("Empty Content-Type is not allowed."); - } - if (contentType.IndexOf("charset=", StringComparison.OrdinalIgnoreCase) < 0) - { - contentType += "; charset=" + encoding.WebName; - } - response.ContentType = contentType; - return response.SendAsync(text, encoding, cancellationToken); - } - - /// - /// Sends a response with the given body. UTF-8 encoding will be used, and the Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(text, Encoding.UTF8, cancellationToken); - } - - /// - /// Sends a response with the given encoding and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) - { - byte[] data = encoding.GetBytes(text); - return response.SendAsync(data, cancellationToken); - } - - /// - /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(new ArraySegment(data), contentType, cancellationToken); - } - - /// - /// Sends a response with the given Content-Type and body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, [NotNull] string contentType, CancellationToken cancellationToken = default(CancellationToken)) - { - if (string.IsNullOrEmpty(contentType)) - { - throw new ArgumentException("Empty Content-Type is not allowed."); - } - response.ContentType = contentType; - return response.SendAsync(data, cancellationToken); - } - - /// - /// Sends a response with the given body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(new ArraySegment(data), cancellationToken); - } - - /// - /// Sends a response with the given body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, [NotNull] byte[] data, int offset, int count, CancellationToken cancellationToken = default(CancellationToken)) - { - return response.SendAsync(new ArraySegment(data, offset, count), cancellationToken); - } - - /// - /// Sends a response with the given body. The Content-Length header will be set accordingly. - /// - /// - /// - /// - /// - public static Task SendAsync([NotNull] this HttpResponse response, ArraySegment data, CancellationToken cancellationToken = default(CancellationToken)) - { - if (data.Array == null) - { - throw new ArgumentException("The Array cannot be null.", "data"); // TODO: LOC - } - response.ContentLength = data.Count; - return response.Body.WriteAsync(data.Array, data.Offset, data.Count, cancellationToken); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index 21499b8092..fb10af0bab 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; @@ -256,5 +257,35 @@ namespace Microsoft.AspNet.Http.Headers Headers.Set(HeaderNames.Range, value); } } + + public T Get(string name) + { + return Headers.Get(name); + } + + public IList GetList(string name) + { + return Headers.GetList(name); + } + + public void Set([NotNull] string name, object value) + { + Headers.Set(name, value); + } + + public void SetList([NotNull] string name, IList values) + { + Headers.SetList(name, values); + } + + public void Append([NotNull] string name, [NotNull] object value) + { + Headers.Append(name, value.ToString()); + } + + public void AppendList([NotNull] string name, [NotNull] IList values) + { + Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index c88430eed8..3f4103ab83 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Microsoft.AspNet.Http.Extensions; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; @@ -153,5 +154,35 @@ namespace Microsoft.AspNet.Http.Headers Headers.SetList(HeaderNames.SetCookie, value); } } + + public T Get(string name) + { + return Headers.Get(name); + } + + public IList GetList(string name) + { + return Headers.GetList(name); + } + + public void Set([NotNull] string name, object value) + { + Headers.Set(name, value); + } + + public void SetList([NotNull] string name, IList values) + { + Headers.SetList(name, values); + } + + public void Append([NotNull] string name, [NotNull] object value) + { + Headers.Append(name, value.ToString()); + } + + public void AppendList([NotNull] string name, [NotNull] IList values) + { + Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index ccd20be196..4495cbb364 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -15,10 +15,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_KnownTypeWithValidValue_Success() { - var headers = new HeaderDictionary(); - headers[HeaderNames.ContentType] = "text/plain"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.ContentType] = "text/plain"; - var result = headers.Get(HeaderNames.ContentType); + var result = context.Request.GetTypedHeaders().Get(HeaderNames.ContentType); var expected = new MediaTypeHeaderValue("text/plain"); Assert.Equal(expected, result); @@ -27,9 +27,9 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_KnownTypeWithMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var result = headers.Get(HeaderNames.ContentType); + var result = context.Request.GetTypedHeaders().Get(HeaderNames.ContentType); Assert.Null(result); } @@ -37,10 +37,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_KnownTypeWithInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers[HeaderNames.ContentType] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.ContentType] = "invalid"; - var result = headers.Get(HeaderNames.ContentType); + var result = context.Request.GetTypedHeaders().Get(HeaderNames.ContentType); Assert.Null(result); } @@ -48,48 +48,48 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetT_UnknownTypeWithTryParseAndValidValue_Success() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - var result = headers.Get("custom"); + var result = context.Request.GetTypedHeaders().Get("custom"); Assert.NotNull(result); } [Fact] public void GetT_UnknownTypeWithTryParseAndInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers["custom"] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "invalid"; - var result = headers.Get("custom"); + var result = context.Request.GetTypedHeaders().Get("custom"); Assert.Null(result); } [Fact] public void GetT_UnknownTypeWithTryParseAndMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var result = headers.Get("custom"); + var result = context.Request.GetTypedHeaders().Get("custom"); Assert.Null(result); } [Fact] public void GetT_UnknownTypeWithoutTryParse_Throws() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - Assert.Throws(() => headers.Get("custom")); + Assert.Throws(() => context.Request.GetTypedHeaders().Get("custom")); } [Fact] public void GetListT_KnownTypeWithValidValue_Success() { - var headers = new HeaderDictionary(); - headers[HeaderNames.Accept] = "text/plain; q=0.9, text/other, */*"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.Accept] = "text/plain; q=0.9, text/other, */*"; - var result = headers.GetList(HeaderNames.Accept); + var result = context.Request.GetTypedHeaders().GetList(HeaderNames.Accept); var expected = new[] { new MediaTypeHeaderValue("text/plain", 0.9), @@ -102,9 +102,9 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_KnownTypeWithMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var result = headers.GetList(HeaderNames.Accept); + var result = context.Request.GetTypedHeaders().GetList(HeaderNames.Accept); Assert.Null(result); } @@ -112,10 +112,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_KnownTypeWithInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers[HeaderNames.Accept] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers[HeaderNames.Accept] = "invalid"; - var result = headers.GetList(HeaderNames.Accept); + var result = context.Request.GetTypedHeaders().GetList(HeaderNames.Accept); Assert.Null(result); } @@ -123,10 +123,10 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_UnknownTypeWithTryParseListAndValidValue_Success() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - var results = headers.GetList("custom"); + var results = context.Request.GetTypedHeaders().GetList("custom"); Assert.NotNull(results); Assert.Equal(new[] { new TestHeaderValue() }.ToList(), results); } @@ -134,29 +134,29 @@ namespace Microsoft.AspNet.Http.Headers [Fact] public void GetListT_UnknownTypeWithTryParseListAndInvalidValue_Null() { - var headers = new HeaderDictionary(); - headers["custom"] = "invalid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "invalid"; - var results = headers.GetList("custom"); + var results = context.Request.GetTypedHeaders().GetList("custom"); Assert.Null(results); } [Fact] public void GetListT_UnknownTypeWithTryParseListAndMissingValue_Null() { - var headers = new HeaderDictionary(); + var context = new DefaultHttpContext(); - var results = headers.GetList("custom"); + var results = context.Request.GetTypedHeaders().GetList("custom"); Assert.Null(results); } [Fact] public void GetListT_UnknownTypeWithoutTryParseList_Throws() { - var headers = new HeaderDictionary(); - headers["custom"] = "valid"; + var context = new DefaultHttpContext(); + context.Request.Headers["custom"] = "valid"; - Assert.Throws(() => headers.GetList("custom")); + Assert.Throws(() => context.Request.GetTypedHeaders().GetList("custom")); } public class TestHeaderValue diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs deleted file mode 100644 index 6f30bc053a..0000000000 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HttpResponseSendingExtensionsTests.cs +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Text; -using System.Threading.Tasks; -using Xunit; - -namespace Microsoft.AspNet.Http.Extensions -{ - public class HttpResponseSendingExtensionsTests - { - [Fact] - public async Task SendData_SendBytes() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync(new byte[10]); - - Assert.Equal(10, context.Response.Body.Length); - Assert.Equal(10, context.Response.ContentLength); - Assert.Null(context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendBytesAndContentType() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync(new byte[10], "text/html"); - - Assert.Equal(10, context.Response.Body.Length); - Assert.Equal(10, context.Response.ContentLength); - Assert.Equal("text/html", context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendText() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World"); - - Assert.Equal(11, context.Response.Body.Length); - Assert.Equal(11, context.Response.ContentLength); - Assert.Null(context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendTextWithContentType() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World", "text/html"); - - Assert.Equal(11, context.Response.Body.Length); - Assert.Equal(11, context.Response.ContentLength); - Assert.Equal("text/html; charset=utf-8", context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendTextWithEncoding() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World", Encoding.UTF32); - - Assert.Equal(44, context.Response.Body.Length); - Assert.Equal(44, context.Response.ContentLength); - Assert.Null(context.Response.ContentType); - } - - [Fact] - public async Task SendData_SendTextWithContentTypeAndEncoding() - { - HttpContext context = CreateRequest(); - await context.Response.SendAsync("Hello World", Encoding.UTF32, "text/html"); - - Assert.Equal(44, context.Response.Body.Length); - Assert.Equal(44, context.Response.ContentLength); - Assert.Equal("text/html; charset=utf-32", context.Response.ContentType); - } - - private HttpContext CreateRequest() - { - HttpContext context = new DefaultHttpContext(); - context.Response.Body = new MemoryStream(); - return context; - } - } -} From 663bf4f0f95bb09832182d83e914c05f29eb2900 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 23 Apr 2015 11:59:17 -0700 Subject: [PATCH 0572/1838] Handle FileProviders package rename. --- src/Microsoft.AspNet.Hosting/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 8253c2503b..68028eeede 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { - "Microsoft.AspNet.FileProviders": "1.0.0-*", + "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", "Microsoft.AspNet.Hosting.Server.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", From 4637a951570d7bc264b4f526ada49cbc563cfe1c Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 10:02:00 -0700 Subject: [PATCH 0573/1838] #266 Consolidate authentication APIs. --- .../Authentication/AuthenticationManager.cs | 46 ++++++ src/Microsoft.AspNet.Http.Core/HttpContext.cs | 9 +- src/Microsoft.AspNet.Http.Core/HttpRequest.cs | 5 - .../HttpResponse.cs | 37 +---- .../DefaultAuthenticationManager.cs | 141 ++++++++++++++++++ .../DefaultHttpContext.cs | 55 +------ .../DefaultHttpResponse.cs | 67 --------- .../DefaultHttpContextTests.cs | 22 +-- 8 files changed, 208 insertions(+), 174 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs create mode 100644 src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs new file mode 100644 index 0000000000..219e909221 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http.Authentication +{ + public abstract class AuthenticationManager + { + public abstract IEnumerable GetAuthenticationSchemes(); + + public abstract AuthenticationResult Authenticate(string authenticationScheme); + + public abstract Task AuthenticateAsync(string authenticationScheme); + + public virtual void Challenge() + { + Challenge(properties: null, authenticationScheme: null); + } + + public virtual void Challenge(AuthenticationProperties properties) + { + Challenge(properties, ""); + } + + public virtual void Challenge(string authenticationScheme) + { + Challenge(properties: null, authenticationScheme: authenticationScheme); + } + + public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); + + public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); + + public virtual void SignOut() + { + SignOut(authenticationScheme: null, properties: null); + } + + public abstract void SignOut(string authenticationScheme); + + public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); + } +} diff --git a/src/Microsoft.AspNet.Http.Core/HttpContext.cs b/src/Microsoft.AspNet.Http.Core/HttpContext.cs index 47f595df17..83457e775c 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpContext.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Net.WebSockets; using System.Security.Claims; using System.Threading; @@ -20,6 +19,8 @@ namespace Microsoft.AspNet.Http public abstract ConnectionInfo Connection { get; } + public abstract AuthenticationManager Authentication { get; } + public abstract ClaimsPrincipal User { get; set; } public abstract IDictionary Items { get; } @@ -54,12 +55,6 @@ namespace Microsoft.AspNet.Http SetFeature(typeof(T), instance); } - public abstract IEnumerable GetAuthenticationSchemes(); - - public abstract AuthenticationResult Authenticate(string authenticationScheme); - - public abstract Task AuthenticateAsync(string authenticationScheme); - public virtual Task AcceptWebSocketAsync() { return AcceptWebSocketAsync(subProtocol: null); diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequest.cs b/src/Microsoft.AspNet.Http.Core/HttpRequest.cs index 7465c30638..5252c8649f 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpRequest.cs @@ -1,9 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections; -using System.Collections.Generic; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -12,8 +9,6 @@ namespace Microsoft.AspNet.Http { public abstract class HttpRequest { - // TODO - review IOwinRequest for properties - public abstract HttpContext HttpContext { get; } /// diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponse.cs b/src/Microsoft.AspNet.Http.Core/HttpResponse.cs index 97c0a63e50..4721f9a4b4 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpResponse.cs @@ -2,23 +2,22 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; -using System.Security.Claims; -using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http { public abstract class HttpResponse { - // TODO - review IOwinResponse for completeness - public abstract HttpContext HttpContext { get; } + public abstract int StatusCode { get; set; } + public abstract IHeaderDictionary Headers { get; } + public abstract Stream Body { get; set; } public abstract long? ContentLength { get; set; } + public abstract string ContentType { get; set; } public abstract IResponseCookies Cookies { get; } @@ -35,33 +34,5 @@ namespace Microsoft.AspNet.Http } public abstract void Redirect(string location, bool permanent); - - public virtual void Challenge() - { - Challenge(properties: null, authenticationScheme: null); - } - - public virtual void Challenge(AuthenticationProperties properties) - { - Challenge(properties, ""); - } - - public virtual void Challenge(string authenticationScheme) - { - Challenge(properties: null, authenticationScheme: authenticationScheme); - } - - public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); - - public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); - - public virtual void SignOut() - { - SignOut(authenticationScheme: null, properties: null); - } - - public abstract void SignOut(string authenticationScheme); - - public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs new file mode 100644 index 0000000000..76369f246d --- /dev/null +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -0,0 +1,141 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Http.Authentication +{ + public class DefaultAuthenticationManager : AuthenticationManager + { + private readonly IFeatureCollection _features; + private FeatureReference _authentication = FeatureReference.Default; + private FeatureReference _response = FeatureReference.Default; + + public DefaultAuthenticationManager(IFeatureCollection features) + { + _features = features; + } + + private IHttpAuthenticationFeature HttpAuthenticationFeature + { + get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } + } + + private IHttpResponseFeature HttpResponseFeature + { + get { return _response.Fetch(_features); } + } + + public override IEnumerable GetAuthenticationSchemes() + { + var handler = HttpAuthenticationFeature.Handler; + if (handler == null) + { + return new AuthenticationDescription[0]; + } + + var describeContext = new DescribeSchemesContext(); + handler.GetDescriptions(describeContext); + return describeContext.Results; + } + + public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) + { + var handler = HttpAuthenticationFeature.Handler; + + var authenticateContext = new AuthenticateContext(authenticationScheme); + if (handler != null) + { + handler.Authenticate(authenticateContext); + } + + if (!authenticateContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + + return authenticateContext.Result; + } + + public override async Task AuthenticateAsync([NotNull] string authenticationScheme) + { + var handler = HttpAuthenticationFeature.Handler; + + var authenticateContext = new AuthenticateContext(authenticationScheme); + if (handler != null) + { + await handler.AuthenticateAsync(authenticateContext); + } + + // Verify all types ack'd + if (!authenticateContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + + return authenticateContext.Result; + } + + public override void Challenge(AuthenticationProperties properties, string authenticationScheme) + { + HttpResponseFeature.StatusCode = 401; + var handler = HttpAuthenticationFeature.Handler; + + var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); + if (handler != null) + { + handler.Challenge(challengeContext); + } + + if (!challengeContext.Accepted) + { + throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); + } + } + + public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + { + var handler = HttpAuthenticationFeature.Handler; + + var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); + if (handler != null) + { + handler.SignIn(signInContext); + } + + // Verify all types ack'd + if (!signInContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + } + + public override void SignOut(string authenticationScheme, AuthenticationProperties properties) + { + var handler = HttpAuthenticationFeature.Handler; + + var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); + if (handler != null) + { + handler.SignOut(signOutContext); + } + + // Verify all types ack'd + if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) + { + throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + } + } + + public override void SignOut(string authenticationScheme) + { + SignOut(authenticationScheme, properties: null); + } + } +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 81aef590ff..7dc14893b5 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -11,7 +11,6 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http @@ -23,6 +22,7 @@ namespace Microsoft.AspNet.Http private readonly HttpRequest _request; private readonly HttpResponse _response; private readonly ConnectionInfo _connection; + private readonly AuthenticationManager _authenticationManager; private FeatureReference _items; private FeatureReference _serviceProviders; @@ -45,6 +45,7 @@ namespace Microsoft.AspNet.Http _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); _connection = new DefaultConnectionInfo(features); + _authenticationManager = new DefaultAuthenticationManager(features); _items = FeatureReference.Default; _serviceProviders = FeatureReference.Default; @@ -90,6 +91,8 @@ namespace Microsoft.AspNet.Http public override ConnectionInfo Connection { get { return _connection; } } + public override AuthenticationManager Authentication { get { return _authenticationManager; } } + public override ClaimsPrincipal User { get @@ -201,56 +204,6 @@ namespace Microsoft.AspNet.Http _features[type] = instance; } - public override IEnumerable GetAuthenticationSchemes() - { - var handler = HttpAuthenticationFeature.Handler; - if (handler == null) - { - return new AuthenticationDescription[0]; - } - - var describeContext = new DescribeSchemesContext(); - handler.GetDescriptions(describeContext); - return describeContext.Results; - } - - public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) - { - var handler = HttpAuthenticationFeature.Handler; - - var authenticateContext = new AuthenticateContext(authenticationScheme); - if (handler != null) - { - handler.Authenticate(authenticateContext); - } - - if (!authenticateContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - - return authenticateContext.Result; - } - - public override async Task AuthenticateAsync([NotNull] string authenticationScheme) - { - var handler = HttpAuthenticationFeature.Handler; - - var authenticateContext = new AuthenticateContext(authenticationScheme); - if (handler != null) - { - await handler.AuthenticateAsync(authenticateContext); - } - - // Verify all types ack'd - if (!authenticateContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - - return authenticateContext.Result; - } - public override Task AcceptWebSocketAsync(string subProtocol) { var webSocketFeature = WebSocketFeature; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index a5a3e9a438..026ce3b2f1 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -2,15 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; -using System.Linq; -using System.Security.Claims; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http @@ -21,7 +16,6 @@ namespace Microsoft.AspNet.Http private readonly IFeatureCollection _features; private FeatureReference _response = FeatureReference.Default; private FeatureReference _cookies = FeatureReference.Default; - private FeatureReference _authentication = FeatureReference.Default; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -39,11 +33,6 @@ namespace Microsoft.AspNet.Http get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); } } - private IHttpAuthenticationFeature HttpAuthenticationFeature - { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } - } - public override HttpContext HttpContext { get { return _context; } } public override int StatusCode @@ -128,61 +117,5 @@ namespace Microsoft.AspNet.Http Headers.Set(HeaderNames.Location, location); } - - public override void Challenge(AuthenticationProperties properties, string authenticationScheme) - { - HttpResponseFeature.StatusCode = 401; - var handler = HttpAuthenticationFeature.Handler; - - var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); - if (handler != null) - { - handler.Challenge(challengeContext); - } - - if (!challengeContext.Accepted) - { - throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); - } - } - - public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) - { - var handler = HttpAuthenticationFeature.Handler; - - var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); - if (handler != null) - { - handler.SignIn(signInContext); - } - - // Verify all types ack'd - if (!signInContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - } - - public override void SignOut(string authenticationScheme, AuthenticationProperties properties) - { - var handler = HttpAuthenticationFeature.Handler; - - var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); - if (handler != null) - { - handler.SignOut(signOutContext); - } - - // Verify all types ack'd - if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) - { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); - } - } - - public override void SignOut(string authenticationScheme) - { - SignOut(authenticationScheme, properties: null); - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index d46ff5d6e7..c53c3c73c2 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -46,34 +46,34 @@ namespace Microsoft.AspNet.Http public async Task AuthenticateWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Authenticate("Foo")); - await Assert.ThrowsAsync(async () => await context.AuthenticateAsync("Foo")); + Assert.Throws(() => context.Authentication.Authenticate("Foo")); + await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); } [Fact] public void ChallengeWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Response.Challenge(); + context.Authentication.Challenge(); Assert.Equal(401, context.Response.StatusCode); - Assert.Throws(() => context.Response.Challenge("Foo")); + Assert.Throws(() => context.Authentication.Challenge("Foo")); } [Fact] public void SignInWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Response.SignIn("Foo", new ClaimsPrincipal())); + Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); } [Fact] public void SignOutWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Response.SignOut(); + context.Authentication.SignOut(); - Assert.Throws(() => context.Response.SignOut("Foo")); + Assert.Throws(() => context.Authentication.SignOut("Foo")); } [Fact] @@ -83,13 +83,13 @@ namespace Microsoft.AspNet.Http var handler = new AuthHandler(); context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); var user = new ClaimsPrincipal(); - context.Response.SignIn("ignored", user); + context.Authentication.SignIn("ignored", user); Assert.True(handler.SignedIn); - context.Response.SignOut("ignored"); + context.Authentication.SignOut("ignored"); Assert.False(handler.SignedIn); - context.Response.SignIn("ignored", user); + context.Authentication.SignIn("ignored", user); Assert.True(handler.SignedIn); - context.Response.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); Assert.False(handler.SignedIn); } From a174bb299e202b6364889324ae4c78650d16f3ae Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 17 Apr 2015 10:05:32 -0700 Subject: [PATCH 0574/1838] #270 Rename auth wrapper's internal collections to Items. --- .../AuthenticationDescription.cs | 16 +++--- .../AuthenticationProperties.cs | 52 +++++++++---------- .../DefaultAuthenticationManager.cs | 6 +-- 3 files changed, 37 insertions(+), 37 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs index 81653dd166..16b2c43247 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs @@ -21,22 +21,22 @@ namespace Microsoft.AspNet.Http.Authentication /// public AuthenticationDescription() { - Dictionary = new Dictionary(StringComparer.Ordinal); + Items = new Dictionary(StringComparer.Ordinal); } /// /// Initializes a new instance of the class /// - /// - public AuthenticationDescription([NotNull] IDictionary properties) + /// + public AuthenticationDescription([NotNull] IDictionary items) { - Dictionary = properties; + Items = items; } /// /// Contains metadata about the authentication provider. /// - public IDictionary Dictionary { get; private set; } + public IDictionary Items { get; private set; } /// /// Gets or sets the name used to reference the authentication middleware instance. @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Authentication public string AuthenticationScheme { get { return GetString(AuthenticationSchemePropertyKey); } - set { Dictionary[AuthenticationSchemePropertyKey] = value; } + set { Items[AuthenticationSchemePropertyKey] = value; } } /// @@ -53,13 +53,13 @@ namespace Microsoft.AspNet.Http.Authentication public string Caption { get { return GetString(CaptionPropertyKey); } - set { Dictionary[CaptionPropertyKey] = value; } + set { Items[CaptionPropertyKey] = value; } } private string GetString(string name) { object value; - if (Dictionary.TryGetValue(name, out value)) + if (Items.TryGetValue(name, out value)) { return Convert.ToString(value, CultureInfo.InvariantCulture); } diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs index 475dd027d9..f6574163c7 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs @@ -24,51 +24,51 @@ namespace Microsoft.AspNet.Http.Authentication /// Initializes a new instance of the class /// public AuthenticationProperties() - : this(dictionary: null) + : this(items: null) { } /// /// Initializes a new instance of the class /// - /// - public AuthenticationProperties(IDictionary dictionary) + /// + public AuthenticationProperties(IDictionary items) { - Dictionary = dictionary ?? new Dictionary(StringComparer.Ordinal); + Items = items ?? new Dictionary(StringComparer.Ordinal); } /// /// State values about the authentication session. /// - public IDictionary Dictionary { get; private set; } + public IDictionary Items { get; private set; } /// /// Gets or sets whether the authentication session is persisted across multiple requests. /// public bool IsPersistent { - get { return Dictionary.ContainsKey(IsPersistentKey); } + get { return Items.ContainsKey(IsPersistentKey); } set { - if (Dictionary.ContainsKey(IsPersistentKey)) + if (Items.ContainsKey(IsPersistentKey)) { if (!value) { - Dictionary.Remove(IsPersistentKey); + Items.Remove(IsPersistentKey); } } else { if (value) { - Dictionary.Add(IsPersistentKey, string.Empty); + Items.Add(IsPersistentKey, string.Empty); } } } } /// - /// Gets or sets the full path or absolute URI to be used as an http redirect response value. + /// Gets or sets the full path or absolute URI to be used as an http redirect response value. /// [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] public string RedirectUri @@ -76,19 +76,19 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - return Dictionary.TryGetValue(RedirectUriKey, out value) ? value : null; + return Items.TryGetValue(RedirectUriKey, out value) ? value : null; } set { if (value != null) { - Dictionary[RedirectUriKey] = value; + Items[RedirectUriKey] = value; } else { - if (Dictionary.ContainsKey(RedirectUriKey)) + if (Items.ContainsKey(RedirectUriKey)) { - Dictionary.Remove(RedirectUriKey); + Items.Remove(RedirectUriKey); } } } @@ -102,7 +102,7 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - if (Dictionary.TryGetValue(IssuedUtcKey, out value)) + if (Items.TryGetValue(IssuedUtcKey, out value)) { DateTimeOffset dateTimeOffset; if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) @@ -116,13 +116,13 @@ namespace Microsoft.AspNet.Http.Authentication { if (value.HasValue) { - Dictionary[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + Items[IssuedUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); } else { - if (Dictionary.ContainsKey(IssuedUtcKey)) + if (Items.ContainsKey(IssuedUtcKey)) { - Dictionary.Remove(IssuedUtcKey); + Items.Remove(IssuedUtcKey); } } } @@ -136,7 +136,7 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - if (Dictionary.TryGetValue(ExpiresUtcKey, out value)) + if (Items.TryGetValue(ExpiresUtcKey, out value)) { DateTimeOffset dateTimeOffset; if (DateTimeOffset.TryParseExact(value, UtcDateTimeFormat, CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind, out dateTimeOffset)) @@ -150,13 +150,13 @@ namespace Microsoft.AspNet.Http.Authentication { if (value.HasValue) { - Dictionary[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); + Items[ExpiresUtcKey] = value.Value.ToString(UtcDateTimeFormat, CultureInfo.InvariantCulture); } else { - if (Dictionary.ContainsKey(ExpiresUtcKey)) + if (Items.ContainsKey(ExpiresUtcKey)) { - Dictionary.Remove(ExpiresUtcKey); + Items.Remove(ExpiresUtcKey); } } } @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Http.Authentication get { string value; - if (Dictionary.TryGetValue(RefreshKey, out value)) + if (Items.TryGetValue(RefreshKey, out value)) { bool refresh; if (bool.TryParse(value, out refresh)) @@ -184,13 +184,13 @@ namespace Microsoft.AspNet.Http.Authentication { if (value.HasValue) { - Dictionary[RefreshKey] = value.Value.ToString(); + Items[RefreshKey] = value.Value.ToString(); } else { - if (Dictionary.ContainsKey(RefreshKey)) + if (Items.ContainsKey(RefreshKey)) { - Dictionary.Remove(RefreshKey); + Items.Remove(RefreshKey); } } } diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 76369f246d..9fccca6116 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Authentication HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Dictionary); + var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Items); if (handler != null) { handler.Challenge(challengeContext); @@ -103,7 +103,7 @@ namespace Microsoft.AspNet.Http.Authentication { var handler = HttpAuthenticationFeature.Handler; - var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Dictionary); + var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Items); if (handler != null) { handler.SignIn(signInContext); @@ -120,7 +120,7 @@ namespace Microsoft.AspNet.Http.Authentication { var handler = HttpAuthenticationFeature.Handler; - var signOutContext = new SignOutContext(authenticationScheme, properties?.Dictionary); + var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); if (handler != null) { handler.SignOut(signOutContext); From cc1a24b949a000856fabdaa683a526949251ba45 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Mon, 20 Apr 2015 10:35:46 -0700 Subject: [PATCH 0575/1838] #273 - Use POCOs for auth context objects. --- .../Authentication/AuthenticateContext.cs | 40 ++++++++++++++++++ .../Authentication/ChallengeContext.cs | 21 +++------- .../Authentication/DescribeSchemesContext.cs | 12 +++--- .../Authentication/IAuthenticateContext.cs | 17 -------- .../Authentication/IAuthenticationHandler.cs | 15 ++++--- .../Authentication/IChallengeContext.cs | 15 ------- .../Authentication/IDescribeSchemesContext.cs | 12 ------ .../Authentication/ISignInContext.cs | 18 -------- .../Authentication/ISignOutContext.cs | 16 -------- .../Authentication/SignInContext.cs | 21 ++++------ .../Authentication/SignOutContext.cs | 13 ++---- .../project.json | 31 ++++++++------ .../Authentication/AuthenticateContext.cs | 41 ------------------- .../DefaultAuthenticationManager.cs | 30 ++++++++------ .../DefaultHttpContextTests.cs | 14 +++---- 15 files changed, 116 insertions(+), 200 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/ChallengeContext.cs (54%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/DescribeSchemesContext.cs (60%) delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/SignInContext.cs (70%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/Authentication/SignOutContext.cs (79%) delete mode 100644 src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs new file mode 100644 index 0000000000..e76a501d73 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Security.Claims; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Http.Authentication +{ + public class AuthenticateContext + { + public AuthenticateContext([NotNull] string authenticationScheme) + { + AuthenticationScheme = authenticationScheme; + } + + public string AuthenticationScheme { get; } + + public bool Accepted { get; private set; } + + public ClaimsPrincipal Principal { get; private set; } + + public IDictionary Properties { get; private set; } + + public IDictionary Description { get; private set; } + + public virtual void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) + { + Accepted = true; + Principal = principal; + Properties = properties; + Description = description; + } + + public virtual void NotAuthenticated() + { + Accepted = true; + } + } +} diff --git a/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs similarity index 54% rename from src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs index 0a137bb645..e1b6bf8c04 100644 --- a/src/Microsoft.AspNet.Http/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs @@ -3,35 +3,26 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { - public class ChallengeContext : IChallengeContext + public class ChallengeContext { - private bool _accepted; - public ChallengeContext(string authenticationScheme, IDictionary properties) { AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); - - // The default Challenge with no scheme is always accepted - _accepted = string.IsNullOrEmpty(authenticationScheme); } - public string AuthenticationScheme { get; private set; } + public string AuthenticationScheme { get; } - public IDictionary Properties { get; private set; } + public IDictionary Properties { get; } - public bool Accepted - { - get { return _accepted; } - } + public bool Accepted { get; private set; } public void Accept() { - _accepted = true; + Accepted = true; } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs similarity index 60% rename from src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs index 6e4907949d..38daa0a856 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs @@ -5,23 +5,23 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http.Authentication { - public class DescribeSchemesContext : IDescribeSchemesContext + public class DescribeSchemesContext { - private List _results; + private List> _results; public DescribeSchemesContext() { - _results = new List(); + _results = new List>(); } - public IEnumerable Results + public IEnumerable> Results { get { return _results; } } public void Accept(IDictionary description) { - _results.Add(new AuthenticationDescription(description)); + _results.Add(description); } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs deleted file mode 100644 index ecf8b56788..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticateContext.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Security.Claims; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface IAuthenticateContext - { - string AuthenticationScheme { get; } - - void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description); - - void NotAuthenticated(); - } -} diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs index 76b3e8cb1b..04a7039a80 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs @@ -7,13 +7,16 @@ namespace Microsoft.AspNet.Http.Authentication { public interface IAuthenticationHandler { - void GetDescriptions(IDescribeSchemesContext context); + void GetDescriptions(DescribeSchemesContext context); - void Authenticate(IAuthenticateContext context); - Task AuthenticateAsync(IAuthenticateContext context); + void Authenticate(AuthenticateContext context); - void Challenge(IChallengeContext context); - void SignIn(ISignInContext context); - void SignOut(ISignOutContext context); + Task AuthenticateAsync(AuthenticateContext context); + + void Challenge(ChallengeContext context); + + void SignIn(SignInContext context); + + void SignOut(SignOutContext context); } } diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs deleted file mode 100644 index 26a90fefb2..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IChallengeContext.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface IChallengeContext - { - string AuthenticationScheme { get; } - IDictionary Properties { get; } - - void Accept(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs deleted file mode 100644 index 96f395cb37..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IDescribeSchemesContext.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface IDescribeSchemesContext - { - void Accept(IDictionary description); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs deleted file mode 100644 index c79860279d..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignInContext.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Security.Claims; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface ISignInContext - { - //IEnumerable Principals { get; } - ClaimsPrincipal Principal { get; } - IDictionary Properties { get; } - string AuthenticationScheme { get; } - - void Accept(IDictionary description); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs deleted file mode 100644 index 2bb7036026..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ISignOutContext.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http.Authentication -{ - public interface ISignOutContext - { - string AuthenticationScheme { get; } - - IDictionary Properties { get; } - - void Accept(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs similarity index 70% rename from src/Microsoft.AspNet.Http/Authentication/SignInContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs index 1a77db412b..d5d74c3186 100644 --- a/src/Microsoft.AspNet.Http/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs @@ -8,31 +8,26 @@ using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { - public class SignInContext : ISignInContext + public class SignInContext { - private bool _accepted; - - public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary dictionary) + public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary properties) { AuthenticationScheme = authenticationScheme; Principal = principal; - Properties = dictionary ?? new Dictionary(StringComparer.Ordinal); + Properties = properties ?? new Dictionary(StringComparer.Ordinal); } + public string AuthenticationScheme { get; } + public ClaimsPrincipal Principal { get; } public IDictionary Properties { get; } - public string AuthenticationScheme { get; } + public bool Accepted { get; private set; } - public bool Accepted + public void Accept() { - get { return _accepted; } - } - - public void Accept(IDictionary description) - { - _accepted = true; + Accepted = true; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs similarity index 79% rename from src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs index d78820980e..27a7d2941b 100644 --- a/src/Microsoft.AspNet.Http/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs @@ -7,10 +7,8 @@ using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { - public class SignOutContext : ISignOutContext + public class SignOutContext { - private bool _accepted; - public SignOutContext([NotNull] string authenticationScheme, IDictionary properties) { AuthenticationScheme = authenticationScheme; @@ -21,14 +19,11 @@ namespace Microsoft.AspNet.Http.Authentication public IDictionary Properties { get; } - public bool Accepted - { - get { return _accepted; } - } + public bool Accepted { get; private set; } public void Accept() { - _accepted = true; + Accepted = true; } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Interfaces/project.json index 3af7b3bdfb..d4d113923c 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/project.json +++ b/src/Microsoft.AspNet.Http.Interfaces/project.json @@ -1,16 +1,21 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature interface definitions.", - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "System.Net.Primitives": "4.0.10-beta-*", - "System.Net.WebSockets" : "4.0.0-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*" - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature interface definitions.", + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Collections": "4.0.10-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.10-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*" + } + } } - } } diff --git a/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs deleted file mode 100644 index 91d530dfad..0000000000 --- a/src/Microsoft.AspNet.Http/Authentication/AuthenticateContext.cs +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using System.Security.Claims; -using Microsoft.Framework.Internal; - -namespace Microsoft.AspNet.Http.Authentication -{ - public class AuthenticateContext : IAuthenticateContext - { - private AuthenticationResult _result; - private bool _accepted; - - public AuthenticateContext([NotNull] string authenticationScheme) - { - AuthenticationScheme = authenticationScheme; - } - - public string AuthenticationScheme { get; private set; } - - public AuthenticationResult Result { get; set; } - - public bool Accepted - { - get { return _accepted; } - } - - public void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) - { - var descrip = new AuthenticationDescription(description); - _accepted = true; - Result = new AuthenticationResult(principal, new AuthenticationProperties(properties), descrip); - } - - public void NotAuthenticated() - { - _accepted = true; - } - } -} diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 9fccca6116..e21bea9634 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; @@ -42,7 +43,7 @@ namespace Microsoft.AspNet.Http.Authentication var describeContext = new DescribeSchemesContext(); handler.GetDescriptions(describeContext); - return describeContext.Results; + return describeContext.Results.Select(description => new AuthenticationDescription(description)); } public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) @@ -57,10 +58,12 @@ namespace Microsoft.AspNet.Http.Authentication if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } - return authenticateContext.Result; + return new AuthenticationResult(authenticateContext.Principal, + new AuthenticationProperties(authenticateContext.Properties), + new AuthenticationDescription(authenticateContext.Description)); } public override async Task AuthenticateAsync([NotNull] string authenticationScheme) @@ -76,10 +79,12 @@ namespace Microsoft.AspNet.Http.Authentication // Verify all types ack'd if (!authenticateContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } - return authenticateContext.Result; + return new AuthenticationResult(authenticateContext.Principal, + new AuthenticationProperties(authenticateContext.Properties), + new AuthenticationDescription(authenticateContext.Description)); } public override void Challenge(AuthenticationProperties properties, string authenticationScheme) @@ -87,23 +92,24 @@ namespace Microsoft.AspNet.Http.Authentication HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; - var challengeContext = new ChallengeContext(authenticationScheme, properties == null ? null : properties.Items); + var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items); if (handler != null) { handler.Challenge(challengeContext); } - if (!challengeContext.Accepted) + // The default Challenge with no scheme is always accepted + if (!challengeContext.Accepted && !string.IsNullOrEmpty(authenticationScheme)) { - throw new InvalidOperationException("The following authentication type was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } - public override void SignIn(string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + public override void SignIn([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; - var signInContext = new SignInContext(authenticationScheme, principal, properties == null ? null : properties.Items); + var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); if (handler != null) { handler.SignIn(signInContext); @@ -112,7 +118,7 @@ namespace Microsoft.AspNet.Http.Authentication // Verify all types ack'd if (!signInContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } @@ -129,7 +135,7 @@ namespace Microsoft.AspNet.Http.Authentication // Verify all types ack'd if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) { - throw new InvalidOperationException("The following authentication scheme was not accepted: " + authenticationScheme); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index c53c3c73c2..ea887b711b 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -97,33 +97,33 @@ namespace Microsoft.AspNet.Http { public bool SignedIn { get; set; } - public void Authenticate(IAuthenticateContext context) + public void Authenticate(AuthenticateContext context) { throw new NotImplementedException(); } - public Task AuthenticateAsync(IAuthenticateContext context) + public Task AuthenticateAsync(AuthenticateContext context) { throw new NotImplementedException(); } - public void Challenge(IChallengeContext context) + public void Challenge(ChallengeContext context) { throw new NotImplementedException(); } - public void GetDescriptions(IDescribeSchemesContext context) + public void GetDescriptions(DescribeSchemesContext context) { throw new NotImplementedException(); } - public void SignIn(ISignInContext context) + public void SignIn(SignInContext context) { SignedIn = true; - context.Accept(new Dictionary()); + context.Accept(); } - public void SignOut(ISignOutContext context) + public void SignOut(SignOutContext context) { SignedIn = false; context.Accept(); From 0ed2692ef415653a4b2174397bc274908ef5a51f Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Tue, 21 Apr 2015 12:34:32 -0700 Subject: [PATCH 0576/1838] #267, #273, Move WebSocket APIs to their own object, fix context object. --- src/Microsoft.AspNet.Http.Core/HttpContext.cs | 13 +--- .../WebSocketManager.cs | 23 +++++++ .../IHttpWebSocketFeature.cs | 2 +- .../IWebSocketAcceptContext.cs | 10 --- .../WebSocketAcceptContext.cs | 2 +- .../DefaultHttpContext.cs | 40 +++--------- .../DefaultWebSocketManager.cs | 63 +++++++++++++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +- .../OwinFeatureCollection.cs | 4 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 4 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 4 +- .../WebSockets/WebSocketAcceptAdapter.cs | 8 +-- 12 files changed, 108 insertions(+), 69 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Core/WebSocketManager.cs delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs rename src/{Microsoft.AspNet.Http => Microsoft.AspNet.Http.Interfaces}/WebSocketAcceptContext.cs (81%) create mode 100644 src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpContext.cs b/src/Microsoft.AspNet.Http.Core/HttpContext.cs index 83457e775c..14646bf069 100644 --- a/src/Microsoft.AspNet.Http.Core/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Core/HttpContext.cs @@ -3,10 +3,8 @@ using System; using System.Collections.Generic; -using System.Net.WebSockets; using System.Security.Claims; using System.Threading; -using System.Threading.Tasks; using Microsoft.AspNet.Http.Authentication; namespace Microsoft.AspNet.Http @@ -33,9 +31,7 @@ namespace Microsoft.AspNet.Http public abstract ISessionCollection Session { get; } - public abstract bool IsWebSocketRequest { get; } - - public abstract IList WebSocketRequestedProtocols { get; } + public abstract WebSocketManager WebSockets { get; } public abstract void Abort(); @@ -54,12 +50,5 @@ namespace Microsoft.AspNet.Http { SetFeature(typeof(T), instance); } - - public virtual Task AcceptWebSocketAsync() - { - return AcceptWebSocketAsync(subProtocol: null); - } - - public abstract Task AcceptWebSocketAsync(string subProtocol); } } diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs new file mode 100644 index 0000000000..cf7fd11f63 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + public abstract class WebSocketManager + { + public abstract bool IsWebSocketRequest { get; } + + public abstract IList WebSocketRequestedProtocols { get; } + + public virtual Task AcceptWebSocketAsync() + { + return AcceptWebSocketAsync(subProtocol: null); + } + + public abstract Task AcceptWebSocketAsync(string subProtocol); + } +} diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs index 3e86058140..eb64b4bea9 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs @@ -10,6 +10,6 @@ namespace Microsoft.AspNet.Http { bool IsWebSocketRequest { get; } - Task AcceptAsync(IWebSocketAcceptContext context); + Task AcceptAsync(WebSocketAcceptContext context); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs deleted file mode 100644 index 81f041bb27..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/IWebSocketAcceptContext.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http -{ - public interface IWebSocketAcceptContext - { - string SubProtocol { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs similarity index 81% rename from src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs index 34747f900f..210ec0c2b0 100644 --- a/src/Microsoft.AspNet.Http/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs @@ -3,7 +3,7 @@ namespace Microsoft.AspNet.Http { - public class WebSocketAcceptContext : IWebSocketAcceptContext + public class WebSocketAcceptContext { public virtual string SubProtocol { get; set; } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 7dc14893b5..65365e98b8 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -3,22 +3,17 @@ using System; using System.Collections.Generic; -using System.Net.WebSockets; using System.Security.Claims; using System.Threading; -using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Collections; using Microsoft.AspNet.Http.Infrastructure; -using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http { public class DefaultHttpContext : HttpContext { - private static IList EmptyList = new List(); - private readonly HttpRequest _request; private readonly HttpResponse _response; private readonly ConnectionInfo _connection; @@ -28,8 +23,8 @@ namespace Microsoft.AspNet.Http private FeatureReference _serviceProviders; private FeatureReference _authentication; private FeatureReference _lifetime; - private FeatureReference _webSockets; private FeatureReference _session; + private WebSocketManager _websockets; private IFeatureCollection _features; public DefaultHttpContext() @@ -51,7 +46,6 @@ namespace Microsoft.AspNet.Http _serviceProviders = FeatureReference.Default; _authentication = FeatureReference.Default; _lifetime = FeatureReference.Default; - _webSockets = FeatureReference.Default; _session = FeatureReference.Default; } @@ -75,11 +69,6 @@ namespace Microsoft.AspNet.Http get { return _lifetime.Fetch(_features); } } - private IHttpWebSocketFeature WebSocketFeature - { - get { return _webSockets.Fetch(_features); } - } - private ISessionFeature SessionFeature { get { return _session.Fetch(_features); } @@ -161,20 +150,15 @@ namespace Microsoft.AspNet.Http } } - public override bool IsWebSocketRequest + public override WebSocketManager WebSockets { get { - var webSocketFeature = WebSocketFeature; - return webSocketFeature != null && webSocketFeature.IsWebSocketRequest; - } - } - - public override IList WebSocketRequestedProtocols - { - get - { - return Request.Headers.GetValues(HeaderNames.WebSocketSubProtocols) ?? EmptyList; + if (_websockets == null) + { + _websockets = new DefaultWebSocketManager(_features); + } + return _websockets; } } @@ -203,15 +187,5 @@ namespace Microsoft.AspNet.Http { _features[type] = instance; } - - public override Task AcceptWebSocketAsync(string subProtocol) - { - var webSocketFeature = WebSocketFeature; - if (WebSocketFeature == null) - { - throw new NotSupportedException("WebSockets are not supported"); - } - return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol } ); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs new file mode 100644 index 0000000000..c1845c66e5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Net.WebSockets; +using System.Threading.Tasks; +using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http +{ + public class DefaultWebSocketManager : WebSocketManager + { + private static IList EmptyList = new List(); + + private IFeatureCollection _features; + private FeatureReference _request = FeatureReference.Default; + private FeatureReference _webSockets = FeatureReference.Default; + + public DefaultWebSocketManager(IFeatureCollection features) + { + _features = features; + } + + private IHttpRequestFeature HttpRequestFeature + { + get { return _request.Fetch(_features); } + } + + private IHttpWebSocketFeature WebSocketFeature + { + get { return _webSockets.Fetch(_features); } + } + + public override bool IsWebSocketRequest + { + get + { + return WebSocketFeature != null && WebSocketFeature.IsWebSocketRequest; + } + } + + public override IList WebSocketRequestedProtocols + { + get + { + return ParsingHelpers.GetHeaderUnmodified(HttpRequestFeature.Headers, + HeaderNames.WebSocketSubProtocols) ?? EmptyList; + } + } + + public override Task AcceptWebSocketAsync(string subProtocol) + { + if (WebSocketFeature == null) + { + throw new NotSupportedException("WebSockets are not supported"); + } + return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol }); + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 75b1c88067..9dfae8a833 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Owin using WebSocketAcceptAlt = Func < - IWebSocketAcceptContext, // WebSocket Accept parameters + WebSocketAcceptContext, // WebSocket Accept parameters Task >; @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Owin feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } - if (context.IsWebSocketRequest) + if (context.WebSockets.IsWebSocketRequest) { _entries.Add(OwinConstants.WebSocket.AcceptAlt, new FeatureMap(feature => new WebSocketAcceptAlt(feature.AcceptAsync))); } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 50d58adb9c..195fb04cb0 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -277,14 +277,14 @@ namespace Microsoft.AspNet.Owin } } - Task IHttpWebSocketFeature.AcceptAsync(IWebSocketAcceptContext context) + Task IHttpWebSocketFeature.AcceptAsync(WebSocketAcceptContext context) { object obj; if (!Environment.TryGetValue(OwinConstants.WebSocket.AcceptAlt, out obj)) { throw new NotSupportedException("WebSockets are not supported"); // TODO: LOC } - var accept = (Func>)obj; + var accept = (Func>)obj; return accept(context); } diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 07b58bc27e..50448cd560 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Owin using WebSocketAcceptAlt = Func < - IWebSocketAcceptContext, // WebSocket Accept parameters + WebSocketAcceptContext, // WebSocket Accept parameters Task >; @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Owin private Task UpstreamTask { get; set; } private TaskCompletionSource UpstreamWentAsyncTcs { get { return _upstreamWentAsync; } } - private async Task AcceptWebSocketAsync(IWebSocketAcceptContext context) + private async Task AcceptWebSocketAsync(WebSocketAcceptContext context) { IDictionary options = null; if (context is OwinWebSocketAcceptContext) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 56bc445f77..45cacf76ab 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -6,7 +6,7 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Owin { - public class OwinWebSocketAcceptContext : IWebSocketAcceptContext + public class OwinWebSocketAcceptContext : WebSocketAcceptContext { private IDictionary _options; @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Owin _options = options; } - public string SubProtocol + public override string SubProtocol { get { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 8a7d7aa0cf..71efc5490b 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -24,7 +24,7 @@ namespace Microsoft.AspNet.Owin using WebSocketAcceptAlt = Func < - IWebSocketAcceptContext, // WebSocket Accept parameters + WebSocketAcceptContext, // WebSocket Accept parameters Task >; @@ -65,11 +65,11 @@ namespace Microsoft.AspNet.Owin await next(environment); if ((int)environment[OwinConstants.ResponseStatusCode] == 101 && adapter._callback != null) { - IWebSocketAcceptContext acceptContext = null; + WebSocketAcceptContext acceptContext = null; object obj; - if (adapter._options != null && adapter._options.TryGetValue(typeof(IWebSocketAcceptContext).FullName, out obj)) + if (adapter._options != null && adapter._options.TryGetValue(typeof(WebSocketAcceptContext).FullName, out obj)) { - acceptContext = obj as IWebSocketAcceptContext; + acceptContext = obj as WebSocketAcceptContext; } else if (adapter._options != null) { From 06e24a8fdfbaf7e23a274bb26ba02f52596986d0 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Thu, 23 Apr 2015 16:05:05 -0700 Subject: [PATCH 0577/1838] Handle null auth, null descriptions. --- .../Authentication/AuthenticationDescription.cs | 6 +++--- .../Authentication/DefaultAuthenticationManager.cs | 10 ++++++++++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs index 16b2c43247..97ca3fe18e 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs @@ -20,17 +20,17 @@ namespace Microsoft.AspNet.Http.Authentication /// Initializes a new instance of the class /// public AuthenticationDescription() + : this(items: null) { - Items = new Dictionary(StringComparer.Ordinal); } /// /// Initializes a new instance of the class /// /// - public AuthenticationDescription([NotNull] IDictionary items) + public AuthenticationDescription(IDictionary items) { - Items = items; + Items = items ?? new Dictionary(StringComparer.Ordinal); ; } /// diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index e21bea9634..6f1c3ba419 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -61,6 +61,11 @@ namespace Microsoft.AspNet.Http.Authentication throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } + if (authenticateContext.Principal == null) + { + return null; + } + return new AuthenticationResult(authenticateContext.Principal, new AuthenticationProperties(authenticateContext.Properties), new AuthenticationDescription(authenticateContext.Description)); @@ -82,6 +87,11 @@ namespace Microsoft.AspNet.Http.Authentication throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } + if (authenticateContext.Principal == null) + { + return null; + } + return new AuthenticationResult(authenticateContext.Principal, new AuthenticationProperties(authenticateContext.Properties), new AuthenticationDescription(authenticateContext.Description)); From 234bbf82f2329e1ce2092962264ba5d4567d115b Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 23 Apr 2015 23:51:29 -0700 Subject: [PATCH 0578/1838] Hosting API Review changes - Introduce WebHostBuilder --- src/Microsoft.AspNet.Hosting/HostingEngine.cs | 257 ------------------ .../HostingFactory.cs | 35 --- .../IHostingEngine.cs | 32 --- .../IHostingFactory.cs | 12 - .../Internal/HostingEngine.cs | 184 +++++++++++++ .../Internal/IHostingEngine.cs | 15 + ...RootHostingServiceCollectionInitializer.cs | 66 ----- src/Microsoft.AspNet.Hosting/Program.cs | 20 +- .../Startup/IStartupLoader.cs | 7 +- .../Startup/StartupLoader.cs | 16 +- src/Microsoft.AspNet.Hosting/WebHost.cs | 63 ----- .../WebHostBuilder.cs | 189 +++++++++++++ src/Microsoft.AspNet.Hosting/project.json | 1 + src/Microsoft.AspNet.TestHost/TestServer.cs | 86 ++---- .../TestServerBuilder.cs | 126 --------- .../HostingEngineTests.cs | 185 +++++++------ .../StartupManagerTests.cs | 39 ++- .../TestServerTests.cs | 60 +--- 18 files changed, 566 insertions(+), 827 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/HostingEngine.cs delete mode 100644 src/Microsoft.AspNet.Hosting/HostingFactory.cs delete mode 100644 src/Microsoft.AspNet.Hosting/IHostingEngine.cs delete mode 100644 src/Microsoft.AspNet.Hosting/IHostingFactory.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs delete mode 100644 src/Microsoft.AspNet.Hosting/WebHost.cs create mode 100644 src/Microsoft.AspNet.Hosting/WebHostBuilder.cs delete mode 100644 src/Microsoft.AspNet.TestHost/TestServerBuilder.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/HostingEngine.cs deleted file mode 100644 index 4889150d04..0000000000 --- a/src/Microsoft.AspNet.Hosting/HostingEngine.cs +++ /dev/null @@ -1,257 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.AspNet.Http; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; - -namespace Microsoft.AspNet.Hosting -{ - public class HostingEngine : IHostingEngine - { - private readonly IServiceCollection _applicationServiceCollection; - private readonly IStartupLoader _startupLoader; - private readonly ApplicationLifetime _applicationLifetime; - private readonly IHostingEnvironment _hostingEnvironment; - private readonly IConfiguration _config; - - // Start/ApplicationServices block use methods - private bool _useDisabled; - - private IApplicationBuilderFactory _builderFactory; - private IApplicationBuilder _builder; - private IServiceProvider _applicationServices; - - // Only one of these should be set - private string _startupAssemblyName; - private StartupMethods _startup; - - // Only one of these should be set - private string _serverFactoryLocation; - private IServerFactory _serverFactory; - private IServerInformation _serverInstance; - - public HostingEngine(IServiceCollection appServices, IStartupLoader startupLoader, IConfiguration config, IHostingEnvironment hostingEnv, string appName) - { - _config = config ?? new Configuration(); - _applicationServiceCollection = appServices; - _startupLoader = startupLoader; - _startupAssemblyName = appName; - _applicationLifetime = new ApplicationLifetime(); - _hostingEnvironment = hostingEnv; - } - - public virtual IDisposable Start() - { - EnsureApplicationServices(); - EnsureServer(); - EnsureBuilder(); - - var applicationDelegate = BuildApplicationDelegate(); - - var logger = _applicationServices.GetRequiredService>(); - var contextFactory = _applicationServices.GetRequiredService(); - var contextAccessor = _applicationServices.GetRequiredService(); - var server = _serverFactory.Start(_serverInstance, - async features => - { - var httpContext = contextFactory.CreateHttpContext(features); - var requestIdentifier = GetRequestIdentifier(httpContext); - - using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) - { - contextAccessor.HttpContext = httpContext; - await applicationDelegate(httpContext); - } - }); - - return new Disposable(() => - { - _applicationLifetime.NotifyStopping(); - server.Dispose(); - _applicationLifetime.NotifyStopped(); - }); - } - - private void EnsureApplicationServices() - { - _useDisabled = true; - EnsureStartup(); - - _applicationServiceCollection.AddInstance(_applicationLifetime); - - _applicationServices = _startup.ConfigureServicesDelegate(_applicationServiceCollection); - } - - private void EnsureStartup() - { - if (_startup != null) - { - return; - } - - var diagnosticMessages = new List(); - _startup = _startupLoader.Load( - _startupAssemblyName, - _hostingEnvironment.EnvironmentName, - diagnosticMessages); - - if (_startup == null) - { - throw new ArgumentException( - diagnosticMessages.Aggregate("Failed to find a startup entry point for the web application.", (a, b) => a + "\r\n" + b), - _startupAssemblyName); - } - } - - private void EnsureServer() - { - if (_serverFactory == null) - { - // Blow up if we don't have a server set at this point - if (_serverFactoryLocation == null) - { - throw new InvalidOperationException("UseStartup() is required for Start()"); - } - - _serverFactory = _applicationServices.GetRequiredService().LoadServerFactory(_serverFactoryLocation); - } - - _serverInstance = _serverFactory.Initialize(_config); - } - - private void EnsureBuilder() - { - if (_builderFactory == null) - { - _builderFactory = _applicationServices.GetRequiredService(); - } - - _builder = _builderFactory.CreateBuilder(_serverInstance); - _builder.ApplicationServices = _applicationServices; - } - - private RequestDelegate BuildApplicationDelegate() - { - var startupFilters = _applicationServices.GetService>(); - var configure = _startup.ConfigureDelegate; - foreach (var filter in startupFilters) - { - configure = filter.Configure(_builder, configure); - } - - configure(_builder); - - return _builder.Build(); - } - - public IServiceProvider ApplicationServices - { - get - { - EnsureApplicationServices(); - return _applicationServices; - } - } - - private void CheckUseAllowed() - { - if (_useDisabled) - { - throw new InvalidOperationException("HostingEngine has already been started."); - } - } - - private Guid GetRequestIdentifier(HttpContext httpContext) - { - var requestIdentifierFeature = httpContext.GetFeature(); - if (requestIdentifierFeature == null) - { - requestIdentifierFeature = new DefaultRequestIdentifierFeature(); - httpContext.SetFeature(requestIdentifierFeature); - } - - return requestIdentifierFeature.TraceIdentifier; - } - - // Consider cutting - public IHostingEngine UseEnvironment(string environment) - { - CheckUseAllowed(); - _hostingEnvironment.EnvironmentName = environment; - return this; - } - - public IHostingEngine UseServer(string assemblyName) - { - CheckUseAllowed(); - _serverFactoryLocation = assemblyName; - return this; - } - - public IHostingEngine UseServer(IServerFactory factory) - { - CheckUseAllowed(); - _serverFactory = factory; - return this; - } - - public IHostingEngine UseStartup(string startupAssemblyName) - { - CheckUseAllowed(); - _startupAssemblyName = startupAssemblyName; - return this; - } - - public IHostingEngine UseStartup(Action configureApp) - { - return UseStartup(configureApp, configureServices: null); - } - - public IHostingEngine UseStartup(Action configureApp, ConfigureServicesDelegate configureServices) - { - CheckUseAllowed(); - _startup = new StartupMethods(configureApp, configureServices); - return this; - } - - public IHostingEngine UseStartup(Action configureApp, Action configureServices) - { - CheckUseAllowed(); - _startup = new StartupMethods(configureApp, - services => { - if (configureServices != null) - { - configureServices(services); - } - return services.BuildServiceProvider(); - }); - return this; - } - - private class Disposable : IDisposable - { - private Action _dispose; - - public Disposable(Action dispose) - { - _dispose = dispose; - } - - public void Dispose() - { - Interlocked.Exchange(ref _dispose, () => { }).Invoke(); - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingFactory.cs b/src/Microsoft.AspNet.Hosting/HostingFactory.cs deleted file mode 100644 index 1b77dc7e59..0000000000 --- a/src/Microsoft.AspNet.Hosting/HostingFactory.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Hosting.Internal; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.Runtime; - -namespace Microsoft.AspNet.Hosting -{ - public class HostingFactory : IHostingFactory - { - public const string EnvironmentKey = "ASPNET_ENV"; - - private readonly RootHostingServiceCollectionInitializer _serviceInitializer; - private readonly IStartupLoader _startupLoader; - private readonly IApplicationEnvironment _applicationEnvironment; - private readonly IHostingEnvironment _hostingEnvironment; - - public HostingFactory(RootHostingServiceCollectionInitializer initializer, IStartupLoader startupLoader, IApplicationEnvironment appEnv, IHostingEnvironment hostingEnv) - { - _serviceInitializer = initializer; - _startupLoader = startupLoader; - _applicationEnvironment = appEnv; - _hostingEnvironment = hostingEnv; - } - - public IHostingEngine Create(IConfiguration config) - { - _hostingEnvironment.Initialize(_applicationEnvironment.ApplicationBasePath, config?[EnvironmentKey]); - - return new HostingEngine(_serviceInitializer.Build(), _startupLoader, config, _hostingEnvironment, _applicationEnvironment.ApplicationName); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/IHostingEngine.cs deleted file mode 100644 index dbd6577b05..0000000000 --- a/src/Microsoft.AspNet.Hosting/IHostingEngine.cs +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.DependencyInjection; - -namespace Microsoft.AspNet.Hosting -{ - public interface IHostingEngine - { - IDisposable Start(); - - // Accessing this will block Use methods - IServiceProvider ApplicationServices { get; } - - // Use methods blow up after any of the above methods are called - IHostingEngine UseEnvironment(string environment); - - // Mutually exclusive - IHostingEngine UseServer(string assemblyName); - IHostingEngine UseServer(IServerFactory factory); - - // Mutually exclusive - IHostingEngine UseStartup(string startupAssemblyName); - IHostingEngine UseStartup(Action configureApp); - IHostingEngine UseStartup(Action configureApp, ConfigureServicesDelegate configureServices); - IHostingEngine UseStartup(Action configureApp, Action configureServices); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/IHostingFactory.cs b/src/Microsoft.AspNet.Hosting/IHostingFactory.cs deleted file mode 100644 index f44b02c1db..0000000000 --- a/src/Microsoft.AspNet.Hosting/IHostingFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.Framework.ConfigurationModel; - -namespace Microsoft.AspNet.Hosting -{ - public interface IHostingFactory - { - IHostingEngine Create(IConfiguration config); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs new file mode 100644 index 0000000000..86bbee3936 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -0,0 +1,184 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Http; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; +using Microsoft.Framework.Logging; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class HostingEngine : IHostingEngine + { + private readonly IServiceCollection _applicationServiceCollection; + private readonly IStartupLoader _startupLoader; + private readonly ApplicationLifetime _applicationLifetime; + private readonly IConfiguration _config; + + private IServiceProvider _applicationServices; + + // Only one of these should be set + internal string StartupAssemblyName { get; set; } + internal StartupMethods Startup { get; set; } + internal Type StartupType { get; set; } + + // Only one of these should be set + internal IServerFactory ServerFactory { get; set; } + internal string ServerFactoryLocation { get; set; } + private IServerInformation _serverInstance; + + public HostingEngine( + [NotNull] IServiceCollection appServices, + [NotNull] IStartupLoader startupLoader, + [NotNull] IConfiguration config) + { + _config = config; + _applicationServiceCollection = appServices; + _startupLoader = startupLoader; + _applicationLifetime = new ApplicationLifetime(); + } + + public IServiceProvider ApplicationServices + { + get + { + EnsureApplicationServices(); + return _applicationServices; + } + } + + public virtual IDisposable Start() + { + EnsureApplicationServices(); + + var application = BuildApplication(); + + var logger = _applicationServices.GetRequiredService>(); + var contextFactory = _applicationServices.GetRequiredService(); + var contextAccessor = _applicationServices.GetRequiredService(); + var server = ServerFactory.Start(_serverInstance, + async features => + { + var httpContext = contextFactory.CreateHttpContext(features); + var requestIdentifier = GetRequestIdentifier(httpContext); + + using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) + { + contextAccessor.HttpContext = httpContext; + await application(httpContext); + } + }); + + return new Disposable(() => + { + _applicationLifetime.NotifyStopping(); + server.Dispose(); + _applicationLifetime.NotifyStopped(); + }); + } + + private void EnsureApplicationServices() + { + EnsureStartup(); + + _applicationServiceCollection.AddInstance(_applicationLifetime); + + _applicationServices = Startup.ConfigureServicesDelegate(_applicationServiceCollection); + } + + private void EnsureStartup() + { + if (Startup != null) + { + return; + } + + if (StartupType == null) + { + var diagnosticTypeMessages = new List(); + StartupType = _startupLoader.FindStartupType(StartupAssemblyName, diagnosticTypeMessages); + if (StartupType == null) + { + throw new ArgumentException( + diagnosticTypeMessages.Aggregate("Failed to find a startup type for the web application.", (a, b) => a + "\r\n" + b), + StartupAssemblyName); + } + } + + var diagnosticMessages = new List(); + Startup = _startupLoader.LoadMethods(StartupType, diagnosticMessages); + if (Startup == null) + { + throw new ArgumentException( + diagnosticMessages.Aggregate("Failed to find a startup entry point for the web application.", (a, b) => a + "\r\n" + b), + StartupAssemblyName); + } + } + + private RequestDelegate BuildApplication() + { + if (ServerFactory == null) + { + // Blow up if we don't have a server set at this point + if (ServerFactoryLocation == null) + { + throw new InvalidOperationException("IHostingBuilder.UseServer() is required for " + nameof(Start) + "()"); + } + + ServerFactory = _applicationServices.GetRequiredService().LoadServerFactory(ServerFactoryLocation); + } + + _serverInstance = ServerFactory.Initialize(_config); + var builderFactory = _applicationServices.GetRequiredService(); + var builder = builderFactory.CreateBuilder(_serverInstance); + builder.ApplicationServices = _applicationServices; + + var startupFilters = _applicationServices.GetService>(); + var configure = Startup.ConfigureDelegate; + foreach (var filter in startupFilters) + { + configure = filter.Configure(builder, configure); + } + + configure(builder); + + return builder.Build(); + } + + private Guid GetRequestIdentifier(HttpContext httpContext) + { + var requestIdentifierFeature = httpContext.GetFeature(); + if (requestIdentifierFeature == null) + { + requestIdentifierFeature = new DefaultRequestIdentifierFeature(); + httpContext.SetFeature(requestIdentifierFeature); + } + + return requestIdentifierFeature.TraceIdentifier; + } + + private class Disposable : IDisposable + { + private Action _dispose; + + public Disposable(Action dispose) + { + _dispose = dispose; + } + + public void Dispose() + { + Interlocked.Exchange(ref _dispose, () => { }).Invoke(); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs new file mode 100644 index 0000000000..f79031eb0f --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public interface IHostingEngine + { + IDisposable Start(); + + // Accessing this will block Use methods + IServiceProvider ApplicationServices { get; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs b/src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs deleted file mode 100644 index 3e9a9babec..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/RootHostingServiceCollectionInitializer.cs +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Internal; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; -using Microsoft.Framework.Runtime; -using Microsoft.Framework.Runtime.Infrastructure; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public class RootHostingServiceCollectionInitializer - { - private readonly IServiceProvider _fallbackServices; - private readonly Action _configureServices; - private readonly IHostingEnvironment _hostingEnvironment; - private readonly ILoggerFactory _loggerFactory; - - public RootHostingServiceCollectionInitializer(IServiceProvider fallbackServices, Action configureServices) - { - _fallbackServices = fallbackServices; - _configureServices = configureServices; - _hostingEnvironment = new HostingEnvironment(); - _loggerFactory = new LoggerFactory(); - } - - public IServiceCollection Build() - { - var services = new ServiceCollection(); - - // Import from manifest - var manifest = _fallbackServices.GetRequiredService(); - foreach (var service in manifest.Services) - { - services.AddTransient(service, sp => _fallbackServices.GetService(service)); - } - - services.AddInstance(_hostingEnvironment); - services.AddInstance(this); - services.AddInstance(_loggerFactory); - - services.AddTransient(); - services.AddTransient(); - - services.AddTransient(); - services.AddTransient(); - services.AddTransient(); - services.AddSingleton(); - services.AddLogging(); - - // Conjure up a RequestServices - services.AddTransient(); - - if (_configureServices != null) - { - _configureServices(services); - } - - return services; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 6c4a24ae1c..541eec0f0d 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; @@ -33,21 +34,10 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var engine = WebHost.CreateEngine(_serviceProvider, config); - var server = config.Get("server"); - if (server != null) - { - engine.UseServer(server); - } - var startup = config.Get("app"); - if (startup != null) - { - engine.UseStartup(startup); - } - - var serverShutdown = engine.Start(); - var loggerFactory = engine.ApplicationServices.GetRequiredService(); - var appShutdownService = engine.ApplicationServices.GetRequiredService(); + var host = new WebHostBuilder(_serviceProvider).Build(); + var serverShutdown = host.Start(); + var loggerFactory = host.ApplicationServices.GetRequiredService(); + var appShutdownService = host.ApplicationServices.GetRequiredService(); var shutdownHandle = new ManualResetEvent(false); appShutdownService.ShutdownRequested.Register(() => diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index cab29b61ce..6ba16f4e08 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -8,9 +8,8 @@ namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupLoader { - StartupMethods Load( - string startupAssemblyName, - string environmentName, - IList diagnosticMessages); + Type FindStartupType(string startupAssemblyName, IList diagnosticMessages); + + StartupMethods LoadMethods(Type startupType, IList diagnosticMessages); } } diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 6ebc09f04e..2b95b72ed7 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -13,17 +13,19 @@ namespace Microsoft.AspNet.Hosting.Startup public class StartupLoader : IStartupLoader { private readonly IServiceProvider _services; + private readonly IHostingEnvironment _hostingEnv; - public StartupLoader(IServiceProvider services) + public StartupLoader(IServiceProvider services, IHostingEnvironment hostingEnv) { _services = services; + _hostingEnv = hostingEnv; } - public StartupMethods Load( + public StartupMethods LoadMethods( Type startupType, - string environmentName, IList diagnosticMessages) { + var environmentName = _hostingEnv.EnvironmentName; var configureMethod = FindConfigureDelegate(startupType, environmentName); var servicesMethod = FindConfigureServicesDelegate(startupType, environmentName); @@ -36,11 +38,9 @@ namespace Microsoft.AspNet.Hosting.Startup return new StartupMethods(configureMethod.Build(instance), servicesMethod?.Build(instance)); } - public StartupMethods Load( - string startupAssemblyName, - string environmentName, - IList diagnosticMessages) + public Type FindStartupType(string startupAssemblyName, IList diagnosticMessages) { + var environmentName = _hostingEnv.EnvironmentName; if (string.IsNullOrEmpty(startupAssemblyName)) { throw new ArgumentException("Value cannot be null or empty.", nameof(startupAssemblyName)); @@ -85,7 +85,7 @@ namespace Microsoft.AspNet.Hosting.Startup startupAssemblyName)); } - return Load(type, environmentName, diagnosticMessages); + return type; } private static ConfigureBuilder FindConfigureDelegate(Type startupType, string environmentName) diff --git a/src/Microsoft.AspNet.Hosting/WebHost.cs b/src/Microsoft.AspNet.Hosting/WebHost.cs deleted file mode 100644 index c1d331e0c4..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebHost.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Hosting.Internal; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime.Infrastructure; - -namespace Microsoft.AspNet.Hosting -{ - public static class WebHost - { - public static IHostingEngine CreateEngine() - { - return CreateEngine(new Configuration()); - } - - public static IHostingEngine CreateEngine(Action configureServices) - { - return CreateEngine(new Configuration(), configureServices); - } - - public static IHostingEngine CreateEngine(IConfiguration config) - { - return CreateEngine(config, configureServices: null); - } - - public static IHostingEngine CreateEngine(IConfiguration config, Action configureServices) - { - return CreateEngine(fallbackServices: null, config: config, configureServices: configureServices); - } - - public static IHostingEngine CreateEngine(IServiceProvider fallbackServices, IConfiguration config) - { - return CreateEngine(fallbackServices, config, configureServices: null); - } - - public static IHostingEngine CreateEngine(IServiceProvider fallbackServices, IConfiguration config, Action configureServices) - { - return CreateFactory(fallbackServices, configureServices).Create(config); - } - - public static IHostingFactory CreateFactory() - { - return CreateFactory(fallbackServices: null, configureServices: null); - } - - public static IHostingFactory CreateFactory(Action configureServices) - { - return CreateFactory(fallbackServices: null, configureServices: configureServices); - } - - public static IHostingFactory CreateFactory(IServiceProvider fallbackServices, Action configureServices) - { - fallbackServices = fallbackServices ?? CallContextServiceLocator.Locator.ServiceProvider; - return new RootHostingServiceCollectionInitializer(fallbackServices, configureServices) - .Build() - .BuildServiceProvider() - .GetRequiredService(); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs new file mode 100644 index 0000000000..09e70f2650 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -0,0 +1,189 @@ +// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; +using Microsoft.Framework.Logging; +using Microsoft.Framework.Runtime; + +namespace Microsoft.AspNet.Hosting +{ + public class WebHostBuilder + { + public const string OldEnvironmentKey = "ASPNET_ENV"; + public const string EnvironmentKey = "Hosting:Environment"; + + public const string OldApplicationKey = "app"; + public const string ApplicationKey = "Hosting:Application"; + + public const string OldServerKey = "server"; + public const string ServerKey = "Hosting:Server"; + + private readonly IServiceProvider _services; + private readonly IHostingEnvironment _hostingEnvironment; + private readonly ILoggerFactory _loggerFactory; + private readonly IConfiguration _config; + + private Action _configureServices; + + // Only one of these should be set + private StartupMethods _startup; + private Type _startupType; + private string _startupAssemblyName; + + // Only one of these should be set + private string _serverFactoryLocation; + private IServerFactory _serverFactory; + + public WebHostBuilder([NotNull] IServiceProvider services) : this(services, config: new Configuration()) { } + + public WebHostBuilder([NotNull] IServiceProvider services, [NotNull] IConfiguration config) + { + _hostingEnvironment = new HostingEnvironment(); + _loggerFactory = new LoggerFactory(); + _services = services; + _config = config; + } + + private IServiceCollection BuildHostingServices() + { + var services = new ServiceCollection(); + + // Import from manifest + var manifest = _services.GetService(); + if (manifest != null) + { + foreach (var service in manifest.Services) + { + services.AddTransient(service, sp => _services.GetService(service)); + } + } + + services.AddInstance(_hostingEnvironment); + services.AddInstance(_loggerFactory); + + services.AddTransient(); + + services.AddTransient(); + services.AddTransient(); + services.AddTransient(); + services.AddSingleton(); + services.AddLogging(); + + // Conjure up a RequestServices + services.AddTransient(); + + if (_configureServices != null) + { + _configureServices(services); + } + + return services; + } + + public IHostingEngine Build() + { + var hostingServices = BuildHostingServices(); + + var hostingContainer = hostingServices.BuildServiceProvider(); + + var appEnvironment = hostingContainer.GetRequiredService(); + var startupLoader = hostingContainer.GetRequiredService(); + + _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _config?[EnvironmentKey] ?? _config?[OldEnvironmentKey]); + + var engine = new HostingEngine(hostingServices, startupLoader, _config); + + // Only one of these should be set, but they are used in priority + engine.ServerFactory = _serverFactory; + engine.ServerFactoryLocation = _config.Get(ServerKey) ?? _config.Get(OldServerKey) ?? _serverFactoryLocation; + + // Only one of these should be set, but they are used in priority + engine.Startup = _startup; + engine.StartupType = _startupType; + engine.StartupAssemblyName = _config.Get(ApplicationKey) ?? _config.Get(OldApplicationKey) ?? appEnvironment.ApplicationName; + + return engine; + } + + public WebHostBuilder UseServices(Action configureServices) + { + _configureServices = configureServices; + return this; + } + + public WebHostBuilder UseEnvironment([NotNull] string environment) + { + _hostingEnvironment.EnvironmentName = environment; + return this; + } + + public WebHostBuilder UseServer([NotNull] string assemblyName) + { + _serverFactoryLocation = assemblyName; + return this; + } + + public WebHostBuilder UseServer(IServerFactory factory) + { + _serverFactory = factory; + return this; + } + + public WebHostBuilder UseStartup([NotNull] string startupAssemblyName) + { + if (startupAssemblyName == null) + { + throw new ArgumentNullException(nameof(startupAssemblyName)); + } + _startupAssemblyName = startupAssemblyName; + return this; + } + + public WebHostBuilder UseStartup([NotNull] Type startupType) + { + if (startupType == null) + { + throw new ArgumentNullException(nameof(startupType)); + } + _startupType = startupType; + return this; + } + + public WebHostBuilder UseStartup() where TStartup : class + { + return UseStartup(typeof(TStartup)); + } + + public WebHostBuilder UseStartup([NotNull] Action configureApp) + { + return UseStartup(configureApp, configureServices: null); + } + + public WebHostBuilder UseStartup([NotNull] Action configureApp, ConfigureServicesDelegate configureServices) + { + _startup = new StartupMethods(configureApp, configureServices); + return this; + } + + public WebHostBuilder UseStartup([NotNull] Action configureApp, Action configureServices) + { + _startup = new StartupMethods(configureApp, + services => { + if (configureServices != null) + { + configureServices(services); + } + return services.BuildServiceProvider(); + }); + return this; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 68028eeede..25eda4017f 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -12,6 +12,7 @@ "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, "frameworks": { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index f290092609..d5bf3e52a6 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -12,6 +12,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.TestHost { @@ -24,101 +25,66 @@ namespace Microsoft.AspNet.TestHost private IDisposable _appInstance; private bool _disposed = false; - public TestServer(IHostingEngine engine) + public TestServer(WebHostBuilder builder) { - _appInstance = engine.UseServer(this).Start(); + _appInstance = builder.UseServer(this).Build().Start(); } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); public static TestServer Create() { - return Create(fallbackServices: null, config: null, configureApp: null, configureServices: null); + return Create(services: null, config: null, configureApp: null, configureServices: null); } public static TestServer Create(Action configureApp) { - return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: null); + return Create(services: null, config: null, configureApp: configureApp, configureServices: null); } public static TestServer Create(Action configureApp, Action configureServices) { - return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: configureServices); + return Create(services: null, config: null, configureApp: configureApp, configureServices: configureServices); } - public static TestServer Create(IServiceProvider fallbackServices, Action configureApp, ConfigureServicesDelegate configureServices) + public static TestServer Create(IServiceProvider services, Action configureApp, ConfigureServicesDelegate configureServices) { - return CreateBuilder(fallbackServices, config: null, configureApp: configureApp, configureServices: configureServices).Build(); + return new TestServer(CreateBuilder(services, config: null, configureApp: configureApp, configureServices: configureServices)); } - public static TestServer Create(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) + public static TestServer Create(IServiceProvider services, IConfiguration config, Action configureApp, Action configureServices) { - return CreateBuilder(fallbackServices, config, configureApp, configureServices).Build(); + return new TestServer(CreateBuilder(services, config, configureApp, configureServices)); } - public static TestServer Create() where TStartup : class + public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config, Action configureApp, Action configureServices) { - return Create(fallbackServices: null, config: null, configureApp: null, configureServices: null); - } - - public static TestServer Create(Action configureApp) where TStartup : class - { - return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: null); - } - - public static TestServer Create(Action configureApp, Action configureServices) where TStartup : class - { - return Create(fallbackServices: null, config: null, configureApp: configureApp, configureServices: configureServices); - } - - public static TestServer Create(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) where TStartup : class - { - var builder = CreateBuilder(fallbackServices, config, configureApp, configureServices); - builder.StartupType = typeof(TStartup); - return builder.Build(); - } - - public static TestServerBuilder CreateBuilder() where TStartup : class - { - var builder = CreateBuilder(fallbackServices: null, config: null, configureApp: null, configureServices: null); - builder.StartupType = typeof(TStartup); - return builder; - } - - public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) where TStartup : class - { - var builder = CreateBuilder(fallbackServices, config, configureApp, configureServices); - builder.StartupType = typeof(TStartup); - return builder; - } - - public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, Action configureServices) - { - return CreateBuilder(fallbackServices, config, configureApp, - services => + return CreateBuilder(services, config, configureApp, + s => { if (configureServices != null) { - configureServices(services); + configureServices(s); } - return services.BuildServiceProvider(); + return s.BuildServiceProvider(); }); } - public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config) + public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config, Action configureApp, ConfigureServicesDelegate configureServices) { - return new TestServerBuilder - { - FallbackServices = fallbackServices, - Config = config - }; + return CreateBuilder(services, config).UseStartup(configureApp, configureServices); } - public static TestServerBuilder CreateBuilder(IServiceProvider fallbackServices, IConfiguration config, Action configureApp, ConfigureServicesDelegate configureServices) + public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config) { - var builder = CreateBuilder(fallbackServices, config); - builder.Startup = new StartupMethods(configureApp, configureServices); - return builder; + return new WebHostBuilder( + services ?? CallContextServiceLocator.Locator.ServiceProvider, + config ?? new Configuration()); + } + + public static WebHostBuilder CreateBuilder() + { + return CreateBuilder(services: null, config: null); } public HttpMessageHandler CreateHandler() diff --git a/src/Microsoft.AspNet.TestHost/TestServerBuilder.cs b/src/Microsoft.AspNet.TestHost/TestServerBuilder.cs deleted file mode 100644 index 74425f89f5..0000000000 --- a/src/Microsoft.AspNet.TestHost/TestServerBuilder.cs +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Runtime.Versioning; -using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.ConfigurationModel; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime; -using Microsoft.Framework.Runtime.Infrastructure; - -namespace Microsoft.AspNet.TestHost -{ - public class TestServerBuilder - { - public IServiceProvider FallbackServices { get; set; } - public string Environment { get; set; } - public string ApplicationName { get; set; } - public string ApplicationBasePath { get; set; } - - public Type StartupType { get; set; } - public string StartupAssemblyName { get; set; } - public IConfiguration Config { get; set; } - - public IServiceCollection AdditionalServices { get; } = new ServiceCollection(); - - public StartupMethods Startup { get; set; } - - public TestServer Build() - { - var fallbackServices = FallbackServices ?? CallContextServiceLocator.Locator.ServiceProvider; - var config = Config ?? new Configuration(); - if (Environment != null) - { - config[HostingFactory.EnvironmentKey] = Environment; - } - if (ApplicationName != null || ApplicationBasePath != null) - { - var appEnv = new TestApplicationEnvironment(fallbackServices.GetRequiredService()); - appEnv.ApplicationBasePath = ApplicationBasePath; - appEnv.ApplicationName = ApplicationName; - AdditionalServices.AddInstance(appEnv); - } - - var engine = WebHost.CreateEngine(fallbackServices, - config, - services => services.Add(AdditionalServices)); - if (StartupType != null) - { - Startup = new StartupLoader(fallbackServices).Load(StartupType, Environment, new List()); - } - if (Startup != null) - { - engine.UseStartup(Startup.ConfigureDelegate, Startup.ConfigureServicesDelegate); - } - else if (StartupAssemblyName != null) - { - engine.UseStartup(StartupAssemblyName); - } - - return new TestServer(engine); - } - - private class TestApplicationEnvironment : IApplicationEnvironment - { - private readonly IApplicationEnvironment _appEnv; - private string _appName; - private string _appBasePath; - - public TestApplicationEnvironment(IApplicationEnvironment appEnv) - { - _appEnv = appEnv; - } - - public string ApplicationBasePath - { - get - { - return _appBasePath ?? _appEnv.ApplicationBasePath; - } - set - { - _appBasePath = value; - } - } - - public string ApplicationName - { - get - { - return _appName ?? _appEnv.ApplicationName; - } - set - { - _appName = value; - } - } - - public string Configuration - { - get - { - return _appEnv.Configuration; - } - } - - public FrameworkName RuntimeFramework - { - get - { - return _appEnv.RuntimeFramework; - } - } - - public string Version - { - get - { - throw new NotImplementedException(); - } - } - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 07d946e490..dca50c4e0f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; @@ -16,6 +17,7 @@ using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; +using Microsoft.Framework.Runtime.Infrastructure; using Moq; using Xunit; @@ -24,19 +26,58 @@ namespace Microsoft.AspNet.Hosting public class HostingEngineTests : IServerFactory { private readonly IList _startInstances = new List(); + private IFeatureCollection _featuresSupportedByThisHost = new FeatureCollection(); [Fact] public void HostingEngineThrowsWithNoServer() { - Assert.Throws(() => WebHost.CreateEngine().Start()); + var ex = Assert.Throws(() => CreateBuilder().Build().Start()); + Assert.True(ex.Message.Contains("UseServer()")); + } + + [Fact] + public void UseStartupThrowsWithNull() + { + Assert.Throws(() => CreateBuilder().UseStartup((string)null)); + } + + [Fact] + public void CanStartWithOldServerConfig() + { + var vals = new Dictionary + { + { "server", "Microsoft.AspNet.Hosting.Tests" } + }; + + var config = new Configuration() + .Add(new MemoryConfigurationSource(vals)); + var host = CreateBuilder(config).Build(); + host.Start(); + Assert.NotNull(host.ApplicationServices.GetRequiredService()); + } + + [Fact] + public void CanStartWithServerConfig() + { + var vals = new Dictionary + { + { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" } + }; + + var config = new Configuration() + .Add(new MemoryConfigurationSource(vals)); + var host = CreateBuilder(config).Build(); + host.Start(); + Assert.NotNull(host.ApplicationServices.GetRequiredService()); } [Fact] public void HostingEngineCanBeStarted() { - var engine = WebHost.CreateEngine() + var engine = CreateBuilder() .UseServer(this) .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build() .Start(); Assert.NotNull(engine); @@ -51,10 +92,11 @@ namespace Microsoft.AspNet.Hosting [Fact] public void HostingEngineInjectsHostingEnvironment() { - var engine = WebHost.CreateEngine() + var engine = CreateBuilder() .UseServer(this) .UseStartup("Microsoft.AspNet.Hosting.Tests") - .UseEnvironment("WithHostingEnvironment"); + .UseEnvironment("WithHostingEnvironment") + .Build(); using (var server = engine.Start()) { @@ -63,20 +105,13 @@ namespace Microsoft.AspNet.Hosting } } - [Fact] - public void CanReplaceHostingFactory() - { - var factory = WebHost.CreateFactory(services => services.AddTransient()); - - Assert.NotNull(factory as TestEngineFactory); - } - [Fact] public void CanReplaceStartupLoader() { - var engine = WebHost.CreateEngine(services => services.AddTransient()) + var engine = CreateBuilder().UseServices(services => services.AddTransient()) .UseServer(this) - .UseStartup("Microsoft.AspNet.Hosting.Tests"); + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build(); Assert.Throws(() => engine.Start()); } @@ -84,20 +119,20 @@ namespace Microsoft.AspNet.Hosting [Fact] public void CanCreateApplicationServicesWithAddedServices() { - var engineStart = WebHost.CreateEngine(services => services.AddOptions()); - Assert.NotNull(engineStart.ApplicationServices.GetRequiredService>()); + var host = CreateBuilder().UseServices(services => services.AddOptions()).Build(); + Assert.NotNull(host.ApplicationServices.GetRequiredService>()); } [Fact] public void EnvDefaultsToDevelopmentIfNoConfig() { - var engine = WebHost.CreateEngine(new Configuration()); + var engine = CreateBuilder().Build(); var env = engine.ApplicationServices.GetRequiredService(); Assert.Equal("Development", env.EnvironmentName); } [Fact] - public void EnvDefaultsToDevelopmentConfigValueIfSpecified() + public void EnvDefaultsToDevelopmentConfigValueIfSpecifiedWithOldKey() { var vals = new Dictionary { @@ -107,7 +142,23 @@ namespace Microsoft.AspNet.Hosting var config = new Configuration() .Add(new MemoryConfigurationSource(vals)); - var engine = WebHost.CreateEngine(config); + var engine = CreateBuilder(config).Build(); + var env = engine.ApplicationServices.GetRequiredService(); + Assert.Equal("Staging", env.EnvironmentName); + } + + [Fact] + public void EnvDefaultsToDevelopmentConfigValueIfSpecified() + { + var vals = new Dictionary + { + { "Hosting:Environment", "Staging" } + }; + + var config = new Configuration() + .Add(new MemoryConfigurationSource(vals)); + + var engine = CreateBuilder(config).Build(); var env = engine.ApplicationServices.GetRequiredService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -115,7 +166,7 @@ namespace Microsoft.AspNet.Hosting [Fact] public void WebRootCanBeResolvedFromTheProjectJson() { - var engine = WebHost.CreateEngine().UseServer(this); + var engine = CreateBuilder().UseServer(this).Build(); var env = engine.ApplicationServices.GetRequiredService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); @@ -124,8 +175,7 @@ namespace Microsoft.AspNet.Hosting [Fact] public void IsEnvironment_Extension_Is_Case_Insensitive() { - var engine = WebHost.CreateEngine().UseServer(this); - + var engine = CreateBuilder().UseServer(this).Build(); using (engine.Start()) { var env = engine.ApplicationServices.GetRequiredService(); @@ -164,8 +214,7 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var featuresSupportedByHost = new FeatureCollection(); - var hostingEngine = CreateHostingEngine(featuresSupportedByHost, requestDelegate); + var hostingEngine = CreateHostingEngine(requestDelegate); // Act var disposable = hostingEngine.Start(); @@ -192,7 +241,9 @@ namespace Microsoft.AspNet.Hosting featuresSupportedByHost .Setup(fc => fc.Add(new KeyValuePair(It.IsAny(), It.IsAny()))) .Throws(new NotImplementedException()); - var hostingEngine = CreateHostingEngine(featuresSupportedByHost.Object, requestDelegate); + _featuresSupportedByThisHost = featuresSupportedByHost.Object; + + var hostingEngine = CreateHostingEngine(requestDelegate); // Act var disposable = hostingEngine.Start(); @@ -212,10 +263,9 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var featuresSupportedByHost = new FeatureCollection(); var requestIdentifierFeature = new Mock().Object; - featuresSupportedByHost.Add(typeof(IRequestIdentifierFeature), requestIdentifierFeature); - var hostingEngine = CreateHostingEngine(featuresSupportedByHost, requestDelegate); + _featuresSupportedByThisHost.Add(typeof(IRequestIdentifierFeature), requestIdentifierFeature); + var hostingEngine = CreateHostingEngine(requestDelegate); // Act var disposable = hostingEngine.Start(); @@ -225,9 +275,7 @@ namespace Microsoft.AspNet.Hosting Assert.Same(requestIdentifierFeature, httpContext.GetFeature()); } - private IHostingEngine CreateHostingEngine( - IFeatureCollection featuresSupportedByHost, - RequestDelegate requestDelegate) + private IHostingEngine CreateHostingEngine(RequestDelegate requestDelegate) { var applicationBuilder = new Mock(); applicationBuilder.Setup(appBuilder => appBuilder.Build()).Returns(requestDelegate); @@ -236,36 +284,25 @@ namespace Microsoft.AspNet.Hosting .Setup(abf => abf.CreateBuilder(It.IsAny())) .Returns(applicationBuilder.Object); - var serviceCollection = new ServiceCollection(); - serviceCollection.Add( - new ServiceDescriptor(typeof(IApplicationBuilderFactory), applicationBuilderFactory.Object)); - serviceCollection.Add( - new ServiceDescriptor(typeof(ILogger), new Mock>().Object)); - serviceCollection.Add( - new ServiceDescriptor(typeof(IHttpContextFactory), new HttpContextFactory())); - serviceCollection.Add( - new ServiceDescriptor(typeof(IHttpContextAccessor), new Mock().Object)); - - var startupLoader = new Mock(); - var startupMethods = new StartupMethods( - (appBuilder) => { }, - (configureServices) => configureServices.BuildServiceProvider()); - startupLoader.Setup(sl => sl.Load(It.IsAny(), It.IsAny(), It.IsAny>())) - .Returns(startupMethods); - - var hostingEngine = new HostingEngine( - serviceCollection, - startupLoader.Object, - new Mock().Object, - new Mock().Object, - "TestAppName"); - - return hostingEngine.UseServer(new TestServerFactory(featuresSupportedByHost)); + var host = CreateBuilder() + .UseServer(this) + .UseServices(s => + { + s.AddInstance(applicationBuilderFactory.Object); + s.AddInstance(new Mock>().Object); + s.AddSingleton(); + s.AddInstance(new Mock().Object); + s.AddInstance(new Mock().Object); + }) + .UseStartup( + appBuilder => { }, + configureServices => configureServices.BuildServiceProvider()); + return host.Build(); } private void RunMapPath(string virtualPath, string expectedSuffix) { - var engine = WebHost.CreateEngine().UseServer(this); + var engine = CreateBuilder().UseServer(this).Build(); using (engine.Start()) { @@ -276,6 +313,11 @@ namespace Microsoft.AspNet.Hosting } } + private WebHostBuilder CreateBuilder(IConfiguration config = null) + { + return new WebHostBuilder(CallContextServiceLocator.Locator.ServiceProvider, config ?? new Configuration()); + } + public IServerInformation Initialize(IConfiguration configuration) { return null; @@ -285,6 +327,7 @@ namespace Microsoft.AspNet.Hosting { var startInstance = new StartInstance(application); _startInstances.Add(startInstance); + application(_featuresSupportedByThisHost); return startInstance; } @@ -307,39 +350,15 @@ namespace Microsoft.AspNet.Hosting private class TestLoader : IStartupLoader { - public StartupMethods Load(string startupAssemblyName, string environmentName, IList diagnosticMessages) + public Type FindStartupType(string startupAssemblyName, IList diagnosticMessages) { throw new NotImplementedException(); } - } - private class TestEngineFactory : IHostingFactory - { - public IHostingEngine Create(IConfiguration config) + public StartupMethods LoadMethods(Type startupType, IList diagnosticMessages) { throw new NotImplementedException(); } } - - private class TestServerFactory : IServerFactory - { - private readonly IFeatureCollection _featuresSupportedByThisHost; - - public TestServerFactory(IFeatureCollection featuresSupportedByThisHost) - { - _featuresSupportedByThisHost = featuresSupportedByThisHost; - } - - public IServerInformation Initialize(IConfiguration configuration) - { - return null; - } - - public IDisposable Start(IServerInformation serverInformation, Func application) - { - application(_featuresSupportedByThisHost).Wait(); - return null; - } - } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index cce2931e22..ca803c6831 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics; using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; @@ -26,7 +25,10 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "WithServices", diagnosticMessages); + var hostingEnv = new HostingEnvironment { EnvironmentName = "WithServices" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + var startup = loader.LoadMethods(type, diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); @@ -47,9 +49,12 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupClassAddsConfigureServicesToApplicationServices(string environment) { var services = new ServiceCollection().BuildServiceProvider(); - var diagnosticMesssages = new List(); - var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", environment ?? "", diagnosticMesssages); + var diagnosticMessages = new List(); + var hostingEnv = new HostingEnvironment { EnvironmentName = environment }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + var startup = loader.LoadMethods(type, diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); @@ -67,9 +72,13 @@ namespace Microsoft.AspNet.Hosting.Tests var serviceCollection = new ServiceCollection(); serviceCollection.AddInstance(this); var services = serviceCollection.BuildServiceProvider(); - var diagnosticMessages = new List(); - var ex = Assert.Throws(() => new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "Boom", diagnosticMessages)); + var diagnosticMessages = new List(); + var hostingEnv = new HostingEnvironment { EnvironmentName = "Boom" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + + var ex = Assert.Throws(() => loader.LoadMethods(type, diagnosticMessages)); Assert.Equal("A method named 'ConfigureBoom' or 'Configure' in the type 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' could not be found.", ex.Message); } @@ -80,7 +89,10 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "WithNullConfigureServices", diagnosticMessages); + var hostingEnv = new HostingEnvironment { EnvironmentName = "WithNullConfigureServices" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + var startup = loader.LoadMethods(type, diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); @@ -96,7 +108,10 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = new StartupLoader(services).Load("Microsoft.AspNet.Hosting.Tests", "WithConfigureServices", diagnosticMessages); + var hostingEnv = new HostingEnvironment { EnvironmentName = "WithConfigureServices" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + var startup = loader.LoadMethods(type, diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); @@ -113,7 +128,9 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = new StartupLoader(services).Load(typeof(TestStartup), "", diagnosticMessages); + var hostingEnv = new HostingEnvironment(); + var loader = new StartupLoader(services, hostingEnv); + var startup = loader.LoadMethods(typeof(TestStartup), diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); @@ -130,7 +147,9 @@ namespace Microsoft.AspNet.Hosting.Tests var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); - var startup = new StartupLoader(services).Load(typeof(TestStartup), "No", diagnosticMessages); + var hostingEnv = new HostingEnvironment { EnvironmentName = "No" }; + var loader = new StartupLoader(services, hostingEnv); + var startup = loader.LoadMethods(typeof(TestStartup), diagnosticMessages); var app = new ApplicationBuilder(services); app.ApplicationServices = startup.ConfigureServicesDelegate(serviceCollection); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 72f7277990..fcbd153e8a 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -2,20 +2,16 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics; using System.IO; using System.Net; using System.Net.Http; -using System.Runtime.Versioning; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; -using Microsoft.Framework.Runtime; using Microsoft.Framework.Runtime.Infrastructure; using Xunit; @@ -56,54 +52,6 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("RequestServices:True", result); } - [Fact] - public async Task CanChangeApplicationName() - { - var fallbackServices = CallContextServiceLocator.Locator.ServiceProvider; - var appName = "gobblegobble"; - - var builder = TestServer.CreateBuilder(fallbackServices, new Configuration(), - app => - { - app.Run(context => - { - var appEnv = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("AppName:" + appEnv.ApplicationName); - }); - }, - configureServices: null); - - builder.ApplicationName = appName; - var server = builder.Build(); - - string result = await server.CreateClient().GetStringAsync("/path"); - Assert.Equal("AppName:" + appName, result); - } - - [Fact] - public async Task CanChangeAppPath() - { - var fallbackServices = CallContextServiceLocator.Locator.ServiceProvider; - var appPath = "."; - - var builder = TestServer.CreateBuilder(fallbackServices, new Configuration(), - app => - { - app.Run(context => - { - var env = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("AppPath:" + env.ApplicationBasePath); - }); - }, - configureServices: null); - - builder.ApplicationBasePath = appPath; - var server = builder.Build(); - - string result = await server.CreateClient().GetStringAsync("/path"); - Assert.Equal("AppPath:" + appPath, result); - } - [Fact] public async Task CanAccessLogger() { @@ -242,7 +190,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanCreateViaStartupType() { - TestServer server = TestServer.Create(); + TestServer server = new TestServer(TestServer.CreateBuilder().UseStartup()); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundService:True", await result.Content.ReadAsStringAsync()); @@ -251,9 +199,9 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanCreateViaStartupTypeAndSpecifyEnv() { - var builder = TestServer.CreateBuilder(); - builder.Environment = "Foo"; - var server = builder.Build(); + TestServer server = new TestServer(TestServer.CreateBuilder() + .UseStartup() + .UseEnvironment("Foo")); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); From 5093c06b2a6aa3360989fe6e7e61ea69a1f616fb Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 24 Apr 2015 00:10:36 -0700 Subject: [PATCH 0579/1838] Fix program main to actually use config --- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 541eec0f0d..d1282d9e1a 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Hosting config.AddEnvironmentVariables(); config.AddCommandLine(args); - var host = new WebHostBuilder(_serviceProvider).Build(); + var host = new WebHostBuilder(_serviceProvider, config).Build(); var serverShutdown = host.Start(); var loggerFactory = host.ApplicationServices.GetRequiredService(); var appShutdownService = host.ApplicationServices.GetRequiredService(); From 43a38c1b58d7466d1d4747ec47bf1187a8e2efdd Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Fri, 24 Apr 2015 08:51:30 -0700 Subject: [PATCH 0580/1838] Reorder Challenge parameters. --- .../Authentication/AuthenticationManager.cs | 15 ++++++++++----- .../DefaultAuthenticationManager.cs | 2 +- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs index 219e909221..f7b4342b59 100644 --- a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs @@ -17,22 +17,27 @@ namespace Microsoft.AspNet.Http.Authentication public virtual void Challenge() { - Challenge(properties: null, authenticationScheme: null); + Challenge(authenticationScheme: null, properties: null); } public virtual void Challenge(AuthenticationProperties properties) { - Challenge(properties, ""); + Challenge(authenticationScheme: null, properties: properties); } public virtual void Challenge(string authenticationScheme) { - Challenge(properties: null, authenticationScheme: authenticationScheme); + Challenge(authenticationScheme: authenticationScheme, properties: null); } - public abstract void Challenge(AuthenticationProperties properties, string authenticationScheme); + public abstract void Challenge(string authenticationScheme, AuthenticationProperties properties); - public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties = null); + public void SignIn(string authenticationScheme, ClaimsPrincipal principal) + { + SignIn(authenticationScheme, principal, properties: null); + } + + public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); public virtual void SignOut() { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 6f1c3ba419..f4d086b63d 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -97,7 +97,7 @@ namespace Microsoft.AspNet.Http.Authentication new AuthenticationDescription(authenticateContext.Description)); } - public override void Challenge(AuthenticationProperties properties, string authenticationScheme) + public override void Challenge(string authenticationScheme, AuthenticationProperties properties) { HttpResponseFeature.StatusCode = 401; var handler = HttpAuthenticationFeature.Handler; From b98af101f9226b4d3f817640f86058cd3a2d8085 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Fri, 24 Apr 2015 13:57:10 -0700 Subject: [PATCH 0581/1838] React to OperatingSystems change --- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index dca50c4e0f..5260f6c345 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Hosting } [ConditionalTheory] - [OSSkipCondition(OperatingSystems.Unix | OperatingSystems.MacOSX)] + [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] [InlineData(@"sub/sub2\sub3\", @"sub/sub2/sub3/")] public void MapPath_Windows_Facts(string virtualPath, string expectedSuffix) { From 117486de94fadcda9f93165e678b4c352b45e808 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 27 Apr 2015 14:18:02 -0700 Subject: [PATCH 0582/1838] #277 Rename IHttpClientCertificateFeature. #279 prefer X509Certificate2. --- src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs | 4 ++-- ...ficateFeature.cs => ITlsConnectionFeature.cs} | 6 +++--- .../DefaultConnectionInfo.cs | 16 ++++++++-------- ...ificateFeature.cs => TlsConnectionFeature.cs} | 8 ++++---- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 6 +++--- .../OwinFeatureCollection.cs | 14 +++++++------- 6 files changed, 27 insertions(+), 27 deletions(-) rename src/Microsoft.AspNet.Http.Interfaces/{IHttpClientCertificateFeature.cs => ITlsConnectionFeature.cs} (74%) rename src/Microsoft.AspNet.Http/{HttpClientCertificateFeature.cs => TlsConnectionFeature.cs} (60%) diff --git a/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs index 54175ec2f2..0587fde7ca 100644 --- a/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs @@ -20,8 +20,8 @@ namespace Microsoft.AspNet.Http public abstract bool IsLocal { get; set; } - public abstract X509Certificate ClientCertificate { get; set; } + public abstract X509Certificate2 ClientCertificate { get; set; } - public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); + public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs similarity index 74% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs index da8fd38115..fdac0526e2 100644 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs @@ -7,17 +7,17 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { - public interface IHttpClientCertificateFeature + public interface ITlsConnectionFeature { /// /// Synchronously retrieves the client certificate, if any. /// - X509Certificate ClientCertificate { get; set; } + X509Certificate2 ClientCertificate { get; set; } /// /// Asynchronously retrieves the client certificate, if any. /// /// - Task GetClientCertificateAsync(CancellationToken cancellationToken); + Task GetClientCertificateAsync(CancellationToken cancellationToken); } } diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index f400f6aaff..a01cee053e 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http private readonly IFeatureCollection _features; private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _clientCertificate = FeatureReference.Default; + private FeatureReference _tlsConnectoin = FeatureReference.Default; public DefaultConnectionInfo(IFeatureCollection features) { @@ -27,9 +27,9 @@ namespace Microsoft.AspNet.Http get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); } } - private IHttpClientCertificateFeature HttpClientCertificateFeature + private ITlsConnectionFeature TlsConnectionFeature { - get { return _clientCertificate.Fetch(_features) ?? _clientCertificate.Update(_features, new HttpClientCertificateFeature()); } + get { return _tlsConnectoin.Fetch(_features) ?? _tlsConnectoin.Update(_features, new TlsConnectionFeature()); } } public override IPAddress RemoteIpAddress @@ -62,15 +62,15 @@ namespace Microsoft.AspNet.Http set { HttpConnectionFeature.IsLocal = value; } } - public override X509Certificate ClientCertificate + public override X509Certificate2 ClientCertificate { - get { return HttpClientCertificateFeature.ClientCertificate; } - set { HttpClientCertificateFeature.ClientCertificate = value; } + get { return TlsConnectionFeature.ClientCertificate; } + set { TlsConnectionFeature.ClientCertificate = value; } } - public override Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()) + public override Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()) { - return HttpClientCertificateFeature.GetClientCertificateAsync(cancellationToken); + return TlsConnectionFeature.GetClientCertificateAsync(cancellationToken); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs similarity index 60% rename from src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs rename to src/Microsoft.AspNet.Http/TlsConnectionFeature.cs index 22ef21f704..bf22639161 100644 --- a/src/Microsoft.AspNet.Http/HttpClientCertificateFeature.cs +++ b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs @@ -7,15 +7,15 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { - public class HttpClientCertificateFeature : IHttpClientCertificateFeature + public class TlsConnectionFeature : ITlsConnectionFeature { - public HttpClientCertificateFeature() + public TlsConnectionFeature() { } - public X509Certificate ClientCertificate { get; set; } + public X509Certificate2 ClientCertificate { get; set; } - public Task GetClientCertificateAsync(CancellationToken cancellationToken) + public Task GetClientCertificateAsync(CancellationToken cancellationToken) { return Task.FromResult(ClientCertificate); } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 9dfae8a833..f35bedcd34 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -99,9 +99,9 @@ namespace Microsoft.AspNet.Owin if (context.Request.IsHttps) { - _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, - (feature, value) => feature.ClientCertificate = (X509Certificate)value)); - _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap( + _entries.Add(OwinConstants.CommonKeys.ClientCertificate, new FeatureMap(feature => feature.ClientCertificate, + (feature, value) => feature.ClientCertificate = (X509Certificate2)value)); + _entries.Add(OwinConstants.CommonKeys.LoadClientCertAsync, new FeatureMap( feature => new Func(() => feature.GetClientCertificateAsync(CancellationToken.None)))); } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 195fb04cb0..0c270bfc3a 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Owin IHttpResponseFeature, IHttpConnectionFeature, IHttpSendFileFeature, - IHttpClientCertificateFeature, + ITlsConnectionFeature, IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, IHttpWebSocketFeature, @@ -228,20 +228,20 @@ namespace Microsoft.AspNet.Owin } } - X509Certificate IHttpClientCertificateFeature.ClientCertificate + X509Certificate2 ITlsConnectionFeature.ClientCertificate { - get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } + get { return Prop(OwinConstants.CommonKeys.ClientCertificate); } set { Prop(OwinConstants.CommonKeys.ClientCertificate, value); } } - async Task IHttpClientCertificateFeature.GetClientCertificateAsync(CancellationToken cancellationToken) + async Task ITlsConnectionFeature.GetClientCertificateAsync(CancellationToken cancellationToken) { var loadAsync = Prop>(OwinConstants.CommonKeys.LoadClientCertAsync); if (loadAsync != null) { await loadAsync(); } - return Prop(OwinConstants.CommonKeys.ClientCertificate); + return Prop(OwinConstants.CommonKeys.ClientCertificate); } CancellationToken IHttpRequestLifetimeFeature.RequestAborted @@ -308,7 +308,7 @@ namespace Microsoft.AspNet.Owin { return SupportsSendFile; } - else if (key == typeof(IHttpClientCertificateFeature)) + else if (key == typeof(ITlsConnectionFeature)) { return SupportsClientCerts; } @@ -342,7 +342,7 @@ namespace Microsoft.AspNet.Owin } if (SupportsClientCerts) { - keys.Add(typeof(IHttpClientCertificateFeature)); + keys.Add(typeof(ITlsConnectionFeature)); } if (SupportsWebSockets) { From 86f94b7590daf4ca24ba37f17d30b41df60c9be3 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 28 Apr 2015 13:44:40 -0700 Subject: [PATCH 0583/1838] Fix typo. --- src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index a01cee053e..feae42f1f4 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http private readonly IFeatureCollection _features; private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _tlsConnectoin = FeatureReference.Default; + private FeatureReference _tlsConnection = FeatureReference.Default; public DefaultConnectionInfo(IFeatureCollection features) { @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Http private ITlsConnectionFeature TlsConnectionFeature { - get { return _tlsConnectoin.Fetch(_features) ?? _tlsConnectoin.Update(_features, new TlsConnectionFeature()); } + get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); } } public override IPAddress RemoteIpAddress From 06584a31b4b6d963fbe2130c915d75d3f9c4c152 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 29 Apr 2015 09:59:29 -0700 Subject: [PATCH 0584/1838] #276 Remove unused IHttpApplicationFeature. --- .../IHttpApplicationFeature.cs | 14 -------------- 1 file changed, 14 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs b/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs deleted file mode 100644 index 3032d47b6e..0000000000 --- a/src/Microsoft.AspNet.Http.Interfaces/IHttpApplicationFeature.cs +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Threading; - -namespace Microsoft.AspNet.Http -{ - public interface IHttpApplicationFeature - { - string AppName { get; set; } - string AppMode { get; set; } - CancellationToken OnAppDisposing { get; set; } - } -} From 5bce14068164c47ce2ad12fe3354246201184bbe Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 29 Apr 2015 14:38:26 -0700 Subject: [PATCH 0585/1838] #295 Rename Core->Abstractions and Interfaces->Features. --- HttpAbstractions.sln | 8 ++++---- .../Authentication/AuthenticateResult.cs | 0 .../Authentication/AuthenticationDescription.cs | 0 .../Authentication/AuthenticationManager.cs | 0 .../Authentication/AuthenticationProperties.cs | 0 .../ConnectionInfo.cs | 0 .../CookieOptions.cs | 0 .../Extensions/MapExtensions.cs | 0 .../Extensions/MapMiddleware.cs | 0 .../Extensions/MapOptions.cs | 0 .../Extensions/MapWhenExtensions.cs | 0 .../Extensions/MapWhenMiddleware.cs | 0 .../Extensions/MapWhenOptions.cs | 0 .../Extensions/RunExtensions.cs | 0 .../Extensions/UseExtensions.cs | 0 .../FragmentString.cs | 0 .../HostString.cs | 0 .../HttpContext.cs | 0 .../HttpRequest.cs | 0 .../HttpResponse.cs | 0 .../HttpResponseWritingExtensions.cs | 0 .../IApplicationBuilder.cs | 0 .../IFormCollection.cs | 0 .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IHeaderDictionary.cs | 0 .../IReadableStringCollection.cs | 0 .../IResponseCookies.cs | 0 .../ISessionCollection.cs | 0 .../Microsoft.AspNet.Http.Abstractions.xproj} | 0 .../PathString.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryString.cs | 0 .../RequestDelegate.cs | 0 .../WebSocketManager.cs | 0 .../project.json | 0 src/Microsoft.AspNet.Http.Extensions/project.json | 4 ++-- .../Authentication/AuthenticateContext.cs | 0 .../Authentication/ChallengeContext.cs | 0 .../Authentication/DescribeSchemesContext.cs | 0 .../Authentication/IAuthenticationHandler.cs | 0 .../Authentication/IHttpAuthenticationFeature.cs | 0 .../Authentication/SignInContext.cs | 0 .../Authentication/SignOutContext.cs | 0 .../IHttpBufferingFeature.cs | 0 .../IHttpConnectionFeature.cs | 0 .../IHttpRequestFeature.cs | 0 .../IHttpRequestLifetimeFeature.cs | 0 .../IHttpResponseFeature.cs | 0 .../IHttpSendFileFeature.cs | 0 .../IHttpUpgradeFeature.cs | 0 .../IHttpWebSocketFeature.cs | 0 .../IRequestIdentifierFeature.cs | 0 .../ISession.cs | 0 .../ISessionFactory.cs | 0 .../ISessionFeature.cs | 0 .../ITlsConnectionFeature.cs | 0 .../ITlsTokenBindingFeature.cs | 0 .../Microsoft.AspNet.Http.Features.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../WebSocketAcceptContext.cs | 0 .../project.json | 0 src/Microsoft.AspNet.Http/project.json | 4 ++-- .../Microsoft.AspNet.FeatureModel.Tests.xproj | 3 +++ .../HttpResponseWritingExtensionsTests.cs | 0 .../MapPathMiddlewareTests.cs | 0 .../MapPredicateMiddlewareTests.cs | 0 .../Microsoft.AspNet.Http.Abstractions.Tests.xproj} | 3 +++ .../PathStringTests.cs | 0 .../project.json | 0 .../Microsoft.AspNet.Http.Extensions.Tests.xproj | 3 +++ .../Microsoft.AspNet.Http.Tests.xproj | 3 +++ .../Microsoft.AspNet.Owin.Tests.xproj | 3 +++ .../Microsoft.AspNet.WebUtilities.Tests.xproj | 3 +++ .../Microsoft.Framework.WebEncoders.Tests.xproj | 3 +++ .../Microsoft.Net.Http.Headers.Tests.xproj | 3 +++ 76 files changed, 32 insertions(+), 8 deletions(-) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticateResult.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticationManager.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/CookieOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/FragmentString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HostString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpContext.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IFormCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IFormFile.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IReadableStringCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/ISessionCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj => Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/PathString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/QueryString.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/WebSocketManager.cs (100%) rename src/{Microsoft.AspNet.Http.Core => Microsoft.AspNet.Http.Abstractions}/project.json (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/ChallengeContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/DescribeSchemesContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/IAuthenticationHandler.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/IHttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/SignInContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Authentication/SignOutContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpBufferingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpSendFileFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpUpgradeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IHttpWebSocketFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/IRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ISession.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ISessionFactory.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ISessionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ITlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/ITlsTokenBindingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj => Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj} (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.Http.Interfaces => Microsoft.AspNet.Http.Features}/project.json (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/HttpResponseWritingExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/MapPathMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/MapPredicateMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj => Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj} (91%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/PathStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Core.Tests => Microsoft.AspNet.Http.Abstractions.Tests}/project.json (100%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 18c4d05c9f..aa66e840ca 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22807.0 +VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -9,9 +9,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-3 EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core", "src\Microsoft.AspNet.Http.Core\Microsoft.AspNet.Http.Core.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions", "src\Microsoft.AspNet.Http.Abstractions\Microsoft.AspNet.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Interfaces", "src\Microsoft.AspNet.Http.Interfaces\Microsoft.AspNet.Http.Interfaces.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features", "src\Microsoft.AspNet.Http.Features\Microsoft.AspNet.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" EndProject @@ -19,7 +19,7 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Core.Tests", "test\Microsoft.AspNet.Http.Core.Tests\Microsoft.AspNet.Http.Core.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions.Tests", "test\Microsoft.AspNet.Http.Abstractions.Tests\Microsoft.AspNet.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticateResult.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationDescription.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationManager.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Authentication/AuthenticationProperties.cs rename to src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/ConnectionInfo.cs rename to src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http.Core/CookieOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/CookieOptions.cs rename to src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapOptions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/RunExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Extensions/UseExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/FragmentString.cs rename to src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs diff --git a/src/Microsoft.AspNet.Http.Core/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HostString.cs rename to src/Microsoft.AspNet.Http.Abstractions/HostString.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpContext.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpRequest.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpResponse.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs diff --git a/src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IApplicationBuilder.cs rename to src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IFormCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IFormFile.cs rename to src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs diff --git a/src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IFormFileCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IHeaderDictionary.cs rename to src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IReadableStringCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/IResponseCookies.cs b/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/IResponseCookies.cs rename to src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http.Core/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/ISessionCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs diff --git a/src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj b/src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Microsoft.AspNet.Http.Core.xproj rename to src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Http.Core/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/PathString.cs rename to src/Microsoft.AspNet.Http.Abstractions/PathString.cs diff --git a/src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Core/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/QueryString.cs rename to src/Microsoft.AspNet.Http.Abstractions/QueryString.cs diff --git a/src/Microsoft.AspNet.Http.Core/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/RequestDelegate.cs rename to src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs diff --git a/src/Microsoft.AspNet.Http.Core/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Core/WebSocketManager.cs rename to src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http.Core/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Core/project.json rename to src/Microsoft.AspNet.Http.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 4055d3b43d..2656106881 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -2,8 +2,8 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/AuthenticateContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/IAuthenticationHandler.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/SignInContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Authentication/SignOutContext.cs rename to src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpBufferingFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpRequestFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpResponseFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpSendFileFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpUpgradeFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IHttpWebSocketFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/IRequestIdentifierFeature.cs rename to src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ISession.cs rename to src/Microsoft.AspNet.Http.Features/ISession.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ISessionFactory.cs rename to src/Microsoft.AspNet.Http.Features/ISessionFactory.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ISessionFeature.cs rename to src/Microsoft.AspNet.Http.Features/ISessionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ITlsConnectionFeature.cs rename to src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/ITlsTokenBindingFeature.cs rename to src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj b/src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Microsoft.AspNet.Http.Interfaces.xproj rename to src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj diff --git a/src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/WebSocketAcceptContext.cs rename to src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Http.Interfaces/project.json b/src/Microsoft.AspNet.Http.Features/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Interfaces/project.json rename to src/Microsoft.AspNet.Http.Features/project.json diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index b554c9eabe..0188f4ff3d 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -3,8 +3,8 @@ "description": "ASP.NET 5 HTTP feature implementations.", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "Microsoft.AspNet.Http.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj index 6bd0b3bd59..0e9350ca4e 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/HttpResponseWritingExtensionsTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj b/test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj similarity index 91% rename from test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj rename to test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj index 424d3a7f9b..7989ec74c0 100644 --- a/test/Microsoft.AspNet.Http.Core.Tests/Microsoft.AspNet.Http.Core.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/PathStringTests.cs rename to test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Core.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Core.Tests/project.json rename to test/Microsoft.AspNet.Http.Abstractions.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj index 38294666a7..258c09d86a 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj index c438cb7050..278ef825da 100644 --- a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj +++ b/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj index 0a5d033908..a923e01d9a 100644 --- a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj +++ b/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj index 8476f5e9a6..0042456e89 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj +++ b/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj index d456c7e180..9b0698e3cc 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj +++ b/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj index a0a2089ec3..819024d5ea 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj +++ b/test/Microsoft.Net.Http.Headers.Tests/Microsoft.Net.Http.Headers.Tests.xproj @@ -13,5 +13,8 @@ 2.0 + + + \ No newline at end of file From f48801cdf704fb60d395d5cc18ca2014958752a1 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 29 Apr 2015 15:28:38 -0700 Subject: [PATCH 0586/1838] React to Http.Core rename. --- src/Microsoft.AspNet.Hosting.Interfaces/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json index fa914dfcab..448c0c48a3 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 Hosting interfaces.", "dependencies": { - "Microsoft.AspNet.Http.Core": "1.0.0-*", + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, From ec7a4351ded97ec484fcbf273bab05e0ad12954c Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 16:54:12 -0700 Subject: [PATCH 0587/1838] Interfaces->Abstractions --- Hosting.sln | 4 ++-- .../HostingEnvironmentExtensions.cs | 0 .../IApplicationLifetime.cs | 0 .../IHostingEnvironment.cs | 0 .../IHttpContextAccessor.cs | 0 .../Microsoft.AspNet.Hosting.Abstractions.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 2 +- .../IServerFactory.cs | 0 .../IServerInformation.cs | 0 .../Microsoft.AspNet.Hosting.Server.Abstractions.xproj} | 0 .../project.json | 0 src/Microsoft.AspNet.Hosting/project.json | 4 ++-- 13 files changed, 5 insertions(+), 5 deletions(-) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/HostingEnvironmentExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/IApplicationLifetime.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/IHostingEnvironment.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/IHttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj => Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/project.json (86%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Abstractions}/IServerFactory.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Abstractions}/IServerInformation.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj => Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Abstractions}/project.json (100%) diff --git a/Hosting.sln b/Hosting.sln index b7b4361fe4..0c93390a49 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -20,9 +20,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution global.json = global.json EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Abstractions", "src\Microsoft.AspNet.Hosting.Abstractions\Microsoft.AspNet.Hosting.Abstractions.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Interfaces", "src\Microsoft.AspNet.Hosting.Server.Interfaces\Microsoft.AspNet.Hosting.Server.Interfaces.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Abstractions", "src\Microsoft.AspNet.Hosting.Server.Abstractions\Microsoft.AspNet.Hosting.Server.Abstractions.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Testing", "src\Microsoft.AspNet.Server.Testing\Microsoft.AspNet.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" EndProject diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj rename to src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json similarity index 86% rename from src/Microsoft.AspNet.Hosting.Interfaces/project.json rename to src/Microsoft.AspNet.Hosting.Abstractions/project.json index 448c0c48a3..5d61d5a330 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -1,6 +1,6 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 Hosting interfaces.", + "description": "ASP.NET 5 Hosting abstractions.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 25eda4017f..89f0bf59dd 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -4,8 +4,8 @@ "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", - "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Hosting.Server.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", From 4308522de7ab7fe1f4428a3ccad4186ccf13ad11 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 18:52:51 -0700 Subject: [PATCH 0588/1838] Reacting to interface name changes --- src/Microsoft.AspNet.Hosting.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index 5d61d5a330..bfb6a183f1 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 Hosting abstractions.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", + "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index fd590e5417..ecc01a5efb 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*" + "Microsoft.Framework.ConfigurationModel.Abstractions": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 89f0bf59dd..2450ba27c8 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -11,7 +11,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index c4abcae964..ffebc4d56b 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -3,8 +3,8 @@ "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.Logging.Interfaces": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index de8dbc8b81..3465647dff 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 2a90b46be98a14813ea8801ab3dcc55abe2c28af Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 23:44:24 -0700 Subject: [PATCH 0589/1838] Revert "Reacting to interface name changes" This reverts commit 4308522de7ab7fe1f4428a3ccad4186ccf13ad11. --- src/Microsoft.AspNet.Hosting.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index bfb6a183f1..5d61d5a330 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 Hosting abstractions.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", + "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index ecc01a5efb..fd590e5417 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel.Abstractions": "1.0.0-*" + "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 2450ba27c8..89f0bf59dd 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -11,7 +11,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index ffebc4d56b..c4abcae964 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -3,8 +3,8 @@ "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*" + "Microsoft.Framework.Logging.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 3465647dff..de8dbc8b81 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 306cf6221d449d9455c24bb8f92976d64461b0e3 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 23:44:27 -0700 Subject: [PATCH 0590/1838] Revert "Interfaces->Abstractions" This reverts commit ec7a4351ded97ec484fcbf273bab05e0ad12954c. --- Hosting.sln | 4 ++-- .../HostingEnvironmentExtensions.cs | 0 .../IApplicationLifetime.cs | 0 .../IHostingEnvironment.cs | 0 .../IHttpContextAccessor.cs | 0 .../Microsoft.AspNet.Hosting.Interfaces.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 2 +- .../IServerFactory.cs | 0 .../IServerInformation.cs | 0 .../Microsoft.AspNet.Hosting.Server.Interfaces.xproj} | 0 .../project.json | 0 src/Microsoft.AspNet.Hosting/project.json | 4 ++-- 13 files changed, 5 insertions(+), 5 deletions(-) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNet.Hosting.Interfaces}/HostingEnvironmentExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNet.Hosting.Interfaces}/IApplicationLifetime.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNet.Hosting.Interfaces}/IHostingEnvironment.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNet.Hosting.Interfaces}/IHttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj => Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNet.Hosting.Interfaces}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNet.Hosting.Interfaces}/project.json (86%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNet.Hosting.Server.Interfaces}/IServerFactory.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNet.Hosting.Server.Interfaces}/IServerInformation.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj => Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNet.Hosting.Server.Interfaces}/project.json (100%) diff --git a/Hosting.sln b/Hosting.sln index 0c93390a49..b7b4361fe4 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -20,9 +20,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution global.json = global.json EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Abstractions", "src\Microsoft.AspNet.Hosting.Abstractions\Microsoft.AspNet.Hosting.Abstractions.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Abstractions", "src\Microsoft.AspNet.Hosting.Server.Abstractions\Microsoft.AspNet.Hosting.Server.Abstractions.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Interfaces", "src\Microsoft.AspNet.Hosting.Server.Interfaces\Microsoft.AspNet.Hosting.Server.Interfaces.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Testing", "src\Microsoft.AspNet.Server.Testing\Microsoft.AspNet.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" EndProject diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj b/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj rename to src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Interfaces/project.json similarity index 86% rename from src/Microsoft.AspNet.Hosting.Abstractions/project.json rename to src/Microsoft.AspNet.Hosting.Interfaces/project.json index 5d61d5a330..448c0c48a3 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Interfaces/project.json @@ -1,6 +1,6 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 Hosting abstractions.", + "description": "ASP.NET 5 Hosting interfaces.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj b/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json rename to src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 89f0bf59dd..25eda4017f 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -4,8 +4,8 @@ "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", - "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Hosting.Server.Interfaces": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", From a8f794bbb39d123f59d9ce3d41839d3c8b10f852 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 23:47:40 -0700 Subject: [PATCH 0591/1838] Revert "Revert "Interfaces->Abstractions"" This reverts commit 306cf6221d449d9455c24bb8f92976d64461b0e3. --- Hosting.sln | 4 ++-- .../HostingEnvironmentExtensions.cs | 0 .../IApplicationLifetime.cs | 0 .../IHostingEnvironment.cs | 0 .../IHttpContextAccessor.cs | 0 .../Microsoft.AspNet.Hosting.Abstractions.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 2 +- .../IServerFactory.cs | 0 .../IServerInformation.cs | 0 .../Microsoft.AspNet.Hosting.Server.Abstractions.xproj} | 0 .../project.json | 0 src/Microsoft.AspNet.Hosting/project.json | 4 ++-- 13 files changed, 5 insertions(+), 5 deletions(-) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/HostingEnvironmentExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/IApplicationLifetime.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/IHostingEnvironment.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/IHttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj => Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting.Interfaces => Microsoft.AspNet.Hosting.Abstractions}/project.json (86%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Abstractions}/IServerFactory.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Abstractions}/IServerInformation.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj => Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Server.Interfaces => Microsoft.AspNet.Hosting.Server.Abstractions}/project.json (100%) diff --git a/Hosting.sln b/Hosting.sln index b7b4361fe4..0c93390a49 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -20,9 +20,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution global.json = global.json EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Interfaces", "src\Microsoft.AspNet.Hosting.Interfaces\Microsoft.AspNet.Hosting.Interfaces.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Abstractions", "src\Microsoft.AspNet.Hosting.Abstractions\Microsoft.AspNet.Hosting.Abstractions.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Interfaces", "src\Microsoft.AspNet.Hosting.Server.Interfaces\Microsoft.AspNet.Hosting.Server.Interfaces.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Abstractions", "src\Microsoft.AspNet.Hosting.Server.Abstractions\Microsoft.AspNet.Hosting.Server.Abstractions.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Testing", "src\Microsoft.AspNet.Server.Testing\Microsoft.AspNet.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" EndProject diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/HostingEnvironmentExtensions.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IApplicationLifetime.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IHostingEnvironment.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/IHttpContextAccessor.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/Microsoft.AspNet.Hosting.Interfaces.xproj rename to src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Interfaces/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json similarity index 86% rename from src/Microsoft.AspNet.Hosting.Interfaces/project.json rename to src/Microsoft.AspNet.Hosting.Abstractions/project.json index 448c0c48a3..5d61d5a330 100644 --- a/src/Microsoft.AspNet.Hosting.Interfaces/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -1,6 +1,6 @@ { "version": "1.0.0-*", - "description": "ASP.NET 5 Hosting interfaces.", + "description": "ASP.NET 5 Hosting abstractions.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerFactory.cs rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/IServerInformation.cs rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj b/src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/Microsoft.AspNet.Hosting.Server.Interfaces.xproj rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Interfaces/project.json rename to src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 25eda4017f..89f0bf59dd 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -4,8 +4,8 @@ "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", - "Microsoft.AspNet.Hosting.Interfaces": "1.0.0-*", - "Microsoft.AspNet.Hosting.Server.Interfaces": "1.0.0-*", + "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Framework.ConfigurationModel": "1.0.0-*", From 23592666e29bb81fd5002b86ddc287d45e3b5a9c Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 23:48:21 -0700 Subject: [PATCH 0592/1838] Revert "Revert "Reacting to interface name changes"" This reverts commit 2a90b46be98a14813ea8801ab3dcc55abe2c28af. --- src/Microsoft.AspNet.Hosting.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 5 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index 5d61d5a330..bfb6a183f1 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 Hosting abstractions.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Interfaces": "1.0.0-*", + "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index fd590e5417..ecc01a5efb 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel.Interfaces": "1.0.0-*" + "Microsoft.Framework.ConfigurationModel.Abstractions": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 89f0bf59dd..2450ba27c8 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -11,7 +11,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index c4abcae964..ffebc4d56b 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -3,8 +3,8 @@ "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.Logging.Interfaces": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index de8dbc8b81..3465647dff 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 2c602d6396697270f82d6aa04a74245b40252a21 Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 29 Apr 2015 23:50:17 -0700 Subject: [PATCH 0593/1838] Only revert runtime.abstractions --- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 2450ba27c8..89f0bf59dd 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -11,7 +11,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index ffebc4d56b..c9913e24b2 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*" + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 3465647dff..de8dbc8b81 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 89ccdf56bf772f6076271bc064bed74d5a9d1fdd Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 30 Apr 2015 08:45:24 -0700 Subject: [PATCH 0594/1838] React to interface renames --- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.Framework.WebEncoders/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 2656106881..1c0b74dcab 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 612cd69ddd..e39ec75adc 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "Contains registration and configuration APIs for the core framework encoders.", "dependencies": { - "Microsoft.Framework.DependencyInjection.Interfaces": "1.0.0-*", + "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" From 602f638a8c08c8473eeb299380036d4cd74615d3 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 30 Apr 2015 13:21:14 -0700 Subject: [PATCH 0595/1838] Remove EncoderServices and add default services directly in the service collection extension --- .../EncoderServiceCollectionExtensions.cs | 26 +++++++++++++++- .../EncoderServices.cs | 31 ------------------- 2 files changed, 25 insertions(+), 32 deletions(-) delete mode 100644 src/Microsoft.Framework.WebEncoders/EncoderServices.cs diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index aae3ffbcf2..3d0851e9d4 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -3,6 +3,7 @@ using System; using Microsoft.Framework.Internal; +using Microsoft.Framework.OptionsModel; using Microsoft.Framework.WebEncoders; namespace Microsoft.Framework.DependencyInjection @@ -17,12 +18,35 @@ namespace Microsoft.Framework.DependencyInjection public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, Action configureOptions) { services.AddOptions(); - services.TryAdd(EncoderServices.GetDefaultServices()); + + // Register the default encoders + // We want to call the 'Default' property getters lazily since they perform static caching + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter)))); + if (configureOptions != null) { services.Configure(configureOptions); } + return services; } + + private static Func CreateFactory( + Func defaultFactory, + Func customFilterFactory) + { + return serviceProvider => + { + var codePointFilter = serviceProvider?.GetService>()? + .Options? + .CodePointFilter; + return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); + }; + } } } diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs b/src/Microsoft.Framework.WebEncoders/EncoderServices.cs deleted file mode 100644 index d7759f5134..0000000000 --- a/src/Microsoft.Framework.WebEncoders/EncoderServices.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.OptionsModel; - -namespace Microsoft.Framework.WebEncoders -{ - public static class EncoderServices - { - public static IEnumerable GetDefaultServices() - { - // Register the default encoders - // We want to call the 'Default' property getters lazily since they perform static caching - yield return ServiceDescriptor.Singleton(CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter))); - yield return ServiceDescriptor.Singleton(CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter))); - yield return ServiceDescriptor.Singleton(CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter))); - } - - private static Func CreateFactory(Func defaultFactory, Func customFilterFactory) - { - return serviceProvider => - { - var codePointFilter = serviceProvider?.GetService>()?.Options?.CodePointFilter; - return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); - }; - } - } -} From c4d8b51f99f87a7e352a8e06be40d41749ddf574 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 1 May 2015 11:05:40 -0700 Subject: [PATCH 0596/1838] React to DNX package renames --- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 89f0bf59dd..2450ba27c8 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -11,7 +11,7 @@ "Microsoft.Framework.ConfigurationModel": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index c9913e24b2..ffebc4d56b 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*" + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index de8dbc8b81..3465647dff 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Interfaces": "1.0.0-*", + "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 65b21712ef26090c2c3b3b8818f61fe2193e0ed9 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 1 May 2015 13:51:42 -0700 Subject: [PATCH 0597/1838] Update LICENSE.txt and license header on files. --- LICENSE.txt | 2 +- .../HostingEnvironmentExtensions.cs | 2 +- .../IApplicationLifetime.cs | 2 +- .../IHostingEnvironment.cs | 2 +- .../IHttpContextAccessor.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- .../IServerFactory.cs | 2 +- .../IServerInformation.cs | 2 +- src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs | 2 +- .../Builder/ApplicationBuilderFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs | 2 +- .../Builder/IApplicationBuilderFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Hosting/HostingEnvironment.cs | 2 +- src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs | 2 +- src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs | 2 +- .../Internal/AutoRequestServicesStartupFilter.cs | 2 +- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs | 2 +- src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs | 2 +- .../Internal/RequestServicesContainer.cs | 2 +- .../Internal/RequestServicesContainerMiddleware.cs | 2 +- src/Microsoft.AspNet.Hosting/PlatformHelper.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs | 2 +- .../Startup/ConfigureServicesDelegate.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- .../Common/DeploymentParameters.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs | 2 +- .../Common/DotnetArchitecture.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs | 2 +- .../Deployers/ApplicationDeployer.cs | 2 +- .../Deployers/ApplicationDeployerFactory.cs | 2 +- .../Deployers/IApplicationDeployer.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs | 2 +- .../Deployers/IISExpressDeployer.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 2 +- .../xunit/SkipIfCurrentRuntimeIsCoreClr.cs | 2 +- .../xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs | 2 +- .../xunit/SkipIfIISVariationsNotEnabledAttribute.cs | 2 +- .../xunit/SkipOn32BitOSAttribute.cs | 2 +- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 2 +- src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.TestHost/RequestBuilder.cs | 2 +- src/Microsoft.AspNet.TestHost/RequestFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseStream.cs | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs | 2 +- .../Fakes/IFakeServiceInstance.cs | 2 +- .../Fakes/IFakeSingletonService.cs | 2 +- .../Fakes/IFakeStartupCallback.cs | 2 +- .../Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs | 2 +- .../Fakes/StartupWithConfigureServicesNotResolved.cs | 2 +- .../Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 85 files changed, 85 insertions(+), 85 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index d85a1524ad..0bdc1962b6 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Copyright (c) .NET Foundation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index 9e9b5fd2ce..c0838231fc 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs index 755a415103..c229eb6e67 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs index da774985c4..b57ae9a6af 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs index 8b1719880b..eab12b1344 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs index fe46b8fc69..a4b5c17d32 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs index c30e0d00e3..2e3af1e7a2 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Server diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs index a8bb03860b..eb6dc364b9 100644 --- a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs index acefa86bc7..f1198a9ef0 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index f8411eee1a..0b8af5f0ea 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs index c866b2d79d..ddcf5807a5 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs index ba3e7a36dc..128dfc4fa1 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs index 6baca0975d..6593cf957e 100644 --- a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index dac9b27d89..8060d32659 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index cd18889034..a6cd1d5abf 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; diff --git a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs index 5b1e0ef9e1..f649d95016 100644 --- a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs b/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs index 0d28da169c..205440b5fe 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 86bbee3936..9a14754a40 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs index 7b48d72b8f..cec8d4d762 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs index f79031eb0f..d0a3818867 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs index 716c2ed3be..74e6df0fe2 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs index 8ffd9f7a06..0a0d169dcb 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs index 1309a18786..fbe16751c1 100644 --- a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs +++ b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index d1282d9e1a..11718b64b5 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs index f0b91fcf8f..abf67b4263 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Server diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index fd7c9a41ea..7a06dfa70f 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs index 415302a961..3275f056d9 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs index c55eee4c6f..d500ccea06 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs index 943c8aed32..437a841e89 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs index 6ba16f4e08..ee1db50c8e 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 2b95b72ed7..383d0d8357 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs index 4644b5a55e..c213a681d3 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 09e70f2650..256f615597 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs index 39278112b2..aa1a0d87a7 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs index 6a2c1a69d4..8266234522 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs b/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs index 11b1a3d5e3..483a4569bb 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Server.Testing diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs b/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs index 99913581b7..5b67b5d24c 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Server.Testing diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs index 1c6e6949dd..ae2cedd6e7 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs b/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs index 9756b1496b..3d17cb23bd 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Server.Testing diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index e3f1531052..55893b7aec 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs index 5308609815..6422d3f507 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs index c027632ccd..85467bccb1 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index 45749a82ba..b7290b9f9c 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. #if DNX451 diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 25cf0e7012..5c63d28982 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs index 12f099596f..df44e88ecd 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 3d366241b5..e0121bdfd4 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs index 7c1d5340aa..3afee2f2fa 100644 --- a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs index 541fa684bc..b3c13646ce 100644 --- a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs index dbfcbc5014..a6d26fe3b6 100644 --- a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs index 37be266e59..a04349bcc2 100644 --- a/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs +++ b/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 75a954296c..78afb19a28 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs index 23c410c805..d052161863 100644 --- a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. +// Copyright (c) .NET Foundation. // All Rights Reserved // // Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs index 57422b4b33..77344da496 100644 --- a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs +++ b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index 3c043c6e98..61fb442632 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index b8bf81dcba..3b43f42e6f 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index a3b555bd70..5946117ab2 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index d5bf3e52a6..772c934260 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs index a955ed377e..d18fdd9e42 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs index 75e8b53216..75176f8928 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs index e67809bb83..c0a60c9364 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs index 6e279051e2..da9f00507f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs index 0e5ca63193..f5586003a6 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs index 22e1837513..dc08bcbe64 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs index e9d8bc0f47..6dd1313072 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs index 844ad72395..aca376a3fa 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs index 5a5ca0341b..e804deee82 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs index 0e64d75641..d71be552c2 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 8f61d7e4c3..09a4a3360f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs index e9daa9584d..d2f27bdf40 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.Framework.DependencyInjection; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs index 6fb647a489..cfef8b9060 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs index 16e73e3d9c..e32663d293 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs index 8679e62093..fda5c8af5f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs index c7d4050481..f24e3babfd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 5260f6c345..3f8492b13f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs index 06cf95333b..86de386a1e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Hosting.Internal; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs index b6ab156902..2188bfbb7c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index ca803c6831..15fe74ab56 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index f8772ee570..b8f3ecb73a 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs index 64d1e18c97..8129ea73eb 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. +// Copyright (c) .NET Foundation. // All Rights Reserved // // Licensed under the Apache License, Version 2.0 (the "License"); diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs index 6a005fd0dc..11e3965a6e 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Xunit; diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs index 2564ee7112..f2c32ef0ca 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Xunit; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index c710d01da1..b77a681862 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index fcbd153e8a..be52e9b9cd 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; From 8703e2d7f21d09b50d20cc764e11d6bb0268aad2 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 1 May 2015 13:52:04 -0700 Subject: [PATCH 0598/1838] Update LICENSE.txt and license header on files. --- LICENSE.txt | 2 +- src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs | 2 +- src/Microsoft.AspNet.FeatureModel/FeatureObject.cs | 2 +- src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs | 2 +- src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs | 2 +- .../Authentication/AuthenticateResult.cs | 2 +- .../Authentication/AuthenticationDescription.cs | 2 +- .../Authentication/AuthenticationManager.cs | 2 +- .../Authentication/AuthenticationProperties.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs | 2 +- .../Extensions/MapExtensions.cs | 2 +- .../Extensions/MapMiddleware.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs | 2 +- .../Extensions/MapWhenExtensions.cs | 2 +- .../Extensions/MapWhenMiddleware.cs | 2 +- .../Extensions/MapWhenOptions.cs | 2 +- .../Extensions/RunExtensions.cs | 2 +- .../Extensions/UseExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HostString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs | 2 +- .../HttpResponseWritingExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs | 2 +- .../IReadableStringCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/PathString.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/QueryString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs | 2 +- .../HeaderDictionaryTypeExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs | 2 +- .../SendFileResponseExtensions.cs | 2 +- .../SessionCollectionExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs | 2 +- .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/IAuthenticationHandler.cs | 2 +- .../Authentication/IHttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISession.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFactory.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 2 +- .../Authentication/DefaultAuthenticationManager.cs | 2 +- .../Authentication/HttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.Http/BufferingHelper.cs | 2 +- src/Microsoft.AspNet.Http/Collections/FormCollection.cs | 2 +- src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs | 2 +- src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs | 2 +- src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs | 2 +- .../Collections/ReadableStringCollection.cs | 2 +- .../Collections/RequestCookiesCollection.cs | 2 +- src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs | 2 +- src/Microsoft.AspNet.Http/Collections/SessionCollection.cs | 2 +- src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpRequest.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpResponse.cs | 2 +- src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs | 2 +- src/Microsoft.AspNet.Http/FormFeature.cs | 2 +- src/Microsoft.AspNet.Http/FormFile.cs | 2 +- src/Microsoft.AspNet.Http/HttpConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Http/HttpRequestFeature.cs | 2 +- src/Microsoft.AspNet.Http/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http/IFormFeature.cs | 2 +- src/Microsoft.AspNet.Http/IItemsFeature.cs | 2 +- src/Microsoft.AspNet.Http/IQueryFeature.cs | 2 +- src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNet.Http/Infrastructure/Constants.cs | 2 +- src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs | 2 +- src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs | 2 +- src/Microsoft.AspNet.Http/ItemsFeature.cs | 2 +- src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Http/QueryFeature.cs | 2 +- src/Microsoft.AspNet.Http/ReferenceReadStream.cs | 2 +- src/Microsoft.AspNet.Http/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNet.Http/TlsConnectionFeature.cs | 2 +- src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinConstants.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs | 2 +- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Owin/Utilities.cs | 2 +- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs | 2 +- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs | 2 +- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 2 +- src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs | 2 +- src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs | 2 +- src/Microsoft.AspNet.WebUtilities/FormReader.cs | 2 +- src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs | 2 +- src/Microsoft.AspNet.WebUtilities/MultipartReader.cs | 2 +- src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs | 2 +- src/Microsoft.AspNet.WebUtilities/MultipartSection.cs | 2 +- src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 2 +- src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs | 2 +- src/Microsoft.AspNet.WebUtilities/StatusCodes.cs | 2 +- src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs | 2 +- src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs | 2 +- .../EncoderServiceProviderExtensions.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs | 2 +- .../IJavaScriptStringEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs | 2 +- .../JavaScriptStringEncoder.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs | 2 +- .../UnicodeRanges.generated.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs | 2 +- src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs | 2 +- .../EncoderServiceCollectionExtensions.cs | 2 +- src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderNames.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderQuality.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpParseResult.cs | 2 +- src/Microsoft.Net.Http.Headers/HttpRuleParser.cs | 2 +- src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs | 2 +- src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ObjectCollection.cs | 2 +- src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs | 2 +- .../StringWithQualityHeaderValueComparer.cs | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs | 2 +- .../InterfaceDictionaryTests.cs | 2 +- .../Properties/AssemblyInfo.cs | 2 +- test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 2 +- .../MapPathMiddlewareTests.cs | 2 +- .../MapPredicateMiddlewareTests.cs | 2 +- .../Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs | 2 +- .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs | 2 +- .../SendFileResponseExtensionsTests.cs | 2 +- .../UseWithServicesTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs | 2 +- .../Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs | 2 +- test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs | 2 +- .../AllowedCharsBitmapTests.cs | 2 +- .../CodePointFilterTests.cs | 2 +- .../Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs | 2 +- .../EncoderExtensionsTests.cs | 2 +- .../EncoderServiceCollectionExtensionsTests.cs | 2 +- .../EncoderServiceProviderExtensionsTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/Entities.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs | 2 +- .../JavaScriptStringEncoderTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs | 2 +- .../UnicodeEncoderBaseTests.cs | 2 +- .../UnicodeHelpersTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs | 2 +- .../Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs | 2 +- test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs | 2 +- .../CacheControlHeaderValueTest.cs | 2 +- .../ContentDispositionHeaderValueTest.cs | 2 +- .../ContentRangeHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs | 2 +- .../EntityTagHeaderValueTest.cs | 2 +- .../MediaTypeHeaderValueComparerTests.cs | 2 +- .../MediaTypeHeaderValueTest.cs | 2 +- .../NameValueHeaderValueTest.cs | 2 +- .../RangeConditionHeaderValueTest.cs | 2 +- test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs | 2 +- .../RangeItemHeaderValueTest.cs | 2 +- .../SetCookieHeaderValueTest.cs | 2 +- .../StringWithQualityHeaderValueComparerTest.cs | 2 +- .../StringWithQualityHeaderValueTest.cs | 2 +- 238 files changed, 238 insertions(+), 238 deletions(-) diff --git a/LICENSE.txt b/LICENSE.txt index d85a1524ad..0bdc1962b6 100644 --- a/LICENSE.txt +++ b/LICENSE.txt @@ -1,4 +1,4 @@ -Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +Copyright (c) .NET Foundation. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use these files except in compliance with the License. You may obtain a copy of the diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 28e01101ff..7c4a0e0017 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs index 40e873e2e3..bc6bc2b2d6 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs index a6c5c2da9d..e4b26818d1 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs index 9488cd52c4..28060a24e2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs index 97ca3fe18e..0ee24024e5 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index f7b4342b59..331c4c8fe1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs index f6574163c7..ab17713ab0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs index 0587fde7ca..2d14071ebc 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs index 9dab37f844..d2785db947 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 3a53395fda..8885632152 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index 5e2d8891b7..569938516d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs index f3c85a1086..d0453902f4 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs index 30564a114b..e3ac00274f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs index ab0e2d3dbf..09024a11db 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs index 86967a2c70..dead7f4de8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index ad103c3d1e..b87b2797e3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs index 4be750be47..b5741c310e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 32b4ba6f52..3e5544407b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index 55fdb988ec..15af914718 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 14646bf069..0ad675693c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 5252c8649f..80caec4502 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 4721f9a4b4..a3317f873d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs index 1035c1aaaa..896a6a11b4 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index 79e11d5a5c..77fa4f20e1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 4ec7437877..3781736c58 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index a77a495d5e..e85ee75f7f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs index 56f1d5879d..236614815e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index e1304b5e5f..b10101cb3d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs index 8f18b618ba..589b758895 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs index 53b1d3da60..fb2528dc36 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs index 5dd3029c78..a446704d33 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index cff6e1d3c6..7bc00e6ab1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 48d68b292a..068782cdae 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs index b590996e17..c4c2f8d94e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs index cf7fd11f63..b1dd679ef0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index 358be0ad3a..e83402f101 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index db8eb01b76..69f94e984e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index 98550eb832..fa23ebeced 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index fb10af0bab..ac9e542575 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 3f4103ab83..94e1270c9d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 029ce3d4be..bad90b7cf8 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs index 6a94e0f20c..fbdbd02e40 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index e271d41380..5223071dce 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs index 6425c20dc2..9d98b85e6f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index e76a501d73..e5d6fa8cb8 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index e1b6bf8c04..30483c1325 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs index 38daa0a856..a8d8523310 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs index 04a7039a80..f026bcbbc4 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs index fb14959790..90733cc815 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index d5d74c3186..68ca854a2c 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index 27a7d2941b..55a7e32de3 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs index 1ce5e33dd0..806aa3588b 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs index bf3a370357..6a2b643b08 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index 0e85c3e60a..4a77d6f9c2 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs index bd7a6012a3..825ace8bed 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index 921e70700e..bd74d2f7ff 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs index c5b3ddceec..a8957def8b 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs index 0d6a0bd33a..9a68578ed1 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs index eb64b4bea9..fc59321032 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net.WebSockets; diff --git a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs index e7fe2c20f6..f9fd6027ac 100644 --- a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs index cc8e6cd886..8227616234 100644 --- a/src/Microsoft.AspNet.Http.Features/ISession.cs +++ b/src/Microsoft.AspNet.Http.Features/ISession.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs index ece1363017..a026a2446f 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs index 3173f44e3d..bc97c7d175 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs index fdac0526e2..751a046461 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; diff --git a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs index 111f6ec8fc..7115b2ef33 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs index 210ec0c2b0..9ee15c929f 100644 --- a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index 3a284eb52a..e400adae49 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index f4d086b63d..863974c0fb 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs index 0a56cf4eaf..087da8544d 100644 --- a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 37c93d8392..3f95a169ad 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs index fed0bb1b1c..a15e109093 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs index 2844d1c60d..df4175f312 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs index ffff7d724f..0cbe3e4ef3 100644 --- a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs index ead480bdf1..ac0e574af2 100644 --- a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; diff --git a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs index 4977d04e08..cc4fe12d27 100644 --- a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; diff --git a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs index 0610faa880..859a63b3ee 100644 --- a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs index 1636d4e739..d98decdb5a 100644 --- a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs index d2147c6c4b..c47095d3c5 100644 --- a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index feae42f1f4..b512c2a2eb 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 65365e98b8..cf9c3334c7 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 8f2a20e55c..319d88ff26 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 026ce3b2f1..34ed6004a3 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index c1845c66e5..2fa8272dbc 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/FormFeature.cs b/src/Microsoft.AspNet.Http/FormFeature.cs index a8c490100f..a32e192504 100644 --- a/src/Microsoft.AspNet.Http/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/FormFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/FormFile.cs b/src/Microsoft.AspNet.Http/FormFile.cs index 25e1081b2a..d02ed1a7a0 100644 --- a/src/Microsoft.AspNet.Http/FormFile.cs +++ b/src/Microsoft.AspNet.Http/FormFile.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs index 8f1a7c0123..a5364d2acd 100644 --- a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Net; diff --git a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs index e17746cc7d..fcb4054d37 100644 --- a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpRequestFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs index f0b9c7faeb..26e19b3a99 100644 --- a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/HttpResponseFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/IFormFeature.cs b/src/Microsoft.AspNet.Http/IFormFeature.cs index 0f8e97eb67..6b275ecf83 100644 --- a/src/Microsoft.AspNet.Http/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http/IFormFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; diff --git a/src/Microsoft.AspNet.Http/IItemsFeature.cs b/src/Microsoft.AspNet.Http/IItemsFeature.cs index 876580ef79..d37b2a9057 100644 --- a/src/Microsoft.AspNet.Http/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/IItemsFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/IQueryFeature.cs b/src/Microsoft.AspNet.Http/IQueryFeature.cs index 086e9f189b..7f6716f629 100644 --- a/src/Microsoft.AspNet.Http/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/IQueryFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs index 5ba34bb9a0..2b4f6b5eee 100644 --- a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs index b10b1c40c9..f2ef604430 100644 --- a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs index d2bb79b6c8..46b223c558 100644 --- a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs index 67c3aecb76..00a2065274 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http.Infrastructure diff --git a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs index cea473a4ef..835d2b95f7 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs index 549bf51777..c8a7c745db 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/ItemsFeature.cs b/src/Microsoft.AspNet.Http/ItemsFeature.cs index bb9d94ae15..5d278c2291 100644 --- a/src/Microsoft.AspNet.Http/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/ItemsFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Http/QueryFeature.cs b/src/Microsoft.AspNet.Http/QueryFeature.cs index 34643cf128..faf7612480 100644 --- a/src/Microsoft.AspNet.Http/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/QueryFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 5030e59ef3..7d78b72847 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs index eb5e95ec79..9796357057 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs index 651beded8d..38d7cfa615 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs index 8a8c4b1551..95f22d90cc 100644 --- a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs index bf22639161..220c015540 100644 --- a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Cryptography.X509Certificates; diff --git a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs index 53e61267e0..f5eabc9992 100644 --- a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 98ed1c42bd..47761c96c2 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Owin diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index f35bedcd34..e664c9f080 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs index 1675852e5f..9fae247f6b 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index cfb647d88a..3ade1d3d1c 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 0c270bfc3a..823e98bbea 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index ba3a4d4180..fd3c69033f 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Security.Claims; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 50448cd560..2cb8b74c8d 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 45cacf76ab..fd77da5841 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs index d77fd57295..bdaeef8eda 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index 71efc5490b..d175e49fa5 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 9577785639..8102528ae4 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 2ffc33ad46..0b3ec59363 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 26fba82548..b6df361dc4 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index dd11b0cff2..0f9900432c 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index 286f2a8a6f..9fb4b2b61f 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index d9966ffd48..244117e34c 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index bb8e07c25e..02d99a33d4 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index b35bcfee2a..5618b826fb 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 8266dc4fb5..95750a3753 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs index 487437d6a3..93270c5fb2 100644 --- a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs index 959d9593d9..70d515f264 100644 --- a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs +++ b/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.WebUtilities diff --git a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs index c5a2432db6..a865976274 100644 --- a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs +++ b/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index de801b29d4..bef8b5463a 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs index 3ad3312ae9..5d396a473a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs index da5991e7e2..a5d5b21c3a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs index 5bb405240a..3ec108fff2 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs index e8ed2cdcf1..df01877f6d 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs index c9f57a59a9..7d2b81a8fe 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs index e4b512d1a5..a2a350b9a9 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs index b176b66346..68b492f55a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs index 1a4fc58774..f39c3580f8 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs index 4a24158263..16e4ff5f05 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs index 99f011ff9a..e88aafce79 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs index 2b4a8cbd57..9b38b6a65e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs index 189d9ac08f..71e8a68246 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs index 694179e207..c09b9bdbba 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs index 6a382b8a4d..1588ec0e19 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs index 2aa3dac0e0..61367e2d03 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs index 04474ef759..78a3c41a2f 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs index ccfac4b876..60ed2c5311 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs index d5aced410b..6a3c5ebabf 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index d347345303..0e0de56c7a 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs index a172ca954c..0e06693f3c 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 3d0851e9d4..7b855f6038 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs index 679394e42d..dbd18b82d6 100644 --- a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 1de23f206f..48dfc913a9 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 8a96da2efd..b6b1aabe8c 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index 53fd996b9f..634278e3a9 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs index 3c2e9635f3..2143f299b0 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Diagnostics.Contracts; diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index a7911d164f..11c5500a31 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index af10ff345e..4cc5c38dfa 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index 5796d89fae..669ec464de 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.Framework.Internal; diff --git a/src/Microsoft.Net.Http.Headers/HeaderNames.cs b/src/Microsoft.Net.Http.Headers/HeaderNames.cs index d7f83090b8..7f6432c363 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderNames.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderNames.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs index c5247e1aca..da86450726 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderQuality.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderQuality.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index aaf2d57470..d344d992aa 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index af19f3421c..2c05296a98 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs index 76713cf1cc..709ae0ce84 100644 --- a/src/Microsoft.Net.Http.Headers/HttpParseResult.cs +++ b/src/Microsoft.Net.Http.Headers/HttpParseResult.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.Net.Http.Headers diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 66f6361da7..188ffe1389 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 1fa7535452..4113f44598 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs index 0125b2dbc4..a64b12e6b0 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index fc943f7822..668a4ccef4 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index f6746df140..6ec2883d3b 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index f5c6f4a83a..025a94598c 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs index 65f976a21c..189d775d61 100644 --- a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs index 3045a8b387..445752a13d 100644 --- a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index 21c46f004c..f4893ba5dc 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 568f204fa7..b470471e4e 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index 41cacc9380..e845c84fe8 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 982a97b131..37873c476c 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs index c82223ad06..fca3041bb8 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs index 9309814aa7..27d2f565a2 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs index 604b34761c..898c5f8fe7 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs index e064589fdc..217833d5af 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.FeatureModel.Tests diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 2388da9973..51224bc8ef 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index a54a89d09e..aa0a6d5ac7 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 29b6eac3ff..d0cd1eacb3 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs index 720b3b0814..245ce693e2 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Testing; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index 4495cbb364..c96508a4ea 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs index 2f52599c83..4ff9cb103f 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index 07b6ed7163..c123db4b09 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. +// Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. using System; using System.Threading; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs index 0fa5e071cc..c6fd4207ca 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 21c1bd640d..7c28c99174 100644 --- a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http; diff --git a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs index 7f35d274db..a618da3cfb 100644 --- a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index ea887b711b..ea8699ee43 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 69c0ea85e8..9ddb91d9d5 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 270c364301..e26a4f0222 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 02082c9ec3..1e40ae0e8a 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 4a53e6205b..74b7cd37b0 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 68f7d7a103..95c1d7fd81 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index f86ce513dc..eb05bd0dc5 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs index 2dd618cdf1..397d279b5e 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index e90c78305a..807e99f6ac 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs index 9813a780c3..efc17118fc 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs index e26046b239..faf6d4c982 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs index d8de51865d..64e517a6f0 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs index 5e3e9f3817..debec372ac 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs index 8c5cfd83ac..5b7797340f 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index b8ddbef391..f45951277e 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index 3a6b144b29..9d44a41697 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs index e46df90876..e10ff951b0 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs index 4c9ec94198..14d0f21e9d 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs index ee0c3231d9..471ea4f385 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs index dbb9f91e68..4acee36980 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs index b8c36b57ad..e7bf1f49a6 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index 07944d7c35..e6661686c0 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 4d34a40e96..7504d52125 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs index cb3197ae71..fd64048673 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs index ac9e55bdac..c56b57feb8 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs index 0d37e4f934..54ad81839e 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs index 0ac0fe3d2c..51e8ce5f58 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CacheControlHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index da906e8171..02e233a53d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs index d479f4d46f..d8abdbdbf6 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentRangeHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs index 9a25389a50..f649cce09e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs index 61479e9adf..0fffc0c134 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/DateParserTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs index d94ce6409f..303b910fcb 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/EntityTagHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs index 8ef17a55aa..44d723cd9e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueComparerTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 140d629497..5c73d9b607 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 3ae04a9212..3d342dea9b 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs index 14a65efdd2..1f69a9605e 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs index 22dc5dc749..92a1d72521 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs index 573ae8964e..b8818752ac 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeItemHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index ee3e12292b..e21fb4e089 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs index df4e729493..8cda48eef3 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueComparerTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; diff --git a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs index 0a57c61958..ceb29fed10 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/StringWithQualityHeaderValueTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; From 568d0d91063e86ae19a92bdd098d6fffe7d0c071 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 30 Apr 2015 15:18:24 -0700 Subject: [PATCH 0599/1838] #275 Reduce UriHelper to static methods. --- .../ResponseHeaders.cs | 6 +- .../UriHelper.cs | 135 +++++++----------- 2 files changed, 51 insertions(+), 90 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 94e1270c9d..8b8607a2b7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -126,20 +126,20 @@ namespace Microsoft.AspNet.Http.Headers } } - public UriHelper Location + public Uri Location { get { Uri uri; if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) { - return new UriHelper(uri); + return uri; } return null; } set { - Headers.Set(HeaderNames.Location, value); + Headers.Set(HeaderNames.Location, value == null ? null : UriHelper.Encode(value)); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 5223071dce..33f589cb44 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -8,107 +8,68 @@ namespace Microsoft.AspNet.Http.Extensions /// /// A helper class for constructing encoded Uris for use in headers and other Uris. /// - public class UriHelper + public static class UriHelper { - public UriHelper() - { - } - - public UriHelper(HttpRequest request) - { - Scheme = request.Scheme; - Host = request.Host; - PathBase = request.PathBase; - Path = request.Path; - Query = request.QueryString; - // Fragment is not a valid request field. - } - - public UriHelper(Uri uri) - { - Scheme = uri.Scheme; - Host = HostString.FromUriComponent(uri); - // Assume nothing is being put in PathBase - Path = PathString.FromUriComponent(uri); - Query = QueryString.FromUriComponent(uri); - Fragment = FragmentString.FromUriComponent(uri); - } - - public string Scheme { get; set; } - - public HostString Host { get; set; } - - public PathString PathBase { get; set; } - - public PathString Path { get; set; } - - public QueryString Query { get; set; } - - public FragmentString Fragment { get; set; } - - public bool IsFullUri - { - get { return !string.IsNullOrEmpty(Scheme) && Host.HasValue; } - } - - // Always returns at least '/' - public string GetPartialUri() - { - string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; - return path + Query + Fragment; - } - - // Always returns at least 'scheme://host/' - public string GetFullUri() - { - if (string.IsNullOrEmpty(Scheme)) - { - throw new InvalidOperationException("Missing Scheme"); - } - if (!Host.HasValue) - { - throw new InvalidOperationException("Missing Host"); - } - - string path = (PathBase.HasValue || Path.HasValue) ? (PathBase + Path).ToString() : "/"; - return Scheme + "://" + Host + path + Query + Fragment; - } - - public override string ToString() - { - return IsFullUri ? GetFullUri() : GetPartialUri(); - } - - public static string Create(PathString pathBase, + /// + /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. + /// + /// + /// + /// + /// + /// + public static string Encode(PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - return new UriHelper() - { - PathBase = pathBase, - Path = path, - Query = query, - Fragment = fragment - }.GetPartialUri(); + string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + return combinePath + query + fragment; } - public static string Create(string scheme, + /// + /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. + /// Note that unicode in the HostString will be encoded as punycode. + /// + /// + /// + /// + /// + /// + /// + /// + public static string Encode(string scheme, HostString host, PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - return new UriHelper() + string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + return scheme + "://" + host + combinePath + query + fragment; + } + + /// + /// Generates a string from the given absolute or relative Uri that is appropriately encoded for use in + /// HTTP headers. Note that a unicode host name will be encoded as punycode. + /// + /// + /// + public static string Encode(Uri uri) + { + if (uri.IsAbsoluteUri) { - Scheme = scheme, - Host = host, - PathBase = pathBase, - Path = path, - Query = query, - Fragment = fragment - }.GetFullUri(); + return Encode( + scheme: uri.Scheme, + host: HostString.FromUriComponent(uri), + pathBase: PathString.FromUriComponent(uri), + query: QueryString.FromUriComponent(uri), + fragment: FragmentString.FromUriComponent(uri)); + } + else + { + return uri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped); + } } } } \ No newline at end of file From c9c09fb4e51ad193db2c510e4feb80b03194bf3d Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 6 May 2015 10:55:20 -0700 Subject: [PATCH 0600/1838] #269 Clean up QueryString APIs, add tests. --- .../QueryString.cs | 78 ++++++++++-- .../QueryStringTests.cs | 111 ++++++++++++++++++ 2 files changed, 179 insertions(+), 10 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 068782cdae..6d156bc7ee 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; +using System.Text; using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; @@ -33,16 +35,6 @@ namespace Microsoft.AspNet.Http _value = value; } - /// - /// Initialize a query string with a single given parameter name and value. - /// - /// The un-encoded parameter name - /// The un-encoded parameter value - public QueryString(string name, string value) - { - _value = "?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value); - } - /// /// The escaped query string with the leading '?' character /// @@ -114,6 +106,67 @@ namespace Microsoft.AspNet.Http return new QueryString(queryValue); } + /// + /// Create a query string with a single given parameter name and value. + /// + /// The un-encoded parameter name + /// The un-encoded parameter value + public static QueryString Create(string name, string value) + { + return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value)); + } + + /// + /// Creates a query string composed from the given name value pairs. + /// + /// + /// + public static QueryString Create(IEnumerable> parameters) + { + var builder = new StringBuilder(); + bool first = true; + foreach (var pair in parameters) + { + builder.Append(first ? "?" : "&"); + first = false; + builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append("="); + builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); + } + + return new QueryString(builder.ToString()); + } + + public QueryString Add(QueryString other) + { + if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) + { + return other; + } + if (!other.HasValue || other.Value.Equals("?", StringComparison.Ordinal)) + { + return this; + } + + // ?name1=value1 Add ?name2=value2 returns ?name1=value1&name2=value2 + return new QueryString(_value + "&" + other.Value.Substring(1)); + } + + public QueryString Add(string name, string value) + { + if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) + { + return Create(name, value); + } + + var builder = new StringBuilder(Value); + builder.Append("&"); + builder.Append(UrlEncoder.Default.UrlEncode(name)); + builder.Append("="); + builder.Append(UrlEncoder.Default.UrlEncode(value)); + return new QueryString(builder.ToString()); + } + public bool Equals(QueryString other) { return string.Equals(_value, other._value); @@ -142,5 +195,10 @@ namespace Microsoft.AspNet.Http { return !left.Equals(right); } + + public static QueryString operator +(QueryString left, QueryString right) + { + return left.Add(right); + } } } diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs new file mode 100644 index 0000000000..f36b8eeefc --- /dev/null +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs @@ -0,0 +1,111 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Testing; +using Xunit; + +namespace Microsoft.AspNet.Http.Abstractions +{ + public class QueryStringTests + { + [Fact] + public void CtorThrows_IfQueryDoesNotHaveLeadingQuestionMark() + { + // Act and Assert + ExceptionAssert.ThrowsArgument(() => new QueryString("hello"), "value", "The leading '?' must be included for a non-empty query."); + } + + [Fact] + public void CtorNullOrEmpty_Success() + { + var query = new QueryString(); + Assert.False(query.HasValue); + Assert.Null(query.Value); + + query = new QueryString(null); + Assert.False(query.HasValue); + Assert.Null(query.Value); + + query = new QueryString(string.Empty); + Assert.False(query.HasValue); + Assert.Equal(string.Empty, query.Value); + } + + [Fact] + public void CtorJustAQuestionMark_Success() + { + var query = new QueryString("?"); + Assert.True(query.HasValue); + Assert.Equal("?", query.Value); + } + + [Fact] + public void ToString_EncodesHash() + { + var query = new QueryString("?Hello=Wor#ld"); + Assert.Equal("?Hello=Wor%23ld", query.ToString()); + } + + [Theory] + [InlineData("name", "value", "?name=value")] + [InlineData("na me", "val ue", "?na%20me=val%20ue")] + [InlineData("name", "", "?name=")] + [InlineData("", "value", "?=value")] + [InlineData("", "", "?=")] + [InlineData(null, null, "?=")] + public void CreateNameValue_Success(string name, string value, string exepcted) + { + var query = QueryString.Create(name, value); + Assert.Equal(exepcted, query.Value); + } + + [Fact] + public void CreateFromList_Success() + { + var query = QueryString.Create(new[] + { + new KeyValuePair("key1", "value1"), + new KeyValuePair("key2", "value2"), + new KeyValuePair("key3", "value3"), + }); + Assert.Equal("?key1=value1&key2=value2&key3=value3", query.Value); + } + + [Theory] + [InlineData(null, null, null)] + [InlineData("", "", "")] + [InlineData(null, "?name2=value2", "?name2=value2")] + [InlineData("", "?name2=value2", "?name2=value2")] + [InlineData("?", "?name2=value2", "?name2=value2")] + [InlineData("?name1=value1", null, "?name1=value1")] + [InlineData("?name1=value1", "", "?name1=value1")] + [InlineData("?name1=value1", "?", "?name1=value1")] + [InlineData("?name1=value1", "?name2=value2", "?name1=value1&name2=value2")] + public void AddQueryString_Success(string query1, string query2, string expected) + { + var q1 = new QueryString(query1); + var q2 = new QueryString(query2); + Assert.Equal(expected, q1.Add(q2).Value); + Assert.Equal(expected, (q1 + q2).Value); + } + + [Theory] + [InlineData(null, null, null, "?=")] + [InlineData("", "", "", "?=")] + [InlineData("?", "", "", "?=")] + [InlineData("?", "name2", "value2", "?name2=value2")] + [InlineData("?name1=value1", "name2", "value2", "?name1=value1&name2=value2")] + [InlineData("?name1=value1", "na me2", "val ue2", "?name1=value1&na%20me2=val%20ue2")] + [InlineData("?name1=value1", "", "", "?name1=value1&=")] + public void AddNameValue_Success(string query1, string name2, string value2, string expected) + { + var q1 = new QueryString(query1); + var q2 = q1.Add(name2, value2); + Assert.Equal(expected, q2.Value); + } + } +} From ef9dde7d7c669cc74cd12da16c710c51ce793be8 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 7 May 2015 09:37:39 -0700 Subject: [PATCH 0601/1838] React to common package name change --- src/Microsoft.AspNet.Hosting.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index bfb6a183f1..adca748265 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": {}, diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 2450ba27c8..a84b1bc227 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -12,7 +12,7 @@ "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, "frameworks": { From f7f4d490aa8ddb51ebd5abe6164ea9f797a9a231 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 7 May 2015 09:37:58 -0700 Subject: [PATCH 0602/1838] React to common package name change --- src/Microsoft.AspNet.FeatureModel/project.json | 2 +- src/Microsoft.AspNet.Http.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Http.Extensions/project.json | 2 +- src/Microsoft.AspNet.Http.Features/project.json | 2 +- src/Microsoft.AspNet.Http/project.json | 2 +- src/Microsoft.AspNet.Owin/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- src/Microsoft.Framework.WebEncoders.Core/project.json | 2 +- src/Microsoft.Framework.WebEncoders/project.json | 2 +- src/Microsoft.Net.Http.Headers/project.json | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index 1d28c1258f..e744e62052 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": {}, diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 4f562544c9..a70ce73541 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1c0b74dcab..fde16b0159 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,7 +5,7 @@ "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index d4d113923c..9a441ab4dc 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 0188f4ff3d..3334f37142 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,7 @@ "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 2fa0fca43b..5363dfdbdd 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 component for running OWIN middleware.", "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index d47cde29be..b3fb9c1ef6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index 5b43df9eb3..dc8f3406f5 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -5,7 +5,7 @@ "allowUnsafe": true }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks": { "net45": { }, diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index e39ec75adc..37e882873a 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -4,7 +4,7 @@ "dependencies": { "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 07da653d6f..15f82024e2 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,7 +1,7 @@ { "version": "1.0.0-*", "dependencies": { - "Microsoft.Framework.NotNullAttribute.Internal": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, "frameworks" : { "net45" : { }, From 018b4c24263ec70fd200a84ae7d0106576c78606 Mon Sep 17 00:00:00 2001 From: Hisham Abdullah Bin Ateya Date: Thu, 7 May 2015 16:15:17 +0300 Subject: [PATCH 0603/1838] Using 'nameof' operator instead of magic strings --- src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs | 2 +- .../Common/DeploymentParameters.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index 7a06dfa70f..0327ae6a31 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Hosting.Server { if (string.IsNullOrEmpty(serverFactoryIdentifier)) { - throw new ArgumentException(string.Empty, "serverFactoryIdentifier"); + throw new ArgumentException(string.Empty, nameof(serverFactoryIdentifier)); } var nameParts = HostingUtilities.SplitTypeName(serverFactoryIdentifier); diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs index aa1a0d87a7..86d29d9b2b 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Server.Testing { if (string.IsNullOrEmpty(applicationPath)) { - throw new ArgumentException("Value cannot be null.", "applicationPath"); + throw new ArgumentException("Value cannot be null.", nameof(applicationPath)); } if (!Directory.Exists(applicationPath)) From 4852bf0c528fb84ba50602ad52dd64342b35eb6f Mon Sep 17 00:00:00 2001 From: Hisham Abdullah Bin Ateya Date: Thu, 7 May 2015 16:19:38 +0300 Subject: [PATCH 0604/1838] Using [NotNull] --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 15 +++------------ src/Microsoft.AspNet.TestHost/RequestBuilder.cs | 15 +++------------ src/Microsoft.AspNet.TestHost/ResponseStream.cs | 7 ++----- src/Microsoft.AspNet.TestHost/project.json | 3 ++- 4 files changed, 10 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 78afb19a28..add6bf48be 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -12,6 +12,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -28,13 +29,8 @@ namespace Microsoft.AspNet.TestHost /// Create a new handler. /// /// The pipeline entry point. - public ClientHandler(Func next, PathString pathBase) + public ClientHandler([NotNull] Func next, PathString pathBase) { - if (next == null) - { - throw new ArgumentNullException("next"); - } - _next = next; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. @@ -53,14 +49,9 @@ namespace Microsoft.AspNet.TestHost /// /// protected override async Task SendAsync( - HttpRequestMessage request, + [NotNull] HttpRequestMessage request, CancellationToken cancellationToken) { - if (request == null) - { - throw new ArgumentNullException("request"); - } - var state = new RequestState(request, _pathBase, cancellationToken); var requestContent = request.Content ?? new StreamContent(Stream.Null); var body = await requestContent.ReadAsStreamAsync(); diff --git a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs index 77344da496..3de390f63a 100644 --- a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs +++ b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs @@ -7,6 +7,7 @@ using System.Globalization; using System.IO; using System.Net.Http; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -26,13 +27,8 @@ namespace Microsoft.AspNet.TestHost /// /// [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings", Justification = "Not a full URI")] - public RequestBuilder(TestServer server, string path) + public RequestBuilder([NotNull] TestServer server, string path) { - if (server == null) - { - throw new ArgumentNullException("server"); - } - _server = server; _req = new HttpRequestMessage(HttpMethod.Get, path); } @@ -42,13 +38,8 @@ namespace Microsoft.AspNet.TestHost /// /// /// - public RequestBuilder And(Action configure) + public RequestBuilder And([NotNull] Action configure) { - if (configure == null) - { - throw new ArgumentNullException("configure"); - } - configure(_req); return this; } diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index 5946117ab2..42a8a419c5 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -8,6 +8,7 @@ using System.Diagnostics.Contracts; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -28,12 +29,8 @@ namespace Microsoft.AspNet.TestHost private Action _onFirstWrite; private bool _firstWrite; - internal ResponseStream(Action onFirstWrite) + internal ResponseStream([NotNull] Action onFirstWrite) { - if (onFirstWrite == null) - { - throw new ArgumentNullException("onFirstWrite"); - } _onFirstWrite = onFirstWrite; _firstWrite = true; diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 28acab776a..c32b8f617b 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -2,7 +2,8 @@ "version": "1.0.0-*", "description": "ASP.NET 5 web server for writing and running tests.", "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*" + "Microsoft.AspNet.Hosting": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Internal": { "version": "1.0.0-*", "type": "build" } }, "frameworks": { "dnx451": { From 550b2252ea4f5d44844f6988db05c1aaeed86b35 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 6 May 2015 15:31:16 -0700 Subject: [PATCH 0605/1838] #265 Remove Use extensions that take services. --- .../Extensions/UseExtensions.cs | 120 --------------- .../UseWithServicesTests.cs | 138 ------------------ 2 files changed, 258 deletions(-) delete mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs index b5741c310e..1a14048128 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs @@ -26,125 +26,5 @@ namespace Microsoft.AspNet.Builder }; }); } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider)); - }); - } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider)); - }); - } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// Per-request service required by middleware - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider)); - }); - } - - /// - /// Use middleware defined in-line - /// - /// Per-request service required by middleware - /// Per-request service required by middleware - /// Per-request service required by middleware - /// Per-request service required by middleware - /// - /// A function that handles the request or calls the given next function. - /// - public static IApplicationBuilder Use(this IApplicationBuilder app, Func, TService1, TService2, TService3, TService4, Task> middleware) - { - var applicationServices = app.ApplicationServices; - return app.Use(next => context => - { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; - if (serviceProvider == null) - { - throw new Exception("TODO: IServiceProvider is not available"); - } - return middleware( - context, - () => next(context), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider), - GetRequiredService(serviceProvider)); - }); - } - - private static TService GetRequiredService(IServiceProvider serviceProvider) - { - var service = (TService)serviceProvider.GetService(typeof(TService)); - - if (service == null) - { - throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", typeof(TService))); - } - - return service; - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs deleted file mode 100644 index c6fd4207ca..0000000000 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/UseWithServicesTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; -using Xunit; - -namespace Microsoft.AspNet.Http.Extensions.Tests -{ - public class UseWithServicesTests - { - [Fact] - public async Task CallingUseThatAlsoTakesServices() - { - var builder = new ApplicationBuilder(new ServiceCollection() - .AddScoped() - .BuildServiceProvider()); - - ITestService theService = null; - builder.Use(async (ctx, next, testService) => - { - theService = testService; - await next(); - }); - - var app = builder.Build(); - await app(new DefaultHttpContext()); - - Assert.IsType(theService); - } - - [Fact] - public async Task ServicesArePerRequest() - { - var services = new ServiceCollection() - .AddScoped() - .BuildServiceProvider(); - var builder = new ApplicationBuilder(services); - - builder.Use(async (ctx, next) => - { - var serviceScopeFactory = services.GetRequiredService(); - using (var serviceScope = serviceScopeFactory.CreateScope()) - { - var priorApplicationServices = ctx.ApplicationServices; - var priorRequestServices = ctx.ApplicationServices; - ctx.ApplicationServices = services; - ctx.RequestServices = serviceScope.ServiceProvider; - try - { - await next(); - } - finally - { - ctx.ApplicationServices = priorApplicationServices; - ctx.RequestServices = priorRequestServices; - } - } - }); - - var testServicesA = new List(); - builder.Use(async (HttpContext ctx, Func next, ITestService testService) => - { - testServicesA.Add(testService); - await next(); - }); - - var testServicesB = new List(); - builder.Use(async (ctx, next, testService) => - { - testServicesB.Add(testService); - await next(); - }); - - var app = builder.Build(); - await app(new DefaultHttpContext()); - await app(new DefaultHttpContext()); - - Assert.Equal(2, testServicesA.Count); - Assert.IsType(testServicesA[0]); - Assert.IsType(testServicesA[1]); - - Assert.Equal(2, testServicesB.Count); - Assert.IsType(testServicesB[0]); - Assert.IsType(testServicesB[1]); - - Assert.Same(testServicesA[0], testServicesB[0]); - Assert.Same(testServicesA[1], testServicesB[1]); - - Assert.NotSame(testServicesA[0], testServicesA[1]); - Assert.NotSame(testServicesB[0], testServicesB[1]); - } - - [Fact] - public async Task InvokeMethodWillAllowPerRequestServices() - { - var services = new ServiceCollection() - .AddScoped() - .BuildServiceProvider(); - var builder = new ApplicationBuilder(services); - builder.UseMiddleware(); - var app = builder.Build(); - - var ctx1 = new DefaultHttpContext(); - await app(ctx1); - - var testService = ctx1.Items[typeof(ITestService)]; - Assert.IsType(testService); - } - } - - public interface ITestService - { - } - - public class TestService : ITestService - { - } - - public class TestMiddleware - { - RequestDelegate _next; - - public TestMiddleware(RequestDelegate next) - { - _next = next; - } - - public Task Invoke(HttpContext context, ITestService testService) - { - context.Items[typeof(ITestService)] = testService; - return Task.FromResult(0); - } - } -} \ No newline at end of file From eb0fe6a92ada31440e6db44d23b64f4d3d7240c0 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 6 May 2015 16:24:50 -0700 Subject: [PATCH 0606/1838] #281 Reorganise files, namespaces for internal and features. --- .../FeatureReference.cs | 6 ++---- .../{ => Extensions}/HttpResponseWritingExtensions.cs | 0 .../IFormCollection.cs | 2 -- .../SendFileResponseExtensions.cs | 1 + .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/IAuthenticationHandler.cs | 2 +- .../Authentication/IHttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- .../IHttpBufferingFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- .../IHttpSendFileFeature.cs | 2 +- .../IHttpUpgradeFeature.cs | 2 +- .../IHttpWebSocketFeature.cs | 2 +- .../IRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISession.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFactory.cs | 2 +- src/Microsoft.AspNet.Http.Features/ISessionFeature.cs | 2 +- .../ITlsConnectionFeature.cs | 2 +- .../ITlsTokenBindingFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 2 +- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 4 ++-- .../Authentication/DefaultAuthenticationManager.cs | 6 ++++-- src/Microsoft.AspNet.Http/BufferingHelper.cs | 2 +- .../{Infrastructure => }/Constants.cs | 2 +- src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 5 +++-- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 9 ++++++--- src/Microsoft.AspNet.Http/DefaultHttpRequest.cs | 6 +++--- src/Microsoft.AspNet.Http/DefaultHttpResponse.cs | 6 +++--- src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs | 4 ++-- .../Authentication/HttpAuthenticationFeature.cs | 2 +- src/Microsoft.AspNet.Http/{ => Features}/FormFeature.cs | 4 ++-- src/Microsoft.AspNet.Http/{ => Features}/FormFile.cs | 3 ++- .../{ => Features}/HttpConnectionFeature.cs | 2 +- .../{ => Features}/HttpRequestFeature.cs | 2 +- .../{ => Features}/HttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http/{ => Features}/IFormFeature.cs | 2 +- .../{ => Features}/IItemsFeature.cs | 2 +- .../{ => Features}/IQueryFeature.cs | 2 +- .../{ => Features}/IRequestCookiesFeature.cs | 2 +- .../{ => Features}/IResponseCookiesFeature.cs | 2 +- .../{ => Features}/IServiceProvidersFeature.cs | 2 +- src/Microsoft.AspNet.Http/{ => Features}/ItemsFeature.cs | 3 ++- src/Microsoft.AspNet.Http/{ => Features}/QueryFeature.cs | 5 ++--- .../{ => Features}/RequestCookiesFeature.cs | 5 ++--- .../{ => Features}/ResponseCookiesFeature.cs | 5 ++--- .../{ => Features}/ServiceProvidersFeature.cs | 2 +- .../{ => Features}/TlsConnectionFeature.cs | 2 +- .../{Collections => }/FormCollection.cs | 2 +- .../{Collections => }/FormFileCollection.cs | 2 +- .../{Collections => }/HeaderDictionary.cs | 4 ++-- .../{Collections => }/ItemsDictionary.cs | 2 +- .../{Infrastructure => }/ParsingHelpers.cs | 2 +- .../{Collections => }/ReadableStringCollection.cs | 2 +- src/Microsoft.AspNet.Http/ReferenceReadStream.cs | 2 +- .../{Collections => }/RequestCookiesCollection.cs | 2 +- .../{Collections => }/ResponseCookies.cs | 2 +- .../{Collections => }/SessionCollection.cs | 3 ++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +++- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 ++ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 6 +++--- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebSockets/OwinWebSocketAcceptContext.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 1 + .../MapPathMiddlewareTests.cs | 2 ++ .../MapPredicateMiddlewareTests.cs | 2 ++ .../HeaderDictionaryTypeExtensionsTest.cs | 2 +- .../SendFileResponseExtensionsTests.cs | 2 ++ .../ApplicationBuilderTests.cs | 2 +- test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs | 2 +- .../DefaultHttpContextTests.cs | 5 +++-- .../DefaultHttpRequestTests.cs | 3 ++- test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs | 4 ++-- .../Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs | 3 +-- test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs | 2 +- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 1 + .../OwinFeatureCollectionTests.cs | 2 +- 83 files changed, 118 insertions(+), 102 deletions(-) rename src/{Microsoft.AspNet.Http/Infrastructure => Microsoft.AspNet.FeatureModel}/FeatureReference.cs (90%) rename src/Microsoft.AspNet.Http.Abstractions/{ => Extensions}/HttpResponseWritingExtensions.cs (100%) rename src/Microsoft.AspNet.Http/{Infrastructure => }/Constants.cs (91%) rename src/Microsoft.AspNet.Http/{ => Features}/Authentication/HttpAuthenticationFeature.cs (89%) rename src/Microsoft.AspNet.Http/{ => Features}/FormFeature.cs (98%) rename src/Microsoft.AspNet.Http/{ => Features}/FormFile.cs (93%) rename src/Microsoft.AspNet.Http/{ => Features}/HttpConnectionFeature.cs (91%) rename src/Microsoft.AspNet.Http/{ => Features}/HttpRequestFeature.cs (95%) rename src/Microsoft.AspNet.Http/{ => Features}/HttpResponseFeature.cs (95%) rename src/Microsoft.AspNet.Http/{ => Features}/IFormFeature.cs (95%) rename src/Microsoft.AspNet.Http/{ => Features}/IItemsFeature.cs (85%) rename src/Microsoft.AspNet.Http/{ => Features}/IQueryFeature.cs (84%) rename src/Microsoft.AspNet.Http/{ => Features}/IRequestCookiesFeature.cs (84%) rename src/Microsoft.AspNet.Http/{ => Features}/IResponseCookiesFeature.cs (84%) rename src/Microsoft.AspNet.Http/{ => Features}/IServiceProvidersFeature.cs (87%) rename src/Microsoft.AspNet.Http/{ => Features}/ItemsFeature.cs (82%) rename src/Microsoft.AspNet.Http/{ => Features}/QueryFeature.cs (93%) rename src/Microsoft.AspNet.Http/{ => Features}/RequestCookiesFeature.cs (94%) rename src/Microsoft.AspNet.Http/{ => Features}/ResponseCookiesFeature.cs (89%) rename src/Microsoft.AspNet.Http/{ => Features}/ServiceProvidersFeature.cs (88%) rename src/Microsoft.AspNet.Http/{ => Features}/TlsConnectionFeature.cs (92%) rename src/Microsoft.AspNet.Http/{Collections => }/FormCollection.cs (94%) rename src/Microsoft.AspNet.Http/{Collections => }/FormFileCollection.cs (96%) rename src/Microsoft.AspNet.Http/{Collections => }/HeaderDictionary.cs (99%) rename src/Microsoft.AspNet.Http/{Collections => }/ItemsDictionary.cs (98%) rename src/Microsoft.AspNet.Http/{Infrastructure => }/ParsingHelpers.cs (99%) rename src/Microsoft.AspNet.Http/{Collections => }/ReadableStringCollection.cs (98%) rename src/Microsoft.AspNet.Http/{Collections => }/RequestCookiesCollection.cs (98%) rename src/Microsoft.AspNet.Http/{Collections => }/ResponseCookies.cs (99%) rename src/Microsoft.AspNet.Http/{Collections => }/SessionCollection.cs (95%) diff --git a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs b/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs similarity index 90% rename from src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs rename to src/Microsoft.AspNet.FeatureModel/FeatureReference.cs index 835d2b95f7..fba03637be 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/FeatureReference.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs @@ -1,11 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; - -namespace Microsoft.AspNet.Http.Infrastructure +namespace Microsoft.AspNet.FeatureModel { - internal struct FeatureReference + public struct FeatureReference { private T _feature; private int _revision; diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 3781736c58..68505962c2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -1,8 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; - namespace Microsoft.AspNet.Http { /// diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index bad90b7cf8..3c5f183c53 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -5,6 +5,7 @@ using System; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNet.Http.Features; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index e5d6fa8cb8..a259ce8489 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class AuthenticateContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index 30483c1325..592086e83c 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class ChallengeContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs index a8d8523310..251d9dfb8c 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class DescribeSchemesContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs index f026bcbbc4..9f551b8bdd 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public interface IAuthenticationHandler { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs index 90733cc815..0c76210a26 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index 68ca854a2c..0eade92638 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class SignInContext { diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index 55a7e32de3..d260afea84 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication { public class SignOutContext { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs index 806aa3588b..947e77782b 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpBufferingFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs index 6a2b643b08..ef76d69815 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index 4a77d6f9c2..c80ca29b5f 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs index 825ace8bed..b30704650e 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index bd74d2f7ff..e93a9d1c03 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs index a8957def8b..328d901903 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpSendFileFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs index 9a68578ed1..77d4ffa501 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs @@ -4,7 +4,7 @@ using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpUpgradeFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs index fc59321032..674161abc1 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs @@ -4,7 +4,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface IHttpWebSocketFeature { diff --git a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs index f9fd6027ac..b34afe8f96 100644 --- a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { /// /// Feature to identify a request. diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs index 8227616234..ba80fc7324 100644 --- a/src/Microsoft.AspNet.Http.Features/ISession.cs +++ b/src/Microsoft.AspNet.Http.Features/ISession.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface ISession { diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs index a026a2446f..441f96eeb5 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface ISessionFactory { diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs index bc97c7d175..bd3a66883e 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { // TODO: Is there any reason not to flatten the Factory down into the Feature? public interface ISessionFeature diff --git a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs index 751a046461..f5d786f8b4 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public interface ITlsConnectionFeature { diff --git a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs index 7115b2ef33..7b8535eb72 100644 --- a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { /// /// Provides information regarding TLS token binding parameters. diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs index 9ee15c929f..df11f93766 100644 --- a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features { public class WebSocketAcceptContext { diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index e400adae49..80041077c3 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNet.Builder.Internal { public class ApplicationBuilder : IApplicationBuilder { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 863974c0fb..9f534a6ada 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -7,10 +7,12 @@ using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager { diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 3f95a169ad..3335203e29 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -6,7 +6,7 @@ using System.IO; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public static class BufferingHelper { diff --git a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs b/src/Microsoft.AspNet.Http/Constants.cs similarity index 91% rename from src/Microsoft.AspNet.Http/Infrastructure/Constants.cs rename to src/Microsoft.AspNet.Http/Constants.cs index 00a2065274..376bb55abd 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/Constants.cs +++ b/src/Microsoft.AspNet.Http/Constants.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Infrastructure +namespace Microsoft.AspNet.Http.Internal { internal static class Constants { diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index b512c2a2eb..5237739aa9 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -6,9 +6,10 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index cf9c3334c7..4c0174e5b1 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -7,10 +7,13 @@ using System.Security.Claims; using System.Threading; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Authentication.Internal; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNet.Http.Features.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContext : HttpContext { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 319d88ff26..f06e2d396e 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -6,11 +6,11 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 34ed6004a3..d264ff97a3 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -4,11 +4,11 @@ using System; using System.IO; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 2fa8272dbc..c329ffe05e 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -6,10 +6,10 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Features; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { diff --git a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs similarity index 89% rename from src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs index 087da8544d..92713e1c87 100644 --- a/src/Microsoft.AspNet.Http/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNet.Http.Features.Authentication.Internal { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNet.Http/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs similarity index 98% rename from src/Microsoft.AspNet.Http/FormFeature.cs rename to src/Microsoft.AspNet.Http/Features/FormFeature.cs index a32e192504..593cd274c4 100644 --- a/src/Microsoft.AspNet.Http/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -7,12 +7,12 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNet.Http/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs similarity index 93% rename from src/Microsoft.AspNet.Http/FormFile.cs rename to src/Microsoft.AspNet.Http/Features/FormFile.cs index d02ed1a7a0..557dc9d518 100644 --- a/src/Microsoft.AspNet.Http/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs similarity index 91% rename from src/Microsoft.AspNet.Http/HttpConnectionFeature.cs rename to src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs index a5364d2acd..9f826d18c0 100644 --- a/src/Microsoft.AspNet.Http/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class HttpConnectionFeature : IHttpConnectionFeature { diff --git a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs similarity index 95% rename from src/Microsoft.AspNet.Http/HttpRequestFeature.cs rename to src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index fcb4054d37..bce7570916 100644 --- a/src/Microsoft.AspNet.Http/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs similarity index 95% rename from src/Microsoft.AspNet.Http/HttpResponseFeature.cs rename to src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 26e19b3a99..500f8e6e5b 100644 --- a/src/Microsoft.AspNet.Http/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNet.Http/IFormFeature.cs b/src/Microsoft.AspNet.Http/Features/IFormFeature.cs similarity index 95% rename from src/Microsoft.AspNet.Http/IFormFeature.cs rename to src/Microsoft.AspNet.Http/Features/IFormFeature.cs index 6b275ecf83..095c14a9e4 100644 --- a/src/Microsoft.AspNet.Http/IFormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IFormFeature { diff --git a/src/Microsoft.AspNet.Http/IItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs similarity index 85% rename from src/Microsoft.AspNet.Http/IItemsFeature.cs rename to src/Microsoft.AspNet.Http/Features/IItemsFeature.cs index d37b2a9057..96b2ce78fe 100644 --- a/src/Microsoft.AspNet.Http/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IItemsFeature { diff --git a/src/Microsoft.AspNet.Http/IQueryFeature.cs b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs similarity index 84% rename from src/Microsoft.AspNet.Http/IQueryFeature.cs rename to src/Microsoft.AspNet.Http/Features/IQueryFeature.cs index 7f6716f629..a1143fb8cd 100644 --- a/src/Microsoft.AspNet.Http/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IQueryFeature { diff --git a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs similarity index 84% rename from src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs index 2b4f6b5eee..6b2f7c742e 100644 --- a/src/Microsoft.AspNet.Http/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs similarity index 84% rename from src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs index f2ef604430..2d47300b79 100644 --- a/src/Microsoft.AspNet.Http/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs similarity index 87% rename from src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs index 46b223c558..b5d192c503 100644 --- a/src/Microsoft.AspNet.Http/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http/ItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs similarity index 82% rename from src/Microsoft.AspNet.Http/ItemsFeature.cs rename to src/Microsoft.AspNet.Http/Features/ItemsFeature.cs index 5d278c2291..fc839357a7 100644 --- a/src/Microsoft.AspNet.Http/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNet.Http/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs similarity index 93% rename from src/Microsoft.AspNet.Http/QueryFeature.cs rename to src/Microsoft.AspNet.Http/Features/QueryFeature.cs index faf7612480..9fb2bd4a4b 100644 --- a/src/Microsoft.AspNet.Http/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -3,12 +3,11 @@ using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs similarity index 94% rename from src/Microsoft.AspNet.Http/RequestCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 9796357057..eed8fc2d95 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -5,12 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs similarity index 89% rename from src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs rename to src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index 38d7cfa615..410fce7a25 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Collections; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs similarity index 88% rename from src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs rename to src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs index 95f22d90cc..d9082df7a2 100644 --- a/src/Microsoft.AspNet.Http/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs b/src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs similarity index 92% rename from src/Microsoft.AspNet.Http/TlsConnectionFeature.cs rename to src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs index 220c015540..9c7d75f483 100644 --- a/src/Microsoft.AspNet.Http/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class TlsConnectionFeature : ITlsConnectionFeature { diff --git a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs similarity index 94% rename from src/Microsoft.AspNet.Http/Collections/FormCollection.cs rename to src/Microsoft.AspNet.Http/FormCollection.cs index a15e109093..ad829cd70c 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// Contains the parsed form values. diff --git a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs b/src/Microsoft.AspNet.Http/FormFileCollection.cs similarity index 96% rename from src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs rename to src/Microsoft.AspNet.Http/FormFileCollection.cs index df4175f312..bd624df355 100644 --- a/src/Microsoft.AspNet.Http/Collections/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/FormFileCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs rename to src/Microsoft.AspNet.Http/HeaderDictionary.cs index 0cbe3e4ef3..04c2d556bd 100644 --- a/src/Microsoft.AspNet.Http/Collections/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -5,10 +5,10 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Infrastructure; +using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. diff --git a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/ItemsDictionary.cs similarity index 98% rename from src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs rename to src/Microsoft.AspNet.Http/ItemsDictionary.cs index ac0e574af2..e191516849 100644 --- a/src/Microsoft.AspNet.Http/Collections/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http/ParsingHelpers.cs index c8a7c745db..45ac370eb4 100644 --- a/src/Microsoft.AspNet.Http/Infrastructure/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Infrastructure +namespace Microsoft.AspNet.Http.Internal { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs rename to src/Microsoft.AspNet.Http/ReadableStringCollection.cs index cc4fe12d27..7a07ea603c 100644 --- a/src/Microsoft.AspNet.Http/Collections/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -5,7 +5,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// Accessors for query, forms, etc. diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 7d78b72847..6fa2c34f04 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs similarity index 98% rename from src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs rename to src/Microsoft.AspNet.Http/RequestCookiesCollection.cs index 859a63b3ee..1dc603b518 100644 --- a/src/Microsoft.AspNet.Http/Collections/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { public class RequestCookiesCollection : IReadableStringCollection { diff --git a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs similarity index 99% rename from src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs rename to src/Microsoft.AspNet.Http/ResponseCookies.cs index d98decdb5a..b47b48d505 100644 --- a/src/Microsoft.AspNet.Http/Collections/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -8,7 +8,7 @@ using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs b/src/Microsoft.AspNet.Http/SessionCollection.cs similarity index 95% rename from src/Microsoft.AspNet.Http/Collections/SessionCollection.cs rename to src/Microsoft.AspNet.Http/SessionCollection.cs index c47095d3c5..8123e2fb0b 100644 --- a/src/Microsoft.AspNet.Http/Collections/SessionCollection.cs +++ b/src/Microsoft.AspNet.Http/SessionCollection.cs @@ -4,8 +4,9 @@ using System; using System.Collections; using System.Collections.Generic; +using Microsoft.AspNet.Http.Features; -namespace Microsoft.AspNet.Http.Collections +namespace Microsoft.AspNet.Http.Internal { public class SessionCollection : ISessionCollection { diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index e664c9f080..96102f6bf4 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -14,7 +14,9 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 3ade1d3d1c..93b487006e 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 823e98bbea..7aee9b3c78 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -15,12 +15,12 @@ using System.Security.Principal; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Owin { - using Microsoft.Framework.Internal; using SendFileFunc = Func; public class OwinFeatureCollection : diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 2cb8b74c8d..a36e9377f3 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs index fd77da5841..9bdaa91588 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs index d175e49fa5..2da6ea7774 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Owin { diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 51224bc8ef..330b2867ea 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,6 +3,7 @@ using System.IO; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Http diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index aa0a6d5ac7..cbdc1d9845 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -3,7 +3,9 @@ using System; using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Shouldly; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index d0cd1eacb3..0fcc04c997 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -4,7 +4,9 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Builder.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index c96508a4ea..fb2ef452f1 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Collections; +using Microsoft.AspNet.Http.Internal; using Microsoft.Net.Http.Headers; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index c123db4b09..ef8aa04c56 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -3,6 +3,8 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Http.Extensions.Tests diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 7c28c99174..4284bb9c1d 100644 --- a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.Http; using Xunit; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNet.Builder.Internal { public class ApplicationBuilderTests { diff --git a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs index a618da3cfb..0728d65d80 100644 --- a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs @@ -4,7 +4,7 @@ using System.IO; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class BufferingHelperTests { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index ea8699ee43..cffbc5c385 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -2,15 +2,16 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 9ddb91d9d5..a3115bf5ee 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -4,9 +4,10 @@ using System; using System.Collections.Generic; using System.Globalization; +using Microsoft.AspNet.Http.Features; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index e26a4f0222..61dfda82f5 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -1,15 +1,15 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class FormFeatureTests { diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 1e40ae0e8a..79cbac89c5 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,10 +3,9 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Collections; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Internal { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 74b7cd37b0..5a1214338f 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -5,7 +5,7 @@ using Microsoft.AspNet.FeatureModel; using Moq; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Features.Internal { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 95c1d7fd81..3676fb2941 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Owin diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index eb05bd0dc5..03f2258a0c 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Xunit; namespace Microsoft.AspNet.Owin From ad93dd74b63316945bd55e4731c9e7ad6cc932c7 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 7 May 2015 13:26:53 -0700 Subject: [PATCH 0607/1838] React to Http namespace changes. --- .../Builder/ApplicationBuilderFactory.cs | 1 + src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs | 1 + src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs | 2 +- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 1 + src/Microsoft.AspNet.TestHost/ClientHandler.cs | 2 ++ src/Microsoft.AspNet.TestHost/RequestFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 1 + test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 1 + test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 ++ 10 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs index f1198a9ef0..a5b00f5fbf 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs @@ -3,6 +3,7 @@ using System; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Builder.Internal; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 0b8af5f0ea..88ea3a3472 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -3,6 +3,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs index 6593cf957e..07d1f11442 100644 --- a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 9a14754a40..56659edc73 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -10,6 +10,7 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Internal; diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index add6bf48be..f5b501af7e 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -12,6 +12,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index 61fb442632..eebdd28372 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 3b43f42e6f..b582e028a9 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 3f8492b13f..d776c1d481 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -12,6 +12,7 @@ using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Testing.xunit; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 15fe74ab56..013f202f03 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Reflection; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Framework.DependencyInjection; diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index b8f3ecb73a..779afc7a87 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -9,6 +9,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.TestHost From c4df4a0a151ee9512f3a6d784e5f63211c0faadd Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 8 May 2015 10:52:43 -0700 Subject: [PATCH 0608/1838] #303 Enable tests for CoreCLR. --- .../project.json | 7 +--- .../MapPathMiddlewareTests.cs | 3 +- .../project.json | 7 +--- .../project.json | 7 +--- .../ApplicationBuilderTests.cs | 11 ++--- .../QueryFeatureTests.cs | 14 +++---- test/Microsoft.AspNet.Http.Tests/project.json | 28 +++++-------- test/Microsoft.AspNet.Owin.Tests/project.json | 7 +--- .../EncoderServiceProviderExtensionsTests.cs | 39 ++++++++++-------- .../UnicodeEncoderBaseTests.cs | 18 ++++----- .../project.json | 40 ++++++++++--------- 11 files changed, 82 insertions(+), 99 deletions(-) diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.FeatureModel.Tests/project.json index 320d7f0186..a09a4171c6 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.FeatureModel.Tests/project.json @@ -7,10 +7,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index cbdc1d9845..aaa4467fe9 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; -using Shouldly; using Xunit; namespace Microsoft.AspNet.Builder.Extensions @@ -98,7 +97,7 @@ namespace Microsoft.AspNet.Builder.Extensions [InlineData("/foo/cho/")] public void MatchPathWithTrailingSlashThrowsException(string matchPath) { - Should.Throw(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); + Assert.Throws(() => new ApplicationBuilder(serviceProvider: null).Map(matchPath, map => { }).Build()); } [Theory] diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json index 7faf925aae..21eb7701ae 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json @@ -8,10 +8,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 4287829625..bac140231f 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -9,10 +9,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs index 4284bb9c1d..52d0fadfe2 100644 --- a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Builder.Internal @@ -14,13 +14,10 @@ namespace Microsoft.AspNet.Builder.Internal var builder = new ApplicationBuilder(null); var app = builder.Build(); - var mockHttpContext = new Moq.Mock(); - var mockHttpResponse = new Moq.Mock(); - mockHttpContext.SetupGet(x => x.Response).Returns(mockHttpResponse.Object); - mockHttpResponse.SetupProperty(x => x.StatusCode); + var httpContext = new DefaultHttpContext(); - app.Invoke(mockHttpContext.Object); - Assert.Equal(mockHttpContext.Object.Response.StatusCode, 404); + app.Invoke(httpContext); + Assert.Equal(httpContext.Response.StatusCode, 404); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 5a1214338f..a110b09946 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FeatureModel; -using Moq; using Xunit; namespace Microsoft.AspNet.Http.Features.Internal @@ -13,15 +12,12 @@ namespace Microsoft.AspNet.Http.Features.Internal public void QueryReturnsParsedQueryCollection() { // Arrange - var features = new Mock(); - var request = new Mock(); - request.SetupGet(r => r.QueryString).Returns("foo=bar"); + var features = new FeatureCollection(); + var request = new HttpRequestFeature(); + request.QueryString = "foo=bar"; + features.Add(typeof(IHttpRequestFeature), request); - object value = request.Object; - features.Setup(f => f.TryGetValue(typeof(IHttpRequestFeature), out value)) - .Returns(true); - - var provider = new QueryFeature(features.Object); + var provider = new QueryFeature(features); // Act var queryCollection = provider.Query; diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index 42315e13eb..cde6b4f819 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,19 +1,13 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Moq": "4.2.1312.1622" - }, - "frameworkAssemblies": { - "System.Net.Http": "" - } - } - } + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 79f1cafd16..05c31c8a00 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -8,10 +8,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { - "dependencies": { - "Shouldly": "1.1.1.1" - } - } + "dnx451": { }, + "dnxcore50": { } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index 9d44a41697..07b23933e1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -2,8 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.IO; -using Moq; using Xunit; namespace Microsoft.Framework.WebEncoders @@ -14,7 +12,7 @@ namespace Microsoft.Framework.WebEncoders public void GetHtmlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange - var serviceProvider = new Mock().Object; + var serviceProvider = new TestServiceProvider(); // Act var retVal = serviceProvider.GetHtmlEncoder(); @@ -27,12 +25,11 @@ namespace Microsoft.Framework.WebEncoders public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new Mock().Object; - var mockServiceProvider = new Mock(); - mockServiceProvider.Setup(o => o.GetService(typeof(IHtmlEncoder))).Returns(expectedEncoder); + var expectedEncoder = new HtmlEncoder(); + var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = mockServiceProvider.Object.GetHtmlEncoder(); + var retVal = serviceProvider.GetHtmlEncoder(); // Assert Assert.Same(expectedEncoder, retVal); @@ -42,7 +39,7 @@ namespace Microsoft.Framework.WebEncoders public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange - var serviceProvider = new Mock().Object; + var serviceProvider = new TestServiceProvider(); // Act var retVal = serviceProvider.GetJavaScriptStringEncoder(); @@ -55,12 +52,11 @@ namespace Microsoft.Framework.WebEncoders public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new Mock().Object; - var mockServiceProvider = new Mock(); - mockServiceProvider.Setup(o => o.GetService(typeof(IJavaScriptStringEncoder))).Returns(expectedEncoder); + var expectedEncoder = new JavaScriptStringEncoder(); + var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = mockServiceProvider.Object.GetJavaScriptStringEncoder(); + var retVal = serviceProvider.GetJavaScriptStringEncoder(); // Assert Assert.Same(expectedEncoder, retVal); @@ -70,7 +66,7 @@ namespace Microsoft.Framework.WebEncoders public void GetUrlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange - var serviceProvider = new Mock().Object; + var serviceProvider = new TestServiceProvider(); // Act var retVal = serviceProvider.GetUrlEncoder(); @@ -83,15 +79,24 @@ namespace Microsoft.Framework.WebEncoders public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new Mock().Object; - var mockServiceProvider = new Mock(); - mockServiceProvider.Setup(o => o.GetService(typeof(IUrlEncoder))).Returns(expectedEncoder); + var expectedEncoder = new UrlEncoder(); + var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = mockServiceProvider.Object.GetUrlEncoder(); + var retVal = serviceProvider.GetUrlEncoder(); // Assert Assert.Same(expectedEncoder, retVal); } + + private class TestServiceProvider : IServiceProvider + { + public object Service { get; set; } + + public object GetService(Type serviceType) + { + return Service; + } + } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index e6661686c0..6ee48c5954 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; -using Moq; using Xunit; namespace Microsoft.Framework.WebEncoders @@ -208,8 +207,9 @@ namespace Microsoft.Framework.WebEncoders public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - TextWriter output = new Mock(MockBehavior.Strict).Object; + var encoder = new CustomUnicodeEncoderBase(); + var output = new StringWriter(); + output.Dispose(); // Throws ODE if written to. // Act encoder.Encode("abc".ToCharArray(), 2, 0, output); @@ -280,8 +280,9 @@ namespace Microsoft.Framework.WebEncoders public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter() { // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - TextWriter output = new Mock(MockBehavior.Strict).Object; + var encoder = new CustomUnicodeEncoderBase(); + var output = new StringWriter(); + output.Dispose(); // Throws ODE if written to. // Act encoder.Encode("abc", 2, 0, output); @@ -309,14 +310,13 @@ namespace Microsoft.Framework.WebEncoders { // Arrange CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - var mockWriter = new Mock(MockBehavior.Strict); - mockWriter.Setup(o => o.Write("abc")).Verifiable(); + StringWriter output = new StringWriter(); // Act - encoder.Encode("abc", 0, 3, mockWriter.Object); + encoder.Encode("abc", 0, 3, output); // Assert - mockWriter.Verify(); + Assert.Equal("abc", output.ToString()); } [Fact] diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 4acf0c6ad2..b0ba4aa9fe 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -1,20 +1,24 @@ { - "dependencies": { - "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.WebEncoders": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", - "Moq": "4.2.1312.1622", - "Newtonsoft.Json": "6.0.6", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "compilationOptions": { - "allowUnsafe": "true" - }, - "frameworks": { - "dnx451": { } - }, - "resources": "..\\..\\unicode\\UnicodeData.txt" + "dependencies": { + "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", + "Newtonsoft.Json": "6.0.6", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "compilationOptions": { + "allowUnsafe": true + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Text.Encoding.Extensions": "4.0.10-beta-*" + } + } + }, + "resources": "..\\..\\unicode\\UnicodeData.txt" } From 4de328069ade71b40051f6f3147bc8aa01aa4502 Mon Sep 17 00:00:00 2001 From: Kai Ruhnau Date: Fri, 8 May 2015 12:54:34 +0200 Subject: [PATCH 0609/1838] Add an ApplicationStarted event --- .../IApplicationLifetime.cs | 8 +++++- .../ApplicationLifetime.cs | 27 ++++++++++++++++++- .../Internal/HostingEngine.cs | 4 ++- .../HostingEngineTests.cs | 15 +++++++++++ 4 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs index c229eb6e67..536e24c165 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs @@ -10,6 +10,12 @@ namespace Microsoft.AspNet.Hosting /// public interface IApplicationLifetime { + /// + /// Triggered when the application host has fully started and is about to wait + /// for a graceful shutdown. + /// + CancellationToken ApplicationStarted { get; } + /// /// Triggered when the application host is performing a graceful shutdown. /// Request may still be in flight. Shutdown will block until this event completes. @@ -25,4 +31,4 @@ namespace Microsoft.AspNet.Hosting /// CancellationToken ApplicationStopped { get; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs index eb6dc364b9..ced615c889 100644 --- a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs @@ -11,9 +11,19 @@ namespace Microsoft.AspNet.Hosting /// public class ApplicationLifetime : IApplicationLifetime { + private readonly CancellationTokenSource _startedSource = new CancellationTokenSource(); private readonly CancellationTokenSource _stoppingSource = new CancellationTokenSource(); private readonly CancellationTokenSource _stoppedSource = new CancellationTokenSource(); + /// + /// Triggered when the application host has fully started and is about to wait + /// for a graceful shutdown. + /// + public CancellationToken ApplicationStarted + { + get { return _startedSource.Token; } + } + /// /// Triggered when the application host is performing a graceful shutdown. /// Request may still be in flight. Shutdown will block until this event completes. @@ -35,6 +45,21 @@ namespace Microsoft.AspNet.Hosting get { return _stoppedSource.Token; } } + /// + /// Signals the ApplicationStarted event and blocks until it completes. + /// + public void NotifyStarted() + { + try + { + _startedSource.Cancel(throwOnFirstException: false); + } + catch (Exception) + { + // TODO: LOG + } + } + /// /// Signals the ApplicationStopping event and blocks until it completes. /// @@ -65,4 +90,4 @@ namespace Microsoft.AspNet.Hosting } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 56659edc73..48a0069b92 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -79,6 +79,8 @@ namespace Microsoft.AspNet.Hosting.Internal } }); + _applicationLifetime.NotifyStarted(); + return new Disposable(() => { _applicationLifetime.NotifyStopping(); @@ -182,4 +184,4 @@ namespace Microsoft.AspNet.Hosting.Internal } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index d776c1d481..6c613adcf7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -90,6 +90,21 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void HostingEngineNotifiesApplicationStarted() + { + var host = CreateBuilder() + .UseServer(this) + .Build(); + var applicationLifetime = host.ApplicationServices.GetRequiredService(); + + Assert.False(applicationLifetime.ApplicationStarted.IsCancellationRequested); + using (host.Start()) + { + Assert.True(applicationLifetime.ApplicationStarted.IsCancellationRequested); + } + } + [Fact] public void HostingEngineInjectsHostingEnvironment() { From 1354d66fb6dbaa732e18c66daf40a6fda20b7b90 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 11 May 2015 15:08:40 -0700 Subject: [PATCH 0610/1838] Ensure ConfigureServices is only called once --- .../Internal/HostingEngine.cs | 11 ++++--- .../HostingEngineTests.cs | 32 +++++++++++++++++++ 2 files changed, 38 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 48a0069b92..924d336e1d 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -91,11 +91,12 @@ namespace Microsoft.AspNet.Hosting.Internal private void EnsureApplicationServices() { - EnsureStartup(); - - _applicationServiceCollection.AddInstance(_applicationLifetime); - - _applicationServices = Startup.ConfigureServicesDelegate(_applicationServiceCollection); + if (_applicationServices == null) + { + EnsureStartup(); + _applicationServiceCollection.AddInstance(_applicationLifetime); + _applicationServices = Startup.ConfigureServicesDelegate(_applicationServiceCollection); + } } private void EnsureStartup() diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 6c613adcf7..6ad8ab0b87 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -291,6 +291,38 @@ namespace Microsoft.AspNet.Hosting Assert.Same(requestIdentifierFeature, httpContext.GetFeature()); } + [Fact] + public void HostingEngine_InvokesConfigureMethodsOnlyOnce() + { + var engine = CreateBuilder() + .UseServer(this) + .UseStartup() + .Build(); + using (engine.Start()) + { + var services = engine.ApplicationServices; + var services2 = engine.ApplicationServices; + Assert.Equal(1, CountStartup.ConfigureCount); + Assert.Equal(1, CountStartup.ConfigureServicesCount); + } + } + + public class CountStartup + { + public static int ConfigureServicesCount; + public static int ConfigureCount; + + public void ConfigureServices(IServiceCollection services) + { + ConfigureServicesCount++; + } + + public void Configure(IApplicationBuilder app) + { + ConfigureCount++; + } + } + private IHostingEngine CreateHostingEngine(RequestDelegate requestDelegate) { var applicationBuilder = new Mock(); From 95b1997c14bb6fb7e2e68dd156f4feee3d139fec Mon Sep 17 00:00:00 2001 From: Kai Ruhnau Date: Thu, 7 May 2015 11:25:57 +0200 Subject: [PATCH 0611/1838] Simplify Hosting's shutdown handling. Don't require a TTY on Unix. --- src/Microsoft.AspNet.Hosting/Program.cs | 34 ++++--------------------- 1 file changed, 5 insertions(+), 29 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 11718b64b5..55117e0081 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -3,12 +3,9 @@ using System; using System.IO; -using System.Threading; -using System.Threading.Tasks; using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting @@ -35,33 +32,12 @@ namespace Microsoft.AspNet.Hosting config.AddCommandLine(args); var host = new WebHostBuilder(_serviceProvider, config).Build(); - var serverShutdown = host.Start(); - var loggerFactory = host.ApplicationServices.GetRequiredService(); - var appShutdownService = host.ApplicationServices.GetRequiredService(); - var shutdownHandle = new ManualResetEvent(false); - - appShutdownService.ShutdownRequested.Register(() => + using (host.Start()) { - try - { - serverShutdown.Dispose(); - } - catch (Exception ex) - { - var logger = loggerFactory.CreateLogger(); - logger.LogError("Dispose threw an exception.", ex); - } - shutdownHandle.Set(); - }); - - var ignored = Task.Run(() => - { - Console.WriteLine("Started"); - Console.ReadLine(); - appShutdownService.RequestShutdown(); - }); - - shutdownHandle.WaitOne(); + var appShutdownService = host.ApplicationServices.GetRequiredService(); + Console.CancelKeyPress += delegate { appShutdownService.RequestShutdown(); }; + appShutdownService.ShutdownRequested.WaitHandle.WaitOne(); + } } } } From c390d47317c8d0bdac35b1a22d4c180ea79791bb Mon Sep 17 00:00:00 2001 From: Glenn Condron Date: Wed, 25 Mar 2015 21:22:50 -0700 Subject: [PATCH 0612/1838] Add IsDevelopment and IsProduction extension methods --- .../HostingEnvironmentExtensions.cs | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index c0838231fc..d0baeb570f 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -9,6 +9,29 @@ namespace Microsoft.AspNet.Hosting { public static class HostingEnvironmentExtensions { + private const string DevelopmentEnvironmentName = "Development"; + private const string ProductionEnvironmentName = "Production"; + + /// + /// Checks if the current hosting environment name is development. + /// + /// An instance of service. + /// True if the environment name is Development, otherwise false. + public static bool IsDevelopment([NotNull]this IHostingEnvironment hostingEnvironment) + { + return hostingEnvironment.IsEnvironment(DevelopmentEnvironmentName); + } + + /// + /// Checks if the current hosting environment name is Production. + /// + /// An instance of service. + /// True if the environment name is Production, otherwise false. + public static bool IsProduction([NotNull]this IHostingEnvironment hostingEnvironment) + { + return hostingEnvironment.IsEnvironment(ProductionEnvironmentName); + } + /// /// Compares the current hosting environment name against the specified value. /// From dce1d0e88fa75c001b41260ab5653b924cbd4060 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 12 May 2015 11:02:58 -0700 Subject: [PATCH 0613/1838] #272 Make more properties settable (Items, RequestAborted, IsHttps, Query, Cookies). --- .../HttpContext.cs | 8 +- .../HttpRequest.cs | 6 +- .../QueryString.cs | 27 ++++- .../IHttpRequestLifetimeFeature.cs | 2 +- src/Microsoft.AspNet.Http/Constants.cs | 3 +- .../DefaultHttpContext.cs | 22 +--- .../DefaultHttpRequest.cs | 3 + .../Features/HttpRequestLifetimeFeature.cs | 17 +++ .../Features/IItemsFeature.cs | 2 +- .../Features/IQueryFeature.cs | 2 +- .../Features/IRequestCookiesFeature.cs | 2 +- .../Features/ItemsFeature.cs | 2 +- .../Features/QueryFeature.cs | 12 +- .../Features/RequestCookiesFeature.cs | 34 ++++-- .../OwinFeatureCollection.cs | 1 + .../DefaultAuthenticationManagerTests.cs | 111 ++++++++++++++++++ .../DefaultHttpContextTests.cs | 107 ++++------------- .../DefaultHttpRequestTests.cs | 72 ++++++++++++ 18 files changed, 308 insertions(+), 125 deletions(-) create mode 100644 src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs create mode 100644 test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 0ad675693c..1b853075da 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -17,22 +17,22 @@ namespace Microsoft.AspNet.Http public abstract ConnectionInfo Connection { get; } + public abstract WebSocketManager WebSockets { get; } + public abstract AuthenticationManager Authentication { get; } public abstract ClaimsPrincipal User { get; set; } - public abstract IDictionary Items { get; } + public abstract IDictionary Items { get; set; } public abstract IServiceProvider ApplicationServices { get; set; } public abstract IServiceProvider RequestServices { get; set; } - public abstract CancellationToken RequestAborted { get; } + public abstract CancellationToken RequestAborted { get; set; } public abstract ISessionCollection Session { get; } - public abstract WebSocketManager WebSockets { get; } - public abstract void Abort(); public abstract void Dispose(); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 80caec4502..4cbbf62a6f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Http /// Returns true if the owin.RequestScheme is https. /// /// true if this request is using https; otherwise, false. - public abstract bool IsHttps { get; } + public abstract bool IsHttps { get; set; } /// /// Gets or set the Host header. May include the port. @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Http /// Gets the query value collection parsed from owin.RequestQueryString. /// /// The query value collection parsed from owin.RequestQueryString. - public abstract IReadableStringCollection Query { get; } + public abstract IReadableStringCollection Query { get; set; } /// /// Gets or set the owin.RequestProtocol. @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Http /// Gets the collection of Cookies for this request. /// /// The collection of Cookies for this request. - public abstract IReadableStringCollection Cookies { get; } + public abstract IReadableStringCollection Cookies { get; set; } /// /// Gets or sets the Content-Length header diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 6d156bc7ee..7ad1300622 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -111,6 +111,7 @@ namespace Microsoft.AspNet.Http /// /// The un-encoded parameter name /// The un-encoded parameter value + /// The resulting QueryString public static QueryString Create(string name, string value) { return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value)); @@ -120,7 +121,7 @@ namespace Microsoft.AspNet.Http /// Creates a query string composed from the given name value pairs. /// /// - /// + /// The resulting QueryString public static QueryString Create(IEnumerable> parameters) { var builder = new StringBuilder(); @@ -137,6 +138,30 @@ namespace Microsoft.AspNet.Http return new QueryString(builder.ToString()); } + /// + /// Creates a query string composed from the given name value pairs. + /// + /// + /// The resulting QueryString + public static QueryString Create(IEnumerable> parameters) + { + var builder = new StringBuilder(); + bool first = true; + foreach (var pair in parameters) + { + foreach (var value in pair.Value) + { + builder.Append(first ? "?" : "&"); + first = false; + builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append("="); + builder.Append(UrlEncoder.Default.UrlEncode(value)); + } + } + + return new QueryString(builder.ToString()); + } + public QueryString Add(QueryString other) { if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs index b30704650e..e007c4a818 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Http.Features { public interface IHttpRequestLifetimeFeature { - CancellationToken RequestAborted { get; } + CancellationToken RequestAborted { get; set; } void Abort(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Constants.cs b/src/Microsoft.AspNet.Http/Constants.cs index 376bb55abd..d01466f549 100644 --- a/src/Microsoft.AspNet.Http/Constants.cs +++ b/src/Microsoft.AspNet.Http/Constants.cs @@ -5,7 +5,8 @@ namespace Microsoft.AspNet.Http.Internal { internal static class Constants { - internal const string Https = "HTTPS"; + internal const string Http = "http"; + internal const string Https = "https"; internal static class BuilderProperties { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 4c0174e5b1..6090eed1b9 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -69,7 +69,7 @@ namespace Microsoft.AspNet.Http.Internal private IHttpRequestLifetimeFeature LifetimeFeature { - get { return _lifetime.Fetch(_features); } + get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); } } private ISessionFeature SessionFeature @@ -103,6 +103,7 @@ namespace Microsoft.AspNet.Http.Internal public override IDictionary Items { get { return ItemsFeature.Items; } + set { ItemsFeature.Items = value; } } public override IServiceProvider ApplicationServices @@ -117,19 +118,10 @@ namespace Microsoft.AspNet.Http.Internal set { ServiceProvidersFeature.RequestServices = value; } } - public int Revision { get { return _features.Revision; } } - public override CancellationToken RequestAborted { - get - { - var lifetime = LifetimeFeature; - if (lifetime != null) - { - return lifetime.RequestAborted; - } - return CancellationToken.None; - } + get { return LifetimeFeature.RequestAborted; } + set { LifetimeFeature.RequestAborted = value; } } public override ISessionCollection Session @@ -167,11 +159,7 @@ namespace Microsoft.AspNet.Http.Internal public override void Abort() { - var lifetime = LifetimeFeature; - if (lifetime != null) - { - lifetime.Abort(); - } + LifetimeFeature.Abort(); } public override void Dispose() diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index f06e2d396e..bf374999b9 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -101,6 +101,7 @@ namespace Microsoft.AspNet.Http.Internal public override bool IsHttps { get { return string.Equals(Constants.Https, Scheme, StringComparison.OrdinalIgnoreCase); } + set { Scheme = value ? Constants.Https : Constants.Http; } } public override HostString Host @@ -112,6 +113,7 @@ namespace Microsoft.AspNet.Http.Internal public override IReadableStringCollection Query { get { return QueryFeature.Query; } + set { QueryFeature.Query = value; } } public override string Protocol @@ -128,6 +130,7 @@ namespace Microsoft.AspNet.Http.Internal public override IReadableStringCollection Cookies { get { return RequestCookiesFeature.Cookies; } + set { RequestCookiesFeature.Cookies = value; } } public override string ContentType diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs new file mode 100644 index 0000000000..1b773b93f1 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs @@ -0,0 +1,17 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Threading; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http.Features.Internal +{ + public class HttpRequestLifetimeFeature : IHttpRequestLifetimeFeature + { + public CancellationToken RequestAborted { get; set; } + + public void Abort() + { + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs index 96b2ce78fe..a30c3ac6fb 100644 --- a/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs @@ -7,6 +7,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IItemsFeature { - IDictionary Items { get; } + IDictionary Items { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs index a1143fb8cd..a814e38501 100644 --- a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IQueryFeature { - IReadableStringCollection Query { get; } + IReadableStringCollection Query { get; set; } } } diff --git a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs index 6b2f7c742e..73f23d032d 100644 --- a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IRequestCookiesFeature { - IReadableStringCollection Cookies { get; } + IReadableStringCollection Cookies { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs index fc839357a7..c80abe6d65 100644 --- a/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs @@ -13,6 +13,6 @@ namespace Microsoft.AspNet.Http.Features.Internal Items = new ItemsDictionary(); } - public IDictionary Items { get; private set; } + public IDictionary Items { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 9fb2bd4a4b..a46b6ecb83 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; @@ -41,13 +42,22 @@ namespace Microsoft.AspNet.Http.Features.Internal } var queryString = _request.Fetch(_features).QueryString; - if (_query == null || _queryString != queryString) + if (_query == null || !string.Equals(_queryString, queryString, StringComparison.Ordinal)) { _queryString = queryString; _query = new ReadableStringCollection(QueryHelpers.ParseQuery(queryString)); } return _query; } + set + { + _query = value; + if (_features != null) + { + _queryString = _query == null ? string.Empty : QueryString.Create(_query).ToString(); + _request.Fetch(_features).QueryString = _queryString; + } + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index eed8fc2d95..e0ba1dcc3e 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -50,19 +50,37 @@ namespace Microsoft.AspNet.Http.Features.Internal values = new string[0]; } - if (_cookiesCollection == null) - { - _cookieHeaders = values; - _cookiesCollection = new RequestCookiesCollection(); - _cookiesCollection.Reparse(values); - } - else if (!Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) + if (_cookieHeaders == null || !Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) { _cookieHeaders = values; + if (_cookiesCollection == null) + { + _cookiesCollection = new RequestCookiesCollection(); + _cookies = _cookiesCollection; + } _cookiesCollection.Reparse(values); } - return _cookiesCollection; + return _cookies; + } + set + { + _cookies = value; + _cookieHeaders = null; + _cookiesCollection = _cookies as RequestCookiesCollection; + if (_cookies != null && _features != null) + { + var headers = new List(); + foreach (var pair in _cookies) + { + foreach (var cookieValue in pair.Value) + { + headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); + } + } + _cookieHeaders = headers.ToArray(); + _request.Fetch(_features).Headers[HeaderNames.Cookie] = _cookieHeaders; + } } } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 7aee9b3c78..b54f38b69a 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -247,6 +247,7 @@ namespace Microsoft.AspNet.Owin CancellationToken IHttpRequestLifetimeFeature.RequestAborted { get { return Prop(OwinConstants.CallCancelled); } + set { Prop(OwinConstants.CallCancelled, value); } } void IHttpRequestLifetimeFeature.Abort() diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs new file mode 100644 index 0000000000..652f3a1091 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -0,0 +1,111 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Security.Claims; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNet.Http.Internal; +using Xunit; + +namespace Microsoft.AspNet.Http.Authentication.Internal +{ + public class AuthenticationManagerTests + { + + [Fact] + public async Task AuthenticateWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Authentication.Authenticate("Foo")); + await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); + } + + [Fact] + public void ChallengeWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Authentication.Challenge(); + Assert.Equal(401, context.Response.StatusCode); + + Assert.Throws(() => context.Authentication.Challenge("Foo")); + } + + [Fact] + public void SignInWithNoAuthMiddlewareThrows() + { + var context = CreateContext(); + Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); + } + + [Fact] + public void SignOutWithNoAuthMiddlewareMayThrow() + { + var context = CreateContext(); + context.Authentication.SignOut(); + + Assert.Throws(() => context.Authentication.SignOut("Foo")); + } + + [Fact] + public void SignInOutIn() + { + var context = CreateContext(); + var handler = new AuthHandler(); + context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); + var user = new ClaimsPrincipal(); + context.Authentication.SignIn("ignored", user); + Assert.True(handler.SignedIn); + context.Authentication.SignOut("ignored"); + Assert.False(handler.SignedIn); + context.Authentication.SignIn("ignored", user); + Assert.True(handler.SignedIn); + context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + Assert.False(handler.SignedIn); + } + + private class AuthHandler : IAuthenticationHandler + { + public bool SignedIn { get; set; } + + public void Authenticate(AuthenticateContext context) + { + throw new NotImplementedException(); + } + + public Task AuthenticateAsync(AuthenticateContext context) + { + throw new NotImplementedException(); + } + + public void Challenge(ChallengeContext context) + { + throw new NotImplementedException(); + } + + public void GetDescriptions(DescribeSchemesContext context) + { + throw new NotImplementedException(); + } + + public void SignIn(SignInContext context) + { + SignedIn = true; + context.Accept(); + } + + public void SignOut(SignOutContext context) + { + SignedIn = false; + context.Accept(); + } + } + + private HttpContext CreateContext() + { + var context = new DefaultHttpContext(); + return context; + } + } +} diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index cffbc5c385..0caea097ec 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -1,14 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Collections.Generic; using System.Linq; using System.Security.Claims; -using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNet.Http.Features.Internal; using Xunit; namespace Microsoft.AspNet.Http.Internal @@ -44,91 +41,31 @@ namespace Microsoft.AspNet.Http.Internal } [Fact] - public async Task AuthenticateWithNoAuthMiddlewareThrows() + public void GetItems_DefaultCollectionProvided() { - var context = CreateContext(); - Assert.Throws(() => context.Authentication.Authenticate("Foo")); - await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.Null(context.GetFeature()); + var items = context.Items; + Assert.NotNull(context.GetFeature()); + Assert.NotNull(items); + Assert.Same(items, context.Items); + var item = new object(); + context.Items["foo"] = item; + Assert.Same(item, context.Items["foo"]); } [Fact] - public void ChallengeWithNoAuthMiddlewareMayThrow() + public void SetItems_NewCollectionUsed() { - var context = CreateContext(); - context.Authentication.Challenge(); - Assert.Equal(401, context.Response.StatusCode); - - Assert.Throws(() => context.Authentication.Challenge("Foo")); - } - - [Fact] - public void SignInWithNoAuthMiddlewareThrows() - { - var context = CreateContext(); - Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); - } - - [Fact] - public void SignOutWithNoAuthMiddlewareMayThrow() - { - var context = CreateContext(); - context.Authentication.SignOut(); - - Assert.Throws(() => context.Authentication.SignOut("Foo")); - } - - [Fact] - public void SignInOutIn() - { - var context = CreateContext(); - var handler = new AuthHandler(); - context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); - var user = new ClaimsPrincipal(); - context.Authentication.SignIn("ignored", user); - Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored"); - Assert.False(handler.SignedIn); - context.Authentication.SignIn("ignored", user); - Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); - Assert.False(handler.SignedIn); - } - - private class AuthHandler : IAuthenticationHandler - { - public bool SignedIn { get; set; } - - public void Authenticate(AuthenticateContext context) - { - throw new NotImplementedException(); - } - - public Task AuthenticateAsync(AuthenticateContext context) - { - throw new NotImplementedException(); - } - - public void Challenge(ChallengeContext context) - { - throw new NotImplementedException(); - } - - public void GetDescriptions(DescribeSchemesContext context) - { - throw new NotImplementedException(); - } - - public void SignIn(SignInContext context) - { - SignedIn = true; - context.Accept(); - } - - public void SignOut(SignOutContext context) - { - SignedIn = false; - context.Accept(); - } + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.Null(context.GetFeature()); + var items = new Dictionary(); + context.Items = items; + Assert.NotNull(context.GetFeature()); + Assert.Same(items, context.Items); + var item = new object(); + items["foo"] = item; + Assert.Same(item, context.Items["foo"]); } private HttpContext CreateContext() diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index a3115bf5ee..81b268ba1f 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -115,6 +115,78 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal(expected, headers["Host"][0]); } + [Fact] + public void IsHttps_CorrectlyReflectsScheme() + { + var request = new DefaultHttpContext().Request; + Assert.Equal(string.Empty, request.Scheme); + Assert.False(request.IsHttps); + request.IsHttps = true; + Assert.Equal("https", request.Scheme); + request.IsHttps = false; + Assert.Equal("http", request.Scheme); + request.Scheme = "ftp"; + Assert.False(request.IsHttps); + request.Scheme = "HTTPS"; + Assert.True(request.IsHttps); + } + + [Fact] + public void Query_GetAndSet() + { + var request = new DefaultHttpContext().Request; + var requestFeature = request.HttpContext.GetFeature(); + Assert.Equal(string.Empty, requestFeature.QueryString); + Assert.Equal(QueryString.Empty, request.QueryString); + var query0 = request.Query; + Assert.NotNull(query0); + Assert.Equal(0, query0.Count); + + requestFeature.QueryString = "?name0=value0&name1=value1"; + var query1 = request.Query; + Assert.NotSame(query0, query1); + Assert.Equal(2, query1.Count); + Assert.Equal("value0", query1["name0"]); + Assert.Equal("value1", query1["name1"]); + + var query2 = new ReadableStringCollection(new Dictionary() + { + { "name2", new[] { "value2" } } + }); + + request.Query = query2; + Assert.Same(query2, request.Query); + Assert.Equal("?name2=value2", requestFeature.QueryString); + Assert.Equal(new QueryString("?name2=value2"), request.QueryString); + } + + [Fact] + public void Cookies_GetAndSet() + { + var request = new DefaultHttpContext().Request; + var cookieHeaders = request.Headers.GetValues("Cookie"); + Assert.Null(cookieHeaders); + var cookies0 = request.Cookies; + Assert.Equal(0, cookies0.Count); + + request.Headers.SetValues("Cookie", new[] { "name0=value0", "name1=value1" }); + var cookies1 = request.Cookies; + Assert.Same(cookies0, cookies1); + Assert.Equal(2, cookies1.Count); + Assert.Equal("value0", cookies1["name0"]); + Assert.Equal("value1", cookies1["name1"]); + + var cookies2 = new ReadableStringCollection(new Dictionary() + { + { "name2", new[] { "value2" } } + }); + request.Cookies = cookies2; + Assert.Same(cookies2, request.Cookies); + Assert.Equal("value2", request.Cookies["name2"]); + cookieHeaders = request.Headers.GetValues("Cookie"); + Assert.Equal(new[] { "name2=value2" }, cookieHeaders); + } + private static HttpRequest CreateRequest(IDictionary headers) { var context = new DefaultHttpContext(); From 54fbf51894b97076897eb153bb82a7d6577f75cd Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 12 May 2015 11:46:51 -0700 Subject: [PATCH 0614/1838] Update Home master -> Home dev --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eac4268e4c..64ff041d5c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ Contributing ====== -Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/dev/CONTRIBUTING.md) in the Home repo. From a4a37b2f0fda69e15f9fc2975895ba3f8574905a Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Tue, 12 May 2015 11:49:57 -0700 Subject: [PATCH 0615/1838] Update Home master -> Home dev --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index eac4268e4c..64ff041d5c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ Contributing ====== -Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. +Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/dev/CONTRIBUTING.md) in the Home repo. From 8c58f7ac1ad54e9b31e7eeae2cddaf881775ec94 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 12 May 2015 18:32:53 -0700 Subject: [PATCH 0616/1838] Print started --- src/Microsoft.AspNet.Hosting/Program.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 55117e0081..495d1380b0 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -34,6 +34,7 @@ namespace Microsoft.AspNet.Hosting var host = new WebHostBuilder(_serviceProvider, config).Build(); using (host.Start()) { + Console.WriteLine("Started"); var appShutdownService = host.ApplicationServices.GetRequiredService(); Console.CancelKeyPress += delegate { appShutdownService.RequestShutdown(); }; appShutdownService.ShutdownRequested.WaitHandle.WaitOne(); From 99ea4fed8aa07b87d51ea1dd54186cf24d4fedd9 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 14 May 2015 22:23:12 -0700 Subject: [PATCH 0617/1838] #176 Add Clone() to MediaTypeHeaderValue and NameValueHeaderValue. --- .../MediaTypeHeaderValue.cs | 21 ++++++++++++++ .../NameValueHeaderValue.cs | 13 +++++++++ .../MediaTypeHeaderValueTest.cs | 28 +++++++++++++++++++ .../NameValueHeaderValueTest.cs | 26 +++++++++++++++++ 4 files changed, 88 insertions(+) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 4113f44598..173bf7c404 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -248,6 +248,27 @@ namespace Microsoft.Net.Http.Headers return true; } + /// + /// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components, + /// while avoiding the cost of revalidating the components. + /// + /// A deep copy. + public MediaTypeHeaderValue Clone() + { + var other = new MediaTypeHeaderValue(); + other._mediaType = _mediaType; + + if (_parameters != null) + { + other._parameters = new ObjectCollection(); + foreach (var pair in _parameters) + { + other._parameters.Add(pair.Clone()); + } + } + return other; + } + public override string ToString() { return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 668a4ccef4..08a08f96ef 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -54,6 +54,19 @@ namespace Microsoft.Net.Http.Headers } } + /// + /// Provides a copy of this object without the cost of re-validating the values. + /// + /// A copy. + public NameValueHeaderValue Clone() + { + return new NameValueHeaderValue() + { + _name = _name, + _value = _value + }; + } + public override int GetHashCode() { Contract.Assert(_name != null); diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 5c73d9b607..92ec8f9726 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -64,6 +64,34 @@ namespace Microsoft.Net.Http.Headers Assert.Throws(() => mediaType.Parameters.Add(null)); } + [Fact] + public void Clone_SimpleMediaType_Copied() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + var mediaType1 = mediaType0.Clone(); + Assert.NotSame(mediaType0, mediaType1); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + } + + [Fact] + public void Clone_WithParameters_Copied() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.Clone(); + Assert.NotSame(mediaType0, mediaType1); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + var pair0 = mediaType0.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index 3d342dea9b..a1e1a935f9 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -59,6 +59,32 @@ namespace Microsoft.Net.Http.Headers CheckValue("\"quoted string with quoted \\\" quote-pair\""); } + [Fact] + public void Clone_NameOnly_SuccesfullyCopied() + { + var pair0 = new NameValueHeaderValue("name"); + var pair1 = pair0.Clone(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Null(pair0.Value); + Assert.Null(pair1.Value); + } + + [Fact] + public void Clone_NameAndValue_SuccesfullyCopied() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.Clone(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + + // Change one value and verify the other is unchanged. + pair1.Value = "othervalue"; + Assert.Equal("value", pair0.Value); + Assert.Equal("othervalue", pair1.Value); + } + [Fact] public void Value_CallSetterWithInvalidValues_Throw() { From 06d3333ed3a5c97c7dafc6225746a6164e863fed Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 15 May 2015 09:59:42 -0700 Subject: [PATCH 0618/1838] React to CoreCLR dependency changes. --- src/Microsoft.AspNet.WebUtilities/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index b3fb9c1ef6..5837682b5e 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -13,6 +13,7 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", + "System.IO.FileSystem.Primitives": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*" } From 89e60921f8c8165cefe1264ae915c201a94b3f71 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 15 May 2015 10:39:32 -0700 Subject: [PATCH 0619/1838] React to CoreClr dependency changes. --- src/Microsoft.AspNet.Server.Testing/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index ffebc4d56b..e4538164a4 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -21,6 +21,7 @@ "System.Diagnostics.Process": "4.0.0-beta-*", "System.IO.FileSystem": "4.0.0-*", "System.Net.Http": "4.0.0-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", "System.Text.RegularExpressions": "4.0.10-beta-*", "System.Threading": "4.0.10-beta-*", From 7b9cb14a108034192c026168f9adbfd83806cdc3 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 15 May 2015 12:20:28 -0700 Subject: [PATCH 0620/1838] Revert "React to CoreCLR dependency changes." This reverts commit 06d3333ed3a5c97c7dafc6225746a6164e863fed. --- src/Microsoft.AspNet.WebUtilities/project.json | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 5837682b5e..b3fb9c1ef6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -13,7 +13,6 @@ "System.Diagnostics.Debug": "4.0.10-beta-*", "System.IO": "4.0.10-beta-*", "System.IO.FileSystem": "4.0.0-beta-*", - "System.IO.FileSystem.Primitives": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*" } From 5b851c49a337e49001ed2351253ab0f52b696040 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Fri, 15 May 2015 13:46:58 -0700 Subject: [PATCH 0621/1838] Throw when ConfigureServices has wrong signature --- .../Internal/HostingUtilities.cs | 2 +- .../Internal/RequestServicesContainer.cs | 1 - src/Microsoft.AspNet.Hosting/Program.cs | 2 ++ .../Server/ServerLoader.cs | 4 +-- .../Startup/ConfigureDelegate.cs | 5 +-- .../Startup/ConfigureServicesDelegate.cs | 33 ++++++++++--------- .../Fakes/Startup.cs | 2 +- .../HostingEngineTests.cs | 17 ++++++++++ 8 files changed, 42 insertions(+), 24 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs index cec8d4d762..9d868fe532 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Hosting.Internal internal static Tuple SplitTypeName(string identifier) { string typeName = null; - string assemblyName = identifier.Trim(); + var assemblyName = identifier.Trim(); var parts = identifier.Split(new[] { ',' }, 2); if (parts.Length == 2) { diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs index 74e6df0fe2..a4ab07d546 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs @@ -39,7 +39,6 @@ namespace Microsoft.AspNet.Hosting.Internal private IServiceProvider PriorRequestServices { get; set; } private IServiceScope Scope { get; set; } - // CONSIDER: this could be an extension method on HttpContext instead public static RequestServicesContainer EnsureRequestServices(HttpContext httpContext, IServiceProvider services) { diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 495d1380b0..8e40a30f0e 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -3,6 +3,8 @@ using System; using System.IO; +using System.Threading; +using System.Threading.Tasks; using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.ConfigurationModel; using Microsoft.Framework.DependencyInjection; diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index 0327ae6a31..51cdecfe36 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -26,8 +26,8 @@ namespace Microsoft.AspNet.Hosting.Server } var nameParts = HostingUtilities.SplitTypeName(serverFactoryIdentifier); - string typeName = nameParts.Item1; - string assemblyName = nameParts.Item2; + var typeName = nameParts.Item1; + var assemblyName = nameParts.Item2; var assembly = Assembly.Load(new AssemblyName(assemblyName)); if (assembly == null) diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs index 3275f056d9..50f2b22005 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs @@ -20,10 +20,7 @@ namespace Microsoft.AspNet.Hosting.Startup public MethodInfo MethodInfo { get; } - public Action Build(object instance) - { - return builder => Invoke(instance, builder); - } + public Action Build(object instance) => builder => Invoke(instance, builder); private void Invoke(object instance, IApplicationBuilder builder) { diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs index d500ccea06..0935c7a69d 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs @@ -2,8 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Linq; using System.Reflection; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Startup { @@ -11,32 +13,33 @@ namespace Microsoft.AspNet.Hosting.Startup public class ConfigureServicesBuilder { - public ConfigureServicesBuilder(MethodInfo configureServices) + public ConfigureServicesBuilder([NotNull] MethodInfo configureServices) { + // Only support IServiceCollection parameters + var parameters = configureServices.GetParameters(); + if (parameters.Length > 1 || + parameters.Any(p => p.ParameterType != typeof(IServiceCollection))) + { + throw new InvalidOperationException("ConfigureServices can take at most a single IServiceCollection parameter."); + } + MethodInfo = configureServices; } public MethodInfo MethodInfo { get; } - public ConfigureServicesDelegate Build(object instance) - { - return services => Invoke(instance, services); - } + public ConfigureServicesDelegate Build(object instance) => services => Invoke(instance, services); - private IServiceProvider Invoke(object instance, IServiceCollection exportServices) + private IServiceProvider Invoke(object instance, [NotNull] IServiceCollection exportServices) { - var parameterInfos = MethodInfo.GetParameters(); - var parameters = new object[parameterInfos.Length]; - for (var index = 0; index != parameterInfos.Length; ++index) + var parameters = new object[MethodInfo.GetParameters().Length]; + + // Ctor ensures we have at most one IServiceCollection parameter + if (parameters.Length > 0) { - var parameterInfo = parameterInfos[index]; - if (exportServices != null && parameterInfo.ParameterType == typeof(IServiceCollection)) - { - parameters[index] = exportServices; - } + parameters[0] = exportServices; } - // REVIEW: We null ref if exportServices is null, cuz it should not be null return MethodInfo.Invoke(instance, parameters) as IServiceProvider ?? exportServices.BuildServiceProvider(); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 09a4a3360f..87950f61dc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -82,7 +82,7 @@ namespace Microsoft.AspNet.Hosting.Fakes return services.BuildServiceProvider(); } - public IServiceProvider ConfigureProviderArgsServices(IApplicationBuilder me) + public IServiceProvider ConfigureProviderArgsServices() { var services = new ServiceCollection().AddOptions(); services.Configure(o => diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 6ad8ab0b87..2234fcaa5d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -323,6 +323,23 @@ namespace Microsoft.AspNet.Hosting } } + [Fact] + public void HostingEngine_ThrowsForBadConfigureServiceSignature() + { + var engine = CreateBuilder() + .UseServer(this) + .UseStartup() + .Build(); + var ex = Assert.Throws(() => engine.Start()); + Assert.True(ex.Message.Contains("ConfigureServices")); + } + + public class BadConfigureServicesStartup + { + public void ConfigureServices(IServiceCollection services, int gunk) { } + public void Configure(IApplicationBuilder app) { } + } + private IHostingEngine CreateHostingEngine(RequestDelegate requestDelegate) { var applicationBuilder = new Mock(); From 0e87d989d77a9b831f6926a8c809f05dabfafebd Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 15 May 2015 11:59:13 -0700 Subject: [PATCH 0622/1838] #272 Make HostingEnvironment default to Production. --- src/Microsoft.AspNet.Hosting/HostingEnvironment.cs | 2 +- .../HostingEngineTests.cs | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 8060d32659..323f0c0270 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Hosting { public class HostingEnvironment : IHostingEnvironment { - internal const string DefaultEnvironmentName = "Development"; + internal const string DefaultEnvironmentName = "Production"; public string EnvironmentName { get; set; } = DefaultEnvironmentName; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 2234fcaa5d..95204108b5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -140,15 +140,15 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void EnvDefaultsToDevelopmentIfNoConfig() + public void EnvDefaultsToProductionIfNoConfig() { var engine = CreateBuilder().Build(); var env = engine.ApplicationServices.GetRequiredService(); - Assert.Equal("Development", env.EnvironmentName); + Assert.Equal("Production", env.EnvironmentName); } [Fact] - public void EnvDefaultsToDevelopmentConfigValueIfSpecifiedWithOldKey() + public void EnvDefaultsToConfigValueIfSpecifiedWithOldKey() { var vals = new Dictionary { @@ -164,7 +164,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void EnvDefaultsToDevelopmentConfigValueIfSpecified() + public void EnvDefaultsToConfigValueIfSpecified() { var vals = new Dictionary { @@ -195,8 +195,8 @@ namespace Microsoft.AspNet.Hosting using (engine.Start()) { var env = engine.ApplicationServices.GetRequiredService(); - Assert.True(env.IsEnvironment("Development")); - Assert.True(env.IsEnvironment("developMent")); + Assert.True(env.IsEnvironment("Production")); + Assert.True(env.IsEnvironment("producTion")); } } From 83a8fd136f5f0590bc81e627c4b4927af6b22647 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 17 May 2015 08:55:46 -0700 Subject: [PATCH 0623/1838] Fix tabs --- src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 500f8e6e5b..70b9128737 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -9,8 +9,8 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class HttpResponseFeature : IHttpResponseFeature { - public HttpResponseFeature() - { + public HttpResponseFeature() + { StatusCode = 200; Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; @@ -39,4 +39,4 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new NotSupportedException(); } } -} \ No newline at end of file +} From 3124cdd641eef683c5d33c44c94cc4eb995df877 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 17 May 2015 10:19:03 -0700 Subject: [PATCH 0624/1838] Remove ConfigureServicesDelegate - Removed the delegate type as it's not used anywhere in user code - Also removed platform helper --- .../PlatformHelper.cs | 20 ------------------- .../Startup/ConfigureServicesDelegate.cs | 4 +--- .../Startup/StartupMethods.cs | 13 ++++++------ .../WebHostBuilder.cs | 2 +- 4 files changed, 9 insertions(+), 30 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/PlatformHelper.cs diff --git a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs b/src/Microsoft.AspNet.Hosting/PlatformHelper.cs deleted file mode 100644 index fbe16751c1..0000000000 --- a/src/Microsoft.AspNet.Hosting/PlatformHelper.cs +++ /dev/null @@ -1,20 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Hosting -{ - internal static class PlatformHelper - { - private static Lazy _isMono = new Lazy(() => Type.GetType("Mono.Runtime") != null); - - public static bool IsMono - { - get - { - return _isMono.Value; - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs index 0935c7a69d..977cb07238 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs @@ -9,8 +9,6 @@ using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Startup { - public delegate IServiceProvider ConfigureServicesDelegate(IServiceCollection services); - public class ConfigureServicesBuilder { public ConfigureServicesBuilder([NotNull] MethodInfo configureServices) @@ -28,7 +26,7 @@ namespace Microsoft.AspNet.Hosting.Startup public MethodInfo MethodInfo { get; } - public ConfigureServicesDelegate Build(object instance) => services => Invoke(instance, services); + public Func Build(object instance) => services => Invoke(instance, services); private IServiceProvider Invoke(object instance, [NotNull] IServiceCollection exportServices) { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs index c213a681d3..e8b61efdab 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs @@ -9,19 +9,20 @@ namespace Microsoft.AspNet.Hosting.Startup { public class StartupMethods { - internal static ConfigureServicesDelegate DefaultBuildServiceProvider = s => s.BuildServiceProvider(); + internal static Func DefaultBuildServiceProvider = s => s.BuildServiceProvider(); - public StartupMethods(Action configure) - : this(configure, configureServices: null) { } + public StartupMethods(Action configure) + : this(configure, configureServices: null) + { + } - // TODO: switch to ConfigureDelegate eventually - public StartupMethods(Action configure, ConfigureServicesDelegate configureServices) + public StartupMethods(Action configure, Func configureServices) { ConfigureDelegate = configure; ConfigureServicesDelegate = configureServices ?? DefaultBuildServiceProvider; } - public ConfigureServicesDelegate ConfigureServicesDelegate { get; } + public Func ConfigureServicesDelegate { get; } public Action ConfigureDelegate { get; } } diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 256f615597..06ae275e29 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -167,7 +167,7 @@ namespace Microsoft.AspNet.Hosting return UseStartup(configureApp, configureServices: null); } - public WebHostBuilder UseStartup([NotNull] Action configureApp, ConfigureServicesDelegate configureServices) + public WebHostBuilder UseStartup([NotNull] Action configureApp, Func configureServices) { _startup = new StartupMethods(configureApp, configureServices); return this; From ac1e0aeee34a59f617a9bd53f3ef6a8ca2f87cb4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 17 May 2015 10:25:42 -0700 Subject: [PATCH 0625/1838] Fixed remaining refs --- src/Microsoft.AspNet.TestHost/TestServer.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 772c934260..c91d7b896e 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.TestHost return Create(services: null, config: null, configureApp: configureApp, configureServices: configureServices); } - public static TestServer Create(IServiceProvider services, Action configureApp, ConfigureServicesDelegate configureServices) + public static TestServer Create(IServiceProvider services, Action configureApp, Func configureServices) { return new TestServer(CreateBuilder(services, config: null, configureApp: configureApp, configureServices: configureServices)); } @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.TestHost }); } - public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config, Action configureApp, ConfigureServicesDelegate configureServices) + public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config, Action configureApp, Func configureServices) { return CreateBuilder(services, config).UseStartup(configureApp, configureServices); } From 1566f7206368c1493754ab1e4fd4229f80c951eb Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Wed, 20 May 2015 12:24:38 -0700 Subject: [PATCH 0626/1838] Update TestHost's dependencies --- src/Microsoft.AspNet.TestHost/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index c32b8f617b..b6fc16fd22 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -3,7 +3,7 @@ "description": "ASP.NET 5 web server for writing and running tests.", "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Internal": { "version": "1.0.0-*", "type": "build" } + "Microsoft.Framework.NotNullAttribute.Sources": { "version": "1.0.0-*", "type": "build" } }, "frameworks": { "dnx451": { From 69849cc37c2d1cb99715c6abec124dadcb1e51ef Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 20 May 2015 12:42:54 -0700 Subject: [PATCH 0627/1838] #311 Move UseMiddleware to Http.Abstractions. --- .../Extensions}/UseMiddlewareExtensions.cs | 8 ++++---- src/Microsoft.AspNet.Http.Abstractions/project.json | 2 ++ src/Microsoft.AspNet.Http.Extensions/project.json | 2 -- 3 files changed, 6 insertions(+), 6 deletions(-) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions/Extensions}/UseMiddlewareExtensions.cs (85%) diff --git a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs similarity index 85% rename from src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 9d98b85e6f..b247ab3cac 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -4,9 +4,9 @@ using System; using System.Linq; using System.Reflection; -using Microsoft.Framework.DependencyInjection; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Builder var parameters = methodinfo.GetParameters(); if (parameters[0].ParameterType != typeof(HttpContext)) { - throw new Exception("TODO: Middleware Invoke method must take first argument of HttpContext"); + throw new Exception("Middleware Invoke method must take first argument of HttpContext"); } if (parameters.Length == 1) { @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Builder var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; if (serviceProvider == null) { - throw new Exception("TODO: IServiceProvider is not available"); + throw new Exception("IServiceProvider is not available"); } var arguments = new object[parameters.Length]; arguments[0] = context; @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Builder arguments[index] = serviceProvider.GetService(serviceType); if (arguments[index] == null) { - throw new Exception(string.Format("TODO: No service for type '{0}' has been registered.", serviceType)); + throw new Exception(string.Format("No service for type '{0}' has been registered.", serviceType)); } } return (Task)methodinfo.Invoke(instance, arguments); diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index a70ce73541..71b44dabe2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { + "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, @@ -16,6 +17,7 @@ "System.Linq": "4.0.0-beta-*", "System.Net.Primitives": "4.0.10-beta-*", "System.Net.WebSockets" : "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*", "System.Runtime.InteropServices": "4.0.20-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index fde16b0159..780809de7b 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -4,7 +4,6 @@ "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" @@ -15,7 +14,6 @@ "dnxcore50": { "dependencies": { "System.IO.FileSystem": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", "System.Runtime": "4.0.20-beta-*" } } From b75a855b98b7d1e2385ba9695eabdaeab06c138a Mon Sep 17 00:00:00 2001 From: Kirthi Krishnamraju Date: Wed, 20 May 2015 14:54:33 -0700 Subject: [PATCH 0628/1838] React to aspnet/Congifuration #195,#198 --- .../IServerFactory.cs | 2 +- .../project.json | 2 +- .../Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 4 ++-- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 4 ++-- src/Microsoft.AspNet.Hosting/project.json | 5 ++++- src/Microsoft.AspNet.TestHost/TestServer.cs | 4 ++-- .../HostingEngineTests.cs | 14 ++++++++------ .../TestServerTests.cs | 7 +++++-- 9 files changed, 26 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs index a4b5c17d32..be933ea8f7 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs @@ -4,7 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; namespace Microsoft.AspNet.Hosting.Server { diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index ecc01a5efb..f368b88e76 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -2,7 +2,7 @@ "version": "1.0.0-*", "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel.Abstractions": "1.0.0-*" + "Microsoft.Framework.Configuration.Abstractions": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 924d336e1d..fd70f5840f 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -11,7 +11,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Internal; using Microsoft.Framework.Logging; diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 8e40a30f0e..e9e7ca522b 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -6,7 +6,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Hosting.Internal; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Runtime; @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Hosting public void Main(string[] args) { - var config = new Configuration(); + var config = new ConfigurationSection(); if (File.Exists(HostingIniFile)) { config.AddIniFile(HostingIniFile); diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 06ae275e29..7e204b3b96 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -7,7 +7,7 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Internal; using Microsoft.Framework.Logging; @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Hosting private string _serverFactoryLocation; private IServerFactory _serverFactory; - public WebHostBuilder([NotNull] IServiceProvider services) : this(services, config: new Configuration()) { } + public WebHostBuilder([NotNull] IServiceProvider services) : this(services, config: new ConfigurationSection()) { } public WebHostBuilder([NotNull] IServiceProvider services, [NotNull] IConfiguration config) { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index a84b1bc227..cafb35b26d 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -8,7 +8,10 @@ "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Framework.ConfigurationModel": "1.0.0-*", + "Microsoft.Framework.Configuration": "1.0.0-*", + "Microsoft.Framework.Configuration.CommandLine": "1.0.0-*", + "Microsoft.Framework.Configuration.EnvironmentVariables": "1.0.0-*", + "Microsoft.Framework.Configuration.Ini": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index c91d7b896e..4bc34a517c 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -10,7 +10,7 @@ using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Runtime.Infrastructure; @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.TestHost { return new WebHostBuilder( services ?? CallContextServiceLocator.Locator.ServiceProvider, - config ?? new Configuration()); + config ?? new ConfigurationSection()); } public static WebHostBuilder CreateBuilder() diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 95204108b5..268a91a7d3 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -14,7 +14,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Testing.xunit; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; @@ -50,7 +50,7 @@ namespace Microsoft.AspNet.Hosting { "server", "Microsoft.AspNet.Hosting.Tests" } }; - var config = new Configuration() + var config = new ConfigurationSection() .Add(new MemoryConfigurationSource(vals)); var host = CreateBuilder(config).Build(); host.Start(); @@ -65,7 +65,7 @@ namespace Microsoft.AspNet.Hosting { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" } }; - var config = new Configuration() + var config = new ConfigurationSection() .Add(new MemoryConfigurationSource(vals)); var host = CreateBuilder(config).Build(); host.Start(); @@ -155,7 +155,7 @@ namespace Microsoft.AspNet.Hosting { "ASPNET_ENV", "Staging" } }; - var config = new Configuration() + var config = new ConfigurationSection() .Add(new MemoryConfigurationSource(vals)); var engine = CreateBuilder(config).Build(); @@ -171,7 +171,7 @@ namespace Microsoft.AspNet.Hosting { "Hosting:Environment", "Staging" } }; - var config = new Configuration() + var config = new ConfigurationSection() .Add(new MemoryConfigurationSource(vals)); var engine = CreateBuilder(config).Build(); @@ -380,7 +380,9 @@ namespace Microsoft.AspNet.Hosting private WebHostBuilder CreateBuilder(IConfiguration config = null) { - return new WebHostBuilder(CallContextServiceLocator.Locator.ServiceProvider, config ?? new Configuration()); + return new WebHostBuilder( + CallContextServiceLocator.Locator.ServiceProvider, + config ?? new ConfigurationSection()); } public IServerInformation Initialize(IConfiguration configuration) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index be52e9b9cd..e65c0130e7 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; -using Microsoft.Framework.ConfigurationModel; +using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.Runtime.Infrastructure; @@ -34,7 +34,10 @@ namespace Microsoft.AspNet.TestHost var services = new ServiceCollection().BuildServiceProvider(); // Act & Assert - Assert.Throws(() => TestServer.Create(services, new Configuration(), new Startup().Configure, configureServices: null)); + Assert.Throws( + () => TestServer.Create( + services, + new ConfigurationSection(), new Startup().Configure, configureServices: null)); } [Fact] From 21681761490266ce9b8b519f841abeb97ac46b38 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 20 May 2015 16:10:58 -0700 Subject: [PATCH 0629/1838] #276 #277 Fix ini loading, read location from command line. --- src/Microsoft.AspNet.Hosting/Program.cs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index e9e7ca522b..eb9e2eccbf 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -2,10 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Runtime; @@ -15,6 +11,7 @@ namespace Microsoft.AspNet.Hosting public class Program { private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini"; + private const string ConfigFileKey = "config"; private readonly IServiceProvider _serviceProvider; @@ -25,11 +22,13 @@ namespace Microsoft.AspNet.Hosting public void Main(string[] args) { - var config = new ConfigurationSection(); - if (File.Exists(HostingIniFile)) - { - config.AddIniFile(HostingIniFile); - } + // Allow the location of the ini file to be specfied via a --config command line arg + var tempConfig = new ConfigurationSection().AddCommandLine(args); + var configFilePath = tempConfig[ConfigFileKey] ?? HostingIniFile; + + var appBasePath = _serviceProvider.GetRequiredService().ApplicationBasePath; + var config = new ConfigurationSection(appBasePath); + config.AddIniFile(configFilePath, optional: true); config.AddEnvironmentVariables(); config.AddCommandLine(args); From eb182fdafdd7b1e63a07cd67b4872f30abacdae8 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 21 May 2015 03:46:18 -0700 Subject: [PATCH 0630/1838] Fixed dependencies --- .../project.json | 55 ++++++++++--------- .../project.json | 36 ++++++------ 2 files changed, 46 insertions(+), 45 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 71b44dabe2..75763424c1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -1,30 +1,31 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP object model. HttpContext and family.", - "dependencies": { - "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Net.WebSockets" : "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Claims": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "dependencies": { + "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Collections": "4.0.10-beta-*", + "System.Diagnostics.Tools": "4.0.0-beta-*", + "System.Globalization": "4.0.10-beta-*", + "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", + "System.Linq.Expressions": "4.0.10-beta-*", + "System.Net.Primitives": "4.0.10-beta-*", + "System.Net.WebSockets": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Runtime.InteropServices": "4.0.20-beta-*", + "System.Security.Claims": "4.0.0-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.0-beta-*", + "System.Threading.Tasks": "4.0.10-beta-*" + } } + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 780809de7b..aca989fb05 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,21 +1,21 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", - "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" - }, - "frameworks": { - "dnx451": { - }, - "dnxcore50": { - "dependencies": { - "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", + "dependencies": { + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.IO.FileSystem": "4.0.0-beta-*", + "System.Runtime": "4.0.20-beta-*", + "System.Resources.ResourceManager": "4.0.0-beta-*" + } } + } } From 4289542996bc60adfbfd7053355ab11e94f3b392 Mon Sep 17 00:00:00 2001 From: Kirthi Krishnamraju Date: Fri, 22 May 2015 04:58:56 -0700 Subject: [PATCH 0631/1838] React to aspnet/Configuration #194 --- src/Microsoft.AspNet.Hosting/Program.cs | 12 +++++++----- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 3 ++- src/Microsoft.AspNet.TestHost/TestServer.cs | 2 +- .../HostingEngineTests.cs | 14 +++++++++----- .../TestServerTests.cs | 2 +- 5 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index eb9e2eccbf..6004d8e50f 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -23,14 +23,16 @@ namespace Microsoft.AspNet.Hosting public void Main(string[] args) { // Allow the location of the ini file to be specfied via a --config command line arg - var tempConfig = new ConfigurationSection().AddCommandLine(args); + var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); + var tempConfig = tempBuilder.Build(); var configFilePath = tempConfig[ConfigFileKey] ?? HostingIniFile; var appBasePath = _serviceProvider.GetRequiredService().ApplicationBasePath; - var config = new ConfigurationSection(appBasePath); - config.AddIniFile(configFilePath, optional: true); - config.AddEnvironmentVariables(); - config.AddCommandLine(args); + var builder = new ConfigurationBuilder(appBasePath); + builder.AddIniFile(configFilePath, optional: true); + builder.AddEnvironmentVariables(); + builder.AddCommandLine(args); + var config = builder.Build(); var host = new WebHostBuilder(_serviceProvider, config).Build(); using (host.Start()) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 7e204b3b96..4ae42e9c46 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -42,7 +42,8 @@ namespace Microsoft.AspNet.Hosting private string _serverFactoryLocation; private IServerFactory _serverFactory; - public WebHostBuilder([NotNull] IServiceProvider services) : this(services, config: new ConfigurationSection()) { } + public WebHostBuilder([NotNull] IServiceProvider services) + : this(services, config: new ConfigurationBuilder().Build()) { } public WebHostBuilder([NotNull] IServiceProvider services, [NotNull] IConfiguration config) { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 4bc34a517c..3dfacf4b59 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.TestHost { return new WebHostBuilder( services ?? CallContextServiceLocator.Locator.ServiceProvider, - config ?? new ConfigurationSection()); + config ?? new ConfigurationBuilder().Build()); } public static WebHostBuilder CreateBuilder() diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 268a91a7d3..8c16801d1d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -50,8 +50,9 @@ namespace Microsoft.AspNet.Hosting { "server", "Microsoft.AspNet.Hosting.Tests" } }; - var config = new ConfigurationSection() + var builder = new ConfigurationBuilder() .Add(new MemoryConfigurationSource(vals)); + var config = builder.Build(); var host = CreateBuilder(config).Build(); host.Start(); Assert.NotNull(host.ApplicationServices.GetRequiredService()); @@ -65,8 +66,9 @@ namespace Microsoft.AspNet.Hosting { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" } }; - var config = new ConfigurationSection() + var builder = new ConfigurationBuilder() .Add(new MemoryConfigurationSource(vals)); + var config = builder.Build(); var host = CreateBuilder(config).Build(); host.Start(); Assert.NotNull(host.ApplicationServices.GetRequiredService()); @@ -155,8 +157,9 @@ namespace Microsoft.AspNet.Hosting { "ASPNET_ENV", "Staging" } }; - var config = new ConfigurationSection() + var builder = new ConfigurationBuilder() .Add(new MemoryConfigurationSource(vals)); + var config = builder.Build(); var engine = CreateBuilder(config).Build(); var env = engine.ApplicationServices.GetRequiredService(); @@ -171,8 +174,9 @@ namespace Microsoft.AspNet.Hosting { "Hosting:Environment", "Staging" } }; - var config = new ConfigurationSection() + var builder = new ConfigurationBuilder() .Add(new MemoryConfigurationSource(vals)); + var config = builder.Build(); var engine = CreateBuilder(config).Build(); var env = engine.ApplicationServices.GetRequiredService(); @@ -382,7 +386,7 @@ namespace Microsoft.AspNet.Hosting { return new WebHostBuilder( CallContextServiceLocator.Locator.ServiceProvider, - config ?? new ConfigurationSection()); + config ?? new ConfigurationBuilder().Build()); } public IServerInformation Initialize(IConfiguration configuration) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index e65c0130e7..23ae59567b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -37,7 +37,7 @@ namespace Microsoft.AspNet.TestHost Assert.Throws( () => TestServer.Create( services, - new ConfigurationSection(), new Startup().Configure, configureServices: null)); + new ConfigurationBuilder().Build(), new Startup().Configure, configureServices: null)); } [Fact] From a80b5b4f3d0c0c281bbe22ff406135d036198b35 Mon Sep 17 00:00:00 2001 From: Kai Ruhnau Date: Fri, 22 May 2015 23:48:37 +0200 Subject: [PATCH 0632/1838] Disabled two tests failing on Mono --- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 4 +++- test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs | 5 ++++- test/Microsoft.AspNet.TestHost.Tests/project.json | 1 + 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 779afc7a87..e80ad3dc27 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -11,6 +11,7 @@ using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNet.Testing.xunit; using Xunit; namespace Microsoft.AspNet.TestHost @@ -222,7 +223,8 @@ namespace Microsoft.AspNet.TestHost HttpCompletionOption.ResponseHeadersRead)); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono)] public async Task ExceptionAfterFirstWriteIsReported() { ManualResetEvent block = new ManualResetEvent(false); diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs index 11e3965a6e..bcc4c79707 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs @@ -1,13 +1,16 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.AspNet.Testing.xunit; using Xunit; namespace Microsoft.AspNet.TestHost { public class RequestBuilderTests { - [Fact] + // c.f. https://github.com/mono/mono/pull/1832 + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono)] public void AddRequestHeader() { var server = TestServer.Create(app => { }); diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 968dba2a54..b203628aa6 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,5 +1,6 @@ { "dependencies": { + "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From fd07e666e45d71fe1f2ae7c096feed486fb9aea6 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 27 May 2015 16:22:53 -0700 Subject: [PATCH 0633/1838] Updating to release NuGet.config --- NuGet.Config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..0e74a4912d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,8 @@  - + + - \ No newline at end of file + From cb0cde61aa5d4f45dfb68c7b7e516586479d0a0d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 27 May 2015 16:24:27 -0700 Subject: [PATCH 0634/1838] Updating to release NuGet.config --- NuGet.Config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..0e74a4912d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,8 @@  - + + - \ No newline at end of file + From 568c8b6bc4c029ba6e3260e3f92e050585753f90 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 28 May 2015 16:16:46 -0700 Subject: [PATCH 0635/1838] Fix build break. --- .../Deployers/ApplicationDeployer.cs | 4 ++-- .../Deployers/IISExpressDeployer.cs | 4 ++-- .../Deployers/SelfHostDeployer.cs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 55893b7aec..6dd076e1a1 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -92,8 +92,8 @@ namespace Microsoft.AspNet.Server.Testing }; var hostProcess = new Process() { StartInfo = startInfo }; - hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; - hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; + hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data ?? string.Empty); }; + hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data ?? string.Empty); }; hostProcess.Start(); hostProcess.BeginErrorReadLine(); hostProcess.BeginOutputReadLine(); diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 5c63d28982..5dbf924e5a 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -107,8 +107,8 @@ namespace Microsoft.AspNet.Server.Testing #endif _hostProcess = new Process() { StartInfo = startInfo }; - _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; - _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; + _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data ?? string.Empty); }; + _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data ?? string.Empty); }; _hostProcess.EnableRaisingEvents = true; var hostExitTokenSource = new CancellationTokenSource(); _hostProcess.Exited += (sender, e) => diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index e0121bdfd4..e23ae53cef 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -68,8 +68,8 @@ namespace Microsoft.AspNet.Server.Testing AddEnvironmentVariablesToProcess(startInfo); _hostProcess = new Process() { StartInfo = startInfo }; - _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data); }; - _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data); }; + _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data ?? string.Empty); }; + _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data ?? string.Empty); }; _hostProcess.EnableRaisingEvents = true; var hostExitTokenSource = new CancellationTokenSource(); _hostProcess.Exited += (sender, e) => From d9839bcc43af2f3af612db5bb691d538c4b7f689 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 29 May 2015 01:12:54 -0700 Subject: [PATCH 0636/1838] Removed bookeeping for duck typing feature interfaces - Removed interlocked increment since the version was being incremented within the lock #317 --- .../FeatureCollection.cs | 50 ++----------------- 1 file changed, 5 insertions(+), 45 deletions(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 7c4a0e0017..0c43b0afa1 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -4,8 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Reflection; -using System.Threading; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.FeatureModel @@ -14,8 +12,7 @@ namespace Microsoft.AspNet.FeatureModel { private readonly IFeatureCollection _defaults; private readonly IDictionary _featureByFeatureType = new Dictionary(); - private readonly IDictionary _featureTypeByName = new Dictionary(); - private readonly object _containerSync = new Object(); + private readonly object _containerSync = new object(); private int _containerRevision; public FeatureCollection() @@ -40,22 +37,6 @@ namespace Microsoft.AspNet.FeatureModel return feature; } - Type actualType; - if (_featureTypeByName.TryGetValue(type.FullName, out actualType)) - { - if (_featureByFeatureType.TryGetValue(actualType, out feature)) - { - var isInstanceOfType = type.IsInstanceOfType(feature); - - if (isInstanceOfType) - { - return feature; - } - - return null; - } - } - if (_defaults != null && _defaults.TryGetValue(type, out feature)) { return feature; @@ -73,26 +54,8 @@ namespace Microsoft.AspNet.FeatureModel lock (_containerSync) { - Type priorFeatureType; - if (_featureTypeByName.TryGetValue(type.FullName, out priorFeatureType)) - { - if (priorFeatureType == type) - { - _featureByFeatureType[type] = feature; - } - else - { - _featureTypeByName[type.FullName] = type; - _featureByFeatureType.Remove(priorFeatureType); - _featureByFeatureType.Add(type, feature); - } - } - else - { - _featureTypeByName.Add(type.FullName, type); - _featureByFeatureType.Add(type, feature); - } - Interlocked.Increment(ref _containerRevision); + _featureByFeatureType[type] = feature; + _containerRevision++; } } @@ -169,12 +132,9 @@ namespace Microsoft.AspNet.FeatureModel { lock (_containerSync) { - Type priorFeatureType; - if (_featureTypeByName.TryGetValue(key.FullName, out priorFeatureType)) + if (_featureByFeatureType.Remove(key)) { - _featureTypeByName.Remove(key.FullName); - _featureByFeatureType.Remove(priorFeatureType); - Interlocked.Increment(ref _containerRevision); + _containerRevision++; return true; } return false; From 62e534977386ebb02bfc351ec4a6bbea9ea7f635 Mon Sep 17 00:00:00 2001 From: Brice Lambson Date: Thu, 28 May 2015 14:29:17 -0700 Subject: [PATCH 0637/1838] Make webHostBuilder.UseStartup(startupAssemblyName) work --- .../Properties/AssemblyInfo.cs | 4 ++- .../WebHostBuilder.cs | 13 ++++--- .../WebHostBuilderTests.cs | 34 +++++++++++++++++++ 3 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs diff --git a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs index 025a94598c..6145905b3a 100644 --- a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Runtime.CompilerServices; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Hosting.Tests")] diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 4ae42e9c46..052f4740c1 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -42,8 +42,10 @@ namespace Microsoft.AspNet.Hosting private string _serverFactoryLocation; private IServerFactory _serverFactory; - public WebHostBuilder([NotNull] IServiceProvider services) - : this(services, config: new ConfigurationBuilder().Build()) { } + public WebHostBuilder([NotNull] IServiceProvider services) + : this(services, config: new ConfigurationBuilder().Build()) + { + } public WebHostBuilder([NotNull] IServiceProvider services, [NotNull] IConfiguration config) { @@ -109,7 +111,7 @@ namespace Microsoft.AspNet.Hosting // Only one of these should be set, but they are used in priority engine.Startup = _startup; engine.StartupType = _startupType; - engine.StartupAssemblyName = _config.Get(ApplicationKey) ?? _config.Get(OldApplicationKey) ?? appEnvironment.ApplicationName; + engine.StartupAssemblyName = _startupAssemblyName ?? _config.Get(ApplicationKey) ?? _config.Get(OldApplicationKey) ?? appEnvironment.ApplicationName; return engine; } @@ -177,7 +179,8 @@ namespace Microsoft.AspNet.Hosting public WebHostBuilder UseStartup([NotNull] Action configureApp, Action configureServices) { _startup = new StartupMethods(configureApp, - services => { + services => + { if (configureServices != null) { configureServices(services); @@ -187,4 +190,4 @@ namespace Microsoft.AspNet.Hosting return this; } } -} \ No newline at end of file +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs new file mode 100644 index 0000000000..94cf636d9c --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -0,0 +1,34 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.Framework.Runtime.Infrastructure; +using Xunit; + +namespace Microsoft.AspNet.Hosting +{ + public class WebHostBuilderTests + { + [Fact] + public void Build_uses_application_for_startup_assembly_by_default() + { + var builder = CreateWebHostBuilder(); + + var engine = (HostingEngine)builder.Build(); + + Assert.Equal("Microsoft.AspNet.Hosting.Tests", engine.StartupAssemblyName); + } + + [Fact] + public void Build_honors_UseStartup_with_string() + { + var builder = CreateWebHostBuilder(); + + var engine = (HostingEngine)builder.UseStartup("MyStartupAssembly").Build(); + + Assert.Equal("MyStartupAssembly", engine.StartupAssemblyName); + } + + private WebHostBuilder CreateWebHostBuilder() => new WebHostBuilder(CallContextServiceLocator.Locator.ServiceProvider); + } +} From ed339a35d2a0ae6137c12e9bc8e8b037ed429bc1 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 29 May 2015 14:14:36 -0700 Subject: [PATCH 0638/1838] Made container verison volatile --- src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs index 0c43b0afa1..40e386a491 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.FeatureModel private readonly IFeatureCollection _defaults; private readonly IDictionary _featureByFeatureType = new Dictionary(); private readonly object _containerSync = new object(); - private int _containerRevision; + private volatile int _containerRevision; public FeatureCollection() { From 6407a1672d92d89c4140fd1e5c07052599d4b97e Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Wed, 27 May 2015 15:17:38 -0700 Subject: [PATCH 0639/1838] Session API review changes. --- .../HttpContext.cs | 3 +- .../ISessionCollection.cs | 21 ---- .../project.json | 1 + ...tionExtensions.cs => SessionExtensions.cs} | 19 ++- .../project.json | 1 - .../ISession.cs | 8 +- .../ISessionFactory.cs | 12 -- .../ISessionFeature.cs | 3 - .../WebSocketAcceptContext.cs | 2 +- .../DefaultHttpContext.cs | 21 ++-- .../Features/DefaultSessionFeature.cs | 14 +++ .../SessionCollection.cs | 74 ------------ src/Microsoft.AspNet.Http/project.json | 1 - .../DefaultHttpContextTests.cs | 109 ++++++++++++++++++ 14 files changed, 150 insertions(+), 139 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs rename src/Microsoft.AspNet.Http.Extensions/{SessionCollectionExtensions.cs => SessionExtensions.cs} (63%) delete mode 100644 src/Microsoft.AspNet.Http.Features/ISessionFactory.cs create mode 100644 src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs delete mode 100644 src/Microsoft.AspNet.Http/SessionCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 1b853075da..c7a63c8356 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using System.Threading; using Microsoft.AspNet.Http.Authentication; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { @@ -31,7 +32,7 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken RequestAborted { get; set; } - public abstract ISessionCollection Session { get; } + public abstract ISession Session { get; set; } public abstract void Abort(); diff --git a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs deleted file mode 100644 index a446704d33..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/ISessionCollection.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.AspNet.Http -{ - public interface ISessionCollection : IEnumerable> - { - byte[] this[string key] { get; set; } - - bool TryGetValue(string key, out byte[] value); - - void Set(string key, ArraySegment value); - - void Remove(string key); - - void Clear(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 75763424c1..1f9e83a30c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -2,6 +2,7 @@ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "dependencies": { + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs similarity index 63% rename from src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs rename to src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs index fbdbd02e40..b2908aed80 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SessionCollectionExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs @@ -1,14 +1,14 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Text; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { - public static class SessionCollectionExtensions + public static class SessionExtensions { - public static void SetInt32(this ISessionCollection session, string key, int value) + public static void SetInt32(this ISession session, string key, int value) { var bytes = new byte[] { @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Http session.Set(key, bytes); } - public static int? GetInt32(this ISessionCollection session, string key) + public static int? GetInt32(this ISession session, string key) { var data = session.Get(key); if (data == null || data.Length < 4) @@ -30,12 +30,12 @@ namespace Microsoft.AspNet.Http return data[0] << 24 | data[1] << 16 | data[2] << 8 | data[3]; } - public static void SetString(this ISessionCollection session, string key, string value) + public static void SetString(this ISession session, string key, string value) { session.Set(key, Encoding.UTF8.GetBytes(value)); } - public static string GetString(this ISessionCollection session, string key) + public static string GetString(this ISession session, string key) { var data = session.Get(key); if (data == null) @@ -45,16 +45,11 @@ namespace Microsoft.AspNet.Http return Encoding.UTF8.GetString(data); } - public static byte[] Get(this ISessionCollection session, string key) + public static byte[] Get(this ISession session, string key) { byte[] value = null; session.TryGetValue(key, out value); return value; } - - public static void Set(this ISessionCollection session, string key, byte[] value) - { - session.Set(key, new ArraySegment(value)); - } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index aca989fb05..6f5855192b 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -3,7 +3,6 @@ "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNet.Http.Features/ISession.cs index ba80fc7324..058853ffc9 100644 --- a/src/Microsoft.AspNet.Http.Features/ISession.cs +++ b/src/Microsoft.AspNet.Http.Features/ISession.cs @@ -1,20 +1,20 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http.Features { public interface ISession { - void Load(); + Task LoadAsync(); - void Commit(); + Task CommitAsync(); bool TryGetValue(string key, out byte[] value); - void Set(string key, ArraySegment value); + void Set(string key, byte[] value); void Remove(string key); diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs b/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs deleted file mode 100644 index 441f96eeb5..0000000000 --- a/src/Microsoft.AspNet.Http.Features/ISessionFactory.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http.Features -{ - public interface ISessionFactory - { - bool IsAvailable { get; } - - ISession Create(); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs index bd3a66883e..4406b8809f 100644 --- a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs @@ -3,11 +3,8 @@ namespace Microsoft.AspNet.Http.Features { - // TODO: Is there any reason not to flatten the Factory down into the Feature? public interface ISessionFeature { - ISessionFactory Factory { get; set; } - ISession Session { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs index df11f93766..1bc7c2e470 100644 --- a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. namespace Microsoft.AspNet.Http.Features diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 6090eed1b9..5dc1c96cfe 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -124,24 +124,27 @@ namespace Microsoft.AspNet.Http.Internal set { LifetimeFeature.RequestAborted = value; } } - public override ISessionCollection Session + public override ISession Session { get { var feature = SessionFeature; if (feature == null) { - throw new InvalidOperationException("Session has not been configured for this application or request."); + throw new InvalidOperationException("Session has not been configured for this application " + + "or request."); } - if (feature.Session == null) + return feature.Session; + } + set + { + var feature = SessionFeature; + if (feature == null) { - if (feature.Factory == null) - { - throw new InvalidOperationException("No ISessionFactory available to create the ISession."); - } - feature.Session = feature.Factory.Create(); + feature = new DefaultSessionFeature(); + _session.Update(_features, feature); } - return new SessionCollection(feature.Session); + feature.Session = value; } } diff --git a/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs new file mode 100644 index 0000000000..041794c7b5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs @@ -0,0 +1,14 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features.Internal +{ + /// + /// This type exists only for the purpose of unit testing where the user can directly set the + /// property without the need for creating a . + /// + public class DefaultSessionFeature : ISessionFeature + { + public ISession Session { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Http/SessionCollection.cs b/src/Microsoft.AspNet.Http/SessionCollection.cs deleted file mode 100644 index 8123e2fb0b..0000000000 --- a/src/Microsoft.AspNet.Http/SessionCollection.cs +++ /dev/null @@ -1,74 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Http.Internal -{ - public class SessionCollection : ISessionCollection - { - private readonly ISession _session; - - public SessionCollection(ISession session) - { - _session = session; - } - - public byte[] this[string key] - { - get - { - byte[] value; - TryGetValue(key, out value); - return value; - } - set - { - if (value == null) - { - Remove(key); - } - else - { - Set(key, new ArraySegment(value)); - } - } - } - - public bool TryGetValue(string key, out byte[] value) - { - return _session.TryGetValue(key, out value); - } - - public void Set(string key, ArraySegment value) - { - _session.Set(key, value); - } - - public void Remove(string key) - { - _session.Remove(key); - } - - public void Clear() - { - _session.Clear(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public IEnumerator> GetEnumerator() - { - foreach (var key in _session.Keys) - { - yield return new KeyValuePair(key, this[key]); - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3334f37142..b8a689a4d2 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -4,7 +4,6 @@ "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 0caea097ec..c8c1b0bc47 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -1,10 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Linq; using System.Security.Claims; +using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Xunit; @@ -12,6 +15,69 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContextTests { + [Fact] + public void GetOnSessionProperty_ThrowsOnMissingSessionFeature() + { + // Arrange + var context = new DefaultHttpContext(); + + // Act & Assert + var exception = Assert.Throws(() => context.Session); + Assert.Equal("Session has not been configured for this application or request.", exception.Message); + } + + [Fact] + public void GetOnSessionProperty_ReturnsAvailableSession() + { + // Arrange + var context = new DefaultHttpContext(); + var session = new TestSession(); + session.Set("key1", null); + session.Set("key2", null); + var feature = new BlahSessionFeature(); + feature.Session = session; + context.SetFeature(feature); + + // Act & Assert + Assert.Same(session, context.Session); + context.Session.Set("key3", null); + Assert.Equal(3, context.Session.Keys.Count()); + } + + [Fact] + public void AllowsSettingSession_WithoutSettingUpSessionFeature_Upfront() + { + // Arrange + var session = new TestSession(); + var context = new DefaultHttpContext(); + + // Act + context.Session = session; + + // Assert + Assert.Same(session, context.Session); + } + + [Fact] + public void SettingSession_OverridesAvailableSession() + { + // Arrange + var context = new DefaultHttpContext(); + var session = new TestSession(); + session.Set("key1", null); + session.Set("key2", null); + var feature = new BlahSessionFeature(); + feature.Session = session; + context.SetFeature(feature); + + // Act + context.Session = new TestSession(); + + // Assert + Assert.NotSame(session, context.Session); + Assert.Empty(context.Session.Keys); + } + [Fact] public void EmptyUserIsNeverNull() { @@ -73,5 +139,48 @@ namespace Microsoft.AspNet.Http.Internal var context = new DefaultHttpContext(); return context; } + + private class TestSession : ISession + { + private Dictionary _store + = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public IEnumerable Keys { get { return _store.Keys; } } + + public void Clear() + { + _store.Clear(); + } + + public Task CommitAsync() + { + return Task.FromResult(0); + } + + public Task LoadAsync() + { + return Task.FromResult(0); + } + + public void Remove(string key) + { + _store.Remove(key); + } + + public void Set(string key, byte[] value) + { + _store[key] = value; + } + + public bool TryGetValue(string key, out byte[] value) + { + return _store.TryGetValue(key, out value); + } + } + + private class BlahSessionFeature : ISessionFeature + { + public ISession Session { get; set; } + } } } \ No newline at end of file From 40cfc238fe9f855645107d4a7c057deb29e899ce Mon Sep 17 00:00:00 2001 From: Henk Mollema Date: Thu, 4 Jun 2015 14:54:30 +0200 Subject: [PATCH 0640/1838] Use nameof operator --- .../Extensions/MapExtensions.cs | 2 +- .../FragmentString.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/PathString.cs | 2 +- .../QueryString.cs | 2 +- src/Microsoft.AspNet.Http/ReferenceReadStream.cs | 2 +- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 2 +- .../WebSockets/OwinWebSocketAdapter.cs | 4 ++-- .../BufferedReadStream.cs | 2 +- .../MultipartReaderStream.cs | 4 ++-- src/Microsoft.AspNet.WebUtilities/WebEncoders.cs | 4 ++-- .../ContentDispositionHeaderValue.cs | 4 ++-- .../ContentRangeHeaderValue.cs | 12 ++++++------ .../EntityTagHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 2 +- src/Microsoft.Net.Http.Headers/ObjectCollection.cs | 2 +- .../RangeConditionHeaderValue.cs | 2 +- .../RangeItemHeaderValue.cs | 6 +++--- .../StringWithQualityHeaderValue.cs | 2 +- 19 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 8885632152..3af199d519 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Builder { if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) { - throw new ArgumentException("The path must not end with a '/'", "pathMatch"); + throw new ArgumentException("The path must not end with a '/'", nameof(pathMatch)); } // create branch diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 3e5544407b..794b800b63 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Http { if (!string.IsNullOrEmpty(value) && value[0] != '#') { - throw new ArgumentException("The leading '#' must be included for a non-empty fragment.", "value"); + throw new ArgumentException("The leading '#' must be included for a non-empty fragment.", nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 7bc00e6ab1..62cfd74bd6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Http { if (!String.IsNullOrEmpty(value) && value[0] != '/') { - throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, "value"); + throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 7ad1300622..8717638aa5 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.Http { if (!string.IsNullOrEmpty(value) && value[0] != '?') { - throw new ArgumentException("The leading '?' must be included for a non-empty query.", "value"); + throw new ArgumentException("The leading '?' must be included for a non-empty query.", nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 6fa2c34f04..87f2959eef 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Http.Internal ThrowIfDisposed(); if (value < 0 || value > Length) { - throw new ArgumentOutOfRangeException("value", value, "The Position must be within the length of the Stream: " + Length); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be within the length of the Stream: " + Length); } VerifyPosition(); _position = value; diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 96102f6bf4..b96396f73a 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,11 +37,11 @@ namespace Microsoft.AspNet.Owin { if (context.GetFeature() == null) { - throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", nameof(context)); } if (context.GetFeature() == null) { - throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", "context"); + throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", nameof(context)); } _context = context; diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index b54f38b69a..ec50c50928 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -411,7 +411,7 @@ namespace Microsoft.AspNet.Owin { if (arrayIndex < 0 || arrayIndex > array.Length) { - throw new ArgumentOutOfRangeException("arrayIndex", arrayIndex, string.Empty); + throw new ArgumentOutOfRangeException(nameof(arrayIndex), arrayIndex, string.Empty); } var keys = Keys; if (keys.Count > array.Length - arrayIndex) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs index bdaeef8eda..4a7a056463 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.Owin case 0x8: return WebSocketMessageType.Close; default: - throw new ArgumentOutOfRangeException("messageType", messageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(messageType), messageType, string.Empty); } } @@ -184,7 +184,7 @@ namespace Microsoft.AspNet.Owin case WebSocketMessageType.Close: return 0x8; default: - throw new ArgumentOutOfRangeException("webSocketMessageType", webSocketMessageType, string.Empty); + throw new ArgumentOutOfRangeException(nameof(webSocketMessageType), webSocketMessageType, string.Empty); } } } diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 0b3ec59363..94bb03efce 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -64,7 +64,7 @@ namespace Microsoft.AspNet.WebUtilities { if (value < 0) { - throw new ArgumentOutOfRangeException("value", value, "Position must be positive."); + throw new ArgumentOutOfRangeException(nameof(value), value, "Position must be positive."); } if (value == Position) { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 02d99a33d4..5e3059280d 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -70,11 +70,11 @@ namespace Microsoft.AspNet.WebUtilities { if (value < 0) { - throw new ArgumentOutOfRangeException("value", value, "The Position must be positive."); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be positive."); } if (value > _observedLength) { - throw new ArgumentOutOfRangeException("value", value, "The Position must be less than length."); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be less than length."); } _position = value; if (_position < _observedLength) diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index bef8b5463a..132f106e07 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -175,11 +175,11 @@ namespace Microsoft.AspNet.WebUtilities { if (offset < 0) { - throw new ArgumentOutOfRangeException("offset"); + throw new ArgumentOutOfRangeException(nameof(offset)); } if (count < 0) { - throw new ArgumentOutOfRangeException("count"); + throw new ArgumentOutOfRangeException(nameof(count)); } if (bufferLength - offset < count) { diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index b6b1aabe8c..25fe03cd9a 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -127,7 +127,7 @@ namespace Microsoft.Net.Http.Headers } else if (value < 0) { - throw new ArgumentOutOfRangeException("value"); + throw new ArgumentOutOfRangeException(nameof(value)); } else if (sizeParameter != null) { @@ -656,7 +656,7 @@ namespace Microsoft.Net.Http.Headers { if ((index < 0) || (index >= pattern.Length)) { - throw new ArgumentOutOfRangeException("index"); + throw new ArgumentOutOfRangeException(nameof(index)); } if ((pattern[index] == '%') && (pattern.Length - index >= 3)) diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index 634278e3a9..abce604280 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -29,15 +29,15 @@ namespace Microsoft.Net.Http.Headers if (length < 0) { - throw new ArgumentOutOfRangeException("length"); + throw new ArgumentOutOfRangeException(nameof(length)); } if ((to < 0) || (to > length)) { - throw new ArgumentOutOfRangeException("to"); + throw new ArgumentOutOfRangeException(nameof(to)); } if ((from < 0) || (from > to)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(from)); } _from = from; @@ -52,7 +52,7 @@ namespace Microsoft.Net.Http.Headers if (length < 0) { - throw new ArgumentOutOfRangeException("length"); + throw new ArgumentOutOfRangeException(nameof(length)); } _length = length; @@ -65,11 +65,11 @@ namespace Microsoft.Net.Http.Headers if (to < 0) { - throw new ArgumentOutOfRangeException("to"); + throw new ArgumentOutOfRangeException(nameof(to)); } if ((from < 0) || (from > to)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(@from)); } _from = from; diff --git a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs index 4cc5c38dfa..216fa942a8 100644 --- a/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/EntityTagHeaderValue.cs @@ -39,7 +39,7 @@ namespace Microsoft.Net.Http.Headers { if (string.IsNullOrEmpty(tag)) { - throw new ArgumentException("An empty string is not allowed.", "tag"); + throw new ArgumentException("An empty string is not allowed.", nameof(tag)); } int length = 0; diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index d344d992aa..e42240a1dd 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -27,7 +27,7 @@ namespace Microsoft.Net.Http.Headers // value. if ((value < 0) || (value > 1)) { - throw new ArgumentOutOfRangeException("value"); + throw new ArgumentOutOfRangeException(nameof(value)); } var qualityString = ((double)value).ToString("0.0##", NumberFormatInfo.InvariantInfo); diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index 6ec2883d3b..90e7718c4c 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers // null values cannot be added to the collection. if (item == null) { - throw new ArgumentNullException("item"); + throw new ArgumentNullException(nameof(item)); } } } diff --git a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs index 189d775d61..c564722d51 100644 --- a/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeConditionHeaderValue.cs @@ -28,7 +28,7 @@ namespace Microsoft.Net.Http.Headers { if (entityTag == null) { - throw new ArgumentNullException("entityTag"); + throw new ArgumentNullException(nameof(entityTag)); } _entityTag = entityTag; diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index f4893ba5dc..772a1c923a 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -21,15 +21,15 @@ namespace Microsoft.Net.Http.Headers } if (from.HasValue && (from.Value < 0)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(from)); } if (to.HasValue && (to.Value < 0)) { - throw new ArgumentOutOfRangeException("to"); + throw new ArgumentOutOfRangeException(nameof(to)); } if (from.HasValue && to.HasValue && (from.Value > to.Value)) { - throw new ArgumentOutOfRangeException("from"); + throw new ArgumentOutOfRangeException(nameof(from)); } _from = from; diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index e845c84fe8..ab33ba4a0f 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -36,7 +36,7 @@ namespace Microsoft.Net.Http.Headers if ((quality < 0) || (quality > 1)) { - throw new ArgumentOutOfRangeException("quality"); + throw new ArgumentOutOfRangeException(nameof(quality)); } _value = value; From a79b05bf2400809778b77440fbf683bd422a891c Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 12 Jun 2015 12:59:07 -0700 Subject: [PATCH 0641/1838] #320 Rename OnSendingHeaders to OnResponseStarting and HeadersSent to HasStarted. --- src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs | 4 ++-- .../IHttpResponseFeature.cs | 4 ++-- src/Microsoft.AspNet.Http/DefaultHttpResponse.cs | 8 ++++---- src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs | 4 ++-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 +- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index a3317f873d..a0a92fb823 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -22,9 +22,9 @@ namespace Microsoft.AspNet.Http public abstract IResponseCookies Cookies { get; } - public abstract bool HeadersSent { get; } + public abstract bool HasStarted { get; } - public abstract void OnSendingHeaders(Action callback, object state); + public abstract void OnResponseStarting(Action callback, object state); public abstract void OnResponseCompleted(Action callback, object state); diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index e93a9d1c03..9057a9991f 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -13,8 +13,8 @@ namespace Microsoft.AspNet.Http.Features string ReasonPhrase { get; set; } IDictionary Headers { get; set; } Stream Body { get; set; } - bool HeadersSent { get; } - void OnSendingHeaders(Action callback, object state); + bool HasStarted { get; } + void OnResponseStarting(Action callback, object state); void OnResponseCompleted(Action callback, object state); } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index d264ff97a3..2f38ac9cbe 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -89,14 +89,14 @@ namespace Microsoft.AspNet.Http.Internal get { return ResponseCookiesFeature.Cookies; } } - public override bool HeadersSent + public override bool HasStarted { - get { return HttpResponseFeature.HeadersSent; } + get { return HttpResponseFeature.HasStarted; } } - public override void OnSendingHeaders(Action callback, object state) + public override void OnResponseStarting(Action callback, object state) { - HttpResponseFeature.OnSendingHeaders(callback, state); + HttpResponseFeature.OnResponseStarting(callback, state); } public override void OnResponseCompleted(Action callback, object state) diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 70b9128737..5e32a938be 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -24,12 +24,12 @@ namespace Microsoft.AspNet.Http.Features.Internal public Stream Body { get; set; } - public bool HeadersSent + public bool HasStarted { get { return false; } } - public void OnSendingHeaders(Action callback, object state) + public void OnResponseStarting(Action callback, object state) { throw new NotSupportedException(); } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index b96396f73a..0f5237ffbd 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Owin { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnSendingHeaders)) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnResponseStarting)) }, { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index ec50c50928..c4030d9ed6 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -142,12 +142,12 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseBody, value); } } - bool IHttpResponseFeature.HeadersSent + bool IHttpResponseFeature.HasStarted { get { return _headersSent; } } - void IHttpResponseFeature.OnSendingHeaders(Action callback, object state) + void IHttpResponseFeature.OnResponseStarting(Action callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); if (register == null) From c2b638d85bfb253df3e8e711f19b7d8e45017de1 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 12 Jun 2015 14:38:03 -0700 Subject: [PATCH 0642/1838] React to OnSendingHeaders rename. --- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 14 +++++++------- .../ResponseFeatureTests.cs | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index b582e028a9..7ae2111959 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.TestHost { internal class ResponseFeature : IHttpResponseFeature { - private Action _sendingHeaders = () => { }; + private Action _responseStarting = () => { }; private Action _responseCompleted = () => { }; public ResponseFeature() @@ -31,12 +31,12 @@ namespace Microsoft.AspNet.TestHost public Stream Body { get; set; } - public bool HeadersSent { get; set; } + public bool HasStarted { get; set; } - public void OnSendingHeaders(Action callback, object state) + public void OnResponseStarting(Action callback, object state) { - var prior = _sendingHeaders; - _sendingHeaders = () => + var prior = _responseStarting; + _responseStarting = () => { callback(state); prior(); @@ -55,8 +55,8 @@ namespace Microsoft.AspNet.TestHost public void FireOnSendingHeaders() { - _sendingHeaders(); - HeadersSent = true; + _responseStarting(); + HasStarted = true; } public void FireOnResponseCompleted() diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs index f2c32ef0ca..c3e4b85021 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs @@ -15,11 +15,11 @@ namespace Microsoft.AspNet.TestHost // Assert Assert.Equal(200, responseInformation.StatusCode); - Assert.False(responseInformation.HeadersSent); + Assert.False(responseInformation.HasStarted); responseInformation.FireOnSendingHeaders(); - Assert.True(responseInformation.HeadersSent); + Assert.True(responseInformation.HasStarted); } } } \ No newline at end of file From 736e6bee2ba5ab5ed5d8da49f68d698e4f077369 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 15 Jun 2015 11:11:08 -0700 Subject: [PATCH 0643/1838] #233 Create the wwwroot directory if it doesn't exist. --- src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index a6cd1d5abf..98a839afdc 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.IO; using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Hosting.Internal; @@ -11,6 +12,10 @@ namespace Microsoft.AspNet.Hosting public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, string environmentName) { hostingEnvironment.WebRootPath = HostingUtilities.GetWebRoot(applicationBasePath); + if (!Directory.Exists(hostingEnvironment.WebRootPath)) + { + Directory.CreateDirectory(hostingEnvironment.WebRootPath); + } hostingEnvironment.WebRootFileProvider = new PhysicalFileProvider(hostingEnvironment.WebRootPath); hostingEnvironment.EnvironmentName = environmentName ?? hostingEnvironment.EnvironmentName; } From af6a17710b4e7f0b0165e4beb02d61cbad6e9da2 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 16 Jun 2015 16:26:37 -0700 Subject: [PATCH 0644/1838] #310 Refactor IRequestIdentifierFeature. --- ...re.cs => IHttpRequestIdentifierFeature.cs} | 4 ++-- .../Features/HttpRequestIdentifierFeature.cs | 10 ++++++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 9 ++++++--- .../OwinFeatureCollection.cs | 20 +++++-------------- 4 files changed, 23 insertions(+), 20 deletions(-) rename src/Microsoft.AspNet.Http.Features/{IRequestIdentifierFeature.cs => IHttpRequestIdentifierFeature.cs} (80%) create mode 100644 src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs similarity index 80% rename from src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs rename to src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs index b34afe8f96..163988d832 100644 --- a/src/Microsoft.AspNet.Http.Features/IRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs @@ -8,11 +8,11 @@ namespace Microsoft.AspNet.Http.Features /// /// Feature to identify a request. /// - public interface IRequestIdentifierFeature + public interface IHttpRequestIdentifierFeature { /// /// Identifier to trace a request. /// - Guid TraceIdentifier { get; } + string TraceIdentifier { get; set; } } } diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs new file mode 100644 index 0000000000..01dd9d0ee5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features.Internal +{ + public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature + { + public string TraceIdentifier { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 0f5237ffbd..5d1f95119c 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -15,6 +15,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; @@ -80,6 +81,11 @@ namespace Microsoft.AspNet.Owin { OwinConstants.Security.User, new FeatureMap(feature => feature.User, ()=> null, (feature, value) => feature.User = Utilities.MakeClaimsPrincipal((IPrincipal)value), () => new HttpAuthenticationFeature()) + }, + + { OwinConstants.RequestId, new FeatureMap(feature => feature.TraceIdentifier, + ()=> null, (feature, value) => feature.TraceIdentifier = (string)value, + () => new HttpRequestIdentifierFeature()) } }; @@ -113,9 +119,6 @@ namespace Microsoft.AspNet.Owin } _context.Items[typeof(HttpContext).FullName] = _context; // Store for lookup when we transition back out of OWIN - - // The request identifier is a string per the spec. - _entries[OwinConstants.RequestId] = new FeatureMap(feature => feature.TraceIdentifier.ToString()); } // Public in case there's a new/custom feature interface that needs to be added. diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index c4030d9ed6..b7e6598383 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -30,11 +30,11 @@ namespace Microsoft.AspNet.Owin IHttpConnectionFeature, IHttpSendFileFeature, ITlsConnectionFeature, + IHttpRequestIdentifierFeature, IHttpRequestLifetimeFeature, IHttpAuthenticationFeature, IHttpWebSocketFeature, - IOwinEnvironmentFeature, - IRequestIdentifierFeature + IOwinEnvironmentFeature { public IDictionary Environment { get; set; } private bool _headersSent; @@ -435,20 +435,10 @@ namespace Microsoft.AspNet.Owin get { return true; } } - Guid IRequestIdentifierFeature.TraceIdentifier + string IHttpRequestIdentifierFeature.TraceIdentifier { - get - { - var requestId = Prop(OwinConstants.RequestId); - Guid requestIdentifier; - - if (requestId != null && Guid.TryParse(requestId, out requestIdentifier)) - { - return requestIdentifier; - } - - return Guid.Empty; - } + get { return Prop(OwinConstants.RequestId); } + set { Prop(OwinConstants.RequestId, value); } } public bool Remove(KeyValuePair item) From 2c43b350b41ada2358269312bfe20c9d0764c25a Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 18 Jun 2015 15:38:58 -0700 Subject: [PATCH 0645/1838] React to IRequestIdentifierFeature refactor. --- .../DefaultRequestIdentifierFeature.cs | 18 ------------------ .../Internal/HostingEngine.cs | 10 +++++++--- .../HostingEngineTests.cs | 11 ++++++----- 3 files changed, 13 insertions(+), 26 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs deleted file mode 100644 index 07d1f11442..0000000000 --- a/src/Microsoft.AspNet.Hosting/DefaultRequestIdentifierFeature.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Hosting -{ - public class DefaultRequestIdentifierFeature : IRequestIdentifierFeature - { - public DefaultRequestIdentifierFeature() - { - TraceIdentifier = Guid.NewGuid(); - } - - public Guid TraceIdentifier { get; } - } -} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index fd70f5840f..04b77d4113 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -11,6 +11,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Internal; @@ -158,12 +159,15 @@ namespace Microsoft.AspNet.Hosting.Internal return builder.Build(); } - private Guid GetRequestIdentifier(HttpContext httpContext) + private string GetRequestIdentifier(HttpContext httpContext) { - var requestIdentifierFeature = httpContext.GetFeature(); + var requestIdentifierFeature = httpContext.GetFeature(); if (requestIdentifierFeature == null) { - requestIdentifierFeature = new DefaultRequestIdentifierFeature(); + requestIdentifierFeature = new HttpRequestIdentifierFeature() + { + TraceIdentifier = Guid.NewGuid().ToString() + }; httpContext.SetFeature(requestIdentifierFeature); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 8c16801d1d..de7782c4dc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Testing.xunit; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; @@ -241,7 +242,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.GetFeature()); + Assert.IsType(httpContext.GetFeature()); } [Fact] @@ -270,7 +271,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.GetFeature()); + Assert.IsType(httpContext.GetFeature()); } [Fact] @@ -283,8 +284,8 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var requestIdentifierFeature = new Mock().Object; - _featuresSupportedByThisHost.Add(typeof(IRequestIdentifierFeature), requestIdentifierFeature); + var requestIdentifierFeature = new Mock().Object; + _featuresSupportedByThisHost.Add(typeof(IHttpRequestIdentifierFeature), requestIdentifierFeature); var hostingEngine = CreateHostingEngine(requestDelegate); // Act @@ -292,7 +293,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.Same(requestIdentifierFeature, httpContext.GetFeature()); + Assert.Same(requestIdentifierFeature, httpContext.GetFeature()); } [Fact] From 98f8bf6fd380df2992cb822fae0088fe9c0882b8 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 19 Jun 2015 15:04:42 -0700 Subject: [PATCH 0646/1838] #296 Keep the process alive long enough to shutdown gracefully. --- src/Microsoft.AspNet.Hosting/Program.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 6004d8e50f..2ef0635d6f 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Hosting public void Main(string[] args) { - // Allow the location of the ini file to be specfied via a --config command line arg + // Allow the location of the ini file to be specified via a --config command line arg var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); var tempConfig = tempBuilder.Build(); var configFilePath = tempConfig[ConfigFileKey] ?? HostingIniFile; @@ -39,7 +39,12 @@ namespace Microsoft.AspNet.Hosting { Console.WriteLine("Started"); var appShutdownService = host.ApplicationServices.GetRequiredService(); - Console.CancelKeyPress += delegate { appShutdownService.RequestShutdown(); }; + Console.CancelKeyPress += (sender, eventArgs) => + { + appShutdownService.RequestShutdown(); + // Don't terminate the process immediately, wait for the Main thread to exit gracefully. + eventArgs.Cancel = true; + }; appShutdownService.ShutdownRequested.WaitHandle.WaitOne(); } } From 1abb33d4bc3748782de554a0d90e37c19fd21733 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 16 Jun 2015 09:14:37 -0700 Subject: [PATCH 0647/1838] Adding a couple mono tests back in --- .../RangeConditionHeaderValueTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs index 1f69a9605e..ce7c73997b 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/RangeConditionHeaderValueTest.cs @@ -112,7 +112,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] @@ -141,7 +141,7 @@ namespace Microsoft.Net.Http.Headers [InlineData("Sun, 06 Nov 1994 08:49:37 GMT \"x\"")] [InlineData(null)] [InlineData("")] - // [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] // Succeeds on Mono. + [InlineData(" Wed 09 Nov 1994 08:49:37 GMT")] [InlineData("\"x")] [InlineData("Wed, 09 Nov")] [InlineData("W/Wed 09 Nov 1994 08:49:37 GMT")] From 0013d44167dda56996d5f3c6cf0dfec64a01eed3 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 23 Jun 2015 10:58:16 -0700 Subject: [PATCH 0648/1838] Change hardcoded `bash` shebang to `env` - aspnet/Home#695 - support various `bash` installation locations - in particular, enable building on FreeBSD --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index d81164353c..3ef874f9bd 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild From c83ff60275670282c2b19741669dc25e63477162 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 23 Jun 2015 10:58:52 -0700 Subject: [PATCH 0649/1838] Change hardcoded `bash` shebang to `env` - aspnet/Home#695 - support various `bash` installation locations - in particular, enable building on FreeBSD --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index d81164353c..3ef874f9bd 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild From ee8baab1ed725cbce97e8daccd5ee7dbacad51b5 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 23 Jun 2015 13:44:06 -0700 Subject: [PATCH 0650/1838] Nuke RequestServicesContainer (inline instead) --- .../Internal/RequestServicesContainer.cs | 114 ------------------ .../RequestServicesContainerMiddleware.cs | 33 ++++- .../HostingEngineTests.cs | 1 + .../TestServerTests.cs | 53 +++++++- 4 files changed, 82 insertions(+), 119 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs deleted file mode 100644 index a4ab07d546..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainer.cs +++ /dev/null @@ -1,114 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http; -using Microsoft.Framework.DependencyInjection; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public class RequestServicesContainer : IDisposable - { - public RequestServicesContainer( - HttpContext context, - IServiceScopeFactory scopeFactory, - IServiceProvider appServiceProvider) - { - if (scopeFactory == null) - { - throw new ArgumentNullException(nameof(scopeFactory)); - } - if (context == null) - { - throw new ArgumentNullException(nameof(context)); - } - - Context = context; - PriorAppServices = context.ApplicationServices; - PriorRequestServices = context.RequestServices; - - // Begin the scope - Scope = scopeFactory.CreateScope(); - - Context.ApplicationServices = appServiceProvider; - Context.RequestServices = Scope.ServiceProvider; - } - - private HttpContext Context { get; set; } - private IServiceProvider PriorAppServices { get; set; } - private IServiceProvider PriorRequestServices { get; set; } - private IServiceScope Scope { get; set; } - - // CONSIDER: this could be an extension method on HttpContext instead - public static RequestServicesContainer EnsureRequestServices(HttpContext httpContext, IServiceProvider services) - { - // All done if we already have a request services - if (httpContext.RequestServices != null) - { - return null; - } - - var serviceProvider = httpContext.ApplicationServices ?? services; - if (serviceProvider == null) - { - throw new InvalidOperationException("TODO: services and httpContext.ApplicationServices are both null!"); - } - - // Matches constructor of RequestContainer - var rootServiceProvider = serviceProvider.GetRequiredService(); - var rootServiceScopeFactory = serviceProvider.GetRequiredService(); - - // Pre Scope setup - var priorApplicationServices = serviceProvider; - var priorRequestServices = serviceProvider; - - var appServiceProvider = rootServiceProvider; - var appServiceScopeFactory = rootServiceScopeFactory; - - if (priorApplicationServices != null && - priorApplicationServices != appServiceProvider) - { - appServiceProvider = priorApplicationServices; - appServiceScopeFactory = priorApplicationServices.GetRequiredService(); - } - - // Creates the scope and does the service swaps - return new RequestServicesContainer(httpContext, appServiceScopeFactory, appServiceProvider); - } - -#region IDisposable Support - private bool disposedValue = false; // To detect redundant calls - - protected virtual void Dispose(bool disposing) - { - if (!disposedValue) - { - if (disposing) - { - Context.RequestServices = PriorRequestServices; - Context.ApplicationServices = PriorAppServices; - } - - if (Scope != null) - { - Scope.Dispose(); - Scope = null; - } - - Context = null; - PriorAppServices = null; - PriorRequestServices = null; - - disposedValue = true; - } - } - - // This code added to correctly implement the disposable pattern. - public void Dispose() - { - // Do not change this code. Put cleanup code in Dispose(bool disposing) above. - Dispose(true); - } -#endregion - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs index 0a0d169dcb..9c740ba7f1 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -5,6 +5,8 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; +using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Internal { @@ -13,18 +15,41 @@ namespace Microsoft.AspNet.Hosting.Internal private readonly RequestDelegate _next; private readonly IServiceProvider _services; - public RequestServicesContainerMiddleware(RequestDelegate next, IServiceProvider services) + public RequestServicesContainerMiddleware([NotNull] RequestDelegate next, [NotNull] IServiceProvider services) { _services = services; _next = next; } - public async Task Invoke(HttpContext httpContext) + public async Task Invoke([NotNull] HttpContext httpContext) { - using (var container = RequestServicesContainer.EnsureRequestServices(httpContext, _services)) + // All done if there request services is set + if (httpContext.RequestServices != null) { await _next.Invoke(httpContext); + return; + } + + var priorApplicationServices = httpContext.ApplicationServices; + var serviceProvider = priorApplicationServices ?? _services; + var scopeFactory = serviceProvider.GetRequiredService(); + + try + { + // Creates the scope and temporarily swap services + using (var scope = scopeFactory.CreateScope()) + { + httpContext.ApplicationServices = serviceProvider; + httpContext.RequestServices = scope.ServiceProvider; + + await _next.Invoke(httpContext); + } + } + finally + { + httpContext.RequestServices = null; + httpContext.ApplicationServices = priorApplicationServices; } } } -} +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index de7782c4dc..b9f0d6a442 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -8,6 +8,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 23ae59567b..d1dbcb93e1 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -8,6 +8,7 @@ using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; @@ -55,10 +56,60 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("RequestServices:True", result); } + public class TestService { } + + public class TestRequestServiceMiddleware + { + private RequestDelegate _next; + + public TestRequestServiceMiddleware(RequestDelegate next) + { + _next = next; + } + + public Task Invoke(HttpContext httpContext) + { + var services = new ServiceCollection(); + services.AddTransient(); + httpContext.RequestServices = services.BuildServiceProvider(); + + return _next.Invoke(httpContext); + } + } + + public class RequestServicesFilter : IStartupFilter + { + public Action Configure(IApplicationBuilder app, Action next) + { + return builder => + { + app.UseMiddleware(); + next(builder); + }; + } + } + + [Fact] + public async Task ExistingRequestServicesWillNotBeReplaced() + { + var server = TestServer.Create(app => + { + app.Run(context => + { + var service = context.RequestServices.GetService(); + return context.Response.WriteAsync("Found:" + (service != null)); + }); + }, + services => services.AddTransient()); + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("Found:True", result); + } + + [Fact] public async Task CanAccessLogger() { - TestServer server = TestServer.Create(app => + var server = TestServer.Create(app => { app.Run(context => { From 12b78a31bf1bc9df893ca93252cded57654e19c0 Mon Sep 17 00:00:00 2001 From: Mikael Mengistu Date: Fri, 19 Jun 2015 12:32:53 -0700 Subject: [PATCH 0651/1838] Added more tests and error handling for construction of middleware classes #236 --- .../Extensions/UseMiddlewareExtensions.cs | 34 ++++- .../Properties/AssemblyInfo.cs | 4 +- .../Properties/Resources.Designer.cs | 110 ++++++++++++++ .../Resources.resx | 135 ++++++++++++++++++ .../UseMiddlewareTest.cs | 112 +++++++++++++++ 5 files changed, 388 insertions(+), 7 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs create mode 100644 src/Microsoft.AspNet.Http.Abstractions/Resources.resx create mode 100644 test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index b247ab3cac..04430164df 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -6,12 +6,14 @@ using System.Linq; using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Abstractions; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { public static class UseMiddlewareExtensions { + const string InvokeMethodName = "Invoke"; public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) { return builder.UseMiddleware(typeof(T), args); @@ -22,24 +24,44 @@ namespace Microsoft.AspNet.Builder var applicationServices = builder.ApplicationServices; return builder.Use(next => { - var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); - var methodinfo = middleware.GetMethod("Invoke", BindingFlags.Instance | BindingFlags.Public); - var parameters = methodinfo.GetParameters(); - if (parameters[0].ParameterType != typeof(HttpContext)) + var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); + var invokeMethods = methods.Where(m => string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)).ToArray(); + if (invokeMethods.Length > 1) { - throw new Exception("Middleware Invoke method must take first argument of HttpContext"); + throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName)); } + + if (invokeMethods.Length == 0) + { + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName)); + } + + var methodinfo = invokeMethods[0]; + if (!typeof(Task).IsAssignableFrom(methodinfo.ReturnType)) + { + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNonTaskReturnType(InvokeMethodName, nameof(Task))); + } + + var parameters = methodinfo.GetParameters(); + if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext)) + { + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName,nameof(HttpContext))); + } + + var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); if (parameters.Length == 1) { return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); } + return context => { var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; if (serviceProvider == null) { - throw new Exception("IServiceProvider is not available"); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); } + var arguments = new object[parameters.Length]; arguments[0] = context; for(var index = 1; index != parameters.Length; ++index) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index 025a94598c..2565f9261e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Runtime.CompilerServices; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs new file mode 100644 index 0000000000..9fb86a30c6 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs @@ -0,0 +1,110 @@ +// +namespace Microsoft.AspNet.Http.Abstractions +{ + using System.Globalization; + using System.Reflection; + using System.Resources; + + internal static class Resources + { + private static readonly ResourceManager _resourceManager + = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); + + /// + /// '{0}' is not available. + /// + internal static string Exception_UseMiddlewareIServiceProviderNotAvailable + { + get { return GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"); } + } + + /// + /// '{0}' is not available. + /// + internal static string FormatException_UseMiddlewareIServiceProviderNotAvailable(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareIServiceProviderNotAvailable"), p0); + } + + /// + /// No public '{0}' method found. + /// + internal static string Exception_UseMiddlewareNoInvokeMethod + { + get { return GetString("Exception_UseMiddlewareNoInvokeMethod"); } + } + + /// + /// No public '{0}' method found. + /// + internal static string FormatException_UseMiddlewareNoInvokeMethod(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoInvokeMethod"), p0); + } + + /// + /// '{0}' does not return an object of type '{1}'. + /// + internal static string Exception_UseMiddlewareNonTaskReturnType + { + get { return GetString("Exception_UseMiddlewareNonTaskReturnType"); } + } + + /// + /// '{0}' does not return an object of type '{1}'. + /// + internal static string FormatException_UseMiddlewareNonTaskReturnType(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNonTaskReturnType"), p0, p1); + } + + /// + /// The '{0}' method's first argument must be of type '{1}'. + /// + internal static string Exception_UseMiddlewareNoParameters + { + get { return GetString("Exception_UseMiddlewareNoParameters"); } + } + + /// + /// The '{0}' method's first argument must be of type '{1}'. + /// + internal static string FormatException_UseMiddlewareNoParameters(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddlewareNoParameters"), p0, p1); + } + + /// + /// Multiple public '{0}' methods are available. + /// + internal static string Exception_UseMiddleMutlipleInvokes + { + get { return GetString("Exception_UseMiddleMutlipleInvokes"); } + } + + /// + /// Multiple public '{0}' methods are available. + /// + internal static string FormatException_UseMiddleMutlipleInvokes(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0); + } + + private static string GetString(string name, params string[] formatterNames) + { + var value = _resourceManager.GetString(name); + + System.Diagnostics.Debug.Assert(value != null); + + if (formatterNames != null) + { + for (var i = 0; i < formatterNames.Length; i++) + { + value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); + } + } + + return value; + } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx new file mode 100644 index 0000000000..bdd74fd6de --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + '{0}' is not available. + + + No public '{0}' method found. + + + '{0}' does not return an object of type '{1}'. + + + The '{0}' method's first argument must be of type '{1}'. + + + Multiple public '{0}' methods are available. + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs new file mode 100644 index 0000000000..1839631d61 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -0,0 +1,112 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Builder.Internal; +using Microsoft.AspNet.Http.Abstractions; +using Xunit; + +namespace Microsoft.AspNet.Http +{ + public class UseMiddlewareTest + { + [Fact] + public void UseMiddleware_WithNoParameters_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareNoParametersStub)); + var exception = Assert.Throws(() => builder.Build()); + + Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke",nameof(HttpContext)), exception.Message); + } + + [Fact] + public void UseMiddleware_NonTaskReturnType_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareNonTaskReturnStub)); + var exception = Assert.Throws(() => builder.Build()); + Assert.Equal(Resources.FormatException_UseMiddlewareNonTaskReturnType("Invoke", nameof(Task)), exception.Message); + } + + [Fact] + public void UseMiddleware_NoInvokeMethod_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareNoInvokeStub)); + var exception = Assert.Throws(() => builder.Build()); + Assert.Equal(Resources.FormatException_UseMiddlewareNoInvokeMethod("Invoke"), exception.Message); + } + + [Fact] + public void UseMiddleware_MutlipleInvokeMethods_ThrowsException() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareMultipleInvokesStub)); + var exception = Assert.Throws(() => builder.Build()); + Assert.Equal(Resources.FormatException_UseMiddleMutlipleInvokes("Invoke"), exception.Message); + } + + private class DummyServiceProvider : IServiceProvider + { + public object GetService(Type serviceType) + { + return null; + } + } + + private class MiddlewareNoParametersStub + { + public MiddlewareNoParametersStub(RequestDelegate next) + { + } + + public Task Invoke() + { + return Task.FromResult(0); + } + } + + private class MiddlewareNonTaskReturnStub + { + public MiddlewareNonTaskReturnStub(RequestDelegate next) + { + } + + public int Invoke() + { + return 0; + } + } + + private class MiddlewareNoInvokeStub + { + public MiddlewareNoInvokeStub(RequestDelegate next) + { + } + } + + private class MiddlewareMultipleInvokesStub + { + public MiddlewareMultipleInvokesStub(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context) + { + return Task.FromResult(0); + } + + public Task Invoke(HttpContext context, int i) + { + return Task.FromResult(0); + } + } + } +} \ No newline at end of file From 652d885402c204e468c22baf46d118c7ec8ca86c Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 25 Jun 2015 09:34:14 -0700 Subject: [PATCH 0652/1838] #177 Immutable HeaderValue objects. --- .../HeaderUtilities.cs | 8 +++ .../MediaTypeHeaderValue.cs | 61 +++++++++++++++--- .../NameValueHeaderValue.cs | 26 +++++++- .../ObjectCollection.cs | 64 +++++++++++++++---- src/Microsoft.Net.Http.Headers/project.json | 1 + .../project.json | 2 +- .../MediaTypeHeaderValueTest.cs | 51 +++++++++++++-- .../NameValueHeaderValueTest.cs | 56 ++++++++++++++-- 8 files changed, 233 insertions(+), 36 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index e42240a1dd..630e02b93f 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -228,5 +228,13 @@ namespace Microsoft.Net.Http.Headers } return input; } + + internal static void ThrowIfReadOnly(bool isReadOnly) + { + if (isReadOnly) + { + throw new InvalidOperationException("The object cannot be modified because it is read-only."); + } + } } } diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 173bf7c404..968eb4c6cc 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; +using System.Linq; using System.Text; namespace Microsoft.Net.Http.Headers @@ -19,9 +20,10 @@ namespace Microsoft.Net.Http.Headers private static readonly HttpHeaderParser MultipleValueParser = new GenericHeaderParser(true, GetMediaTypeLength); - // Use list instead of dictionary since we may have multiple parameters with the same name. - private ICollection _parameters; + // Use a collection instead of a dictionary since we may have multiple parameters with the same name. + private ObjectCollection _parameters; private string _mediaType; + private bool _isReadOnly; private MediaTypeHeaderValue() { @@ -48,6 +50,7 @@ namespace Microsoft.Net.Http.Headers } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); // We don't prevent a user from setting whitespace-only charsets. Like we can't prevent a user from // setting a non-existing charset. var charsetParameter = NameValueHeaderValue.Find(_parameters, CharsetString); @@ -93,6 +96,7 @@ namespace Microsoft.Net.Http.Headers } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); if (value == null) { Charset = null; @@ -112,6 +116,7 @@ namespace Microsoft.Net.Http.Headers } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); var boundaryParameter = NameValueHeaderValue.Find(_parameters, BoundaryString); if (string.IsNullOrEmpty(value)) { @@ -141,7 +146,14 @@ namespace Microsoft.Net.Http.Headers { if (_parameters == null) { - _parameters = new ObjectCollection(); + if (IsReadOnly) + { + _parameters = ObjectCollection.EmptyReadOnlyCollection; + } + else + { + _parameters = new ObjectCollection(); + } } return _parameters; } @@ -158,6 +170,7 @@ namespace Microsoft.Net.Http.Headers get { return _mediaType; } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); CheckMediaTypeFormat(value, "value"); _mediaType = value; } @@ -201,6 +214,11 @@ namespace Microsoft.Net.Http.Headers } } + public bool IsReadOnly + { + get { return _isReadOnly; } + } + public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType) { if (otherMediaType == null) @@ -253,22 +271,47 @@ namespace Microsoft.Net.Http.Headers /// while avoiding the cost of revalidating the components. /// /// A deep copy. - public MediaTypeHeaderValue Clone() + public MediaTypeHeaderValue Copy() { + if (IsReadOnly) + { + return this; + } + var other = new MediaTypeHeaderValue(); other._mediaType = _mediaType; if (_parameters != null) { - other._parameters = new ObjectCollection(); - foreach (var pair in _parameters) - { - other._parameters.Add(pair.Clone()); - } + other._parameters = new ObjectCollection( + _parameters.Select(item => item.Copy())); } return other; } + /// + /// Performs a deep copy of this object and all of it's NameValueHeaderValue sub components, + /// while avoiding the cost of revalidating the components. This copy is read-only. + /// + /// A deep, read-only, copy. + public MediaTypeHeaderValue CopyAsReadOnly() + { + if (IsReadOnly) + { + return this; + } + + var other = new MediaTypeHeaderValue(); + other._mediaType = _mediaType; + if (_parameters != null) + { + other._parameters = new ObjectCollection( + _parameters.Select(item => item.CopyAsReadOnly()), isReadOnly: true); + } + other._isReadOnly = true; + return other; + } + public override string ToString() { return _mediaType + NameValueHeaderValue.ToString(_parameters, ';', true); diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 08a08f96ef..a91b98e358 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -20,6 +20,7 @@ namespace Microsoft.Net.Http.Headers private string _name; private string _value; + private bool _isReadOnly; private NameValueHeaderValue() { @@ -49,17 +50,25 @@ namespace Microsoft.Net.Http.Headers get { return _value; } set { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); CheckValueFormat(value); _value = value; } } + public bool IsReadOnly { get { return _isReadOnly; } } + /// /// Provides a copy of this object without the cost of re-validating the values. /// /// A copy. - public NameValueHeaderValue Clone() + public NameValueHeaderValue Copy() { + if (IsReadOnly) + { + return this; + } + return new NameValueHeaderValue() { _name = _name, @@ -67,6 +76,21 @@ namespace Microsoft.Net.Http.Headers }; } + public NameValueHeaderValue CopyAsReadOnly() + { + if (IsReadOnly) + { + return this; + } + + return new NameValueHeaderValue() + { + _name = _name, + _value = _value, + _isReadOnly = true + }; + } + public override int GetHashCode() { Contract.Assert(_name != null); diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index 90e7718c4c..24237b6ff1 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; +using System.Collections.Generic; using System.Collections.ObjectModel; namespace Microsoft.Net.Http.Headers @@ -10,40 +12,74 @@ namespace Microsoft.Net.Http.Headers // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. - internal class ObjectCollection : Collection where T : class + internal class ObjectCollection : ICollection where T : class { - private static readonly Action DefaultValidator = CheckNotNull; + internal static readonly Action DefaultValidator = CheckNotNull; + internal static readonly ObjectCollection EmptyReadOnlyCollection + = new ObjectCollection(DefaultValidator, isReadOnly: true); - private Action _validator; + private readonly Collection _collection = new Collection(); + private readonly Action _validator; + private readonly bool _isReadOnly; public ObjectCollection() : this(DefaultValidator) { } - public ObjectCollection(Action validator) + public ObjectCollection(Action validator, bool isReadOnly = false) { _validator = validator; + _isReadOnly = isReadOnly; } - protected override void InsertItem(int index, T item) + public ObjectCollection(IEnumerable other, bool isReadOnly = false) { - if (_validator != null) + _validator = DefaultValidator; + foreach (T item in other) { - _validator(item); + Add(item); } - base.InsertItem(index, item); + _isReadOnly = isReadOnly; } - protected override void SetItem(int index, T item) + public int Count { - if (_validator != null) - { - _validator(item); - } - base.SetItem(index, item); + get { return _collection.Count; } } + public bool IsReadOnly + { + get { return _isReadOnly; } + } + + public void Add(T item) + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + _validator(item); + _collection.Add(item); + } + + public bool Remove(T item) + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + return _collection.Remove(item); + } + + public void Clear() + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + _collection.Clear(); + } + + public bool Contains(T item) => _collection.Contains(item); + + public void CopyTo(T[] array, int arrayIndex) => _collection.CopyTo(array, arrayIndex); + + public IEnumerator GetEnumerator() => _collection.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => _collection.GetEnumerator(); + private static void CheckNotNull(T item) { // null values cannot be added to the collection. diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 15f82024e2..fcbada8643 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -12,6 +12,7 @@ "System.Diagnostics.Contracts": "4.0.0-beta-*", "System.Globalization": "4.0.10-beta-*", "System.Globalization.Extensions": "4.0.0-beta-*", + "System.Linq": "4.0.0-beta-*", "System.Text.Encoding": "4.0.10-beta-*", "System.Runtime": "4.0.20-beta-*" } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index b0ba4aa9fe..e44f880a72 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -20,5 +20,5 @@ } } }, - "resources": "..\\..\\unicode\\UnicodeData.txt" + "resource": "..\\..\\unicode\\UnicodeData.txt" } diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 92ec8f9726..cfd389e4d4 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -65,10 +65,10 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void Clone_SimpleMediaType_Copied() + public void Copy_SimpleMediaType_Copied() { var mediaType0 = new MediaTypeHeaderValue("text/plain"); - var mediaType1 = mediaType0.Clone(); + var mediaType1 = mediaType0.Copy(); Assert.NotSame(mediaType0, mediaType1); Assert.Same(mediaType0.MediaType, mediaType1.MediaType); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); @@ -76,11 +76,26 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void Clone_WithParameters_Copied() + public void CopyAsReadOnly_SimpleMediaType_CopiedAndReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + var mediaType1 = mediaType0.CopyAsReadOnly(); + Assert.NotSame(mediaType0, mediaType1); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + + Assert.False(mediaType0.IsReadOnly); + Assert.True(mediaType1.IsReadOnly); + Assert.Throws(() => { mediaType1.MediaType = "some/value"; }); + } + + [Fact] + public void Copy_WithParameters_Copied() { var mediaType0 = new MediaTypeHeaderValue("text/plain"); mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); - var mediaType1 = mediaType0.Clone(); + var mediaType1 = mediaType0.Copy(); Assert.NotSame(mediaType0, mediaType1); Assert.Same(mediaType0.MediaType, mediaType1.MediaType); Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); @@ -92,6 +107,34 @@ namespace Microsoft.Net.Http.Headers Assert.Same(pair0.Value, pair1.Value); } + [Fact] + public void CopyAsReadOnly_WithParameters_CopiedAndReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.CopyAsReadOnly(); + Assert.NotSame(mediaType0, mediaType1); + Assert.False(mediaType0.IsReadOnly); + Assert.True(mediaType1.IsReadOnly); + Assert.Same(mediaType0.MediaType, mediaType1.MediaType); + + Assert.NotSame(mediaType0.Parameters, mediaType1.Parameters); + Assert.False(mediaType0.Parameters.IsReadOnly); + Assert.True(mediaType1.Parameters.IsReadOnly); + Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); + Assert.Throws(() => mediaType1.Parameters.Add(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Remove(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Clear()); + + var pair0 = mediaType0.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair0, pair1); + Assert.False(pair0.IsReadOnly); + Assert.True(pair1.IsReadOnly); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index a1e1a935f9..a5bf8c9b66 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -60,29 +60,71 @@ namespace Microsoft.Net.Http.Headers } [Fact] - public void Clone_NameOnly_SuccesfullyCopied() + public void Copy_NameOnly_SuccesfullyCopied() { var pair0 = new NameValueHeaderValue("name"); - var pair1 = pair0.Clone(); + var pair1 = pair0.Copy(); Assert.NotSame(pair0, pair1); Assert.Same(pair0.Name, pair1.Name); Assert.Null(pair0.Value); Assert.Null(pair1.Value); + + // Change one value and verify the other is unchanged. + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal(null, pair1.Value); } [Fact] - public void Clone_NameAndValue_SuccesfullyCopied() + public void CopyAsReadOnly_NameOnly_CopiedAndReadOnly() + { + var pair0 = new NameValueHeaderValue("name"); + var pair1 = pair0.CopyAsReadOnly(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Null(pair0.Value); + Assert.Null(pair1.Value); + Assert.False(pair0.IsReadOnly); + Assert.True(pair1.IsReadOnly); + + // Change one value and verify the other is unchanged. + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal(null, pair1.Value); + Assert.Throws(() => { pair1.Value = "othervalue"; }); + } + + [Fact] + public void Copy_NameAndValue_SuccesfullyCopied() { var pair0 = new NameValueHeaderValue("name", "value"); - var pair1 = pair0.Clone(); + var pair1 = pair0.Copy(); Assert.NotSame(pair0, pair1); Assert.Same(pair0.Name, pair1.Name); Assert.Same(pair0.Value, pair1.Value); // Change one value and verify the other is unchanged. - pair1.Value = "othervalue"; - Assert.Equal("value", pair0.Value); - Assert.Equal("othervalue", pair1.Value); + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal("value", pair1.Value); + } + + [Fact] + public void CopyAsReadOnly_NameAndValue_CopiedAndReadOnly() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.CopyAsReadOnly(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + Assert.False(pair0.IsReadOnly); + Assert.True(pair1.IsReadOnly); + + // Change one value and verify the other is unchanged. + pair0.Value = "othervalue"; + Assert.Equal("othervalue", pair0.Value); + Assert.Equal("value", pair1.Value); + Assert.Throws(() => { pair1.Value = "othervalue"; }); } [Fact] From eb423e57d69a575c71173f0df33c2bcad6ec5082 Mon Sep 17 00:00:00 2001 From: Hisham Abdullah Bin Ateya Date: Fri, 12 Jun 2015 04:12:30 +0300 Subject: [PATCH 0653/1838] Using 'nameof' operator instead of magic strings Fix back-end field issue Fix back-end field issue --- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 2 +- src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs | 4 ++-- src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs | 2 +- src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs | 4 ++-- .../StringWithQualityHeaderValue.cs | 4 ++-- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index 8102528ae4..c9262718d1 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Owin _webSocket.Abort(); break; default: - throw new ArgumentOutOfRangeException("state", _webSocket.State, string.Empty); + throw new ArgumentOutOfRangeException(nameof(_webSocket.State), _webSocket.State, string.Empty); } } diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 48dfc913a9..c1940754ba 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -597,7 +597,7 @@ namespace Microsoft.Net.Http.Headers private static void CheckIsValidToken(string item) { - HeaderUtilities.CheckValidToken(item, "item"); + HeaderUtilities.CheckValidToken(item, nameof(item)); } } } diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index abce604280..092bb83320 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -82,7 +82,7 @@ namespace Microsoft.Net.Http.Headers get { return _unit; } set { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); _unit = value; } } diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index 11c5500a31..5006792814 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -39,7 +39,7 @@ namespace Microsoft.Net.Http.Headers get { return _name; } set { - CheckNameFormat(value, "name"); + CheckNameFormat(value, nameof(value)); _name = value; } } @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers get { return _value; } set { - CheckValueFormat(value, "value"); + CheckValueFormat(value, nameof(value)); _value = value; } } diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index a91b98e358..c2e38e643c 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -363,7 +363,7 @@ namespace Microsoft.Net.Http.Headers private static void CheckNameValueFormat(string name, string value) { - HeaderUtilities.CheckValidToken(name, "name"); + HeaderUtilities.CheckValidToken(name, nameof(name)); CheckValueFormat(value); } diff --git a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs index 445752a13d..3657e24c27 100644 --- a/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeHeaderValue.cs @@ -33,7 +33,7 @@ namespace Microsoft.Net.Http.Headers get { return _unit; } set { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); _unit = value; } } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index b470471e4e..52fdd46a36 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers get { return _name; } set { - CookieHeaderValue.CheckNameFormat(value, "name"); + CookieHeaderValue.CheckNameFormat(value, nameof(value)); _name = value; } } @@ -59,7 +59,7 @@ namespace Microsoft.Net.Http.Headers get { return _value; } set { - CookieHeaderValue.CheckValueFormat(value, "value"); + CookieHeaderValue.CheckValueFormat(value, nameof(value)); _value = value; } } diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs index ab33ba4a0f..36e9a3fd58 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValue.cs @@ -25,14 +25,14 @@ namespace Microsoft.Net.Http.Headers public StringWithQualityHeaderValue(string value) { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); _value = value; } public StringWithQualityHeaderValue(string value, double quality) { - HeaderUtilities.CheckValidToken(value, "value"); + HeaderUtilities.CheckValidToken(value, nameof(value)); if ((quality < 0) || (quality > 1)) { From 641a7fb82bf04438356abce8301cc17fe73ddb20 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 25 Jun 2015 12:20:53 -0700 Subject: [PATCH 0654/1838] Correct exception type. --- src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs index c9262718d1..1ddc83a499 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Owin _webSocket.Abort(); break; default: - throw new ArgumentOutOfRangeException(nameof(_webSocket.State), _webSocket.State, string.Empty); + throw new NotSupportedException($"Unsupported {nameof(WebSocketState)} value: {_webSocket.State}."); } } From 5fe8037281bb826e0708abdcdafbc76571dc21f5 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 25 Jun 2015 17:03:10 -0700 Subject: [PATCH 0655/1838] Auth API changes (Async, ChallengeBehavior) --- .../Authentication/AuthenticateResult.cs | 44 ------------- .../Authentication/AuthenticationManager.cs | 60 +++++++++++------ .../HttpResponse.cs | 24 +++++-- .../Authentication/ChallengeBehavior.cs | 12 ++++ .../Authentication/ChallengeContext.cs | 10 ++- .../Authentication/IAuthenticationHandler.cs | 8 +-- .../IHttpResponseFeature.cs | 5 +- .../DefaultAuthenticationManager.cs | 66 ++++--------------- .../DefaultHttpResponse.cs | 9 +-- .../Features/HttpResponseFeature.cs | 9 +-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 10 ++- .../OwinFeatureCollection.cs | 8 ++- .../DefaultAuthenticationManagerTests.cs | 43 +++++------- 13 files changed, 139 insertions(+), 169 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs create mode 100644 src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs deleted file mode 100644 index 28060a24e2..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticateResult.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Security.Claims; -using Microsoft.Framework.Internal; - -namespace Microsoft.AspNet.Http.Authentication -{ - /// - /// Acts as the return value from calls to the IAuthenticationManager's AuthenticeAsync methods. - /// - public class AuthenticationResult - { - /// - /// Create an instance of the result object - /// - /// Assigned to Identity. May be null. - /// Assigned to Properties. Contains extra information carried along with the identity. - /// Assigned to Description. Contains information describing the authentication provider. - public AuthenticationResult(ClaimsPrincipal principal, [NotNull] AuthenticationProperties properties, [NotNull] AuthenticationDescription description) - { - Principal = principal; - Properties = properties; - Description = description; - } - - /// - /// Contains the claims that were authenticated by the given AuthenticationScheme. If the authentication - /// scheme was not successful the Identity property will be null. - /// - public ClaimsPrincipal Principal { get; private set; } - - /// - /// Contains extra values that were provided with the original SignIn call. - /// - public AuthenticationProperties Properties { get; private set; } - - /// - /// Contains description properties for the middleware authentication type in general. Does not - /// vary per request. - /// - public AuthenticationDescription Description { get; private set; } - } -} diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index 331c4c8fe1..e10e081717 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { @@ -11,41 +13,61 @@ namespace Microsoft.AspNet.Http.Authentication { public abstract IEnumerable GetAuthenticationSchemes(); - public abstract AuthenticationResult Authenticate(string authenticationScheme); + public abstract Task AuthenticateAsync([NotNull] AuthenticateContext context); - public abstract Task AuthenticateAsync(string authenticationScheme); - - public virtual void Challenge() + public virtual async Task AuthenticateAsync([NotNull] string authenticationScheme) { - Challenge(authenticationScheme: null, properties: null); + var context = new AuthenticateContext(authenticationScheme); + await AuthenticateAsync(context); + return context.Principal; } - public virtual void Challenge(AuthenticationProperties properties) + public virtual Task ChallengeAsync() { - Challenge(authenticationScheme: null, properties: properties); + return ChallengeAsync(properties: null); } - public virtual void Challenge(string authenticationScheme) + public virtual Task ChallengeAsync(AuthenticationProperties properties) { - Challenge(authenticationScheme: authenticationScheme, properties: null); + return ChallengeAsync(authenticationScheme: string.Empty, properties: properties); } - public abstract void Challenge(string authenticationScheme, AuthenticationProperties properties); - - public void SignIn(string authenticationScheme, ClaimsPrincipal principal) + public virtual Task ChallengeAsync([NotNull] string authenticationScheme) { - SignIn(authenticationScheme, principal, properties: null); + return ChallengeAsync(authenticationScheme: authenticationScheme, properties: null); } - public abstract void SignIn(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); - - public virtual void SignOut() + // Leave it up to authentication handler to do the right thing for the challenge + public virtual Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) { - SignOut(authenticationScheme: null, properties: null); + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Automatic); } - public abstract void SignOut(string authenticationScheme); + public virtual Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal) + { + return SignInAsync(authenticationScheme, principal, properties: null); + } - public abstract void SignOut(string authenticationScheme, AuthenticationProperties properties); + public virtual Task ForbidAsync([NotNull] string authenticationScheme) + { + return ForbidAsync(authenticationScheme, properties: null); + } + + // Deny access (typically a 403) + public virtual Task ForbidAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + { + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Forbidden); + } + + public abstract Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); + + public abstract Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties); + + public virtual Task SignOutAsync([NotNull] string authenticationScheme) + { + return SignOutAsync(authenticationScheme, properties: null); + } + + public abstract Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index a0a92fb823..914e9604c9 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -3,11 +3,20 @@ using System; using System.IO; +using System.Threading.Tasks; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { public abstract class HttpResponse { + private static readonly Func _callbackDelegate = callback => ((Func)callback)(); + private static readonly Func _disposeDelegate = disposable => + { + ((IDisposable)disposable).Dispose(); + return Task.FromResult(0); + }; + public abstract HttpContext HttpContext { get; } public abstract int StatusCode { get; set; } @@ -24,14 +33,17 @@ namespace Microsoft.AspNet.Http public abstract bool HasStarted { get; } - public abstract void OnResponseStarting(Action callback, object state); + public abstract void OnStarting([NotNull] Func callback, object state); - public abstract void OnResponseCompleted(Action callback, object state); + public virtual void OnStarting([NotNull] Func callback) => OnStarting(_callbackDelegate, callback); - public virtual void Redirect(string location) - { - Redirect(location, permanent: false); - } + public abstract void OnCompleted([NotNull] Func callback, object state); + + public virtual void OnCompletedDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + + public virtual void OnCompleted([NotNull] Func callback) => OnCompleted(_callbackDelegate, callback); + + public virtual void Redirect(string location) => Redirect(location, permanent: false); public abstract void Redirect(string location, bool permanent); } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs new file mode 100644 index 0000000000..1be42f700b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features.Authentication +{ + public enum ChallengeBehavior + { + Automatic, + Unauthorized, + Forbidden + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index 592086e83c..5dfcd16914 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -3,19 +3,27 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class ChallengeContext { - public ChallengeContext(string authenticationScheme, IDictionary properties) + public ChallengeContext([NotNull] string authenticationScheme) : this(authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) + { + } + + public ChallengeContext([NotNull] string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) { AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); + Behavior = behavior; } public string AuthenticationScheme { get; } + public ChallengeBehavior Behavior { get; } + public IDictionary Properties { get; } public bool Accepted { get; private set; } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs index 9f551b8bdd..155cd87380 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs @@ -9,14 +9,12 @@ namespace Microsoft.AspNet.Http.Features.Authentication { void GetDescriptions(DescribeSchemesContext context); - void Authenticate(AuthenticateContext context); - Task AuthenticateAsync(AuthenticateContext context); - void Challenge(ChallengeContext context); + Task ChallengeAsync(ChallengeContext context); - void SignIn(SignInContext context); + Task SignInAsync(SignInContext context); - void SignOut(SignOutContext context); + Task SignOutAsync(SignOutContext context); } } diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index 9057a9991f..d530718b17 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http.Features { @@ -14,7 +15,7 @@ namespace Microsoft.AspNet.Http.Features IDictionary Headers { get; set; } Stream Body { get; set; } bool HasStarted { get; } - void OnResponseStarting(Action callback, object state); - void OnResponseCompleted(Action callback, object state); + void OnStarting(Func callback, object state); + void OnCompleted(Func callback, object state); } } diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 9f534a6ada..526dfea4f3 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -48,66 +48,29 @@ namespace Microsoft.AspNet.Http.Authentication.Internal return describeContext.Results.Select(description => new AuthenticationDescription(description)); } - public override AuthenticationResult Authenticate([NotNull] string authenticationScheme) + public override async Task AuthenticateAsync([NotNull] AuthenticateContext context) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationScheme); if (handler != null) { - handler.Authenticate(authenticateContext); + await handler.AuthenticateAsync(context); } - if (!authenticateContext.Accepted) + if (!context.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"The following authentication scheme was not accepted: {context.AuthenticationScheme}"); } - - if (authenticateContext.Principal == null) - { - return null; - } - - return new AuthenticationResult(authenticateContext.Principal, - new AuthenticationProperties(authenticateContext.Properties), - new AuthenticationDescription(authenticateContext.Description)); } - public override async Task AuthenticateAsync([NotNull] string authenticationScheme) + public override async Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { var handler = HttpAuthenticationFeature.Handler; - var authenticateContext = new AuthenticateContext(authenticationScheme); + var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items, behavior); if (handler != null) { - await handler.AuthenticateAsync(authenticateContext); - } - - // Verify all types ack'd - if (!authenticateContext.Accepted) - { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); - } - - if (authenticateContext.Principal == null) - { - return null; - } - - return new AuthenticationResult(authenticateContext.Principal, - new AuthenticationProperties(authenticateContext.Properties), - new AuthenticationDescription(authenticateContext.Description)); - } - - public override void Challenge(string authenticationScheme, AuthenticationProperties properties) - { - HttpResponseFeature.StatusCode = 401; - var handler = HttpAuthenticationFeature.Handler; - - var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items); - if (handler != null) - { - handler.Challenge(challengeContext); + await handler.ChallengeAsync(challengeContext); } // The default Challenge with no scheme is always accepted @@ -117,43 +80,36 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override void SignIn([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + public override async Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); if (handler != null) { - handler.SignIn(signInContext); + await handler.SignInAsync(signInContext); } - // Verify all types ack'd if (!signInContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } - public override void SignOut(string authenticationScheme, AuthenticationProperties properties) + public override async Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) { var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); if (handler != null) { - handler.SignOut(signOutContext); + await handler.SignOutAsync(signOutContext); } - // Verify all types ack'd if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } } - - public override void SignOut(string authenticationScheme) - { - SignOut(authenticationScheme, properties: null); - } } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 2f38ac9cbe..cf3b006945 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -3,6 +3,7 @@ using System; using System.IO; +using System.Threading.Tasks; using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; @@ -94,14 +95,14 @@ namespace Microsoft.AspNet.Http.Internal get { return HttpResponseFeature.HasStarted; } } - public override void OnResponseStarting(Action callback, object state) + public override void OnStarting(Func callback, object state) { - HttpResponseFeature.OnResponseStarting(callback, state); + HttpResponseFeature.OnStarting(callback, state); } - public override void OnResponseCompleted(Action callback, object state) + public override void OnCompleted(Func callback, object state) { - HttpResponseFeature.OnResponseCompleted(callback, state); + HttpResponseFeature.OnCompleted(callback, state); } public override void Redirect(string location, bool permanent) diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 5e32a938be..84f8196f93 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http.Features.Internal { @@ -29,14 +30,14 @@ namespace Microsoft.AspNet.Http.Features.Internal get { return false; } } - public void OnResponseStarting(Action callback, object state) + public void OnStarting(Func callback, object state) { - throw new NotSupportedException(); + throw new NotImplementedException(); } - public void OnResponseCompleted(Action callback, object state) + public void OnCompleted(Func callback, object state) { - throw new NotSupportedException(); + throw new NotImplementedException(); } } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5d1f95119c..5c231eb0e8 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -62,7 +62,15 @@ namespace Microsoft.AspNet.Owin { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, - { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap(feature => new Action, object>(feature.OnResponseStarting)) }, + { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap( + feature => new Action, object>((cb, state) => { + feature.OnStarting(s => + { + cb(s); + return Task.FromResult(0); + }, state); + })) + }, { OwinConstants.CommonKeys.LocalPort, new FeatureMap(feature => feature.LocalPort.ToString(CultureInfo.InvariantCulture), (feature, value) => feature.LocalPort = Convert.ToInt32(value, CultureInfo.InvariantCulture)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index b7e6598383..b718d36097 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -147,17 +147,19 @@ namespace Microsoft.AspNet.Owin get { return _headersSent; } } - void IHttpResponseFeature.OnResponseStarting(Action callback, object state) + void IHttpResponseFeature.OnStarting(Func callback, object state) { var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); if (register == null) { throw new NotSupportedException(OwinConstants.CommonKeys.OnSendingHeaders); } - register(callback, state); + + // Need to block on the callback since we can't change the OWIN signature to be async + register(s => callback(s).GetAwaiter().GetResult(), state); } - void IHttpResponseFeature.OnResponseCompleted(Action callback, object state) + void IHttpResponseFeature.OnCompleted(Func callback, object state) { throw new NotSupportedException(); } diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 652f3a1091..2871c27ec3 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -18,50 +18,46 @@ namespace Microsoft.AspNet.Http.Authentication.Internal public async Task AuthenticateWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Authentication.Authenticate("Foo")); await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); } [Fact] - public void ChallengeWithNoAuthMiddlewareMayThrow() + public async Task ChallengeWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Authentication.Challenge(); - Assert.Equal(401, context.Response.StatusCode); - - Assert.Throws(() => context.Authentication.Challenge("Foo")); + await context.Authentication.ChallengeAsync(); + Assert.Equal(200, context.Response.StatusCode); + await Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync("Foo")); } [Fact] - public void SignInWithNoAuthMiddlewareThrows() + public async Task SignInWithNoAuthMiddlewareThrows() { var context = CreateContext(); - Assert.Throws(() => context.Authentication.SignIn("Foo", new ClaimsPrincipal())); + await Assert.ThrowsAsync(() => context.Authentication.SignInAsync("Foo", new ClaimsPrincipal())); } [Fact] - public void SignOutWithNoAuthMiddlewareMayThrow() + public async Task SignOutWithNoAuthMiddlewareMayThrow() { var context = CreateContext(); - context.Authentication.SignOut(); - - Assert.Throws(() => context.Authentication.SignOut("Foo")); + await Assert.ThrowsAsync(() => context.Authentication.SignOutAsync("Foo")); } [Fact] - public void SignInOutIn() + public async Task SignInOutIn() { var context = CreateContext(); var handler = new AuthHandler(); context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); var user = new ClaimsPrincipal(); - context.Authentication.SignIn("ignored", user); + await context.Authentication.SignInAsync("ignored", user); Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored"); + await context.Authentication.SignOutAsync("ignored"); Assert.False(handler.SignedIn); - context.Authentication.SignIn("ignored", user); + await context.Authentication.SignInAsync("ignored", user); Assert.True(handler.SignedIn); - context.Authentication.SignOut("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); + await context.Authentication.SignOutAsync("ignored", new AuthenticationProperties() { RedirectUri = "~/logout" }); Assert.False(handler.SignedIn); } @@ -69,17 +65,12 @@ namespace Microsoft.AspNet.Http.Authentication.Internal { public bool SignedIn { get; set; } - public void Authenticate(AuthenticateContext context) - { - throw new NotImplementedException(); - } - public Task AuthenticateAsync(AuthenticateContext context) { throw new NotImplementedException(); } - public void Challenge(ChallengeContext context) + public Task ChallengeAsync(ChallengeContext context) { throw new NotImplementedException(); } @@ -89,16 +80,18 @@ namespace Microsoft.AspNet.Http.Authentication.Internal throw new NotImplementedException(); } - public void SignIn(SignInContext context) + public Task SignInAsync(SignInContext context) { SignedIn = true; context.Accept(); + return Task.FromResult(0); } - public void SignOut(SignOutContext context) + public Task SignOutAsync(SignOutContext context) { SignedIn = false; context.Accept(); + return Task.FromResult(0); } } From 5621a2c2c7326fc285b9a148e37c3298d25cff68 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Thu, 25 Jun 2015 17:04:16 -0700 Subject: [PATCH 0656/1838] React to HttpChanges --- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 7ae2111959..25d9b3260d 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.TestHost @@ -33,7 +34,7 @@ namespace Microsoft.AspNet.TestHost public bool HasStarted { get; set; } - public void OnResponseStarting(Action callback, object state) + public void OnStarting(Func callback, object state) { var prior = _responseStarting; _responseStarting = () => @@ -43,7 +44,7 @@ namespace Microsoft.AspNet.TestHost }; } - public void OnResponseCompleted(Action callback, object state) + public void OnCompleted(Func callback, object state) { var prior = _responseCompleted; _responseCompleted = () => From 40719b37f66e94f1295928bc942282cff9529a35 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 26 Jun 2015 14:34:22 -0700 Subject: [PATCH 0657/1838] #177 Enable Copy to return non-read-only. --- .../MediaTypeHeaderValue.cs | 5 ---- .../NameValueHeaderValue.cs | 5 ---- .../MediaTypeHeaderValueTest.cs | 23 +++++++++++++++++++ .../NameValueHeaderValueTest.cs | 16 +++++++++++++ 4 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 968eb4c6cc..aebf80e00b 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -273,11 +273,6 @@ namespace Microsoft.Net.Http.Headers /// A deep copy. public MediaTypeHeaderValue Copy() { - if (IsReadOnly) - { - return this; - } - var other = new MediaTypeHeaderValue(); other._mediaType = _mediaType; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index c2e38e643c..f5b1c72435 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -64,11 +64,6 @@ namespace Microsoft.Net.Http.Headers /// A copy. public NameValueHeaderValue Copy() { - if (IsReadOnly) - { - return this; - } - return new NameValueHeaderValue() { _name = _name, diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index cfd389e4d4..9ca74a3632 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -135,6 +135,29 @@ namespace Microsoft.Net.Http.Headers Assert.Same(pair0.Value, pair1.Value); } + [Fact] + public void CopyFromReadOnly_WithParameters_CopiedAsNonReadOnly() + { + var mediaType0 = new MediaTypeHeaderValue("text/plain"); + mediaType0.Parameters.Add(new NameValueHeaderValue("name", "value")); + var mediaType1 = mediaType0.CopyAsReadOnly(); + var mediaType2 = mediaType1.Copy(); + + Assert.NotSame(mediaType2, mediaType1); + Assert.Same(mediaType2.MediaType, mediaType1.MediaType); + Assert.True(mediaType1.IsReadOnly); + Assert.False(mediaType2.IsReadOnly); + Assert.NotSame(mediaType2.Parameters, mediaType1.Parameters); + Assert.Equal(mediaType2.Parameters.Count, mediaType1.Parameters.Count); + var pair2 = mediaType2.Parameters.First(); + var pair1 = mediaType1.Parameters.First(); + Assert.NotSame(pair2, pair1); + Assert.True(pair1.IsReadOnly); + Assert.False(pair2.IsReadOnly); + Assert.Same(pair2.Name, pair1.Name); + Assert.Same(pair2.Value, pair1.Value); + } + [Fact] public void MediaType_SetAndGetMediaType_MatchExpectations() { diff --git a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs index a5bf8c9b66..46d1d30d75 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/NameValueHeaderValueTest.cs @@ -127,6 +127,22 @@ namespace Microsoft.Net.Http.Headers Assert.Throws(() => { pair1.Value = "othervalue"; }); } + [Fact] + public void CopyFromReadOnly_NameAndValue_CopiedAsNonReadOnly() + { + var pair0 = new NameValueHeaderValue("name", "value"); + var pair1 = pair0.CopyAsReadOnly(); + var pair2 = pair1.Copy(); + Assert.NotSame(pair0, pair1); + Assert.Same(pair0.Name, pair1.Name); + Assert.Same(pair0.Value, pair1.Value); + + // Change one value and verify the other is unchanged. + pair2.Value = "othervalue"; + Assert.Equal("othervalue", pair2.Value); + Assert.Equal("value", pair1.Value); + } + [Fact] public void Value_CallSetterWithInvalidValues_Throw() { From bf6e293bfedcb921215f8c4273839912be205719 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 29 Jun 2015 11:39:06 -0700 Subject: [PATCH 0658/1838] Simplify server loader logic --- .../Internal/HostingUtilities.cs | 13 ----- .../Server/IServerLoader.cs | 2 +- .../Server/ServerLoader.cs | 52 ++++--------------- 3 files changed, 12 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs index 9d868fe532..305888997d 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs @@ -10,19 +10,6 @@ namespace Microsoft.AspNet.Hosting.Internal { public static class HostingUtilities { - internal static Tuple SplitTypeName(string identifier) - { - string typeName = null; - var assemblyName = identifier.Trim(); - var parts = identifier.Split(new[] { ',' }, 2); - if (parts.Length == 2) - { - typeName = parts[0].Trim(); - assemblyName = parts[1].Trim(); - } - return new Tuple(typeName, assemblyName); - } - public static string GetWebRoot(string applicationBasePath) { var webroot = applicationBasePath; diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs index abf67b4263..3902135cab 100644 --- a/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Hosting.Server { public interface IServerLoader { - IServerFactory LoadServerFactory(string serverName); + IServerFactory LoadServerFactory(string assemblyName); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index 51cdecfe36..367f7bea05 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -4,8 +4,8 @@ using System; using System.Linq; using System.Reflection; -using Microsoft.AspNet.Hosting.Internal; using Microsoft.Framework.DependencyInjection; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Server { @@ -18,59 +18,29 @@ namespace Microsoft.AspNet.Hosting.Server _services = services; } - public IServerFactory LoadServerFactory(string serverFactoryIdentifier) + public IServerFactory LoadServerFactory([NotNull] string assemblyName) { - if (string.IsNullOrEmpty(serverFactoryIdentifier)) + if (string.IsNullOrEmpty(assemblyName)) { - throw new ArgumentException(string.Empty, nameof(serverFactoryIdentifier)); + throw new ArgumentException(string.Empty, nameof(assemblyName)); } - var nameParts = HostingUtilities.SplitTypeName(serverFactoryIdentifier); - var typeName = nameParts.Item1; - var assemblyName = nameParts.Item2; - var assembly = Assembly.Load(new AssemblyName(assemblyName)); if (assembly == null) { throw new Exception(string.Format("The assembly {0} failed to load.", assemblyName)); } - Type type = null; - Type interfaceInfo; - if (string.IsNullOrEmpty(typeName)) + var serverTypeInfo = assembly.DefinedTypes.Where( + t => t.ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory))) != null) + .FirstOrDefault(); + + if (serverTypeInfo == null) { - foreach (var typeInfo in assembly.DefinedTypes) - { - interfaceInfo = typeInfo.ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory))); - if (interfaceInfo != null) - { - type = typeInfo.AsType(); - } - } - - if (type == null) - { - throw new Exception(string.Format("The type {0} failed to load.", typeName ?? "")); - } - } - else - { - type = assembly.GetType(typeName); - - if (type == null) - { - throw new Exception(String.Format("The type {0} failed to load.", typeName ?? "")); - } - - interfaceInfo = type.GetTypeInfo().ImplementedInterfaces.FirstOrDefault(interf => interf.Equals(typeof(IServerFactory))); - - if (interfaceInfo == null) - { - throw new Exception(string.Format("The type '{0}' does not implement the '{1}' interface.", type, typeof(IServerFactory).FullName)); - } + throw new InvalidOperationException($"No server type found that implements IServerFactory in assembly: {assemblyName}."); } - return (IServerFactory)ActivatorUtilities.GetServiceOrCreateInstance(_services, type); + return (IServerFactory)ActivatorUtilities.GetServiceOrCreateInstance(_services, serverTypeInfo.AsType()); } } } \ No newline at end of file From 00b5cdc4a27a71c223e6b6cb63dff50a0bf2a71a Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 1 Jul 2015 13:00:54 -0700 Subject: [PATCH 0659/1838] #212 Check for duplicate Configure or ConfigureServices methods. --- .../Startup/StartupLoader.cs | 19 +++++++++-- .../Fakes/StartupTwoConfigureServices.cs | 30 +++++++++++++++++ .../Fakes/StartupTwoConfigures.cs | 24 ++++++++++++++ .../StartupManagerTests.cs | 32 +++++++++++++++++++ 4 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigures.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 383d0d8357..28d716ffa4 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -105,8 +105,23 @@ namespace Microsoft.AspNet.Hosting.Startup { var methodNameWithEnv = string.Format(CultureInfo.InvariantCulture, methodName, environmentName); var methodNameWithNoEnv = string.Format(CultureInfo.InvariantCulture, methodName, ""); - var methodInfo = startupType.GetMethod(methodNameWithEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static) - ?? startupType.GetMethod(methodNameWithNoEnv, BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + + var methods = startupType.GetMethods(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static); + var selectedMethods = methods.Where(method => method.Name.Equals(methodNameWithEnv)).ToList(); + if (selectedMethods.Count > 1) + { + throw new InvalidOperationException(string.Format("Having multiple overloads of method '{0}' is not supported.", methodNameWithEnv)); + } + if (selectedMethods.Count == 0) + { + selectedMethods = methods.Where(method => method.Name.Equals(methodNameWithNoEnv)).ToList(); + if (selectedMethods.Count > 1) + { + throw new InvalidOperationException(string.Format("Having multiple overloads of method '{0}' is not supported.", methodNameWithNoEnv)); + } + } + + var methodInfo = selectedMethods.FirstOrDefault(); if (methodInfo == null) { if (required) diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs new file mode 100644 index 0000000000..0442c3785c --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupTwoConfigureServices + { + public StartupTwoConfigureServices() + { + } + + public void ConfigureServices(IServiceCollection services) + { + + } + + public void ConfigureServices(IServiceCollection services, object service) + { + + } + + public void Configure(IApplicationBuilder builder) + { + + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigures.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigures.cs new file mode 100644 index 0000000000..a97d679ac1 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigures.cs @@ -0,0 +1,24 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupTwoConfigures + { + public StartupTwoConfigures() + { + } + + public void Configure(IApplicationBuilder builder) + { + + } + + public void Configure(IApplicationBuilder builder, object service) + { + + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 013f202f03..9cc385ae40 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -83,6 +83,38 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Equal("A method named 'ConfigureBoom' or 'Configure' in the type 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' could not be found.", ex.Message); } + [Fact] + public void StartupWithTwoConfiguresThrows() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddInstance(this); + var services = serviceCollection.BuildServiceProvider(); + + var diagnosticMessages = new List(); + var hostingEnv = new HostingEnvironment { EnvironmentName = "TwoConfigures" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + + var ex = Assert.Throws(() => loader.LoadMethods(type, diagnosticMessages)); + Assert.Equal("Having multiple overloads of method 'Configure' is not supported.", ex.Message); + } + + [Fact] + public void StartupWithTwoConfigureServicesThrows() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddInstance(this); + var services = serviceCollection.BuildServiceProvider(); + + var diagnosticMessages = new List(); + var hostingEnv = new HostingEnvironment { EnvironmentName = "TwoConfigureServices" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + + var ex = Assert.Throws(() => loader.LoadMethods(type, diagnosticMessages)); + Assert.Equal("Having multiple overloads of method 'ConfigureServices' is not supported.", ex.Message); + } + [Fact] public void StartupClassCanHandleConfigureServicesThatReturnsNull() { From 430c55440b3528427d934c074264ef8c8cbdf739 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 1 Jul 2015 19:59:11 -0700 Subject: [PATCH 0660/1838] Add repository information to project files --- src/Microsoft.AspNet.Hosting.Abstractions/project.json | 4 ++++ src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json | 4 ++++ src/Microsoft.AspNet.Hosting/project.json | 4 ++++ src/Microsoft.AspNet.Server.Testing/project.json | 4 ++++ src/Microsoft.AspNet.TestHost/project.json | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index adca748265..6e143904ae 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 Hosting abstractions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index f368b88e76..c9ea12da6a 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.Framework.Configuration.Abstractions": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index cafb35b26d..8b202b7129 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, "compilationOptions": { "warningsAsErrors": "true" }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index e4538164a4..84b84fe211 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index b6fc16fd22..009a2aac6a 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 web server for writing and running tests.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "version": "1.0.0-*", "type": "build" } From bbbd0d9f35765cf815924ef679d5b7975dd995b4 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 1 Jul 2015 20:02:24 -0700 Subject: [PATCH 0661/1838] Add repository information to project files --- src/Microsoft.AspNet.FeatureModel/project.json | 4 ++++ src/Microsoft.AspNet.Http.Abstractions/project.json | 4 ++++ src/Microsoft.AspNet.Http.Extensions/project.json | 4 ++++ src/Microsoft.AspNet.Http.Features/project.json | 4 ++++ src/Microsoft.AspNet.Http/project.json | 4 ++++ src/Microsoft.AspNet.Owin/project.json | 4 ++++ src/Microsoft.AspNet.WebUtilities/project.json | 4 ++++ src/Microsoft.Framework.WebEncoders.Core/project.json | 4 ++++ src/Microsoft.Framework.WebEncoders/project.json | 4 ++++ src/Microsoft.Net.Http.Headers/project.json | 4 ++++ 10 files changed, 40 insertions(+) diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json index e744e62052..8ae4b384ed 100644 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ b/src/Microsoft.AspNet.FeatureModel/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature infrastructure.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 1f9e83a30c..2054277592 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 6f5855192b..e068ff06cd 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 common extension methods for HTTP abstractions and IApplicationBuilder.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 9a441ab4dc..26fb66f00a 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature interface definitions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index b8a689a4d2..f2d6728745 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 5363dfdbdd..792f5641ee 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 component for running OWIN middleware.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index b3fb9c1ef6..c1d8fad748 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "ASP.NET 5 common helper methods.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index dc8f3406f5..d2d4b85976 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "compilationOptions": { "allowUnsafe": true }, diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index 37e882873a..d39cd992f4 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -1,6 +1,10 @@ { "version": "1.0.0-*", "description": "Contains registration and configuration APIs for the core framework encoders.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "dependencies": { "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index fcbada8643..e4ae3012b7 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -3,6 +3,10 @@ "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } }, + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, "frameworks" : { "net45" : { }, "dnx451" : { }, From 534becad6bb342c6ddd9f3de63dd6e9964ce663d Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 1 Jul 2015 12:04:43 -0700 Subject: [PATCH 0662/1838] #182 Move StatusCodes from WebUtilities to Http.Abstractions. --- .../StatusCodes.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNet.Http.Abstractions}/StatusCodes.cs (98%) diff --git a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs b/src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs similarity index 98% rename from src/Microsoft.AspNet.WebUtilities/StatusCodes.cs rename to src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs index 70d515f264..ca0d903d87 100644 --- a/src/Microsoft.AspNet.WebUtilities/StatusCodes.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNet.Http { public static class StatusCodes { From 24f90cc91427e89aeea6ac5b127014dc09f9ff6b Mon Sep 17 00:00:00 2001 From: sornaks Date: Tue, 7 Jul 2015 15:51:53 -0700 Subject: [PATCH 0663/1838] Introducing IHtmlContent - an interface which lets any content define how to write itself. --- HttpAbstractions.sln | 17 +++++++++++++- .../IHtmlContent.cs | 22 +++++++++++++++++++ .../Microsoft.AspNet.Html.Abstractions.xproj | 19 ++++++++++++++++ .../project.json | 16 ++++++++++++++ 4 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs create mode 100644 src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj create mode 100644 src/Microsoft.AspNet.Html.Abstractions/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index aa66e840ca..8dc4e20435 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.23017.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -43,6 +43,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEnco EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Core", "src\Microsoft.Framework.WebEncoders.Core\Microsoft.Framework.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -243,6 +245,18 @@ Global {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.ActiveCfg = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.Build.0 = Debug|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.Build.0 = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.ActiveCfg = Release|Any CPU + {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -266,5 +280,6 @@ Global {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs new file mode 100644 index 0000000000..fc77f9edf4 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// HTML content which can be written to a TextWriter. + /// + public interface IHtmlContent + { + /// + /// Writes the content by encoding it with the specified + /// to the specified . + /// + /// The to which the content is written. + /// The which encodes the content to be written. + void WriteTo(TextWriter writer, IHtmlEncoder encoder); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj b/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj new file mode 100644 index 0000000000..564c800504 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 68a28e4a-3ade-4187-9625-4ff185887cb3 + Microsoft.AspNet.Html.Abstractions + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json new file mode 100644 index 0000000000..a2a7420401 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -0,0 +1,16 @@ +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 HTML content interface.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "dependencies": { + "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net45" : { }, + "dnx451": { }, + "dnxcore50": { } + } +} \ No newline at end of file From 25ea93de9e03f1b0be8922bf727163f8ac3be499 Mon Sep 17 00:00:00 2001 From: sornaks Date: Mon, 29 Jun 2015 15:28:19 -0700 Subject: [PATCH 0664/1838] Making QueryHelpers.AddQueryString support # in the URL. --- .../QueryHelpers.cs | 31 ++++++++-- .../QueryHelpersTests.cs | 60 ++++++++++++++++++- 2 files changed, 85 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 95750a3753..34195e8016 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -20,8 +20,8 @@ namespace Microsoft.AspNet.WebUtilities /// The combined result. public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { - bool hasQuery = uri.IndexOf('?') != -1; - return uri + (hasQuery ? "&" : "?") + UrlEncoder.Default.UrlEncode(name) + "=" + UrlEncoder.Default.UrlEncode(value); + return AddQueryString( + uri, new List> { new KeyValuePair(name, value) }); } /// @@ -29,12 +29,31 @@ namespace Microsoft.AspNet.WebUtilities /// /// The base uri. /// A collection of name value query pairs to append. - /// The combine result. + /// The combined result. public static string AddQueryString([NotNull] string uri, [NotNull] IDictionary queryString) { + return AddQueryString(uri, (IEnumerable>)queryString); + } + + private static string AddQueryString( + [NotNull] string uri, + [NotNull] IEnumerable> queryString) + { + var anchorIndex = uri.IndexOf('#'); + var uriToBeAppended = uri; + var anchorText = ""; + // If there is an anchor, then the query string must be inserted before its first occurance. + if (anchorIndex != -1) + { + anchorText = uri.Substring(anchorIndex); + uriToBeAppended = uri.Substring(0, anchorIndex); + } + + var queryIndex = uriToBeAppended.IndexOf('?'); + var hasQuery = queryIndex != -1; + var sb = new StringBuilder(); - sb.Append(uri); - bool hasQuery = uri.IndexOf('?') != -1; + sb.Append(uriToBeAppended); foreach (var parameter in queryString) { sb.Append(hasQuery ? '&' : '?'); @@ -43,6 +62,8 @@ namespace Microsoft.AspNet.WebUtilities sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value)); hasQuery = true; } + + sb.Append(anchorText); return sb.ToString(); } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs index 807e99f6ac..35a68f1a0b 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Collections.Generic; using System.Linq; using Xunit; @@ -52,5 +52,63 @@ namespace Microsoft.AspNet.WebUtilities Assert.Equal(1, collection.Count); Assert.Equal(new[] { "value1", "" }, collection[""]); } + + [Theory] + [InlineData("http://contoso.com/", "http://contoso.com/?hello=world")] + [InlineData("http://contoso.com/someaction", "http://contoso.com/someaction?hello=world")] + [InlineData("http://contoso.com/someaction?q=test", "http://contoso.com/someaction?q=test&hello=world")] + [InlineData( + "http://contoso.com/someaction?q=test#anchor", + "http://contoso.com/someaction?q=test&hello=world#anchor")] + [InlineData("http://contoso.com/someaction#anchor", "http://contoso.com/someaction?hello=world#anchor")] + [InlineData("http://contoso.com/#anchor", "http://contoso.com/?hello=world#anchor")] + [InlineData( + "http://contoso.com/someaction?q=test#anchor?value", + "http://contoso.com/someaction?q=test&hello=world#anchor?value")] + [InlineData( + "http://contoso.com/someaction#anchor?stuff", + "http://contoso.com/someaction?hello=world#anchor?stuff")] + [InlineData( + "http://contoso.com/someaction?name?something", + "http://contoso.com/someaction?name?something&hello=world")] + [InlineData( + "http://contoso.com/someaction#name#something", + "http://contoso.com/someaction?hello=world#name#something")] + public void AddQueryStringWithKeyAndValue(string uri, string expectedUri) + { + var result = QueryHelpers.AddQueryString(uri, "hello", "world"); + Assert.Equal(expectedUri, result); + } + + [Theory] + [InlineData("http://contoso.com/", "http://contoso.com/?hello=world&some=text")] + [InlineData("http://contoso.com/someaction", "http://contoso.com/someaction?hello=world&some=text")] + [InlineData("http://contoso.com/someaction?q=1", "http://contoso.com/someaction?q=1&hello=world&some=text")] + [InlineData("http://contoso.com/some#action", "http://contoso.com/some?hello=world&some=text#action")] + [InlineData("http://contoso.com/some?q=1#action", "http://contoso.com/some?q=1&hello=world&some=text#action")] + [InlineData("http://contoso.com/#action", "http://contoso.com/?hello=world&some=text#action")] + [InlineData( + "http://contoso.com/someaction?q=test#anchor?value", + "http://contoso.com/someaction?q=test&hello=world&some=text#anchor?value")] + [InlineData( + "http://contoso.com/someaction#anchor?stuff", + "http://contoso.com/someaction?hello=world&some=text#anchor?stuff")] + [InlineData( + "http://contoso.com/someaction?name?something", + "http://contoso.com/someaction?name?something&hello=world&some=text")] + [InlineData( + "http://contoso.com/someaction#name#something", + "http://contoso.com/someaction?hello=world&some=text#name#something")] + public void AddQueryStringWithDictionary(string uri, string expectedUri) + { + var queryStrings = new Dictionary() + { + { "hello", "world" }, + { "some", "text" } + }; + + var result = QueryHelpers.AddQueryString(uri, queryStrings); + Assert.Equal(expectedUri, result); + } } } \ No newline at end of file From d142160f470178e1044dd6e94a4043117479c195 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 13 Jul 2015 12:23:03 -0700 Subject: [PATCH 0665/1838] OnCompletedDispose => RegisterForDispose --- src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 914e9604c9..22c4daae06 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Http public abstract void OnCompleted([NotNull] Func callback, object state); - public virtual void OnCompletedDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + public virtual void RegisterForDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); public virtual void OnCompleted([NotNull] Func callback) => OnCompleted(_callbackDelegate, callback); From ad4783314f635e80e8703f05d4663d2a00a86210 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 16 Jul 2015 08:57:10 -0700 Subject: [PATCH 0666/1838] Updating to release NuGet.config --- NuGet.Config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..0e74a4912d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,8 @@  - + + - \ No newline at end of file + From ad5ab9e76cc213383ced06d27716938d03fdd29e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 16 Jul 2015 08:57:24 -0700 Subject: [PATCH 0667/1838] Updating to release NuGet.config --- NuGet.Config | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..0e74a4912d 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,8 @@  - + + - \ No newline at end of file + From b8af07e3c18e1c831d33df3538dc112af476f650 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 16 Jul 2015 15:10:48 -0700 Subject: [PATCH 0668/1838] #60 Merge FeatureModel into Http.Features. Remove unused FeatureObject. --- HttpAbstractions.sln | 17 +- .../FeatureObject.cs | 166 ------------------ .../Microsoft.AspNet.FeatureModel.xproj | 17 -- .../Properties/AssemblyInfo.cs | 6 - .../project.json | 25 --- .../FeatureCollection.cs | 2 +- .../FeatureReference.cs | 2 +- .../IFeatureCollection.cs | 2 +- .../DefaultAuthenticationManager.cs | 1 - .../DefaultConnectionInfo.cs | 1 - .../DefaultHttpContext.cs | 1 - .../DefaultHttpRequest.cs | 1 - .../DefaultHttpResponse.cs | 1 - .../DefaultWebSocketManager.cs | 1 - .../Features/QueryFeature.cs | 1 - .../Features/RequestCookiesFeature.cs | 1 - .../Features/ResponseCookiesFeature.cs | 1 - src/Microsoft.AspNet.Http/project.json | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 2 +- .../OwinFeatureCollection.cs | 1 - .../IThing.cs | 2 +- .../InterfaceDictionaryTests.cs | 2 +- ...icrosoft.AspNet.Http.Features.Tests.xproj} | 0 .../Properties/AssemblyInfo.cs | 4 +- .../Thing.cs | 2 +- .../project.json | 2 +- .../DefaultHttpContextTests.cs | 1 - .../QueryFeatureTests.cs | 1 - .../OwinFeatureCollectionTests.cs | 8 +- 29 files changed, 15 insertions(+), 257 deletions(-) delete mode 100644 src/Microsoft.AspNet.FeatureModel/FeatureObject.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj delete mode 100644 src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.FeatureModel/project.json rename src/{Microsoft.AspNet.FeatureModel => Microsoft.AspNet.Http.Features}/FeatureCollection.cs (99%) rename src/{Microsoft.AspNet.FeatureModel => Microsoft.AspNet.Http.Features}/FeatureReference.cs (96%) rename src/{Microsoft.AspNet.FeatureModel => Microsoft.AspNet.Http.Features}/IFeatureCollection.cs (89%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/IThing.cs (83%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/InterfaceDictionaryTests.cs (98%) rename test/{Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj => Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj} (100%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/Properties/AssemblyInfo.cs (91%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/Thing.cs (86%) rename test/{Microsoft.AspNet.FeatureModel.Tests => Microsoft.AspNet.Http.Features.Tests}/project.json (79%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 8dc4e20435..872a0e3ada 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23017.0 +VisualStudioVersion = 14.0.22823.1 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -13,11 +13,9 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstr EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features", "src\Microsoft.AspNet.Http.Features\Microsoft.AspNet.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel", "src\Microsoft.AspNet.FeatureModel\Microsoft.AspNet.FeatureModel.xproj", "{32A4C918-30EE-41DB-8E26-8A3BB88ED231}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.FeatureModel.Tests", "test\Microsoft.AspNet.FeatureModel.Tests\Microsoft.AspNet.FeatureModel.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features.Tests", "test\Microsoft.AspNet.Http.Features.Tests\Microsoft.AspNet.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions.Tests", "test\Microsoft.AspNet.Http.Abstractions.Tests\Microsoft.AspNet.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject @@ -85,16 +83,6 @@ Global {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|Mixed Platforms.Build.0 = Release|Any CPU {D9128247-8F97-48B8-A863-F1F21A029FCE}.Release|x86.ActiveCfg = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Any CPU.Build.0 = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Debug|x86.ActiveCfg = Debug|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.ActiveCfg = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Any CPU.Build.0 = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {32A4C918-30EE-41DB-8E26-8A3BB88ED231}.Release|x86.ActiveCfg = Release|Any CPU {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Any CPU.Build.0 = Debug|Any CPU {AA99AF26-F7B1-4A6B-A922-5C25539F6391}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -265,7 +253,6 @@ Global {BCF0F967-8753-4438-BD07-AADCA9CE509A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {22071333-15BA-4D16-A1D5-4D5B1A83FBDD} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {D9128247-8F97-48B8-A863-F1F21A029FCE} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {32A4C918-30EE-41DB-8E26-8A3BB88ED231} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {AA99AF26-F7B1-4A6B-A922-5C25539F6391} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {C5D2BAE1-E182-48A0-AA74-1AF14B782BF7} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {F16692B8-9F38-4DCA-A582-E43172B989C6} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs b/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs deleted file mode 100644 index bc6bc2b2d6..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/FeatureObject.cs +++ /dev/null @@ -1,166 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Reflection; -using System.Linq; - -namespace Microsoft.AspNet.FeatureModel -{ - public class FeatureObject : IFeatureCollection - { - private readonly object _instance; - - public FeatureObject(object instance) - { - _instance = instance; - } - - public void Dispose() - { - var disposable = _instance as IDisposable; - if (disposable != null) - { - disposable.Dispose(); - } - } - - public object GetInterface(Type type) - { - if (type.IsInstanceOfType(_instance)) - { - return _instance; - } - - return null; - } - - public void SetInterface(Type type, object feature) - { - throw new NotImplementedException(); - } - - public int Revision - { - get { return 0; } - } - - public IEnumerator> GetEnumerator() - { - return GetTypeInterfaces() - .Select(interfaceType => new KeyValuePair(interfaceType, _instance)) - .GetEnumerator(); - } - - private IEnumerable GetTypeInterfaces() - { - return _instance.GetType() - .GetTypeInfo() - .ImplementedInterfaces; - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public void Add(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public void Clear() - { - throw new NotImplementedException(); - } - - public bool Contains(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - var enumerator = GetTypeInterfaces().GetEnumerator(); - for (var index = 0; index != arrayIndex; ++index) - { - if (!enumerator.MoveNext()) - { - throw new IndexOutOfRangeException(); - } - } - - for (var index = 0; index != array.Length; ++index) - { - if (!enumerator.MoveNext()) - { - throw new IndexOutOfRangeException(); - } - array[index] = new KeyValuePair(enumerator.Current, _instance); - } - } - - public bool Remove(KeyValuePair item) - { - throw new NotImplementedException(); - } - - public int Count - { - get { return GetTypeInterfaces().Count(); } - } - - public bool IsReadOnly - { - get { return true; } - } - - public bool ContainsKey(Type key) - { - return key.GetTypeInfo().IsAssignableFrom(_instance.GetType().GetTypeInfo()); - } - - public void Add(Type key, object value) - { - throw new NotImplementedException(); - } - - public bool Remove(Type key) - { - throw new NotImplementedException(); - } - - public bool TryGetValue(Type key, out object value) - { - value = GetInterface(key); - return value != null; - } - - public object this[Type key] - { - get { return GetInterface(key); } - set { throw new NotImplementedException(); } - } - - public ICollection Keys - { - get { return GetTypeInterfaces().ToArray(); } - } - - public ICollection Values - { - get - { - var length = GetTypeInterfaces().Count(); - var array = new object[length]; - for (var index = 0; index != length; ++index) - { - array[index] = _instance; - } - return array; - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj b/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj deleted file mode 100644 index bd9dcea294..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Microsoft.AspNet.FeatureModel.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 32a4c918-30ee-41db-8e26-8a3bb88ed231 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs deleted file mode 100644 index 025a94598c..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,6 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; - -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.FeatureModel/project.json b/src/Microsoft.AspNet.FeatureModel/project.json deleted file mode 100644 index 8ae4b384ed..0000000000 --- a/src/Microsoft.AspNet.FeatureModel/project.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature infrastructure.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } - }, - "frameworks": { - "dnx451": {}, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Reflection": "4.0.10-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Threading": "4.0.10-beta-*" - } - } - } -} diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs similarity index 99% rename from src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs rename to src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 40e386a491..1fbbaf4288 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; -namespace Microsoft.AspNet.FeatureModel +namespace Microsoft.AspNet.Http.Features { public class FeatureCollection : IFeatureCollection { diff --git a/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs similarity index 96% rename from src/Microsoft.AspNet.FeatureModel/FeatureReference.cs rename to src/Microsoft.AspNet.Http.Features/FeatureReference.cs index fba03637be..7ffb94d555 100644 --- a/src/Microsoft.AspNet.FeatureModel/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.FeatureModel +namespace Microsoft.AspNet.Http.Features { public struct FeatureReference { diff --git a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs similarity index 89% rename from src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs rename to src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index e4b26818d1..70f91770e1 100644 --- a/src/Microsoft.AspNet.FeatureModel/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.FeatureModel +namespace Microsoft.AspNet.Http.Features { public interface IFeatureCollection : IDictionary, IDisposable { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 526dfea4f3..d0cec090c0 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 5237739aa9..30a7ace398 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -5,7 +5,6 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 5dc1c96cfe..0ff8ae2b89 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Authentication; using Microsoft.AspNet.Http.Authentication.Internal; using Microsoft.AspNet.Http.Features; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index bf374999b9..479ead6ebf 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index cf3b006945..0dae9253b9 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index c329ffe05e..7a8f87d125 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index a46b6ecb83..02545c50a1 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index e0ba1dcc3e..08317fdd50 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index 410fce7a25..96504f1ff7 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index f2d6728745..991ddf3103 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,6 @@ "url": "git://github.com/aspnet/httpabstractions" }, "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 93b487006e..770f02fb46 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -6,8 +6,8 @@ using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Owin; namespace Microsoft.AspNet.Builder diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index b718d36097..ca1cca500b 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -14,7 +14,6 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.Framework.Internal; diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs b/test/Microsoft.AspNet.Http.Features.Tests/IThing.cs similarity index 83% rename from test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs rename to test/Microsoft.AspNet.Http.Features.Tests/IThing.cs index fca3041bb8..7210b9821a 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/IThing.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/IThing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.FeatureModel.Tests +namespace Microsoft.AspNet.Http.Features { public interface IThing { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs similarity index 98% rename from test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs rename to test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs index 27d2f565a2..3d4879f0a3 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/InterfaceDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.AspNet.FeatureModel.Tests +namespace Microsoft.AspNet.Http.Features { public class InterfaceDictionaryTests { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj b/test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.FeatureModel.Tests/Microsoft.AspNet.FeatureModel.Tests.xproj rename to test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs similarity index 91% rename from test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs index 898c5f8fe7..86561ba516 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs @@ -8,11 +8,11 @@ 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("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyTitle("Microsoft.AspNet.Http.Features.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.FeatureModel.Tests")] +[assembly: AssemblyProduct("Microsoft.AspNet.Http.Features.Tests")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs b/test/Microsoft.AspNet.Http.Features.Tests/Thing.cs similarity index 86% rename from test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs rename to test/Microsoft.AspNet.Http.Features.Tests/Thing.cs index 217833d5af..7f39f86a71 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/Thing.cs +++ b/test/Microsoft.AspNet.Http.Features.Tests/Thing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.FeatureModel.Tests +namespace Microsoft.AspNet.Http.Features { public class Thing : IThing { diff --git a/test/Microsoft.AspNet.FeatureModel.Tests/project.json b/test/Microsoft.AspNet.Http.Features.Tests/project.json similarity index 79% rename from test/Microsoft.AspNet.FeatureModel.Tests/project.json rename to test/Microsoft.AspNet.Http.Features.Tests/project.json index a09a4171c6..12e00145bc 100644 --- a/test/Microsoft.AspNet.FeatureModel.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Features.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index c8c1b0bc47..f24035e672 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Xunit; diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index a110b09946..61d2ed4d34 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; using Xunit; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 03f2258a0c..74ddec0d46 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -3,7 +3,6 @@ using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http.Features; using Xunit; @@ -32,7 +31,7 @@ namespace Microsoft.AspNet.Owin { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, }; - var features = new FeatureObject(new OwinFeatureCollection(env)); + var features = new OwinFeatureCollection(env); var requestFeature = Get(features); Assert.Equal(requestFeature.Method, "POST"); @@ -51,7 +50,7 @@ namespace Microsoft.AspNet.Owin { "owin.RequestPathBase", "/pathBase" }, { "owin.RequestQueryString", "name=value" }, }; - var features = new FeatureObject(new OwinFeatureCollection(env)); + var features = new OwinFeatureCollection(env); var requestFeature = Get(features); requestFeature.Method = "GET"; @@ -72,11 +71,10 @@ namespace Microsoft.AspNet.Owin { {"owin.RequestMethod", "POST"} }; - var features = new FeatureObject(new OwinFeatureCollection(env)); + var features = new OwinFeatureCollection(env); var entries = features.ToArray(); var keys = features.Keys.ToArray(); - var values = features.Values.ToArray(); Assert.Contains(typeof(IHttpRequestFeature), keys); Assert.Contains(typeof(IHttpResponseFeature), keys); From a8c755e6649db3bf4191dc8d96a8cddf2a148b22 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 17 Jul 2015 09:28:11 -0700 Subject: [PATCH 0669/1838] React to FeatureModel package change. --- .../IServerFactory.cs | 2 +- src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json | 2 +- src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs | 2 +- src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs | 2 +- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 1 - src/Microsoft.AspNet.TestHost/TestServer.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 -- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 1 - 8 files changed, 5 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs index be933ea8f7..09c696b8c8 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs @@ -3,7 +3,7 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; +using Microsoft.AspNet.Http.Features; using Microsoft.Framework.Configuration; namespace Microsoft.AspNet.Hosting.Server diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index c9ea12da6a..07cab5d291 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -5,7 +5,7 @@ "url": "git://github.com/aspnet/hosting" }, "dependencies": { - "Microsoft.AspNet.FeatureModel": "1.0.0-*", + "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.Configuration.Abstractions": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 88ea3a3472..7fccad6854 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -1,8 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Hosting.Builder diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs index 128dfc4fa1..ed1d9f4cc3 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs @@ -1,8 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Hosting.Builder { diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index f5b501af7e..a5f61bd4f9 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -10,7 +10,6 @@ using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 3dfacf4b59..9bacf1226c 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -5,11 +5,11 @@ using System; using System.Net.Http; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Runtime.Infrastructure; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index b9f0d6a442..213d57b460 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -6,9 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 779afc7a87..5ce037f2ba 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -7,7 +7,6 @@ using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.FeatureModel; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; From 6b9093679e2a6b7c9dad61609230ccfa80fb0f8b Mon Sep 17 00:00:00 2001 From: Andrew Stanton-Nurse Date: Tue, 21 Jul 2015 14:56:53 -0700 Subject: [PATCH 0670/1838] react to DNX renames --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 052f4740c1..b1786b336e 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -60,7 +60,7 @@ namespace Microsoft.AspNet.Hosting var services = new ServiceCollection(); // Import from manifest - var manifest = _services.GetService(); + var manifest = _services.GetService(); if (manifest != null) { foreach (var service in manifest.Services) From bc409abb7dc124b1dafe174fd46d4d022054fb64 Mon Sep 17 00:00:00 2001 From: Eilon Lipton Date: Wed, 22 Jul 2015 14:01:56 -0700 Subject: [PATCH 0671/1838] Update API usage from Configuration change Caused by https://github.com/aspnet/Configuration/commit/602ce3723f2db9440c09abd732ae59748d768d55 --- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 213d57b460..6e19e004ad 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Hosting }; var builder = new ConfigurationBuilder() - .Add(new MemoryConfigurationSource(vals)); + .AddInMemoryCollection(vals); var config = builder.Build(); var host = CreateBuilder(config).Build(); host.Start(); @@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Hosting }; var builder = new ConfigurationBuilder() - .Add(new MemoryConfigurationSource(vals)); + .AddInMemoryCollection(vals); var config = builder.Build(); var host = CreateBuilder(config).Build(); host.Start(); @@ -158,7 +158,7 @@ namespace Microsoft.AspNet.Hosting }; var builder = new ConfigurationBuilder() - .Add(new MemoryConfigurationSource(vals)); + .AddInMemoryCollection(vals); var config = builder.Build(); var engine = CreateBuilder(config).Build(); @@ -175,7 +175,7 @@ namespace Microsoft.AspNet.Hosting }; var builder = new ConfigurationBuilder() - .Add(new MemoryConfigurationSource(vals)); + .AddInMemoryCollection(vals); var config = builder.Build(); var engine = CreateBuilder(config).Build(); From 72a41c78b9225ed2b697f4bfb810c80990408f56 Mon Sep 17 00:00:00 2001 From: moozzyk Date: Thu, 23 Jul 2015 13:40:28 -0700 Subject: [PATCH 0672/1838] Fixing dnx.exe arguments in deployer to fix server tests --- .gitignore | 1 + .../Deployers/MonoDeployer.cs | 7 ++++--- .../Deployers/SelfHostDeployer.cs | 7 +++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/.gitignore b/.gitignore index ac82da7568..58ebbb8fa3 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,4 @@ nuget.exe *.ipch *.sln.ide project.lock.json +/.vs/ diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs index df44e88ecd..4b8a17eb7a 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -62,13 +62,14 @@ namespace Microsoft.AspNet.Server.Testing throw new InvalidOperationException("kestrel is the only valid ServerType for Mono"); } - Logger.LogInformation("Executing command: dnx \"{appPath}\" kestrel --server.urls {url}", - DeploymentParameters.ApplicationPath, DeploymentParameters.ApplicationBaseUriHint); + var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Framework.ApplicationHost kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + + Logger.LogInformation("Executing command: dnx {dnxArgs}", dnxArgs); var startInfo = new ProcessStartInfo { FileName = "dnx", - Arguments = string.Format("\"{0}\" kestrel --server.urls {1}", DeploymentParameters.ApplicationPath, DeploymentParameters.ApplicationBaseUriHint), + Arguments = dnxArgs, UseShellExecute = false, CreateNoWindow = true, RedirectStandardInput = true diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index e23ae53cef..58c1c9420e 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -49,14 +49,13 @@ namespace Microsoft.AspNet.Server.Testing { var commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; var dnxPath = Path.Combine(ChosenRuntimePath, "dnx.exe"); - Logger.LogInformation("Executing {dnxexe} {appPath} {command} --server.urls {url}", - dnxPath, DeploymentParameters.ApplicationPath, - commandName, DeploymentParameters.ApplicationBaseUriHint); + var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Framework.ApplicationHost {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + Logger.LogInformation("Executing {dnxexe} {dnxArgs}", dnxPath, dnxArgs); var startInfo = new ProcessStartInfo { FileName = dnxPath, - Arguments = string.Format("\"{0}\" {1} --server.urls {2}", DeploymentParameters.ApplicationPath, commandName, DeploymentParameters.ApplicationBaseUriHint), + Arguments = dnxArgs, UseShellExecute = false, CreateNoWindow = true, RedirectStandardError = true, From dfe427d3b32478db198f356ee22507b50461060d Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 29 Jul 2015 00:01:20 -0700 Subject: [PATCH 0673/1838] React to DNX renames --- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- .../Deployers/IISExpressDeployer.cs | 4 ++-- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 3 +-- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 1 - 10 files changed, 10 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 2ef0635d6f..ba8dc8bc1b 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -4,7 +4,7 @@ using System; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime; +using Microsoft.Dnx.Runtime; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index b1786b336e..c9edac597a 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -7,11 +7,11 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Internal; using Microsoft.Framework.Logging; -using Microsoft.Framework.Runtime; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 8b202b7129..f407a3ae74 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -18,7 +18,7 @@ "Microsoft.Framework.Configuration.Ini": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 5dbf924e5a..69edd89026 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -5,9 +5,9 @@ using System; using System.Diagnostics; using System.IO; using System.Threading; +using Microsoft.Dnx.Runtime; +using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Framework.Logging; -using Microsoft.Framework.Runtime; -using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 84b84fe211..1898cddb4a 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -8,7 +8,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*" + "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 9bacf1226c..571ceb2662 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -7,12 +7,11 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; +using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Runtime.Infrastructure; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 6e19e004ad..5fc960078f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -18,7 +18,7 @@ using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; -using Microsoft.Framework.Runtime.Infrastructure; +using Microsoft.Dnx.Runtime.Infrastructure; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 94cf636d9c..21f58bddbc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Hosting.Internal; -using Microsoft.Framework.Runtime.Infrastructure; +using Microsoft.Dnx.Runtime.Infrastructure; using Xunit; namespace Microsoft.AspNet.Hosting diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 3465647dff..cb5c6a1159 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index d1dbcb93e1..94b9afce84 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -13,7 +13,6 @@ using Microsoft.AspNet.Http; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; -using Microsoft.Framework.Runtime.Infrastructure; using Xunit; namespace Microsoft.AspNet.TestHost From 4154dbb8c36e754a974939ae4556ad056c9b12f3 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 29 Jul 2015 01:30:00 -0700 Subject: [PATCH 0674/1838] Fix dnx arguments --- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index ba8dc8bc1b..8b6a14c387 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; -using Microsoft.Dnx.Runtime; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs index 4b8a17eb7a..6619bc8e12 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Server.Testing throw new InvalidOperationException("kestrel is the only valid ServerType for Mono"); } - var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Framework.ApplicationHost kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Dnx.ApplicationHost kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; Logger.LogInformation("Executing command: dnx {dnxArgs}", dnxArgs); diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 58c1c9420e..685a88e388 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -49,7 +49,7 @@ namespace Microsoft.AspNet.Server.Testing { var commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; var dnxPath = Path.Combine(ChosenRuntimePath, "dnx.exe"); - var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Framework.ApplicationHost {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Dnx.ApplicationHost {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; Logger.LogInformation("Executing {dnxexe} {dnxArgs}", dnxPath, dnxArgs); var startInfo = new ProcessStartInfo diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 5fc960078f..efb0335121 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -14,11 +14,11 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Testing.xunit; +using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; using Microsoft.Framework.OptionsModel; -using Microsoft.Dnx.Runtime.Infrastructure; using Moq; using Xunit; From 466c44188202f6bd7079f5f9be6331eb9f54154d Mon Sep 17 00:00:00 2001 From: mishfit Date: Mon, 27 Jul 2015 11:29:05 -0500 Subject: [PATCH 0675/1838] show how to exit - grammer - verbiage --- src/Microsoft.AspNet.Hosting/Program.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 8b6a14c387..985feeda86 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -37,7 +37,8 @@ namespace Microsoft.AspNet.Hosting var host = new WebHostBuilder(_serviceProvider, config).Build(); using (host.Start()) { - Console.WriteLine("Started"); + Console.WriteLine("Application started. Press Ctrl+C to shut down."); + var appShutdownService = host.ApplicationServices.GetRequiredService(); Console.CancelKeyPress += (sender, eventArgs) => { From 712b1d1aeca13d38ec86175f5ab775efb0a80383 Mon Sep 17 00:00:00 2001 From: anurse Date: Fri, 31 Jul 2015 11:48:21 -0700 Subject: [PATCH 0676/1838] fix build --- .../Deployers/IISExpressDeployer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 69edd89026..5309a59925 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Server.Testing private void CopyAspNetLoader() { var libraryManager = (ILibraryManager)CallContextServiceLocator.Locator.ServiceProvider.GetService(typeof(ILibraryManager)); - var interopLibrary = libraryManager.GetLibraryInformation("Microsoft.AspNet.Loader.IIS.Interop"); + var interopLibrary = libraryManager.GetLibrary("Microsoft.AspNet.Loader.IIS.Interop"); if (interopLibrary == null) { From 5d7ec0e2c60c2a849a0cbd93cc5a07eb2d1c3115 Mon Sep 17 00:00:00 2001 From: sornaks Date: Mon, 3 Aug 2015 11:08:54 -0700 Subject: [PATCH 0677/1838] Changing QueryHelpers.AddQueryString to use Array instead of List. --- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 34195e8016..6df0e2d701 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.WebUtilities public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) { return AddQueryString( - uri, new List> { new KeyValuePair(name, value) }); + uri, new [] { new KeyValuePair(name, value) }); } /// From ac945a0bcf43334f163a66223dd4d7bb10cff6aa Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 28 Jul 2015 12:24:42 -0700 Subject: [PATCH 0678/1838] #339 Reduce IFeatureCollection surface area. --- .../FeatureCollection.cs | 167 ++++++------------ .../FeatureReference.cs | 14 +- .../IFeatureCollection.cs | 18 +- .../project.json | 1 + .../DefaultHttpContext.cs | 3 +- .../OwinFeatureCollection.cs | 167 +++++------------- .../FeatureCollectionTests.cs | 48 +++++ .../InterfaceDictionaryTests.cs | 83 --------- .../QueryFeatureTests.cs | 2 +- .../OwinFeatureCollectionTests.cs | 20 +-- 10 files changed, 174 insertions(+), 349 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs delete mode 100644 test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 1fbbaf4288..16b4d6fb44 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -4,15 +4,16 @@ using System; using System.Collections; using System.Collections.Generic; +using System.Linq; using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { public class FeatureCollection : IFeatureCollection { + private static KeyComparer FeatureKeyComparer = new FeatureCollection.KeyComparer(); private readonly IFeatureCollection _defaults; - private readonly IDictionary _featureByFeatureType = new Dictionary(); - private readonly object _containerSync = new object(); + private IDictionary _features; private volatile int _containerRevision; public FeatureCollection() @@ -24,53 +25,38 @@ namespace Microsoft.AspNet.Http.Features _defaults = defaults; } - public object GetInterface() - { - return GetInterface(null); - } - - public object GetInterface([NotNull] Type type) - { - object feature; - if (_featureByFeatureType.TryGetValue(type, out feature)) - { - return feature; - } - - if (_defaults != null && _defaults.TryGetValue(type, out feature)) - { - return feature; - } - return null; - } - - void SetInterface([NotNull] Type type, object feature) - { - if (feature == null) - { - Remove(type); - return; - } - - lock (_containerSync) - { - _featureByFeatureType[type] = feature; - _containerRevision++; - } - } - public virtual int Revision { - get { return _containerRevision; } + get { return _containerRevision + (_defaults?.Revision ?? 0); } } - public void Dispose() - { - } + public bool IsReadOnly { get { return false; } } - public IEnumerator> GetEnumerator() + public object this[[NotNull] Type key] { - throw new NotImplementedException(); + get + { + object result; + return _features != null && _features.TryGetValue(key, out result) ? result : _defaults?[key]; + } + set + { + if (value == null) + { + if (_features != null && _features.Remove(key)) + { + _containerRevision++; + } + return; + } + + if (_features == null) + { + _features = new Dictionary(); + } + _features[key] = value; + _containerRevision++; + } } IEnumerator IEnumerable.GetEnumerator() @@ -78,89 +64,42 @@ namespace Microsoft.AspNet.Http.Features return GetEnumerator(); } - public void Add(KeyValuePair item) + public IEnumerator> GetEnumerator() { - SetInterface(item.Key, item.Value); - } - - public void Clear() - { - throw new NotImplementedException(); - } - - public bool Contains(KeyValuePair item) - { - object value; - return TryGetValue(item.Key, out value) && Equals(item.Value, value); - } - - public void CopyTo(KeyValuePair[] array, int arrayIndex) - { - throw new NotImplementedException(); - } - - public bool Remove(KeyValuePair item) - { - return Contains(item) && Remove(item.Key); - } - - public int Count - { - get { throw new NotImplementedException(); } - } - - public bool IsReadOnly - { - get { return false; } - } - - public bool ContainsKey([NotNull] Type key) - { - return GetInterface(key) != null; - } - - public void Add([NotNull] Type key, [NotNull] object value) - { - if (ContainsKey(key)) + if (_features != null) { - throw new ArgumentException(); - } - SetInterface(key, value); - } - - public bool Remove([NotNull] Type key) - { - lock (_containerSync) - { - if (_featureByFeatureType.Remove(key)) + foreach (var pair in _features) { - _containerRevision++; - return true; + yield return pair; + } + } + + if (_defaults != null) + { + // Don't return features masked by the wrapper. + foreach (var pair in _features == null ? _defaults : _defaults.Except(_features, FeatureKeyComparer)) + { + yield return pair; } - return false; } } - public bool TryGetValue([NotNull] Type key, out object value) + public virtual void Dispose() { - value = GetInterface(key); - return value != null; + _defaults?.Dispose(); } - public object this[Type key] + private class KeyComparer : IEqualityComparer> { - get { return GetInterface(key); } - set { SetInterface(key, value); } - } + public bool Equals(KeyValuePair x, KeyValuePair y) + { + return x.Key.Equals(y.Key); + } - public ICollection Keys - { - get { throw new NotImplementedException(); } - } - - public ICollection Values - { - get { throw new NotImplementedException(); } + public int GetHashCode(KeyValuePair obj) + { + throw new NotImplementedException(); + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReference.cs b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs index 7ffb94d555..538297a3a0 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureReference.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureReference.cs @@ -18,23 +18,19 @@ namespace Microsoft.AspNet.Http.Features public T Fetch(IFeatureCollection features) { - if (_revision == features.Revision) return _feature; - object value; - if (features.TryGetValue(typeof(T), out value)) + if (_revision == features.Revision) { - _feature = (T)value; - } - else - { - _feature = default(T); + return _feature; } + _feature = (T)features[typeof(T)]; _revision = features.Revision; return _feature; } public T Update(IFeatureCollection features, T feature) { - features[typeof(T)] = _feature = feature; + features[typeof(T)] = feature; + _feature = feature; _revision = features.Revision; return feature; } diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index 70f91770e1..ba612b10c6 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -3,11 +3,27 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { - public interface IFeatureCollection : IDictionary, IDisposable + public interface IFeatureCollection : IEnumerable>, IDisposable { + /// + /// Indicates if the collection can be modified. + /// + bool IsReadOnly { get; } + + /// + /// Incremented for each modification and can be used verify cached results. + /// int Revision { get; } + + /// + /// Gets or sets a given feature. Setting a null value removes the feature. + /// + /// + /// The requested feature, or null if it is not present. + object this[[NotNull] Type key] { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 26fb66f00a..a44172292c 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -13,6 +13,7 @@ "dnxcore50": { "dependencies": { "System.Collections": "4.0.10-beta-*", + "System.Linq": "4.0.0-beta-*", "System.Net.Primitives": "4.0.10-beta-*", "System.Net.WebSockets": "4.0.0-beta-*", "System.Runtime.Extensions": "4.0.10-beta-*", diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 0ff8ae2b89..c3caf8ec66 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -172,8 +172,7 @@ namespace Microsoft.AspNet.Http.Internal public override object GetFeature(Type type) { - object value; - return _features.TryGetValue(type, out value) ? value : null; + return _features[type]; } public override void SetFeature(Type type, object instance) diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index ca1cca500b..6dd44e52e6 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; using System.Collections.Generic; using System.Globalization; using System.IO; -using System.Linq; using System.Net; using System.Net.WebSockets; using System.Reflection; @@ -16,7 +16,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Owin { @@ -111,6 +110,12 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.RequestHeaders, value); } } + string IHttpRequestIdentifierFeature.TraceIdentifier + { + get { return Prop(OwinConstants.RequestId); } + set { Prop(OwinConstants.RequestId, value); } + } + Stream IHttpRequestFeature.Body { get { return Prop(OwinConstants.RequestBody); } @@ -266,7 +271,7 @@ namespace Microsoft.AspNet.Owin /// /// Gets or sets if the underlying server supports WebSockets. This is enabled by default. - /// The value should be consistant across requests. + /// The value should be consistent across requests. /// public bool SupportsWebSockets { get; set; } @@ -290,17 +295,25 @@ namespace Microsoft.AspNet.Owin return accept(context); } + // IFeatureCollection + public int Revision { get { return 0; } // Not modifiable } - public void Add(Type key, object value) + public bool IsReadOnly { - throw new NotSupportedException(); + get { return true; } } - public bool ContainsKey(Type key) + public object this[Type key] + { + get { return Get(key); } + set { throw new NotSupportedException(); } + } + + private bool SupportsInterface(Type key) { // Does this type implement the requested interface? if (key.GetTypeInfo().IsAssignableFrom(GetType().GetTypeInfo())) @@ -325,136 +338,48 @@ namespace Microsoft.AspNet.Owin return false; } - public ICollection Keys + public object Get(Type key) { - get + if (SupportsInterface(key)) { - var keys = new List() - { - typeof(IHttpRequestFeature), - typeof(IHttpResponseFeature), - typeof(IHttpConnectionFeature), - typeof(IOwinEnvironmentFeature), - typeof(IHttpRequestLifetimeFeature), - typeof(IHttpAuthenticationFeature), - }; - if (SupportsSendFile) - { - keys.Add(typeof(IHttpSendFileFeature)); - } - if (SupportsClientCerts) - { - keys.Add(typeof(ITlsConnectionFeature)); - } - if (SupportsWebSockets) - { - keys.Add(typeof(IHttpWebSocketFeature)); - } - return keys; + return this; } + return null; } - public bool Remove(Type key) + public void Set(Type key, object value) { throw new NotSupportedException(); } - public bool TryGetValue(Type key, out object value) + IEnumerator IEnumerable.GetEnumerator() { - if (ContainsKey(key)) - { - value = this; - return true; - } - value = null; - return false; - } - - public ICollection Values - { - get { throw new NotSupportedException(); } - } - - public object this[Type key] - { - get - { - object value; - if (TryGetValue(key, out value)) - { - return value; - } - throw new KeyNotFoundException(key.FullName); - } - set - { - throw new NotSupportedException(); - } - } - - public void Add(KeyValuePair item) - { - throw new NotSupportedException(); - } - - public void Clear() - { - throw new NotSupportedException(); - } - - public bool Contains(KeyValuePair item) - { - object result; - return TryGetValue(item.Key, out result) && result.Equals(item.Value); - } - - public void CopyTo([NotNull] KeyValuePair[] array, int arrayIndex) - { - if (arrayIndex < 0 || arrayIndex > array.Length) - { - throw new ArgumentOutOfRangeException(nameof(arrayIndex), arrayIndex, string.Empty); - } - var keys = Keys; - if (keys.Count > array.Length - arrayIndex) - { - throw new ArgumentException(); - } - - foreach (var key in keys) - { - array[arrayIndex++] = new KeyValuePair(key, this[key]); - } - } - - public int Count - { - get { return Keys.Count; } - } - - public bool IsReadOnly - { - get { return true; } - } - - string IHttpRequestIdentifierFeature.TraceIdentifier - { - get { return Prop(OwinConstants.RequestId); } - set { Prop(OwinConstants.RequestId, value); } - } - - public bool Remove(KeyValuePair item) - { - throw new NotSupportedException(); + return GetEnumerator(); } public IEnumerator> GetEnumerator() { - return Keys.Select(type => new KeyValuePair(type, this[type])).GetEnumerator(); - } + yield return new KeyValuePair(typeof(IHttpRequestFeature), this); + yield return new KeyValuePair(typeof(IHttpResponseFeature), this); + yield return new KeyValuePair(typeof(IHttpConnectionFeature), this); + yield return new KeyValuePair(typeof(IHttpRequestIdentifierFeature), this); + yield return new KeyValuePair(typeof(IHttpRequestLifetimeFeature), this); + yield return new KeyValuePair(typeof(IHttpAuthenticationFeature), this); + yield return new KeyValuePair(typeof(IOwinEnvironmentFeature), this); - System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); + // Check for conditional features + if (SupportsSendFile) + { + yield return new KeyValuePair(typeof(IHttpSendFileFeature), this); + } + if (SupportsClientCerts) + { + yield return new KeyValuePair(typeof(ITlsConnectionFeature), this); + } + if (SupportsWebSockets) + { + yield return new KeyValuePair(typeof(IHttpWebSocketFeature), this); + } } public void Dispose() diff --git a/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs b/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs new file mode 100644 index 0000000000..2cc0ed6448 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs @@ -0,0 +1,48 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.AspNet.Http.Features +{ + public class FeatureCollectionTests + { + [Fact] + public void AddedInterfaceIsReturned() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + + object thing2 = interfaces[typeof(IThing)]; + Assert.Equal(thing2, thing); + } + + [Fact] + public void IndexerAlsoAddsItems() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + + Assert.Equal(interfaces[typeof(IThing)], thing); + } + + [Fact] + public void SetNullValueRemoves() + { + var interfaces = new FeatureCollection(); + var thing = new Thing(); + + interfaces[typeof(IThing)] = thing; + Assert.Equal(interfaces[typeof(IThing)], thing); + + interfaces[typeof(IThing)] = null; + + object thing2 = interfaces[typeof(IThing)]; + Assert.Null(thing2); + } + } +} diff --git a/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs b/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs deleted file mode 100644 index 3d4879f0a3..0000000000 --- a/test/Microsoft.AspNet.Http.Features.Tests/InterfaceDictionaryTests.cs +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.AspNet.Http.Features -{ - public class InterfaceDictionaryTests - { - [Fact] - public void AddedInterfaceIsReturned() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - - Assert.Equal(interfaces[typeof(IThing)], thing); - - object thing2; - Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); - Assert.Equal(thing2, thing); - } - - [Fact] - public void IndexerAlsoAddsItems() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces[typeof(IThing)] = thing; - - Assert.Equal(interfaces[typeof(IThing)], thing); - - object thing2; - Assert.True(interfaces.TryGetValue(typeof(IThing), out thing2)); - Assert.Equal(thing2, thing); - } - - [Fact] - public void SecondCallToAddThrowsException() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - - Assert.Throws(() => interfaces.Add(typeof(IThing), thing)); - } - - [Fact] - public void RemovedInterfaceIsRemoved() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - - Assert.Equal(interfaces[typeof(IThing)], thing); - - Assert.True(interfaces.Remove(typeof(IThing))); - - object thing2; - Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); - } - - [Fact] - public void SetNullValueRemoves() - { - var interfaces = new FeatureCollection(); - var thing = new Thing(); - - interfaces.Add(typeof(IThing), thing); - Assert.Equal(interfaces[typeof(IThing)], thing); - - interfaces[typeof(IThing)] = null; - - object thing2; - Assert.False(interfaces.TryGetValue(typeof(IThing), out thing2)); - } - } -} diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs index 61d2ed4d34..9c5a84a9f5 100644 --- a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var features = new FeatureCollection(); var request = new HttpRequestFeature(); request.QueryString = "foo=bar"; - features.Add(typeof(IHttpRequestFeature), request); + features[typeof(IHttpRequestFeature)] = request; var provider = new QueryFeature(features); diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index 74ddec0d46..b4958629f7 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -12,9 +12,9 @@ namespace Microsoft.AspNet.Owin { private T Get(IFeatureCollection features) { - object value; - return features.TryGetValue(typeof(T), out value) ? (T)value : default(T); + return (T)features[typeof(T)]; } + private T Get(IDictionary env, string key) { object value; @@ -63,22 +63,6 @@ namespace Microsoft.AspNet.Owin Assert.Equal("/pathBase2", Get(env, "owin.RequestPathBase")); Assert.Equal("name=value2", Get(env, "owin.RequestQueryString")); } - - [Fact] - public void ImplementedInterfacesAreEnumerated() - { - var env = new Dictionary - { - {"owin.RequestMethod", "POST"} - }; - var features = new OwinFeatureCollection(env); - - var entries = features.ToArray(); - var keys = features.Keys.ToArray(); - - Assert.Contains(typeof(IHttpRequestFeature), keys); - Assert.Contains(typeof(IHttpResponseFeature), keys); - } } } From b138f2a4601041dd051d3a9089d9f939afcc6886 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 3 Aug 2015 15:46:01 -0700 Subject: [PATCH 0679/1838] React to IFeatureCollection API changes. --- .../HostingEngineTests.cs | 66 +++++++++++-------- 1 file changed, 39 insertions(+), 27 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index efb0335121..579febdd8f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; @@ -17,7 +17,7 @@ using Microsoft.AspNet.Testing.xunit; using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; +using Microsoft.Framework.Internal; using Microsoft.Framework.OptionsModel; using Moq; using Xunit; @@ -254,14 +254,8 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var featuresSupportedByHost = new Mock(); - featuresSupportedByHost - .Setup(fc => fc.Add(It.IsAny(), It.IsAny())) - .Throws(new NotImplementedException()); - featuresSupportedByHost - .Setup(fc => fc.Add(new KeyValuePair(It.IsAny(), It.IsAny()))) - .Throws(new NotImplementedException()); - _featuresSupportedByThisHost = featuresSupportedByHost.Object; + + _featuresSupportedByThisHost = new ReadOnlyFeatureCollection(); var hostingEngine = CreateHostingEngine(requestDelegate); @@ -284,7 +278,7 @@ namespace Microsoft.AspNet.Hosting return Task.FromResult(0); }); var requestIdentifierFeature = new Mock().Object; - _featuresSupportedByThisHost.Add(typeof(IHttpRequestIdentifierFeature), requestIdentifierFeature); + _featuresSupportedByThisHost[typeof(IHttpRequestIdentifierFeature)] = requestIdentifierFeature; var hostingEngine = CreateHostingEngine(requestDelegate); // Act @@ -346,25 +340,10 @@ namespace Microsoft.AspNet.Hosting private IHostingEngine CreateHostingEngine(RequestDelegate requestDelegate) { - var applicationBuilder = new Mock(); - applicationBuilder.Setup(appBuilder => appBuilder.Build()).Returns(requestDelegate); - var applicationBuilderFactory = new Mock(); - applicationBuilderFactory - .Setup(abf => abf.CreateBuilder(It.IsAny())) - .Returns(applicationBuilder.Object); - var host = CreateBuilder() .UseServer(this) - .UseServices(s => - { - s.AddInstance(applicationBuilderFactory.Object); - s.AddInstance(new Mock>().Object); - s.AddSingleton(); - s.AddInstance(new Mock().Object); - s.AddInstance(new Mock().Object); - }) .UseStartup( - appBuilder => { }, + appBuilder => { appBuilder.Run(requestDelegate); }, configureServices => configureServices.BuildServiceProvider()); return host.Build(); } @@ -431,5 +410,38 @@ namespace Microsoft.AspNet.Hosting throw new NotImplementedException(); } } + + private class ReadOnlyFeatureCollection : IFeatureCollection + { + public object this[[NotNull] Type key] + { + get { return null; } + set { throw new NotSupportedException(); } + } + + public bool IsReadOnly + { + get { return true; } + } + + public int Revision + { + get { return 0; } + } + + public void Dispose() + { + } + + public IEnumerator> GetEnumerator() + { + yield break; + } + + IEnumerator IEnumerable.GetEnumerator() + { + yield break; + } + } } } From 9c3a39123a381ac2636749e04f955eced72f5739 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 3 Aug 2015 14:01:03 -0700 Subject: [PATCH 0680/1838] #341 Add HttpReqeuest GetEncodedUrl and GetDecodedUrl extensions. --- .../UriHelper.cs | 22 ++++++ .../UriHelperTests.cs | 71 +++++++++++++++++++ 2 files changed, 93 insertions(+) create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 33f589cb44..3e137acc2e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -71,5 +71,27 @@ namespace Microsoft.AspNet.Http.Extensions return uri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped); } } + + /// + /// Returns the combined components of the request URL in a fully escaped form suitable for use in HTTP headers + /// and other HTTP operations. + /// + /// + /// + public static string GetEncodedUrl(this HttpRequest request) + { + return Encode(request.Scheme, request.Host, request.PathBase, request.Path, request.QueryString); + } + + /// + /// Returns the combined components of the request URL in a fully un-escaped form (except for the QueryString) + /// suitable only for display. This format should not be used in HTTP headers or other HTTP operations. + /// + /// + /// + public static string GetDisplayUrl(this HttpRequest request) + { + return request.Scheme + "://" + request.Host.Value + request.PathBase.Value + request.Path.Value + request.QueryString.Value; + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs new file mode 100644 index 0000000000..0846dd7172 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs @@ -0,0 +1,71 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Internal; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions +{ + public class UriHelperTests + { + [Fact] + public void EncodeEmptyPartialUrl() + { + var result = UriHelper.Encode(); + + Assert.Equal("/", result); + } + + [Fact] + public void EncodePartialUrl() + { + var result = UriHelper.Encode(new PathString("/un?escaped/base"), new PathString("/un?escaped"), + new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); + + Assert.Equal("/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); + } + + [Fact] + public void EncodeEmptyFullUrl() + { + var result = UriHelper.Encode("http", new HostString(string.Empty)); + + Assert.Equal("http:///", result); + } + + [Fact] + public void EncodeFullUrl() + { + var result = UriHelper.Encode("http", new HostString("my.HoΨst:80"), new PathString("/un?escaped/base"), new PathString("/un?escaped"), + new QueryString("?name=val%23ue"), new FragmentString("#my%20value")); + + Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue#my%20value", result); + } + + [Fact] + public void GetEncodedUrlFromRequest() + { + var request = new DefaultHttpContext().Request; + request.Scheme = "http"; + request.Host = new HostString("my.HoΨst:80"); + request.PathBase = new PathString("/un?escaped/base"); + request.Path = new PathString("/un?escaped"); + request.QueryString = new QueryString("?name=val%23ue"); + + Assert.Equal("http://my.xn--host-cpd:80/un%3Fescaped/base/un%3Fescaped?name=val%23ue", request.GetEncodedUrl()); + } + + [Fact] + public void GetDisplayUrlFromRequest() + { + var request = new DefaultHttpContext().Request; + request.Scheme = "http"; + request.Host = new HostString("my.HoΨst:80"); + request.PathBase = new PathString("/un?escaped/base"); + request.Path = new PathString("/un?escaped"); + request.QueryString = new QueryString("?name=val%23ue"); + + Assert.Equal("http://my.hoψst:80/un?escaped/base/un?escaped?name=val%23ue", request.GetDisplayUrl()); + } + } +} From 051bb8757830f5067ce54a526c6637927ad53b82 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Tue, 4 Aug 2015 10:15:27 -0700 Subject: [PATCH 0681/1838] Update CoreCLR versions --- src/Microsoft.AspNet.Server.Testing/project.json | 12 ++++++------ src/Microsoft.AspNet.TestHost/project.json | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 1898cddb4a..77260810ac 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -24,13 +24,13 @@ "dependencies": { "System.Diagnostics.Process": "4.0.0-beta-*", "System.IO.FileSystem": "4.0.0-*", - "System.Net.Http": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Text.RegularExpressions": "4.0.10-beta-*", - "System.Threading": "4.0.10-beta-*", + "System.Net.Http": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Text.RegularExpressions": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*", "System.Threading.Thread": "4.0.0-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 009a2aac6a..c59e21f29d 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -17,8 +17,8 @@ }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Contracts": "4.0.0-beta-*", - "System.Net.Http": "4.0.0-beta-*" + "System.Diagnostics.Contracts": "4.0.1-beta-*", + "System.Net.Http": "4.0.1-beta-*" } } } From 3cd5907fc5b9f7795c832f4a938790dbb58c1f7e Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Tue, 4 Aug 2015 10:15:27 -0700 Subject: [PATCH 0682/1838] Update CoreCLR versions --- .../project.json | 30 +++++++++---------- .../project.json | 6 ++-- .../project.json | 12 ++++---- src/Microsoft.AspNet.Http/project.json | 8 ++--- src/Microsoft.AspNet.Owin/project.json | 26 ++++++++-------- .../project.json | 12 ++++---- src/Microsoft.Net.Http.Headers/project.json | 14 ++++----- .../project.json | 2 +- 8 files changed, 55 insertions(+), 55 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 2054277592..da09379110 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP object model. HttpContext and family.", "repository": { @@ -15,22 +15,22 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Linq.Expressions": "4.0.10-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Tools": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.Globalization.Extensions": "4.0.1-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Linq.Expressions": "4.0.11-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", "System.Net.WebSockets": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", + "System.Reflection.TypeExtensions": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.InteropServices": "4.0.21-beta-*", + "System.Security.Claims": "4.0.1-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Security.Principal": "4.0.1-beta-*", + "System.Threading.Tasks": "4.0.11-beta-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index e068ff06cd..767da562d9 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -15,9 +15,9 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Resources.ResourceManager": "4.0.0-beta-*" + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Resources.ResourceManager": "4.0.1-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index a44172292c..3af9685e65 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -12,14 +12,14 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", + "System.Collections": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", "System.Net.WebSockets": "4.0.0-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Security.Claims": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Security.Claims": "4.0.1-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*" + "System.Security.Principal": "4.0.1-beta-*" } } } diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 991ddf3103..53e3ece572 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTTP feature implementations.", "repository": { @@ -15,9 +15,9 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.Text.Encoding": "4.0.10-beta-*" + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.Text.Encoding": "4.0.11-beta-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 792f5641ee..7a496619ae 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -13,20 +13,20 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.ComponentModel": "4.0.0-beta-*", - "System.Diagnostics.Tools": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Net.Primitives": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*", - "System.Runtime.InteropServices": "4.0.20-beta-*", - "System.Security.Claims": "4.0.0-beta-*", + "System.Collections": "4.0.11-beta-*", + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Tools": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Runtime.InteropServices": "4.0.21-beta-*", + "System.Security.Claims": "4.0.1-beta-*", "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.0-beta-*", - "System.Threading.Tasks": "4.0.10-beta-*" + "System.Security.Principal": "4.0.1-beta-*", + "System.Threading.Tasks": "4.0.11-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index c1d8fad748..496449f4f6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -13,12 +13,12 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Debug": "4.0.10-beta-*", - "System.IO": "4.0.10-beta-*", - "System.IO.FileSystem": "4.0.0-beta-*", - "System.Runtime": "4.0.20-beta-*", - "System.Runtime.Extensions": "4.0.10-beta-*" + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*" } } } diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index e4ae3012b7..ae39f93621 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -12,13 +12,13 @@ "dnx451" : { }, "dnxcore50" : { "dependencies": { - "System.Collections": "4.0.10-beta-*", - "System.Diagnostics.Contracts": "4.0.0-beta-*", - "System.Globalization": "4.0.10-beta-*", - "System.Globalization.Extensions": "4.0.0-beta-*", - "System.Linq": "4.0.0-beta-*", - "System.Text.Encoding": "4.0.10-beta-*", - "System.Runtime": "4.0.20-beta-*" + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Contracts": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.Globalization.Extensions": "4.0.1-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Text.Encoding": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*" } } } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index e44f880a72..0968582e6b 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -16,7 +16,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Text.Encoding.Extensions": "4.0.10-beta-*" + "System.Text.Encoding.Extensions": "4.0.11-beta-*" } } }, From 4576481a32acd2a732da358f522f3596ff52712b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 11 Aug 2015 12:57:06 -0700 Subject: [PATCH 0683/1838] Reacting to DI changes --- .../EncoderServiceCollectionExtensions.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 7b855f6038..c7d1c32b0d 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.Framework.DependencyInjection.Extensions; using Microsoft.Framework.Internal; using Microsoft.Framework.OptionsModel; using Microsoft.Framework.WebEncoders; From 67803d2f419c067cc9043ad26173bceea2467d89 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 5 Aug 2015 12:15:45 -0700 Subject: [PATCH 0684/1838] Challenge now always checks for accept --- .../Authentication/DefaultAuthenticationManager.cs | 5 ++--- .../DefaultAuthenticationManagerTests.cs | 11 ++++++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index d0cec090c0..821a67395a 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -72,8 +72,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal await handler.ChallengeAsync(challengeContext); } - // The default Challenge with no scheme is always accepted - if (!challengeContext.Accepted && !string.IsNullOrEmpty(authenticationScheme)) + if (!challengeContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } @@ -105,7 +104,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal await handler.SignOutAsync(signOutContext); } - if (!string.IsNullOrWhiteSpace(authenticationScheme) && !signOutContext.Accepted) + if (!signOutContext.Accepted) { throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); } diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 2871c27ec3..3430382e8a 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -21,13 +21,14 @@ namespace Microsoft.AspNet.Http.Authentication.Internal await Assert.ThrowsAsync(async () => await context.Authentication.AuthenticateAsync("Foo")); } - [Fact] - public async Task ChallengeWithNoAuthMiddlewareMayThrow() + [Theory] + [InlineData("")] + [InlineData(null)] + [InlineData("Foo")] + public async Task ChallengeWithNoAuthMiddlewareMayThrow(string scheme) { var context = CreateContext(); - await context.Authentication.ChallengeAsync(); - Assert.Equal(200, context.Response.StatusCode); - await Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync("Foo")); + await Assert.ThrowsAsync(() => context.Authentication.ChallengeAsync(scheme)); } [Fact] From 282c50876bacbd0eb32c560ef202f5f89651e731 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 11 Aug 2015 16:53:01 -0700 Subject: [PATCH 0685/1838] Enable pinning build script --- build.cmd | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 41025afb26..ccf195aee8 100644 --- a/build.cmd +++ b/build.cmd @@ -3,6 +3,8 @@ cd %~dp0 SETLOCAL SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe +SET BUILDCMD_KOREBUILD_VERSION="" +SET BUILDCMD_DNX_VERSION="" IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... @@ -16,13 +18,21 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run -.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +IF %BUILDCMD_KOREBUILD_VERSION%=="" ( + .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +) ELSE ( + .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre +) .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +IF %BUILDCMD_DNX_VERSION%=="" ( + CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +) ELSE ( + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -a default +) CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 :run CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* \ No newline at end of file From 44b762cf08b39491cac3a9e0220e63fa19c6b431 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Tue, 11 Aug 2015 17:04:07 -0700 Subject: [PATCH 0686/1838] Enable pinning build script --- build.cmd | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/build.cmd b/build.cmd index 41025afb26..ccf195aee8 100644 --- a/build.cmd +++ b/build.cmd @@ -3,6 +3,8 @@ cd %~dp0 SETLOCAL SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe +SET BUILDCMD_KOREBUILD_VERSION="" +SET BUILDCMD_DNX_VERSION="" IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... @@ -16,13 +18,21 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run -.nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +IF %BUILDCMD_KOREBUILD_VERSION%=="" ( + .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre +) ELSE ( + .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre +) .nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion IF "%SKIP_DNX_INSTALL%"=="1" goto run -CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +IF %BUILDCMD_DNX_VERSION%=="" ( + CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +) ELSE ( + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -a default +) CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 :run CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* \ No newline at end of file From 8487e42a6874eef8e0cd85b4c9f44eb6f9ec330e Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 12 Aug 2015 13:08:58 -0700 Subject: [PATCH 0687/1838] Hello HttpContextAccessor --- .../IHttpContextAccessor.cs | 10 ++++ .../HttpContextAccessor.cs | 47 +++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs create mode 100644 src/Microsoft.AspNet.Http/HttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs new file mode 100644 index 0000000000..8f4046da2b --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http +{ + public interface IHttpContextAccessor + { + HttpContext HttpContext { get; set; } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs new file mode 100644 index 0000000000..384bb961ca --- /dev/null +++ b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +#if DNX451 +using System.Runtime.Remoting.Messaging; +using System.Runtime.Remoting; +#elif DNXCORE50 +using System.Threading; +#endif + +namespace Microsoft.AspNet.Http.Internal +{ + public class HttpContextAccessor : IHttpContextAccessor + { +#if DNX451 + private const string LogicalDataKey = "__HttpContext_Current__"; + + public HttpContext HttpContext + { + get + { + var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; + return handle != null ? handle.Unwrap() as HttpContext : null; + } + set + { + CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(value)); + } + } + +#elif DNXCORE50 + private AsyncLocal _httpContextCurrent = new AsyncLocal(); + public HttpContext HttpContext + { + get + { + return _httpContextCurrent.Value; + } + set + { + _httpContextCurrent.Value = value; + } + } +#endif + } +} From ad6e4b838a5daad0b9a36870e5d0e3f586e9ca06 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 12 Aug 2015 13:13:27 -0700 Subject: [PATCH 0688/1838] Goodbye HttpContextAccessor --- .../IHttpContextAccessor.cs | 12 ----- .../HttpContextAccessor.cs | 48 ------------------- .../WebHostBuilder.cs | 2 + 3 files changed, 2 insertions(+), 60 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs delete mode 100644 src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs deleted file mode 100644 index eab12b1344..0000000000 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHttpContextAccessor.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Hosting -{ - public interface IHttpContextAccessor - { - HttpContext HttpContext { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs b/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs deleted file mode 100644 index f649d95016..0000000000 --- a/src/Microsoft.AspNet.Hosting/HttpContextAccessor.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -#if DNX451 -using System.Runtime.Remoting.Messaging; -using System.Runtime.Remoting; -#elif DNXCORE50 -using System.Threading; -#endif -using Microsoft.AspNet.Http; - -namespace Microsoft.AspNet.Hosting -{ - public class HttpContextAccessor : IHttpContextAccessor - { -#if DNX451 - private const string LogicalDataKey = "__HttpContext_Current__"; - - public HttpContext HttpContext - { - get - { - var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - return handle != null ? handle.Unwrap() as HttpContext : null; - } - set - { - CallContext.LogicalSetData(LogicalDataKey, new ObjectHandle(value)); - } - } - -#elif DNXCORE50 - private AsyncLocal _httpContextCurrent = new AsyncLocal(); - public HttpContext HttpContext - { - get - { - return _httpContextCurrent.Value; - } - set - { - _httpContextCurrent.Value = value; - } - } -#endif - } -} diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index c9edac597a..f6ec3b3e0c 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -7,6 +7,8 @@ using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; From b67ca0a277de900250bfaf3aedf48cab0d612491 Mon Sep 17 00:00:00 2001 From: Kirthi Krishnamraju Date: Thu, 13 Aug 2015 22:22:45 -0700 Subject: [PATCH 0689/1838] fix build break due to aspnet\Configuration #246 --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index f6ec3b3e0c..502d9bc09a 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -108,12 +108,12 @@ namespace Microsoft.AspNet.Hosting // Only one of these should be set, but they are used in priority engine.ServerFactory = _serverFactory; - engine.ServerFactoryLocation = _config.Get(ServerKey) ?? _config.Get(OldServerKey) ?? _serverFactoryLocation; + engine.ServerFactoryLocation = _config[ServerKey] ?? _config[OldServerKey] ?? _serverFactoryLocation; // Only one of these should be set, but they are used in priority engine.Startup = _startup; engine.StartupType = _startupType; - engine.StartupAssemblyName = _startupAssemblyName ?? _config.Get(ApplicationKey) ?? _config.Get(OldApplicationKey) ?? appEnvironment.ApplicationName; + engine.StartupAssemblyName = _startupAssemblyName ?? _config[ApplicationKey] ?? _config[OldApplicationKey] ?? appEnvironment.ApplicationName; return engine; } From 8e39bf4ffbee7365bb1d28436c5c98a66eb776d7 Mon Sep 17 00:00:00 2001 From: Hisham Abdullah Bin Ateya Date: Mon, 18 May 2015 08:01:00 +0300 Subject: [PATCH 0690/1838] Shift 'Development' & 'Production' constants into 'EnvironmentName' class Make 'EnvironmentName' static Change constants -> static readonly fields Remove trailing spaces --- .../EnvironmentName.cs | 11 +++++++++++ .../HostingEnvironmentExtensions.cs | 7 ++----- src/Microsoft.AspNet.Hosting/HostingEnvironment.cs | 4 +--- .../HostingEngineTests.cs | 4 ++-- 4 files changed, 16 insertions(+), 10 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs b/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs new file mode 100644 index 0000000000..664744383c --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs @@ -0,0 +1,11 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting +{ + public static class EnvironmentName + { + public static readonly string Development = "Development"; + public static readonly string Production = "Production"; + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index d0baeb570f..8fc1b8e43b 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -9,9 +9,6 @@ namespace Microsoft.AspNet.Hosting { public static class HostingEnvironmentExtensions { - private const string DevelopmentEnvironmentName = "Development"; - private const string ProductionEnvironmentName = "Production"; - /// /// Checks if the current hosting environment name is development. /// @@ -19,7 +16,7 @@ namespace Microsoft.AspNet.Hosting /// True if the environment name is Development, otherwise false. public static bool IsDevelopment([NotNull]this IHostingEnvironment hostingEnvironment) { - return hostingEnvironment.IsEnvironment(DevelopmentEnvironmentName); + return hostingEnvironment.IsEnvironment(EnvironmentName.Development); } /// @@ -29,7 +26,7 @@ namespace Microsoft.AspNet.Hosting /// True if the environment name is Production, otherwise false. public static bool IsProduction([NotNull]this IHostingEnvironment hostingEnvironment) { - return hostingEnvironment.IsEnvironment(ProductionEnvironmentName); + return hostingEnvironment.IsEnvironment(EnvironmentName.Production); } /// diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 323f0c0270..57617c2893 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -8,9 +8,7 @@ namespace Microsoft.AspNet.Hosting { public class HostingEnvironment : IHostingEnvironment { - internal const string DefaultEnvironmentName = "Production"; - - public string EnvironmentName { get; set; } = DefaultEnvironmentName; + public string EnvironmentName { get; set; } = Microsoft.AspNet.Hosting.EnvironmentName.Production; public string WebRootPath { get; set; } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 579febdd8f..1642ec7235 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -146,7 +146,7 @@ namespace Microsoft.AspNet.Hosting { var engine = CreateBuilder().Build(); var env = engine.ApplicationServices.GetRequiredService(); - Assert.Equal("Production", env.EnvironmentName); + Assert.Equal(EnvironmentName.Production, env.EnvironmentName); } [Fact] @@ -199,7 +199,7 @@ namespace Microsoft.AspNet.Hosting using (engine.Start()) { var env = engine.ApplicationServices.GetRequiredService(); - Assert.True(env.IsEnvironment("Production")); + Assert.True(env.IsEnvironment(EnvironmentName.Production)); Assert.True(env.IsEnvironment("producTion")); } } From 52388e89f87909c726645c2a60d3fd4f913faf94 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sat, 15 Aug 2015 01:25:49 -0700 Subject: [PATCH 0691/1838] Removed builder arg parameter from IStartupFilter - It broke the composition model by allowing you to reach out to the original app builder. This breaks the ability to properly wrap and have all configure methods see the wrapper. --- .../Internal/AutoRequestServicesStartupFilter.cs | 4 ++-- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs | 3 +-- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 4 ++-- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs b/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs index 205440b5fe..2ae344670e 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs @@ -9,11 +9,11 @@ namespace Microsoft.AspNet.Hosting.Internal { public class AutoRequestServicesStartupFilter : IStartupFilter { - public Action Configure(IApplicationBuilder app, Action next) + public Action Configure(Action next) { return builder => { - app.UseMiddleware(); + builder.UseMiddleware(); next(builder); }; } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 04b77d4113..79aa7774dd 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -151,7 +151,7 @@ namespace Microsoft.AspNet.Hosting.Internal var configure = Startup.ConfigureDelegate; foreach (var filter in startupFilters) { - configure = filter.Configure(builder, configure); + configure = filter.Configure(configure); } configure(builder); diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs b/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs index 437a841e89..79bf34401e 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs @@ -8,7 +8,6 @@ namespace Microsoft.AspNet.Hosting.Startup { public interface IStartupFilter { - // TODO: replace with ConfigureDelegate? - Action Configure(IApplicationBuilder app, Action next); + Action Configure(Action next); } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 94b9afce84..c4b486ca45 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -78,11 +78,11 @@ namespace Microsoft.AspNet.TestHost public class RequestServicesFilter : IStartupFilter { - public Action Configure(IApplicationBuilder app, Action next) + public Action Configure(Action next) { return builder => { - app.UseMiddleware(); + builder.UseMiddleware(); next(builder); }; } From 9dd9d39bff58b8124e7647facda55ff3b868aa35 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Mon, 17 Aug 2015 11:10:26 -0700 Subject: [PATCH 0692/1838] Update packages' versions --- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 77260810ac..44cd34edf5 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -23,7 +23,7 @@ "dnxcore50": { "dependencies": { "System.Diagnostics.Process": "4.0.0-beta-*", - "System.IO.FileSystem": "4.0.0-*", + "System.IO.FileSystem": "4.0.1-beta-*", "System.Net.Http": "4.0.1-beta-*", "System.Net.Primitives": "4.0.11-beta-*", "System.Runtime.Extensions": "4.0.11-beta-*", From e4722b0bef21c2a8058da5a9df713609b4b052bf Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Mon, 17 Aug 2015 11:11:16 -0700 Subject: [PATCH 0693/1838] Update packages' versions --- src/Microsoft.Framework.WebEncoders.Core/project.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index d2d4b85976..7cee739e6e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -16,12 +16,12 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.ComponentModel": "4.0.0-*", - "System.Diagnostics.Debug": "4.0.10-*", - "System.IO": "4.0.10-*", + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", "System.Reflection": "4.0.10-*", - "System.Runtime.Extensions": "4.0.10-*", - "System.Threading": "4.0.10-*" + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*" } } } From 7ca6982883dfce755e98d51d0f6eb4c6332d9a39 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 17 Aug 2015 14:48:02 -0700 Subject: [PATCH 0694/1838] Updating to release NuGet.config. --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..3b8d545754 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From b6bb7a52a2accf7362280b3b3a3444c1591eab80 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 17 Aug 2015 14:48:25 -0700 Subject: [PATCH 0695/1838] Updating to release NuGet.config. --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..3b8d545754 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From bbeea8ba4aa998fa8d2e2e00064cf219402a001b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 18 Aug 2015 14:00:18 -0700 Subject: [PATCH 0696/1838] Updating to aspnetliterelease. --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 3b8d545754..e2378fe359 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + \ No newline at end of file From aa0f6c37bb9eedb2dd0c205c2de133330db560b5 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 18 Aug 2015 14:00:19 -0700 Subject: [PATCH 0697/1838] Updating to aspnetlitedev. --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..6685c5330a 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From a9fe23a2c66fa8e276b448cd73d77f18b58d0873 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 18 Aug 2015 14:00:20 -0700 Subject: [PATCH 0698/1838] Updating to aspnetliterelease. --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 3b8d545754..e2378fe359 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + \ No newline at end of file From 3480d53e1cb3d67e137fee086fce9b41027dfc59 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 18 Aug 2015 14:00:21 -0700 Subject: [PATCH 0699/1838] Updating to aspnetlitedev. --- NuGet.Config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.Config b/NuGet.Config index da57d47267..6685c5330a 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 5b3d7230b38b052308aa3c8448e16b8f1e1274c3 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 19 Aug 2015 14:52:58 -0700 Subject: [PATCH 0700/1838] Update NuGet feed from v2 => v3. --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 6685c5330a..10cec18a32 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,6 @@ - + \ No newline at end of file From b590c0c7a2c91ed545312831d2c4b81a71b07f91 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 19 Aug 2015 14:53:35 -0700 Subject: [PATCH 0701/1838] Update NuGet feed from v2 => v3. --- NuGet.Config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.Config b/NuGet.Config index 6685c5330a..10cec18a32 100644 --- a/NuGet.Config +++ b/NuGet.Config @@ -2,6 +2,6 @@ - + \ No newline at end of file From 1655fbf03a7a3d41c32e1fa31b87699425e028a2 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Aug 2015 15:37:08 -0700 Subject: [PATCH 0702/1838] Update 'build.cmd' to pull Sake from v2 NuGet feed. --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index ccf195aee8..b54d91cf74 100644 --- a/build.cmd +++ b/build.cmd @@ -23,7 +23,7 @@ IF %BUILDCMD_KOREBUILD_VERSION%=="" ( ) ELSE ( .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion +.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( From d733f17fbde0904214710c01a6d0fbf0ef38a6df Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Aug 2015 15:37:33 -0700 Subject: [PATCH 0703/1838] Update 'build.cmd' to pull Sake from v2 NuGet feed. --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index ccf195aee8..b54d91cf74 100644 --- a/build.cmd +++ b/build.cmd @@ -23,7 +23,7 @@ IF %BUILDCMD_KOREBUILD_VERSION%=="" ( ) ELSE ( .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\NuGet.exe install Sake -version 0.2 -o packages -ExcludeVersion +.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( From d013bdfbf647375f16922d1b66417e99c7b38e25 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Aug 2015 20:46:08 -0700 Subject: [PATCH 0704/1838] Update 'build.sh' to pull Sake from v2 NuGet feed. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 3ef874f9bd..68c3e8cb52 100755 --- a/build.sh +++ b/build.sh @@ -24,7 +24,7 @@ fi if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion + mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages fi if ! type dnvm > /dev/null 2>&1; then From 7f5045d62f7b39a23199336c879cc197e70d0bd9 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 20 Aug 2015 20:46:27 -0700 Subject: [PATCH 0705/1838] Update 'build.sh' to pull Sake from v2 NuGet feed. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 3ef874f9bd..68c3e8cb52 100755 --- a/build.sh +++ b/build.sh @@ -24,7 +24,7 @@ fi if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -version 0.2 -o packages -ExcludeVersion + mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages fi if ! type dnvm > /dev/null 2>&1; then From 68eb9646ea18808504e06e1c5ef9c16a53a33aea Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Thu, 20 Aug 2015 00:08:14 +0200 Subject: [PATCH 0706/1838] Added asserts to tests --- test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs index 3676fb2941..6cd3e7a844 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs @@ -39,7 +39,9 @@ namespace Microsoft.AspNet.Owin IDictionary env = new OwinEnvironment(context); Assert.Equal("SomeMethod", Get(env, "owin.RequestMethod")); + // User property should set both server.User (non-standard) and owin.RequestUser. Assert.Equal("Foo", Get(env, "server.User").Identity.AuthenticationType); + Assert.Equal("Foo", Get(env, "owin.RequestUser").Identity.AuthenticationType); Assert.Same(Stream.Null, Get(env, "owin.RequestBody")); var requestHeaders = Get>(env, "owin.RequestHeaders"); Assert.NotNull(requestHeaders); @@ -65,6 +67,10 @@ namespace Microsoft.AspNet.Owin env["owin.RequestMethod"] = "SomeMethod"; env["server.User"] = new ClaimsPrincipal(new ClaimsIdentity("Foo")); + Assert.Equal("Foo", context.User.Identity.AuthenticationType); + // User property should fall back from owin.RequestUser to server.User. + env["owin.RequestUser"] = new ClaimsPrincipal(new ClaimsIdentity("Bar")); + Assert.Equal("Bar", context.User.Identity.AuthenticationType); env["owin.RequestBody"] = Stream.Null; var requestHeaders = Get>(env, "owin.RequestHeaders"); Assert.NotNull(requestHeaders); @@ -81,7 +87,6 @@ namespace Microsoft.AspNet.Owin env["owin.ResponseStatusCode"] = 201; Assert.Equal("SomeMethod", context.Request.Method); - Assert.Equal("Foo", context.User.Identity.AuthenticationType); Assert.Same(Stream.Null, context.Request.Body); Assert.Equal("CustomRequestValue", context.Request.Headers["CustomRequestHeader"]); Assert.Equal("/path", context.Request.Path.Value); From 138bc6a20f638eb9993c4e9c606ac7b4e322f947 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Thu, 20 Aug 2015 00:10:40 +0200 Subject: [PATCH 0707/1838] Added owin.RequestUser --- src/Microsoft.AspNet.Owin/OwinConstants.cs | 5 +++-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 ++ src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 12 ++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 47761c96c2..039209c098 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -20,11 +20,12 @@ namespace Microsoft.AspNet.Owin #endregion - #region OWIN v1.1.0 - 3.2.1 Request Data + #region OWIN v1.0.1 - 3.2.1 Request Data - // OWIN 1.1.0 http://owin.org/html/owin.html + // OWIN 1.0.1 http://owin.org/html/owin.html public const string RequestId = "owin.RequestId"; + public const string RequestUser = "owin.RequestUser"; #endregion diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5c231eb0e8..2b331b0d57 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -9,6 +9,7 @@ using System.IO; using System.Linq; using System.Net; using System.Net.WebSockets; +using System.Security.Claims; using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; @@ -57,6 +58,7 @@ namespace Microsoft.AspNet.Owin (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, + { OwinConstants.RequestUser, new FeatureMap(feature => feature.User, () => null, (feature, value) => feature.User = (ClaimsPrincipal)value) }, { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 6dd44e52e6..614bccf333 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -263,8 +263,16 @@ namespace Microsoft.AspNet.Owin ClaimsPrincipal IHttpAuthenticationFeature.User { - get { return Utilities.MakeClaimsPrincipal(Prop(OwinConstants.Security.User)); } - set { Prop(OwinConstants.Security.User, value); } + get + { + return Prop(OwinConstants.RequestUser) + ?? Utilities.MakeClaimsPrincipal(Prop(OwinConstants.Security.User)); + } + set + { + Prop(OwinConstants.RequestUser, value); + Prop(OwinConstants.Security.User, value); + } } IAuthenticationHandler IHttpAuthenticationFeature.Handler { get; set; } From 516a435ea5f64105d5a5e04c727f5cd1b542f48b Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Wed, 19 Aug 2015 16:27:04 -0700 Subject: [PATCH 0708/1838] Fix #365 - Make IFormFileCollection implmenent IReadOnlyList --- src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs | 4 ++-- src/Microsoft.AspNet.Http/FormFileCollection.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs index 236614815e..4950758b44 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs @@ -5,12 +5,12 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http { - public interface IFormFileCollection : IList + public interface IFormFileCollection : IReadOnlyList { IFormFile this[string name] { get; } IFormFile GetFile(string name); - IList GetFiles(string name); + IReadOnlyList GetFiles(string name); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/FormFileCollection.cs b/src/Microsoft.AspNet.Http/FormFileCollection.cs index bd624df355..43dbf0cb12 100644 --- a/src/Microsoft.AspNet.Http/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/FormFileCollection.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Http.Internal return Find(file => string.Equals(name, GetName(file.ContentDisposition))); } - public IList GetFiles(string name) + public IReadOnlyList GetFiles(string name) { return FindAll(file => string.Equals(name, GetName(file.ContentDisposition))); } From 55b28abeab524c39bacc1a0e0717d5126ec3a6a7 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 25 Aug 2015 12:23:56 -0700 Subject: [PATCH 0709/1838] Explicitly set ApplicationServices for HttpContext --- .../Internal/HostingEngine.cs | 1 + .../Fakes/Startup.cs | 1 - .../TestServerTests.cs | 52 ++++++++++++++++++- 3 files changed, 52 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 79aa7774dd..90139ad93e 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -71,6 +71,7 @@ namespace Microsoft.AspNet.Hosting.Internal async features => { var httpContext = contextFactory.CreateHttpContext(features); + httpContext.ApplicationServices = _applicationServices; var requestIdentifier = GetRequestIdentifier(httpContext); using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 87950f61dc..700fbf6d7e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -3,7 +3,6 @@ using Microsoft.AspNet.Builder; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.OptionsModel; using System; namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index c4b486ca45..564b29ab91 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task RequestServicesAutoCreated() { - TestServer server = TestServer.Create(app => + var server = TestServer.Create(app => { app.Run(context => { @@ -55,6 +55,33 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("RequestServices:True", result); } + public class CustomContainerStartup + { + public IServiceProvider Services; + public IServiceProvider ConfigureServices(IServiceCollection services) + { + Services = services.BuildServiceProvider(); + return Services; + } + + public void Configure(IApplicationBuilder app) + { + app.Run(async context => + { + await context.Response.WriteAsync("ApplicationServicesEqual:" + (context.ApplicationServices == Services)); + }); + } + + } + + [Fact] + public async Task CustomServiceProviderReplacesApplicationServices() + { + var server = new TestServer(TestServer.CreateBuilder().UseStartup()); + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("ApplicationServicesEqual:True", result); + } + public class TestService { } public class TestRequestServiceMiddleware @@ -104,6 +131,29 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Found:True", result); } + public class EnsureApplicationServicesFilter : IStartupFilter + { + public Action Configure(IApplicationBuilder app, Action next) + { + return builder => + { + app.Run(context => { + Assert.NotNull(context.ApplicationServices); + return context.Response.WriteAsync("Done"); + }); + }; + } + } + + [Fact] + public async Task ApplicationServicesShouldSetBeforeStatupFilters() + { + var server = TestServer.Create(app => { }, + services => services.AddTransient()); + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("Done", result); + } + [Fact] public async Task CanAccessLogger() From 15687ab80a87378a1d465d1f8fdabadf4577ce1a Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 27 Aug 2015 21:48:13 -0700 Subject: [PATCH 0710/1838] Fix #343 - Avoid going to disk when reading the form This change tries to avoid looking up the TEMP directory for most reads of the form data. We'll now only hit the disk when necessary. --- src/Microsoft.AspNet.Http/BufferingHelper.cs | 27 ++++++++++++------- .../FileBufferingReadStream.cs | 22 ++++++++++++++- 2 files changed, 39 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 3335203e29..47b08915c4 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -12,21 +12,30 @@ namespace Microsoft.AspNet.Http.Internal { internal const int DefaultBufferThreshold = 1024 * 30; + private readonly static Func _getTempDirectory = () => TempDirectory; + + private static string _tempDirectory; + public static string TempDirectory { get { - // Look for folders in the following order. - var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. - Path.GetTempPath(); // Fall back. - - if (!Directory.Exists(temp)) + if (_tempDirectory == null) { - // TODO: ??? - throw new DirectoryNotFoundException(temp); + // Look for folders in the following order. + var temp = Environment.GetEnvironmentVariable("ASPNET_TEMP") ?? // ASPNET_TEMP - User set temporary location. + Path.GetTempPath(); // Fall back. + + if (!Directory.Exists(temp)) + { + // TODO: ??? + throw new DirectoryNotFoundException(temp); + } + + _tempDirectory = temp; } - return temp; + return _tempDirectory; } } @@ -37,7 +46,7 @@ namespace Microsoft.AspNet.Http.Internal { // TODO: Register this buffer for disposal at the end of the request to ensure the temp file is deleted. // Otherwise it won't get deleted until GC closes the stream. - request.Body = new FileBufferingReadStream(body, bufferThreshold, TempDirectory); + request.Body = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); } return request; } diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index b6df361dc4..9bed427578 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; @@ -18,7 +19,8 @@ namespace Microsoft.AspNet.WebUtilities { private readonly Stream _inner; private readonly int _memoryThreshold; - private readonly string _tempFileDirectory; + private string _tempFileDirectory; + private readonly Func _tempFileDirectoryAccessor; private Stream _buffer = new MemoryStream(); // TODO: We could have a more efficiently expanding buffer stream. private bool _inMemory = true; @@ -26,6 +28,17 @@ namespace Microsoft.AspNet.WebUtilities private bool _disposed; + // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? + public FileBufferingReadStream( + [NotNull] Stream inner, + int memoryThreshold, + [NotNull] Func tempFileDirectoryAccessor) + { + _inner = inner; + _memoryThreshold = memoryThreshold; + _tempFileDirectoryAccessor = tempFileDirectoryAccessor; + } + // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? public FileBufferingReadStream([NotNull] Stream inner, int memoryThreshold, [NotNull] string tempFileDirectory) { @@ -88,6 +101,13 @@ namespace Microsoft.AspNet.WebUtilities private Stream CreateTempFile() { + if (_tempFileDirectory == null) + { + Debug.Assert(_tempFileDirectoryAccessor != null); + _tempFileDirectory = _tempFileDirectoryAccessor(); + Debug.Assert(_tempFileDirectory != null); + } + var fileName = Path.Combine(_tempFileDirectory, "ASPNET_" + Guid.NewGuid().ToString() + ".tmp"); return new FileStream(fileName, FileMode.Create, FileAccess.ReadWrite, FileShare.Delete, 1024 * 16, FileOptions.Asynchronous | FileOptions.DeleteOnClose | FileOptions.SequentialScan); From 28268ee64b1e9edc9078345d453bb3120a812a19 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 28 Aug 2015 09:57:11 -0700 Subject: [PATCH 0711/1838] Fix IStartupFilter complier break in ApplicationServices test. --- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 564b29ab91..47277d7286 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -133,11 +133,11 @@ namespace Microsoft.AspNet.TestHost public class EnsureApplicationServicesFilter : IStartupFilter { - public Action Configure(IApplicationBuilder app, Action next) + public Action Configure(Action next) { return builder => { - app.Run(context => { + builder.Run(context => { Assert.NotNull(context.ApplicationServices); return context.Response.WriteAsync("Done"); }); From 456277fe1d83acd1bbc8fd56c0a98a30bb907ab5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 20 Aug 2015 16:11:47 -0700 Subject: [PATCH 0712/1838] #361 Introduce StringValues to replace string[] usage. --- HttpAbstractions.sln | 49 +++- samples/SampleApp/Program.cs | 30 +++ samples/SampleApp/SampleApp.xproj | 20 ++ samples/SampleApp/project.json | 15 ++ .../IHeaderDictionary.cs | 45 +--- .../IReadableStringCollection.cs | 27 +- .../QueryString.cs | 3 +- .../HeaderDictionaryTypeExtensions.cs | 13 +- .../RequestHeaders.cs | 2 +- .../ResponseHeaders.cs | 2 +- .../IHttpRequestFeature.cs | 3 +- .../IHttpResponseFeature.cs | 3 +- .../project.json | 6 +- .../DefaultHttpResponse.cs | 7 +- .../DefaultWebSocketManager.cs | 5 +- .../Features/FormFeature.cs | 11 +- .../Features/HttpRequestFeature.cs | 5 +- .../Features/HttpResponseFeature.cs | 5 +- .../Features/QueryFeature.cs | 38 +-- .../Features/RequestCookiesFeature.cs | 66 ++--- src/Microsoft.AspNet.Http/FormCollection.cs | 5 +- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 99 ++------ src/Microsoft.AspNet.Http/ParsingHelpers.cs | 104 +++----- .../ReadableStringCollection.cs | 56 ++--- .../RequestCookiesCollection.cs | 7 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 46 ++-- .../DictionaryStringArrayWrapper.cs | 80 ++++++ .../DictionaryStringValuesWrapper.cs | 80 ++++++ src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +- .../OwinFeatureCollection.cs | 14 +- src/Microsoft.AspNet.Owin/Utilities.cs | 26 +- .../FormReader.cs | 11 +- .../KeyValueAccumulator.cs | 23 +- .../MultipartReader.cs | 5 +- .../MultipartSection.cs | 11 +- .../QueryHelpers.cs | 5 +- .../project.json | 2 +- .../Microsoft.Framework.Primitives.xproj | 20 ++ .../StringValues.cs | 233 ++++++++++++++++++ .../project.json | 23 ++ .../DefaultHttpRequestTests.cs | 33 +-- .../HeaderDictionaryTests.cs | 8 +- ...Microsoft.Framework.Primitives.Tests.xproj | 21 ++ .../StringValuesTests.cs | 117 +++++++++ .../project.json | 13 + 45 files changed, 1010 insertions(+), 391 deletions(-) create mode 100644 samples/SampleApp/Program.cs create mode 100644 samples/SampleApp/SampleApp.xproj create mode 100644 samples/SampleApp/project.json create mode 100644 src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs create mode 100644 src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs create mode 100644 src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj create mode 100644 src/Microsoft.Framework.Primitives/StringValues.cs create mode 100644 src/Microsoft.Framework.Primitives/project.json create mode 100644 test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj create mode 100644 test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs create mode 100644 test/Microsoft.Framework.Primitives.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 872a0e3ada..4a5ef774ab 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22823.1 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -43,6 +43,14 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEnco EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives", "src\Microsoft.Framework.Primitives\Microsoft.Framework.Primitives.xproj", "{E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives.Tests", "test\Microsoft.Framework.Primitives.Tests\Microsoft.Framework.Primitives.Tests.xproj", "{61F72E92-B3AE-4A10-B838-44F80AED40AE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -245,6 +253,42 @@ Global {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.ActiveCfg = Release|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.Build.0 = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|x86.ActiveCfg = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|x86.Build.0 = Debug|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Any CPU.Build.0 = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU + {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.ActiveCfg = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.Build.0 = Debug|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.Build.0 = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.ActiveCfg = Release|Any CPU + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.Build.0 = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.Build.0 = Debug|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.Build.0 = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.ActiveCfg = Release|Any CPU + {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -268,5 +312,8 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} + {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {61F72E92-B3AE-4A10-B838-44F80AED40AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/samples/SampleApp/Program.cs b/samples/SampleApp/Program.cs new file mode 100644 index 0000000000..c434e6c0a6 --- /dev/null +++ b/samples/SampleApp/Program.cs @@ -0,0 +1,30 @@ +using System; +using System.Diagnostics; +using Microsoft.Framework.Primitives; + +namespace SampleApp +{ + public class Program + { + public void Main(string[] args) + { + for (int i = 0; i < 10; i++) + { + Stopwatch timer = new Stopwatch(); + timer.Start(); + string myString; + string[] myArray; + StringValues myValues; + for (int j = 0; j < 100000000; j++) + { + myString = new string('a', 40); + myArray = new[] { myString }; + // myValues = new StringValues(myString); + myValues = new StringValues(myArray); + } + timer.Stop(); + Console.WriteLine(timer.Elapsed + ", " + Environment.WorkingSet); + } + } + } +} diff --git a/samples/SampleApp/SampleApp.xproj b/samples/SampleApp/SampleApp.xproj new file mode 100644 index 0000000000..dcc1bdf260 --- /dev/null +++ b/samples/SampleApp/SampleApp.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + 1d0764b4-1deb-4232-a714-d4b7e846918a + SampleApp + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json new file mode 100644 index 0000000000..b3b5f51ed7 --- /dev/null +++ b/samples/SampleApp/project.json @@ -0,0 +1,15 @@ +{ + "version": "1.0.0-*", + + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + + "commands": { + "SampleApp": "SampleApp" + }, + + "frameworks": { + "dnx451": { } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index b10101cb3d..d2192475fa 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -2,29 +2,30 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http { /// /// Represents request and response headers /// - public interface IHeaderDictionary : IReadableStringCollection, IDictionary + public interface IHeaderDictionary : IReadableStringCollection, IDictionary { + // This property is duplicated to resolve an ambiguity between IReadableStringCollection and IDictionary /// - /// Get or sets the associated value from the collection as a single string. + /// /// - /// The header name. - /// the associated value from the collection as a single string or null if the key is not present. - new string this[string key] { get; set; } + /// + /// The stored value, or StringValues.Empty if the key is not present. + new StringValues this[string key] { get; set; } - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count /// /// Gets the number of elements contained in the collection. /// new int Count { get; } - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys + // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys /// /// Gets a collection containing the keys. /// @@ -36,21 +37,14 @@ namespace Microsoft.AspNet.Http /// /// The header name. /// the associated values from the collection separated into individual values, or null if the key is not present. - IList GetCommaSeparatedValues(string key); + StringValues GetCommaSeparatedValues(string key); /// - /// Add a new value. Appends to the header if already present + /// Add a new value. Appends to the header list if already present /// /// The header name. /// The header value. - void Append(string key, string value); - - /// - /// Add new values. Each item remains a separate array entry. - /// - /// The header name. - /// The header values. - void AppendValues(string key, params string[] values); + void Append(string key, StringValues value); /// /// Quotes any values containing comas, and then coma joins all of the values with any existing values. @@ -59,21 +53,6 @@ namespace Microsoft.AspNet.Http /// The header values. void AppendCommaSeparatedValues(string key, params string[] values); - /// - /// Sets a specific header value. - /// - /// The header name. - /// The header value. - [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Set", Justification = "Re-evaluate later.")] - void Set(string key, string value); - - /// - /// Sets the specified header values without modification. - /// - /// The header name. - /// The header values. - void SetValues(string key, params string[] values); - /// /// Quotes any values containing comas, and then coma joins all of the values. /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs index 589b758895..d85e960d9b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs @@ -2,22 +2,22 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http { /// /// Accessors for headers, query, forms, etc. /// - public interface IReadableStringCollection : IEnumerable> + public interface IReadableStringCollection : IEnumerable> { /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. + /// Get the associated value from the collection. + /// Returns StringValues.Empty if the key is not present. /// /// /// - string this[string key] { get; } + StringValues this[string key] { get; } /// /// Gets the number of elements contained in the collection. @@ -35,22 +35,5 @@ namespace Microsoft.AspNet.Http /// /// bool ContainsKey(string key); - - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. - /// - /// - /// - [SuppressMessage("Microsoft.Naming", "CA1716:IdentifiersShouldNotMatchKeywords", MessageId = "Get", Justification = "Re-evaluate later.")] - string Get(string key); - - /// - /// Get the associated values from the collection in their original format. - /// Returns null if the key is not present. - /// - /// - /// - IList GetValues(string key); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 8717638aa5..2844c90213 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Text; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http @@ -143,7 +144,7 @@ namespace Microsoft.AspNet.Http /// /// /// The resulting QueryString - public static QueryString Create(IEnumerable> parameters) + public static QueryString Create(IEnumerable> parameters) { var builder = new StringBuilder(); bool first = true; diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 69f94e984e..803a0a5080 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -7,6 +7,7 @@ using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http @@ -50,7 +51,7 @@ namespace Microsoft.AspNet.Http } else { - headers.SetValues(name, values.Select(value => value.ToString()).ToArray()); + headers[name] = values.Select(value => value.ToString()).ToArray(); } } @@ -98,7 +99,7 @@ namespace Microsoft.AspNet.Http } var value = headers[name]; - if (string.IsNullOrWhiteSpace(value)) + if (StringValues.IsNullOrEmpty(value)) { return default(T); } @@ -112,11 +113,11 @@ namespace Microsoft.AspNet.Http if (KnownListParsers.TryGetValue(typeof(T), out temp)) { var func = (Func, IList>)temp; - return func(headers.GetValues(name)); + return func(headers[name]); } - var values = headers.GetValues(name); - if (values == null || !values.Any()) + var values = headers[name]; + if (StringValues.IsNullOrEmpty(values)) { return null; } @@ -158,7 +159,7 @@ namespace Microsoft.AspNet.Http return default(T); } - private static IList GetListViaReflection(IList values) + private static IList GetListViaReflection(StringValues values) { // TODO: Cache the reflected type for later? Only if success? var type = typeof(T); diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index ac9e542575..c718ada981 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -285,7 +285,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList([NotNull] string name, [NotNull] IList values) { - Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 8b8607a2b7..7ee2bb79a5 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -182,7 +182,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList([NotNull] string name, [NotNull] IList values) { - Headers.AppendValues(name, values.Select(value => value.ToString()).ToArray()); + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index c80ca29b5f..7e61bb915a 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -14,7 +15,7 @@ namespace Microsoft.AspNet.Http.Features string PathBase { get; set; } string Path { get; set; } string QueryString { get; set; } - IDictionary Headers { get; set; } + IDictionary Headers { get; set; } Stream Body { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index d530718b17..b46b4ae4b6 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -12,7 +13,7 @@ namespace Microsoft.AspNet.Http.Features { int StatusCode { get; set; } string ReasonPhrase { get; set; } - IDictionary Headers { get; set; } + IDictionary Headers { get; set; } Stream Body { get; set; } bool HasStarted { get; } void OnStarting(Func callback, object state); diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 3af9685e65..b2b95c92a0 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -6,7 +6,11 @@ "url": "git://github.com/aspnet/httpabstractions" }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "Microsoft.Framework.NotNullAttribute.Sources": { + "type": "build", + "version": "1.0.0-*" + }, + "Microsoft.Framework.Primitives": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 0dae9253b9..b47279bfd8 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -68,8 +68,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - var contentType = Headers[HeaderNames.ContentType]; - return contentType; + return Headers[HeaderNames.ContentType]; } set { @@ -79,7 +78,7 @@ namespace Microsoft.AspNet.Http.Internal } else { - HttpResponseFeature.Headers[HeaderNames.ContentType] = new[] { value }; + HttpResponseFeature.Headers[HeaderNames.ContentType] = value; } } } @@ -115,7 +114,7 @@ namespace Microsoft.AspNet.Http.Internal HttpResponseFeature.StatusCode = 302; } - Headers.Set(HeaderNames.Location, location); + Headers[HeaderNames.Location] = location; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 7a8f87d125..9493859f7c 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -12,8 +12,6 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { - private static IList EmptyList = new List(); - private IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; private FeatureReference _webSockets = FeatureReference.Default; @@ -45,8 +43,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return ParsingHelpers.GetHeaderUnmodified(HttpRequestFeature.Headers, - HeaderNames.WebSocketSubProtocols) ?? EmptyList; + return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols); } } diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index 593cd274c4..b50d58c415 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -10,6 +10,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal @@ -87,7 +88,7 @@ namespace Microsoft.AspNet.Http.Features.Internal _request.EnableRewind(); - IDictionary formFields = null; + IDictionary formFields = null; var files = new FormFileCollection(); // Some of these code paths use StreamReader which does not support cancellation tokens. @@ -102,7 +103,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } else if (HasMultipartFormContentType(contentType)) { - var formAccumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var formAccumulator = new KeyValueAccumulator(); var boundary = GetBoundary(contentType); var multipartReader = new MultipartReader(boundary, _request.Body); @@ -111,7 +112,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { var headers = new HeaderDictionary(section.Headers); ContentDispositionHeaderValue contentDisposition; - ContentDispositionHeaderValue.TryParse(headers.Get(HeaderNames.ContentDisposition), out contentDisposition); + ContentDispositionHeaderValue.TryParse(headers[HeaderNames.ContentDisposition], out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end @@ -131,7 +132,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); MediaTypeHeaderValue mediaType; - MediaTypeHeaderValue.TryParse(headers.Get(HeaderNames.ContentType), out mediaType); + MediaTypeHeaderValue.TryParse(headers[HeaderNames.ContentType], out mediaType); var encoding = FilterEncoding(mediaType?.Encoding); using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { @@ -141,7 +142,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } else { - System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers.Get(HeaderNames.ContentDisposition)); + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers[HeaderNames.ContentDisposition]); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index bce7570916..73bf244cbf 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -11,7 +12,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { public HttpRequestFeature() { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; Protocol = string.Empty; Scheme = string.Empty; @@ -27,7 +28,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string PathBase { get; set; } public string Path { get; set; } public string QueryString { get; set; } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 84f8196f93..010a13c86c 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -13,7 +14,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public HttpResponseFeature() { StatusCode = 200; - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = Stream.Null; } @@ -21,7 +22,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 02545c50a1..39c842b83e 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -13,17 +14,18 @@ namespace Microsoft.AspNet.Http.Features.Internal { private readonly IFeatureCollection _features; private FeatureReference _request = FeatureReference.Default; - private string _queryString; - private IReadableStringCollection _query; - public QueryFeature([NotNull] IDictionary query) - : this (new ReadableStringCollection(query)) + private string _original; + private IReadableStringCollection _parsedValues; + + public QueryFeature([NotNull] IDictionary query) + : this(new ReadableStringCollection(query)) { } public QueryFeature([NotNull] IReadableStringCollection query) { - _query = query; + _parsedValues = query; } public QueryFeature([NotNull] IFeatureCollection features) @@ -37,24 +39,32 @@ namespace Microsoft.AspNet.Http.Features.Internal { if (_features == null) { - return _query; + return _parsedValues ?? ReadableStringCollection.Empty; } - var queryString = _request.Fetch(_features).QueryString; - if (_query == null || !string.Equals(_queryString, queryString, StringComparison.Ordinal)) + var current = _request.Fetch(_features).QueryString; + if (_parsedValues == null || !string.Equals(_original, current, StringComparison.Ordinal)) { - _queryString = queryString; - _query = new ReadableStringCollection(QueryHelpers.ParseQuery(queryString)); + _original = current; + _parsedValues = new ReadableStringCollection(QueryHelpers.ParseQuery(current)); } - return _query; + return _parsedValues; } set { - _query = value; + _parsedValues = value; if (_features != null) { - _queryString = _query == null ? string.Empty : QueryString.Create(_query).ToString(); - _request.Fetch(_features).QueryString = _queryString; + if (value == null) + { + _original = string.Empty; + _request.Fetch(_features).QueryString = string.Empty; + } + else + { + _original = QueryString.Create(_parsedValues).ToString(); + _request.Fetch(_features).QueryString = _original; + } } } } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 08317fdd50..cc0a9df3ed 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal @@ -14,18 +15,18 @@ namespace Microsoft.AspNet.Http.Features.Internal { private readonly IFeatureCollection _features; private readonly FeatureReference _request = FeatureReference.Default; - private string[] _cookieHeaders; - private RequestCookiesCollection _cookiesCollection; - private IReadableStringCollection _cookies; - public RequestCookiesFeature([NotNull] IDictionary cookies) - : this (new ReadableStringCollection(cookies)) + private StringValues _original; + private IReadableStringCollection _parsedValues; + + public RequestCookiesFeature([NotNull] IDictionary cookies) + : this(new ReadableStringCollection(cookies)) { } public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) { - _cookies = cookies; + _parsedValues = cookies; } public RequestCookiesFeature([NotNull] IFeatureCollection features) @@ -39,46 +40,53 @@ namespace Microsoft.AspNet.Http.Features.Internal { if (_features == null) { - return _cookies; + return _parsedValues ?? ReadableStringCollection.Empty; } var headers = _request.Fetch(_features).Headers; - string[] values; - if (!headers.TryGetValue(HeaderNames.Cookie, out values)) + StringValues current; + if (!headers.TryGetValue(HeaderNames.Cookie, out current)) { - values = new string[0]; + current = StringValues.Empty; } - if (_cookieHeaders == null || !Enumerable.SequenceEqual(_cookieHeaders, values, StringComparer.Ordinal)) + if (_parsedValues == null || !Enumerable.SequenceEqual(_original, current, StringComparer.Ordinal)) { - _cookieHeaders = values; - if (_cookiesCollection == null) + _original = current; + var collectionParser = _parsedValues as RequestCookiesCollection; + if (collectionParser == null) { - _cookiesCollection = new RequestCookiesCollection(); - _cookies = _cookiesCollection; + collectionParser = new RequestCookiesCollection(); + _parsedValues = collectionParser; } - _cookiesCollection.Reparse(values); + collectionParser.Reparse(current); } - return _cookies; + return _parsedValues; } set { - _cookies = value; - _cookieHeaders = null; - _cookiesCollection = _cookies as RequestCookiesCollection; - if (_cookies != null && _features != null) + _parsedValues = value; + _original = StringValues.Empty; + if (_features != null) { - var headers = new List(); - foreach (var pair in _cookies) + if (_parsedValues == null || _parsedValues.Count == 0) { - foreach (var cookieValue in pair.Value) - { - headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); - } + _request.Fetch(_features).Headers.Remove(HeaderNames.Cookie); + } + else + { + var headers = new List(); + foreach (var pair in _parsedValues) + { + foreach (var cookieValue in pair.Value) + { + headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); + } + } + _original = headers.ToArray(); + _request.Fetch(_features).Headers[HeaderNames.Cookie] = _original; } - _cookieHeaders = headers.ToArray(); - _request.Fetch(_features).Headers[HeaderNames.Cookie] = _cookieHeaders; } } } diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index ad829cd70c..15de4dee62 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { @@ -11,12 +12,12 @@ namespace Microsoft.AspNet.Http.Internal /// public class FormCollection : ReadableStringCollection, IFormCollection { - public FormCollection([NotNull] IDictionary store) + public FormCollection([NotNull] IDictionary store) : this(store, new FormFileCollection()) { } - public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) + public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) : base(store) { Files = files; diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 04c2d556bd..d7cb70c481 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -4,9 +4,8 @@ using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using Microsoft.AspNet.Http.Internal; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { @@ -15,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal /// public class HeaderDictionary : IHeaderDictionary { - public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) + public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) { } @@ -23,12 +22,12 @@ namespace Microsoft.AspNet.Http.Internal /// Initializes a new instance of the class. /// /// The underlying data store. - public HeaderDictionary([NotNull] IDictionary store) + public HeaderDictionary([NotNull] IDictionary store) { Store = store; } - private IDictionary Store { get; set; } + private IDictionary Store { get; set; } /// /// Gets an that contains the keys in the ;. @@ -42,7 +41,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// /// - public ICollection Values + public ICollection Values { get { return Store.Values; } } @@ -69,11 +68,11 @@ namespace Microsoft.AspNet.Http.Internal /// Get or sets the associated value from the collection as a single string. /// /// The header name. - /// the associated value from the collection as a single string or null if the key is not present. - public string this[string key] + /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. + public StringValues this[string key] { - get { return Get(key); } - set { Set(key, value); } + get { return ParsingHelpers.GetHeader(Store, key); } + set { ParsingHelpers.SetHeader(Store, key, value); } } /// @@ -81,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// - string[] IDictionary.this[string key] + StringValues IDictionary.this[string key] { get { return Store[key]; } set { Store[key] = value; } @@ -91,7 +90,7 @@ namespace Microsoft.AspNet.Http.Internal /// Returns an enumerator that iterates through a collection. /// /// An object that can be used to iterate through the collection. - public IEnumerator> GetEnumerator() + IEnumerator> IEnumerable>.GetEnumerator() { return Store.GetEnumerator(); } @@ -102,59 +101,29 @@ namespace Microsoft.AspNet.Http.Internal /// An object that can be used to iterate through the collection. IEnumerator IEnumerable.GetEnumerator() { - return GetEnumerator(); + return Store.GetEnumerator(); } - /// - /// Get the associated value from the collection as a single string. - /// - /// The header name. - /// the associated value from the collection as a single string or null if the key is not present. - public string Get(string key) - { - return ParsingHelpers.GetHeader(Store, key); - } - - /// - /// Get the associated values from the collection without modification. - /// - /// The header name. - /// the associated value from the collection without modification, or null if the key is not present. - public IList GetValues(string key) - { - return ParsingHelpers.GetHeaderUnmodified(Store, key); - } /// /// Get the associated values from the collection separated into individual values. /// Quoted values will not be split, and the quotes will be removed. /// /// The header name. - /// the associated values from the collection separated into individual values, or null if the key is not present. - public IList GetCommaSeparatedValues(string key) + /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. + public StringValues GetCommaSeparatedValues(string key) { - IEnumerable values = ParsingHelpers.GetHeaderSplit(Store, key); - return values == null ? null : values.ToList(); - } - - /// - /// Add a new value. Appends to the header if already present - /// - /// The header name. - /// The header value. - public void Append(string key, string value) - { - ParsingHelpers.AppendHeader(Store, key, value); + return ParsingHelpers.GetHeaderSplit(Store, key); } /// /// Add new values. Each item remains a separate array entry. /// /// The header name. - /// The header values. - public void AppendValues(string key, params string[] values) + /// The header value. + public void Append(string key, StringValues value) { - ParsingHelpers.AppendHeaderUnmodified(Store, key, values); + ParsingHelpers.AppendHeaderUnmodified(Store, key, value); } /// @@ -167,26 +136,6 @@ namespace Microsoft.AspNet.Http.Internal ParsingHelpers.AppendHeaderJoined(Store, key, values); } - /// - /// Sets a specific header value. - /// - /// The header name. - /// The header value. - public void Set(string key, string value) - { - ParsingHelpers.SetHeader(Store, key, value); - } - - /// - /// Sets the specified header values without modification. - /// - /// The header name. - /// The header values. - public void SetValues(string key, params string[] values) - { - ParsingHelpers.SetHeaderUnmodified(Store, key, values); - } - /// /// Quotes any values containing comas, and then coma joins all of the values. /// @@ -202,7 +151,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The header values. - public void Add(string key, string[] value) + public void Add(string key, StringValues value) { Store.Add(key, value); } @@ -233,7 +182,7 @@ namespace Microsoft.AspNet.Http.Internal /// The header name. /// The value. /// true if the contains the key; otherwise, false. - public bool TryGetValue(string key, out string[] value) + public bool TryGetValue(string key, out StringValues value) { return Store.TryGetValue(key, out value); } @@ -242,7 +191,7 @@ namespace Microsoft.AspNet.Http.Internal /// Adds a new list of items to the collection. /// /// The item to add. - public void Add(KeyValuePair item) + public void Add(KeyValuePair item) { Store.Add(item); } @@ -260,7 +209,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The item. /// true if the specified object occurs within this collection; otherwise, false. - public bool Contains(KeyValuePair item) + public bool Contains(KeyValuePair item) { return Store.Contains(item); } @@ -270,7 +219,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. - public void CopyTo(KeyValuePair[] array, int arrayIndex) + public void CopyTo(KeyValuePair[] array, int arrayIndex) { Store.CopyTo(array, arrayIndex); } @@ -280,7 +229,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The item. /// true if the specified object was removed from the collection; otherwise, false. - public bool Remove(KeyValuePair item) + public bool Remove(KeyValuePair item) { return Store.Remove(item); } diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 45ac370eb4..bc373b4094 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal @@ -76,9 +77,9 @@ namespace Microsoft.AspNet.Http.Internal [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] internal struct HeaderSegmentCollection : IEnumerable, IEquatable { - private readonly string[] _headers; + private readonly StringValues _headers; - public HeaderSegmentCollection(string[] headers) + public HeaderSegmentCollection(StringValues headers) { _headers = headers; } @@ -102,7 +103,7 @@ namespace Microsoft.AspNet.Http.Internal public override int GetHashCode() { - return (_headers != null ? _headers.GetHashCode() : 0); + return (!StringValues.IsNullOrEmpty(_headers) ? _headers.GetHashCode() : 0); } public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) @@ -134,7 +135,7 @@ namespace Microsoft.AspNet.Http.Internal internal struct Enumerator : IEnumerator { - private readonly string[] _headers; + private readonly StringValues _headers; private int _index; private string _header; @@ -149,11 +150,9 @@ namespace Microsoft.AspNet.Http.Internal private Mode _mode; - private static readonly string[] NoHeaders = new string[0]; - - public Enumerator(string[] headers) + public Enumerator(StringValues headers) { - _headers = headers ?? NoHeaders; + _headers = headers; _header = string.Empty; _headerLength = -1; _index = -1; @@ -237,7 +236,7 @@ namespace Microsoft.AspNet.Http.Internal _trailingStart = -1; // if that was the last string - if (_index == _headers.Length) + if (_index == _headers.Count) { // no more move nexts return false; @@ -496,19 +495,19 @@ namespace Microsoft.AspNet.Http.Internal internal static class ParsingHelpers { - public static string GetHeader(IDictionary headers, string key) + public static StringValues GetHeader(IDictionary headers, string key) { - string[] values = GetHeaderUnmodified(headers, key); - return values == null ? null : string.Join(",", values); + StringValues value; + return headers.TryGetValue(key, out value) ? value : StringValues.Empty; } - public static IEnumerable GetHeaderSplit(IDictionary headers, string key) + public static StringValues GetHeaderSplit(IDictionary headers, string key) { - string[] values = GetHeaderUnmodified(headers, key); - return values == null ? null : GetHeaderSplitImplementation(values); + var values = GetHeaderUnmodified(headers, key); + return new StringValues(GetHeaderSplitImplementation(values).ToArray()); } - private static IEnumerable GetHeaderSplitImplementation(string[] values) + private static IEnumerable GetHeaderSplitImplementation(StringValues values) { foreach (var segment in new HeaderSegmentCollection(values)) { @@ -519,41 +518,41 @@ namespace Microsoft.AspNet.Http.Internal } } - public static string[] GetHeaderUnmodified([NotNull] IDictionary headers, string key) + public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) { - string[] values; - return headers.TryGetValue(key, out values) ? values : null; + StringValues values; + return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, string value) + public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, StringValues value) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } - if (string.IsNullOrWhiteSpace(value)) + if (StringValues.IsNullOrEmpty(value)) { headers.Remove(key); } else { - headers[key] = new[] { value }; + headers[key] = value; } } - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } - if (values == null || values.Length == 0) + if (StringValues.IsNullOrEmpty(value)) { headers.Remove(key); } else { - headers[key] = new[] { string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); } } @@ -589,46 +588,23 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) { if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); } - if (values == null || values.Length == 0) + if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) { headers.Remove(key); } else { - headers[key] = values; + headers[key] = values.Value; } } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, [NotNull] IEnumerable values) - { - headers[key] = values.ToArray(); - } - - public static void AppendHeader([NotNull] IDictionary headers, [NotNull] string key, string values) - { - if (string.IsNullOrWhiteSpace(values)) - { - return; - } - - string existing = GetHeader(headers, key); - if (existing == null) - { - SetHeader(headers, key, values); - } - else - { - headers[key] = new[] { existing + "," + values }; - } - } - - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) { if (values == null || values.Length == 0) { @@ -642,35 +618,29 @@ namespace Microsoft.AspNet.Http.Internal } else { - headers[key] = new[] { existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))) }; + headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); } } - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) { - if (values == null || values.Length == 0) + if (values.Count == 0) { return; } - string[] existing = GetHeaderUnmodified(headers, key); - if (existing == null) - { - SetHeaderUnmodified(headers, key, values); - } - else - { - SetHeaderUnmodified(headers, key, existing.Concat(values)); - } + var existing = GetHeaderUnmodified(headers, key); + SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); } public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; - string rawValue = headers.Get(HeaderNames.ContentLength); - if (!string.IsNullOrWhiteSpace(rawValue) && - long.TryParse(rawValue, styles, CultureInfo.InvariantCulture, out value)) + var rawValue = headers[HeaderNames.ContentLength]; + if (rawValue.Count == 1 && + !string.IsNullOrWhiteSpace(rawValue[0]) && + long.TryParse(rawValue[0], styles, CultureInfo.InvariantCulture, out value)) { return value; } diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs index 7a07ea603c..962804b723 100644 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -4,6 +4,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { @@ -12,16 +13,18 @@ namespace Microsoft.AspNet.Http.Internal /// public class ReadableStringCollection : IReadableStringCollection { + public static readonly IReadableStringCollection Empty = new ReadableStringCollection(new Dictionary(0)); + /// /// Create a new wrapper /// /// - public ReadableStringCollection([NotNull] IDictionary store) + public ReadableStringCollection([NotNull] IDictionary store) { Store = store; } - private IDictionary Store { get; set; } + private IDictionary Store { get; set; } /// /// Gets the number of elements contained in the collection. @@ -42,13 +45,21 @@ namespace Microsoft.AspNet.Http.Internal /// /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. + /// Returns StringValues.Empty if the key is not present. /// /// /// - public string this[string key] + public StringValues this[string key] { - get { return Get(key); } + get + { + StringValues value; + if (Store.TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } } /// @@ -61,35 +72,12 @@ namespace Microsoft.AspNet.Http.Internal return Store.ContainsKey(key); } - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. - /// - /// - /// - public string Get(string key) - { - return GetJoinedValue(Store, key); - } - - /// - /// Get the associated values from the collection in their original format. - /// Returns null if the key is not present. - /// - /// - /// - public IList GetValues(string key) - { - string[] values; - Store.TryGetValue(key, out values); - return values; - } /// /// /// /// - public IEnumerator> GetEnumerator() + public IEnumerator> GetEnumerator() { return Store.GetEnumerator(); } @@ -102,15 +90,5 @@ namespace Microsoft.AspNet.Http.Internal { return GetEnumerator(); } - - private static string GetJoinedValue(IDictionary store, string key) - { - string[] values; - if (store.TryGetValue(key, out values)) - { - return string.Join(",", values); - } - return null; - } } } diff --git a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs index 1dc603b518..8fb23def3d 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs @@ -4,6 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; +using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal @@ -17,7 +18,7 @@ namespace Microsoft.AspNet.Http.Internal _dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); } - public string this[string key] + public StringValues this[string key] { get { return Get(key); } } @@ -88,11 +89,11 @@ namespace Microsoft.AspNet.Http.Internal } } - public IEnumerator> GetEnumerator() + public IEnumerator> GetEnumerator() { foreach (var pair in _dictionary) { - yield return new KeyValuePair(pair.Key, new[] { pair.Value }); + yield return new KeyValuePair(pair.Key, pair.Value); } } diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index b47b48d505..7ead5dcc91 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Linq; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; @@ -33,11 +33,14 @@ namespace Microsoft.AspNet.Http.Internal /// public void Append(string key, string value) { - Headers.AppendValues(HeaderNames.SetCookie, - new SetCookieHeaderValue( + var setCookieHeaderValue = new SetCookieHeaderValue( UrlEncoder.Default.UrlEncode(key), UrlEncoder.Default.UrlEncode(value)) - { Path = "/" }.ToString()); + { + Path = "/" + }; + + Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], setCookieHeaderValue.ToString()); } /// @@ -48,17 +51,18 @@ namespace Microsoft.AspNet.Http.Internal /// public void Append(string key, string value, [NotNull] CookieOptions options) { - Headers.AppendValues(HeaderNames.SetCookie, - new SetCookieHeaderValue( + var setCookieHeaderValue = new SetCookieHeaderValue( UrlEncoder.Default.UrlEncode(key), UrlEncoder.Default.UrlEncode(value)) - { - Domain = options.Domain, - Path = options.Path, - Expires = options.Expires, - Secure = options.Secure, - HttpOnly = options.HttpOnly, - }.ToString()); + { + Domain = options.Domain, + Path = options.Path, + Expires = options.Expires, + Secure = options.Secure, + HttpOnly = options.HttpOnly, + }; + + Headers[HeaderNames.SetCookie] = StringValues.Concat(Headers[HeaderNames.SetCookie], setCookieHeaderValue.ToString()); } /// @@ -70,15 +74,15 @@ namespace Microsoft.AspNet.Http.Internal var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - var deleteCookies = new[] { encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT" }; - IList existingValues = Headers.GetValues(HeaderNames.SetCookie); - if (existingValues == null || existingValues.Count == 0) + StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT"; + var existingValues = Headers[HeaderNames.SetCookie]; + if (StringValues.IsNullOrEmpty(existingValues)) { - Headers.SetValues(HeaderNames.SetCookie, deleteCookies); + Headers[HeaderNames.SetCookie] = deleteCookies; } else { - Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray()); + Headers[HeaderNames.SetCookie] = existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray(); } } @@ -111,10 +115,10 @@ namespace Microsoft.AspNet.Http.Internal rejectPredicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); } - IList existingValues = Headers.GetValues(HeaderNames.SetCookie); - if (existingValues != null) + var existingValues = Headers[HeaderNames.SetCookie]; + if (!StringValues.IsNullOrEmpty(existingValues)) { - Headers.SetValues(HeaderNames.SetCookie, existingValues.Where(value => !rejectPredicate(value)).ToArray()); + Headers[HeaderNames.SetCookie] = existingValues.Where(value => !rejectPredicate(value)).ToArray(); } Append(key, string.Empty, new CookieOptions diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs new file mode 100644 index 0000000000..fb1e812cca --- /dev/null +++ b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs @@ -0,0 +1,80 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Owin +{ + internal class DictionaryStringArrayWrapper : IDictionary + { + public DictionaryStringArrayWrapper(IDictionary inner) + { + Inner = inner; + } + + public readonly IDictionary Inner; + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private StringValues Convert(string[] item) => item; + + private string[] Convert(StringValues item) => item; + + string[] IDictionary.this[string key] + { + get { return Inner[key]; } + set { Inner[key] = value; } + } + + int ICollection>.Count => Inner.Count; + + bool ICollection>.IsReadOnly => Inner.IsReadOnly; + + ICollection IDictionary.Keys => Inner.Keys; + + ICollection IDictionary.Values => Inner.Values.Select(Convert).ToList(); + + void ICollection>.Add(KeyValuePair item) => Inner.Add(Convert(item)); + + void IDictionary.Add(string key, string[] value) => Inner.Add(key, value); + + void ICollection>.Clear() => Inner.Clear(); + + bool ICollection>.Contains(KeyValuePair item) => Inner.Contains(Convert(item)); + + bool IDictionary.ContainsKey(string key) => Inner.ContainsKey(key); + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + foreach(var kv in Inner) + { + array[arrayIndex++] = Convert(kv); + } + } + + IEnumerator IEnumerable.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + IEnumerator> IEnumerable>.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + bool ICollection>.Remove(KeyValuePair item) => Inner.Remove(Convert(item)); + + bool IDictionary.Remove(string key) => Inner.Remove(key); + + bool IDictionary.TryGetValue(string key, out string[] value) + { + StringValues temp; + if (Inner.TryGetValue(key, out temp)) + { + value = temp; + return true; + } + value = default(StringValues); + return false; + } + } +} diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs new file mode 100644 index 0000000000..e94ecbcb30 --- /dev/null +++ b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs @@ -0,0 +1,80 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Owin +{ + internal class DictionaryStringValuesWrapper : IDictionary + { + public DictionaryStringValuesWrapper(IDictionary inner) + { + Inner = inner; + } + + public readonly IDictionary Inner; + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); + + private StringValues Convert(string[] item) => item; + + private string[] Convert(StringValues item) => item; + + StringValues IDictionary.this[string key] + { + get { return Inner[key]; } + set { Inner[key] = value; } + } + + int ICollection>.Count => Inner.Count; + + bool ICollection>.IsReadOnly => Inner.IsReadOnly; + + ICollection IDictionary.Keys => Inner.Keys; + + ICollection IDictionary.Values => Inner.Values.Select(Convert).ToList(); + + void ICollection>.Add(KeyValuePair item) => Inner.Add(Convert(item)); + + void IDictionary.Add(string key, StringValues value) => Inner.Add(key, value); + + void ICollection>.Clear() => Inner.Clear(); + + bool ICollection>.Contains(KeyValuePair item) => Inner.Contains(Convert(item)); + + bool IDictionary.ContainsKey(string key) => Inner.ContainsKey(key); + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + foreach (var kv in Inner) + { + array[arrayIndex++] = Convert(kv); + } + } + + IEnumerator IEnumerable.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + IEnumerator> IEnumerable>.GetEnumerator() => Inner.Select(Convert).GetEnumerator(); + + bool ICollection>.Remove(KeyValuePair item) => Inner.Remove(Convert(item)); + + bool IDictionary.Remove(string key) => Inner.Remove(key); + + bool IDictionary.TryGetValue(string key, out StringValues value) + { + string[] temp; + if (Inner.TryGetValue(key, out temp)) + { + value = temp; + return true; + } + value = default(StringValues); + return false; + } + } +} diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 2b331b0d57..62ca09b84e 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -56,13 +56,13 @@ namespace Microsoft.AspNet.Owin { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, () => string.Empty, (feature, value) => feature.Path = Convert.ToString(value)) }, { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), () => string.Empty, (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, - { OwinConstants.RequestHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.RequestUser, new FeatureMap(feature => feature.User, () => null, (feature, value) => feature.User = (ClaimsPrincipal)value) }, { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, - { OwinConstants.ResponseHeaders, new FeatureMap(feature => feature.Headers, (feature, value) => feature.Headers = (IDictionary)value) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap( feature => new Action, object>((cb, state) => { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 614bccf333..de01c47052 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -14,8 +14,10 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Owin { @@ -104,10 +106,10 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } - IDictionary IHttpRequestFeature.Headers + IDictionary IHttpRequestFeature.Headers { - get { return Prop>(OwinConstants.RequestHeaders); } - set { Prop(OwinConstants.RequestHeaders, value); } + get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.RequestHeaders)); } + set { Prop(OwinConstants.RequestHeaders, Utilities.MakeDictionaryStringArray(value)); } } string IHttpRequestIdentifierFeature.TraceIdentifier @@ -134,10 +136,10 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseReasonPhrase, value); } } - IDictionary IHttpResponseFeature.Headers + IDictionary IHttpResponseFeature.Headers { - get { return Prop>(OwinConstants.ResponseHeaders); } - set { Prop(OwinConstants.ResponseHeaders, value); } + get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.ResponseHeaders)); } + set { Prop(OwinConstants.ResponseHeaders, Utilities.MakeDictionaryStringArray(value)); } } Stream IHttpResponseFeature.Body diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index fd3c69033f..98fc30ea26 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -1,8 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; +using Microsoft.AspNet.Http; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Owin { @@ -41,5 +45,25 @@ namespace Microsoft.AspNet.Owin } return new ClaimsPrincipal(principal); } + + internal static IDictionary MakeDictionaryStringValues(IDictionary dictionary) + { + var wrapper = dictionary as DictionaryStringArrayWrapper; + if (wrapper != null) + { + return wrapper.Inner; + } + return new DictionaryStringValuesWrapper(dictionary); + } + + internal static IDictionary MakeDictionaryStringArray(IDictionary dictionary) + { + var wrapper = dictionary as DictionaryStringValuesWrapper; + if (wrapper != null) + { + return wrapper.Inner; + } + return new DictionaryStringArrayWrapper(dictionary); + } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 0f9900432c..e475522646 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -8,6 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { @@ -150,11 +151,11 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static IDictionary ReadForm(string text) + public static IDictionary ReadForm(string text) { var reader = new FormReader(text); - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); var pair = reader.ReadNextPair(); while (pair.HasValue) { @@ -170,7 +171,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); } @@ -180,11 +181,11 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) + public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) { var reader = new FormReader(stream, encoding); - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); var pair = await reader.ReadNextPairAsync(cancellationToken); while (pair.HasValue) { diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index 9fb4b2b61f..eb8f311c50 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -1,38 +1,37 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { - public class KeyValueAccumulator + public class KeyValueAccumulator { - private Dictionary> _accumulator; - IEqualityComparer _comparer; + private Dictionary> _accumulator; - public KeyValueAccumulator([NotNull] IEqualityComparer comparer) + public KeyValueAccumulator() { - _comparer = comparer; - _accumulator = new Dictionary>(comparer); + _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); } - public void Append(TKey key, TValue value) + public void Append(string key, string value) { - List values; + List values; if (_accumulator.TryGetValue(key, out values)) { values.Add(value); } else { - _accumulator[key] = new List(1) { value }; + _accumulator[key] = new List(1) { value }; } } - public IDictionary GetResults() + public IDictionary GetResults() { - var results = new Dictionary(_comparer); + var results = new Dictionary(StringComparer.OrdinalIgnoreCase); foreach (var kv in _accumulator) { results.Add(kv.Key, kv.Value.ToArray()); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 244117e34c..631908173b 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -8,6 +8,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { @@ -64,10 +65,10 @@ namespace Microsoft.AspNet.WebUtilities return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; } - private async Task> ReadHeadersAsync(CancellationToken cancellationToken) + private async Task> ReadHeadersAsync(CancellationToken cancellationToken) { int totalSize = 0; - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); var line = await _stream.ReadLineAsync(HeaderLengthLimit, cancellationToken); while (!string.IsNullOrEmpty(line)) { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index 5618b826fb..c420073eef 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities { @@ -12,10 +13,10 @@ namespace Microsoft.AspNet.WebUtilities { get { - string[] values; + StringValues values; if (Headers.TryGetValue("Content-Type", out values)) { - return string.Join(", ", values); + return values; } return null; } @@ -25,16 +26,16 @@ namespace Microsoft.AspNet.WebUtilities { get { - string[] values; + StringValues values; if (Headers.TryGetValue("Content-Disposition", out values)) { - return string.Join(", ", values); + return values; } return null; } } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 6df0e2d701..13cd1f4051 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Text; using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.WebUtilities @@ -72,13 +73,13 @@ namespace Microsoft.AspNet.WebUtilities /// /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. - public static IDictionary ParseQuery(string queryString) + public static IDictionary ParseQuery(string queryString) { if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') { queryString = queryString.Substring(1); } - var accumulator = new KeyValueAccumulator(StringComparer.OrdinalIgnoreCase); + var accumulator = new KeyValueAccumulator(); int textLength = queryString.Length; int equalIndex = queryString.IndexOf('='); diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 496449f4f6..4aa7a07c04 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -7,13 +7,13 @@ }, "dependencies": { "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.Primitives": "1.0.0-*", "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.11-beta-*", "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.IO.FileSystem": "4.0.1-beta-*", diff --git a/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj b/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj new file mode 100644 index 0000000000..f7b40aaa14 --- /dev/null +++ b/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj @@ -0,0 +1,20 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + e5faccd4-6327-43aa-80a9-ae6f4a3bfe6a + Microsoft.AspNet.Primitives + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + diff --git a/src/Microsoft.Framework.Primitives/StringValues.cs b/src/Microsoft.Framework.Primitives/StringValues.cs new file mode 100644 index 0000000000..a9904aac5c --- /dev/null +++ b/src/Microsoft.Framework.Primitives/StringValues.cs @@ -0,0 +1,233 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Microsoft.Framework.Primitives +{ + /// + /// Represents zero/null, one, or many strings in an efficient way. + /// + public struct StringValues : IList + { + private static readonly string[] EmptyArray = new string[0]; + public static readonly StringValues Empty = new StringValues(EmptyArray); + + private readonly string _value; + private readonly string[] _values; + + public StringValues(string value) + { + _value = value; + _values = null; + } + + public StringValues(string[] values) + { + _value = null; + _values = values; + } + + public static implicit operator StringValues(string value) + { + return new StringValues(value); + } + + public static implicit operator StringValues(string[] values) + { + return new StringValues(values); + } + + public static implicit operator string (StringValues values) + { + return values.GetStringValue(); + } + + public static implicit operator string[] (StringValues value) + { + return value.GetArrayValue(); + } + + public int Count => _values?.Length ?? (_value != null ? 1 : 0); + + bool ICollection.IsReadOnly + { + get { return true; } + } + + string IList.this[int index] + { + get { return this[index]; } + set { throw new NotSupportedException(); } + } + + public string this[int key] + { + get + { + if (_values != null) + { + return _values[key]; // may throw + } + if (key == 0 && _value != null) + { + return _value; + } + return EmptyArray[0]; // throws + } + } + + public override string ToString() + { + return GetStringValue() ?? string.Empty; + } + + private string GetStringValue() + { + if (_values == null) + { + return _value; + } + switch (_values.Length) + { + case 0: return null; + case 1: return _values[0]; + default: return string.Join(",", _values); + } + } + + public string[] ToArray() + { + return GetArrayValue() ?? EmptyArray; + } + + private string[] GetArrayValue() + { + if (_value != null) + { + return new[] { _value }; + } + return _values; + } + + int IList.IndexOf(string item) + { + var index = 0; + foreach (var value in this) + { + if (string.Equals(value, item, StringComparison.Ordinal)) + { + return index; + } + index += 1; + } + return -1; + } + + bool ICollection.Contains(string item) + { + return ((IList)this).IndexOf(item) >= 0; + } + + void ICollection.CopyTo(string[] array, int arrayIndex) + { + for(int i = 0; i < Count; i++) + { + array[arrayIndex + i] = this[i]; + } + } + + void ICollection.Add(string item) + { + throw new NotSupportedException(); + } + + void IList.Insert(int index, string item) + { + throw new NotSupportedException(); + } + + bool ICollection.Remove(string item) + { + throw new NotSupportedException(); + } + + void IList.RemoveAt(int index) + { + throw new NotSupportedException(); + } + + void ICollection.Clear() + { + throw new NotSupportedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return ((IEnumerable)this).GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + if (Count == 0) + { + yield break; + } + if (_values == null) + { + yield return _value; + } + else + { + for (int i = 0; i < _values.Length; i++) + { + yield return _values[i]; + } + } + } + + public static bool IsNullOrEmpty(StringValues value) + { + if (value._values == null) + { + return string.IsNullOrEmpty(value._value); + } + switch (value._values.Length) + { + case 0: return true; + case 1: return string.IsNullOrEmpty(value._values[0]); + default: return false; + } + } + + public static StringValues Concat(StringValues values1, StringValues values2) + { + var count1 = values1.Count; + var count2 = values2.Count; + + if (count1 == 0) + { + return values2; + } + + if (count2 == 0) + { + return values1; + } + + var combined = new string[count1 + count2]; + var index = 0; + foreach (var value in values1) + { + combined[index++] = value; + } + foreach (var value in values2) + { + combined[index++] = value; + } + return new StringValues(combined); + } + } +} diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json new file mode 100644 index 0000000000..3b870f7173 --- /dev/null +++ b/src/Microsoft.Framework.Primitives/project.json @@ -0,0 +1,23 @@ +{ + "version": "1.0.0-*", + "description": "Contains primitive types such as StringValues.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "dependencies": { + "Microsoft.Framework.NotNullAttribute.Sources": { + "type": "build", + "version": "1.0.0-*" + } + }, + "frameworks": { + "net451": { }, + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Collections": "4.0.11-beta-*" + } + } + } +} diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 81b268ba1f..16ac23f6ba 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http.Features; +using Microsoft.Framework.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal @@ -64,9 +65,9 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "localhost:9001"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Host", new string[] { expected } }, + { "Host", expected }, }; var request = CreateRequest(headers); @@ -84,9 +85,9 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "löcalhöst"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Host", new string[]{ "xn--lcalhst-90ae" } }, + { "Host", "xn--lcalhst-90ae" }, }; var request = CreateRequest(headers); @@ -104,7 +105,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "xn--lcalhst-90ae"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); var request = CreateRequest(headers); @@ -149,9 +150,9 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal("value0", query1["name0"]); Assert.Equal("value1", query1["name1"]); - var query2 = new ReadableStringCollection(new Dictionary() + var query2 = new ReadableStringCollection(new Dictionary() { - { "name2", new[] { "value2" } } + { "name2", "value2" } }); request.Query = query2; @@ -164,30 +165,30 @@ namespace Microsoft.AspNet.Http.Internal public void Cookies_GetAndSet() { var request = new DefaultHttpContext().Request; - var cookieHeaders = request.Headers.GetValues("Cookie"); - Assert.Null(cookieHeaders); + var cookieHeaders = request.Headers["Cookie"]; + Assert.Equal(0, cookieHeaders.Count); var cookies0 = request.Cookies; Assert.Equal(0, cookies0.Count); - request.Headers.SetValues("Cookie", new[] { "name0=value0", "name1=value1" }); + request.Headers["Cookie"] = new[] { "name0=value0", "name1=value1" }; var cookies1 = request.Cookies; Assert.Same(cookies0, cookies1); Assert.Equal(2, cookies1.Count); Assert.Equal("value0", cookies1["name0"]); Assert.Equal("value1", cookies1["name1"]); - var cookies2 = new ReadableStringCollection(new Dictionary() + var cookies2 = new ReadableStringCollection(new Dictionary() { - { "name2", new[] { "value2" } } + { "name2", "value2" } }); request.Cookies = cookies2; Assert.Same(cookies2, request.Cookies); Assert.Equal("value2", request.Cookies["name2"]); - cookieHeaders = request.Headers.GetValues("Cookie"); + cookieHeaders = request.Headers["Cookie"]; Assert.Equal(new[] { "name2=value2" }, cookieHeaders); } - private static HttpRequest CreateRequest(IDictionary headers) + private static HttpRequest CreateRequest(IDictionary headers) { var context = new DefaultHttpContext(); context.GetFeature().Headers = headers; @@ -216,10 +217,10 @@ namespace Microsoft.AspNet.Http.Internal private static HttpRequest GetRequestWithHeader(string headerName, string headerValue) { - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); if (headerValue != null) { - headers.Add(headerName, new[] { headerValue }); + headers.Add(headerName, headerValue); } return CreateRequest(headers); diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index 79cbac89c5..c353d54d68 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.Framework.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal @@ -13,9 +14,9 @@ namespace Microsoft.AspNet.Http.Internal public void PropertiesAreAccessible() { var headers = new HeaderDictionary( - new Dictionary(StringComparer.OrdinalIgnoreCase) + new Dictionary(StringComparer.OrdinalIgnoreCase) { - { "Header1", new[] { "Value1" } } + { "Header1", "Value1" } }); Assert.Equal(1, headers.Count); @@ -23,8 +24,7 @@ namespace Microsoft.AspNet.Http.Internal Assert.True(headers.ContainsKey("header1")); Assert.False(headers.ContainsKey("header2")); Assert.Equal("Value1", headers["header1"]); - Assert.Equal("Value1", headers.Get("header1")); - Assert.Equal(new[] { "Value1" }, headers.GetValues("header1")); + Assert.Equal(new[] { "Value1" }, headers["header1"].ToArray()); } } } \ No newline at end of file diff --git a/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj b/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj new file mode 100644 index 0000000000..f1a2ba4182 --- /dev/null +++ b/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj @@ -0,0 +1,21 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 61f72e92-b3ae-4a10-b838-44f80aed40ae + Microsoft.AspNet.Primitives.Tests + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + \ No newline at end of file diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs new file mode 100644 index 0000000000..389d6f547d --- /dev/null +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -0,0 +1,117 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Framework.Primitives +{ + public class StringValuesTests + { + [Fact] + public void IsReadOnly_True() + { + var stringValues = new StringValues(); + Assert.True(((IList)stringValues).IsReadOnly); + Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); + Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); + Assert.Throws(() => ((IList)stringValues).Insert(0, string.Empty)); + Assert.Throws(() => ((ICollection)stringValues).Remove(string.Empty)); + Assert.Throws(() => ((IList)stringValues).RemoveAt(0)); + Assert.Throws(() => ((ICollection)stringValues).Clear()); + } + + [Fact] + public void DefaultConstructor_ExpectedValues() + { + var stringValues = new StringValues(); + Assert.Equal(0, stringValues.Count); + Assert.Equal((string)null, stringValues); + Assert.Equal(new string[0], stringValues.ToArray()); + + Assert.True(StringValues.IsNullOrEmpty(stringValues)); + Assert.Throws(() => stringValues[0]); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(0, stringValues.Count()); + } + + [Fact] + public void Constructor_NullStringValue_ExpectedValues() + { + var stringValues = new StringValues((string)null); + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Null((string[])stringValues); + Assert.Equal(new string[0], stringValues.ToArray()); + + Assert.True(StringValues.IsNullOrEmpty(stringValues)); + Assert.Throws(() => stringValues[0]); + Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(0, stringValues.Count()); + } + + [Fact] + public void Constructor_NullStringArray_ExpectedValues() + { + var stringValues = new StringValues((string[])null); + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Null((string[])stringValues); + Assert.Equal(new string[0], stringValues.ToArray()); + + Assert.True(StringValues.IsNullOrEmpty(stringValues)); + Assert.Throws(() => stringValues[0]); + Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(0, stringValues.Count()); + } + + [Fact] + public void ImplicitStringConverter_Works() + { + string nullString = null; + StringValues stringValues = nullString; + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Null((string[])stringValues); + + string aString = "abc"; + stringValues = aString; + Assert.Equal(1, stringValues.Count); + Assert.Equal(aString, stringValues); + Assert.Equal(aString, stringValues[0]); + Assert.Equal(new string[] { aString }, stringValues); + } + + [Fact] + public void ImplicitStringArrayConverter_Works() + { + string[] nullStringArray = null; + StringValues stringValues = nullStringArray; + Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); + Assert.Null((string[])stringValues); + + string aString = "abc"; + string[] aStringArray = new[] { aString }; + stringValues = aStringArray; + Assert.Equal(1, stringValues.Count); + Assert.Equal(aString, stringValues); + Assert.Equal(aString, stringValues[0]); + Assert.Equal(aStringArray, stringValues); + + aString = "abc"; + string bString = "bcd"; + aStringArray = new[] { aString, bString }; + stringValues = aStringArray; + Assert.Equal(2, stringValues.Count); + Assert.Equal("abc,bcd", stringValues); + Assert.Equal(aStringArray, stringValues); + } + } +} diff --git a/test/Microsoft.Framework.Primitives.Tests/project.json b/test/Microsoft.Framework.Primitives.Tests/project.json new file mode 100644 index 0000000000..1a5837820c --- /dev/null +++ b/test/Microsoft.Framework.Primitives.Tests/project.json @@ -0,0 +1,13 @@ +{ + "dependencies": { + "Microsoft.Framework.Primitives": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From 59b44a4c245885ee910e3db14ec5041db80ae44d Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 25 Aug 2015 16:32:24 -0700 Subject: [PATCH 0713/1838] Move *CommaSeperatedValues APIs from IHeaderDictionary to extension. --- .../IHeaderDictionary.cs | 29 - .../HeaderDictionaryExtensions.cs | 52 ++ .../ParsingHelpers.cs | 618 ++++++++++++++++++ src/Microsoft.AspNet.Http/HeaderDictionary.cs | 42 -- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 79 --- 5 files changed, 670 insertions(+), 150 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index d2192475fa..36137ed45c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -30,34 +30,5 @@ namespace Microsoft.AspNet.Http /// Gets a collection containing the keys. /// new ICollection Keys { get; } - - /// - /// Get the associated values from the collection separated into individual values. - /// Quoted values will not be split, and the quotes will be removed. - /// - /// The header name. - /// the associated values from the collection separated into individual values, or null if the key is not present. - StringValues GetCommaSeparatedValues(string key); - - /// - /// Add a new value. Appends to the header list if already present - /// - /// The header name. - /// The header value. - void Append(string key, StringValues value); - - /// - /// Quotes any values containing comas, and then coma joins all of the values with any existing values. - /// - /// The header name. - /// The header values. - void AppendCommaSeparatedValues(string key, params string[] values); - - /// - /// Quotes any values containing comas, and then coma joins all of the values. - /// - /// The header name. - /// The header values. - void SetCommaSeparatedValues(string key, params string[] values); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs new file mode 100644 index 0000000000..c986a530c0 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -0,0 +1,52 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Internal; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Http +{ + public static class HeaderDictionaryExtensions + { + /// + /// Add new values. Each item remains a separate array entry. + /// + /// The header name. + /// The header value. + public static void Append(this IHeaderDictionary headers, string key, StringValues value) + { + ParsingHelpers.AppendHeaderUnmodified(headers, key, value); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values with any existing values. + /// + /// The header name. + /// The header values. + public static void AppendCommaSeparatedValues(this IHeaderDictionary headers, string key, params string[] values) + { + ParsingHelpers.AppendHeaderJoined(headers, key, values); + } + + /// + /// Get the associated values from the collection separated into individual values. + /// Quoted values will not be split, and the quotes will be removed. + /// + /// The header name. + /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. + public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) + { + return ParsingHelpers.GetHeaderSplit(headers, key); + } + + /// + /// Quotes any values containing comas, and then coma joins all of the values. + /// + /// The header name. + /// The header values. + public static void SetCommaSeparatedValues(this IHeaderDictionary headers, string key, params string[] values) + { + ParsingHelpers.SetHeaderJoined(headers, key, values); + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs new file mode 100644 index 0000000000..fcce4dd404 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs @@ -0,0 +1,618 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Http.Internal +{ + internal struct HeaderSegment : IEquatable + { + private readonly StringSegment _formatting; + private readonly StringSegment _data; + + // + // Initializes a new instance of the class. + // + public HeaderSegment(StringSegment formatting, StringSegment data) + { + _formatting = formatting; + _data = data; + } + + public StringSegment Formatting + { + get { return _formatting; } + } + + public StringSegment Data + { + get { return _data; } + } + + #region Equality members + + public bool Equals(HeaderSegment other) + { + return _formatting.Equals(other._formatting) && _data.Equals(other._data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegment && Equals((HeaderSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); + } + } + + public static bool operator ==(HeaderSegment left, HeaderSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegment left, HeaderSegment right) + { + return !left.Equals(right); + } + + #endregion + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct HeaderSegmentCollection : IEnumerable, IEquatable + { + private readonly StringValues _headers; + + public HeaderSegmentCollection(StringValues headers) + { + _headers = headers; + } + + #region Equality members + + public bool Equals(HeaderSegmentCollection other) + { + return Equals(_headers, other._headers); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegmentCollection && Equals((HeaderSegmentCollection)obj); + } + + public override int GetHashCode() + { + return (!StringValues.IsNullOrEmpty(_headers) ? _headers.GetHashCode() : 0); + } + + public static bool operator ==(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegmentCollection left, HeaderSegmentCollection right) + { + return !left.Equals(right); + } + + #endregion + + public Enumerator GetEnumerator() + { + return new Enumerator(_headers); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + internal struct Enumerator : IEnumerator + { + private readonly StringValues _headers; + private int _index; + + private string _header; + private int _headerLength; + private int _offset; + + private int _leadingStart; + private int _leadingEnd; + private int _valueStart; + private int _valueEnd; + private int _trailingStart; + + private Mode _mode; + + public Enumerator(StringValues headers) + { + _headers = headers; + _header = string.Empty; + _headerLength = -1; + _index = -1; + _offset = -1; + _leadingStart = -1; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + _mode = Mode.Leading; + } + + private enum Mode + { + Leading, + Value, + ValueQuoted, + Trailing, + Produce, + } + + private enum Attr + { + Value, + Quote, + Delimiter, + Whitespace + } + + public HeaderSegment Current + { + get + { + return new HeaderSegment( + new StringSegment(_header, _leadingStart, _leadingEnd - _leadingStart), + new StringSegment(_header, _valueStart, _valueEnd - _valueStart)); + } + } + + object IEnumerator.Current + { + get { return Current; } + } + + public void Dispose() + { + } + + public bool MoveNext() + { + while (true) + { + if (_mode == Mode.Produce) + { + _leadingStart = _trailingStart; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + if (_offset == _headerLength && + _leadingStart != -1 && + _leadingStart != _offset) + { + // Also produce trailing whitespace + _leadingEnd = _offset; + return true; + } + _mode = Mode.Leading; + } + + // if end of a string + if (_offset == _headerLength) + { + ++_index; + _offset = -1; + _leadingStart = 0; + _leadingEnd = -1; + _valueStart = -1; + _valueEnd = -1; + _trailingStart = -1; + + // if that was the last string + if (_index == _headers.Count) + { + // no more move nexts + return false; + } + + // grab the next string + _header = _headers[_index] ?? string.Empty; + _headerLength = _header.Length; + } + while (true) + { + ++_offset; + char ch = _offset == _headerLength ? (char)0 : _header[_offset]; + // todo - array of attrs + Attr attr = char.IsWhiteSpace(ch) ? Attr.Whitespace : ch == '\"' ? Attr.Quote : (ch == ',' || ch == (char)0) ? Attr.Delimiter : Attr.Value; + + switch (_mode) + { + case Mode.Leading: + switch (attr) + { + case Attr.Delimiter: + _leadingEnd = _offset; + _mode = Mode.Produce; + break; + case Attr.Quote: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + _leadingEnd = _offset; + _valueStart = _offset; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Value: + switch (attr) + { + case Attr.Quote: + _mode = Mode.ValueQuoted; + break; + case Attr.Delimiter: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + break; + case Attr.Value: + // more + break; + case Attr.Whitespace: + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Trailing; + break; + } + break; + case Mode.ValueQuoted: + switch (attr) + { + case Attr.Quote: + _mode = Mode.Value; + break; + case Attr.Delimiter: + if (ch == (char)0) + { + _valueEnd = _offset; + _trailingStart = _offset; + _mode = Mode.Produce; + } + break; + case Attr.Value: + case Attr.Whitespace: + // more + break; + } + break; + case Mode.Trailing: + switch (attr) + { + case Attr.Delimiter: + _mode = Mode.Produce; + break; + case Attr.Quote: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.ValueQuoted; + break; + case Attr.Value: + // back into value + _trailingStart = -1; + _valueEnd = -1; + _mode = Mode.Value; + break; + case Attr.Whitespace: + // more + break; + } + break; + } + if (_mode == Mode.Produce) + { + return true; + } + } + } + } + + public void Reset() + { + _index = 0; + _offset = 0; + _leadingStart = 0; + _leadingEnd = 0; + _valueStart = 0; + _valueEnd = 0; + } + } + } + + [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] + internal struct StringSegment : IEquatable + { + private readonly string _buffer; + private readonly int _offset; + private readonly int _count; + + // + // Initializes a new instance of the class. + // + public StringSegment(string buffer, int offset, int count) + { + _buffer = buffer; + _offset = offset; + _count = count; + } + + public string Buffer + { + get { return _buffer; } + } + + public int Offset + { + get { return _offset; } + } + + public int Count + { + get { return _count; } + } + + public string Value + { + get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } + } + + public bool HasValue + { + get { return _offset != -1 && _count != 0 && _buffer != null; } + } + + #region Equality members + + public bool Equals(StringSegment other) + { + return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is StringSegment && Equals((StringSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ _offset; + hashCode = (hashCode * 397) ^ _count; + return hashCode; + } + } + + public static bool operator ==(StringSegment left, StringSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(StringSegment left, StringSegment right) + { + return !left.Equals(right); + } + + #endregion + + public bool StartsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public bool EndsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; + } + + public bool Equals([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count != textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public string Substring(int offset, int length) + { + return _buffer.Substring(_offset + offset, length); + } + + public StringSegment Subsegment(int offset, int length) + { + return new StringSegment(_buffer, _offset + offset, length); + } + + public override string ToString() + { + return Value ?? string.Empty; + } + } + + internal static class ParsingHelpers + { + public static StringValues GetHeader(IDictionary headers, string key) + { + StringValues value; + return headers.TryGetValue(key, out value) ? value : StringValues.Empty; + } + + public static StringValues GetHeaderSplit(IDictionary headers, string key) + { + var values = GetHeaderUnmodified(headers, key); + return new StringValues(GetHeaderSplitImplementation(values).ToArray()); + } + + private static IEnumerable GetHeaderSplitImplementation(StringValues values) + { + foreach (var segment in new HeaderSegmentCollection(values)) + { + if (segment.Data.HasValue) + { + yield return DeQuote(segment.Data.Value); + } + } + } + + public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + { + StringValues values; + return headers.TryGetValue(key, out values) ? values : StringValues.Empty; + } + + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (StringValues.IsNullOrEmpty(value)) + { + headers.Remove(key); + } + else + { + headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); + } + } + + // Quote items that contain comas and are not already quoted. + private static string QuoteIfNeeded(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Contains(',')) + { + if (value[0] != '"' || value[value.Length - 1] != '"') + { + value = '"' + value + '"'; + } + } + + return value; + } + + private static string DeQuote(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + { + value = value.Substring(1, value.Length - 2); + } + + return value; + } + + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) + { + headers.Remove(key); + } + else + { + headers[key] = values.Value; + } + } + + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeaderJoined(headers, key, values); + } + else + { + headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); + } + } + + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) + { + if (values.Count == 0) + { + return; + } + + var existing = GetHeaderUnmodified(headers, key); + SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); + } + } +} diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index d7cb70c481..05d5d7fdf4 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -104,48 +104,6 @@ namespace Microsoft.AspNet.Http.Internal return Store.GetEnumerator(); } - - /// - /// Get the associated values from the collection separated into individual values. - /// Quoted values will not be split, and the quotes will be removed. - /// - /// The header name. - /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. - public StringValues GetCommaSeparatedValues(string key) - { - return ParsingHelpers.GetHeaderSplit(Store, key); - } - - /// - /// Add new values. Each item remains a separate array entry. - /// - /// The header name. - /// The header value. - public void Append(string key, StringValues value) - { - ParsingHelpers.AppendHeaderUnmodified(Store, key, value); - } - - /// - /// Quotes any values containing comas, and then coma joins all of the values with any existing values. - /// - /// The header name. - /// The header values. - public void AppendCommaSeparatedValues(string key, params string[] values) - { - ParsingHelpers.AppendHeaderJoined(Store, key, values); - } - - /// - /// Quotes any values containing comas, and then coma joins all of the values. - /// - /// The header name. - /// The header values. - public void SetCommaSeparatedValues(string key, params string[] values) - { - ParsingHelpers.SetHeaderJoined(Store, key, values); - } - /// /// Adds the given header and values to the collection. /// diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index bc373b4094..54455b90b3 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -540,40 +540,6 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (StringValues.IsNullOrEmpty(value)) - { - headers.Remove(key); - } - else - { - headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); - } - } - - // Quote items that contain comas and are not already quoted. - private static string QuoteIfNeeded(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Contains(',')) - { - if (value[0] != '"' || value[value.Length - 1] != '"') - { - value = '"' + value + '"'; - } - } - - return value; - } - private static string DeQuote(string value) { if (string.IsNullOrWhiteSpace(value)) @@ -588,51 +554,6 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) - { - headers.Remove(key); - } - else - { - headers[key] = values.Value; - } - } - - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) - { - if (values == null || values.Length == 0) - { - return; - } - - string existing = GetHeader(headers, key); - if (existing == null) - { - SetHeaderJoined(headers, key, values); - } - else - { - headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); - } - } - - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) - { - if (values.Count == 0) - { - return; - } - - var existing = GetHeaderUnmodified(headers, key); - SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); - } - public static long? GetContentLength([NotNull] IHeaderDictionary headers) { const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; From d448c6e389e4c11aefd572ec0dd693986fab2703 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 28 Aug 2015 12:27:17 -0700 Subject: [PATCH 0714/1838] React to string[] -> StringValues changes. --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 9 +++++---- src/Microsoft.AspNet.TestHost/RequestFeature.cs | 5 +++-- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 5 +++-- 3 files changed, 11 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index a5f61bd4f9..df72462e24 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using System.IO; @@ -135,14 +136,14 @@ namespace Microsoft.AspNet.TestHost foreach (var header in request.Headers) { - serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); + serverRequest.Headers.Append(header.Key, header.Value.ToArray()); } var requestContent = request.Content; if (requestContent != null) { foreach (var header in request.Content.Headers) { - serverRequest.Headers.AppendValues(header.Key, header.Value.ToArray()); + serverRequest.Headers.Append(header.Key, header.Value.ToArray()); } } @@ -187,9 +188,9 @@ namespace Microsoft.AspNet.TestHost foreach (var header in HttpContext.Response.Headers) { - if (!response.Headers.TryAddWithoutValidation(header.Key, header.Value)) + if (!response.Headers.TryAddWithoutValidation(header.Key, (IEnumerable)header.Value)) { - bool success = response.Content.Headers.TryAddWithoutValidation(header.Key, header.Value); + bool success = response.Content.Headers.TryAddWithoutValidation(header.Key, (IEnumerable)header.Value); Contract.Assert(success, "Bad header"); } } diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index eebdd28372..b55b02b6ff 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using Microsoft.AspNet.Http.Features; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.TestHost { @@ -13,7 +14,7 @@ namespace Microsoft.AspNet.TestHost public RequestFeature() { Body = Stream.Null; - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Method = "GET"; Path = ""; PathBase = ""; @@ -24,7 +25,7 @@ namespace Microsoft.AspNet.TestHost public Stream Body { get; set; } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public string Method { get; set; } diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 25d9b3260d..2f699e572d 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -6,6 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; +using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.TestHost { @@ -16,7 +17,7 @@ namespace Microsoft.AspNet.TestHost public ResponseFeature() { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); Body = new MemoryStream(); // 200 is the default status code all the way down to the host, so we set it @@ -28,7 +29,7 @@ namespace Microsoft.AspNet.TestHost public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } + public IDictionary Headers { get; set; } public Stream Body { get; set; } From f475e53ad235478b5ac35bab31a72e6cafb52156 Mon Sep 17 00:00:00 2001 From: Chris R Date: Sun, 30 Aug 2015 21:55:22 -0700 Subject: [PATCH 0715/1838] #367 Add HttpContext.Features, move Get/SetFeature. Take 1. --- .../HttpContext.cs | 2 ++ .../SendFileResponseExtensions.cs | 4 +-- .../FeatureCollectionExtensions.cs | 30 +++++++++++++++++++ .../DefaultHttpContext.cs | 6 ++-- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 12 ++++---- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 6 ++-- .../SendFileResponseExtensionsTests.cs | 4 +-- .../DefaultAuthenticationManagerTests.cs | 3 +- .../DefaultHttpContextTests.cs | 12 ++++---- .../DefaultHttpRequestTests.cs | 4 +-- .../FormFeatureTests.cs | 20 ++++++------- 11 files changed, 69 insertions(+), 34 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index c7a63c8356..4e89caed71 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -12,6 +12,8 @@ namespace Microsoft.AspNet.Http { public abstract class HttpContext : IDisposable { + public abstract IFeatureCollection Features { get; } + public abstract HttpRequest Request { get; } public abstract HttpResponse Response { get; } diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 3c5f183c53..b60f1acad9 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Http /// True if sendfile feature exists in the response. public static bool SupportsSendFile([NotNull] this HttpResponse response) { - return response.HttpContext.GetFeature() != null; + return response.HttpContext.Features.Get() != null; } /// @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.Http /// public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) { - var sendFile = response.HttpContext.GetFeature(); + var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { throw new NotSupportedException(Resources.Exception_SendFileNotSupported); diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs new file mode 100644 index 0000000000..86681fde3f --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features +{ + public static class FeatureCollectionExtensions + { + /// + /// Retrieves the requested feature from the collection. + /// + /// The feature key. + /// The collection. + /// The requested feature, or null if it is not present. + public static TFeature Get(this IFeatureCollection features) + { + return (TFeature)features[typeof(TFeature)]; + } + + /// + /// Sets the given feature in the collection. + /// + /// The feature key. + /// The collection. + /// The feature value. + public static void Set(this IFeatureCollection features, TFeature instance) + { + features[typeof(TFeature)] = instance; + } + } +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index c3caf8ec66..fd9ad19459 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -32,8 +32,8 @@ namespace Microsoft.AspNet.Http.Internal public DefaultHttpContext() : this(new FeatureCollection()) { - SetFeature(new HttpRequestFeature()); - SetFeature(new HttpResponseFeature()); + _features.Set(new HttpRequestFeature()); + _features.Set(new HttpResponseFeature()); } public DefaultHttpContext(IFeatureCollection features) @@ -76,6 +76,8 @@ namespace Microsoft.AspNet.Http.Internal get { return _session.Fetch(_features); } } + public override IFeatureCollection Features { get { return _features; } } + public override HttpRequest Request { get { return _request; } } public override HttpResponse Response { get { return _response; } } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 62ca09b84e..c6cdd63926 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -37,11 +37,11 @@ namespace Microsoft.AspNet.Owin public OwinEnvironment(HttpContext context) { - if (context.GetFeature() == null) + if (context.Features.Get() == null) { throw new ArgumentException("Missing required feature: " + nameof(IHttpRequestFeature) + ".", nameof(context)); } - if (context.GetFeature() == null) + if (context.Features.Get() == null) { throw new ArgumentException("Missing required feature: " + nameof(IHttpResponseFeature) + ".", nameof(context)); } @@ -100,7 +100,7 @@ namespace Microsoft.AspNet.Owin }; // owin.CallCancelled is required but the feature may not be present. - if (context.GetFeature() != null) + if (context.Features.Get() != null) { _entries[OwinConstants.CallCancelled] = new FeatureMap(feature => feature.RequestAborted); } @@ -334,7 +334,7 @@ namespace Microsoft.AspNet.Owin internal bool TryGet(HttpContext context, out object value) { - object featureInstance = context.GetFeature(FeatureInterface); + object featureInstance = context.Features[FeatureInterface]; if (featureInstance == null) { value = null; @@ -350,7 +350,7 @@ namespace Microsoft.AspNet.Owin internal void Set(HttpContext context, object value) { - var feature = context.GetFeature(FeatureInterface); + var feature = context.Features[FeatureInterface]; if (feature == null) { if (FeatureFactory == null) @@ -360,7 +360,7 @@ namespace Microsoft.AspNet.Owin else { feature = FeatureFactory(); - context.SetFeature(FeatureInterface, feature); + context.Features[FeatureInterface] = feature; } } Setter(feature, value); diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 770f02fb46..3f31ce5923 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Builder { // Use the existing OWIN env if there is one. IDictionary env; - var owinEnvFeature = httpContext.GetFeature(); + var owinEnvFeature = httpContext.Features.Get(); if (owinEnvFeature != null) { env = owinEnvFeature.Environment; @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Builder { var app = middleware(httpContext => { - return next(httpContext.GetFeature().Environment); + return next(httpContext.Features.Get().Environment); }); return env => @@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Builder if (env.TryGetValue(typeof(HttpContext).FullName, out obj)) { context = (HttpContext)obj; - context.SetFeature(new OwinEnvironmentFeature() { Environment = env }); + context.Features.Set(new OwinEnvironmentFeature() { Environment = env }); } else { diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index ef8aa04c56..cd16acb06d 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Http.Extensions.Tests var context = new DefaultHttpContext(); var response = context.Response; Assert.False(response.SupportsSendFile()); - context.SetFeature(new FakeSendFileFeature()); + context.Features.Set(new FakeSendFileFeature()); Assert.True(response.SupportsSendFile()); } @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http.Extensions.Tests var context = new DefaultHttpContext(); var response = context.Response; var fakeFeature = new FakeSendFileFeature(); - context.SetFeature(fakeFeature); + context.Features.Set(fakeFeature); await response.SendFileAsync("bob", 1, 3, CancellationToken.None); diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 3430382e8a..db7e1f7f36 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -4,6 +4,7 @@ using System; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; using Microsoft.AspNet.Http.Internal; @@ -50,7 +51,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal { var context = CreateContext(); var handler = new AuthHandler(); - context.SetFeature(new HttpAuthenticationFeature() { Handler = handler }); + context.Features.Set(new HttpAuthenticationFeature() { Handler = handler }); var user = new ClaimsPrincipal(); await context.Authentication.SignInAsync("ignored", user); Assert.True(handler.SignedIn); diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index f24035e672..b8c9691e35 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -35,7 +35,7 @@ namespace Microsoft.AspNet.Http.Internal session.Set("key2", null); var feature = new BlahSessionFeature(); feature.Session = session; - context.SetFeature(feature); + context.Features.Set(feature); // Act & Assert Assert.Same(session, context.Session); @@ -67,7 +67,7 @@ namespace Microsoft.AspNet.Http.Internal session.Set("key2", null); var feature = new BlahSessionFeature(); feature.Session = session; - context.SetFeature(feature); + context.Features.Set(feature); // Act context.Session = new TestSession(); @@ -109,9 +109,9 @@ namespace Microsoft.AspNet.Http.Internal public void GetItems_DefaultCollectionProvided() { var context = new DefaultHttpContext(new FeatureCollection()); - Assert.Null(context.GetFeature()); + Assert.Null(context.Features.Get()); var items = context.Items; - Assert.NotNull(context.GetFeature()); + Assert.NotNull(context.Features.Get()); Assert.NotNull(items); Assert.Same(items, context.Items); var item = new object(); @@ -123,10 +123,10 @@ namespace Microsoft.AspNet.Http.Internal public void SetItems_NewCollectionUsed() { var context = new DefaultHttpContext(new FeatureCollection()); - Assert.Null(context.GetFeature()); + Assert.Null(context.Features.Get()); var items = new Dictionary(); context.Items = items; - Assert.NotNull(context.GetFeature()); + Assert.NotNull(context.Features.Get()); Assert.Same(items, context.Items); var item = new object(); items["foo"] = item; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 16ac23f6ba..4a767821ff 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -136,7 +136,7 @@ namespace Microsoft.AspNet.Http.Internal public void Query_GetAndSet() { var request = new DefaultHttpContext().Request; - var requestFeature = request.HttpContext.GetFeature(); + var requestFeature = request.HttpContext.Features.Get(); Assert.Equal(string.Empty, requestFeature.QueryString); Assert.Equal(QueryString.Empty, request.QueryString); var query0 = request.Query; @@ -191,7 +191,7 @@ namespace Microsoft.AspNet.Http.Internal private static HttpRequest CreateRequest(IDictionary headers) { var context = new DefaultHttpContext(); - context.GetFeature().Headers = headers; + context.Features.Get().Headers = headers; return context.Request; } diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 61dfda82f5..6f3eb26111 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); // Act @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.Equal("2", formCollection["baz"]); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); @@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = context.Request.Form; @@ -140,7 +140,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formCollection, formFeature.Form); @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = context.Request.Form; @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formCollection, formFeature.Form); @@ -192,7 +192,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -200,7 +200,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); @@ -232,7 +232,7 @@ namespace Microsoft.AspNet.Http.Features.Internal context.Request.Body = new MemoryStream(formContent); // Not cached yet - var formFeature = context.GetFeature(); + var formFeature = context.Features.Get(); Assert.Null(formFeature); var formCollection = await context.Request.ReadFormAsync(); @@ -240,7 +240,7 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.NotNull(formCollection); // Cached - formFeature = context.GetFeature(); + formFeature = context.Features.Get(); Assert.NotNull(formFeature); Assert.NotNull(formFeature.Form); Assert.Same(formFeature.Form, formCollection); From adae42b66f82a782ee51a8b4c80403248ae871e4 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 31 Aug 2015 07:22:34 -0700 Subject: [PATCH 0716/1838] Use new HttpContext.Features API. --- .../Internal/HostingEngine.cs | 4 ++-- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 13 +++++-------- .../HostingEngineTests.cs | 6 +++--- .../HttpContextFactoryFacts.cs | 5 +++-- .../ClientHandlerTests.cs | 2 +- 5 files changed, 14 insertions(+), 16 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 90139ad93e..4af23ea665 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -162,14 +162,14 @@ namespace Microsoft.AspNet.Hosting.Internal private string GetRequestIdentifier(HttpContext httpContext) { - var requestIdentifierFeature = httpContext.GetFeature(); + var requestIdentifierFeature = httpContext.Features.Get(); if (requestIdentifierFeature == null) { requestIdentifierFeature = new HttpRequestIdentifierFeature() { TraceIdentifier = Guid.NewGuid().ToString() }; - httpContext.SetFeature(requestIdentifierFeature); + httpContext.Features.Set(requestIdentifierFeature); } return requestIdentifierFeature.TraceIdentifier; diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index df72462e24..23308d5161 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -70,7 +70,7 @@ namespace Microsoft.AspNet.TestHost { try { - await _next(state.FeatureCollection); + await _next(state.HttpContext.Features); state.CompleteResponse(); } catch (Exception ex) @@ -108,11 +108,10 @@ namespace Microsoft.AspNet.TestHost request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); } - FeatureCollection = new FeatureCollection(); - HttpContext = new DefaultHttpContext(FeatureCollection); - HttpContext.SetFeature(new RequestFeature()); + HttpContext = new DefaultHttpContext(); + HttpContext.Features.Set(new RequestFeature()); _responseFeature = new ResponseFeature(); - HttpContext.SetFeature(_responseFeature); + HttpContext.Features.Set(_responseFeature); var serverRequest = HttpContext.Request; serverRequest.Protocol = "HTTP/" + request.Version.ToString(2); serverRequest.Scheme = request.RequestUri.Scheme; @@ -154,8 +153,6 @@ namespace Microsoft.AspNet.TestHost public HttpContext HttpContext { get; private set; } - public IFeatureCollection FeatureCollection { get; private set; } - public Task ResponseTask { get { return _responseTcs.Task; } @@ -180,7 +177,7 @@ namespace Microsoft.AspNet.TestHost var response = new HttpResponseMessage(); response.StatusCode = (HttpStatusCode)HttpContext.Response.StatusCode; - response.ReasonPhrase = HttpContext.GetFeature().ReasonPhrase; + response.ReasonPhrase = HttpContext.Features.Get().ReasonPhrase; response.RequestMessage = _request; // response.Version = owinResponse.Protocol; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 1642ec7235..a33e7367aa 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -241,7 +241,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.GetFeature()); + Assert.IsType(httpContext.Features.Get()); } [Fact] @@ -264,7 +264,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.GetFeature()); + Assert.IsType(httpContext.Features.Get()); } [Fact] @@ -286,7 +286,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.Same(requestIdentifierFeature, httpContext.GetFeature()); + Assert.Same(requestIdentifierFeature, httpContext.Features.Get()); } [Fact] diff --git a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs index 2188bfbb7c..302da49712 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Hosting.Builder; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Owin; using Xunit; @@ -18,8 +19,8 @@ namespace Microsoft.AspNet.Hosting.Tests var context = contextFactory.CreateHttpContext(new OwinFeatureCollection(env)); // Setting a feature will throw if the above feature collection is not wrapped in a mutable feature collection. - context.SetFeature(new CustomFeature(100)); - Assert.Equal(100, context.GetFeature().Value); + context.Features.Set(new CustomFeature(100)); + Assert.Equal(100, context.Features.Get().Value); } private interface ICustomFeature diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index c52b38dc28..d4092e5ea2 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.TestHost Assert.NotNull(context.Response.Headers); Assert.NotNull(context.Response.Body); Assert.Equal(200, context.Response.StatusCode); - Assert.Null(context.GetFeature().ReasonPhrase); + Assert.Null(context.Features.Get().ReasonPhrase); Assert.Equal("example.com", context.Request.Host.Value); return Task.FromResult(0); From 25b5a42ca61477df3ea9bf44e639db54a17e31c1 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 31 Aug 2015 11:24:13 -0700 Subject: [PATCH 0717/1838] #329 Change IServerInformation to IFeatureCollection. --- .../IServerFactory.cs | 4 ++-- .../IServerInformation.cs | 10 ---------- .../Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 19 +++---------------- .../HostingEngineTests.cs | 4 ++-- 5 files changed, 8 insertions(+), 31 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs index 09c696b8c8..ff188af7d1 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Hosting.Server { public interface IServerFactory { - IServerInformation Initialize(IConfiguration configuration); - IDisposable Start(IServerInformation serverInformation, Func application); + IFeatureCollection Initialize(IConfiguration configuration); + IDisposable Start(IFeatureCollection serverFeatures, Func application); } } diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs deleted file mode 100644 index 2e3af1e7a2..0000000000 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerInformation.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Hosting.Server -{ - public interface IServerInformation - { - string Name { get; } - } -} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 4af23ea665..d072b36285 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Only one of these should be set internal IServerFactory ServerFactory { get; set; } internal string ServerFactoryLocation { get; set; } - private IServerInformation _serverInstance; + private IFeatureCollection _serverInstance; public HostingEngine( [NotNull] IServiceCollection appServices, diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 571ceb2662..80efe05f7e 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.TestHost { private const string DefaultEnvironmentName = "Development"; private const string ServerName = nameof(TestServer); - private static readonly ServerInformation ServerInfo = new ServerInformation(); + private static readonly IFeatureCollection ServerInfo = new FeatureCollection(); private Func _appDelegate; private IDisposable _appInstance; private bool _disposed = false; @@ -107,18 +107,13 @@ namespace Microsoft.AspNet.TestHost return new RequestBuilder(this, path); } - public IServerInformation Initialize(IConfiguration configuration) + public IFeatureCollection Initialize(IConfiguration configuration) { return ServerInfo; } - public IDisposable Start(IServerInformation serverInformation, Func application) + public IDisposable Start(IFeatureCollection serverInformation, Func application) { - if (!(serverInformation.GetType() == typeof(ServerInformation))) - { - throw new ArgumentException(string.Format("The server must be {0}", ServerName), "serverInformation"); - } - _appDelegate = application; return this; @@ -138,13 +133,5 @@ namespace Microsoft.AspNet.TestHost _disposed = true; _appInstance.Dispose(); } - - private class ServerInformation : IServerInformation - { - public string Name - { - get { return ServerName; } - } - } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index a33e7367aa..5b9c50ba9a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -368,12 +368,12 @@ namespace Microsoft.AspNet.Hosting config ?? new ConfigurationBuilder().Build()); } - public IServerInformation Initialize(IConfiguration configuration) + public IFeatureCollection Initialize(IConfiguration configuration) { return null; } - public IDisposable Start(IServerInformation serverInformation, Func application) + public IDisposable Start(IFeatureCollection serverFeatures, Func application) { var startInstance = new StartInstance(application); _startInstances.Add(startInstance); From e45e70da010de4e0140a6a9a7844a6f39c3a3513 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 31 Aug 2015 16:41:27 -0700 Subject: [PATCH 0718/1838] #367 Remove HttpContext.Get/SetFeature. Take 2. --- .../HttpContext.cs | 14 -------------- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 10 ---------- 2 files changed, 24 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 4e89caed71..8029c68641 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -39,19 +39,5 @@ namespace Microsoft.AspNet.Http public abstract void Abort(); public abstract void Dispose(); - - public abstract object GetFeature(Type type); - - public abstract void SetFeature(Type type, object instance); - - public virtual T GetFeature() - { - return (T)GetFeature(typeof(T)); - } - - public virtual void SetFeature(T instance) - { - SetFeature(typeof(T), instance); - } } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index fd9ad19459..db0a4d27ad 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -171,15 +171,5 @@ namespace Microsoft.AspNet.Http.Internal // REVIEW: is this necessary? is the environment "owned" by the context? _features.Dispose(); } - - public override object GetFeature(Type type) - { - return _features[type]; - } - - public override void SetFeature(Type type, object instance) - { - _features[type] = instance; - } } } \ No newline at end of file From c3290a029fc5e36eea1db445b7a081c3b61353a0 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 31 Aug 2015 11:25:59 -0700 Subject: [PATCH 0719/1838] Change IApplicationBuilder.Server to IFeatureCollection ServerFeatures. --- .../IApplicationBuilder.cs | 3 ++- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 7 ++++--- src/Microsoft.AspNet.Http/Constants.cs | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index 77fa4f20e1..e74bdec015 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Builder { @@ -10,7 +11,7 @@ namespace Microsoft.AspNet.Builder { IServiceProvider ApplicationServices { get; set; } - object Server { get; } + IFeatureCollection ServerFeatures { get; } IDictionary Properties { get; } diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index 80041077c3..49ed18f3f0 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Builder.Internal @@ -22,7 +23,7 @@ namespace Microsoft.AspNet.Builder.Internal public ApplicationBuilder(IServiceProvider serviceProvider, object server) : this(serviceProvider) { - SetProperty(Constants.BuilderProperties.ServerInformation, server); + SetProperty(Constants.BuilderProperties.ServerFeatures, server); } private ApplicationBuilder(ApplicationBuilder builder) @@ -42,11 +43,11 @@ namespace Microsoft.AspNet.Builder.Internal } } - public object Server + public IFeatureCollection ServerFeatures { get { - return GetProperty(Constants.BuilderProperties.ServerInformation); + return GetProperty(Constants.BuilderProperties.ServerFeatures); } } diff --git a/src/Microsoft.AspNet.Http/Constants.cs b/src/Microsoft.AspNet.Http/Constants.cs index d01466f549..9ae305ddf4 100644 --- a/src/Microsoft.AspNet.Http/Constants.cs +++ b/src/Microsoft.AspNet.Http/Constants.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Http.Internal internal static class BuilderProperties { - internal static string ServerInformation = "server.Information"; + internal static string ServerFeatures = "server.Features"; internal static string ApplicationServices = "application.Services"; } } From 2ee7384400ea434883754edcfc67a081190eae02 Mon Sep 17 00:00:00 2001 From: Master T Date: Sat, 22 Aug 2015 13:44:27 +0200 Subject: [PATCH 0720/1838] TestHost: Add WebSocket support. --- .../ClientHandler.cs | 30 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 6 + .../TestWebSocket.cs | 354 ++++++++++++++++++ .../WebSocketClient.cs | 179 +++++++++ .../TestClientTests.cs | 134 +++++++ 5 files changed, 688 insertions(+), 15 deletions(-) create mode 100644 src/Microsoft.AspNet.TestHost/TestWebSocket.cs create mode 100644 src/Microsoft.AspNet.TestHost/WebSocketClient.cs diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 23308d5161..970c232afe 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -67,22 +67,22 @@ namespace Microsoft.AspNet.TestHost // Async offload, don't let the test code block the caller. var offload = Task.Factory.StartNew(async () => + { + try { - try - { - await _next(state.HttpContext.Features); - state.CompleteResponse(); - } - catch (Exception ex) - { - state.Abort(ex); - } - finally - { - registration.Dispose(); - state.Dispose(); - } - }); + await _next(state.HttpContext.Features); + state.CompleteResponse(); + } + catch (Exception ex) + { + state.Abort(ex); + } + finally + { + registration.Dispose(); + state.Dispose(); + } + }); return await state.ResponseTask; } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 80efe05f7e..3a6522c476 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -97,6 +97,12 @@ namespace Microsoft.AspNet.TestHost return new HttpClient(CreateHandler()) { BaseAddress = BaseAddress }; } + public WebSocketClient CreateWebSocketClient() + { + var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); + return new WebSocketClient(Invoke, pathBase); + } + /// /// Begins constructing a request message for submission. /// diff --git a/src/Microsoft.AspNet.TestHost/TestWebSocket.cs b/src/Microsoft.AspNet.TestHost/TestWebSocket.cs new file mode 100644 index 0000000000..f028d8f053 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/TestWebSocket.cs @@ -0,0 +1,354 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.WebSockets; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.TestHost +{ + internal class TestWebSocket : WebSocket + { + private ReceiverSenderBuffer _receiveBuffer; + private ReceiverSenderBuffer _sendBuffer; + private readonly string _subProtocol; + private WebSocketState _state; + private WebSocketCloseStatus? _closeStatus; + private string _closeStatusDescription; + private Message _receiveMessage; + + public static Tuple CreatePair(string subProtocol) + { + var buffers = new[] { new ReceiverSenderBuffer(), new ReceiverSenderBuffer() }; + return Tuple.Create( + new TestWebSocket(subProtocol, buffers[0], buffers[1]), + new TestWebSocket(subProtocol, buffers[1], buffers[0])); + } + + public override WebSocketCloseStatus? CloseStatus + { + get { return _closeStatus; } + } + + public override string CloseStatusDescription + { + get { return _closeStatusDescription; } + } + + public override WebSocketState State + { + get { return _state; } + } + + public override string SubProtocol + { + get { return _subProtocol; } + } + + public async override Task CloseAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + + if (State == WebSocketState.Open || State == WebSocketState.CloseReceived) + { + // Send a close message. + await CloseOutputAsync(closeStatus, statusDescription, cancellationToken); + } + + if (State == WebSocketState.CloseSent) + { + // Do a receiving drain + var data = new byte[1024]; + WebSocketReceiveResult result; + do + { + result = await ReceiveAsync(new ArraySegment(data), cancellationToken); + } + while (result.MessageType != WebSocketMessageType.Close); + } + } + + public async override Task CloseOutputAsync(WebSocketCloseStatus closeStatus, string statusDescription, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + ThrowIfOutputClosed(); + + var message = new Message(closeStatus, statusDescription); + await _sendBuffer.SendAsync(message, cancellationToken); + + if (State == WebSocketState.Open) + { + _state = WebSocketState.CloseSent; + } + else if (State == WebSocketState.CloseReceived) + { + _state = WebSocketState.Closed; + Close(); + } + } + + public override void Abort() + { + if (_state >= WebSocketState.Closed) // or Aborted + { + return; + } + + _state = WebSocketState.Aborted; + Close(); + } + + public override void Dispose() + { + if (_state >= WebSocketState.Closed) // or Aborted + { + return; + } + + _state = WebSocketState.Closed; + Close(); + } + + public override async Task ReceiveAsync(ArraySegment buffer, CancellationToken cancellationToken) + { + ThrowIfDisposed(); + ThrowIfInputClosed(); + ValidateSegment(buffer); + // TODO: InvalidOperationException if any receives are currently in progress. + + Message receiveMessage = _receiveMessage; + _receiveMessage = null; + if (receiveMessage == null) + { + receiveMessage = await _receiveBuffer.ReceiveAsync(cancellationToken); + } + if (receiveMessage.MessageType == WebSocketMessageType.Close) + { + _closeStatus = receiveMessage.CloseStatus; + _closeStatusDescription = receiveMessage.CloseStatusDescription ?? string.Empty; + var result = new WebSocketReceiveResult(0, WebSocketMessageType.Close, true, _closeStatus, _closeStatusDescription); + if (_state == WebSocketState.Open) + { + _state = WebSocketState.CloseReceived; + } + else if (_state == WebSocketState.CloseSent) + { + _state = WebSocketState.Closed; + Close(); + } + return result; + } + else + { + int count = Math.Min(buffer.Count, receiveMessage.Buffer.Count); + bool endOfMessage = count == receiveMessage.Buffer.Count; + Array.Copy(receiveMessage.Buffer.Array, receiveMessage.Buffer.Offset, buffer.Array, buffer.Offset, count); + if (!endOfMessage) + { + receiveMessage.Buffer = new ArraySegment(receiveMessage.Buffer.Array, receiveMessage.Buffer.Offset + count, receiveMessage.Buffer.Count - count); + _receiveMessage = receiveMessage; + } + endOfMessage = endOfMessage && receiveMessage.EndOfMessage; + return new WebSocketReceiveResult(count, receiveMessage.MessageType, endOfMessage); + } + } + + public override Task SendAsync(ArraySegment buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken cancellationToken) + { + ValidateSegment(buffer); + if (messageType != WebSocketMessageType.Binary && messageType != WebSocketMessageType.Text) + { + // Block control frames + throw new ArgumentOutOfRangeException(nameof(messageType), messageType, string.Empty); + } + + var message = new Message(buffer, messageType, endOfMessage, cancellationToken); + return _sendBuffer.SendAsync(message, cancellationToken); + } + + private void Close() + { + _receiveBuffer.SetReceiverClosed(); + _sendBuffer.SetSenderClosed(); + } + + private void ThrowIfDisposed() + { + if (_state >= WebSocketState.Closed) // or Aborted + { + throw new ObjectDisposedException(typeof(TestWebSocket).FullName); + } + } + + private void ThrowIfOutputClosed() + { + if (State == WebSocketState.CloseSent) + { + throw new InvalidOperationException("Close already sent."); + } + } + + private void ThrowIfInputClosed() + { + if (State == WebSocketState.CloseReceived) + { + throw new InvalidOperationException("Close already received."); + } + } + + private void ValidateSegment(ArraySegment buffer) + { + if (buffer.Array == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + if (buffer.Offset < 0 || buffer.Offset > buffer.Array.Length) + { + throw new ArgumentOutOfRangeException(nameof(buffer.Offset), buffer.Offset, string.Empty); + } + if (buffer.Count < 0 || buffer.Count > buffer.Array.Length - buffer.Offset) + { + throw new ArgumentOutOfRangeException(nameof(buffer.Count), buffer.Count, string.Empty); + } + } + + private TestWebSocket(string subProtocol, ReceiverSenderBuffer readBuffer, ReceiverSenderBuffer writeBuffer) + { + _state = WebSocketState.Open; + _subProtocol = subProtocol; + _receiveBuffer = readBuffer; + _sendBuffer = writeBuffer; + } + + private class Message + { + public Message(ArraySegment buffer, WebSocketMessageType messageType, bool endOfMessage, CancellationToken token) + { + Buffer = buffer; + CloseStatus = null; + CloseStatusDescription = null; + EndOfMessage = endOfMessage; + MessageType = messageType; + } + + public Message(WebSocketCloseStatus? closeStatus, string closeStatusDescription) + { + Buffer = new ArraySegment(new byte[0]); + CloseStatus = closeStatus; + CloseStatusDescription = closeStatusDescription; + MessageType = WebSocketMessageType.Close; + EndOfMessage = true; + } + + public WebSocketCloseStatus? CloseStatus { get; set; } + public string CloseStatusDescription { get; set; } + public ArraySegment Buffer { get; set; } + public bool EndOfMessage { get; set; } + public WebSocketMessageType MessageType { get; set; } + } + + private class ReceiverSenderBuffer + { + private bool _receiverClosed; + private bool _senderClosed; + private bool _disposed; + private SemaphoreSlim _sem; + private Queue _messageQueue; + + public ReceiverSenderBuffer() + { + _sem = new SemaphoreSlim(0); + _messageQueue = new Queue(); + } + + public async virtual Task ReceiveAsync(CancellationToken cancellationToken) + { + if (_disposed) + { + ThrowNoReceive(); + } + await _sem.WaitAsync(cancellationToken); + lock (_messageQueue) + { + if (_messageQueue.Count == 0) + { + _disposed = true; + _sem.Dispose(); + ThrowNoReceive(); + } + return _messageQueue.Dequeue(); + } + } + + public virtual Task SendAsync(Message message, CancellationToken cancellationToken) + { + lock (_messageQueue) + { + if (_senderClosed) + { + throw new ObjectDisposedException(typeof(TestWebSocket).FullName); + } + if (_receiverClosed) + { + throw new IOException("The remote end closed the connection.", new ObjectDisposedException(typeof(TestWebSocket).FullName)); + } + + // we return immediately so we need to copy the buffer since the sender can re-use it + var array = new byte[message.Buffer.Count]; + Array.Copy(message.Buffer.Array, message.Buffer.Offset, array, 0, message.Buffer.Count); + message.Buffer = new ArraySegment(array); + + _messageQueue.Enqueue(message); + _sem.Release(); + + return Task.FromResult(true); + } + } + + public void SetReceiverClosed() + { + lock (_messageQueue) + { + if (!_receiverClosed) + { + _receiverClosed = true; + if (!_disposed) + { + _sem.Release(); + } + } + } + } + + public void SetSenderClosed() + { + lock (_messageQueue) + { + if (!_senderClosed) + { + _senderClosed = true; + if (!_disposed) + { + _sem.Release(); + } + } + } + } + + private void ThrowNoReceive() + { + if (_receiverClosed) + { + throw new ObjectDisposedException(typeof(TestWebSocket).FullName); + } + else // _senderClosed + { + throw new IOException("The remote end closed the connection.", new ObjectDisposedException(typeof(TestWebSocket).FullName)); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs new file mode 100644 index 0000000000..0c0f958fa0 --- /dev/null +++ b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs @@ -0,0 +1,179 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net.WebSockets; +using System.Security.Cryptography; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Internal; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.TestHost +{ + public class WebSocketClient + { + private readonly Func _next; + private readonly PathString _pathBase; + + internal WebSocketClient([NotNull] Func next, PathString pathBase) + { + _next = next; + + // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. + if (pathBase.HasValue && pathBase.Value.EndsWith("/")) + { + pathBase = new PathString(pathBase.Value.Substring(0, pathBase.Value.Length - 1)); + } + _pathBase = pathBase; + + SubProtocols = new List(); + } + + public IList SubProtocols + { + get; + private set; + } + + public Action ConfigureRequest + { + get; + set; + } + + public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken) + { + var state = new RequestState(uri, _pathBase, cancellationToken); + + if (ConfigureRequest != null) + { + ConfigureRequest(state.HttpContext.Request); + } + + // Async offload, don't let the test code block the caller. + var offload = Task.Factory.StartNew(async () => + { + try + { + await _next(state.FeatureCollection); + state.PipelineComplete(); + } + catch (Exception ex) + { + state.PipelineFailed(ex); + } + finally + { + state.Dispose(); + } + }); + + return await state.WebSocketTask; + } + + private class RequestState : IDisposable, IHttpWebSocketFeature + { + private TaskCompletionSource _clientWebSocketTcs; + private WebSocket _serverWebSocket; + + public IFeatureCollection FeatureCollection { get; private set; } + public HttpContext HttpContext { get; private set; } + public Task WebSocketTask { get { return _clientWebSocketTcs.Task; } } + + public RequestState(Uri uri, PathString pathBase, CancellationToken cancellationToken) + { + _clientWebSocketTcs = new TaskCompletionSource(); + + // HttpContext + FeatureCollection = new FeatureCollection(); + HttpContext = new DefaultHttpContext(FeatureCollection); + + // Request + HttpContext.SetFeature(new RequestFeature()); + var request = HttpContext.Request; + request.Protocol = "HTTP/1.1"; + var scheme = uri.Scheme; + scheme = (scheme == "ws") ? "http" : scheme; + scheme = (scheme == "wss") ? "https" : scheme; + request.Scheme = scheme; + request.Method = "GET"; + var fullPath = PathString.FromUriComponent(uri); + PathString remainder; + if (fullPath.StartsWithSegments(pathBase, out remainder)) + { + request.PathBase = pathBase; + request.Path = remainder; + } + else + { + request.PathBase = PathString.Empty; + request.Path = fullPath; + } + request.QueryString = QueryString.FromUriComponent(uri); + request.Headers.Add("Connection", new string[] { "Upgrade" }); + request.Headers.Add("Upgrade", new string[] { "websocket" }); + request.Headers.Add("Sec-WebSocket-Version", new string[] { "13" }); + request.Headers.Add("Sec-WebSocket-Key", new string[] { CreateRequestKey() }); + request.Body = Stream.Null; + + // Response + HttpContext.SetFeature(new ResponseFeature()); + var response = HttpContext.Response; + response.Body = Stream.Null; + response.StatusCode = 200; + + // WebSocket + HttpContext.SetFeature(this); + } + + public void PipelineComplete() + { + PipelineFailed(new InvalidOperationException("Incomplete handshake, status code: " + HttpContext.Response.StatusCode)); + } + + public void PipelineFailed(Exception ex) + { + _clientWebSocketTcs.TrySetException(new InvalidOperationException("The websocket was not accepted.", ex)); + } + + public void Dispose() + { + if (_serverWebSocket != null) + { + _serverWebSocket.Dispose(); + } + } + + private string CreateRequestKey() + { + byte[] data = new byte[16]; + var rng = RandomNumberGenerator.Create(); + rng.GetBytes(data); + return Convert.ToBase64String(data); + } + + bool IHttpWebSocketFeature.IsWebSocketRequest + { + get + { + return true; + } + } + + Task IHttpWebSocketFeature.AcceptAsync(WebSocketAcceptContext context) + { + HttpContext.Response.StatusCode = 101; // Switching Protocols + + var websockets = TestWebSocket.CreatePair(context.SubProtocol); + _clientWebSocketTcs.SetResult(websockets.Item1); + _serverWebSocket = websockets.Item2; + return Task.FromResult(_serverWebSocket); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index b77a681862..e207d499fc 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -2,7 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Linq; using System.Net.Http; +using System.Net.WebSockets; +using System.Text; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; @@ -111,5 +115,135 @@ namespace Microsoft.AspNet.TestHost // Assert Assert.Equal("Hello world POST Response", await response.Content.ReadAsStringAsync()); } + + [Fact] + public async Task WebSocketWorks() + { + // Arrange + RequestDelegate appDelegate = async ctx => + { + if (ctx.WebSockets.IsWebSocketRequest) + { + var websocket = await ctx.WebSockets.AcceptWebSocketAsync(); + var receiveArray = new byte[1024]; + while (true) + { + var receiveResult = await websocket.ReceiveAsync(new System.ArraySegment(receiveArray), CancellationToken.None); + if (receiveResult.MessageType == WebSocketMessageType.Close) + { + await websocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Normal Closure", CancellationToken.None); + break; + } + else + { + var sendBuffer = new System.ArraySegment(receiveArray, 0, receiveResult.Count); + await websocket.SendAsync(sendBuffer, receiveResult.MessageType, receiveResult.EndOfMessage, CancellationToken.None); + } + } + } + }; + var server = TestServer.Create(app => + { + app.Run(appDelegate); + }); + + // Act + var client = server.CreateWebSocketClient(); + var clientSocket = await client.ConnectAsync(new System.Uri("http://localhost"), CancellationToken.None); + var hello = Encoding.UTF8.GetBytes("hello"); + await clientSocket.SendAsync(new System.ArraySegment(hello), WebSocketMessageType.Text, true, CancellationToken.None); + var world = Encoding.UTF8.GetBytes("world!"); + await clientSocket.SendAsync(new System.ArraySegment(world), WebSocketMessageType.Binary, true, CancellationToken.None); + await clientSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, "Normal Closure", CancellationToken.None); + + // Assert + Assert.Equal(WebSocketState.CloseSent, clientSocket.State); + + var buffer = new byte[1024]; + var result = await clientSocket.ReceiveAsync(new System.ArraySegment(buffer), CancellationToken.None); + Assert.Equal(hello.Length, result.Count); + Assert.True(hello.SequenceEqual(buffer.Take(hello.Length))); + Assert.Equal(WebSocketMessageType.Text, result.MessageType); + + result = await clientSocket.ReceiveAsync(new System.ArraySegment(buffer), CancellationToken.None); + Assert.Equal(world.Length, result.Count); + Assert.True(world.SequenceEqual(buffer.Take(world.Length))); + Assert.Equal(WebSocketMessageType.Binary, result.MessageType); + + result = await clientSocket.ReceiveAsync(new System.ArraySegment(buffer), CancellationToken.None); + Assert.Equal(WebSocketMessageType.Close, result.MessageType); + Assert.Equal(WebSocketState.Closed, clientSocket.State); + + clientSocket.Dispose(); + } + + [Fact] + public async Task WebSocketDisposalThrowsOnPeer() + { + // Arrange + RequestDelegate appDelegate = async ctx => + { + if (ctx.WebSockets.IsWebSocketRequest) + { + var websocket = await ctx.WebSockets.AcceptWebSocketAsync(); + websocket.Dispose(); + } + }; + var server = TestServer.Create(app => + { + app.Run(appDelegate); + }); + + // Act + var client = server.CreateWebSocketClient(); + var clientSocket = await client.ConnectAsync(new System.Uri("http://localhost"), CancellationToken.None); + var buffer = new byte[1024]; + await Assert.ThrowsAsync(async () => await clientSocket.ReceiveAsync(new System.ArraySegment(buffer), CancellationToken.None)); + + clientSocket.Dispose(); + } + + [Fact] + public async Task WebSocketTinyReceiveGeneratesEndOfMessage() + { + // Arrange + RequestDelegate appDelegate = async ctx => + { + if (ctx.WebSockets.IsWebSocketRequest) + { + var websocket = await ctx.WebSockets.AcceptWebSocketAsync(); + var receiveArray = new byte[1024]; + while (true) + { + var receiveResult = await websocket.ReceiveAsync(new System.ArraySegment(receiveArray), CancellationToken.None); + var sendBuffer = new System.ArraySegment(receiveArray, 0, receiveResult.Count); + await websocket.SendAsync(sendBuffer, receiveResult.MessageType, receiveResult.EndOfMessage, CancellationToken.None); + } + } + }; + var server = TestServer.Create(app => + { + app.Run(appDelegate); + }); + + // Act + var client = server.CreateWebSocketClient(); + var clientSocket = await client.ConnectAsync(new System.Uri("http://localhost"), CancellationToken.None); + var hello = Encoding.UTF8.GetBytes("hello"); + await clientSocket.SendAsync(new System.ArraySegment(hello), WebSocketMessageType.Text, true, CancellationToken.None); + + // Assert + var buffer = new byte[1]; + for (int i = 0; i < hello.Length; i++) + { + bool last = i == (hello.Length - 1); + var result = await clientSocket.ReceiveAsync(new System.ArraySegment(buffer), CancellationToken.None); + Assert.Equal(buffer.Length, result.Count); + Assert.Equal(buffer[0], hello[i]); + Assert.Equal(last, result.EndOfMessage); + } + + clientSocket.Dispose(); + } } } From ee7825ecb803836e247567dfa8249abfb6f06e6b Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 1 Sep 2015 16:05:37 -0700 Subject: [PATCH 0721/1838] React to HttpContext.Features API changes. --- src/Microsoft.AspNet.TestHost/WebSocketClient.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs index 0c0f958fa0..1eaecbcb61 100644 --- a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs +++ b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.TestHost HttpContext = new DefaultHttpContext(FeatureCollection); // Request - HttpContext.SetFeature(new RequestFeature()); + HttpContext.Features.Set(new RequestFeature()); var request = HttpContext.Request; request.Protocol = "HTTP/1.1"; var scheme = uri.Scheme; @@ -122,13 +122,13 @@ namespace Microsoft.AspNet.TestHost request.Body = Stream.Null; // Response - HttpContext.SetFeature(new ResponseFeature()); + HttpContext.Features.Set(new ResponseFeature()); var response = HttpContext.Response; response.Body = Stream.Null; response.StatusCode = 200; // WebSocket - HttpContext.SetFeature(this); + HttpContext.Features.Set(this); } public void PipelineComplete() From 7dbe5dfbe408a4ca538f0c015b81f2fb03758ad4 Mon Sep 17 00:00:00 2001 From: Master T Date: Wed, 2 Sep 2015 20:36:55 +0200 Subject: [PATCH 0722/1838] Implement HttpContext.RequestAborted --- .../ClientHandler.cs | 75 +++++++++++-------- .../ResponseStream.cs | 44 ++++++----- .../TestClientTests.cs | 63 ++++++++++++++++ 3 files changed, 130 insertions(+), 52 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 970c232afe..12e03e8980 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -54,7 +54,7 @@ namespace Microsoft.AspNet.TestHost [NotNull] HttpRequestMessage request, CancellationToken cancellationToken) { - var state = new RequestState(request, _pathBase, cancellationToken); + var state = new RequestState(request, _pathBase); var requestContent = request.Content ?? new StreamContent(Stream.Null); var body = await requestContent.ReadAsStreamAsync(); if (body.CanSeek) @@ -63,41 +63,44 @@ namespace Microsoft.AspNet.TestHost body.Seek(0, SeekOrigin.Begin); } state.HttpContext.Request.Body = body; - var registration = cancellationToken.Register(state.Abort); + var registration = cancellationToken.Register(state.AbortRequest); // Async offload, don't let the test code block the caller. var offload = Task.Factory.StartNew(async () => - { - try { - await _next(state.HttpContext.Features); - state.CompleteResponse(); - } - catch (Exception ex) - { - state.Abort(ex); - } - finally - { - registration.Dispose(); - state.Dispose(); - } - }); + try + { + await _next(state.HttpContext.Features); + state.CompleteResponse(); + } + catch (Exception ex) + { + state.Abort(ex); + } + finally + { + registration.Dispose(); + } + }); return await state.ResponseTask; } - private class RequestState : IDisposable + private class RequestState { private readonly HttpRequestMessage _request; private TaskCompletionSource _responseTcs; private ResponseStream _responseStream; private ResponseFeature _responseFeature; + private CancellationTokenSource _requestAbortedSource; + private bool _pipelineFinished; - internal RequestState(HttpRequestMessage request, PathString pathBase, CancellationToken cancellationToken) + internal RequestState(HttpRequestMessage request, PathString pathBase) { _request = request; _responseTcs = new TaskCompletionSource(); + _requestAbortedSource = new CancellationTokenSource(); + _pipelineFinished = false; if (request.RequestUri.IsDefaultPort) { @@ -131,7 +134,6 @@ namespace Microsoft.AspNet.TestHost } serverRequest.QueryString = QueryString.FromUriComponent(request.RequestUri); - // TODO: serverRequest.CallCancelled = cancellationToken; foreach (var header in request.Headers) { @@ -146,9 +148,10 @@ namespace Microsoft.AspNet.TestHost } } - _responseStream = new ResponseStream(CompleteResponse); + _responseStream = new ResponseStream(ReturnResponseMessage, AbortRequest); HttpContext.Response.Body = _responseStream; HttpContext.Response.StatusCode = 200; + HttpContext.RequestAborted = _requestAbortedSource.Token; } public HttpContext HttpContext { get; private set; } @@ -158,7 +161,23 @@ namespace Microsoft.AspNet.TestHost get { return _responseTcs.Task; } } + internal void AbortRequest() + { + if (!_pipelineFinished) + { + _requestAbortedSource.Cancel(); + } + _responseStream.Complete(); + } + internal void CompleteResponse() + { + _pipelineFinished = true; + ReturnResponseMessage(); + _responseStream.Complete(); + } + + internal void ReturnResponseMessage() { if (!_responseTcs.Task.IsCompleted) { @@ -171,7 +190,7 @@ namespace Microsoft.AspNet.TestHost [SuppressMessage("Microsoft.Reliability", "CA2000:DisposeObjectsBeforeLosingScope", Justification = "HttpResposneMessage must be returned to the caller.")] - internal HttpResponseMessage GenerateResponse() + private HttpResponseMessage GenerateResponse() { _responseFeature.FireOnSendingHeaders(); @@ -194,22 +213,12 @@ namespace Microsoft.AspNet.TestHost return response; } - internal void Abort() - { - Abort(new OperationCanceledException()); - } - internal void Abort(Exception exception) { + _pipelineFinished = true; _responseStream.Abort(exception); _responseTcs.TrySetException(exception); } - - public void Dispose() - { - _responseStream.Dispose(); - // Do not dispose the request, that will be disposed by the caller. - } } } } diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index 42a8a419c5..7f75c5983f 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.TestHost // when requested by the client. internal class ResponseStream : Stream { - private bool _disposed; + private bool _complete; private bool _aborted; private Exception _abortException; private ConcurrentQueue _bufferedData; @@ -28,11 +28,13 @@ namespace Microsoft.AspNet.TestHost private Action _onFirstWrite; private bool _firstWrite; + private Action _abortRequest; - internal ResponseStream([NotNull] Action onFirstWrite) + internal ResponseStream([NotNull] Action onFirstWrite, [NotNull] Action abortRequest) { _onFirstWrite = onFirstWrite; _firstWrite = true; + _abortRequest = abortRequest; _readLock = new SemaphoreSlim(1, 1); _writeLock = new SemaphoreSlim(1, 1); @@ -83,7 +85,7 @@ namespace Microsoft.AspNet.TestHost public override void Flush() { - CheckDisposed(); + CheckNotComplete(); _writeLock.Wait(); try @@ -130,7 +132,7 @@ namespace Microsoft.AspNet.TestHost byte[] topBuffer = null; while (!_bufferedData.TryDequeue(out topBuffer)) { - if (_disposed) + if (_complete) { CheckAborted(); // Graceful close @@ -189,7 +191,7 @@ namespace Microsoft.AspNet.TestHost byte[] topBuffer = null; while (!_bufferedData.TryDequeue(out topBuffer)) { - if (_disposed) + if (_complete) { CheckAborted(); // Graceful close @@ -233,7 +235,7 @@ namespace Microsoft.AspNet.TestHost public override void Write(byte[] buffer, int offset, int count) { VerifyBuffer(buffer, offset, count, allowEmpty: true); - CheckDisposed(); + CheckNotComplete(); _writeLock.Wait(); try @@ -317,7 +319,7 @@ namespace Microsoft.AspNet.TestHost { _readWaitingForData = new TaskCompletionSource(); - if (!_bufferedData.IsEmpty || _disposed) + if (!_bufferedData.IsEmpty || _complete) { // Race, data could have arrived before we created the TCS. _readWaitingForData.TrySetResult(null); @@ -337,7 +339,18 @@ namespace Microsoft.AspNet.TestHost Contract.Requires(innerException != null); _aborted = true; _abortException = innerException; - Dispose(); + Complete(); + } + + internal void Complete() + { + // Prevent race with WaitForDataAsync + lock (_signalReadLock) + { + // Throw for further writes, but not reads. Allow reads to drain the buffered data and then return 0 for further reads. + _complete = true; + _readWaitingForData.TrySetResult(null); + } } private void CheckAborted() @@ -354,23 +367,16 @@ namespace Microsoft.AspNet.TestHost { if (disposing) { - // Prevent race with WaitForDataAsync - lock (_signalReadLock) - { - // Throw for further writes, but not reads. Allow reads to drain the buffered data and then return 0 for further reads. - _disposed = true; - _readWaitingForData.TrySetResult(null); - } + _abortRequest(); } - base.Dispose(disposing); } - private void CheckDisposed() + private void CheckNotComplete() { - if (_disposed) + if (_complete) { - throw new ObjectDisposedException(GetType().FullName); + throw new IOException("The request was aborted or the pipeline has finished"); } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index e207d499fc..ae1dfd19ca 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Linq; using System.Net.Http; @@ -245,5 +246,67 @@ namespace Microsoft.AspNet.TestHost clientSocket.Dispose(); } + + [Fact] + public async Task ClientDisposalAbortsRequest() + { + // Arrange + TaskCompletionSource tcs = new TaskCompletionSource(); + RequestDelegate appDelegate = async ctx => + { + // Write Headers + await ctx.Response.Body.FlushAsync(); + + var sem = new SemaphoreSlim(0); + try + { + await sem.WaitAsync(ctx.RequestAborted); + } + catch (Exception e) + { + tcs.SetException(e); + } + }; + + // Act + var server = TestServer.Create(app => app.Run(appDelegate)); + var client = server.CreateClient(); + var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); + var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); + // Abort Request + response.Dispose(); + + // Assert + var exception = await Assert.ThrowsAnyAsync(async () => await tcs.Task); + } + + [Fact] + public async Task ClientCancellationAbortsRequest() + { + // Arrange + TaskCompletionSource tcs = new TaskCompletionSource(); + RequestDelegate appDelegate = async ctx => + { + var sem = new SemaphoreSlim(0); + try + { + await sem.WaitAsync(ctx.RequestAborted); + } + catch (Exception e) + { + tcs.SetException(e); + } + }; + + // Act + var server = TestServer.Create(app => app.Run(appDelegate)); + var client = server.CreateClient(); + var cts = new CancellationTokenSource(); + cts.CancelAfter(500); + var response = await client.GetAsync("http://localhost:12345", cts.Token); + + // Assert + var exception = await Assert.ThrowsAnyAsync(async () => await tcs.Task); + } } } From f3e828892df383053ccbe68217c6e96f9f0ac7ca Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Tue, 11 Aug 2015 15:56:33 -0700 Subject: [PATCH 0723/1838] React to options --- .../EncoderServiceCollectionExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index c7d1c32b0d..48e0e94c98 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -44,7 +44,7 @@ namespace Microsoft.Framework.DependencyInjection return serviceProvider => { var codePointFilter = serviceProvider?.GetService>()? - .Options? + .Value? .CodePointFilter; return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); }; From 74fe851f548289fc25cb244fb57016a83b09e8c8 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 2 Sep 2015 14:02:01 -0700 Subject: [PATCH 0724/1838] React to options --- test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 9cc385ae40..a5afed8b7b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Hosting.Tests app.ApplicationServices = startup.ConfigureServicesDelegate(new ServiceCollection()); startup.ConfigureDelegate(app); - var options = app.ApplicationServices.GetRequiredService>().Options; + var options = app.ApplicationServices.GetRequiredService>().Value; Assert.NotNull(options); Assert.True(options.Configured); Assert.Equal(environment, options.Environment); From 5fb45b3cfb9a4eafa0933941a62e6965facbe705 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Wed, 2 Sep 2015 15:34:19 -0700 Subject: [PATCH 0725/1838] Update project.json to have warningsAsErrors accept a bool. --- src/Microsoft.AspNet.Hosting/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index f407a3ae74..fe3ed63b3c 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -5,7 +5,7 @@ "type": "git", "url": "git://github.com/aspnet/hosting" }, - "compilationOptions": { "warningsAsErrors": "true" }, + "compilationOptions": { "warningsAsErrors": true }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", From 43d0b0f65bb5abe453d5d54fec6d67c1c93f3fa8 Mon Sep 17 00:00:00 2001 From: Levi B Date: Sat, 5 Sep 2015 16:22:14 -0700 Subject: [PATCH 0726/1838] Update WebEncoders from Unicode 7.0 to Unicode 8.0 Add "how to update" file detailing update steps --- .../UnicodeHelpers.cs | 8 +- .../UnicodeRanges.cs | 2 +- .../UnicodeRanges.generated.cs | 11 +- ...aracters.bin => unicode-defined-chars.bin} | Bin 8192 -> 8192 bytes .../UnicodeHelpersTests.cs | 4 +- .../UnicodeRangesTests.cs | 1 + unicode/Blocks.txt | 25 +- unicode/UnicodeData.txt | 2161 ++++++++++++++++- unicode/how-to-update.txt | 94 + unicode/unicode-copyright.txt | 6 +- 10 files changed, 2189 insertions(+), 123 deletions(-) rename src/Microsoft.Framework.WebEncoders.Core/compiler/resources/{unicode-7.0.0-defined-characters.bin => unicode-defined-chars.bin} (91%) create mode 100644 unicode/how-to-update.txt diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs index 61367e2d03..fac3a2e4e1 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs @@ -28,14 +28,14 @@ namespace Microsoft.Framework.WebEncoders /// /// Helper method which creates a bitmap of all characters which are - /// defined per version 7.0.0 of the Unicode specification. + /// defined per version 8.0 of the Unicode specification. /// [MethodImpl(MethodImplOptions.NoInlining)] private static uint[] CreateDefinedCharacterBitmap() { // The stream should be exactly 8KB in size. var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly; - var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-7.0.0-defined-characters.bin"; + var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-defined-chars.bin"; var stream = assembly.GetManifestResourceStream(resourceName); if (stream.Length != 8 * 1024) @@ -72,7 +72,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Returns a bitmap of all characters which are defined per version 7.0.0 + /// Returns a bitmap of all characters which are defined per version 8.0 /// of the Unicode specification. /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -204,7 +204,7 @@ namespace Microsoft.Framework.WebEncoders } /// - /// Returns a value stating whether a character is defined per version 7.0.0 + /// Returns a value stating whether a character is defined per version 8.0 /// of the Unicode specification. Certain classes of characters (control chars, /// private use, surrogates, some whitespace) are considered "undefined" for /// our purposes. diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs index 60ed2c5311..f78837bc6e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs @@ -10,7 +10,7 @@ namespace Microsoft.Framework.WebEncoders { /// /// Contains predefined instances which correspond to blocks - /// from the Unicode 7.0 specification. + /// from the Unicode 8.0 specification. /// public static partial class UnicodeRanges { diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs index 6a3c5ebabf..64d522f248 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs @@ -1277,6 +1277,15 @@ namespace Microsoft.Framework.WebEncoders public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); private static UnicodeRange _latinExtendedE; + /// + /// A corresponding to the 'Cherokee Supplement' Unicode block (U+AB70..U+ABBF). + /// + /// + /// See http://www.unicode.org/charts/PDF/UAB70.pdf for the full set of characters in this block. + /// + public static UnicodeRange CherokeeSupplement => Volatile.Read(ref _cherokeeSupplement) ?? CreateRange(ref _cherokeeSupplement, first: '\uAB70', last: '\uABBF'); + private static UnicodeRange _cherokeeSupplement; + /// /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). /// @@ -1303,7 +1312,7 @@ namespace Microsoft.Framework.WebEncoders /// public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); private static UnicodeRange _hangulJamoExtendedB; - + /// /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). /// diff --git a/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin b/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin similarity index 91% rename from src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-7.0.0-defined-characters.bin rename to src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin index 06530d73cf6848c91b0f41b326dccf833192412a..48fa163f088cc88591c84b3e962c82fbfac136db 100644 GIT binary patch delta 157 zcmZp0XmHpd#>g(u00KWIDhf|FVAN-1nw-F>&B#8vhf$ufVe%TrOHB6mlP9tSY`(zc z&L~~a!0;ak7{Mfn1qb{S6@4eyv;1THu(^)4nveazJ=k2J)`^oRia1Tw;bCN$s3^*0 q|9|p#5e-KB$qJ%AlecjS0$Bzu{+lmwsT$IYCTf` delta 194 zcmZp0XmHpd#>mdj00JK-Dhf|FVAN-1n4G|<&B#2thfyBLUc-2aNuFWyM3#Wf7ns}` zrR^CQ{sRFcm;|xlfO(>#@8o)xe~b*9>sYJ#*yX{-g0xPYJW<3+Wj|cy|Noe}>w&WN r%#**1XfX0mRuJ_OF@R_XlVF|p|Cu)*_3#0wyWAau2)=OHv diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs index 7504d52125..cf170bf3f8 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -193,7 +193,7 @@ namespace Microsoft.Framework.WebEncoders } } - // Handle known spans from Unicode 7.0.0's UnicodeData.txt + // Handle known spans from Unicode 8.0's UnicodeData.txt // CJK Ideograph Extension A for (int i = '\u3400'; i <= '\u4DB5'; i++) @@ -201,7 +201,7 @@ namespace Microsoft.Framework.WebEncoders retVal[i] = true; } // CJK Ideograph - for (int i = '\u4E00'; i <= '\u9FCC'; i++) + for (int i = '\u4E00'; i <= '\u9FD5'; i++) { retVal[i] = true; } diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs index c56b57feb8..208eb34c6b 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs @@ -172,6 +172,7 @@ namespace Microsoft.Framework.WebEncoders [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))] [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))] [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))] + [InlineData('\uAB70', '\uABBF', nameof(UnicodeRanges.CherokeeSupplement))] [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))] [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))] [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))] diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt index 3653af7a47..0a4a580763 100644 --- a/unicode/Blocks.txt +++ b/unicode/Blocks.txt @@ -1,14 +1,11 @@ -# Blocks-7.0.0.txt -# Date: 2014-04-03, 23:23:00 GMT [RP, KW] +# Blocks-8.0.0.txt +# Date: 2014-11-10, 23:04:00 GMT [KW] # # Unicode Character Database # Copyright (c) 1991-2014 Unicode, Inc. # For terms of use, see http://www.unicode.org/terms_of_use.html # For documentation, see http://www.unicode.org/reports/tr44/ # -# Note: The casing of block names is not normative. -# For example, "Basic Latin" and "BASIC LATIN" are equivalent. -# # Format: # Start Code..End Code; Block Name @@ -20,6 +17,14 @@ # For more information on the comparison of property values, # see UAX #44: http://www.unicode.org/reports/tr44/ # +# All block ranges start with a value where (cp MOD 16) = 0, +# and end with a value where (cp MOD 16) = 15. In other words, +# the last hexadecimal digit of the start of range is ...0 +# and the last hexadecimal digit of the end of range is ...F. +# This constraint on block ranges guarantees that allocations +# are done in terms of whole columns, and that code chart display +# never involves splitting columns in the charts. +# # All code points not explicitly listed for Block # have the value No_Block. @@ -168,6 +173,7 @@ AA80..AADF; Tai Viet AAE0..AAFF; Meetei Mayek Extensions AB00..AB2F; Ethiopic Extended-A AB30..AB6F; Latin Extended-E +AB70..ABBF; Cherokee Supplement ABC0..ABFF; Meetei Mayek AC00..D7AF; Hangul Syllables D7B0..D7FF; Hangul Jamo Extended-B @@ -210,6 +216,7 @@ FFF0..FFFF; Specials 10840..1085F; Imperial Aramaic 10860..1087F; Palmyrene 10880..108AF; Nabataean +108E0..108FF; Hatran 10900..1091F; Phoenician 10920..1093F; Lydian 10980..1099F; Meroitic Hieroglyphs @@ -223,6 +230,7 @@ FFF0..FFFF; Specials 10B60..10B7F; Inscriptional Pahlavi 10B80..10BAF; Psalter Pahlavi 10C00..10C4F; Old Turkic +10C80..10CFF; Old Hungarian 10E60..10E7F; Rumi Numeral Symbols 11000..1107F; Brahmi 11080..110CF; Kaithi @@ -232,17 +240,21 @@ FFF0..FFFF; Specials 11180..111DF; Sharada 111E0..111FF; Sinhala Archaic Numbers 11200..1124F; Khojki +11280..112AF; Multani 112B0..112FF; Khudawadi 11300..1137F; Grantha 11480..114DF; Tirhuta 11580..115FF; Siddham 11600..1165F; Modi 11680..116CF; Takri +11700..1173F; Ahom 118A0..118FF; Warang Citi 11AC0..11AFF; Pau Cin Hau 12000..123FF; Cuneiform 12400..1247F; Cuneiform Numbers and Punctuation +12480..1254F; Early Dynastic Cuneiform 13000..1342F; Egyptian Hieroglyphs +14400..1467F; Anatolian Hieroglyphs 16800..16A3F; Bamum Supplement 16A40..16A6F; Mro 16AD0..16AFF; Bassa Vah @@ -257,6 +269,7 @@ FFF0..FFFF; Specials 1D300..1D35F; Tai Xuan Jing Symbols 1D360..1D37F; Counting Rod Numerals 1D400..1D7FF; Mathematical Alphanumeric Symbols +1D800..1DAAF; Sutton SignWriting 1E800..1E8DF; Mende Kikakui 1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols 1F000..1F02F; Mahjong Tiles @@ -271,9 +284,11 @@ FFF0..FFFF; Specials 1F700..1F77F; Alchemical Symbols 1F780..1F7FF; Geometric Shapes Extended 1F800..1F8FF; Supplemental Arrows-C +1F900..1F9FF; Supplemental Symbols and Pictographs 20000..2A6DF; CJK Unified Ideographs Extension B 2A700..2B73F; CJK Unified Ideographs Extension C 2B740..2B81F; CJK Unified Ideographs Extension D +2B820..2CEAF; CJK Unified Ideographs Extension E 2F800..2FA1F; CJK Compatibility Ideographs Supplement E0000..E007F; Tags E0100..E01EF; Variation Selectors Supplement diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt index 31c8a7eaa0..aa0e914f84 100644 --- a/unicode/UnicodeData.txt +++ b/unicode/UnicodeData.txt @@ -667,7 +667,7 @@ 029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; 029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; 029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; -029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;;; +029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; 02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; @@ -2091,6 +2091,9 @@ 08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; 08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; 08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; +08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; +08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; +08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; 08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; 08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; 08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; @@ -2503,6 +2506,7 @@ 0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; +0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; 0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -2738,6 +2742,7 @@ 0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; 0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; 0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; +0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; 0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; @@ -2919,6 +2924,7 @@ 0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; 0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; 0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; +0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; 0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; 0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; 0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; @@ -4289,91 +4295,98 @@ 1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; 1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; 1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; -13A0;CHEROKEE LETTER A;Lo;0;L;;;;;N;;;;; -13A1;CHEROKEE LETTER E;Lo;0;L;;;;;N;;;;; -13A2;CHEROKEE LETTER I;Lo;0;L;;;;;N;;;;; -13A3;CHEROKEE LETTER O;Lo;0;L;;;;;N;;;;; -13A4;CHEROKEE LETTER U;Lo;0;L;;;;;N;;;;; -13A5;CHEROKEE LETTER V;Lo;0;L;;;;;N;;;;; -13A6;CHEROKEE LETTER GA;Lo;0;L;;;;;N;;;;; -13A7;CHEROKEE LETTER KA;Lo;0;L;;;;;N;;;;; -13A8;CHEROKEE LETTER GE;Lo;0;L;;;;;N;;;;; -13A9;CHEROKEE LETTER GI;Lo;0;L;;;;;N;;;;; -13AA;CHEROKEE LETTER GO;Lo;0;L;;;;;N;;;;; -13AB;CHEROKEE LETTER GU;Lo;0;L;;;;;N;;;;; -13AC;CHEROKEE LETTER GV;Lo;0;L;;;;;N;;;;; -13AD;CHEROKEE LETTER HA;Lo;0;L;;;;;N;;;;; -13AE;CHEROKEE LETTER HE;Lo;0;L;;;;;N;;;;; -13AF;CHEROKEE LETTER HI;Lo;0;L;;;;;N;;;;; -13B0;CHEROKEE LETTER HO;Lo;0;L;;;;;N;;;;; -13B1;CHEROKEE LETTER HU;Lo;0;L;;;;;N;;;;; -13B2;CHEROKEE LETTER HV;Lo;0;L;;;;;N;;;;; -13B3;CHEROKEE LETTER LA;Lo;0;L;;;;;N;;;;; -13B4;CHEROKEE LETTER LE;Lo;0;L;;;;;N;;;;; -13B5;CHEROKEE LETTER LI;Lo;0;L;;;;;N;;;;; -13B6;CHEROKEE LETTER LO;Lo;0;L;;;;;N;;;;; -13B7;CHEROKEE LETTER LU;Lo;0;L;;;;;N;;;;; -13B8;CHEROKEE LETTER LV;Lo;0;L;;;;;N;;;;; -13B9;CHEROKEE LETTER MA;Lo;0;L;;;;;N;;;;; -13BA;CHEROKEE LETTER ME;Lo;0;L;;;;;N;;;;; -13BB;CHEROKEE LETTER MI;Lo;0;L;;;;;N;;;;; -13BC;CHEROKEE LETTER MO;Lo;0;L;;;;;N;;;;; -13BD;CHEROKEE LETTER MU;Lo;0;L;;;;;N;;;;; -13BE;CHEROKEE LETTER NA;Lo;0;L;;;;;N;;;;; -13BF;CHEROKEE LETTER HNA;Lo;0;L;;;;;N;;;;; -13C0;CHEROKEE LETTER NAH;Lo;0;L;;;;;N;;;;; -13C1;CHEROKEE LETTER NE;Lo;0;L;;;;;N;;;;; -13C2;CHEROKEE LETTER NI;Lo;0;L;;;;;N;;;;; -13C3;CHEROKEE LETTER NO;Lo;0;L;;;;;N;;;;; -13C4;CHEROKEE LETTER NU;Lo;0;L;;;;;N;;;;; -13C5;CHEROKEE LETTER NV;Lo;0;L;;;;;N;;;;; -13C6;CHEROKEE LETTER QUA;Lo;0;L;;;;;N;;;;; -13C7;CHEROKEE LETTER QUE;Lo;0;L;;;;;N;;;;; -13C8;CHEROKEE LETTER QUI;Lo;0;L;;;;;N;;;;; -13C9;CHEROKEE LETTER QUO;Lo;0;L;;;;;N;;;;; -13CA;CHEROKEE LETTER QUU;Lo;0;L;;;;;N;;;;; -13CB;CHEROKEE LETTER QUV;Lo;0;L;;;;;N;;;;; -13CC;CHEROKEE LETTER SA;Lo;0;L;;;;;N;;;;; -13CD;CHEROKEE LETTER S;Lo;0;L;;;;;N;;;;; -13CE;CHEROKEE LETTER SE;Lo;0;L;;;;;N;;;;; -13CF;CHEROKEE LETTER SI;Lo;0;L;;;;;N;;;;; -13D0;CHEROKEE LETTER SO;Lo;0;L;;;;;N;;;;; -13D1;CHEROKEE LETTER SU;Lo;0;L;;;;;N;;;;; -13D2;CHEROKEE LETTER SV;Lo;0;L;;;;;N;;;;; -13D3;CHEROKEE LETTER DA;Lo;0;L;;;;;N;;;;; -13D4;CHEROKEE LETTER TA;Lo;0;L;;;;;N;;;;; -13D5;CHEROKEE LETTER DE;Lo;0;L;;;;;N;;;;; -13D6;CHEROKEE LETTER TE;Lo;0;L;;;;;N;;;;; -13D7;CHEROKEE LETTER DI;Lo;0;L;;;;;N;;;;; -13D8;CHEROKEE LETTER TI;Lo;0;L;;;;;N;;;;; -13D9;CHEROKEE LETTER DO;Lo;0;L;;;;;N;;;;; -13DA;CHEROKEE LETTER DU;Lo;0;L;;;;;N;;;;; -13DB;CHEROKEE LETTER DV;Lo;0;L;;;;;N;;;;; -13DC;CHEROKEE LETTER DLA;Lo;0;L;;;;;N;;;;; -13DD;CHEROKEE LETTER TLA;Lo;0;L;;;;;N;;;;; -13DE;CHEROKEE LETTER TLE;Lo;0;L;;;;;N;;;;; -13DF;CHEROKEE LETTER TLI;Lo;0;L;;;;;N;;;;; -13E0;CHEROKEE LETTER TLO;Lo;0;L;;;;;N;;;;; -13E1;CHEROKEE LETTER TLU;Lo;0;L;;;;;N;;;;; -13E2;CHEROKEE LETTER TLV;Lo;0;L;;;;;N;;;;; -13E3;CHEROKEE LETTER TSA;Lo;0;L;;;;;N;;;;; -13E4;CHEROKEE LETTER TSE;Lo;0;L;;;;;N;;;;; -13E5;CHEROKEE LETTER TSI;Lo;0;L;;;;;N;;;;; -13E6;CHEROKEE LETTER TSO;Lo;0;L;;;;;N;;;;; -13E7;CHEROKEE LETTER TSU;Lo;0;L;;;;;N;;;;; -13E8;CHEROKEE LETTER TSV;Lo;0;L;;;;;N;;;;; -13E9;CHEROKEE LETTER WA;Lo;0;L;;;;;N;;;;; -13EA;CHEROKEE LETTER WE;Lo;0;L;;;;;N;;;;; -13EB;CHEROKEE LETTER WI;Lo;0;L;;;;;N;;;;; -13EC;CHEROKEE LETTER WO;Lo;0;L;;;;;N;;;;; -13ED;CHEROKEE LETTER WU;Lo;0;L;;;;;N;;;;; -13EE;CHEROKEE LETTER WV;Lo;0;L;;;;;N;;;;; -13EF;CHEROKEE LETTER YA;Lo;0;L;;;;;N;;;;; -13F0;CHEROKEE LETTER YE;Lo;0;L;;;;;N;;;;; -13F1;CHEROKEE LETTER YI;Lo;0;L;;;;;N;;;;; -13F2;CHEROKEE LETTER YO;Lo;0;L;;;;;N;;;;; -13F3;CHEROKEE LETTER YU;Lo;0;L;;;;;N;;;;; -13F4;CHEROKEE LETTER YV;Lo;0;L;;;;;N;;;;; +13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; +13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; +13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; +13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; +13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; +13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; +13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; +13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; +13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; +13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; +13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; +13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; +13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; +13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; +13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; +13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; +13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; +13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; +13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; +13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; +13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; +13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; +13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; +13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; +13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; +13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; +13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; +13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; +13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; +13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; +13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; +13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; +13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; +13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; +13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; +13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; +13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; +13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; +13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; +13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; +13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; +13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; +13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; +13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; +13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; +13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; +13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; +13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; +13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; +13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; +13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; +13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; +13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; +13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; +13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; +13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; +13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; +13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; +13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; +13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; +13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; +13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; +13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; +13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; +13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; +13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; +13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; +13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; +13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; +13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; +13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; +13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; +13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; +13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; +13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; +13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; +13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; +13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; +13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; +13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; +13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; +13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; +13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; +13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; +13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; +13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; +13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 +13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 +13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 +13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 +13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 +13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; 1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; 1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; @@ -5700,23 +5713,23 @@ 19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; 19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; 19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; -19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;; -19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;; -19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;; -19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;; -19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;; -19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;; -19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; -19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;; -19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;; -19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;; +19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; +19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; +19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; +19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; +19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; +19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; +19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; +19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; +19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; +19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; +19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; +19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; +19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; +19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; +19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; +19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; +19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; 19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; 19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; 19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; @@ -5724,8 +5737,8 @@ 19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; 19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; 19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; -19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;; -19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;; +19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; +19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; 19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; 19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -7277,6 +7290,7 @@ 20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; 20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; 20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; +20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; 20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; 20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; 20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; @@ -7448,6 +7462,8 @@ 2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; 2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; 2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; +218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; +218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; 2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; 2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; 2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; @@ -10015,6 +10031,10 @@ 2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; 2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; 2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; +2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; +2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; 2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; 2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; 2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; @@ -11942,7 +11962,7 @@ 4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; 4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; 4E00;;Lo;0;L;;;;;N;;;;; -9FCC;;Lo;0;L;;;;;N;;;;; +9FD5;;Lo;0;L;;;;;N;;;;; A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; @@ -13605,6 +13625,7 @@ A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; +A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; @@ -13837,6 +13858,7 @@ A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; +A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; @@ -13869,6 +13891,12 @@ A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; +A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; +A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; +A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; +A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 +A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; +A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; @@ -14097,6 +14125,8 @@ A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; +A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; @@ -14610,7 +14640,7 @@ AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; -AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;;; +AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; @@ -14623,8 +14653,92 @@ AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; +AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; +AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; +AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; +AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; +AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 +AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 +AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 +AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 +AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 +AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 +AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 +AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 +AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 +AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 +AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA +AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB +AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC +AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD +AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE +AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF +AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 +AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 +AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 +AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 +AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 +AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 +AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 +AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 +AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 +AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 +AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA +AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB +AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC +AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD +AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE +AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF +AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 +AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 +AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 +AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 +AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 +AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 +AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 +AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 +AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 +AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 +AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA +AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB +AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC +AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD +AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE +AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF +ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 +ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 +ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 +ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 +ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 +ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 +ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 +ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 +ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 +ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 +ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA +ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB +ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC +ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD +ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE +ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF +ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 +ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 +ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 +ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 +ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 +ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 +ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 +ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 +ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 +ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 +ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA +ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB +ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC +ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED +ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE +ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; @@ -15944,6 +16058,8 @@ FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; +FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; +FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; @@ -17830,6 +17946,32 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; 108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; 108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; +108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; +108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; +108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; +108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; +108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; +108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; +108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; +108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; +108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; +108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; +108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; +108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; +108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; +108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; +108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; +108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; +108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; +108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; +108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; +108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; +108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; +108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; +108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; +108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; 10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; 10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; 10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; @@ -17942,8 +18084,72 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; 109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; 109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; +109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; +109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; 109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; 109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; +109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; +109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; +109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; +109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; +109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; +109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; +109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; +109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; +109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; +109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; +109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; +109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; +109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; +109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; +109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; +109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; +109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; +109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; +109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; +109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; +109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; +109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; +109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; +109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; +109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; +109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; +109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; +109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; +109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; +109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; +109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; +109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; +109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; +109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; +109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; +109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; +109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; +109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; +109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; +109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; +109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; +109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; +109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; +109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; +109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; +109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; +109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; +109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; +109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; +109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; +109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; +109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; +109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; +109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; +109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; +109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; +109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; +109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; +109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; +109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; +109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; 10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; 10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; 10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; @@ -18344,6 +18550,114 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; 10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; 10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; +10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; +10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; +10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; +10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; +10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; +10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; +10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; +10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; +10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; +10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; +10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; +10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; +10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; +10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; +10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; +10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; +10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; +10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; +10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; +10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; +10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; +10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; +10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; +10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; +10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; +10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; +10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; +10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; +10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; +10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; +10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; +10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; +10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; +10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; +10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; +10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; +10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; +10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; +10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; +10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; +10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; +10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; +10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; +10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; +10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; +10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; +10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; +10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; +10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; +10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; +10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; +10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 +10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 +10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 +10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 +10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 +10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 +10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 +10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 +10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 +10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 +10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A +10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B +10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C +10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D +10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E +10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F +10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 +10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 +10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 +10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 +10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 +10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 +10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 +10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 +10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 +10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 +10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A +10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B +10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C +10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D +10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E +10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F +10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 +10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 +10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 +10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 +10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 +10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 +10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 +10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 +10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 +10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 +10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA +10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB +10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC +10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD +10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE +10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF +10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 +10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 +10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 +10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; +10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; +10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; +10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; +10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; +10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; 10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; 10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; 10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; @@ -18764,6 +19078,10 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; 111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; 111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; +111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;; +111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; +111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; +111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; 111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; 111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; 111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; @@ -18776,6 +19094,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; 111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; +111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; +111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; +111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; +111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; +111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; 111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; 111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; 111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; @@ -18857,6 +19180,44 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; 1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; 1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; +11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; +11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; +11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; +11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; +11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; +11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; +11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; +11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; +1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; +1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; +1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; +1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; +1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; +11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; +11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; +11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; +11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; +11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; +11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; +11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; +11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; +11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; +11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; +1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; +1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; +1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; +1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; +1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; +112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; +112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; +112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; +112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; +112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; +112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; +112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; +112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; +112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; +112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; 112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; 112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; 112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; @@ -18926,6 +19287,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; 11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; 11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; 11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; @@ -18989,6 +19351,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; 1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; 1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; +11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; 11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; 1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; 1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; @@ -19163,6 +19526,26 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; 115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; 115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; +115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; +115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; +115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; +115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; +115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; +115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; +115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; +115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; +115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; +115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; +115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; +115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; +115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; 11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; 11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; 11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; @@ -19308,6 +19691,63 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; 116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; 116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; +11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; +11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; +11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; +11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; +11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; +11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; +11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; +11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; +11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; +1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; +1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; +1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; +1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; +1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; +1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; +11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; +11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; +11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; +11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; +11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; +11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; +11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; +11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; +11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; +11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; +1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; +1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; +1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; +11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; +11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; +11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; +11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; +11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; +11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; +11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; +11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; +11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; +11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; +1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; +1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; +11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; +11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; +11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; +11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; +11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; +11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; +11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; +11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; +11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; +11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; +1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; +1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; +1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; +1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; +1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; +1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; 118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; 118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; 118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; @@ -20370,6 +20810,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; 12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; 12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; +12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; 12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; 12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; 12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; @@ -20486,6 +20927,202 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; 12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; 12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; +12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; +12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; +12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; +12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; +12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; +12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; +12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; +12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; +12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; +12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; +1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; +1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; +1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; +1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; +1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; +1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; +12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; +12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; +12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; +12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; +12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; +12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; +12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; +12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; +12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; +12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; +1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; +1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; +1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; +124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; +124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; +124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; +124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; +124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; +124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; +124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; +124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; +124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; +124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; +124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; +124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; +124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; +124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; +124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; +124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; +124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; +124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; +124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; +124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; +124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; +124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; +124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; +124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; +124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; +124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; +124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; +124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; +124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; +124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; +124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; +124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; +124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; +124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; +124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; +124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; +124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; +124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; +124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; +124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; +124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; +124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; +124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; +124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; +124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; +124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; +124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; +124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; +124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; +124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; +124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; +124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; +124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; +124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; +124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; +124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; +124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; +124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; +124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; +124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; +124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; +124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; +124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; +124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; +124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; +124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; +124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; +124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; +124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; +124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; +124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; +124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; +124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; +124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; +124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; +124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; +124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; +124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; +124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; +124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; +124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; +124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; +124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; +124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; +124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; +124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; +124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; +124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; +124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; +12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; +12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; +12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; +12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; +12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; +12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; +12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; +12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; +12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; +12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; +1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; +1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; +1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; +1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; +1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; +12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; +12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; +12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; +12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; +12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; +12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; +12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; +12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; +12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; +1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; +1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; +1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; +1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; +1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; +1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; +12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; +12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; +12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; +12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; +12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; +12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; +12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; +12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; +12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; +12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; +1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; +1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; +1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; +1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; +1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; +1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; +12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; +12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; +12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; +12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; +12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; +12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; +12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; +12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; +12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; +12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; +1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; +1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; +1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; +1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; +1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; +1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; +12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; +12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; +12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; +12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; 13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; 13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; 13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; @@ -21557,6 +22194,589 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; 1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; 1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; +14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; +14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; +14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; +14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; +14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; +14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; +14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; +14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; +14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; +14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; +1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; +1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; +1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; +1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; +1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; +1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; +14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; +14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; +14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; +14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; +14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; +14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; +14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; +14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; +14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; +14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; +1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; +1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; +1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; +1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; +1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; +1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; +14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; +14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; +14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; +14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; +14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; +14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; +14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; +14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; +14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; +14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; +1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; +1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; +1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; +1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; +1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; +1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; +14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; +14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; +14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; +14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; +14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; +14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; +14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; +14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; +14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; +14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; +1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; +1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; +1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; +1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; +1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; +1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; +14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; +14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; +14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; +14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; +14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; +14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; +14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; +14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; +14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; +14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; +1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; +1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; +1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; +1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; +1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; +1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; +14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; +14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; +14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; +14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; +14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; +14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; +14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; +14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; +14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; +14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; +1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; +1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; +1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; +1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; +1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; +1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; +14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; +14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; +14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; +14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; +14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; +14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; +14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; +14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; +14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; +14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; +1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; +1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; +1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; +1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; +1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; +1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; +14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; +14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; +14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; +14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; +14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; +14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; +14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; +14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; +14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; +14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; +1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; +1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; +1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; +1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; +1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; +1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; +14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; +14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; +14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; +14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; +14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; +14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; +14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; +14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; +14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; +14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; +1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; +1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; +1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; +1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; +1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; +1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; +14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; +14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; +14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; +14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; +14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; +14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; +14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; +14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; +14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; +14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; +1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; +1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; +1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; +1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; +1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; +1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; +144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; +144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; +144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; +144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; +144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; +144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; +144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; +144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; +144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; +144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; +144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; +144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; +144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; +144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; +144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; +144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; +144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; +144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; +144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; +144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; +144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; +144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; +144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; +144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; +144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; +144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; +144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; +144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; +144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; +144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; +144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; +144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; +144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; +144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; +144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; +144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; +144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; +144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; +144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; +144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; +144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; +144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; +144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; +144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; +144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; +144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; +144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; +144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; +144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; +144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; +144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; +144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; +144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; +144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; +144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; +144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; +144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; +144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; +144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; +144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; +144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; +144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; +144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; +144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; +144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; +144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; +144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; +144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; +144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; +144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; +144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; +144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; +144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; +144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; +144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; +144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; +144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; +144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; +144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; +144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; +144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; +144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; +144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; +144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; +144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; +144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; +144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; +144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; +144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; +144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; +144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; +144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; +144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; +144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; +144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; +144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; +14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; +14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; +14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; +14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; +14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; +14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; +14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; +14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; +14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; +14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; +1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; +1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; +1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; +1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; +1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; +1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; +14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; +14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; +14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; +14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; +14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; +14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; +14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; +14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; +14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; +14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; +1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; +1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; +1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; +1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; +1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; +1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; +14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; +14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; +14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; +14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; +14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; +14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; +14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; +14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; +14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; +14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; +1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; +1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; +1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; +1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; +1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; +1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; +14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; +14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; +14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; +14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; +14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; +14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; +14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; +14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; +14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; +14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; +1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; +1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; +1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; +1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; +1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; +1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; +14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; +14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; +14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; +14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; +14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; +14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; +14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; +14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; +14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; +14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; +1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; +1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; +1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; +1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; +1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; +1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; +14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; +14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; +14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; +14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; +14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; +14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; +14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; +14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; +14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; +14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; +1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; +1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; +1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; +1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; +1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; +1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; +14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; +14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; +14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; +14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; +14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; +14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; +14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; +14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; +14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; +14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; +1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; +1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; +1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; +1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; +1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; +1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; +14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; +14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; +14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; +14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; +14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; +14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; +14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; +14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; +14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; +14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; +1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; +1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; +1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; +1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; +1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; +1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; +14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; +14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; +14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; +14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; +14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; +14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; +14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; +14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; +14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; +14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; +1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; +1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; +1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; +1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; +1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; +1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; +14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; +14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; +14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; +14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; +14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; +14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; +14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; +14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; +14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; +14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; +1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; +1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; +1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; +1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; +1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; +1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; +145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; +145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; +145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; +145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; +145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; +145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; +145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; +145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; +145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; +145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; +145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; +145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; +145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; +145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; +145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; +145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; +145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; +145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; +145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; +145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; +145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; +145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; +145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; +145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; +145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; +145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; +145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; +145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; +145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; +145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; +145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; +145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; +145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; +145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; +145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; +145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; +145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; +145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; +145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; +145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; +145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; +145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; +145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; +145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; +145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; +145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; +145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; +145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; +145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; +145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; +145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; +145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; +145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; +145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; +145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; +145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; +145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; +145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; +145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; +145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; +145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; +145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; +145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; +145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; +145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; +145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; +145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; +145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; +145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; +145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; +145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; +145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; +145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; +145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; +145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; +145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; +145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; +145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; +145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; +145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; +145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; +145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; +145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; +145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; +145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; +145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; +145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; +145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; +145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; +145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; +145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; +145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; +145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; +145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; +145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; +14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; +14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; +14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; +14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; +14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; +14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; +14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; +14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; +14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; +14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; +1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; +1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; +1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; +1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; +1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; +1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; +14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; +14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; +14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; +14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; +14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; +14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; +14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; +14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; +14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; +14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; +1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; +1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; +1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; +1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; +1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; +1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; +14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; +14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; +14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; +14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; +14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; +14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; +14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; +14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; +14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; +14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; +1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; +1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; +1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; +1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; +1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; +1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; +14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; +14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; +14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; +14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; +14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; +14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; +14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; +14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; +14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; +14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; +1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; +1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; +1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; +1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; +1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; +1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; +14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; +14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; +14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; +14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; +14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; +14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; +14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; 16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; 16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; 16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; @@ -23080,6 +24300,17 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; 1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; 1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; +1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; +1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; +1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; +1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; +1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; +1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; +1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; +1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; +1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; 1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; 1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; 1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; @@ -24251,6 +25482,678 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; 1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; 1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; +1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; +1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; +1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; +1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; +1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; +1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; +1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; +1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; +1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; +1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; +1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; +1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; +1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; +1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; +1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; +1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; +1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; +1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; +1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; +1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; +1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; +1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; +1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; +1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; +1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; +1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; +1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; +1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; +1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; +1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; +1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; +1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; +1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; +1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; +1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; +1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; +1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; +1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; +1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; +1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; +1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; +1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; +1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; +1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; +1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; +1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; +1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; +1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; +1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; +1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; +1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; +1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; +1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; +1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; +1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; +1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; +1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; +1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; +1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; +1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; +1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; +1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; +1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; +1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; +1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; +1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; +1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; +1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; +1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; +1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; +1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; +1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; +1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; +1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; +1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; +1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; +1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; +1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; +1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; +1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; +1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; +1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; +1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; +1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; +1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; +1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; +1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; +1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; +1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; +1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; +1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; +1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; +1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; +1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; +1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; +1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; +1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; +1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; +1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; +1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; +1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; +1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; +1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; +1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; +1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; +1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; +1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; +1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; +1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; +1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; +1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; +1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; +1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; +1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; +1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; +1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; +1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; +1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; +1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; +1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; +1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; +1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; +1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; +1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; +1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; +1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; +1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; +1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; +1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; +1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; +1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; +1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; +1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; +1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; +1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; +1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; +1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; +1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; +1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; +1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; +1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; +1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; +1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; +1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; +1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; +1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; +1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; +1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; +1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; +1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; +1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; +1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; +1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; +1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; +1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; +1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; +1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; +1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; +1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; +1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; +1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; +1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; +1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; +1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; +1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; +1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; +1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; +1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; +1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; +1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; +1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; +1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; +1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; +1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; +1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; +1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; +1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; +1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; +1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; +1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; +1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; +1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; +1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; +1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; +1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; +1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; +1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; +1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; +1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; +1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; +1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; +1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; +1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; +1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; +1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; +1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; +1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; +1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; +1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; +1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; +1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; +1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; +1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; +1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; +1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; +1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; +1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; +1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; +1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; +1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; +1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; +1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; +1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; +1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; +1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; +1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; +1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; +1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; +1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; +1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; +1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; +1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; +1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; +1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; +1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; +1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; +1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; +1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; +1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; +1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; +1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; +1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; +1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; +1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; +1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; +1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; +1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; +1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; +1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; +1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; +1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; +1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; +1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; +1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; +1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; +1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; +1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; +1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; +1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; +1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; +1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; +1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; +1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; +1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; +1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; +1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; +1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; +1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; +1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; +1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; +1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; +1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; +1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; +1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; +1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; +1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; +1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; +1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; +1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; +1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; +1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; +1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; +1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; +1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; +1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; +1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; +1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; +1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; +1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; +1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; +1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; +1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; +1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; +1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; +1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; +1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; +1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; +1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; +1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; +1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; +1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; +1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; +1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; +1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; +1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; +1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; +1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; +1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; +1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; +1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; +1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; +1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; +1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; +1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; +1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; +1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; +1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; +1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; +1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; +1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; +1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; +1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; +1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; +1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; +1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; +1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; +1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; +1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; +1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; +1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; +1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; +1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; +1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; +1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; +1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; +1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; +1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; +1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; +1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; +1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; +1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; +1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; +1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; +1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; +1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; +1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; +1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; +1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; +1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; +1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; +1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; +1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; +1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; +1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; +1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; +1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; +1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; +1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; +1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; +1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; +1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; +1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; +1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; +1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; +1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; +1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; +1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; +1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; +1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; +1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; +1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; +1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; +1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; +1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; +1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; +1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; +1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; +1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; +1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; +1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; +1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; +1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; +1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; +1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; +1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; +1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; +1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; +1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; +1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; +1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; +1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; +1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; +1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; +1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; +1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; +1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; +1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; +1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; +1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; +1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; +1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; +1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; +1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; +1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; +1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; +1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; +1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; +1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; +1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; +1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; +1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; +1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; +1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; +1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; +1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; +1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; +1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; +1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; +1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; +1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; +1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; +1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; +1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; +1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; +1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; +1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; +1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; +1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; +1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; +1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; +1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; +1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; +1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; +1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; +1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; +1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; +1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; +1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; +1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; +1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; +1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; +1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; +1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; +1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; +1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; +1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; +1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; +1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; +1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; +1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; +1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; +1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; +1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; +1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; +1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; +1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; +1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; +1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; +1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; +1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; +1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; +1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; +1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; +1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; +1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; +1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; +1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; 1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; 1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; 1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; @@ -25108,6 +27011,9 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; 1F32B;FOG;So;0;ON;;;;;N;;;;; 1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; +1F32D;HOT DOG;So;0;ON;;;;;N;;;;; +1F32E;TACO;So;0;ON;;;;;N;;;;; +1F32F;BURRITO;So;0;ON;;;;;N;;;;; 1F330;CHESTNUT;So;0;ON;;;;;N;;;;; 1F331;SEEDLING;So;0;ON;;;;;N;;;;; 1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; @@ -25186,6 +27092,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; 1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; 1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; +1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; +1F37F;POPCORN;So;0;ON;;;;;N;;;;; 1F380;RIBBON;So;0;ON;;;;;N;;;;; 1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; 1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; @@ -25265,6 +27173,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F3CC;GOLFER;So;0;ON;;;;;N;;;;; 1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; 1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; +1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; +1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; +1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; +1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; +1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; 1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; 1F3D5;CAMPING;So;0;ON;;;;;N;;;;; 1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; @@ -25301,6 +27214,14 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; 1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; 1F3F7;LABEL;So;0;ON;;;;;N;;;;; +1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; +1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; +1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; +1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; +1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; +1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; +1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; +1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; 1F400;RAT;So;0;ON;;;;;N;;;;; 1F401;MOUSE;So;0;ON;;;;;N;;;;; 1F402;OX;So;0;ON;;;;;N;;;;; @@ -25556,6 +27477,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; 1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; 1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; +1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; 1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; 1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; 1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; @@ -25631,6 +27553,11 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; 1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; 1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; +1F54B;KAABA;So;0;ON;;;;;N;;;;; +1F54C;MOSQUE;So;0;ON;;;;;N;;;;; +1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; +1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; +1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; 1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; 1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; 1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; @@ -25872,6 +27799,8 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; 1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; 1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; +1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; +1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; 1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; 1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; 1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; @@ -26011,6 +27940,7 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; 1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; 1F6CF;BED;So;0;ON;;;;;N;;;;; +1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; 1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; 1F6E1;SHIELD;So;0;ON;;;;;N;;;;; 1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; @@ -26377,12 +28307,29 @@ FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; 1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; 1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; 1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; +1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; +1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; +1F913;NERD FACE;So;0;ON;;;;;N;;;;; +1F914;THINKING FACE;So;0;ON;;;;;N;;;;; +1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; +1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; +1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; +1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; +1F980;CRAB;So;0;ON;;;;;N;;;;; +1F981;LION FACE;So;0;ON;;;;;N;;;;; +1F982;SCORPION;So;0;ON;;;;;N;;;;; +1F983;TURKEY;So;0;ON;;;;;N;;;;; +1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; +1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; 20000;;Lo;0;L;;;;;N;;;;; 2A6D6;;Lo;0;L;;;;;N;;;;; 2A700;;Lo;0;L;;;;;N;;;;; 2B734;;Lo;0;L;;;;;N;;;;; 2B740;;Lo;0;L;;;;;N;;;;; 2B81D;;Lo;0;L;;;;;N;;;;; +2B820;;Lo;0;L;;;;;N;;;;; +2CEA1;;Lo;0;L;;;;;N;;;;; 2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; 2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; 2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; diff --git a/unicode/how-to-update.txt b/unicode/how-to-update.txt new file mode 100644 index 0000000000..246e84891a --- /dev/null +++ b/unicode/how-to-update.txt @@ -0,0 +1,94 @@ +This document contains instructions for updating the Unicode data set used by +the WebEncoders project. + +1) Download the latest UnicodeData.txt and Blocks.txt from the Unicode + Consortium web site. These files are normally found under + http://www.unicode.org/Public/X.Y.Z/ucd/, where X.Y.Z is the version of the + Unicode specification of interest. Replace the UnicodeData.txt and + Blocks.txt files in this folder with the files you downloaded. + +2) Update unicode-copyright.txt in this folder with the following information: + - The exact URLs where you downloaded UnicodeData.txt and Blocks.txt. + - The date on which you downloaded these two files. + - The Unicode copyright and permission notice, if it has changed. The latest + copyright and permission notice can be found at the bottom of + http://www.unicode.org/copyright.html. + +3) Open the Generators solution and run the DefinedCharListGenerator project. + Running this will drop a file unicode-defined-chars.bin into the output + folder. Move this file into the following directory, overwriting the + existing file in that directory: + src\Microsoft.Framework.WebEncoders.Core\compiler\resources + +4) Open the Generators solution and run the UnicodeTablesGenerator project. + Running this will drop two files UnicodeRanges.generated.txt and + UnicodeRangesTests.generated.txt into the output folder. + +5) Open UnicodeRanges.generated.txt in your favorite text editor. You'll see + that the file contains all of the parsed Unicode block information in + ascending code point order. Manually REMOVE the following blocks from this + text file and re-save it. + - High Surrogates (U+D800..U+DB7F) + - High Private Use Surrogates (U+DB80..U+DBFF) + - Low Surrogates (U+DC00..U+DFFF) + - Private Use Area (U+E000..U+F8FF) + +6) Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.generated.cs in + your IDE. Delete everything within the partial class definition and replace + it with the contents of UnicodeRanges.generated.txt. (Remember to remove + the blocks mentioned in the previous step, otherwise unit tests will fail.) + + Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.cs in your IDE. + Update the doc comment at the top of the class to reflect the appropriate + version of the Unicode specification. + +7) Open UnicodeRangesTests.generated.txt in your favorite text editor. Just + like in the previous .txt file, you'll need to remove the [InlineData] + lines which map to the Unicode blocks which were manually removed. + See step (5) for the list of which blocks must be removed. Then re-save + this file. + +8) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeRangesTests.cs in + your IDE. Delete all of the [InlineData] attributes on the Range_Unicode + test, then paste the contents of UnicodeRangesTests.generated.txt in + to restore the new [InlineData] list. + + IMPORTANT: Don't delete the [Theory] attribute on this method! + +9) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeHelpersTests.cs in + your IDE. Scroll to the bottom of the ReadListOfDefinedCharacters method, + and you'll see a section where the test special-cases CJK Ideographs and + Hangul Syllables. As more characters are added to the Unicode specification + the list of valid CJK Ideographs and Hangul Syllables can grow, so make sure + these match up with the relevant lines in UnicodeData.txt. For instance, at + the time of this writing UnicodeData.txt lists the valid Hangul Syllable + character range as follows: + + AC00;;Lo;0;L;;;;;N;;;;; + D7A3;;Lo;0;L;;;;;N;;;;; + + If necessary, update the logic in the ReadListOfDefinedCharacters method to + account for any changes to these lines in UnicodeData.txt. + +That's it! Run the unit tests and everything should be good to go. If you find +any stray comments throughout the code base that reference a specific version +of the Unicode specification, go ahead and update them so that they correctly +reflect the version you just submitted. + +To recap, the files you should check in are: + +src\Microsoft.Framework.WebEncoders.Core\compiler\resources\ + unicode-defined-chars.bin + +src\Microsoft.Framework.WebEncoders.Core\ + UnicodeRanges.cs + UnicodeRanges.generated.cs + +test\Microsoft.Framework.WebEncoders.Tests\ + UnicodeHelpersTests.cs (if necessary, see step 9) + UnicodeRangesTests.cs + +unicode\ + Blocks.txt + unicode-copyright.txt + UnicodeData.txt diff --git a/unicode/unicode-copyright.txt b/unicode/unicode-copyright.txt index 1a7f162552..9a34a6b8b2 100644 --- a/unicode/unicode-copyright.txt +++ b/unicode/unicode-copyright.txt @@ -1,8 +1,8 @@ The files Blocks.txt and UnicodeData.txt in this directory were -retrieved from the following URLs on Saturday, February 7, 2015. +retrieved from the following URLs on Saturday, September 5, 2015. -http://www.unicode.org/Public/7.0.0/ucd/Blocks.txt -http://www.unicode.org/Public/7.0.0/ucd/UnicodeData.txt +http://www.unicode.org/Public/8.0.0/ucd/Blocks.txt +http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt The below copyright notice applies to these files. From 1b790467a1663d257c4b393de257ceea48fa8a43 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 8 Sep 2015 09:50:47 -0700 Subject: [PATCH 0727/1838] #269 Use a json file instead of an ini file to configure hosting. --- src/Microsoft.AspNet.Hosting/Program.cs | 6 +++--- src/Microsoft.AspNet.Hosting/project.json | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 985feeda86..3a8a941cc2 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Hosting { public class Program { - private const string HostingIniFile = "Microsoft.AspNet.Hosting.ini"; + private const string HostingJsonFile = "Microsoft.AspNet.Hosting.json"; private const string ConfigFileKey = "config"; private readonly IServiceProvider _serviceProvider; @@ -25,11 +25,11 @@ namespace Microsoft.AspNet.Hosting // Allow the location of the ini file to be specified via a --config command line arg var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); var tempConfig = tempBuilder.Build(); - var configFilePath = tempConfig[ConfigFileKey] ?? HostingIniFile; + var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; var appBasePath = _serviceProvider.GetRequiredService().ApplicationBasePath; var builder = new ConfigurationBuilder(appBasePath); - builder.AddIniFile(configFilePath, optional: true); + builder.AddJsonFile(configFilePath, optional: true); builder.AddEnvironmentVariables(); builder.AddCommandLine(args); var config = builder.Build(); diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index fe3ed63b3c..ad736ead8e 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -15,7 +15,7 @@ "Microsoft.Framework.Configuration": "1.0.0-*", "Microsoft.Framework.Configuration.CommandLine": "1.0.0-*", "Microsoft.Framework.Configuration.EnvironmentVariables": "1.0.0-*", - "Microsoft.Framework.Configuration.Ini": "1.0.0-*", + "Microsoft.Framework.Configuration.Json": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", From 4e0f0c79ec62561650ef7f7cd341a136f803b7d3 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 8 Sep 2015 12:04:53 -0700 Subject: [PATCH 0728/1838] #366 Rewind the request buffer after parsing the form. --- src/Microsoft.AspNet.Http/Features/FormFeature.cs | 3 +++ test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs | 2 ++ 2 files changed, 5 insertions(+) diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index b50d58c415..48819224dd 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -152,6 +152,9 @@ namespace Microsoft.AspNet.Http.Features.Internal } } + // Rewind so later readers don't have to. + _request.Body.Seek(0, SeekOrigin.Begin); + Form = new FormCollection(formFields, files); return Form; } diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 6f3eb26111..4580ac9e97 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -32,6 +32,8 @@ namespace Microsoft.AspNet.Http.Features.Internal // Assert Assert.Equal("bar", formCollection["foo"]); Assert.Equal("2", formCollection["baz"]); + Assert.Equal(0, context.Request.Body.Position); + Assert.True(context.Request.Body.CanSeek); // Cached formFeature = context.Features.Get(); From 20e534a570723d0f03203ba7d3323c95022bc63d Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Sun, 6 Sep 2015 21:07:14 -0700 Subject: [PATCH 0729/1838] Add more StringValues tests --- .../StringValuesTests.cs | 242 +++++++++++++++--- 1 file changed, 203 insertions(+), 39 deletions(-) diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs index 389d6f547d..bdf8e7bca3 100644 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections; using System.Collections.Generic; using System.Linq; using Xunit; @@ -10,10 +11,76 @@ namespace Microsoft.Framework.Primitives { public class StringValuesTests { - [Fact] - public void IsReadOnly_True() + public static TheoryData DefaultOrNullStringValues + { + get + { + return new TheoryData + { + new StringValues(), + new StringValues((string)null), + new StringValues((string[])null), + (string)null, + (string[])null + }; + } + } + + public static TheoryData EmptyStringValues + { + get + { + return new TheoryData + { + StringValues.Empty, + new StringValues(new string[0]), + new string[0] + }; + } + } + + public static TheoryData FilledStringValues + { + get + { + return new TheoryData + { + new StringValues("abc"), + new StringValues(new[] { "abc" }), + new StringValues(new[] { "abc", "bcd" }), + new StringValues(new[] { "abc", "bcd", "foo" }), + "abc", + new[] { "abc" }, + new[] { "abc", "bcd" }, + new[] { "abc", "bcd", "foo" } + }; + } + } + + public static TheoryData FilledStringValuesWithExpected + { + get + { + return new TheoryData + { + { new StringValues("abc"), new[] { "abc" } }, + { new StringValues(new[] { "abc" }), new[] { "abc" } }, + { new StringValues(new[] { "abc", "bcd" }), new[] { "abc", "bcd" } }, + { new StringValues(new[] { "abc", "bcd", "foo" }), new[] { "abc", "bcd", "foo" } }, + { "abc", new[] { "abc" } }, + { new[] { "abc" }, new[] { "abc" } }, + { new[] { "abc", "bcd" }, new[] { "abc", "bcd" } }, + { new[] { "abc", "bcd", "foo" }, new[] { "abc", "bcd", "foo" } } + }; + } + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + [MemberData(nameof(FilledStringValues))] + public void IsReadOnly_True(StringValues stringValues) { - var stringValues = new StringValues(); Assert.True(((IList)stringValues).IsReadOnly); Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); @@ -23,51 +90,34 @@ namespace Microsoft.Framework.Primitives Assert.Throws(() => ((ICollection)stringValues).Clear()); } - [Fact] - public void DefaultConstructor_ExpectedValues() + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + public void DefaultOrNull_ExpectedValues(StringValues stringValues) + { + Assert.Null((string[])stringValues); + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_ExpectedValues(StringValues stringValues) { - var stringValues = new StringValues(); Assert.Equal(0, stringValues.Count); + Assert.Null((string)stringValues); Assert.Equal((string)null, stringValues); + Assert.Equal(string.Empty, stringValues.ToString()); Assert.Equal(new string[0], stringValues.ToArray()); Assert.True(StringValues.IsNullOrEmpty(stringValues)); Assert.Throws(() => stringValues[0]); + Assert.Throws(() => ((IList)stringValues)[0]); Assert.Equal(string.Empty, stringValues.ToString()); + Assert.Equal(-1, ((IList)stringValues).IndexOf(null)); Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void Constructor_NullStringValue_ExpectedValues() - { - var stringValues = new StringValues((string)null); - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Null((string[])stringValues); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void Constructor_NullStringArray_ExpectedValues() - { - var stringValues = new StringValues((string[])null); - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Null((string[])stringValues); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); + Assert.Equal(-1, ((IList)stringValues).IndexOf("not there")); + Assert.False(((ICollection)stringValues).Contains(null)); + Assert.False(((ICollection)stringValues).Contains(string.Empty)); + Assert.False(((ICollection)stringValues).Contains("not there")); Assert.Equal(0, stringValues.Count()); } @@ -85,6 +135,7 @@ namespace Microsoft.Framework.Primitives Assert.Equal(1, stringValues.Count); Assert.Equal(aString, stringValues); Assert.Equal(aString, stringValues[0]); + Assert.Equal(aString, ((IList)stringValues)[0]); Assert.Equal(new string[] { aString }, stringValues); } @@ -103,6 +154,7 @@ namespace Microsoft.Framework.Primitives Assert.Equal(1, stringValues.Count); Assert.Equal(aString, stringValues); Assert.Equal(aString, stringValues[0]); + Assert.Equal(aString, ((IList)stringValues)[0]); Assert.Equal(aStringArray, stringValues); aString = "abc"; @@ -113,5 +165,117 @@ namespace Microsoft.Framework.Primitives Assert.Equal("abc,bcd", stringValues); Assert.Equal(aStringArray, stringValues); } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) + { + var e1 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e1.Current); + Assert.False(e1.MoveNext()); + Assert.Null(e1.Current); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + + var e2 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e2.Current); + Assert.False(e2.MoveNext()); + Assert.Null(e2.Current); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Enumerator(StringValues stringValues, string[] expected) + { + var e1 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e1.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e1.MoveNext()); + Assert.Equal(expected[i], e1.Current); + } + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + Assert.False(e1.MoveNext()); + + var e2 = ((IEnumerable)stringValues).GetEnumerator(); + Assert.Null(e2.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e2.MoveNext()); + Assert.Equal(expected[i], e2.Current); + } + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + Assert.False(e2.MoveNext()); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void IndexOf(StringValues stringValues, string[] expected) + { + IList list = stringValues; + Assert.Equal(-1, list.IndexOf("not there")); + for (int i = 0; i < expected.Length; i++) + { + Assert.Equal(i, list.IndexOf(expected[i])); + } + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Contains(StringValues stringValues, string[] expected) + { + ICollection collection = stringValues; + Assert.False(collection.Contains("not there")); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(collection.Contains(expected[i])); + } + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void CopyTo(StringValues stringValues, string[] expected) + { + ICollection collection = stringValues; + string[] actual = new string[expected.Length]; + collection.CopyTo(actual, 0); + Assert.Equal(expected, actual); + } + + [Theory] + [MemberData(nameof(DefaultOrNullStringValues))] + [MemberData(nameof(EmptyStringValues))] + public void DefaultNullOrEmpty_Concat(StringValues stringValues) + { + string[] expected = new[] { "abc", "bcd", "foo" }; + Assert.Equal(expected, StringValues.Concat(stringValues, new StringValues(expected))); + Assert.Equal(expected, StringValues.Concat(new StringValues(expected), stringValues)); + + string[] empty = new string[0]; + Assert.Equal(empty, StringValues.Concat(stringValues, StringValues.Empty)); + Assert.Equal(empty, StringValues.Concat(StringValues.Empty, stringValues)); + Assert.Equal(empty, StringValues.Concat(stringValues, new StringValues())); + Assert.Equal(empty, StringValues.Concat(new StringValues(), stringValues)); + } + + [Theory] + [MemberData(nameof(FilledStringValuesWithExpected))] + public void Concat(StringValues stringValues, string[] array) + { + string[] filled = new[] { "abc", "bcd", "foo" }; + + string[] expectedPrepended = array.Concat(filled).ToArray(); + Assert.Equal(expectedPrepended, StringValues.Concat(stringValues, new StringValues(filled))); + + string[] expectedAppended = filled.Concat(array).ToArray(); + Assert.Equal(expectedAppended, StringValues.Concat(new StringValues(filled), stringValues)); + } } } From df33a3cff8507abfce749ace47158243aca270ad Mon Sep 17 00:00:00 2001 From: Justin Van Patten Date: Sun, 6 Sep 2015 21:29:09 -0700 Subject: [PATCH 0730/1838] StringValues improvements - Add public struct enumerator (avoids enumerator allocations) - Implement IReadOnlyList - Rename indexer parameter name from "key" to "index" - Faster IndexOf (no more enumerator allocation & faster array enumeration) - Faster Contains (no more box allocation) - Faster CopyTo (no more enumerator allocation) - Faster Concat (no more enumerator allocations; use CopyTo) --- .../StringValues.cs | 155 +++++++++++++----- .../StringValuesTests.cs | 25 +++ 2 files changed, 142 insertions(+), 38 deletions(-) diff --git a/src/Microsoft.Framework.Primitives/StringValues.cs b/src/Microsoft.Framework.Primitives/StringValues.cs index a9904aac5c..79a8e6d006 100644 --- a/src/Microsoft.Framework.Primitives/StringValues.cs +++ b/src/Microsoft.Framework.Primitives/StringValues.cs @@ -10,7 +10,7 @@ namespace Microsoft.Framework.Primitives /// /// Represents zero/null, one, or many strings in an efficient way. /// - public struct StringValues : IList + public struct StringValues : IList, IReadOnlyList { private static readonly string[] EmptyArray = new string[0]; public static readonly StringValues Empty = new StringValues(EmptyArray); @@ -63,15 +63,15 @@ namespace Microsoft.Framework.Primitives set { throw new NotSupportedException(); } } - public string this[int key] + public string this[int index] { get { if (_values != null) { - return _values[key]; // may throw + return _values[index]; // may throw } - if (key == 0 && _value != null) + if (index == 0 && _value != null) { return _value; } @@ -114,28 +114,67 @@ namespace Microsoft.Framework.Primitives int IList.IndexOf(string item) { - var index = 0; - foreach (var value in this) + return IndexOf(item); + } + + private int IndexOf(string item) + { + if (_values != null) { - if (string.Equals(value, item, StringComparison.Ordinal)) + var values = _values; + for (int i = 0; i < values.Length; i++) { - return index; + if (string.Equals(values[i], item, StringComparison.Ordinal)) + { + return i; + } } - index += 1; + return -1; } + + if (_value != null) + { + return string.Equals(_value, item, StringComparison.Ordinal) ? 0 : -1; + } + return -1; } bool ICollection.Contains(string item) { - return ((IList)this).IndexOf(item) >= 0; + return IndexOf(item) >= 0; } void ICollection.CopyTo(string[] array, int arrayIndex) { - for(int i = 0; i < Count; i++) + CopyTo(array, arrayIndex); + } + + private void CopyTo(string[] array, int arrayIndex) + { + if (_values != null) { - array[arrayIndex + i] = this[i]; + Array.Copy(_values, 0, array, arrayIndex, _values.Length); + return; + } + + if (_value != null) + { + if (array == null) + { + throw new ArgumentNullException(nameof(array)); + } + if (arrayIndex < 0) + { + throw new ArgumentOutOfRangeException(nameof(arrayIndex)); + } + if (array.Length - arrayIndex < 1) + { + throw new ArgumentException( + $"'{nameof(array)}' is not long enough to copy all the items in the collection. Check '{nameof(arrayIndex)}' and '{nameof(array)}' length."); + } + + array[arrayIndex] = _value; } } @@ -164,28 +203,19 @@ namespace Microsoft.Framework.Primitives throw new NotSupportedException(); } - IEnumerator IEnumerable.GetEnumerator() + public Enumerator GetEnumerator() { - return ((IEnumerable)this).GetEnumerator(); + return new Enumerator(this); } IEnumerator IEnumerable.GetEnumerator() { - if (Count == 0) - { - yield break; - } - if (_values == null) - { - yield return _value; - } - else - { - for (int i = 0; i < _values.Length; i++) - { - yield return _values[i]; - } - } + return GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); } public static bool IsNullOrEmpty(StringValues value) @@ -218,16 +248,65 @@ namespace Microsoft.Framework.Primitives } var combined = new string[count1 + count2]; - var index = 0; - foreach (var value in values1) - { - combined[index++] = value; - } - foreach (var value in values2) - { - combined[index++] = value; - } + values1.CopyTo(combined, 0); + values2.CopyTo(combined, count1); return new StringValues(combined); } + + public struct Enumerator : IEnumerator + { + private readonly StringValues _values; + private string _current; + private int _index; + + public Enumerator(StringValues values) + { + _values = values; + _current = null; + _index = 0; + } + + public bool MoveNext() + { + var values = _values._values; + if (values != null) + { + if (_index < values.Length) + { + _current = values[_index]; + _index++; + return true; + } + + _current = null; + return false; + } + + var value = _values._value; + if (value != null && _index == 0) + { + _current = value; + _index = -1; // sentinel value + return true; + } + + _current = null; + return false; + } + + public string Current => _current; + + object IEnumerator.Current => _current; + + void IEnumerator.Reset() + { + _current = null; + _index = 0; + } + + void IDisposable.Dispose() + { + } + } } } diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs index bdf8e7bca3..184fa3f7da 100644 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs @@ -171,6 +171,14 @@ namespace Microsoft.Framework.Primitives [MemberData(nameof(EmptyStringValues))] public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) { + var e = stringValues.GetEnumerator(); + Assert.Null(e.Current); + Assert.False(e.MoveNext()); + Assert.Null(e.Current); + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + var e1 = ((IEnumerable)stringValues).GetEnumerator(); Assert.Null(e1.Current); Assert.False(e1.MoveNext()); @@ -192,6 +200,17 @@ namespace Microsoft.Framework.Primitives [MemberData(nameof(FilledStringValuesWithExpected))] public void Enumerator(StringValues stringValues, string[] expected) { + var e = stringValues.GetEnumerator(); + Assert.Null(e.Current); + for (int i = 0; i < expected.Length; i++) + { + Assert.True(e.MoveNext()); + Assert.Equal(expected[i], e.Current); + } + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + Assert.False(e.MoveNext()); + var e1 = ((IEnumerable)stringValues).GetEnumerator(); Assert.Null(e1.Current); for (int i = 0; i < expected.Length; i++) @@ -244,7 +263,13 @@ namespace Microsoft.Framework.Primitives public void CopyTo(StringValues stringValues, string[] expected) { ICollection collection = stringValues; + + string[] tooSmall = new string[0]; + Assert.Throws(() => collection.CopyTo(tooSmall, 0)); + string[] actual = new string[expected.Length]; + Assert.Throws(() => collection.CopyTo(actual, -1)); + Assert.Throws(() => collection.CopyTo(actual, actual.Length + 1)); collection.CopyTo(actual, 0); Assert.Equal(expected, actual); } From 00d5a056d9ed0ed863a9b2aee22eb152d1434e3c Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 10 Sep 2015 11:30:42 -0700 Subject: [PATCH 0731/1838] #360 Add Response.Clear() extension. --- .../ResponseExtensions.cs | 26 ++++++++ .../ResponseExtensionTests.cs | 64 +++++++++++++++++++ 2 files changed, 90 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs create mode 100644 test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs new file mode 100644 index 0000000000..c818bcaa16 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http.Extensions +{ + public static class ResponseExtensions + { + public static void Clear(this HttpResponse response) + { + if (response.HasStarted) + { + throw new InvalidOperationException("The response cannot be cleared, it has already started sending."); + } + response.StatusCode = 200; + response.HttpContext.Features.Get().ReasonPhrase = null; + response.Headers.Clear(); + if (response.Body.CanSeek) + { + response.Body.SetLength(0); + } + } + } +} diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs new file mode 100644 index 0000000000..2565ef1f80 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -0,0 +1,64 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; +using Microsoft.Framework.Primitives; +using Xunit; + +namespace Microsoft.AspNet.Http.Extensions +{ + public class ResponseExtensionTests + { + [Fact] + public void Clear_ResetsResponse() + { + var context = new DefaultHttpContext(); + context.Response.StatusCode = 201; + context.Response.Headers["custom"] = "value"; + context.Response.Body.Write(new byte[100], 0, 100); + + context.Response.Clear(); + + Assert.Equal(200, context.Response.StatusCode); + Assert.Equal(string.Empty, context.Response.Headers["custom"].ToString()); + Assert.Equal(0, context.Response.Body.Length); + } + + [Fact] + public void Clear_AlreadyStarted_Throws() + { + var context = new DefaultHttpContext(); + context.Features.Set(new StartedResponseFeature()); + + Assert.Throws(() => context.Response.Clear()); + } + + private class StartedResponseFeature : IHttpResponseFeature + { + public Stream Body { get; set; } + + public bool HasStarted { get { return true; } } + + public IDictionary Headers { get; set; } + + public string ReasonPhrase { get; set; } + + public int StatusCode { get; set; } + + public void OnCompleted(Func callback, object state) + { + throw new NotImplementedException(); + } + + public void OnStarting(Func callback, object state) + { + throw new NotImplementedException(); + } + } + } +} From 327dabb243112510d403094b89b2ad597fdf02cc Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 10 Sep 2015 11:35:22 -0700 Subject: [PATCH 0732/1838] Fix namespace for Clear extension. --- src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs index c818bcaa16..ea00f14d5c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs @@ -4,7 +4,7 @@ using System; using Microsoft.AspNet.Http.Features; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNet.Http { public static class ResponseExtensions { From 3e6585dcc81777676665c844af988ddfec87aba7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 10 Sep 2015 17:38:08 -0700 Subject: [PATCH 0733/1838] Adding NeutralResourcesLanguageAttribute --- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 8 ++++++++ src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs | 2 ++ src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs | 3 +++ 4 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs index 025a94598c..b16f6dfb0a 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b16f6dfb0a --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs index 6145905b3a..1ee4059c80 100644 --- a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs @@ -2,7 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: InternalsVisibleTo("Microsoft.AspNet.Hosting.Tests")] +[assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs index d052161863..726e557599 100644 --- a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs @@ -16,6 +16,7 @@ // permissions and limitations under the License. using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -37,3 +38,5 @@ using System.Runtime.InteropServices; [assembly: InternalsVisibleTo("Microsoft.AspNet.TestHost.Tests")] [assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] + From b1a2db0a7cb31c3effafcabbf1871a872ff6ce50 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 10 Sep 2015 17:47:52 -0700 Subject: [PATCH 0734/1838] Adding NeutralResourcesLanguageAttribute --- .../Properties/AssemblyInfo.cs | 8 ++++++++ src/Microsoft.AspNet.Html.Abstractions/project.json | 6 +++++- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 4 +++- src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs | 4 +++- src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 4 +++- .../Properties/AssemblyInfo.cs | 8 ++++++++ src/Microsoft.Framework.Primitives/project.json | 3 ++- .../Properties/AssemblyInfo.cs | 3 ++- src/Microsoft.Framework.WebEncoders.Core/project.json | 1 + .../Properties/AssemblyInfo.cs | 4 +++- src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs | 4 +++- 14 files changed, 50 insertions(+), 11 deletions(-) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs create mode 100644 src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b2437d9ad6 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index a2a7420401..6ecc82e292 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -11,6 +11,10 @@ "frameworks": { "net45" : { }, "dnx451": { }, - "dnxcore50": { } + "dnxcore50": { + "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-" + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index 2565f9261e..08ea154ce6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -2,7 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] \ No newline at end of file +[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b2437d9ad6 --- /dev/null +++ b/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json index 3b870f7173..c504f822d2 100644 --- a/src/Microsoft.Framework.Primitives/project.json +++ b/src/Microsoft.Framework.Primitives/project.json @@ -16,7 +16,8 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Collections": "4.0.11-beta-*" + "System.Collections": "4.0.11-beta-*", + "System.Resources.ResourceManager": "4.0.1-beta-" } } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs index c09b9bdbba..48510ed635 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -1,9 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Reflection; +using System.Resources; using System.Runtime.CompilerServices; [assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] [assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index 7cee739e6e..b2ad614378 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -20,6 +20,7 @@ "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.Reflection": "4.0.10-*", + "System.Resources.ResourceManager": "4.0.1-beta-", "System.Runtime.Extensions": "4.0.11-beta-*", "System.Threading": "4.0.11-beta-*" } diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs index 025a94598c..b2437d9ad6 100644 --- a/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Net.Http.Headers/Properties/AssemblyInfo.cs @@ -2,5 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Reflection; +using System.Resources; -[assembly: AssemblyMetadata("Serviceable", "True")] \ No newline at end of file +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file From ed3ea339189902dfa5747f26c88e573bb1f56538 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 10 Sep 2015 18:41:17 -0700 Subject: [PATCH 0735/1838] Add IHtmlContentBuilder interface Common interface for things that allow appending content (TagBuilder, BufferedHtmlContent). We want to be able to expose this from APIs for users to add content. See discussion: https://github.com/aspnet/Mvc/issues/3087 --- .../IHtmlContentBuilder.cs | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs new file mode 100644 index 0000000000..4b34f98bfb --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -0,0 +1,31 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// A builder for HTML content. + /// + public interface IHtmlContentBuilder : IHtmlContent + { + /// + /// Appends an instance. + /// + /// The to append. + /// The . + IHtmlContentBuilder Append(IHtmlContent content); + + /// + /// Appends a value. The value is treated as unencoded as-provided, and will be HTML + /// encoded before writing to output. + /// + /// The to append. + /// The . + IHtmlContentBuilder Append(string unencoded); + + /// + /// Clears the content. + /// + void Clear(); + } +} From 7a24045953df16e0ee69173a05078c51764ba720 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 13 Sep 2015 22:07:17 -0700 Subject: [PATCH 0736/1838] Split ParsingHelpers classes into their own files #397 --- .../Internal/HeaderSegment.cs | 62 ++++ .../HeaderSegmentCollection.cs} | 329 +----------------- .../Internal/ParsingHelpers.cs | 137 ++++++++ .../Internal/StringSegment.cs | 132 +++++++ 4 files changed, 332 insertions(+), 328 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs rename src/Microsoft.AspNet.Http.Extensions/{ParsingHelpers.cs => Internal/HeaderSegmentCollection.cs} (52%) create mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs create mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs new file mode 100644 index 0000000000..72e94d3ef5 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs @@ -0,0 +1,62 @@ +using System; + +namespace Microsoft.AspNet.Http.Internal +{ + internal struct HeaderSegment : IEquatable + { + private readonly StringSegment _formatting; + private readonly StringSegment _data; + + // + // Initializes a new instance of the class. + // + public HeaderSegment(StringSegment formatting, StringSegment data) + { + _formatting = formatting; + _data = data; + } + + public StringSegment Formatting + { + get { return _formatting; } + } + + public StringSegment Data + { + get { return _data; } + } + + public bool Equals(HeaderSegment other) + { + return _formatting.Equals(other._formatting) && _data.Equals(other._data); + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is HeaderSegment && Equals((HeaderSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); + } + } + + public static bool operator ==(HeaderSegment left, HeaderSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(HeaderSegment left, HeaderSegment right) + { + return !left.Equals(right); + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs similarity index 52% rename from src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index fcce4dd404..85e51f3782 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,78 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; +using System; using System.Collections; using System.Collections.Generic; -using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal { - internal struct HeaderSegment : IEquatable - { - private readonly StringSegment _formatting; - private readonly StringSegment _data; - - // - // Initializes a new instance of the class. - // - public HeaderSegment(StringSegment formatting, StringSegment data) - { - _formatting = formatting; - _data = data; - } - - public StringSegment Formatting - { - get { return _formatting; } - } - - public StringSegment Data - { - get { return _data; } - } - - #region Equality members - - public bool Equals(HeaderSegment other) - { - return _formatting.Equals(other._formatting) && _data.Equals(other._data); - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is HeaderSegment && Equals((HeaderSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - return (_formatting.GetHashCode() * 397) ^ _data.GetHashCode(); - } - } - - public static bool operator ==(HeaderSegment left, HeaderSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(HeaderSegment left, HeaderSegment right) - { - return !left.Equals(right); - } - - #endregion - } - - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] internal struct HeaderSegmentCollection : IEnumerable, IEquatable { private readonly StringValues _headers; @@ -82,8 +14,6 @@ namespace Microsoft.AspNet.Http.Internal _headers = headers; } - #region Equality members - public bool Equals(HeaderSegmentCollection other) { return Equals(_headers, other._headers); @@ -114,8 +44,6 @@ namespace Microsoft.AspNet.Http.Internal return !left.Equals(right); } - #endregion - public Enumerator GetEnumerator() { return new Enumerator(_headers); @@ -360,259 +288,4 @@ namespace Microsoft.AspNet.Http.Internal } } - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] - internal struct StringSegment : IEquatable - { - private readonly string _buffer; - private readonly int _offset; - private readonly int _count; - - // - // Initializes a new instance of the class. - // - public StringSegment(string buffer, int offset, int count) - { - _buffer = buffer; - _offset = offset; - _count = count; - } - - public string Buffer - { - get { return _buffer; } - } - - public int Offset - { - get { return _offset; } - } - - public int Count - { - get { return _count; } - } - - public string Value - { - get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } - } - - public bool HasValue - { - get { return _offset != -1 && _count != 0 && _buffer != null; } - } - - #region Equality members - - public bool Equals(StringSegment other) - { - return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is StringSegment && Equals((StringSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ _offset; - hashCode = (hashCode * 397) ^ _count; - return hashCode; - } - } - - public static bool operator ==(StringSegment left, StringSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(StringSegment left, StringSegment right) - { - return !left.Equals(right); - } - - #endregion - - public bool StartsWith([NotNull] string text, StringComparison comparisonType) - { - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public bool EndsWith([NotNull] string text, StringComparison comparisonType) - { - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; - } - - public bool Equals([NotNull] string text, StringComparison comparisonType) - { - int textLength = text.Length; - if (!HasValue || _count != textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public string Substring(int offset, int length) - { - return _buffer.Substring(_offset + offset, length); - } - - public StringSegment Subsegment(int offset, int length) - { - return new StringSegment(_buffer, _offset + offset, length); - } - - public override string ToString() - { - return Value ?? string.Empty; - } - } - - internal static class ParsingHelpers - { - public static StringValues GetHeader(IDictionary headers, string key) - { - StringValues value; - return headers.TryGetValue(key, out value) ? value : StringValues.Empty; - } - - public static StringValues GetHeaderSplit(IDictionary headers, string key) - { - var values = GetHeaderUnmodified(headers, key); - return new StringValues(GetHeaderSplitImplementation(values).ToArray()); - } - - private static IEnumerable GetHeaderSplitImplementation(StringValues values) - { - foreach (var segment in new HeaderSegmentCollection(values)) - { - if (segment.Data.HasValue) - { - yield return DeQuote(segment.Data.Value); - } - } - } - - public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) - { - StringValues values; - return headers.TryGetValue(key, out values) ? values : StringValues.Empty; - } - - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (StringValues.IsNullOrEmpty(value)) - { - headers.Remove(key); - } - else - { - headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); - } - } - - // Quote items that contain comas and are not already quoted. - private static string QuoteIfNeeded(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Contains(',')) - { - if (value[0] != '"' || value[value.Length - 1] != '"') - { - value = '"' + value + '"'; - } - } - - return value; - } - - private static string DeQuote(string value) - { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') - { - value = value.Substring(1, value.Length - 2); - } - - return value; - } - - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) - { - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) - { - headers.Remove(key); - } - else - { - headers[key] = values.Value; - } - } - - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) - { - if (values == null || values.Length == 0) - { - return; - } - - string existing = GetHeader(headers, key); - if (existing == null) - { - SetHeaderJoined(headers, key, values); - } - else - { - headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); - } - } - - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) - { - if (values.Count == 0) - { - return; - } - - var existing = GetHeaderUnmodified(headers, key); - SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); - } - } } diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs new file mode 100644 index 0000000000..0959adbca0 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -0,0 +1,137 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using Microsoft.Framework.Internal; +using Microsoft.Framework.Primitives; + +namespace Microsoft.AspNet.Http.Internal +{ + internal static class ParsingHelpers + { + public static StringValues GetHeader(IDictionary headers, string key) + { + StringValues value; + return headers.TryGetValue(key, out value) ? value : StringValues.Empty; + } + + public static StringValues GetHeaderSplit(IDictionary headers, string key) + { + var values = GetHeaderUnmodified(headers, key); + return new StringValues(GetHeaderSplitImplementation(values).ToArray()); + } + + private static IEnumerable GetHeaderSplitImplementation(StringValues values) + { + foreach (var segment in new HeaderSegmentCollection(values)) + { + if (segment.Data.HasValue) + { + yield return DeQuote(segment.Data.Value); + } + } + } + + public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + { + StringValues values; + return headers.TryGetValue(key, out values) ? values : StringValues.Empty; + } + + public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (StringValues.IsNullOrEmpty(value)) + { + headers.Remove(key); + } + else + { + headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); + } + } + + // Quote items that contain comas and are not already quoted. + private static string QuoteIfNeeded(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Contains(',')) + { + if (value[0] != '"' || value[value.Length - 1] != '"') + { + value = '"' + value + '"'; + } + } + + return value; + } + + private static string DeQuote(string value) + { + if (string.IsNullOrWhiteSpace(value)) + { + // Ignore + } + else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + { + value = value.Substring(1, value.Length - 2); + } + + return value; + } + + public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) + { + if (string.IsNullOrWhiteSpace(key)) + { + throw new ArgumentNullException(nameof(key)); + } + if (!values.HasValue || StringValues.IsNullOrEmpty(values.Value)) + { + headers.Remove(key); + } + else + { + headers[key] = values.Value; + } + } + + public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + { + if (values == null || values.Length == 0) + { + return; + } + + string existing = GetHeader(headers, key); + if (existing == null) + { + SetHeaderJoined(headers, key, values); + } + else + { + headers[key] = existing + "," + string.Join(",", values.Select(value => QuoteIfNeeded(value))); + } + } + + public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) + { + if (values.Count == 0) + { + return; + } + + var existing = GetHeaderUnmodified(headers, key); + SetHeaderUnmodified(headers, key, StringValues.Concat(existing, values)); + } + } +} diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs new file mode 100644 index 0000000000..2b7fa93020 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs @@ -0,0 +1,132 @@ +using System; +using Microsoft.Framework.Internal; + +namespace Microsoft.AspNet.Http.Internal +{ + internal struct StringSegment : IEquatable + { + private readonly string _buffer; + private readonly int _offset; + private readonly int _count; + + // + // Initializes a new instance of the class. + // + public StringSegment(string buffer, int offset, int count) + { + _buffer = buffer; + _offset = offset; + _count = count; + } + + public string Buffer + { + get { return _buffer; } + } + + public int Offset + { + get { return _offset; } + } + + public int Count + { + get { return _count; } + } + + public string Value + { + get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } + } + + public bool HasValue + { + get { return _offset != -1 && _count != 0 && _buffer != null; } + } + + public bool Equals(StringSegment other) + { + return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; + } + + public override bool Equals(object obj) + { + if (ReferenceEquals(null, obj)) + { + return false; + } + + return obj is StringSegment && Equals((StringSegment)obj); + } + + public override int GetHashCode() + { + unchecked + { + int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); + hashCode = (hashCode * 397) ^ _offset; + hashCode = (hashCode * 397) ^ _count; + return hashCode; + } + } + + public static bool operator ==(StringSegment left, StringSegment right) + { + return left.Equals(right); + } + + public static bool operator !=(StringSegment left, StringSegment right) + { + return !left.Equals(right); + } + + public bool StartsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public bool EndsWith([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count < textLength) + { + return false; + } + + return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; + } + + public bool Equals([NotNull] string text, StringComparison comparisonType) + { + int textLength = text.Length; + if (!HasValue || _count != textLength) + { + return false; + } + + return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; + } + + public string Substring(int offset, int length) + { + return _buffer.Substring(_offset + offset, length); + } + + public StringSegment Subsegment(int offset, int length) + { + return new StringSegment(_buffer, _offset + offset, length); + } + + public override string ToString() + { + return Value ?? string.Empty; + } + } + +} From 896c146e24f2fe9e59cc1e698c99ec5af6b10c92 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Sep 2015 10:42:16 -0700 Subject: [PATCH 0737/1838] Replacing NotNullAttribute with thrown exceptions --- .../HostingEnvironmentExtensions.cs | 29 ++++++++-- .../project.json | 3 +- .../Internal/HostingEngine.cs | 22 ++++++-- .../RequestServicesContainerMiddleware.cs | 20 ++++++- .../Server/ServerLoader.cs | 8 ++- .../Startup/ConfigureServicesDelegate.cs | 15 ++++- .../WebHostBuilder.cs | 56 +++++++++++++++---- src/Microsoft.AspNet.Hosting/project.json | 1 - .../ClientHandler.cs | 15 ++++- .../RequestBuilder.cs | 16 ++++-- .../ResponseStream.cs | 13 ++++- .../WebSocketClient.cs | 12 ++-- src/Microsoft.AspNet.TestHost/project.json | 3 +- .../HostingEngineTests.cs | 2 +- 14 files changed, 169 insertions(+), 46 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index 8fc1b8e43b..1d62b061dc 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -3,7 +3,6 @@ using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting { @@ -14,8 +13,13 @@ namespace Microsoft.AspNet.Hosting /// /// An instance of service. /// True if the environment name is Development, otherwise false. - public static bool IsDevelopment([NotNull]this IHostingEnvironment hostingEnvironment) + public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment) { + if (hostingEnvironment == null) + { + throw new ArgumentNullException(nameof(hostingEnvironment)); + } + return hostingEnvironment.IsEnvironment(EnvironmentName.Development); } @@ -24,8 +28,13 @@ namespace Microsoft.AspNet.Hosting /// /// An instance of service. /// True if the environment name is Production, otherwise false. - public static bool IsProduction([NotNull]this IHostingEnvironment hostingEnvironment) + public static bool IsProduction(this IHostingEnvironment hostingEnvironment) { + if (hostingEnvironment == null) + { + throw new ArgumentNullException(nameof(hostingEnvironment)); + } + return hostingEnvironment.IsEnvironment(EnvironmentName.Production); } @@ -36,9 +45,14 @@ namespace Microsoft.AspNet.Hosting /// Environment name to validate against. /// True if the specified name is same as the current environment. public static bool IsEnvironment( - [NotNull]this IHostingEnvironment hostingEnvironment, + this IHostingEnvironment hostingEnvironment, string environmentName) { + if (hostingEnvironment == null) + { + throw new ArgumentNullException(nameof(hostingEnvironment)); + } + return string.Equals( hostingEnvironment.EnvironmentName, environmentName, @@ -52,9 +66,14 @@ namespace Microsoft.AspNet.Hosting /// Path relative to the root. /// Physical path corresponding to virtual path. public static string MapPath( - [NotNull]this IHostingEnvironment hostingEnvironment, + this IHostingEnvironment hostingEnvironment, string virtualPath) { + if (hostingEnvironment == null) + { + throw new ArgumentNullException(nameof(hostingEnvironment)); + } + if (virtualPath == null) { return hostingEnvironment.WebRootPath; diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index 6e143904ae..daaa329df3 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -7,8 +7,7 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*" }, "frameworks": { "dnx451": {}, diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index d072b36285..b57a218031 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -14,7 +14,6 @@ using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Hosting.Internal @@ -39,10 +38,25 @@ namespace Microsoft.AspNet.Hosting.Internal private IFeatureCollection _serverInstance; public HostingEngine( - [NotNull] IServiceCollection appServices, - [NotNull] IStartupLoader startupLoader, - [NotNull] IConfiguration config) + IServiceCollection appServices, + IStartupLoader startupLoader, + IConfiguration config) { + if (appServices == null) + { + throw new ArgumentNullException(nameof(appServices)); + } + + if (startupLoader == null) + { + throw new ArgumentNullException(nameof(startupLoader)); + } + + if (config == null) + { + throw new ArgumentNullException(nameof(config)); + } + _config = config; _applicationServiceCollection = appServices; _startupLoader = startupLoader; diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs index 9c740ba7f1..ab3fda31ab 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -6,7 +6,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Internal { @@ -15,14 +14,29 @@ namespace Microsoft.AspNet.Hosting.Internal private readonly RequestDelegate _next; private readonly IServiceProvider _services; - public RequestServicesContainerMiddleware([NotNull] RequestDelegate next, [NotNull] IServiceProvider services) + public RequestServicesContainerMiddleware(RequestDelegate next, IServiceProvider services) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + _services = services; _next = next; } - public async Task Invoke([NotNull] HttpContext httpContext) + public async Task Invoke(HttpContext httpContext) { + if (httpContext == null) + { + throw new ArgumentNullException(nameof(httpContext)); + } + // All done if there request services is set if (httpContext.RequestServices != null) { diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index 367f7bea05..3a94dfaca5 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -5,7 +5,6 @@ using System; using System.Linq; using System.Reflection; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Server { @@ -18,8 +17,13 @@ namespace Microsoft.AspNet.Hosting.Server _services = services; } - public IServerFactory LoadServerFactory([NotNull] string assemblyName) + public IServerFactory LoadServerFactory(string assemblyName) { + if (assemblyName == null) + { + throw new ArgumentNullException(nameof(assemblyName)); + } + if (string.IsNullOrEmpty(assemblyName)) { throw new ArgumentException(string.Empty, nameof(assemblyName)); diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs index 977cb07238..716795bc8d 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs @@ -5,14 +5,18 @@ using System; using System.Linq; using System.Reflection; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Hosting.Startup { public class ConfigureServicesBuilder { - public ConfigureServicesBuilder([NotNull] MethodInfo configureServices) + public ConfigureServicesBuilder(MethodInfo configureServices) { + if (configureServices == null) + { + throw new ArgumentNullException(nameof(configureServices)); + } + // Only support IServiceCollection parameters var parameters = configureServices.GetParameters(); if (parameters.Length > 1 || @@ -28,8 +32,13 @@ namespace Microsoft.AspNet.Hosting.Startup public Func Build(object instance) => services => Invoke(instance, services); - private IServiceProvider Invoke(object instance, [NotNull] IServiceCollection exportServices) + private IServiceProvider Invoke(object instance, IServiceCollection exportServices) { + if (exportServices == null) + { + throw new ArgumentNullException(nameof(exportServices)); + } + var parameters = new object[MethodInfo.GetParameters().Length]; // Ctor ensures we have at most one IServiceCollection parameter diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 502d9bc09a..6efc8042d5 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -12,7 +12,6 @@ using Microsoft.AspNet.Http.Internal; using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Hosting @@ -44,13 +43,23 @@ namespace Microsoft.AspNet.Hosting private string _serverFactoryLocation; private IServerFactory _serverFactory; - public WebHostBuilder([NotNull] IServiceProvider services) + public WebHostBuilder(IServiceProvider services) : this(services, config: new ConfigurationBuilder().Build()) { } - public WebHostBuilder([NotNull] IServiceProvider services, [NotNull] IConfiguration config) + public WebHostBuilder(IServiceProvider services, IConfiguration config) { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + + if (config == null) + { + throw new ArgumentNullException(nameof(config)); + } + _hostingEnvironment = new HostingEnvironment(); _loggerFactory = new LoggerFactory(); _services = services; @@ -124,14 +133,24 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebHostBuilder UseEnvironment([NotNull] string environment) + public WebHostBuilder UseEnvironment(string environment) { + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + _hostingEnvironment.EnvironmentName = environment; return this; } - public WebHostBuilder UseServer([NotNull] string assemblyName) + public WebHostBuilder UseServer(string assemblyName) { + if (assemblyName == null) + { + throw new ArgumentNullException(nameof(assemblyName)); + } + _serverFactoryLocation = assemblyName; return this; } @@ -142,22 +161,24 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebHostBuilder UseStartup([NotNull] string startupAssemblyName) + public WebHostBuilder UseStartup(string startupAssemblyName) { if (startupAssemblyName == null) { throw new ArgumentNullException(nameof(startupAssemblyName)); } + _startupAssemblyName = startupAssemblyName; return this; } - public WebHostBuilder UseStartup([NotNull] Type startupType) + public WebHostBuilder UseStartup(Type startupType) { if (startupType == null) { throw new ArgumentNullException(nameof(startupType)); } + _startupType = startupType; return this; } @@ -167,19 +188,34 @@ namespace Microsoft.AspNet.Hosting return UseStartup(typeof(TStartup)); } - public WebHostBuilder UseStartup([NotNull] Action configureApp) + public WebHostBuilder UseStartup(Action configureApp) { + if (configureApp == null) + { + throw new ArgumentNullException(nameof(configureApp)); + } + return UseStartup(configureApp, configureServices: null); } - public WebHostBuilder UseStartup([NotNull] Action configureApp, Func configureServices) + public WebHostBuilder UseStartup(Action configureApp, Func configureServices) { + if (configureApp == null) + { + throw new ArgumentNullException(nameof(configureApp)); + } + _startup = new StartupMethods(configureApp, configureServices); return this; } - public WebHostBuilder UseStartup([NotNull] Action configureApp, Action configureServices) + public WebHostBuilder UseStartup(Action configureApp, Action configureServices) { + if (configureApp == null) + { + throw new ArgumentNullException(nameof(configureApp)); + } + _startup = new StartupMethods(configureApp, services => { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index ad736ead8e..00218c9fb5 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -19,7 +19,6 @@ "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Newtonsoft.Json": "6.0.6" }, "frameworks": { diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 12e03e8980..efcb5dc06e 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -14,7 +14,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -31,8 +30,13 @@ namespace Microsoft.AspNet.TestHost /// Create a new handler. /// /// The pipeline entry point. - public ClientHandler([NotNull] Func next, PathString pathBase) + public ClientHandler(Func next, PathString pathBase) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + _next = next; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. @@ -51,9 +55,14 @@ namespace Microsoft.AspNet.TestHost /// /// protected override async Task SendAsync( - [NotNull] HttpRequestMessage request, + HttpRequestMessage request, CancellationToken cancellationToken) { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + var state = new RequestState(request, _pathBase); var requestContent = request.Content ?? new StreamContent(Stream.Null); var body = await requestContent.ReadAsStreamAsync(); diff --git a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs index 3de390f63a..2de21ead03 100644 --- a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs +++ b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs @@ -3,11 +3,9 @@ using System; using System.Diagnostics.CodeAnalysis; -using System.Globalization; using System.IO; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -27,8 +25,13 @@ namespace Microsoft.AspNet.TestHost /// /// [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings", Justification = "Not a full URI")] - public RequestBuilder([NotNull] TestServer server, string path) + public RequestBuilder(TestServer server, string path) { + if (server == null) + { + throw new ArgumentNullException(nameof(server)); + } + _server = server; _req = new HttpRequestMessage(HttpMethod.Get, path); } @@ -38,8 +41,13 @@ namespace Microsoft.AspNet.TestHost /// /// /// - public RequestBuilder And([NotNull] Action configure) + public RequestBuilder And(Action configure) { + if (configure == null) + { + throw new ArgumentNullException(nameof(configure)); + } + configure(_req); return this; } diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index 7f75c5983f..a1dd0df091 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -8,7 +8,6 @@ using System.Diagnostics.Contracts; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -30,8 +29,18 @@ namespace Microsoft.AspNet.TestHost private bool _firstWrite; private Action _abortRequest; - internal ResponseStream([NotNull] Action onFirstWrite, [NotNull] Action abortRequest) + internal ResponseStream(Action onFirstWrite, Action abortRequest) { + if (onFirstWrite == null) + { + throw new ArgumentNullException(nameof(onFirstWrite)); + } + + if (abortRequest == null) + { + throw new ArgumentNullException(nameof(abortRequest)); + } + _onFirstWrite = onFirstWrite; _firstWrite = true; _abortRequest = abortRequest; diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs index 1eaecbcb61..9946d5e4bd 100644 --- a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs +++ b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -11,7 +11,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.TestHost { @@ -20,10 +19,15 @@ namespace Microsoft.AspNet.TestHost private readonly Func _next; private readonly PathString _pathBase; - internal WebSocketClient([NotNull] Func next, PathString pathBase) + internal WebSocketClient(Func next, PathString pathBase) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + _next = next; - + // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. if (pathBase.HasValue && pathBase.Value.EndsWith("/")) { diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index c59e21f29d..34769e53cd 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -6,8 +6,7 @@ "url": "git://github.com/aspnet/hosting" }, "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "version": "1.0.0-*", "type": "build" } + "Microsoft.AspNet.Hosting": "1.0.0-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 5b9c50ba9a..1ded347dbb 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -413,7 +413,7 @@ namespace Microsoft.AspNet.Hosting private class ReadOnlyFeatureCollection : IFeatureCollection { - public object this[[NotNull] Type key] + public object this[Type key] { get { return null; } set { throw new NotSupportedException(); } From 52cfdf75f24059a54be5896e8c873741e5162026 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 14 Sep 2015 11:58:38 -0700 Subject: [PATCH 0738/1838] Add AppendEncoded to the builder This is needed because a builder may have an optimized path for an unencoded string. There's also no 'common' encoded string implementation so it's much more straightforward to put this on the interface. --- .../IHtmlContentBuilder.cs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index 4b34f98bfb..0d558f2006 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -23,6 +23,14 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . IHtmlContentBuilder Append(string unencoded); + /// + /// Appends an HTML encoded value. The value is treated as HTML encoded as-provided, and + /// no further encoding will be performed. + /// + /// The HTML encoded to append. + /// The . + IHtmlContentBuilder AppendEncoded(string encoded); + /// /// Clears the content. /// From bda0386a93c295e8a04527310d23c98722c2fe41 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 11 Sep 2015 12:14:29 -0700 Subject: [PATCH 0739/1838] #331 Add IServerAddressesFeature. --- .../IServerAddressesFeature.cs | 12 ++++++++++++ .../Internal/HostingEngine.cs | 10 ++++++++++ 2 files changed, 22 insertions(+) create mode 100644 src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerAddressesFeature.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerAddressesFeature.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerAddressesFeature.cs new file mode 100644 index 0000000000..1afbfe7c92 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerAddressesFeature.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Server.Features +{ + public interface IServerAddressesFeature + { + ICollection Addresses { get; } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index b57a218031..516fab462e 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -12,6 +12,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNet.Server.Features; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; @@ -95,6 +96,15 @@ namespace Microsoft.AspNet.Hosting.Internal } }); + var serverAddresses = _serverInstance.Get(); + if (serverAddresses != null) + { + foreach (var address in serverAddresses.Addresses) + { + logger.LogInformation("Now listening on: " + address); + } + } + _applicationLifetime.NotifyStarted(); return new Disposable(() => From 10176373c822b8df148ee70f9180e922ea820ae8 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 14 Sep 2015 15:07:15 -0700 Subject: [PATCH 0740/1838] #351 Display hosting environment name and listening addresses on console. --- .../Internal/Application.cs | 37 +++++++++++++++++++ .../Internal/HostingEngine.cs | 15 ++------ .../Internal/IApplication.cs | 15 ++++++++ .../Internal/IHostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 20 ++++++++-- 5 files changed, 73 insertions(+), 16 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Internal/Application.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/IApplication.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/Application.cs b/src/Microsoft.AspNet.Hosting/Internal/Application.cs new file mode 100644 index 0000000000..ecbb916a6e --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/Application.cs @@ -0,0 +1,37 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class Application : IApplication + { + private readonly IDisposable _stop; + private readonly IServiceProvider _services; + private readonly IFeatureCollection _server; + + public Application(IServiceProvider services, IFeatureCollection server, IDisposable stop) + { + _services = services; + _server = server; + _stop = stop; + } + + public IFeatureCollection ServerFeatures + { + get { return _server; } + } + + public IServiceProvider Services + { + get { return _services; } + } + + public void Dispose() + { + _stop.Dispose(); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 516fab462e..d77831fd18 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -73,7 +73,7 @@ namespace Microsoft.AspNet.Hosting.Internal } } - public virtual IDisposable Start() + public virtual IApplication Start() { EnsureApplicationServices(); @@ -96,23 +96,14 @@ namespace Microsoft.AspNet.Hosting.Internal } }); - var serverAddresses = _serverInstance.Get(); - if (serverAddresses != null) - { - foreach (var address in serverAddresses.Addresses) - { - logger.LogInformation("Now listening on: " + address); - } - } - _applicationLifetime.NotifyStarted(); - return new Disposable(() => + return new Application(ApplicationServices, _serverInstance, new Disposable(() => { _applicationLifetime.NotifyStopping(); server.Dispose(); _applicationLifetime.NotifyStopped(); - }); + })); } private void EnsureApplicationServices() diff --git a/src/Microsoft.AspNet.Hosting/Internal/IApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/IApplication.cs new file mode 100644 index 0000000000..99f807e10c --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/IApplication.cs @@ -0,0 +1,15 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public interface IApplication : IDisposable + { + IFeatureCollection ServerFeatures { get; } + + IServiceProvider Services { get; } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs index d0a3818867..4b8789a9ca 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Hosting.Internal { public interface IHostingEngine { - IDisposable Start(); + IApplication Start(); // Accessing this will block Use methods IServiceProvider ApplicationServices { get; } diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 3a8a941cc2..4cde138e65 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Server.Features; using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; @@ -22,7 +24,7 @@ namespace Microsoft.AspNet.Hosting public void Main(string[] args) { - // Allow the location of the ini file to be specified via a --config command line arg + // Allow the location of the json file to be specified via a --config command line arg var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); var tempConfig = tempBuilder.Build(); var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; @@ -35,11 +37,23 @@ namespace Microsoft.AspNet.Hosting var config = builder.Build(); var host = new WebHostBuilder(_serviceProvider, config).Build(); - using (host.Start()) + using (var app = host.Start()) { + var hostingEnv = app.Services.GetRequiredService(); + Console.WriteLine("Hosting environment: " + hostingEnv.EnvironmentName); + + var serverAddresses = app.ServerFeatures.Get(); + if (serverAddresses != null) + { + foreach (var address in serverAddresses.Addresses) + { + Console.WriteLine("Now listening on: " + address); + } + } + Console.WriteLine("Application started. Press Ctrl+C to shut down."); - var appShutdownService = host.ApplicationServices.GetRequiredService(); + var appShutdownService = app.Services.GetRequiredService(); Console.CancelKeyPress += (sender, eventArgs) => { appShutdownService.RequestShutdown(); From 7ef2242805bfd3b8837dff0f068e77cde47071b3 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Tue, 15 Sep 2015 16:50:01 -0700 Subject: [PATCH 0741/1838] Extension methods for IHtmlContentBuilder Resolves a bunch of duplication between TagHelperContent and BufferedHtmlContent, plus adds a few more convenience overloads we don't have in one of the two places. --- .../HtmlContentBuilderExtensions.cs | 136 ++++++++++++++++++ .../IHtmlContentBuilder.cs | 4 +- 2 files changed, 138 insertions(+), 2 deletions(-) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs new file mode 100644 index 0000000000..bfd5e3ef03 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -0,0 +1,136 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// Extension methods for . + /// + public static class HtmlContentBuilderExtensions + { + /// + /// Appends an . + /// + /// The . + /// The . + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder) + { + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Appends an after appending the value. + /// The value is treated as unencoded as-provided, and will be HTML encoded before writing to output. + /// + /// The . + /// The to append. + /// The . + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, string unencoded) + { + builder.Append(unencoded); + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Appends an after appending the value. + /// + /// The . + /// The to append. + /// The . + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent htmlContent) + { + builder.Append(htmlContent); + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Appends an after appending the value. + /// The value is treated as HTML encoded as-provided, and no further encoding will be performed. + /// + /// The . + /// The HTML encoded to append. + /// The . + public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) + { + builder.AppendEncoded(encoded); + builder.Append(HtmlEncodedString.NewLine); + return builder; + } + + /// + /// Sets the content to the value. The value is treated as unencoded as-provided, + /// and will be HTML encoded before writing to output. + /// + /// The . + /// The value that replaces the content. + /// The . + public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, string unencoded) + { + builder.Clear(); + builder.Append(unencoded); + return builder; + } + + /// + /// Sets the content to the value. + /// + /// The . + /// The value that replaces the content. + /// The . + public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, IHtmlContent content) + { + builder.Clear(); + builder.Append(content); + return builder; + } + + /// + /// Sets the content to the value. The value is treated as HTML encoded as-provided, and + /// no further encoding will be performed. + /// + /// The . + /// The HTML encoded that replaces the content. + /// The . + public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) + { + builder.Clear(); + builder.AppendEncoded(encoded); + return builder; + } + + [DebuggerDisplay("{DebuggerToString()}")] + private class HtmlEncodedString : IHtmlContent + { + public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); + + private readonly string _value; + + public HtmlEncodedString(string value) + { + _value = value; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + writer.Write(_value); + } + + private string DebuggerToString() + { + using (var writer = new StringWriter()) + { + WriteTo(writer, HtmlEncoder.Default); + return writer.ToString(); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index 0d558f2006..aea0291e70 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -19,7 +19,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// Appends a value. The value is treated as unencoded as-provided, and will be HTML /// encoded before writing to output. /// - /// The to append. + /// The to append. /// The . IHtmlContentBuilder Append(string unencoded); @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// Appends an HTML encoded value. The value is treated as HTML encoded as-provided, and /// no further encoding will be performed. /// - /// The HTML encoded to append. + /// The HTML encoded to append. /// The . IHtmlContentBuilder AppendEncoded(string encoded); From e56c3806b64f276b5c89c171d790095ca1bc0a09 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Tue, 15 Sep 2015 23:45:25 -0700 Subject: [PATCH 0742/1838] Add tests for HtmlContentBuilderExtensions --- HttpAbstractions.sln | 15 ++ .../HtmlContentBuilderExtensionsTest.cs | 216 ++++++++++++++++++ ...rosoft.AspNet.Html.Abstractions.Test.xproj | 21 ++ .../project.json | 15 ++ 4 files changed, 267 insertions(+) create mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs create mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj create mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 4a5ef774ab..39f29673eb 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -51,6 +51,8 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primiti EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives.Tests", "test\Microsoft.Framework.Primitives.Tests\Microsoft.Framework.Primitives.Tests.xproj", "{61F72E92-B3AE-4A10-B838-44F80AED40AE}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -289,6 +291,18 @@ Global {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.ActiveCfg = Release|Any CPU {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.Build.0 = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.ActiveCfg = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.Build.0 = Debug|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.Build.0 = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU + {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -315,5 +329,6 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {61F72E92-B3AE-4A10-B838-44F80AED40AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs new file mode 100644 index 0000000000..3aba376094 --- /dev/null +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -0,0 +1,216 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using Microsoft.Framework.WebEncoders; +using Microsoft.Framework.WebEncoders.Testing; +using Xunit; + +namespace Microsoft.AspNet.Html.Abstractions.Test +{ + public class HtmlContentBuilderExtensionsTest + { + [Fact] + public void Builder_AppendLine_Empty() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendLine(); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_AppendLine_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendLine("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value), + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_AppendLine_IHtmlContent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + var content = new OtherHtmlContent("Hi"); + + // Act + builder.AppendLine(content); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Same(content, entry), + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_AppendLineEncoded_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendLineEncoded("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value), + entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); + } + + [Fact] + public void Builder_SetContent_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + builder.Append("Existing Content. Will be Cleared."); + + // Act + builder.SetContent("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); + } + + [Fact] + public void Builder_SetContent_IHtmlContent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + builder.Append("Existing Content. Will be Cleared."); + + var content = new OtherHtmlContent("Hi"); + + // Act + builder.SetContent(content); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Same(content, entry)); + } + + [Fact] + public void Builder_SetContentEncoded_String() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + builder.Append("Existing Content. Will be Cleared."); + + // Act + builder.SetContentEncoded("Hi"); + + // Assert + Assert.Collection( + builder.Entries, + entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); + } + + private static string HtmlContentToString(IHtmlContent content) + { + using (var writer = new StringWriter()) + { + content.WriteTo(writer, new CommonTestEncoder()); + return writer.ToString(); + } + } + + private class TestHtmlContentBuilder : IHtmlContentBuilder + { + public List Entries { get; } = new List(); + + public IHtmlContentBuilder Append(string unencoded) + { + Entries.Add(new UnencodedString(unencoded)); + return this; + } + + public IHtmlContentBuilder Append(IHtmlContent content) + { + Entries.Add(content); + return this; + } + + public IHtmlContentBuilder AppendEncoded(string encoded) + { + Entries.Add(new EncodedString(encoded)); + return this; + } + + public void Clear() + { + Entries.Clear(); + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + + private class EncodedString : IHtmlContent + { + public EncodedString(string value) + { + Value = value; + } + + public string Value { get; } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + + private class UnencodedString : IHtmlContent + { + public UnencodedString(string value) + { + Value = value; + } + + public string Value { get; } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + + private class OtherHtmlContent : IHtmlContent + { + public OtherHtmlContent(string value) + { + Value = value; + } + + public string Value { get; } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + throw new NotImplementedException(); + } + } + } +} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj b/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj new file mode 100644 index 0000000000..4a03567677 --- /dev/null +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj @@ -0,0 +1,21 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 2d187b88-94bd-4a39-ac97-f8f8b9363301 + Microsoft.AspNet.Html.Abstractions.Test + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + + + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json new file mode 100644 index 0000000000..9d82a3d934 --- /dev/null +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -0,0 +1,15 @@ +{ + "dependencies": { + "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From 6758010e1af8af6fd775d9c8903237f03a030d4a Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 16 Sep 2015 11:01:29 -0700 Subject: [PATCH 0743/1838] #353,#354 Add telemetry for begin/end request and unhandled exceptions. --- .../Internal/HostingEngine.cs | 30 ++++- .../WebHostBuilder.cs | 5 + src/Microsoft.AspNet.Hosting/project.json | 9 +- .../TestServerTests.cs | 107 ++++++++++++++++++ .../project.json | 1 + 5 files changed, 147 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index d77831fd18..50cd13443f 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Diagnostics.Tracing; using System.Linq; using System.Threading; using Microsoft.AspNet.Builder; @@ -82,6 +83,7 @@ namespace Microsoft.AspNet.Hosting.Internal var logger = _applicationServices.GetRequiredService>(); var contextFactory = _applicationServices.GetRequiredService(); var contextAccessor = _applicationServices.GetRequiredService(); + var telemetrySource = _applicationServices.GetRequiredService(); var server = ServerFactory.Start(_serverInstance, async features => { @@ -89,10 +91,32 @@ namespace Microsoft.AspNet.Hosting.Internal httpContext.ApplicationServices = _applicationServices; var requestIdentifier = GetRequestIdentifier(httpContext); - using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) + if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { - contextAccessor.HttpContext = httpContext; - await application(httpContext); + telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); + } + + try + { + using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) + { + contextAccessor.HttpContext = httpContext; + await application(httpContext); + } + } + catch (Exception ex) + { + if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) + { + telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); + } + + throw; + } + + if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) + { + telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext }); } }); diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 6efc8042d5..4d2bc9eebf 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics.Tracing; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; @@ -91,6 +92,10 @@ namespace Microsoft.AspNet.Hosting services.AddSingleton(); services.AddLogging(); + var telemetrySource = new TelemetryListener("Microsoft.AspNet"); + services.AddInstance(telemetrySource); + services.AddInstance(telemetrySource); + // Conjure up a RequestServices services.AddTransient(); diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 00218c9fb5..c8b50aad56 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -19,10 +19,15 @@ "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", - "Newtonsoft.Json": "6.0.6" + "Newtonsoft.Json": "6.0.6", + "System.Diagnostics.Tracing.Telemetry": "4.0.0-beta-*" }, "frameworks": { - "dnx451": { }, + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "" + } + }, "dnxcore50": { "dependencies": { "System.Console": "4.0.0-beta-*" diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 47277d7286..ed4bc90a05 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics.Tracing; using System.IO; using System.Net; using System.Net.Http; @@ -13,6 +14,7 @@ using Microsoft.AspNet.Http; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; +using Microsoft.Framework.TelemetryAdapter; using Xunit; namespace Microsoft.AspNet.TestHost @@ -310,6 +312,111 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); } + [Fact] + public async Task BeginEndTelemetryAvailable() + { + TelemetryListener telemetryListener = null; + var server = TestServer.Create(app => + { + telemetryListener = app.ApplicationServices.GetRequiredService(); + app.Run(context => + { + return context.Response.WriteAsync("Hello World"); + }); + }); + var listener = new TestTelemetryListener(); + telemetryListener.SubscribeWithAdapter(listener); + var result = await server.CreateClient().GetStringAsync("/path"); + + Assert.Equal("Hello World", result); + Assert.NotNull(listener.BeginRequest?.HttpContext); + Assert.NotNull(listener.EndRequest?.HttpContext); + Assert.Null(listener.UnhandledException); + } + + [Fact] + public async Task ExceptionTelemetryAvailable() + { + TelemetryListener telemetryListener = null; + var server = TestServer.Create(app => + { + telemetryListener = app.ApplicationServices.GetRequiredService(); + app.Run(context => + { + throw new Exception("Test exception"); + }); + }); + var listener = new TestTelemetryListener(); + telemetryListener.SubscribeWithAdapter(listener); + await Assert.ThrowsAsync(() => server.CreateClient().GetAsync("/path")); + + Assert.NotNull(listener.BeginRequest?.HttpContext); + Assert.Null(listener.EndRequest?.HttpContext); + Assert.NotNull(listener.UnhandledException?.HttpContext); + Assert.NotNull(listener.UnhandledException?.Exception); + } + + public class TestTelemetryListener + { + public class OnBeginRequestEventData + { + public IProxyHttpContext HttpContext { get; set; } + } + + public OnBeginRequestEventData BeginRequest { get; set; } + + [TelemetryName("Microsoft.AspNet.Hosting.BeginRequest")] + public virtual void OnBeginRequest(IProxyHttpContext httpContext) + { + BeginRequest = new OnBeginRequestEventData() + { + HttpContext = httpContext, + }; + } + + public class OnEndRequestEventData + { + public IProxyHttpContext HttpContext { get; set; } + } + + public OnEndRequestEventData EndRequest { get; set; } + + [TelemetryName("Microsoft.AspNet.Hosting.EndRequest")] + public virtual void OnEndRequest(IProxyHttpContext httpContext) + { + EndRequest = new OnEndRequestEventData() + { + HttpContext = httpContext, + }; + } + + public class OnUnhandledExceptionEventData + { + public IProxyHttpContext HttpContext { get; set; } + public IProxyException Exception { get; set; } + } + + public OnUnhandledExceptionEventData UnhandledException { get; set; } + + [TelemetryName("Microsoft.AspNet.Hosting.UnhandledException")] + public virtual void OnUnhandledException(IProxyHttpContext httpContext, IProxyException exception) + { + UnhandledException = new OnUnhandledExceptionEventData() + { + HttpContext = httpContext, + Exception = exception, + }; + } + } + + public interface IProxyHttpContext + { + } + + public interface IProxyException + { + } + public class Startup { public void Configure(IApplicationBuilder builder) diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index b203628aa6..1d9db6febe 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", + "Microsoft.Framework.TelemetryAdapter": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From 9b061ececba620784a0fb54eb4bd3bf33509393e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 16 Sep 2015 14:52:54 -0700 Subject: [PATCH 0744/1838] Dispose the service provider on app shutdown - Added a unit test #322 --- .../Internal/Application.cs | 1 + .../Fakes/FakeService.cs | 12 ++++++++- .../HostingEngineTests.cs | 27 +++++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/Application.cs b/src/Microsoft.AspNet.Hosting/Internal/Application.cs index ecbb916a6e..0603b48628 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/Application.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/Application.cs @@ -32,6 +32,7 @@ namespace Microsoft.AspNet.Hosting.Internal public void Dispose() { _stop.Dispose(); + (_services as IDisposable)?.Dispose(); } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs index 75176f8928..8f90f3899b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs @@ -1,7 +1,17 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; + namespace Microsoft.AspNet.Hosting.Fakes { - public class FakeService : IFakeEveryService { } + public class FakeService : IFakeEveryService, IDisposable + { + public bool Disposed { get; private set; } + + public void Dispose() + { + Disposed = true; + } + } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 1ded347dbb..b831277232 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; @@ -92,6 +93,32 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void HostingEngineDisposesServiceProvider() + { + var engine = CreateBuilder() + .UseServer(this) + .UseServices(s => + { + s.AddTransient(); + s.AddSingleton(); + }) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build() + .Start(); + + var singleton = (FakeService)engine.Services.GetService(); + var transient = (FakeService)engine.Services.GetService(); + + Assert.False(singleton.Disposed); + Assert.False(transient.Disposed); + + engine.Dispose(); + + Assert.True(singleton.Disposed); + Assert.True(transient.Disposed); + } + [Fact] public void HostingEngineNotifiesApplicationStarted() { From 82f58d5f1606e17d09f3c05302637a04e966130b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 16 Sep 2015 15:01:22 -0700 Subject: [PATCH 0745/1838] CR Feedback --- src/Microsoft.AspNet.Hosting/Internal/Application.cs | 1 - src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 1 + 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/Application.cs b/src/Microsoft.AspNet.Hosting/Internal/Application.cs index 0603b48628..ecbb916a6e 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/Application.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/Application.cs @@ -32,7 +32,6 @@ namespace Microsoft.AspNet.Hosting.Internal public void Dispose() { _stop.Dispose(); - (_services as IDisposable)?.Dispose(); } } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 50cd13443f..aa68a00689 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -127,6 +127,7 @@ namespace Microsoft.AspNet.Hosting.Internal _applicationLifetime.NotifyStopping(); server.Dispose(); _applicationLifetime.NotifyStopped(); + (_applicationServices as IDisposable)?.Dispose(); })); } From f4a25b14084cc0952436575832eb201950b0eabd Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 17 Sep 2015 18:32:19 -0700 Subject: [PATCH 0746/1838] Update nuget.exe and corresponding feeds to v3. --- NuGet.Config => NuGet.config | 2 +- build.cmd | 11 ++++++----- build.sh | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) rename NuGet.Config => NuGet.config (83%) diff --git a/NuGet.Config b/NuGet.config similarity index 83% rename from NuGet.Config rename to NuGet.config index 10cec18a32..1707938c61 100644 --- a/NuGet.Config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/build.cmd b/build.cmd index b54d91cf74..177997c42e 100644 --- a/build.cmd +++ b/build.cmd @@ -2,14 +2,15 @@ cd %~dp0 SETLOCAL -SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe +SET NUGET_VERSION=latest +SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe SET BUILDCMD_KOREBUILD_VERSION="" SET BUILDCMD_DNX_VERSION="" IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'" +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" :copynuget IF EXIST .nuget\nuget.exe goto restore @@ -19,11 +20,11 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run IF %BUILDCMD_KOREBUILD_VERSION%=="" ( - .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( - .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages +.nuget\nuget.exe install Sake -ExcludeVersion -Out packages IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( diff --git a/build.sh b/build.sh index 68c3e8cb52..0c66139817 100755 --- a/build.sh +++ b/build.sh @@ -10,21 +10,23 @@ else fi fi mkdir -p $cachedir +nugetVersion=latest +cachePath=$cachedir/nuget.$nugetVersion.exe -url=https://www.nuget.org/nuget.exe +url=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe -if test ! -f $cachedir/nuget.exe; then - wget -O $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null +if test ! -f $cachePath; then + wget -O $cachePath $url 2>/dev/null || curl -o $cachePath --location $url /dev/null fi if test ! -e .nuget; then mkdir .nuget - cp $cachedir/nuget.exe .nuget/nuget.exe + cp $cachePath .nuget/nuget.exe fi if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages + mono .nuget/nuget.exe install Sake -ExcludeVersion -Out packages fi if ! type dnvm > /dev/null 2>&1; then From 6442fe8a8694ff839c633202aea4daa340ddd6c9 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 17 Sep 2015 18:32:39 -0700 Subject: [PATCH 0747/1838] Update nuget.exe and corresponding feeds to v3. --- NuGet.Config => NuGet.config | 2 +- build.cmd | 11 ++++++----- build.sh | 12 +++++++----- 3 files changed, 14 insertions(+), 11 deletions(-) rename NuGet.Config => NuGet.config (83%) diff --git a/NuGet.Config b/NuGet.config similarity index 83% rename from NuGet.Config rename to NuGet.config index 10cec18a32..1707938c61 100644 --- a/NuGet.Config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + \ No newline at end of file diff --git a/build.cmd b/build.cmd index b54d91cf74..177997c42e 100644 --- a/build.cmd +++ b/build.cmd @@ -2,14 +2,15 @@ cd %~dp0 SETLOCAL -SET CACHED_NUGET=%LocalAppData%\NuGet\NuGet.exe +SET NUGET_VERSION=latest +SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe SET BUILDCMD_KOREBUILD_VERSION="" SET BUILDCMD_DNX_VERSION="" IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://www.nuget.org/nuget.exe' -OutFile '%CACHED_NUGET%'" +@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" :copynuget IF EXIST .nuget\nuget.exe goto restore @@ -19,11 +20,11 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\KoreBuild goto run IF %BUILDCMD_KOREBUILD_VERSION%=="" ( - .nuget\NuGet.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( - .nuget\NuGet.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages +.nuget\nuget.exe install Sake -ExcludeVersion -Out packages IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( diff --git a/build.sh b/build.sh index 68c3e8cb52..0c66139817 100755 --- a/build.sh +++ b/build.sh @@ -10,21 +10,23 @@ else fi fi mkdir -p $cachedir +nugetVersion=latest +cachePath=$cachedir/nuget.$nugetVersion.exe -url=https://www.nuget.org/nuget.exe +url=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe -if test ! -f $cachedir/nuget.exe; then - wget -O $cachedir/nuget.exe $url 2>/dev/null || curl -o $cachedir/nuget.exe --location $url /dev/null +if test ! -f $cachePath; then + wget -O $cachePath $url 2>/dev/null || curl -o $cachePath --location $url /dev/null fi if test ! -e .nuget; then mkdir .nuget - cp $cachedir/nuget.exe .nuget/nuget.exe + cp $cachePath .nuget/nuget.exe fi if test ! -d packages/KoreBuild; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages + mono .nuget/nuget.exe install Sake -ExcludeVersion -Out packages fi if ! type dnvm > /dev/null 2>&1; then From fa1896869ef77089baaa5716c6e1624014b8b379 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 18 Sep 2015 12:41:39 -0700 Subject: [PATCH 0748/1838] #358 Support HTTP_PLATFORM_PORT. --- .../Internal/HostingEngine.cs | 13 +++++++++ .../HostingEngineTests.cs | 29 ++++++++++++++++++- 2 files changed, 41 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index aa68a00689..28b72659d2 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -22,6 +22,9 @@ namespace Microsoft.AspNet.Hosting.Internal { public class HostingEngine : IHostingEngine { + // This is defined by IIS's HttpPlatformHandler. + private static readonly string ServerPort = "HTTP_PLATFORM_PORT"; + private readonly IServiceCollection _applicationServiceCollection; private readonly IStartupLoader _startupLoader; private readonly ApplicationLifetime _applicationLifetime; @@ -188,6 +191,16 @@ namespace Microsoft.AspNet.Hosting.Internal var builder = builderFactory.CreateBuilder(_serverInstance); builder.ApplicationServices = _applicationServices; + var port = _config[ServerPort]; + if (!string.IsNullOrEmpty(port)) + { + var addresses = builder.ServerFeatures.Get()?.Addresses; + if (addresses != null && !addresses.IsReadOnly) + { + addresses.Add(port); + } + } + var startupFilters = _applicationServices.GetService>(); var configure = Startup.ConfigureDelegate; foreach (var filter in startupFilters) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index b831277232..16fbe6149a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -5,6 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; @@ -14,6 +15,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNet.Server.Features; using Microsoft.AspNet.Testing.xunit; using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Framework.Configuration; @@ -75,6 +77,24 @@ namespace Microsoft.AspNet.Hosting Assert.NotNull(host.ApplicationServices.GetRequiredService()); } + [Fact] + public void CanSpecifyPortConfig() + { + var vals = new Dictionary + { + { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" }, + { "HTTP_PLATFORM_PORT", "abc123" } + }; + + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + var host = CreateBuilder(config).Build(); + var app = host.Start(); + Assert.NotNull(host.ApplicationServices.GetRequiredService()); + Assert.Equal("abc123", app.ServerFeatures.Get().Addresses.First()); + } + [Fact] public void HostingEngineCanBeStarted() { @@ -397,7 +417,9 @@ namespace Microsoft.AspNet.Hosting public IFeatureCollection Initialize(IConfiguration configuration) { - return null; + var features = new FeatureCollection(); + features.Set(new ServerAddressesFeature()); + return features; } public IDisposable Start(IFeatureCollection serverFeatures, Func application) @@ -470,5 +492,10 @@ namespace Microsoft.AspNet.Hosting yield break; } } + + private class ServerAddressesFeature : IServerAddressesFeature + { + public ICollection Addresses { get; } = new List(); + } } } From 58974a9defd70388e5de007adb2fdf01fd939917 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Sep 2015 11:30:54 -0700 Subject: [PATCH 0749/1838] Replacing NotNullAttribute with thrown exceptions --- NuGet.config | 2 +- .../project.json | 3 + .../Authentication/AuthenticationManager.cs | 64 +++++++++++++--- .../HttpResponseWritingExtensions.cs | 30 +++++++- .../Extensions/MapExtensions.cs | 13 +++- .../Extensions/MapMiddleware.cs | 21 +++++- .../Extensions/MapWhenExtensions.cs | 20 ++++- .../Extensions/MapWhenMiddleware.cs | 21 +++++- .../Extensions/MapWhenOptions.cs | 20 +++-- .../Extensions/RunExtensions.cs | 15 +++- .../FragmentString.cs | 8 +- .../HostString.cs | 8 +- .../HttpResponse.cs | 11 ++- .../PathString.cs | 12 ++- .../QueryString.cs | 8 +- .../project.json | 4 +- .../FormFileExtensions.cs | 16 +++- .../HeaderDictionaryTypeExtensions.cs | 73 ++++++++++++++++--- .../Internal/HeaderSegmentCollection.cs | 2 +- .../Internal/ParsingHelpers.cs | 47 ++++++++++-- .../Internal/StringSegment.cs | 22 +++++- .../RequestHeaders.cs | 46 ++++++++++-- .../ResponseHeaders.cs | 46 ++++++++++-- .../SendFileResponseExtensions.cs | 32 +++++++- .../project.json | 6 +- .../Authentication/AuthenticateContext.cs | 9 ++- .../Authentication/ChallengeContext.cs | 11 ++- .../Authentication/SignInContext.cs | 13 +++- .../Authentication/SignOutContext.cs | 8 +- .../FeatureCollection.cs | 15 +++- .../IFeatureCollection.cs | 3 +- .../project.json | 7 +- .../DefaultAuthenticationManager.cs | 34 +++++++-- src/Microsoft.AspNet.Http/BufferingHelper.cs | 8 +- .../DefaultHttpResponse.cs | 10 +++ .../Features/FormFeature.cs | 15 +++- .../Features/QueryFeature.cs | 21 +++++- .../Features/RequestCookiesFeature.cs | 17 ++++- src/Microsoft.AspNet.Http/FormCollection.cs | 18 ++++- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 8 +- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 55 ++++++++++++-- .../ReadableStringCollection.cs | 9 ++- .../ReferenceReadStream.cs | 8 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 22 +++++- src/Microsoft.AspNet.Http/project.json | 4 +- src/Microsoft.AspNet.Owin/project.json | 6 +- .../BufferedReadStream.cs | 8 +- .../FileBufferingReadStream.cs | 27 ++++++- .../FormReader.cs | 22 +++++- .../MultipartReader.cs | 15 +++- .../MultipartReaderStream.cs | 13 +++- .../QueryHelpers.cs | 46 ++++++++++-- .../WebEncoders.cs | 29 ++++++-- .../project.json | 4 +- .../project.json | 7 +- .../CodePointFilter.cs | 43 +++++++++-- .../HtmlEncoder.cs | 27 ++++++- .../IHtmlEncoder.cs | 6 +- .../IJavaScriptStringEncoder.cs | 6 +- .../IUrlEncoder.cs | 6 +- .../JavaScriptStringEncoder.cs | 27 ++++++- .../UrlEncoder.cs | 27 ++++++- .../project.json | 6 +- .../EncoderServiceCollectionExtensions.cs | 15 +++- .../project.json | 4 +- .../CookieHeaderValue.cs | 33 +++++++-- .../GenericHeaderParser.cs | 9 ++- .../SetCookieHeaderValue.cs | 15 +++- .../StringWithQualityHeaderValueComparer.cs | 15 +++- src/Microsoft.Net.Http.Headers/project.json | 6 +- .../MapPathMiddlewareTests.cs | 6 +- .../MapPredicateMiddlewareTests.cs | 17 ++--- .../DefaultAuthenticationManagerTests.cs | 1 - 73 files changed, 1035 insertions(+), 256 deletions(-) diff --git a/NuGet.config b/NuGet.config index 1707938c61..03704957e8 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index 6ecc82e292..eee0e0ab1b 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -5,6 +5,9 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index e10e081717..a18fe99c97 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -1,11 +1,11 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { @@ -13,10 +13,15 @@ namespace Microsoft.AspNet.Http.Authentication { public abstract IEnumerable GetAuthenticationSchemes(); - public abstract Task AuthenticateAsync([NotNull] AuthenticateContext context); + public abstract Task AuthenticateAsync(AuthenticateContext context); - public virtual async Task AuthenticateAsync([NotNull] string authenticationScheme) + public virtual async Task AuthenticateAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + var context = new AuthenticateContext(authenticationScheme); await AuthenticateAsync(context); return context.Principal; @@ -32,42 +37,77 @@ namespace Microsoft.AspNet.Http.Authentication return ChallengeAsync(authenticationScheme: string.Empty, properties: properties); } - public virtual Task ChallengeAsync([NotNull] string authenticationScheme) + public virtual Task ChallengeAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ChallengeAsync(authenticationScheme: authenticationScheme, properties: null); } // Leave it up to authentication handler to do the right thing for the challenge - public virtual Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + public virtual Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Automatic); } - public virtual Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal) + public virtual Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + return SignInAsync(authenticationScheme, principal, properties: null); } - public virtual Task ForbidAsync([NotNull] string authenticationScheme) + public virtual Task ForbidAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ForbidAsync(authenticationScheme, properties: null); } // Deny access (typically a 403) - public virtual Task ForbidAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + public virtual Task ForbidAsync(string authenticationScheme, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Forbidden); } - public abstract Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); + public abstract Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); - public abstract Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties); + public abstract Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); - public virtual Task SignOutAsync([NotNull] string authenticationScheme) + public virtual Task SignOutAsync(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + return SignOutAsync(authenticationScheme, properties: null); } - public abstract Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties); + public abstract Task SignOutAsync(string authenticationScheme, AuthenticationProperties properties); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs index 896a6a11b4..953cd7ce6e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs @@ -5,7 +5,6 @@ using System; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -21,8 +20,18 @@ namespace Microsoft.AspNet.Http /// /// /// - public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, CancellationToken cancellationToken = default(CancellationToken)) + public static Task WriteAsync(this HttpResponse response, string text, CancellationToken cancellationToken = default(CancellationToken)) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + return response.WriteAsync(text, Encoding.UTF8, cancellationToken); } @@ -34,8 +43,23 @@ namespace Microsoft.AspNet.Http /// /// /// - public static Task WriteAsync([NotNull] this HttpResponse response, [NotNull] string text, [NotNull] Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) + public static Task WriteAsync(this HttpResponse response, string text, Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + byte[] data = encoding.GetBytes(text); return response.Body.WriteAsync(data, 0, data.Length, cancellationToken); } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 3af199d519..94985df589 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -4,7 +4,6 @@ using System; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { @@ -18,8 +17,18 @@ namespace Microsoft.AspNet.Builder /// The path to match /// The branch to take for positive path matches /// - public static IApplicationBuilder Map([NotNull] this IApplicationBuilder app, PathString pathMatch, [NotNull] Action configuration) + public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action configuration) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + if (pathMatch.HasValue && pathMatch.Value.EndsWith("/", StringComparison.Ordinal)) { throw new ArgumentException("The path must not end with a '/'", nameof(pathMatch)); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index 569938516d..f35e0a5480 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -12,14 +12,29 @@ namespace Microsoft.AspNet.Builder.Extensions private readonly RequestDelegate _next; private readonly MapOptions _options; - public MapMiddleware([NotNull] RequestDelegate next, [NotNull] MapOptions options) + public MapMiddleware(RequestDelegate next, MapOptions options) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + _next = next; _options = options; } - public async Task Invoke([NotNull] HttpContext context) + public async Task Invoke(HttpContext context) { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + PathString path = context.Request.Path; PathString remainingPath; if (path.StartsWithSegments(_options.PathMatch, out remainingPath)) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs index e3ac00274f..cabe45094d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Builder.Extensions; -using Microsoft.Framework.Internal; + namespace Microsoft.AspNet.Builder { @@ -23,8 +22,23 @@ namespace Microsoft.AspNet.Builder /// Invoked with the request environment to determine if the branch should be taken /// Configures a branch to take /// - public static IApplicationBuilder MapWhen([NotNull] this IApplicationBuilder app, [NotNull] Predicate predicate, [NotNull] Action configuration) + public static IApplicationBuilder MapWhen(this IApplicationBuilder app, Predicate predicate, Action configuration) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (predicate == null) + { + throw new ArgumentNullException(nameof(predicate)); + } + + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + // create branch var branchBuilder = app.New(); configuration(branchBuilder); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs index 09024a11db..b1ac27f800 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -12,14 +12,29 @@ namespace Microsoft.AspNet.Builder.Extensions private readonly RequestDelegate _next; private readonly MapWhenOptions _options; - public MapWhenMiddleware([NotNull] RequestDelegate next, [NotNull] MapWhenOptions options) + public MapWhenMiddleware(RequestDelegate next, MapWhenOptions options) { + if (next == null) + { + throw new ArgumentNullException(nameof(next)); + } + + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + _next = next; _options = options; } - public async Task Invoke([NotNull] HttpContext context) + public async Task Invoke(HttpContext context) { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + if (_options.Predicate(context)) { await _options.Branch(context); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs index dead7f4de8..aa6263366e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -2,9 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Threading.Tasks; using Microsoft.AspNet.Http; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder.Extensions { @@ -13,14 +11,26 @@ namespace Microsoft.AspNet.Builder.Extensions /// public class MapWhenOptions { + private Func _predicate; + /// /// The user callback that determines if the branch should be taken /// public Func Predicate { - get; - [param: NotNull] - set; + get + { + return _predicate; + } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + _predicate = value; + } } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index b87b2797e3..d79949c5c8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -2,16 +2,23 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Builder { public static class RunExtensions { - public static void Run([NotNull] this IApplicationBuilder app, [NotNull] RequestDelegate handler) + public static void Run(this IApplicationBuilder app, RequestDelegate handler) { + if (app == null) + { + throw new ArgumentNullException(nameof(app)); + } + + if (handler == null) + { + throw new ArgumentNullException(nameof(handler)); + } + app.Use(_ => handler); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 794b800b63..87b22df243 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -91,8 +90,13 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting FragmentString - public static FragmentString FromUriComponent([NotNull] Uri uri) + public static FragmentString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index 15af914718..59fb4f233d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -4,7 +4,6 @@ using System; using System.Diagnostics.CodeAnalysis; using System.Globalization; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -135,8 +134,13 @@ namespace Microsoft.AspNet.Http /// /// /// - public static HostString FromUriComponent([NotNull] Uri uri) + public static HostString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + return new HostString(uri.GetComponents( UriComponents.NormalizedHost | // Always convert punycode to Unicode. UriComponents.HostAndPort, UriFormat.Unescaped)); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 22c4daae06..195ef02330 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -4,7 +4,6 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -33,15 +32,15 @@ namespace Microsoft.AspNet.Http public abstract bool HasStarted { get; } - public abstract void OnStarting([NotNull] Func callback, object state); + public abstract void OnStarting(Func callback, object state); - public virtual void OnStarting([NotNull] Func callback) => OnStarting(_callbackDelegate, callback); + public virtual void OnStarting(Func callback) => OnStarting(_callbackDelegate, callback); - public abstract void OnCompleted([NotNull] Func callback, object state); + public abstract void OnCompleted(Func callback, object state); - public virtual void RegisterForDispose([NotNull] IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + public virtual void RegisterForDispose(IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); - public virtual void OnCompleted([NotNull] Func callback) => OnCompleted(_callbackDelegate, callback); + public virtual void OnCompleted(Func callback) => OnCompleted(_callbackDelegate, callback); public virtual void Redirect(string location) => Redirect(location, permanent: false); diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 62cfd74bd6..be6422063f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,7 +3,6 @@ using System; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Http @@ -88,8 +87,13 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting PathString - public static PathString FromUriComponent([NotNull] Uri uri) + public static PathString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + // REVIEW: what is the exactly correct thing to do? return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); } @@ -128,8 +132,8 @@ namespace Microsoft.AspNet.Http /// The combined PathString value public PathString Add(PathString other) { - if (HasValue && - other.HasValue && + if (HasValue && + other.HasValue && Value[Value.Length - 1] == '/') { // If the path string has a trailing slash and the other string has a leading slash, we need diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 2844c90213..ed59879585 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; @@ -97,8 +96,13 @@ namespace Microsoft.AspNet.Http /// /// The Uri object /// The resulting QueryString - public static QueryString FromUriComponent([NotNull] Uri uri) + public static QueryString FromUriComponent(Uri uri) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + string queryValue = uri.GetComponents(UriComponents.Query, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(queryValue)) { diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index da09379110..3ae66b0aba 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -5,10 +5,12 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index e83402f101..7b13bc2ac3 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -21,8 +21,13 @@ namespace Microsoft.AspNet.Http /// /// The . /// The name of the file to create. - public static void SaveAs([NotNull] this IFormFile formFile, string filename) + public static void SaveAs(this IFormFile formFile, string filename) { + if (formFile == null) + { + throw new ArgumentNullException(nameof(formFile)); + } + using (var fileStream = new FileStream(filename, FileMode.Create)) { var inputStream = formFile.OpenReadStream(); @@ -35,10 +40,15 @@ namespace Microsoft.AspNet.Http /// /// The . /// The name of the file to create. - public async static Task SaveAsAsync([NotNull] this IFormFile formFile, + public async static Task SaveAsAsync(this IFormFile formFile, string filename, CancellationToken cancellationToken = default(CancellationToken)) { + if (formFile == null) + { + throw new ArgumentNullException(nameof(formFile)); + } + using (var fileStream = new FileStream(filename, FileMode.Create)) { var inputStream = formFile.OpenReadStream(); diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 803a0a5080..78bafd33bc 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -26,13 +25,33 @@ namespace Microsoft.AspNet.Http // These are all shared helpers used by both RequestHeaders and ResponseHeaders - internal static DateTimeOffset? GetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name) + internal static DateTimeOffset? GetDate(this IHeaderDictionary headers, string name) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + return headers.Get(name); } - internal static void Set([NotNull] this IHeaderDictionary headers, [NotNull] string name, object value) + internal static void Set(this IHeaderDictionary headers, string name, object value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value == null) { headers.Remove(name); @@ -43,8 +62,18 @@ namespace Microsoft.AspNet.Http } } - internal static void SetList([NotNull] this IHeaderDictionary headers, [NotNull] string name, IList values) + internal static void SetList(this IHeaderDictionary headers, string name, IList values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (values == null || values.Count == 0) { headers.Remove(name); @@ -55,8 +84,18 @@ namespace Microsoft.AspNet.Http } } - internal static void SetDate([NotNull] this IHeaderDictionary headers, [NotNull] string name, DateTimeOffset? value) + internal static void SetDate(this IHeaderDictionary headers, string name, DateTimeOffset? value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value.HasValue) { headers[name] = HeaderUtilities.FormatDate(value.Value); @@ -89,8 +128,13 @@ namespace Microsoft.AspNet.Http { typeof(SetCookieHeaderValue), new Func, IList>(value => { IList result; return SetCookieHeaderValue.TryParseList(value, out result) ? result : null; }) }, }; - internal static T Get([NotNull] this IHeaderDictionary headers, string name) + internal static T Get(this IHeaderDictionary headers, string name) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + object temp; if (KnownParsers.TryGetValue(typeof(T), out temp)) { @@ -107,8 +151,13 @@ namespace Microsoft.AspNet.Http return GetViaReflection(value); } - internal static IList GetList([NotNull] this IHeaderDictionary headers, string name) + internal static IList GetList(this IHeaderDictionary headers, string name) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + object temp; if (KnownListParsers.TryGetValue(typeof(T), out temp)) { @@ -169,11 +218,11 @@ namespace Microsoft.AspNet.Http if (string.Equals("TryParseList", methodInfo.Name, StringComparison.Ordinal) && methodInfo.ReturnParameter.ParameterType.Equals(typeof(Boolean))) { - var methodParams = methodInfo.GetParameters(); - return methodParams.Length == 2 - && methodParams[0].ParameterType.Equals(typeof(IList)) - && methodParams[1].IsOut - && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); + var methodParams = methodInfo.GetParameters(); + return methodParams.Length == 2 + && methodParams[0].ParameterType.Equals(typeof(IList)) + && methodParams[1].IsOut + && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); } return false; }).FirstOrDefault(); diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index 85e51f3782..d3bfe5f4cf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections; using System.Collections.Generic; using Microsoft.Framework.Primitives; diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index 0959adbca0..93a5bfc631 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -2,10 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -35,14 +33,24 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IDictionary headers, string key) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + StringValues values; return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + public static void SetHeaderJoined(IDictionary headers, string key, StringValues value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); @@ -89,8 +97,13 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues? values) + public static void SetHeaderUnmodified(IDictionary headers, string key, StringValues? values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); @@ -105,8 +118,18 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderJoined([NotNull] IDictionary headers, [NotNull] string key, params string[] values) + public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (values == null || values.Length == 0) { return; @@ -123,8 +146,18 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderUnmodified([NotNull] IDictionary headers, [NotNull] string key, StringValues values) + public static void AppendHeaderUnmodified(IDictionary headers, string key, StringValues values) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (values.Count == 0) { return; diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs index 2b7fa93020..83c998421d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs @@ -1,5 +1,4 @@ using System; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Internal { @@ -80,8 +79,13 @@ namespace Microsoft.AspNet.Http.Internal return !left.Equals(right); } - public bool StartsWith([NotNull] string text, StringComparison comparisonType) + public bool StartsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -91,8 +95,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; } - public bool EndsWith([NotNull] string text, StringComparison comparisonType) + public bool EndsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -102,8 +111,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; } - public bool Equals([NotNull] string text, StringComparison comparisonType) + public bool Equals(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count != textLength) { diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index c718ada981..efaa73fc14 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -4,15 +4,19 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers { public class RequestHeaders { - public RequestHeaders([NotNull] IHeaderDictionary headers) + public RequestHeaders(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + Headers = headers; } @@ -268,23 +272,53 @@ namespace Microsoft.AspNet.Http.Headers return Headers.GetList(name); } - public void Set([NotNull] string name, object value) + public void Set(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.Set(name, value); } - public void SetList([NotNull] string name, IList values) + public void SetList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.SetList(name, values); } - public void Append([NotNull] string name, [NotNull] object value) + public void Append(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Headers.Append(name, value.ToString()); } - public void AppendList([NotNull] string name, [NotNull] IList values) + public void AppendList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (values == null) + { + throw new ArgumentNullException(nameof(values)); + } + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index 7ee2bb79a5..de719d58ec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -5,15 +5,19 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Extensions; -using Microsoft.Framework.Internal; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers { public class ResponseHeaders { - public ResponseHeaders([NotNull] IHeaderDictionary headers) + public ResponseHeaders(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + Headers = headers; } @@ -165,23 +169,53 @@ namespace Microsoft.AspNet.Http.Headers return Headers.GetList(name); } - public void Set([NotNull] string name, object value) + public void Set(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.Set(name, value); } - public void SetList([NotNull] string name, IList values) + public void SetList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + Headers.SetList(name, values); } - public void Append([NotNull] string name, [NotNull] object value) + public void Append(string name, object value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Headers.Append(name, value.ToString()); } - public void AppendList([NotNull] string name, [NotNull] IList values) + public void AppendList(string name, IList values) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (values == null) + { + throw new ArgumentNullException(nameof(values)); + } + Headers.Append(name, values.Select(value => value.ToString()).ToArray()); } } diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index b60f1acad9..680c77e62c 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -6,7 +6,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Extensions; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http { @@ -20,8 +19,13 @@ namespace Microsoft.AspNet.Http /// /// /// True if sendfile feature exists in the response. - public static bool SupportsSendFile([NotNull] this HttpResponse response) + public static bool SupportsSendFile(this HttpResponse response) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + return response.HttpContext.Features.Get() != null; } @@ -31,8 +35,18 @@ namespace Microsoft.AspNet.Http /// /// /// - public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName) + public static Task SendFileAsync(this HttpResponse response, string fileName) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (fileName == null) + { + throw new ArgumentNullException(nameof(fileName)); + } + return response.SendFileAsync(fileName, 0, null, CancellationToken.None); } @@ -45,8 +59,18 @@ namespace Microsoft.AspNet.Http /// The number of types to send, or null to send the remainder of the file. /// /// - public static Task SendFileAsync([NotNull] this HttpResponse response, [NotNull] string fileName, long offset, long? count, CancellationToken cancellationToken) + public static Task SendFileAsync(this HttpResponse response, string fileName, long offset, long? count, CancellationToken cancellationToken) { + if (response == null) + { + throw new ArgumentNullException(nameof(response)); + } + + if (fileName == null) + { + throw new ArgumentNullException(nameof(fileName)); + } + var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 767da562d9..4ef0842096 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,9 +5,11 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, - "dependencies": { + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index a259ce8489..c3ef43c071 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -1,16 +1,21 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class AuthenticateContext { - public AuthenticateContext([NotNull] string authenticationScheme) + public AuthenticateContext(string authenticationScheme) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + AuthenticationScheme = authenticationScheme; } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index 5dfcd16914..d632a5722e 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -3,18 +3,23 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class ChallengeContext { - public ChallengeContext([NotNull] string authenticationScheme) : this(authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) + public ChallengeContext(string authenticationScheme) + : this(authenticationScheme, properties: null, behavior: ChallengeBehavior.Automatic) { } - public ChallengeContext([NotNull] string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) + public ChallengeContext(string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); Behavior = behavior; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index 0eade92638..f4bdef8dcb 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -4,14 +4,23 @@ using System; using System.Collections.Generic; using System.Security.Claims; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class SignInContext { - public SignInContext([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, IDictionary properties) + public SignInContext(string authenticationScheme, ClaimsPrincipal principal, IDictionary properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + AuthenticationScheme = authenticationScheme; Principal = principal; Properties = properties ?? new Dictionary(StringComparer.Ordinal); diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index d260afea84..ba27794c3e 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -3,14 +3,18 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features.Authentication { public class SignOutContext { - public SignOutContext([NotNull] string authenticationScheme, IDictionary properties) + public SignOutContext(string authenticationScheme, IDictionary properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + AuthenticationScheme = authenticationScheme; Properties = properties ?? new Dictionary(StringComparer.Ordinal); } diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 16b4d6fb44..25c86d06a9 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -5,13 +5,12 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { public class FeatureCollection : IFeatureCollection { - private static KeyComparer FeatureKeyComparer = new FeatureCollection.KeyComparer(); + private static KeyComparer FeatureKeyComparer = new KeyComparer(); private readonly IFeatureCollection _defaults; private IDictionary _features; private volatile int _containerRevision; @@ -32,15 +31,25 @@ namespace Microsoft.AspNet.Http.Features public bool IsReadOnly { get { return false; } } - public object this[[NotNull] Type key] + public object this[Type key] { get { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + object result; return _features != null && _features.TryGetValue(key, out result) ? result : _defaults?[key]; } set { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (value == null) { if (_features != null && _features.Remove(key)) diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index ba612b10c6..59741d9394 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Features { @@ -24,6 +23,6 @@ namespace Microsoft.AspNet.Http.Features /// /// /// The requested feature, or null if it is not present. - object this[[NotNull] Type key] { get; set; } + object this[Type key] { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index b2b95c92a0..51e3cada2f 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -5,11 +5,10 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { - "type": "build", - "version": "1.0.0-*" - }, "Microsoft.Framework.Primitives": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 821a67395a..4dcb81916c 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -9,7 +9,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; using Microsoft.AspNet.Http.Features.Authentication.Internal; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication.Internal { @@ -47,8 +46,13 @@ namespace Microsoft.AspNet.Http.Authentication.Internal return describeContext.Results.Select(description => new AuthenticationDescription(description)); } - public override async Task AuthenticateAsync([NotNull] AuthenticateContext context) + public override async Task AuthenticateAsync(AuthenticateContext context) { + if (context == null) + { + throw new ArgumentNullException(nameof(context)); + } + var handler = HttpAuthenticationFeature.Handler; if (handler != null) @@ -62,8 +66,13 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override async Task ChallengeAsync([NotNull] string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) + public override async Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + var handler = HttpAuthenticationFeature.Handler; var challengeContext = new ChallengeContext(authenticationScheme, properties?.Items, behavior); @@ -78,8 +87,18 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override async Task SignInAsync([NotNull] string authenticationScheme, [NotNull] ClaimsPrincipal principal, AuthenticationProperties properties) + public override async Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + + if (principal == null) + { + throw new ArgumentNullException(nameof(principal)); + } + var handler = HttpAuthenticationFeature.Handler; var signInContext = new SignInContext(authenticationScheme, principal, properties?.Items); @@ -94,8 +113,13 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - public override async Task SignOutAsync([NotNull] string authenticationScheme, AuthenticationProperties properties) + public override async Task SignOutAsync(string authenticationScheme, AuthenticationProperties properties) { + if (authenticationScheme == null) + { + throw new ArgumentNullException(nameof(authenticationScheme)); + } + var handler = HttpAuthenticationFeature.Handler; var signOutContext = new SignOutContext(authenticationScheme, properties?.Items); diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index 47b08915c4..e56d73e5cf 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -4,7 +4,6 @@ using System; using System.IO; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Internal { @@ -39,8 +38,13 @@ namespace Microsoft.AspNet.Http.Internal } } - public static HttpRequest EnableRewind([NotNull] this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) + public static HttpRequest EnableRewind(this HttpRequest request, int bufferThreshold = DefaultBufferThreshold) { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + var body = request.Body; if (!body.CanSeek) { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index b47279bfd8..e5f09f7ca2 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -95,11 +95,21 @@ namespace Microsoft.AspNet.Http.Internal public override void OnStarting(Func callback, object state) { + if (callback == null) + { + throw new ArgumentNullException(nameof(callback)); + } + HttpResponseFeature.OnStarting(callback, state); } public override void OnCompleted(Func callback, object state) { + if (callback == null) + { + throw new ArgumentNullException(nameof(callback)); + } + HttpResponseFeature.OnCompleted(callback, state); } diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index 48819224dd..6d6ff1d012 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -9,7 +9,6 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -19,13 +18,23 @@ namespace Microsoft.AspNet.Http.Features.Internal { private readonly HttpRequest _request; - public FormFeature([NotNull] IFormCollection form) + public FormFeature(IFormCollection form) { + if (form == null) + { + throw new ArgumentNullException(nameof(form)); + } + Form = form; } - public FormFeature([NotNull] HttpRequest request) + public FormFeature(HttpRequest request) { + if (request == null) + { + throw new ArgumentNullException(nameof(request)); + } + _request = request; } diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 39c842b83e..5dd7ca9163 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal @@ -18,18 +17,32 @@ namespace Microsoft.AspNet.Http.Features.Internal private string _original; private IReadableStringCollection _parsedValues; - public QueryFeature([NotNull] IDictionary query) + public QueryFeature(IDictionary query) : this(new ReadableStringCollection(query)) { + if (query == null) + { + throw new ArgumentNullException(nameof(query)); + } } - public QueryFeature([NotNull] IReadableStringCollection query) + public QueryFeature(IReadableStringCollection query) { + if (query == null) + { + throw new ArgumentNullException(nameof(query)); + } + _parsedValues = query; } - public QueryFeature([NotNull] IFeatureCollection features) + public QueryFeature(IFeatureCollection features) { + if (features == null) + { + throw new ArgumentNullException(nameof(features)); + } + _features = features; } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index cc0a9df3ed..0eb44ef102 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -19,18 +18,28 @@ namespace Microsoft.AspNet.Http.Features.Internal private StringValues _original; private IReadableStringCollection _parsedValues; - public RequestCookiesFeature([NotNull] IDictionary cookies) + public RequestCookiesFeature(IDictionary cookies) : this(new ReadableStringCollection(cookies)) { } - public RequestCookiesFeature([NotNull] IReadableStringCollection cookies) + public RequestCookiesFeature(IReadableStringCollection cookies) { + if (cookies == null) + { + throw new ArgumentNullException(nameof(cookies)); + } + _parsedValues = cookies; } - public RequestCookiesFeature([NotNull] IFeatureCollection features) + public RequestCookiesFeature(IFeatureCollection features) { + if (features == null) + { + throw new ArgumentNullException(nameof(features)); + } + _features = features; } diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index 15de4dee62..550ad933eb 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -1,8 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -12,17 +12,27 @@ namespace Microsoft.AspNet.Http.Internal /// public class FormCollection : ReadableStringCollection, IFormCollection { - public FormCollection([NotNull] IDictionary store) + public FormCollection(IDictionary store) : this(store, new FormFileCollection()) { } - public FormCollection([NotNull] IDictionary store, [NotNull] IFormFileCollection files) + public FormCollection(IDictionary store, IFormFileCollection files) : base(store) { + if (store == null) + { + throw new ArgumentNullException(nameof(store)); + } + + if (files == null) + { + throw new ArgumentNullException(nameof(files)); + } + Files = files; } - public IFormFileCollection Files { get; private set; } + public IFormFileCollection Files { get; } } } diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 05d5d7fdf4..20b520b783 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -4,7 +4,6 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -22,8 +21,13 @@ namespace Microsoft.AspNet.Http.Internal /// Initializes a new instance of the class. /// /// The underlying data store. - public HeaderDictionary([NotNull] IDictionary store) + public HeaderDictionary(IDictionary store) { + if (store == null) + { + throw new ArgumentNullException(nameof(store)); + } + Store = store; } diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 54455b90b3..6bf5a57ae6 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -6,7 +6,6 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Net.Http.Headers; @@ -444,8 +443,13 @@ namespace Microsoft.AspNet.Http.Internal #endregion - public bool StartsWith([NotNull] string text, StringComparison comparisonType) + public bool StartsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -455,8 +459,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; } - public bool EndsWith([NotNull] string text, StringComparison comparisonType) + public bool EndsWith(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count < textLength) { @@ -466,8 +475,13 @@ namespace Microsoft.AspNet.Http.Internal return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; } - public bool Equals([NotNull] string text, StringComparison comparisonType) + public bool Equals(string text, StringComparison comparisonType) { + if (text == null) + { + throw new ArgumentNullException(nameof(text)); + } + int textLength = text.Length; if (!HasValue || _count != textLength) { @@ -518,14 +532,29 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified([NotNull] IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IDictionary headers, string key) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + StringValues values; return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeader([NotNull] IDictionary headers, [NotNull] string key, StringValues value) + public static void SetHeader(IDictionary headers, string key, StringValues value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + if (string.IsNullOrWhiteSpace(key)) { throw new ArgumentNullException(nameof(key)); @@ -554,8 +583,13 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static long? GetContentLength([NotNull] IHeaderDictionary headers) + public static long? GetContentLength(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + const NumberStyles styles = NumberStyles.AllowLeadingWhite | NumberStyles.AllowTrailingWhite; long value; var rawValue = headers[HeaderNames.ContentLength]; @@ -569,8 +603,13 @@ namespace Microsoft.AspNet.Http.Internal return null; } - public static void SetContentLength([NotNull] IHeaderDictionary headers, long? value) + public static void SetContentLength(IHeaderDictionary headers, long? value) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + if (value.HasValue) { headers[HeaderNames.ContentLength] = value.Value.ToString(CultureInfo.InvariantCulture); diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs index 962804b723..c1ed5d910e 100644 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Internal @@ -19,8 +19,13 @@ namespace Microsoft.AspNet.Http.Internal /// Create a new wrapper /// /// - public ReadableStringCollection([NotNull] IDictionary store) + public ReadableStringCollection(IDictionary store) { + if (store == null) + { + throw new ArgumentNullException(nameof(store)); + } + Store = store; } diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 87f2959eef..509a6e44cd 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Internal { @@ -21,8 +20,13 @@ namespace Microsoft.AspNet.Http.Internal private bool _disposed; - public ReferenceReadStream([NotNull] Stream inner, long offset, long length) + public ReferenceReadStream(Stream inner, long offset, long length) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + _inner = inner; _innerOffset = offset; _length = length; diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index 7ead5dcc91..c4db554c47 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -3,7 +3,6 @@ using System; using System.Linq; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; using Microsoft.Net.Http.Headers; @@ -19,8 +18,13 @@ namespace Microsoft.AspNet.Http.Internal /// Create a new wrapper /// /// - public ResponseCookies([NotNull] IHeaderDictionary headers) + public ResponseCookies(IHeaderDictionary headers) { + if (headers == null) + { + throw new ArgumentNullException(nameof(headers)); + } + Headers = headers; } @@ -49,8 +53,13 @@ namespace Microsoft.AspNet.Http.Internal /// /// /// - public void Append(string key, string value, [NotNull] CookieOptions options) + public void Append(string key, string value, CookieOptions options) { + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + var setCookieHeaderValue = new SetCookieHeaderValue( UrlEncoder.Default.UrlEncode(key), UrlEncoder.Default.UrlEncode(value)) @@ -91,8 +100,13 @@ namespace Microsoft.AspNet.Http.Internal /// /// /// - public void Delete(string key, [NotNull] CookieOptions options) + public void Delete(string key, CookieOptions options) { + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 53e3ece572..27cb110745 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -5,10 +5,12 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 7a496619ae..a20dd5ccff 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -5,9 +5,11 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "Microsoft.AspNet.Http": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 94bb03efce..88e2782938 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -6,7 +6,6 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -21,8 +20,13 @@ namespace Microsoft.AspNet.WebUtilities private int _bufferCount = 0; private bool _disposed; - public BufferedReadStream([NotNull] Stream inner, int bufferSize) + public BufferedReadStream(Stream inner, int bufferSize) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + _inner = inner; _buffer = new byte[bufferSize]; } diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 9bed427578..3341b65857 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -30,18 +29,38 @@ namespace Microsoft.AspNet.WebUtilities // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? public FileBufferingReadStream( - [NotNull] Stream inner, + Stream inner, int memoryThreshold, - [NotNull] Func tempFileDirectoryAccessor) + Func tempFileDirectoryAccessor) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + + if (tempFileDirectoryAccessor == null) + { + throw new ArgumentNullException(nameof(tempFileDirectoryAccessor)); + } + _inner = inner; _memoryThreshold = memoryThreshold; _tempFileDirectoryAccessor = tempFileDirectoryAccessor; } // TODO: allow for an optional buffer size limit to prevent filling hard disks. 1gb? - public FileBufferingReadStream([NotNull] Stream inner, int memoryThreshold, [NotNull] string tempFileDirectory) + public FileBufferingReadStream(Stream inner, int memoryThreshold, string tempFileDirectory) { + if (inner == null) + { + throw new ArgumentNullException(nameof(inner)); + } + + if (tempFileDirectory == null) + { + throw new ArgumentNullException(nameof(tempFileDirectory)); + } + _inner = inner; _memoryThreshold = memoryThreshold; _tempFileDirectory = tempFileDirectory; diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index e475522646..d4e36264de 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -7,7 +7,6 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities @@ -23,13 +22,28 @@ namespace Microsoft.AspNet.WebUtilities private int _bufferOffset; private int _bufferCount; - public FormReader([NotNull] string data) + public FormReader(string data) { + if (data == null) + { + throw new ArgumentNullException(nameof(data)); + } + _reader = new StringReader(data); } - public FormReader([NotNull] Stream stream, [NotNull] Encoding encoding) + public FormReader(Stream stream, Encoding encoding) { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + _reader = new StreamReader(stream, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024 * 2, leaveOpen: true); } @@ -160,7 +174,7 @@ namespace Microsoft.AspNet.WebUtilities while (pair.HasValue) { accumulator.Append(pair.Value.Key, pair.Value.Value); - pair = reader.ReadNextPair(); + pair = reader.ReadNextPair(); } return accumulator.GetResults(); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 631908173b..8c87e5db52 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -7,7 +7,6 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.WebUtilities @@ -21,13 +20,23 @@ namespace Microsoft.AspNet.WebUtilities private readonly string _boundary; private MultipartReaderStream _currentStream; - public MultipartReader([NotNull] string boundary, [NotNull] Stream stream) + public MultipartReader(string boundary, Stream stream) : this(boundary, stream, DefaultBufferSize) { } - public MultipartReader([NotNull] string boundary, [NotNull] Stream stream, int bufferSize) + public MultipartReader(string boundary, Stream stream, int bufferSize) { + if (boundary == null) + { + throw new ArgumentNullException(nameof(boundary)); + } + + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + if (bufferSize < boundary.Length + 8) // Size of the boundary + leading and trailing CRLF + leading and trailing '--' markers. { throw new ArgumentOutOfRangeException(nameof(bufferSize), bufferSize, "Insufficient buffer space, the buffer must be larger than the boundary: " + boundary); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 5e3059280d..9350233c83 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -7,7 +7,6 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -26,8 +25,18 @@ namespace Microsoft.AspNet.WebUtilities /// /// /// - public MultipartReaderStream([NotNull] BufferedReadStream stream, [NotNull] string boundary, bool expectLeadingCrlf = true) + public MultipartReaderStream(BufferedReadStream stream, string boundary, bool expectLeadingCrlf = true) { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (boundary == null) + { + throw new ArgumentNullException(nameof(boundary)); + } + _innerStream = stream; _innerOffset = _innerStream.CanSeek ? _innerStream.Position : 0; if (expectLeadingCrlf) diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 13cd1f4051..17022d0b2d 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Internal; using Microsoft.Framework.Primitives; using Microsoft.Framework.WebEncoders; @@ -19,10 +18,25 @@ namespace Microsoft.AspNet.WebUtilities /// The name of the query key. /// The query value. /// The combined result. - public static string AddQueryString([NotNull] string uri, [NotNull] string name, [NotNull] string value) + public static string AddQueryString(string uri, string name, string value) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + return AddQueryString( - uri, new [] { new KeyValuePair(name, value) }); + uri, new[] { new KeyValuePair(name, value) }); } /// @@ -31,15 +45,35 @@ namespace Microsoft.AspNet.WebUtilities /// The base uri. /// A collection of name value query pairs to append. /// The combined result. - public static string AddQueryString([NotNull] string uri, [NotNull] IDictionary queryString) + public static string AddQueryString(string uri, IDictionary queryString) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + if (queryString == null) + { + throw new ArgumentNullException(nameof(queryString)); + } + return AddQueryString(uri, (IEnumerable>)queryString); } private static string AddQueryString( - [NotNull] string uri, - [NotNull] IEnumerable> queryString) + string uri, + IEnumerable> queryString) { + if (uri == null) + { + throw new ArgumentNullException(nameof(uri)); + } + + if (queryString == null) + { + throw new ArgumentNullException(nameof(queryString)); + } + var anchorIndex = uri.IndexOf('#'); var uriToBeAppended = uri; var anchorText = ""; diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index 132f106e07..751ad43c21 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -3,7 +3,6 @@ using System; using System.Diagnostics; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.WebUtilities { @@ -21,8 +20,13 @@ namespace Microsoft.AspNet.WebUtilities /// The input must not contain any whitespace or padding characters. /// Throws FormatException if the input is malformed. /// - public static byte[] Base64UrlDecode([NotNull] string input) + public static byte[] Base64UrlDecode(string input) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + return Base64UrlDecode(input, 0, input.Length); } @@ -37,8 +41,13 @@ namespace Microsoft.AspNet.WebUtilities /// The input must not contain any whitespace or padding characters. /// Throws FormatException if the input is malformed. /// - public static byte[] Base64UrlDecode([NotNull] string input, int offset, int count) + public static byte[] Base64UrlDecode(string input, int offset, int count) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + ValidateParameters(input.Length, offset, count); // Special-case empty input @@ -83,8 +92,13 @@ namespace Microsoft.AspNet.WebUtilities /// /// The binary input to encode. /// The base64url-encoded form of the input. - public static string Base64UrlEncode([NotNull] byte[] input) + public static string Base64UrlEncode(byte[] input) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + return Base64UrlEncode(input, 0, input.Length); } @@ -95,8 +109,13 @@ namespace Microsoft.AspNet.WebUtilities /// The offset into at which to begin encoding. /// The number of bytes of to encode. /// The base64url-encoded form of the input. - public static string Base64UrlEncode([NotNull] byte[] input, int offset, int count) + public static string Base64UrlEncode(byte[] input, int offset, int count) { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + ValidateParameters(input.Length, offset, count); // Special-case empty input diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 4aa7a07c04..621e8c5954 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -5,8 +5,10 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.Primitives": "1.0.0-*", "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json index c504f822d2..4957eeb224 100644 --- a/src/Microsoft.Framework.Primitives/project.json +++ b/src/Microsoft.Framework.Primitives/project.json @@ -5,11 +5,8 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { - "type": "build", - "version": "1.0.0-*" - } + "compilationOptions": { + "warningsAsErrors": true }, "frameworks": { "net451": { }, diff --git a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs index a5d5b21c3a..8858c2df17 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -25,8 +24,13 @@ namespace Microsoft.Framework.WebEncoders /// /// Instantiates the filter by cloning the allow list of another . /// - public CodePointFilter([NotNull] ICodePointFilter other) + public CodePointFilter(ICodePointFilter other) { + if (other == null) + { + throw new ArgumentNullException(nameof(other)); + } + CodePointFilter otherAsCodePointFilter = other as CodePointFilter; if (otherAsCodePointFilter != null) { @@ -85,8 +89,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter AllowChars([NotNull] string chars) + public CodePointFilter AllowChars(string chars) { + if (chars == null) + { + throw new ArgumentNullException(nameof(chars)); + } + for (int i = 0; i < chars.Length; i++) { _allowedCharsBitmap.AllowCharacter(chars[i]); @@ -100,8 +109,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter AllowFilter([NotNull] ICodePointFilter filter) + public CodePointFilter AllowFilter(ICodePointFilter filter) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } + foreach (var allowedCodePoint in filter.GetAllowedCodePoints()) { // If the code point can't be represented as a BMP character, skip it. @@ -120,8 +134,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter AllowRange([NotNull] UnicodeRange range) + public CodePointFilter AllowRange(UnicodeRange range) { + if (range == null) + { + throw new ArgumentNullException(nameof(range)); + } + int firstCodePoint = range.FirstCodePoint; int rangeSize = range.RangeSize; for (int i = 0; i < rangeSize; i++) @@ -197,8 +216,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter ForbidChars([NotNull] string chars) + public CodePointFilter ForbidChars(string chars) { + if (chars == null) + { + throw new ArgumentNullException(nameof(chars)); + } + for (int i = 0; i < chars.Length; i++) { _allowedCharsBitmap.ForbidCharacter(chars[i]); @@ -212,8 +236,13 @@ namespace Microsoft.Framework.WebEncoders /// /// The 'this' instance. /// - public CodePointFilter ForbidRange([NotNull] UnicodeRange range) + public CodePointFilter ForbidRange(UnicodeRange range) { + if (range == null) + { + throw new ArgumentNullException(nameof(range)); + } + int firstCodePoint = range.FirstCodePoint; int rangeSize = range.RangeSize; for (int i = 0; i < rangeSize; i++) diff --git a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs index 68b492f55a..5a0553e782 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -51,9 +50,13 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public HtmlEncoder([NotNull] ICodePointFilter filter) + public HtmlEncoder(ICodePointFilter filter) : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } } private HtmlEncoder(HtmlUnicodeEncoder innerEncoder) @@ -97,6 +100,16 @@ namespace Microsoft.Framework.WebEncoders /// public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } @@ -113,6 +126,16 @@ namespace Microsoft.Framework.WebEncoders /// public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } diff --git a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs index 16e4ff5f05..f7c6adb064 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -20,7 +18,7 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// - void HtmlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output); /// /// HTML-encodes a given input string. @@ -42,6 +40,6 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute /// as long as the attribute value is surrounded by single or double quotes. /// - void HtmlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); + void HtmlEncode(string value, int startIndex, int charCount, TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs index e88aafce79..19b7d843e2 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -19,7 +17,7 @@ namespace Microsoft.Framework.WebEncoders /// /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. /// - void JavaScriptStringEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output); /// /// JavaScript-escapes a given input string. @@ -37,6 +35,6 @@ namespace Microsoft.Framework.WebEncoders /// /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. /// - void JavaScriptStringEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); + void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs index 9b38b6a65e..edcaaffea8 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -20,7 +18,7 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// - void UrlEncode([NotNull] char[] value, int startIndex, int charCount, [NotNull] TextWriter output); + void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output); /// /// URL-escapes a given input string. @@ -41,6 +39,6 @@ namespace Microsoft.Framework.WebEncoders /// The encoded value is appropriately encoded for inclusion in the segment, query, or /// fragment portion of a URI. /// - void UrlEncode([NotNull] string value, int startIndex, int charCount, [NotNull] TextWriter output); + void UrlEncode(string value, int startIndex, int charCount, TextWriter output); } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs index 71e8a68246..6328bdebc1 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -51,9 +50,13 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public JavaScriptStringEncoder([NotNull] ICodePointFilter filter) + public JavaScriptStringEncoder(ICodePointFilter filter) : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } } private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder) @@ -97,6 +100,16 @@ namespace Microsoft.Framework.WebEncoders /// public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } @@ -113,6 +126,16 @@ namespace Microsoft.Framework.WebEncoders /// public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs index 0e0de56c7a..e15096659f 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Runtime.CompilerServices; using System.Threading; -using Microsoft.Framework.Internal; namespace Microsoft.Framework.WebEncoders { @@ -51,9 +50,13 @@ namespace Microsoft.Framework.WebEncoders /// set returned by 's /// method will be escaped. /// - public UrlEncoder([NotNull] ICodePointFilter filter) + public UrlEncoder(ICodePointFilter filter) : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) { + if (filter == null) + { + throw new ArgumentNullException(nameof(filter)); + } } private UrlEncoder(UrlUnicodeEncoder innerEncoder) @@ -97,6 +100,16 @@ namespace Microsoft.Framework.WebEncoders /// public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } @@ -113,6 +126,16 @@ namespace Microsoft.Framework.WebEncoders /// public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); } diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index b2ad614378..54dbd1c28e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -6,10 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "allowUnsafe": true - }, - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } + "allowUnsafe": true, + "warningsAsErrors": true }, "frameworks": { "net45": { }, diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs index 48e0e94c98..13505165d8 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -3,7 +3,6 @@ using System; using Microsoft.Framework.DependencyInjection.Extensions; -using Microsoft.Framework.Internal; using Microsoft.Framework.OptionsModel; using Microsoft.Framework.WebEncoders; @@ -11,13 +10,23 @@ namespace Microsoft.Framework.DependencyInjection { public static class EncoderServiceCollectionExtensions { - public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services) + public static IServiceCollection AddWebEncoders(this IServiceCollection services) { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + return AddWebEncoders(services, configureOptions: null); } - public static IServiceCollection AddWebEncoders([NotNull] this IServiceCollection services, Action configureOptions) + public static IServiceCollection AddWebEncoders(this IServiceCollection services, Action configureOptions) { + if (services == null) + { + throw new ArgumentNullException(nameof(services)); + } + services.AddOptions(); // Register the default encoders diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Framework.WebEncoders/project.json index d39cd992f4..d2a1c401fb 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Framework.WebEncoders/project.json @@ -5,10 +5,12 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "dependencies": { "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" }, "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs index 5006792814..e7e72d3ce5 100644 --- a/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CookieHeaderValue.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; -using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { @@ -23,13 +22,27 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public CookieHeaderValue([NotNull] string name) + public CookieHeaderValue(string name) : this(name, string.Empty) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } } - public CookieHeaderValue([NotNull] string name, [NotNull] string value) + public CookieHeaderValue(string name, string value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Name = name; Value = value; } @@ -219,16 +232,26 @@ namespace Microsoft.Net.Http.Headers return !(c == '"' || c == ',' || c == ';' || c == '\\'); } - internal static void CheckNameFormat([NotNull] string name, string parameterName) + internal static void CheckNameFormat(string name, string parameterName) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (HttpRuleParser.GetTokenLength(name, 0) != name.Length) { throw new ArgumentException("Invalid cookie name: " + name, parameterName); } } - internal static void CheckValueFormat([NotNull] string value, string parameterName) + internal static void CheckValueFormat(string value, string parameterName) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + string temp; if (GetCookieValueLength(value, 0, out temp) != value.Length) { diff --git a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs index 669ec464de..63f9b8aed0 100644 --- a/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/GenericHeaderParser.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.Internal; +using System; namespace Microsoft.Net.Http.Headers { @@ -11,9 +11,14 @@ namespace Microsoft.Net.Http.Headers private GetParsedValueLengthDelegate _getParsedValueLength; - internal GenericHeaderParser(bool supportsMultipleValues, [NotNull] GetParsedValueLengthDelegate getParsedValueLength) + internal GenericHeaderParser(bool supportsMultipleValues, GetParsedValueLengthDelegate getParsedValueLength) : base(supportsMultipleValues) { + if (getParsedValueLength == null) + { + throw new ArgumentNullException(nameof(getParsedValueLength)); + } + _getParsedValueLength = getParsedValueLength; } diff --git a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs index 52fdd46a36..92cf35a41f 100644 --- a/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/SetCookieHeaderValue.cs @@ -5,7 +5,6 @@ using System; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Text; -using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { @@ -33,13 +32,23 @@ namespace Microsoft.Net.Http.Headers // Used by the parser to create a new instance of this type. } - public SetCookieHeaderValue([NotNull] string name) + public SetCookieHeaderValue(string name) : this(name, string.Empty) { } - public SetCookieHeaderValue([NotNull] string name, [NotNull] string value) + public SetCookieHeaderValue(string name, string value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + Name = name; Value = value; } diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 37873c476c..2dfa0509ad 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Internal; namespace Microsoft.Net.Http.Headers { @@ -39,9 +38,19 @@ namespace Microsoft.Net.Http.Headers /// The first value to compare. /// The second value to compare /// The result of the comparison. - public int Compare([NotNull] StringWithQualityHeaderValue stringWithQuality1, - [NotNull] StringWithQualityHeaderValue stringWithQuality2) + public int Compare(StringWithQualityHeaderValue stringWithQuality1, + StringWithQualityHeaderValue stringWithQuality2) { + if (stringWithQuality1 == null) + { + throw new ArgumentNullException(nameof(stringWithQuality1)); + } + + if (stringWithQuality2 == null) + { + throw new ArgumentNullException(nameof(stringWithQuality2)); + } + var quality1 = stringWithQuality1.Quality ?? HeaderQuality.Match; var quality2 = stringWithQuality2.Quality ?? HeaderQuality.Match; var qualityDifference = quality1 - quality2; diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index ae39f93621..8bcba3ca6d 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,12 +1,12 @@ { "version": "1.0.0-*", - "dependencies": { - "Microsoft.Framework.NotNullAttribute.Sources": { "type": "build", "version": "1.0.0-*" } - }, "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, + "compilationOptions": { + "warningsAsErrors": true + }, "frameworks" : { "net45" : { }, "dnx451" : { }, diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index aaa4467fe9..03d885f7bc 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -43,10 +43,8 @@ namespace Microsoft.AspNet.Builder.Extensions var builder = new ApplicationBuilder(serviceProvider: null); var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapOptions(); - // TODO: [NotNull] Assert.Throws(() => builder.Map(null, ActionNotImplemented)); - // TODO: [NotNull] Assert.Throws(() => builder.Map("/foo", (Action)null)); - // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(null, noOptions)); - // TODO: [NotNull] Assert.Throws(() => new MapMiddleware(noMiddleware, null)); + Assert.Throws(() => builder.Map("/foo", configuration: null)); + Assert.Throws(() => new MapMiddleware(noMiddleware, null)); } [Theory] diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 0fcc04c997..4ddf45220d 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -11,9 +11,7 @@ using Xunit; namespace Microsoft.AspNet.Builder.Extensions { - using AppFunc = Func, Task>; using Predicate = Func; - using PredicateAsync = Func>; public class MapPredicateMiddlewareTests { @@ -56,15 +54,12 @@ namespace Microsoft.AspNet.Builder.Extensions var builder = new ApplicationBuilder(serviceProvider: null); var noMiddleware = new ApplicationBuilder(serviceProvider: null).Build(); var noOptions = new MapWhenOptions(); - // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); - // TODO: [NotNull] Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, (Action)null)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); - - // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(null, UseNotImplemented)); - // TODO: [NotNull] Assert.Throws(() => builder.MapWhenAsync(NotImplementedPredicateAsync, (Action)null)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); - // TODO: [NotNull] Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + Assert.Throws(() => builder.MapWhen(null, UseNotImplemented)); + Assert.Throws(() => builder.MapWhen(NotImplementedPredicate, configuration: null)); + Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); + Assert.Throws(() => new MapWhenMiddleware(null, noOptions)); + Assert.Throws(() => new MapWhenMiddleware(noMiddleware, null)); } [Fact] diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index db7e1f7f36..a48e80ea03 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -24,7 +24,6 @@ namespace Microsoft.AspNet.Http.Authentication.Internal [Theory] [InlineData("")] - [InlineData(null)] [InlineData("Foo")] public async Task ChallengeWithNoAuthMiddlewareMayThrow(string scheme) { From ceded805f32e3aca0066182fd96bbf171bd40574 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 18 Sep 2015 15:17:41 -0700 Subject: [PATCH 0750/1838] Formatting fixes --- .../Authentication/AuthenticationDescription.cs | 2 +- .../Authentication/AuthenticationProperties.cs | 2 +- .../FormFileExtensions.cs | 7 ++++--- .../RequestHeaders.cs | 2 +- .../ResponseHeaders.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 6 ++++-- src/Microsoft.AspNet.Http/ItemsDictionary.cs | 2 +- .../CacheControlHeaderValue.cs | 7 +++++-- .../ContentRangeHeaderValue.cs | 12 ++++++++++-- src/Microsoft.Net.Http.Headers/HeaderUtilities.cs | 5 ++++- src/Microsoft.Net.Http.Headers/HttpRuleParser.cs | 14 ++++++++++---- .../MediaTypeHeaderValueComparer.cs | 5 +++-- .../NameValueHeaderValue.cs | 10 ++++++++-- .../RangeItemHeaderValue.cs | 6 ++++-- .../StringWithQualityHeaderValueComparer.cs | 5 +++-- .../ContentDispositionHeaderValueTest.cs | 6 +++--- 16 files changed, 63 insertions(+), 30 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs index 0ee24024e5..d6f9bf08a7 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Http.Authentication /// /// Contains metadata about the authentication provider. /// - public IDictionary Items { get; private set; } + public IDictionary Items { get; } /// /// Gets or sets the name used to reference the authentication middleware instance. diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs index ab17713ab0..5c815ba37b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Http.Authentication /// /// State values about the authentication session. /// - public IDictionary Items { get; private set; } + public IDictionary Items { get; } /// /// Gets or sets whether the authentication session is persisted across multiple requests. diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs index 7b13bc2ac3..fa68ae340a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs @@ -40,9 +40,10 @@ namespace Microsoft.AspNet.Http /// /// The . /// The name of the file to create. - public async static Task SaveAsAsync(this IFormFile formFile, - string filename, - CancellationToken cancellationToken = default(CancellationToken)) + public async static Task SaveAsAsync( + this IFormFile formFile, + string filename, + CancellationToken cancellationToken = default(CancellationToken)) { if (formFile == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index efaa73fc14..4b31e30615 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -20,7 +20,7 @@ namespace Microsoft.AspNet.Http.Headers Headers = headers; } - public IHeaderDictionary Headers { get; private set; } + public IHeaderDictionary Headers { get; } public IList Accept { diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index de719d58ec..e7cb97ad3f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Http.Headers Headers = headers; } - public IHeaderDictionary Headers { get; private set; } + public IHeaderDictionary Headers { get; } public CacheControlHeaderValue CacheControl { diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 3e137acc2e..84143af242 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -18,7 +18,8 @@ namespace Microsoft.AspNet.Http.Extensions /// /// /// - public static string Encode(PathString pathBase = new PathString(), + public static string Encode( + PathString pathBase = new PathString(), PathString path = new PathString(), QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) @@ -38,7 +39,8 @@ namespace Microsoft.AspNet.Http.Extensions /// /// /// - public static string Encode(string scheme, + public static string Encode( + string scheme, HostString host, PathString pathBase = new PathString(), PathString path = new PathString(), diff --git a/src/Microsoft.AspNet.Http/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/ItemsDictionary.cs index e191516849..90e9cd3138 100644 --- a/src/Microsoft.AspNet.Http/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/ItemsDictionary.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Http.Internal Items = items; } - public IDictionary Items { get; private set; } + public IDictionary Items { get; } // Replace the indexer with one that returns null for missing values object IDictionary.this[object key] diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index c1940754ba..b8b6d2726c 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -390,7 +390,8 @@ namespace Microsoft.Net.Http.Headers return input.Length - startIndex; } - private static bool TrySetCacheControlValues(CacheControlHeaderValue cc, + private static bool TrySetCacheControlValues( + CacheControlHeaderValue cc, List nameValueList) { foreach (NameValueHeaderValue nameValue in nameValueList) @@ -477,7 +478,9 @@ namespace Microsoft.Net.Http.Headers return true; } - private static bool TrySetOptionalTokenList(NameValueHeaderValue nameValue, ref bool boolField, + private static bool TrySetOptionalTokenList( + NameValueHeaderValue nameValue, + ref bool boolField, ref ICollection destination) { Contract.Requires(nameValue != null); diff --git a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs index 092bb83320..c24b42758a 100644 --- a/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentRangeHeaderValue.cs @@ -340,8 +340,16 @@ namespace Microsoft.Net.Http.Headers return true; } - private static bool TryCreateContentRange(string input, string unit, int fromStartIndex, int fromLength, - int toStartIndex, int toLength, int lengthStartIndex, int lengthLength, out ContentRangeHeaderValue parsedValue) + private static bool TryCreateContentRange( + string input, + string unit, + int fromStartIndex, + int fromLength, + int toStartIndex, + int toLength, + int lengthStartIndex, + int lengthLength, + out ContentRangeHeaderValue parsedValue) { parsedValue = null; diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 630e02b93f..3885477aa1 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -163,7 +163,10 @@ namespace Microsoft.Net.Http.Headers return true; } - internal static int GetNextNonEmptyOrWhitespaceIndex(string input, int startIndex, bool skipEmptyValues, + internal static int GetNextNonEmptyOrWhitespaceIndex( + string input, + int startIndex, + bool skipEmptyValues, out bool separatorFound) { Contract.Requires(input != null); diff --git a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs index 188ffe1389..b1690e96fd 100644 --- a/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpRuleParser.cs @@ -35,8 +35,8 @@ namespace Microsoft.Net.Http.Headers internal const char CR = '\r'; internal const char LF = '\n'; - internal const char SP = ' '; - internal const char Tab = '\t'; + internal const char SP = ' '; + internal const char Tab = '\t'; internal const int MaxInt64Digits = 19; internal const int MaxInt32Digits = 10; @@ -263,8 +263,14 @@ namespace Microsoft.Net.Http.Headers // "(((((comment)))))". If we wouldn't define a limit an attacker could send a comment with hundreds of nested // comments, resulting in a stack overflow exception. In addition having more than 1 nested comment (if any) // is unusual. - private static HttpParseResult GetExpressionLength(string input, int startIndex, char openChar, - char closeChar, bool supportsNesting, ref int nestedCount, out int length) + private static HttpParseResult GetExpressionLength( + string input, + int startIndex, + char openChar, + char closeChar, + bool supportsNesting, + ref int nestedCount, + out int length) { Contract.Requires(input != null); Contract.Requires((startIndex >= 0) && (startIndex < input.Length)); diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs index a64b12e6b0..21ab21f71e 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValueComparer.cs @@ -79,8 +79,9 @@ namespace Microsoft.Net.Http.Headers return returnValue; } - private static int CompareBasedOnQualityFactor(MediaTypeHeaderValue mediaType1, - MediaTypeHeaderValue mediaType2) + private static int CompareBasedOnQualityFactor( + MediaTypeHeaderValue mediaType1, + MediaTypeHeaderValue mediaType2) { var mediaType1Quality = mediaType1.Quality ?? HeaderQuality.Match; var mediaType2Quality = mediaType2.Quality ?? HeaderQuality.Match; diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index f5b1c72435..3031d877c0 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -172,7 +172,10 @@ namespace Microsoft.Net.Http.Headers return _name; } - internal static void ToString(ICollection values, char separator, bool leadingSeparator, + internal static void ToString( + ICollection values, + char separator, + bool leadingSeparator, StringBuilder destination) { Contract.Assert(destination != null); @@ -275,7 +278,10 @@ namespace Microsoft.Net.Http.Headers // Returns the length of a name/value list, separated by 'delimiter'. E.g. "a=b, c=d, e=f" adds 3 // name/value pairs to 'nameValueCollection' if 'delimiter' equals ','. - internal static int GetNameValueListLength(string input, int startIndex, char delimiter, + internal static int GetNameValueListLength( + string input, + int startIndex, + char delimiter, ICollection nameValueCollection) { Contract.Requires(nameValueCollection != null); diff --git a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs index 772a1c923a..ce62e99f2a 100644 --- a/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/RangeItemHeaderValue.cs @@ -86,12 +86,14 @@ namespace Microsoft.Net.Http.Headers // Returns the length of a range list. E.g. "1-2, 3-4, 5-6" adds 3 ranges to 'rangeCollection'. Note that empty // list segments are allowed, e.g. ",1-2, , 3-4,,". - internal static int GetRangeItemListLength(string input, int startIndex, + internal static int GetRangeItemListLength( + string input, + int startIndex, ICollection rangeCollection) { Contract.Requires(rangeCollection != null); Contract.Requires(startIndex >= 0); - Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), + Contract.Ensures((Contract.Result() == 0) || (rangeCollection.Count > 0), "If we can parse the string, then we expect to have at least one range item."); if ((string.IsNullOrEmpty(input)) || (startIndex >= input.Length)) diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 2dfa0509ad..6dc3d0758a 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -38,8 +38,9 @@ namespace Microsoft.Net.Http.Headers /// The first value to compare. /// The second value to compare /// The result of the comparison. - public int Compare(StringWithQualityHeaderValue stringWithQuality1, - StringWithQualityHeaderValue stringWithQuality2) + public int Compare( + StringWithQualityHeaderValue stringWithQuality1, + StringWithQualityHeaderValue stringWithQuality2) { if (stringWithQuality1 == null) { diff --git a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs index 02e233a53d..89b1ab0f10 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/ContentDispositionHeaderValueTest.cs @@ -569,11 +569,11 @@ namespace Microsoft.Net.Http.Headers Valid = valid; } - public string Value { get; private set; } + public string Value { get; } - public string Description { get; private set; } + public string Description { get; } - public bool Valid { get; private set; } + public bool Valid { get; } } private void CheckValidParse(string input, ContentDispositionHeaderValue expectedResult) From 7816c0183e6ecedc5263cc7d06a815476de832d8 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sun, 20 Sep 2015 10:20:58 -0700 Subject: [PATCH 0751/1838] Removing Microsoft.Framework.Primitives from HttpAbstractions --- HttpAbstractions.sln | 30 -- .../Microsoft.Framework.Primitives.xproj | 20 -- .../Properties/AssemblyInfo.cs | 8 - .../StringValues.cs | 312 ------------------ .../project.json | 21 -- ...Microsoft.Framework.Primitives.Tests.xproj | 21 -- .../StringValuesTests.cs | 306 ----------------- .../project.json | 13 - 8 files changed, 731 deletions(-) delete mode 100644 src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj delete mode 100644 src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Framework.Primitives/StringValues.cs delete mode 100644 src/Microsoft.Framework.Primitives/project.json delete mode 100644 test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj delete mode 100644 test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs delete mode 100644 test/Microsoft.Framework.Primitives.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 39f29673eb..bbb59df0db 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -47,10 +47,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives", "src\Microsoft.Framework.Primitives\Microsoft.Framework.Primitives.xproj", "{E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.Primitives.Tests", "test\Microsoft.Framework.Primitives.Tests\Microsoft.Framework.Primitives.Tests.xproj", "{61F72E92-B3AE-4A10-B838-44F80AED40AE}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject Global @@ -267,30 +263,6 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.ActiveCfg = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Debug|x86.Build.0 = Debug|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Any CPU.Build.0 = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.ActiveCfg = Release|Any CPU - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A}.Release|x86.Build.0 = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Debug|x86.Build.0 = Debug|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Any CPU.Build.0 = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.ActiveCfg = Release|Any CPU - {61F72E92-B3AE-4A10-B838-44F80AED40AE}.Release|x86.Build.0 = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.Build.0 = Debug|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -327,8 +299,6 @@ Global {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} - {E5FACCD4-6327-43AA-80A9-AE6F4A3BFE6A} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {61F72E92-B3AE-4A10-B838-44F80AED40AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj b/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj deleted file mode 100644 index f7b40aaa14..0000000000 --- a/src/Microsoft.Framework.Primitives/Microsoft.Framework.Primitives.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - - e5faccd4-6327-43aa-80a9-ae6f4a3bfe6a - Microsoft.AspNet.Primitives - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - - 2.0 - - - diff --git a/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs deleted file mode 100644 index b2437d9ad6..0000000000 --- a/src/Microsoft.Framework.Primitives/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.Primitives/StringValues.cs b/src/Microsoft.Framework.Primitives/StringValues.cs deleted file mode 100644 index 79a8e6d006..0000000000 --- a/src/Microsoft.Framework.Primitives/StringValues.cs +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; - -namespace Microsoft.Framework.Primitives -{ - /// - /// Represents zero/null, one, or many strings in an efficient way. - /// - public struct StringValues : IList, IReadOnlyList - { - private static readonly string[] EmptyArray = new string[0]; - public static readonly StringValues Empty = new StringValues(EmptyArray); - - private readonly string _value; - private readonly string[] _values; - - public StringValues(string value) - { - _value = value; - _values = null; - } - - public StringValues(string[] values) - { - _value = null; - _values = values; - } - - public static implicit operator StringValues(string value) - { - return new StringValues(value); - } - - public static implicit operator StringValues(string[] values) - { - return new StringValues(values); - } - - public static implicit operator string (StringValues values) - { - return values.GetStringValue(); - } - - public static implicit operator string[] (StringValues value) - { - return value.GetArrayValue(); - } - - public int Count => _values?.Length ?? (_value != null ? 1 : 0); - - bool ICollection.IsReadOnly - { - get { return true; } - } - - string IList.this[int index] - { - get { return this[index]; } - set { throw new NotSupportedException(); } - } - - public string this[int index] - { - get - { - if (_values != null) - { - return _values[index]; // may throw - } - if (index == 0 && _value != null) - { - return _value; - } - return EmptyArray[0]; // throws - } - } - - public override string ToString() - { - return GetStringValue() ?? string.Empty; - } - - private string GetStringValue() - { - if (_values == null) - { - return _value; - } - switch (_values.Length) - { - case 0: return null; - case 1: return _values[0]; - default: return string.Join(",", _values); - } - } - - public string[] ToArray() - { - return GetArrayValue() ?? EmptyArray; - } - - private string[] GetArrayValue() - { - if (_value != null) - { - return new[] { _value }; - } - return _values; - } - - int IList.IndexOf(string item) - { - return IndexOf(item); - } - - private int IndexOf(string item) - { - if (_values != null) - { - var values = _values; - for (int i = 0; i < values.Length; i++) - { - if (string.Equals(values[i], item, StringComparison.Ordinal)) - { - return i; - } - } - return -1; - } - - if (_value != null) - { - return string.Equals(_value, item, StringComparison.Ordinal) ? 0 : -1; - } - - return -1; - } - - bool ICollection.Contains(string item) - { - return IndexOf(item) >= 0; - } - - void ICollection.CopyTo(string[] array, int arrayIndex) - { - CopyTo(array, arrayIndex); - } - - private void CopyTo(string[] array, int arrayIndex) - { - if (_values != null) - { - Array.Copy(_values, 0, array, arrayIndex, _values.Length); - return; - } - - if (_value != null) - { - if (array == null) - { - throw new ArgumentNullException(nameof(array)); - } - if (arrayIndex < 0) - { - throw new ArgumentOutOfRangeException(nameof(arrayIndex)); - } - if (array.Length - arrayIndex < 1) - { - throw new ArgumentException( - $"'{nameof(array)}' is not long enough to copy all the items in the collection. Check '{nameof(arrayIndex)}' and '{nameof(array)}' length."); - } - - array[arrayIndex] = _value; - } - } - - void ICollection.Add(string item) - { - throw new NotSupportedException(); - } - - void IList.Insert(int index, string item) - { - throw new NotSupportedException(); - } - - bool ICollection.Remove(string item) - { - throw new NotSupportedException(); - } - - void IList.RemoveAt(int index) - { - throw new NotSupportedException(); - } - - void ICollection.Clear() - { - throw new NotSupportedException(); - } - - public Enumerator GetEnumerator() - { - return new Enumerator(this); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - - public static bool IsNullOrEmpty(StringValues value) - { - if (value._values == null) - { - return string.IsNullOrEmpty(value._value); - } - switch (value._values.Length) - { - case 0: return true; - case 1: return string.IsNullOrEmpty(value._values[0]); - default: return false; - } - } - - public static StringValues Concat(StringValues values1, StringValues values2) - { - var count1 = values1.Count; - var count2 = values2.Count; - - if (count1 == 0) - { - return values2; - } - - if (count2 == 0) - { - return values1; - } - - var combined = new string[count1 + count2]; - values1.CopyTo(combined, 0); - values2.CopyTo(combined, count1); - return new StringValues(combined); - } - - public struct Enumerator : IEnumerator - { - private readonly StringValues _values; - private string _current; - private int _index; - - public Enumerator(StringValues values) - { - _values = values; - _current = null; - _index = 0; - } - - public bool MoveNext() - { - var values = _values._values; - if (values != null) - { - if (_index < values.Length) - { - _current = values[_index]; - _index++; - return true; - } - - _current = null; - return false; - } - - var value = _values._value; - if (value != null && _index == 0) - { - _current = value; - _index = -1; // sentinel value - return true; - } - - _current = null; - return false; - } - - public string Current => _current; - - object IEnumerator.Current => _current; - - void IEnumerator.Reset() - { - _current = null; - _index = 0; - } - - void IDisposable.Dispose() - { - } - } - } -} diff --git a/src/Microsoft.Framework.Primitives/project.json b/src/Microsoft.Framework.Primitives/project.json deleted file mode 100644 index 4957eeb224..0000000000 --- a/src/Microsoft.Framework.Primitives/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "Contains primitive types such as StringValues.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "frameworks": { - "net451": { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Resources.ResourceManager": "4.0.1-beta-" - } - } - } -} diff --git a/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj b/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj deleted file mode 100644 index f1a2ba4182..0000000000 --- a/test/Microsoft.Framework.Primitives.Tests/Microsoft.Framework.Primitives.Tests.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 61f72e92-b3ae-4a10-b838-44f80aed40ae - Microsoft.AspNet.Primitives.Tests - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs b/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs deleted file mode 100644 index 184fa3f7da..0000000000 --- a/test/Microsoft.Framework.Primitives.Tests/StringValuesTests.cs +++ /dev/null @@ -1,306 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using Xunit; - -namespace Microsoft.Framework.Primitives -{ - public class StringValuesTests - { - public static TheoryData DefaultOrNullStringValues - { - get - { - return new TheoryData - { - new StringValues(), - new StringValues((string)null), - new StringValues((string[])null), - (string)null, - (string[])null - }; - } - } - - public static TheoryData EmptyStringValues - { - get - { - return new TheoryData - { - StringValues.Empty, - new StringValues(new string[0]), - new string[0] - }; - } - } - - public static TheoryData FilledStringValues - { - get - { - return new TheoryData - { - new StringValues("abc"), - new StringValues(new[] { "abc" }), - new StringValues(new[] { "abc", "bcd" }), - new StringValues(new[] { "abc", "bcd", "foo" }), - "abc", - new[] { "abc" }, - new[] { "abc", "bcd" }, - new[] { "abc", "bcd", "foo" } - }; - } - } - - public static TheoryData FilledStringValuesWithExpected - { - get - { - return new TheoryData - { - { new StringValues("abc"), new[] { "abc" } }, - { new StringValues(new[] { "abc" }), new[] { "abc" } }, - { new StringValues(new[] { "abc", "bcd" }), new[] { "abc", "bcd" } }, - { new StringValues(new[] { "abc", "bcd", "foo" }), new[] { "abc", "bcd", "foo" } }, - { "abc", new[] { "abc" } }, - { new[] { "abc" }, new[] { "abc" } }, - { new[] { "abc", "bcd" }, new[] { "abc", "bcd" } }, - { new[] { "abc", "bcd", "foo" }, new[] { "abc", "bcd", "foo" } } - }; - } - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - [MemberData(nameof(FilledStringValues))] - public void IsReadOnly_True(StringValues stringValues) - { - Assert.True(((IList)stringValues).IsReadOnly); - Assert.Throws(() => ((IList)stringValues)[0] = string.Empty); - Assert.Throws(() => ((ICollection)stringValues).Add(string.Empty)); - Assert.Throws(() => ((IList)stringValues).Insert(0, string.Empty)); - Assert.Throws(() => ((ICollection)stringValues).Remove(string.Empty)); - Assert.Throws(() => ((IList)stringValues).RemoveAt(0)); - Assert.Throws(() => ((ICollection)stringValues).Clear()); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - public void DefaultOrNull_ExpectedValues(StringValues stringValues) - { - Assert.Null((string[])stringValues); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - public void DefaultNullOrEmpty_ExpectedValues(StringValues stringValues) - { - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Equal((string)null, stringValues); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(new string[0], stringValues.ToArray()); - - Assert.True(StringValues.IsNullOrEmpty(stringValues)); - Assert.Throws(() => stringValues[0]); - Assert.Throws(() => ((IList)stringValues)[0]); - Assert.Equal(string.Empty, stringValues.ToString()); - Assert.Equal(-1, ((IList)stringValues).IndexOf(null)); - Assert.Equal(-1, ((IList)stringValues).IndexOf(string.Empty)); - Assert.Equal(-1, ((IList)stringValues).IndexOf("not there")); - Assert.False(((ICollection)stringValues).Contains(null)); - Assert.False(((ICollection)stringValues).Contains(string.Empty)); - Assert.False(((ICollection)stringValues).Contains("not there")); - Assert.Equal(0, stringValues.Count()); - } - - [Fact] - public void ImplicitStringConverter_Works() - { - string nullString = null; - StringValues stringValues = nullString; - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Null((string[])stringValues); - - string aString = "abc"; - stringValues = aString; - Assert.Equal(1, stringValues.Count); - Assert.Equal(aString, stringValues); - Assert.Equal(aString, stringValues[0]); - Assert.Equal(aString, ((IList)stringValues)[0]); - Assert.Equal(new string[] { aString }, stringValues); - } - - [Fact] - public void ImplicitStringArrayConverter_Works() - { - string[] nullStringArray = null; - StringValues stringValues = nullStringArray; - Assert.Equal(0, stringValues.Count); - Assert.Null((string)stringValues); - Assert.Null((string[])stringValues); - - string aString = "abc"; - string[] aStringArray = new[] { aString }; - stringValues = aStringArray; - Assert.Equal(1, stringValues.Count); - Assert.Equal(aString, stringValues); - Assert.Equal(aString, stringValues[0]); - Assert.Equal(aString, ((IList)stringValues)[0]); - Assert.Equal(aStringArray, stringValues); - - aString = "abc"; - string bString = "bcd"; - aStringArray = new[] { aString, bString }; - stringValues = aStringArray; - Assert.Equal(2, stringValues.Count); - Assert.Equal("abc,bcd", stringValues); - Assert.Equal(aStringArray, stringValues); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - public void DefaultNullOrEmpty_Enumerator(StringValues stringValues) - { - var e = stringValues.GetEnumerator(); - Assert.Null(e.Current); - Assert.False(e.MoveNext()); - Assert.Null(e.Current); - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - - var e1 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e1.Current); - Assert.False(e1.MoveNext()); - Assert.Null(e1.Current); - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - - var e2 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e2.Current); - Assert.False(e2.MoveNext()); - Assert.Null(e2.Current); - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void Enumerator(StringValues stringValues, string[] expected) - { - var e = stringValues.GetEnumerator(); - Assert.Null(e.Current); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(e.MoveNext()); - Assert.Equal(expected[i], e.Current); - } - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - Assert.False(e.MoveNext()); - - var e1 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e1.Current); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(e1.MoveNext()); - Assert.Equal(expected[i], e1.Current); - } - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - Assert.False(e1.MoveNext()); - - var e2 = ((IEnumerable)stringValues).GetEnumerator(); - Assert.Null(e2.Current); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(e2.MoveNext()); - Assert.Equal(expected[i], e2.Current); - } - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - Assert.False(e2.MoveNext()); - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void IndexOf(StringValues stringValues, string[] expected) - { - IList list = stringValues; - Assert.Equal(-1, list.IndexOf("not there")); - for (int i = 0; i < expected.Length; i++) - { - Assert.Equal(i, list.IndexOf(expected[i])); - } - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void Contains(StringValues stringValues, string[] expected) - { - ICollection collection = stringValues; - Assert.False(collection.Contains("not there")); - for (int i = 0; i < expected.Length; i++) - { - Assert.True(collection.Contains(expected[i])); - } - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void CopyTo(StringValues stringValues, string[] expected) - { - ICollection collection = stringValues; - - string[] tooSmall = new string[0]; - Assert.Throws(() => collection.CopyTo(tooSmall, 0)); - - string[] actual = new string[expected.Length]; - Assert.Throws(() => collection.CopyTo(actual, -1)); - Assert.Throws(() => collection.CopyTo(actual, actual.Length + 1)); - collection.CopyTo(actual, 0); - Assert.Equal(expected, actual); - } - - [Theory] - [MemberData(nameof(DefaultOrNullStringValues))] - [MemberData(nameof(EmptyStringValues))] - public void DefaultNullOrEmpty_Concat(StringValues stringValues) - { - string[] expected = new[] { "abc", "bcd", "foo" }; - Assert.Equal(expected, StringValues.Concat(stringValues, new StringValues(expected))); - Assert.Equal(expected, StringValues.Concat(new StringValues(expected), stringValues)); - - string[] empty = new string[0]; - Assert.Equal(empty, StringValues.Concat(stringValues, StringValues.Empty)); - Assert.Equal(empty, StringValues.Concat(StringValues.Empty, stringValues)); - Assert.Equal(empty, StringValues.Concat(stringValues, new StringValues())); - Assert.Equal(empty, StringValues.Concat(new StringValues(), stringValues)); - } - - [Theory] - [MemberData(nameof(FilledStringValuesWithExpected))] - public void Concat(StringValues stringValues, string[] array) - { - string[] filled = new[] { "abc", "bcd", "foo" }; - - string[] expectedPrepended = array.Concat(filled).ToArray(); - Assert.Equal(expectedPrepended, StringValues.Concat(stringValues, new StringValues(filled))); - - string[] expectedAppended = filled.Concat(array).ToArray(); - Assert.Equal(expectedAppended, StringValues.Concat(new StringValues(filled), stringValues)); - } - } -} diff --git a/test/Microsoft.Framework.Primitives.Tests/project.json b/test/Microsoft.Framework.Primitives.Tests/project.json deleted file mode 100644 index 1a5837820c..0000000000 --- a/test/Microsoft.Framework.Primitives.Tests/project.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "dependencies": { - "Microsoft.Framework.Primitives": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} From 285da613e462d996c0e090ee1a614bd0a866d01c Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 22 Sep 2015 08:46:48 -0700 Subject: [PATCH 0752/1838] #358 Redo port, add default address. --- .../Internal/HostingEngine.cs | 16 +++++++++++----- .../HostingEngineTests.cs | 19 ++++++++++++++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 28b72659d2..986def36af 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -191,13 +191,19 @@ namespace Microsoft.AspNet.Hosting.Internal var builder = builderFactory.CreateBuilder(_serverInstance); builder.ApplicationServices = _applicationServices; - var port = _config[ServerPort]; - if (!string.IsNullOrEmpty(port)) + var addresses = builder.ServerFeatures?.Get()?.Addresses; + if (addresses != null && !addresses.IsReadOnly) { - var addresses = builder.ServerFeatures.Get()?.Addresses; - if (addresses != null && !addresses.IsReadOnly) + var port = _config[ServerPort]; + if (!string.IsNullOrEmpty(port)) { - addresses.Add(port); + addresses.Add("http://localhost:" + port); + } + + // Provide a default address if there aren't any configured. + if (addresses.Count == 0) + { + addresses.Add("http://localhost:5000"); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 16fbe6149a..ded586de90 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -92,7 +92,24 @@ namespace Microsoft.AspNet.Hosting var host = CreateBuilder(config).Build(); var app = host.Start(); Assert.NotNull(host.ApplicationServices.GetRequiredService()); - Assert.Equal("abc123", app.ServerFeatures.Get().Addresses.First()); + Assert.Equal("http://localhost:abc123", app.ServerFeatures.Get().Addresses.First()); + } + + [Fact] + public void CanDefaultAddresseIfNotConfigured() + { + var vals = new Dictionary + { + { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" } + }; + + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + var host = CreateBuilder(config).Build(); + var app = host.Start(); + Assert.NotNull(host.ApplicationServices.GetRequiredService()); + Assert.Equal("http://localhost:5000", app.ServerFeatures.Get().Addresses.First()); } [Fact] From 49520a2a73251a9f718743df4a43d26514021767 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 23 Sep 2015 13:33:07 -0700 Subject: [PATCH 0753/1838] Switch to IServiceProvidersFeature for RequestServices --- .../RequestServicesContainerFeature.cs | 70 +++++++++++++ .../RequestServicesContainerMiddleware.cs | 31 +++--- .../TestServerTests.cs | 99 +++++++++++++++++++ 3 files changed, 182 insertions(+), 18 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs new file mode 100644 index 0000000000..4edc13392b --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs @@ -0,0 +1,70 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class RequestServicesFeature : IServiceProvidersFeature, IDisposable + { + private IServiceProvider _appServices; + private IServiceProvider _requestServices; + private IServiceScope _scope; + private bool _requestServicesSet; + + public RequestServicesFeature(IServiceProvider applicationServices) + { + if (applicationServices == null) + { + throw new ArgumentNullException(nameof(applicationServices)); + } + + ApplicationServices = applicationServices; + } + + public IServiceProvider ApplicationServices + { + get + { + return _appServices; + } + set + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + _appServices = value; + } + } + + public IServiceProvider RequestServices + { + get + { + if (!_requestServicesSet) + { + _scope = ApplicationServices.GetRequiredService().CreateScope(); + _requestServices = _scope.ServiceProvider; + _requestServicesSet = true; + } + return _requestServices; + } + + set + { + _requestServicesSet = true; + RequestServices = value; + } + } + + public void Dispose() + { + _scope?.Dispose(); + _scope = null; + _requestServices = null; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs index ab3fda31ab..25949db506 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -5,6 +5,8 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Framework.DependencyInjection; namespace Microsoft.AspNet.Hosting.Internal @@ -20,7 +22,6 @@ namespace Microsoft.AspNet.Hosting.Internal { throw new ArgumentNullException(nameof(next)); } - if (services == null) { throw new ArgumentNullException(nameof(services)); @@ -37,32 +38,26 @@ namespace Microsoft.AspNet.Hosting.Internal throw new ArgumentNullException(nameof(httpContext)); } - // All done if there request services is set - if (httpContext.RequestServices != null) + var existingFeature = httpContext.Features.Get(); + + // All done if request services is set + if (existingFeature?.RequestServices != null) { await _next.Invoke(httpContext); return; } - var priorApplicationServices = httpContext.ApplicationServices; - var serviceProvider = priorApplicationServices ?? _services; - var scopeFactory = serviceProvider.GetRequiredService(); - - try + using (var feature = new RequestServicesFeature(_services)) { - // Creates the scope and temporarily swap services - using (var scope = scopeFactory.CreateScope()) + try { - httpContext.ApplicationServices = serviceProvider; - httpContext.RequestServices = scope.ServiceProvider; - + httpContext.Features.Set(feature); await _next.Invoke(httpContext); } - } - finally - { - httpContext.RequestServices = null; - httpContext.ApplicationServices = priorApplicationServices; + finally + { + httpContext.Features.Set(existingFeature); + } } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index ed4bc90a05..a41a9141f8 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -11,6 +11,8 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; @@ -133,6 +135,103 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Found:True", result); } + [Fact] + public async Task SettingApplicationServicesOnFeatureToNullThrows() + { + var server = TestServer.Create(app => + { + app.Run(context => + { + var feature = context.Features.Get(); + Assert.Throws(() => feature.ApplicationServices = null); + return context.Response.WriteAsync("Success"); + }); + }); + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("Success", result); + } + + public class ReplaceServiceProvidersFeatureFilter : IStartupFilter, IServiceProvidersFeature + { + public ReplaceServiceProvidersFeatureFilter(IServiceProvider appServices, IServiceProvider requestServices) + { + ApplicationServices = appServices; + RequestServices = requestServices; + } + + public IServiceProvider ApplicationServices { get; set; } + + public IServiceProvider RequestServices { get; set; } + + public Action Configure(Action next) + { + return app => + { + app.Use(async (context, nxt) => + { + context.Features.Set(this); + await nxt(); + }); + next(app); + }; + } + } + + [Fact] + public async Task ExistingServiceProviderFeatureWillNotBeReplaced() + { + var appServices = new ServiceCollection().BuildServiceProvider(); + var server = TestServer.Create(app => + { + app.Run(context => + { + Assert.Equal(appServices, context.ApplicationServices); + Assert.Equal(appServices, context.RequestServices); + return context.Response.WriteAsync("Success"); + }); + }, + services => services.AddInstance(new ReplaceServiceProvidersFeatureFilter(appServices, appServices))); + var result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("Success", result); + } + + public class NullServiceProvidersFeatureFilter : IStartupFilter, IServiceProvidersFeature + { + public IServiceProvider ApplicationServices { get; set; } + + public IServiceProvider RequestServices { get; set; } + + public Action Configure(Action next) + { + return app => + { + app.Use(async (context, nxt) => + { + context.Features.Set(this); + await nxt(); + }); + next(app); + }; + } + } + + [Fact] + public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() + { + var server = TestServer.Create(app => + { + app.Run(context => + { + Assert.NotNull(context.ApplicationServices); + Assert.NotNull(context.RequestServices); + return context.Response.WriteAsync("Success"); + }); + }, + services => services.AddTransient()); + var result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("Success", result); + } + public class EnsureApplicationServicesFilter : IStartupFilter { public Action Configure(Action next) From 38bd9f423237b64e64914949d9c7081ba5ab7582 Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Wed, 23 Sep 2015 23:54:17 +0300 Subject: [PATCH 0754/1838] Add project.json description --- src/Microsoft.Net.Http.Headers/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 8bcba3ca6d..effac85e1f 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP header implementations.", "repository": { "type": "git", "url": "git://github.com/aspnet/httpabstractions" From 3a8ecc7d4a33fb41d4d4ce63ef9fed2c45ae592d Mon Sep 17 00:00:00 2001 From: Brennan Date: Wed, 23 Sep 2015 14:46:52 -0700 Subject: [PATCH 0755/1838] Add Dictionary and List dependency to dnxcore50 --- src/Microsoft.AspNet.WebUtilities/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 621e8c5954..88b039b752 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -16,6 +16,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { + "System.Collections": "4.0.11-beta-*", "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.IO.FileSystem": "4.0.1-beta-*", From 551da3e5587d31f4de13bcda0bdf9a36662a2df6 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 23 Sep 2015 14:28:36 -0700 Subject: [PATCH 0756/1838] Caption => DisplayName --- .../Authentication/AuthenticationDescription.cs | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs index d6f9bf08a7..d1f39811ea 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.Framework.Internal; namespace Microsoft.AspNet.Http.Authentication { @@ -13,7 +12,7 @@ namespace Microsoft.AspNet.Http.Authentication /// public class AuthenticationDescription { - private const string CaptionPropertyKey = "Caption"; + private const string DisplayNamePropertyKey = "DisplayName"; private const string AuthenticationSchemePropertyKey = "AuthenticationScheme"; /// @@ -50,10 +49,10 @@ namespace Microsoft.AspNet.Http.Authentication /// /// Gets or sets the display name for the authentication provider. /// - public string Caption + public string DisplayName { - get { return GetString(CaptionPropertyKey); } - set { Items[CaptionPropertyKey] = value; } + get { return GetString(DisplayNamePropertyKey); } + set { Items[DisplayNamePropertyKey] = value; } } private string GetString(string name) From cde733a63a0ddb26df5fa2a1fc629c2c98f0aa4e Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Wed, 23 Sep 2015 12:53:00 -0700 Subject: [PATCH 0757/1838] Enabling NuGetPackageVerifier --- NuGetPackageVerifier.json | 29 +++++++++++++++++++ .../Properties/AssemblyInfo.cs | 8 +++++ 2 files changed, 37 insertions(+) create mode 100644 NuGetPackageVerifier.json create mode 100644 src/Microsoft.AspNet.Server.Testing/Properties/AssemblyInfo.cs diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json new file mode 100644 index 0000000000..c599e23fea --- /dev/null +++ b/NuGetPackageVerifier.json @@ -0,0 +1,29 @@ +{ + "adx": { // Packages written by the ADX team and that ship on NuGet.org + "rules": [ + "AssemblyHasDocumentFileRule", + "AssemblyHasVersionAttributesRule", + "AssemblyHasServicingAttributeRule", + "AssemblyHasNeutralResourcesLanguageAttributeRule", + "SatellitePackageRule", + "StrictSemanticVersionValidationRule" + ], + "packages": { + "Microsoft.AspNet.Hosting": { }, + "Microsoft.AspNet.Hosting.Abstractions": { }, + "Microsoft.AspNet.Hosting.Server.Abstractions": { }, + "Microsoft.AspNet.Server.Testing": { }, + "Microsoft.AspNet.TestHost": { } + } + }, + "Default": { // Rules to run for packages not listed in any other set. + "rules": [ + "AssemblyHasDocumentFileRule", + "AssemblyHasVersionAttributesRule", + "AssemblyHasServicingAttributeRule", + "AssemblyHasNeutralResourcesLanguageAttributeRule", + "SatellitePackageRule", + "StrictSemanticVersionValidationRule" + ] + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Server.Testing/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..aab4e278a4 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] From d82bc7ca9dd6decdc222f1537c17d77d2c00dc86 Mon Sep 17 00:00:00 2001 From: Ajay Bhargav Baaskaran Date: Wed, 23 Sep 2015 12:57:35 -0700 Subject: [PATCH 0758/1838] Enabling NuGetPackageVerifier --- NuGetPackageVerifier.json | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 NuGetPackageVerifier.json diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json new file mode 100644 index 0000000000..6d1698dfd4 --- /dev/null +++ b/NuGetPackageVerifier.json @@ -0,0 +1,34 @@ +{ + "adx": { // Packages written by the ADX team and that ship on NuGet.org + "rules": [ + "AssemblyHasDocumentFileRule", + "AssemblyHasVersionAttributesRule", + "AssemblyHasServicingAttributeRule", + "AssemblyHasNeutralResourcesLanguageAttributeRule", + "SatellitePackageRule", + "StrictSemanticVersionValidationRule" + ], + "packages": { + "Microsoft.AspNet.Html.Abstractions": { }, + "Microsoft.AspNet.Http": { }, + "Microsoft.AspNet.Http.Abstractions": { }, + "Microsoft.AspNet.Http.Extensions": { }, + "Microsoft.AspNet.Http.Features": { }, + "Microsoft.AspNet.Owin": { }, + "Microsoft.AspNet.WebUtilities": { }, + "Microsoft.Framework.WebEncoders": { }, + "Microsoft.Framework.WebEncoders.Core": { }, + "Microsoft.Net.Http.Headers": { } + } + }, + "Default": { // Rules to run for packages not listed in any other set. + "rules": [ + "AssemblyHasDocumentFileRule", + "AssemblyHasVersionAttributesRule", + "AssemblyHasServicingAttributeRule", + "AssemblyHasNeutralResourcesLanguageAttributeRule", + "SatellitePackageRule", + "StrictSemanticVersionValidationRule" + ] + } +} \ No newline at end of file From 520fc2b5fdee91c7bded01dbade2cfdf18ff412b Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 24 Sep 2015 17:09:29 -0700 Subject: [PATCH 0759/1838] Fixed stack overflow when setting RequestServices - Added tests --- .../RequestServicesContainerFeature.cs | 2 +- .../TestServerTests.cs | 26 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs index 4edc13392b..6a0972fe58 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs @@ -55,8 +55,8 @@ namespace Microsoft.AspNet.Hosting.Internal set { + _requestServices = value; _requestServicesSet = true; - RequestServices = value; } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index a41a9141f8..174b29c092 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -151,6 +151,31 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Success", result); } + [Fact] + public async Task CanSetCustomServiceProvider() + { + var server = TestServer.Create(app => + { + app.Run(context => + { + context.ApplicationServices = new ServiceCollection() + .AddTransient() + .BuildServiceProvider(); + + context.RequestServices = new ServiceCollection() + .AddTransient() + .BuildServiceProvider(); + + var s1 = context.ApplicationServices.GetRequiredService(); + var s2 = context.RequestServices.GetRequiredService(); + + return context.Response.WriteAsync("Success"); + }); + }); + string result = await server.CreateClient().GetStringAsync("/path"); + Assert.Equal("Success", result); + } + public class ReplaceServiceProvidersFeatureFilter : IStartupFilter, IServiceProvidersFeature { public ReplaceServiceProvidersFeatureFilter(IServiceProvider appServices, IServiceProvider requestServices) @@ -232,6 +257,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Success", result); } + public class EnsureApplicationServicesFilter : IStartupFilter { public Action Configure(Action next) From a9e7948d726c1d66dd5a7865ebcb4f60a6ec6c0d Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 23 Sep 2015 20:54:42 -0700 Subject: [PATCH 0760/1838] #77 Catch startup exceptions and show them in the browser. --- .../Internal/HostingEngine.cs | 110 +++- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- .../Startup/StartupExceptionPage.cs | 520 ++++++++++++++++++ .../WebHostBuilder.cs | 10 +- .../resources/Compilation_Exception.html | 6 + .../compiler/resources/GenericError.html | 151 +++++ .../resources/GenericError_Exception.html | 8 + .../resources/GenericError_Footer.html | 3 + .../resources/GenericError_Message.html | 3 + src/Microsoft.AspNet.Hosting/project.json | 4 +- .../Fakes/RuntimeEnvironment.cs | 20 + .../Fakes/StartupConfigureServicesThrows.cs | 22 + .../Fakes/StartupConfigureThrows.cs | 21 + .../Fakes/StartupCtorThrows.cs | 20 + .../Fakes/StartupStaticCtorThrows.cs | 20 + .../WebHostBuilderTests.cs | 115 +++- 16 files changed, 1001 insertions(+), 34 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs create mode 100644 src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html create mode 100644 src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html create mode 100644 src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Exception.html create mode 100644 src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Footer.html create mode 100644 src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Message.html create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupCtorThrows.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 986def36af..97bdc06e23 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -14,6 +14,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Server.Features; +using Microsoft.Dnx.Runtime; using Microsoft.Framework.Configuration; using Microsoft.Framework.DependencyInjection; using Microsoft.Framework.Logging; @@ -24,11 +25,13 @@ namespace Microsoft.AspNet.Hosting.Internal { // This is defined by IIS's HttpPlatformHandler. private static readonly string ServerPort = "HTTP_PLATFORM_PORT"; + private static readonly string DetailedErrors = "Hosting:DetailedErrors"; private readonly IServiceCollection _applicationServiceCollection; private readonly IStartupLoader _startupLoader; private readonly ApplicationLifetime _applicationLifetime; private readonly IConfiguration _config; + private readonly bool _captureStartupErrors; private IServiceProvider _applicationServices; @@ -45,7 +48,8 @@ namespace Microsoft.AspNet.Hosting.Internal public HostingEngine( IServiceCollection appServices, IStartupLoader startupLoader, - IConfiguration config) + IConfiguration config, + bool captureStartupErrors) { if (appServices == null) { @@ -65,6 +69,7 @@ namespace Microsoft.AspNet.Hosting.Internal _config = config; _applicationServiceCollection = appServices; _startupLoader = startupLoader; + _captureStartupErrors = captureStartupErrors; _applicationLifetime = new ApplicationLifetime(); } @@ -79,8 +84,6 @@ namespace Microsoft.AspNet.Hosting.Internal public virtual IApplication Start() { - EnsureApplicationServices(); - var application = BuildApplication(); var logger = _applicationServices.GetRequiredService>(); @@ -174,6 +177,67 @@ namespace Microsoft.AspNet.Hosting.Internal } private RequestDelegate BuildApplication() + { + try + { + EnsureApplicationServices(); + EnsureServer(); + + var builderFactory = _applicationServices.GetRequiredService(); + var builder = builderFactory.CreateBuilder(_serverInstance); + builder.ApplicationServices = _applicationServices; + + var startupFilters = _applicationServices.GetService>(); + var configure = Startup.ConfigureDelegate; + foreach (var filter in startupFilters) + { + configure = filter.Configure(configure); + } + + configure(builder); + + return builder.Build(); + } + catch (Exception ex) + { + if (!_captureStartupErrors) + { + throw; + } + + // EnsureApplicationServices may have failed due to a missing or throwing Startup class. + if (_applicationServices == null) + { + _applicationServices = _applicationServiceCollection.BuildServiceProvider(); + } + + EnsureServer(); + + // Write errors to standard out so they can be retrieved when not in development mode. + Console.Out.WriteLine("Application startup exception: " + ex.ToString()); + var logger = _applicationServices.GetRequiredService>(); + logger.LogError("Application startup exception", ex); + + // Generate an HTML error page. + var runtimeEnv = _applicationServices.GetRequiredService(); + var hostingEnv = _applicationServices.GetRequiredService(); + var showDetailedErrors = hostingEnv.IsDevelopment() + || string.Equals("true", _config[DetailedErrors], StringComparison.OrdinalIgnoreCase) + || string.Equals("1", _config[DetailedErrors], StringComparison.OrdinalIgnoreCase); + var errorBytes = StartupExceptionPage.GenerateErrorHtml(showDetailedErrors, runtimeEnv, ex); + + return context => + { + context.Response.StatusCode = 500; + context.Response.Headers["Cache-Control"] = "private, max-age=0"; + context.Response.ContentType = "text/html; charset=utf-8"; + context.Response.ContentLength = errorBytes.Length; + return context.Response.Body.WriteAsync(errorBytes, 0, errorBytes.Length); + }; + } + } + + private void EnsureServer() { if (ServerFactory == null) { @@ -186,37 +250,25 @@ namespace Microsoft.AspNet.Hosting.Internal ServerFactory = _applicationServices.GetRequiredService().LoadServerFactory(ServerFactoryLocation); } - _serverInstance = ServerFactory.Initialize(_config); - var builderFactory = _applicationServices.GetRequiredService(); - var builder = builderFactory.CreateBuilder(_serverInstance); - builder.ApplicationServices = _applicationServices; - - var addresses = builder.ServerFeatures?.Get()?.Addresses; - if (addresses != null && !addresses.IsReadOnly) + if (_serverInstance == null) { - var port = _config[ServerPort]; - if (!string.IsNullOrEmpty(port)) + _serverInstance = ServerFactory.Initialize(_config); + var addresses = _serverInstance?.Get()?.Addresses; + if (addresses != null && !addresses.IsReadOnly) { - addresses.Add("http://localhost:" + port); - } + var port = _config[ServerPort]; + if (!string.IsNullOrEmpty(port)) + { + addresses.Add("http://localhost:" + port); + } - // Provide a default address if there aren't any configured. - if (addresses.Count == 0) - { - addresses.Add("http://localhost:5000"); + // Provide a default address if there aren't any configured. + if (addresses.Count == 0) + { + addresses.Add("http://localhost:5000"); + } } } - - var startupFilters = _applicationServices.GetService>(); - var configure = Startup.ConfigureDelegate; - foreach (var filter in startupFilters) - { - configure = filter.Configure(configure); - } - - configure(builder); - - return builder.Build(); } private string GetRequestIdentifier(HttpContext httpContext) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 4cde138e65..fe4b261ffd 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Hosting builder.AddCommandLine(args); var config = builder.Build(); - var host = new WebHostBuilder(_serviceProvider, config).Build(); + var host = new WebHostBuilder(_serviceProvider, config, captureStartupErrors: true).Build(); using (var app = host.Start()) { var hostingEnv = app.Services.GetRequiredService(); diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs new file mode 100644 index 0000000000..70b6befd8d --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -0,0 +1,520 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.ExceptionServices; +using System.Text; +using Microsoft.Dnx.Compilation; +using Microsoft.Dnx.Runtime; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.AspNet.Hosting.Startup +{ + internal static class StartupExceptionPage + { + private const int MaxCompilationErrorsToShow = 20; + + private static readonly string _errorPageFormatString = GetResourceString("GenericError.html", escapeBraces: true); + private static readonly string _errorMessageFormatString = GetResourceString("GenericError_Message.html"); + private static readonly string _errorExceptionFormatString = GetResourceString("GenericError_Exception.html"); + private static readonly string _errorFooterFormatString = GetResourceString("GenericError_Footer.html"); + private static readonly string _compilationExceptionFormatString = GetResourceString("Compilation_Exception.html"); + + public static byte[] GenerateErrorHtml(bool showDetails, IRuntimeEnvironment runtimeEnvironment, params object[] errorDetails) + { + if (!showDetails) + { + errorDetails = new[] { "An error occurred while starting the application." }; + } + + // Build the message for each error + var wasSourceCodeWrittenOntoPage = false; + var builder = new StringBuilder(); + var rawExceptionDetails = new StringBuilder(); + + foreach (object error in errorDetails ?? new object[0]) + { + var ex = error as Exception; + if (ex == null && error is ExceptionDispatchInfo) + { + ex = ((ExceptionDispatchInfo)error).SourceException; + } + + if (ex != null) + { + var flattenedExceptions = FlattenAndReverseExceptionTree(ex); + + var compilationException = flattenedExceptions.OfType() + .FirstOrDefault(); + if (compilationException != null) + { + WriteException(compilationException, builder, ref wasSourceCodeWrittenOntoPage); + + var compilationErrorMessages = compilationException.CompilationFailures + .SelectMany(f => f.Messages.Select(m => m.FormattedMessage)) + .Take(MaxCompilationErrorsToShow); + + WriteRawExceptionDetails("Show raw compilation error details", compilationErrorMessages, rawExceptionDetails); + } + else + { + foreach (var innerEx in flattenedExceptions) + { + WriteException(innerEx, builder, ref wasSourceCodeWrittenOntoPage); + } + + WriteRawExceptionDetails("Show raw exception details", new[] { ex.ToString() }, rawExceptionDetails); + } + } + else + { + var message = Convert.ToString(error, CultureInfo.InvariantCulture); + WriteMessage(message, builder); + } + } + + // Generate the footer + var footer = showDetails ? GenerateFooterEncoded(runtimeEnvironment) : null; + + // And generate the full markup + return Encoding.UTF8.GetBytes(string.Format(CultureInfo.InvariantCulture, _errorPageFormatString, builder, rawExceptionDetails, footer)); + } + + private static string BuildCodeSnippetDiv(StackFrame frame) + { + var filename = frame.GetFileName(); + if (!string.IsNullOrEmpty(filename)) + { + int failingLineNumber = frame.GetFileLineNumber(); + if (failingLineNumber >= 1) + { + var lines = GetFailingCallSiteInFile(filename, failingLineNumber); + if (lines != null) + { + return @"
" + + @"
" + HtmlEncodeAndReplaceLineBreaks(filename) + "
" + Environment.NewLine + + string.Join(Environment.NewLine, lines) + "
" + Environment.NewLine; + } + } + } + + // fallback + return null; + } + + private static string BuildLineForStackFrame(StackFrame frame) + { + var builder = new StringBuilder("
");
+            var method = frame.GetMethod();
+
+            // Special case: no method available
+            if (method == null)
+            {
+                return null;
+            }
+
+            // First, write the type name
+            var type = method.DeclaringType;
+            if (type != null)
+            {
+                // Special-case ExceptionDispatchInfo.Throw()
+                if (type == typeof(ExceptionDispatchInfo) && method.Name == "Throw")
+                {
+                    return @"
--- exception rethrown ---
"; + } + + string prefix, friendlyName; + SplitTypeIntoPrefixAndFriendlyName(type, out prefix, out friendlyName); + builder.AppendFormat(CultureInfo.InvariantCulture, @"at {0}", HtmlEncodeAndReplaceLineBreaks(prefix)); + builder.Append(HtmlEncodeAndReplaceLineBreaks(friendlyName)); + } + + // Next, write the method signature + builder.Append(HtmlEncodeAndReplaceLineBreaks("." + method.Name)); + + // Is this method generic? + if (method.IsGenericMethod) + { + builder.Append(HtmlEncodeAndReplaceLineBreaks(BuildMethodGenericParametersUnescaped(method))); + } + + // Build method parameters + builder.AppendFormat(CultureInfo.InvariantCulture, @"{0}", HtmlEncodeAndReplaceLineBreaks(BuildMethodParametersUnescaped(method))); + + // Do we have source information for this frame? + if (frame.GetILOffset() != -1) + { + var filename = frame.GetFileName(); + if (!string.IsNullOrEmpty(filename)) + { + builder.AppendFormat(CultureInfo.InvariantCulture, " in {0}:line {1:D}", HtmlEncodeAndReplaceLineBreaks(filename), frame.GetFileLineNumber()); + } + } + + // Finish + builder.Append("
"); + return builder.ToString(); + } + + private static string BuildMethodGenericParametersUnescaped(MethodBase method) + { + Debug.Assert(method.IsGenericMethod); + return "<" + string.Join(", ", method.GetGenericArguments().Select(PrettyPrintTypeName)) + ">"; + } + + private static string BuildMethodParametersUnescaped(MethodBase method) + { + return "(" + string.Join(", ", method.GetParameters().Select(p => { + Type parameterType = p.ParameterType; + return ((parameterType != null) ? PrettyPrintTypeName(parameterType) : "?") + " " + p.Name; + })) + ")"; + } + + private static void BuildCodeSnippetDiv(CompilationFailure failure, + StringBuilder builder, + ref int totalErrorsShown) + { + const int NumContextLines = 3; + var fileName = failure.SourceFilePath; + if (totalErrorsShown < MaxCompilationErrorsToShow && + !string.IsNullOrEmpty(fileName)) + { + builder.Append(@"
") + .AppendFormat(@"
{0}
", HtmlEncodeAndReplaceLineBreaks(fileName)) + .AppendLine(); + + IEnumerable fileContent; + if (string.IsNullOrEmpty(failure.SourceFileContent)) + { + fileContent = File.ReadLines(fileName); + } + else + { + fileContent = failure.SourceFileContent.Split(new[] { Environment.NewLine }, StringSplitOptions.None); + } + foreach (var message in failure.Messages) + { + if (totalErrorsShown++ > MaxCompilationErrorsToShow) + { + break; + } + + if (totalErrorsShown > 1) + { + builder.AppendLine("
"); + } + + builder.Append(@"
") + .Append(HtmlEncodeAndReplaceLineBreaks(message.Message)) + .Append("
"); + + // StartLine and EndLine are 1-based + var startLine = message.StartLine - 1; + var endLine = message.EndLine - 1; + var preContextIndex = Math.Max(startLine - NumContextLines, 0); + var index = preContextIndex + 1; + foreach (var line in fileContent.Skip(preContextIndex).Take(startLine - preContextIndex)) + { + builder.Append(@"
") + .AppendFormat(@"{0}", index++) + .Append(HtmlEncodeAndReplaceLineBreaks(line)) + .AppendLine("
"); + } + + var numErrorLines = 1 + Math.Max(0, endLine - startLine); + foreach (var line in fileContent.Skip(startLine).Take(numErrorLines)) + { + builder.Append(@"
") + .AppendFormat(@"{0}", index++) + .Append(HtmlEncodeAndReplaceLineBreaks(line)) + .AppendLine("
"); + } + foreach (var line in fileContent.Skip(message.EndLine).Take(NumContextLines)) + { + builder.Append(@"
") + .AppendFormat(@"{0}", index++) + .Append(HtmlEncodeAndReplaceLineBreaks(line)) + .AppendLine("
"); + } + } + + builder.AppendLine("
"); // Close codeSnippet div + } + } + + private static string GetResourceString(string name, bool escapeBraces = false) + { + // '{' and '}' are special in CSS, so we use "[[[0]]]" instead for {0} (and so on). + var assembly = typeof(StartupExceptionPage).GetTypeInfo().Assembly; + var resourceName = assembly.GetName().Name + ".compiler.resources." + name; + var manifestStream = assembly.GetManifestResourceStream(resourceName); + var formatString = new StreamReader(manifestStream, Encoding.UTF8, detectEncodingFromByteOrderMarks: false).ReadToEnd(); + if (escapeBraces) + { + formatString = formatString.Replace("{", "{{").Replace("}", "}}").Replace("[[[", "{").Replace("]]]", "}"); + } + + return formatString; + } + + private static List GetFailingCallSiteInFile(string filename, int failedLineNumber) + { + // We figure out the [first, last] range of lines to read from the file. + var firstLineNumber = failedLineNumber - 2; + firstLineNumber = Math.Max(1, firstLineNumber); + var lastLineNumber = failedLineNumber + 2; + lastLineNumber = Math.Max(lastLineNumber, failedLineNumber); + + // Figure out how many characters lastLineNumber will take to print. + var lastLineNumberCharLength = lastLineNumber.ToString("D", CultureInfo.InvariantCulture).Length; + + var errorSubContents = new List(); + var didReadFailingLine = false; + + try + { + var thisLineNum = 0; + foreach (var line in File.ReadLines(filename)) + { + thisLineNum++; + + // Are we within the correct range? + if (thisLineNum < firstLineNumber) + { + continue; + } + if (thisLineNum > lastLineNumber) + { + break; + } + + var encodedLine = HtmlEncodeAndReplaceLineBreaks("Line " + + thisLineNum.ToString("D", CultureInfo.InvariantCulture).PadLeft(lastLineNumberCharLength) + + ": " + + line); + + if (thisLineNum == failedLineNumber) + { + didReadFailingLine = true; + errorSubContents.Add(@"
" + encodedLine + "
"); + } + else + { + errorSubContents.Add(@"
" + encodedLine + "
"); + } + } + } + catch + { + // If there's an error for any reason, don't show source. + return null; + } + + return (didReadFailingLine) ? errorSubContents : null; + } + + private static string PrettyPrintTypeName(Type t) + { + try + { + RuntimeHelpers.EnsureSufficientExecutionStack(); + + var name = t.Name; + + // Degenerate case + if (string.IsNullOrEmpty(name)) + { + name = "?"; + } + + // Handle generic types + if (t.GetTypeInfo().IsGenericType) + { + // strip off the CLR generic type marker if it exists + var indexOfGenericTypeMarker = name.LastIndexOf('`'); + if (indexOfGenericTypeMarker >= 0) + { + name = name.Substring(0, indexOfGenericTypeMarker); + name += "<" + string.Join(", ", t.GetGenericArguments().Select(PrettyPrintTypeName)) + ">"; + } + } + + // Handle nested types + if (!t.IsGenericParameter) + { + var containerType = t.DeclaringType; + if (containerType != null) + { + name = PrettyPrintTypeName(containerType) + "." + name; + } + } + + return name; + } + catch + { + // If anything at all goes wrong, fall back to the full type name so that we don't crash the server. + return t.FullName; + } + } + + private static void SplitTypeIntoPrefixAndFriendlyName(Type type, out string prefix, out string friendlyName) + { + prefix = type.Namespace; + friendlyName = PrettyPrintTypeName(type); + + if (!string.IsNullOrEmpty(friendlyName) && !string.IsNullOrEmpty(prefix)) + { + prefix += "."; + } + } + + private static string GenerateFooterEncoded(IRuntimeEnvironment environment) + { + var runtimeType = HtmlEncodeAndReplaceLineBreaks(environment.RuntimeType); +#if DNXCORE50 + var systemRuntimeAssembly = typeof(System.ComponentModel.DefaultValueAttribute).GetTypeInfo().Assembly; + var assemblyVersion = new AssemblyName(systemRuntimeAssembly.FullName).Version.ToString(); + var clrVersion = HtmlEncodeAndReplaceLineBreaks(assemblyVersion); +#else + var clrVersion = HtmlEncodeAndReplaceLineBreaks(Environment.Version.ToString()); +#endif + var runtimeArch = HtmlEncodeAndReplaceLineBreaks(environment.RuntimeArchitecture); + var dnxVersion = HtmlEncodeAndReplaceLineBreaks(environment.RuntimeVersion); + var currentAssembly = typeof(StartupExceptionPage).GetTypeInfo().Assembly; + var currentAssemblyVersion = currentAssembly.GetCustomAttribute().InformationalVersion; + currentAssemblyVersion = HtmlEncodeAndReplaceLineBreaks(currentAssemblyVersion); + + var os = HtmlEncodeAndReplaceLineBreaks(environment.OperatingSystem); + var osVersion = HtmlEncodeAndReplaceLineBreaks(environment.OperatingSystemVersion); + + return string.Format(CultureInfo.InvariantCulture, _errorFooterFormatString, runtimeType, clrVersion, + runtimeArch, dnxVersion, currentAssemblyVersion, os, osVersion); + } + + private static string HtmlEncodeAndReplaceLineBreaks(string input) + { + if (string.IsNullOrEmpty(input)) + { + return string.Empty; + } + + // Split on line breaks before passing it through the encoder. + // We use the static default encoder since we can't depend on DI in the error handling logic. + return string.Join("
" + Environment.NewLine, + input.Split(new[] { "\r\n" }, StringSplitOptions.None) + .SelectMany(s => s.Split(new[] { '\r', '\n' }, StringSplitOptions.None)) + .Select(HtmlEncoder.Default.HtmlEncode)); + } + + private static void WriteException(Exception ex, StringBuilder builder, ref bool wasFailingCallSiteSourceWritten) + { + string inlineSourceDiv = null; + + // First, build the stack trace + var firstStackFrame = true; + var stackTraceBuilder = new StringBuilder(); + var needFileInfo = true; + foreach (var frame in new StackTrace(ex, needFileInfo).GetFrames() ?? Enumerable.Empty()) + { + if (!firstStackFrame) + { + stackTraceBuilder.Append("
"); + } + firstStackFrame = false; + var thisFrameLine = BuildLineForStackFrame(frame); + stackTraceBuilder.AppendLine(thisFrameLine); + + // Try to include the source code in the error page if we can. + if (!wasFailingCallSiteSourceWritten && inlineSourceDiv == null) + { + inlineSourceDiv = BuildCodeSnippetDiv(frame); + if (inlineSourceDiv != null) + { + wasFailingCallSiteSourceWritten = true; + } + } + } + + // Finally, build the rest of the
+ builder.AppendFormat(CultureInfo.InvariantCulture, _errorExceptionFormatString, + HtmlEncodeAndReplaceLineBreaks(ex.GetType().FullName), + HtmlEncodeAndReplaceLineBreaks(ex.Message), + inlineSourceDiv, + stackTraceBuilder); + } + + private static void WriteRawExceptionDetails(string linkText, IEnumerable lines, StringBuilder rawExceptionDetails) + { + rawExceptionDetails + .AppendLine("
") + .AppendFormat($" ") + .AppendLine() + .AppendLine("
") + .Append("
");
+
+            foreach (var line in lines)
+            {
+                rawExceptionDetails.AppendLine(line);
+            }
+
+            rawExceptionDetails
+                .AppendLine("
") + .AppendLine("
") + .AppendLine("
"); + } + + private static void WriteException(ICompilationException compilationException, + StringBuilder builder, + ref bool wasSourceCodeWrittenOntoPage) + { + var totalErrorsShown = 0; + var inlineSourceDiv = new StringBuilder(); + var firstStackFrame = true; + foreach (var failure in compilationException.CompilationFailures) + { + if (firstStackFrame) + { + firstStackFrame = false; + } + else + { + inlineSourceDiv.AppendLine("
"); + } + + BuildCodeSnippetDiv(failure, inlineSourceDiv, ref totalErrorsShown); + } + + wasSourceCodeWrittenOntoPage = totalErrorsShown > 0; + + builder.AppendFormat(CultureInfo.InvariantCulture, + _compilationExceptionFormatString, + inlineSourceDiv); + } + + private static void WriteMessage(string message, StringBuilder builder) + { + // Build the
+ builder.AppendFormat(CultureInfo.InvariantCulture, _errorMessageFormatString, + HtmlEncodeAndReplaceLineBreaks(message)); + } + + private static IEnumerable FlattenAndReverseExceptionTree(Exception ex) + { + var list = new List(); + for (; ex != null; ex = ex.InnerException) + { + list.Add(ex); + } + list.Reverse(); + return list; + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 4d2bc9eebf..2563776356 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -39,6 +39,7 @@ namespace Microsoft.AspNet.Hosting private StartupMethods _startup; private Type _startupType; private string _startupAssemblyName; + private readonly bool _captureStartupErrors; // Only one of these should be set private string _serverFactoryLocation; @@ -50,6 +51,11 @@ namespace Microsoft.AspNet.Hosting } public WebHostBuilder(IServiceProvider services, IConfiguration config) + : this(services, config: config, captureStartupErrors: false) + { + } + + public WebHostBuilder(IServiceProvider services, IConfiguration config, bool captureStartupErrors) { if (services == null) { @@ -65,6 +71,7 @@ namespace Microsoft.AspNet.Hosting _loggerFactory = new LoggerFactory(); _services = services; _config = config; + _captureStartupErrors = captureStartupErrors; } private IServiceCollection BuildHostingServices() @@ -117,8 +124,7 @@ namespace Microsoft.AspNet.Hosting var startupLoader = hostingContainer.GetRequiredService(); _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _config?[EnvironmentKey] ?? _config?[OldEnvironmentKey]); - - var engine = new HostingEngine(hostingServices, startupLoader, _config); + var engine = new HostingEngine(hostingServices, startupLoader, _config, _captureStartupErrors); // Only one of these should be set, but they are used in priority engine.ServerFactory = _serverFactory; diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html b/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html new file mode 100644 index 0000000000..4a4faf1d23 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html @@ -0,0 +1,6 @@ +
+ One or more compilation errors occured:
+
+ {0} +
+
diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html new file mode 100644 index 0000000000..e7b4dc1bbd --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html @@ -0,0 +1,151 @@ + + + + + + 500 Internal Server Error + + + + + + + + [[[0]]] + + [[[1]]] + + [[[2]]] + + diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Exception.html b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Exception.html new file mode 100644 index 0000000000..012e05bee7 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Exception.html @@ -0,0 +1,8 @@ +
+ {0}
+ {1}
+ {2} +
+ {3} +
+
diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Footer.html b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Footer.html new file mode 100644 index 0000000000..54042e8bf9 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Footer.html @@ -0,0 +1,3 @@ +
+ .NET Framework {0} version {1}   |   DNX {2} version {3}   |   Microsoft.AspNet.Hosting version {4}   |   {5} {6}   |   Need help? +
diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Message.html b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Message.html new file mode 100644 index 0000000000..39a83d8754 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Message.html @@ -0,0 +1,3 @@ +
+ {0}
+
diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index c8b50aad56..ac5468cff2 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -18,6 +18,7 @@ "Microsoft.Framework.Configuration.Json": "1.0.0-*", "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", "Newtonsoft.Json": "6.0.6", "System.Diagnostics.Tracing.Telemetry": "4.0.0-beta-*" @@ -30,7 +31,8 @@ }, "dnxcore50": { "dependencies": { - "System.Console": "4.0.0-beta-*" + "System.Console": "4.0.0-beta-*", + "System.Diagnostics.StackTrace": "4.0.1-beta-*" } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs new file mode 100644 index 0000000000..276ba0ea8c --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.Dnx.Runtime; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class RuntimeEnvironment : IRuntimeEnvironment + { + public string OperatingSystem { get; } = "TestOs"; + + public string OperatingSystemVersion { get; } = "TestOsVersion"; + + public string RuntimeArchitecture { get; } = "TestArch"; + + public string RuntimeType { get; } = "TestRuntime"; + + public string RuntimeVersion { get; } = "TestRuntimeVersion"; + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs new file mode 100644 index 0000000000..b7b3cfcdef --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupConfigureServicesThrows + { + public void ConfigureServices(IServiceCollection services) + { + throw new Exception("Exception from ConfigureServices"); + } + + public void Configure(IApplicationBuilder builder) + { + + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs new file mode 100644 index 0000000000..063404a4d1 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; +using Microsoft.Framework.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupConfigureThrows + { + public void ConfigureServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder builder) + { + throw new Exception("Exception from Configure"); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupCtorThrows.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupCtorThrows.cs new file mode 100644 index 0000000000..b0a88f3a85 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupCtorThrows.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupCtorThrows + { + public StartupCtorThrows() + { + throw new Exception("Exception from constructor"); + } + + public void Configure(IApplicationBuilder app) + { + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs new file mode 100644 index 0000000000..cd90f5181d --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupStaticCtorThrows + { + static StartupStaticCtorThrows() + { + throw new Exception("Exception from static constructor"); + } + + public void Configure(IApplicationBuilder app) + { + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 21f58bddbc..8d1b812ad8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -1,8 +1,17 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Collections.Generic; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Microsoft.Dnx.Runtime.Infrastructure; +using Microsoft.Framework.Configuration; using Xunit; namespace Microsoft.AspNet.Hosting @@ -29,6 +38,110 @@ namespace Microsoft.AspNet.Hosting Assert.Equal("MyStartupAssembly", engine.StartupAssemblyName); } - private WebHostBuilder CreateWebHostBuilder() => new WebHostBuilder(CallContextServiceLocator.Locator.ServiceProvider); + [Fact] + public async Task StartupMissing_Fallback() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup("MissingStartupAssembly").Build(); + using (engine.Start()) + { + await AssertResponseContains(serverFactory.Application, "MissingStartupAssembly"); + } + } + + [Fact] + public async Task StartupStaticCtorThrows_Fallback() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + using (engine.Start()) + { + await AssertResponseContains(serverFactory.Application, "Exception from static constructor"); + } + } + + [Fact] + public async Task StartupCtorThrows_Fallback() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + using (engine.Start()) + { + await AssertResponseContains(serverFactory.Application, "Exception from constructor"); + } + } + + [Fact] + public async Task StartupConfigureServicesThrows_Fallback() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + using (engine.Start()) + { + await AssertResponseContains(serverFactory.Application, "Exception from ConfigureServices"); + } + } + + [Fact] + public async Task StartupConfigureThrows_Fallback() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + using (engine.Start()) + { + await AssertResponseContains(serverFactory.Application, "Exception from Configure"); + } + } + + private WebHostBuilder CreateWebHostBuilder() + { + var vals = new Dictionary + { + { "server", "Microsoft.AspNet.Hosting.Tests" }, + { "Hosting:DetailedErrors", "true" }, + }; + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + return new WebHostBuilder(CallContextServiceLocator.Locator.ServiceProvider, config, captureStartupErrors: true); + } + + private async Task AssertResponseContains(Func app, string expectedText) + { + var httpContext = new DefaultHttpContext(); + httpContext.Response.Body = new MemoryStream(); + await app(httpContext.Features); + httpContext.Response.Body.Seek(0, SeekOrigin.Begin); + var bodyText = new StreamReader(httpContext.Response.Body).ReadToEnd(); + Assert.Contains(expectedText, bodyText); + } + + private class TestServerFactory : IServerFactory + { + public Func Application { get; set; } + + public IFeatureCollection Initialize(IConfiguration configuration) + { + return new FeatureCollection(); + } + + public IDisposable Start(IFeatureCollection serverFeatures, Func application) + { + Application = application; + return new Disposable(); + } + + private class Disposable : IDisposable + { + public void Dispose() + { + } + } + } } } From c426fa97d548372f41299ef43b44f24118cc36d5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 25 Sep 2015 06:28:58 -0700 Subject: [PATCH 0761/1838] React to configuration API changes. --- src/Microsoft.AspNet.Hosting/Program.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index fe4b261ffd..269f415d8b 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -30,11 +30,12 @@ namespace Microsoft.AspNet.Hosting var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; var appBasePath = _serviceProvider.GetRequiredService().ApplicationBasePath; - var builder = new ConfigurationBuilder(appBasePath); - builder.AddJsonFile(configFilePath, optional: true); - builder.AddEnvironmentVariables(); - builder.AddCommandLine(args); - var config = builder.Build(); + var config = new ConfigurationBuilder() + .SetBasePath(appBasePath) + .AddJsonFile(configFilePath, optional: true) + .AddEnvironmentVariables() + .AddCommandLine(args) + .Build(); var host = new WebHostBuilder(_serviceProvider, config, captureStartupErrors: true).Build(); using (var app = host.Start()) From a602b47e262b1733611018f1d357784dd7e10c5c Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 24 Sep 2015 14:12:42 -0700 Subject: [PATCH 0762/1838] Add AppendFormat extension methods on IHtmlContent --- .../HtmlContentBuilderExtensions.cs | 214 +++++++++++++++++ .../project.json | 2 +- .../project.json | 2 +- .../HtmlContentBuilderExtensionsTest.cs | 225 +++++++++++++++++- 4 files changed, 438 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index bfd5e3ef03..0e15077764 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -3,7 +3,9 @@ using System; using System.Diagnostics; +using System.Globalization; using System.IO; +using System.Text; using Microsoft.Framework.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions @@ -13,6 +15,82 @@ namespace Microsoft.AspNet.Html.Abstractions ///
public static class HtmlContentBuilderExtensions { + /// + /// Appends the specified to the existing content after replacing each format + /// item with the HTML encoded representation of the corresponding item in the + /// array. + /// + /// + /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). + /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. + /// + /// + /// The object array to format. Each element in the array will be formatted and then HTML encoded. + /// + /// A reference to this instance after the append operation has completed. + public static IHtmlContentBuilder AppendFormat( + this IHtmlContentBuilder builder, + string format, + params object[] args) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + if (format == null) + { + throw new ArgumentNullException(nameof(format)); + } + + if (args == null) + { + throw new ArgumentNullException(nameof(args)); + } + + builder.Append(new HtmlFormatString(format, args)); + return builder; + } + + /// + /// Appends the specified to the existing content with information from the + /// after replacing each format item with the HTML encoded + /// representation of the corresponding item in the array. + /// + /// An object that supplies culture-specific formatting information. + /// + /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). + /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. + /// + /// + /// The object array to format. Each element in the array will be formatted and then HTML encoded. + /// + /// A reference to this instance after the append operation has completed. + public static IHtmlContentBuilder AppendFormat( + this IHtmlContentBuilder builder, + IFormatProvider formatProvider, + string format, + params object[] args) + { + if (builder == null) + { + throw new ArgumentNullException(nameof(builder)); + } + + if (format == null) + { + throw new ArgumentNullException(nameof(format)); + } + + if (args == null) + { + throw new ArgumentNullException(nameof(args)); + } + + builder.Append(new HtmlFormatString(formatProvider, format, args)); + return builder; + } + /// /// Appends an . /// @@ -132,5 +210,141 @@ namespace Microsoft.AspNet.Html.Abstractions } } } + + [DebuggerDisplay("{DebuggerToString()}")] + private class HtmlFormatString : IHtmlContent + { + private readonly IFormatProvider _formatProvider; + private readonly string _format; + private readonly object[] _args; + + public HtmlFormatString(string format, object[] args) + : this(null, format, args) + { + } + + public HtmlFormatString(IFormatProvider formatProvider, string format, object[] args) + { + Debug.Assert(format != null); + Debug.Assert(args != null); + + _formatProvider = formatProvider ?? CultureInfo.CurrentCulture; + _format = format; + _args = args; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + if (writer == null) + { + throw new ArgumentNullException(nameof(writer)); + } + + if (encoder == null) + { + throw new ArgumentNullException(nameof(encoder)); + } + + var formatProvider = new EncodingFormatProvider(_formatProvider, encoder); + writer.Write(string.Format(formatProvider, _format, _args)); + } + + private string DebuggerToString() + { + using (var writer = new StringWriter()) + { + WriteTo(writer, HtmlEncoder.Default); + return writer.ToString(); + } + } + } + + // This class implements Html encoding via an ICustomFormatter. Passing an instance of this + // class into a string.Format method or anything similar will evaluate arguments implementing + // IHtmlContent without HTML encoding them, and will give other arguments the standard + // composite format string treatment, and then HTML encode the result. + // + // Plenty of examples of ICustomFormatter and the interactions with string.Format here: + // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example + private class EncodingFormatProvider : IFormatProvider, ICustomFormatter + { + private readonly IHtmlEncoder _encoder; + private readonly IFormatProvider _formatProvider; + + public EncodingFormatProvider(IFormatProvider formatProvider, IHtmlEncoder encoder) + { + Debug.Assert(formatProvider != null); + Debug.Assert(encoder != null); + + _formatProvider = formatProvider; + _encoder = encoder; + } + + public string Format(string format, object arg, IFormatProvider formatProvider) + { + // This is the case we need to special case. We trust the IHtmlContent instance to do the + // right thing with encoding. + var htmlContent = arg as IHtmlContent; + if (htmlContent != null) + { + using (var writer = new StringWriter()) + { + htmlContent.WriteTo(writer, _encoder); + return writer.ToString(); + } + } + + // If we get here then 'arg' is not an IHtmlContent, and we want to handle it the way a normal + // string.Format would work, but then HTML encode the result. + // + // First check for an ICustomFormatter - if the IFormatProvider is a CultureInfo, then it's likely + // that ICustomFormatter will be null. + var customFormatter = (ICustomFormatter)_formatProvider.GetFormat(typeof(ICustomFormatter)); + if (customFormatter != null) + { + var result = customFormatter.Format(format, arg, _formatProvider); + if (result != null) + { + return _encoder.HtmlEncode(result); + } + } + + // Next check if 'arg' is an IFormattable (DateTime is an example). + // + // An IFormattable will likely call back into the IFormatterProvider and ask for more information + // about how to format itself. This is the typical case when IFormatterProvider is a CultureInfo. + var formattable = arg as IFormattable; + if (formattable != null) + { + var result = formattable.ToString(format, _formatProvider); + if (result != null) + { + return _encoder.HtmlEncode(result); + } + } + + // If we get here then there's nothing really smart left to try. + if (arg != null) + { + var result = arg.ToString(); + if (result != null) + { + return _encoder.HtmlEncode(result); + } + } + + return string.Empty; + } + + public object GetFormat(Type formatType) + { + if (formatType == typeof(ICustomFormatter)) + { + return this; + } + + return null; + } + } } } diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index eee0e0ab1b..e4f6452bf1 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -16,7 +16,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-" + "System.Resources.ResourceManager": "4.0.1-beta-*" } } } diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Framework.WebEncoders.Core/project.json index 54dbd1c28e..0da3e70874 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/project.json +++ b/src/Microsoft.Framework.WebEncoders.Core/project.json @@ -18,7 +18,7 @@ "System.Diagnostics.Debug": "4.0.11-beta-*", "System.IO": "4.0.11-beta-*", "System.Reflection": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.1-beta-", + "System.Resources.ResourceManager": "4.0.1-beta-*", "System.Runtime.Extensions": "4.0.11-beta-*", "System.Threading": "4.0.11-beta-*" } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 3aba376094..7c340933ec 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using System.Globalization; using System.IO; +using Microsoft.AspNet.Testing; using Microsoft.Framework.WebEncoders; using Microsoft.Framework.WebEncoders.Testing; using Xunit; @@ -126,6 +128,220 @@ namespace Microsoft.AspNet.Html.Abstractions.Test entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); } + [Fact] + public void Builder_AppendFormat() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth"); + + // Assert + Assert.Equal( + "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_HtmlContent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("{0}!", new EncodedString("First")); + + // Assert + Assert.Equal( + "First!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormatContent_With1Argument() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X} - hex equivalent for 50.", 50); + + // Assert + Assert.Equal( + "0xHtmlEncode[[32]] - hex equivalent for 50.", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormatContent_With2Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X} - hex equivalent for {1}.", 50, 50); + + // Assert + Assert.Equal( + "0xHtmlEncode[[32]] - hex equivalent for HtmlEncode[[50]].", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormatContent_With3Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50); + + // Assert + Assert.Equal( + "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithAlignmentComponent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("{0, -25} World!", "Hello"); + + // Assert + Assert.Equal( + "HtmlEncode[[Hello]] World!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithFormatStringComponent() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat("0x{0:X}", 50); + + // Assert + Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!", + 1.1, + 2.98, + 145.82, + 32.86); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + + "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture_1Argument() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0:N}!", + 1.1); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture_2Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0:N} {1}!", + 1.1, + 2.98); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithCulture_3Arguments() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat( + CultureInfo.InvariantCulture, + "Numbers in InvariantCulture - {0:N} {1} {2}!", + 1.1, + 2.98, + 3.12); + + // Assert + Assert.Equal( + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] HtmlEncode[[3.12]]!", + HtmlContentToString(builder)); + } + + [Fact] + public void Builder_AppendFormat_WithDifferentCulture() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + var culture = new CultureInfo("fr-FR"); + + // Act + builder.AppendFormat(culture, "{0} in french!", 1.21); + + // Assert + Assert.Equal( + "HtmlEncode[[1,21]] in french!", + HtmlContentToString(builder)); + } + + [Fact] + [ReplaceCulture] + public void Builder_AppendFormat_WithDifferentCurrentCulture() + { + // Arrange + var builder = new TestHtmlContentBuilder(); + + // Act + builder.AppendFormat(CultureInfo.CurrentCulture, "{0:D}", DateTime.Parse("01/02/2015")); + + // Assert + Assert.Equal( + "HtmlEncode[[01 February 2015]]", + HtmlContentToString(builder)); + } + private static string HtmlContentToString(IHtmlContent content) { using (var writer = new StringWriter()) @@ -164,7 +380,10 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { - throw new NotImplementedException(); + foreach (var entry in Entries) + { + entry.WriteTo(writer, encoder); + } } } @@ -179,7 +398,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { - throw new NotImplementedException(); + writer.Write(Value); } } @@ -194,7 +413,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public void WriteTo(TextWriter writer, IHtmlEncoder encoder) { - throw new NotImplementedException(); + encoder.HtmlEncode(Value, writer); } } From c62aa147f41e822a579e153d5b607b91dc157c7f Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 25 Sep 2015 17:17:28 -0700 Subject: [PATCH 0763/1838] Make .Clear() consistent with TagHelperOutput --- src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs | 3 ++- .../HtmlContentBuilderExtensionsTest.cs | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index aea0291e70..ced5bd763e 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -34,6 +34,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// Clears the content. /// - void Clear(); + /// The . + IHtmlContentBuilder Clear(); } } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 7c340933ec..4493048940 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -373,9 +373,10 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public void Clear() + public IHtmlContentBuilder Clear() { Entries.Clear(); + return this; } public void WriteTo(TextWriter writer, IHtmlEncoder encoder) From 7e52a004999d009e3118088055e99aa35958a7fc Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 26 Sep 2015 14:34:49 +0100 Subject: [PATCH 0764/1838] Start log scope only if logging is enabled --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 97bdc06e23..2f88460264 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -104,7 +104,9 @@ namespace Microsoft.AspNet.Hosting.Internal try { - using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) + using (logger.IsEnabled(LogLevel.Critical) + ? logger.BeginScope("Request Id: {RequestId}", requestIdentifier) + : null) { contextAccessor.HttpContext = httpContext; await application(httpContext); From 07b3814f32fef234c77afc1d83453dfa06e3ca3b Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sat, 26 Sep 2015 22:51:06 +0100 Subject: [PATCH 0765/1838] Correct test Yuk... --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 2f88460264..3bdf2ade61 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -104,7 +104,12 @@ namespace Microsoft.AspNet.Hosting.Internal try { - using (logger.IsEnabled(LogLevel.Critical) + using (logger.IsEnabled(LogLevel.Critical) || + logger.IsEnabled(LogLevel.Error) || + logger.IsEnabled(LogLevel.Warning) || + logger.IsEnabled(LogLevel.Information) || + logger.IsEnabled(LogLevel.Verbose) || + logger.IsEnabled(LogLevel.Debug) ? logger.BeginScope("Request Id: {RequestId}", requestIdentifier) : null) { From ed1fd4a2e8143b0213b2630ab6834fe207fbd213 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 28 Sep 2015 01:45:47 +0100 Subject: [PATCH 0766/1838] Lazy eval requestIdentifier Until is moved to httpContext? --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 3bdf2ade61..556103b78a 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -95,7 +95,6 @@ namespace Microsoft.AspNet.Hosting.Internal { var httpContext = contextFactory.CreateHttpContext(features); httpContext.ApplicationServices = _applicationServices; - var requestIdentifier = GetRequestIdentifier(httpContext); if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { @@ -110,7 +109,7 @@ namespace Microsoft.AspNet.Hosting.Internal logger.IsEnabled(LogLevel.Information) || logger.IsEnabled(LogLevel.Verbose) || logger.IsEnabled(LogLevel.Debug) - ? logger.BeginScope("Request Id: {RequestId}", requestIdentifier) + ? logger.BeginScope("Request Id: {RequestId}", GetRequestIdentifier(httpContext)) : null) { contextAccessor.HttpContext = httpContext; From 434bddeec5765fc6c72ab04243a33a727b99c42c Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 28 Sep 2015 01:52:17 +0100 Subject: [PATCH 0767/1838] Revert for grumpy test --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 556103b78a..3bdf2ade61 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -95,6 +95,7 @@ namespace Microsoft.AspNet.Hosting.Internal { var httpContext = contextFactory.CreateHttpContext(features); httpContext.ApplicationServices = _applicationServices; + var requestIdentifier = GetRequestIdentifier(httpContext); if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { @@ -109,7 +110,7 @@ namespace Microsoft.AspNet.Hosting.Internal logger.IsEnabled(LogLevel.Information) || logger.IsEnabled(LogLevel.Verbose) || logger.IsEnabled(LogLevel.Debug) - ? logger.BeginScope("Request Id: {RequestId}", GetRequestIdentifier(httpContext)) + ? logger.BeginScope("Request Id: {RequestId}", requestIdentifier) : null) { contextAccessor.HttpContext = httpContext; From 0131015b4327787d2d9f556ca1d7694581c733ec Mon Sep 17 00:00:00 2001 From: Chris R Date: Sat, 26 Sep 2015 22:29:08 -0700 Subject: [PATCH 0768/1838] Update server test infrastructure, remove Helios concepts. --- .../Common/DeploymentParameters.cs | 3 ++ .../Common/RetryHelper.cs | 18 +++---- .../Common/ServerType.cs | 1 - .../Deployers/ApplicationDeployer.cs | 24 ++++------ .../Deployers/ApplicationDeployerFactory.cs | 1 - .../Deployers/IISDeployer.cs | 45 ++++------------- .../Deployers/IISExpressDeployer.cs | 48 ++----------------- .../Deployers/SelfHostDeployer.cs | 8 +++- ...fIISNativeVariationsNotEnabledAttribute.cs | 33 ------------- 9 files changed, 42 insertions(+), 139 deletions(-) delete mode 100644 src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs index 86d29d9b2b..842e65b70f 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs @@ -89,6 +89,9 @@ namespace Microsoft.AspNet.Server.Testing /// public Action UserAdditionalCleanup { get; set; } + // Which command in the test project to run. + public string Command { get; set; } + public override string ToString() { return string.Format( diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs index ae2cedd6e7..48b47b4706 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs @@ -27,14 +27,14 @@ namespace Microsoft.AspNet.Server.Testing { for (int retry = 0; retry < retryCount; retry++) { + if (cancellationToken.IsCancellationRequested) + { + logger.LogInformation("Failed to connect, retry canceled."); + throw new OperationCanceledException("Failed to connect, retry canceled.", cancellationToken); + } + try { - if (cancellationToken.IsCancellationRequested) - { - logger.LogInformation("Stopping retry as cancellation token is triggered."); - break; - } - logger.LogWarning("Retry count {retryCount}..", retry + 1); var response = await retryBlock(); @@ -45,12 +45,13 @@ namespace Microsoft.AspNet.Server.Testing continue; } - return response; //Went through successfully + return response; // Went through successfully } catch (Exception exception) { if (retry == retryCount - 1) { + logger.LogError("Failed to connect, retry limit exceeded.", exception); throw; } else @@ -68,7 +69,8 @@ namespace Microsoft.AspNet.Server.Testing } } - return null; + logger.LogInformation("Failed to connect, retry limit exceeded."); + throw new OperationCanceledException("Failed to connect, retry limit exceeded."); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs b/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs index 3d17cb23bd..eca333942e 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs @@ -7,7 +7,6 @@ namespace Microsoft.AspNet.Server.Testing { IISExpress, IIS, - IISNativeModule, WebListener, Kestrel } diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 6dd076e1a1..19fe88337b 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Server.Testing { var runtimePath = Process.GetCurrentProcess().MainModule.FileName; Logger.LogInformation(string.Empty); - Logger.LogInformation("Current runtime path is : {0}", runtimePath); + Logger.LogInformation($"Current runtime path is : {runtimePath}"); var replaceStr = new StringBuilder(). Append("dnx"). @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Server.Testing ChosenRuntimeName = runtimeDirectoryInfo.Parent.Name; Logger.LogInformation(string.Empty); - Logger.LogInformation("Changing to use runtime : {runtimeName}", ChosenRuntimeName); + Logger.LogInformation($"Changing to use runtime : {ChosenRuntimeName}"); return ChosenRuntimeName; } @@ -70,16 +70,13 @@ namespace Microsoft.AspNet.Server.Testing { DeploymentParameters.PublishedApplicationRootPath = Path.Combine(publishRoot ?? Path.GetTempPath(), Guid.NewGuid().ToString()); - var parameters = - string.Format( - "publish {0} -o {1} --runtime {2} {3}", - DeploymentParameters.ApplicationPath, - DeploymentParameters.PublishedApplicationRootPath, - DeploymentParameters.DnxRuntime, - DeploymentParameters.PublishWithNoSource ? "--no-source" : string.Empty); + var noSource = DeploymentParameters.PublishWithNoSource ? "--no-source" : string.Empty; + var command = DeploymentParameters.Command ?? "web"; + var parameters = $"publish {DeploymentParameters.ApplicationPath} -o {DeploymentParameters.PublishedApplicationRootPath}" + + $" --runtime {DeploymentParameters.DnxRuntime} {noSource} --iis-command {command}"; var dnuPath = Path.Combine(ChosenRuntimePath, "dnu.cmd"); - Logger.LogInformation("Executing command {dnu} {args}", dnuPath, parameters); + Logger.LogInformation($"Executing command {dnuPath} {parameters}"); var startInfo = new ProcessStartInfo { @@ -106,13 +103,12 @@ namespace Microsoft.AspNet.Server.Testing DeploymentParameters.ApplicationPath = (DeploymentParameters.ServerType == ServerType.IISExpress || - DeploymentParameters.ServerType == ServerType.IISNativeModule || DeploymentParameters.ServerType == ServerType.IIS) ? Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "wwwroot") : Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "approot", "src", new DirectoryInfo(DeploymentParameters.ApplicationPath).Name); - Logger.LogInformation("dnu publish finished with exit code : {exitCode}", hostProcess.ExitCode); + Logger.LogInformation($"dnu publish finished with exit code : {hostProcess.ExitCode}"); } protected void CleanPublishedOutput() @@ -124,7 +120,7 @@ namespace Microsoft.AspNet.Server.Testing } catch (Exception exception) { - Logger.LogWarning("Failed to delete directory : {error}", exception.Message); + Logger.LogWarning($"Failed to delete directory : {exception.Message}"); } } @@ -225,7 +221,7 @@ namespace Microsoft.AspNet.Server.Testing protected void StartTimer() { - Logger.LogInformation("Deploying {VariationDetails}", DeploymentParameters.ToString()); + Logger.LogInformation($"Deploying {DeploymentParameters.ToString()}"); StopWatch.Start(); } diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs index 6422d3f507..d40a6562c1 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -40,7 +40,6 @@ namespace Microsoft.AspNet.Server.Testing return new IISExpressDeployer(deploymentParameters, logger); #if DNX451 case ServerType.IIS: - case ServerType.IISNativeModule: return new IISDeployer(deploymentParameters, logger); #endif case ServerType.WebListener: diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index b7290b9f9c..fe3e046254 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -41,14 +41,8 @@ namespace Microsoft.AspNet.Server.Testing // Publish to IIS root\application folder. DnuPublish(publishRoot: _application.WebSiteRootFolder); - // Drop an ini file instead of setting environment variable. - SetAspEnvironmentWithIni(); - - // Setup the IIS Application. - if (DeploymentParameters.ServerType == ServerType.IISNativeModule) - { - TurnRammFarOnNativeModule(); - } + // Drop a json file instead of setting environment variable. + SetAspEnvironmentWithJson(); lock (_syncObject) { @@ -70,30 +64,12 @@ namespace Microsoft.AspNet.Server.Testing }; } - private void SetAspEnvironmentWithIni() + private void SetAspEnvironmentWithJson() { - // Drop a Microsoft.AspNet.Hosting.ini with ASPNET_ENV information. - Logger.LogInformation("Creating Microsoft.AspNet.Hosting.ini file with ASPNET_ENV."); - var iniFile = Path.Combine(DeploymentParameters.ApplicationPath, "Microsoft.AspNet.Hosting.ini"); - File.WriteAllText(iniFile, string.Format("ASPNET_ENV={0}", DeploymentParameters.EnvironmentName)); - } - - private void TurnRammFarOnNativeModule() - { - Logger.LogInformation("Turning runAllManagedModulesForAllRequests=true in web.config for native module."); - var webConfig = Path.Combine(DeploymentParameters.ApplicationPath, "web.config"); - var configuration = new XmlDocument(); - configuration.LoadXml(File.ReadAllText(webConfig)); - - // https://github.com/aspnet/Helios/issues/77 - var rammfarAttribute = configuration.CreateAttribute("runAllManagedModulesForAllRequests"); - rammfarAttribute.Value = "true"; - var modulesNode = configuration.CreateElement("modules"); - modulesNode.Attributes.Append(rammfarAttribute); - var systemWebServerNode = configuration.CreateElement("system.webServer"); - systemWebServerNode.AppendChild(modulesNode); - configuration.SelectSingleNode("//configuration").AppendChild(systemWebServerNode); - configuration.Save(webConfig); + // Drop a Microsoft.AspNet.Hosting.json with Hosting:Environment information. + Logger.LogInformation("Creating Microsoft.AspNet.Hosting.json file with Hosting:Environment."); + var jsonFile = Path.Combine(DeploymentParameters.ApplicationPath, "Microsoft.AspNet.Hosting.json"); + File.WriteAllText(jsonFile, string.Format("{ \"Hosting:Environment\":\"{0}\" }", DeploymentParameters.EnvironmentName)); } public override void Dispose() @@ -118,8 +94,6 @@ namespace Microsoft.AspNet.Server.Testing private class IISApplication { private const string WebSiteName = "ASPNETTESTRUNS"; - private const string NativeModuleManagedRuntimeVersion = "vCoreFX"; - private const string Dotnet45RuntimeVersion = "v4.0.30319"; private readonly ServerManager _serverManager = new ServerManager(); private readonly DeploymentParameters _deploymentParameters; @@ -176,10 +150,7 @@ namespace Microsoft.AspNet.Server.Testing private ApplicationPool CreateAppPool(string appPoolName) { var applicationPool = _serverManager.ApplicationPools.Add(appPoolName); - applicationPool.ManagedRuntimeVersion = - _deploymentParameters.ServerType == ServerType.IISNativeModule ? - NativeModuleManagedRuntimeVersion : - Dotnet45RuntimeVersion; + applicationPool.ManagedRuntimeVersion = string.Empty; applicationPool.Enable32BitAppOnWin64 = (_deploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86); _logger.LogInformation("Created {bit} application pool '{name}' with runtime version {runtime}.", diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 5309a59925..bd334652a8 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -5,8 +5,6 @@ using System; using System.Diagnostics; using System.IO; using System.Threading; -using Microsoft.Dnx.Runtime; -using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Framework.Logging; namespace Microsoft.AspNet.Server.Testing @@ -30,6 +28,8 @@ namespace Microsoft.AspNet.Server.Testing DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + // For now we always auto-publish. Otherwise we'll have to write our own local web.config for the HttpPlatformHandler + DeploymentParameters.PublishApplicationBeforeDeployment = true; if (DeploymentParameters.PublishApplicationBeforeDeployment) { DnuPublish(); @@ -57,18 +57,12 @@ namespace Microsoft.AspNet.Server.Testing DeploymentParameters.ApplicationHostConfigTemplateContent = DeploymentParameters.ApplicationHostConfigTemplateContent - .Replace("[ApplicationPhysicalPath]", Path.Combine(DeploymentParameters.ApplicationPath, "wwwroot")) - .Replace("[PORT]", new Uri(DeploymentParameters.ApplicationBaseUriHint).Port.ToString()); + .Replace("[ApplicationPhysicalPath]", DeploymentParameters.ApplicationPath) + .Replace("[PORT]", new Uri(DeploymentParameters.ApplicationBaseUriHint).Port.ToString()); DeploymentParameters.ApplicationHostConfigLocation = Path.GetTempFileName(); - File.WriteAllText(DeploymentParameters.ApplicationHostConfigLocation, - DeploymentParameters.ApplicationHostConfigTemplateContent.Replace("[ApplicationPhysicalPath]", DeploymentParameters.ApplicationPath)); - } - - if (!DeploymentParameters.PublishApplicationBeforeDeployment) - { - CopyAspNetLoader(); + File.WriteAllText(DeploymentParameters.ApplicationHostConfigLocation, DeploymentParameters.ApplicationHostConfigTemplateContent); } var webroot = DeploymentParameters.ApplicationPath; @@ -129,38 +123,6 @@ namespace Microsoft.AspNet.Server.Testing return hostExitTokenSource.Token; } - private void CopyAspNetLoader() - { - var libraryManager = (ILibraryManager)CallContextServiceLocator.Locator.ServiceProvider.GetService(typeof(ILibraryManager)); - var interopLibrary = libraryManager.GetLibrary("Microsoft.AspNet.Loader.IIS.Interop"); - - if (interopLibrary == null) - { - throw new Exception( - string.Format("Include Microsoft.AspNet.Server.IIS package in your project.json to deploy in {0}.", - ServerType.IISExpress)); - } - - var aspNetLoaderSrcPath = Path.Combine(interopLibrary.Path, "tools", "AspNet.Loader.dll"); - var aspNetLoaderDestPath = Path.Combine(DeploymentParameters.ApplicationPath, "wwwroot", "bin", "AspNet.Loader.dll"); - - // Create bin directory if it does not exist. - Directory.CreateDirectory(new DirectoryInfo(aspNetLoaderDestPath).Parent.FullName); - - if (!File.Exists(aspNetLoaderDestPath)) - { - try - { - File.Copy(aspNetLoaderSrcPath, aspNetLoaderDestPath); - } - catch (IOException) - { - // Ignore file already exists exception. Sometimes multiple tests might try - // doing the same and one of them wins. - } - } - } - private string GetIISExpressPath() { // Get path to program files diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 685a88e388..cd1293028d 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -47,9 +47,13 @@ namespace Microsoft.AspNet.Server.Testing private CancellationToken StartSelfHost() { - var commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; + var commandName = DeploymentParameters.Command; + if (string.IsNullOrEmpty(commandName)) + { + commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; + } var dnxPath = Path.Combine(ChosenRuntimePath, "dnx.exe"); - var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Dnx.ApplicationHost {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" Microsoft.Dnx.ApplicationHost {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; Logger.LogInformation("Executing {dnxexe} {dnxArgs}", dnxPath, dnxArgs); var startInfo = new ProcessStartInfo diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs b/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs deleted file mode 100644 index b3c13646ce..0000000000 --- a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISNativeVariationsNotEnabledAttribute.cs +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Testing.xunit; - -namespace Microsoft.AspNet.Server.Testing -{ - /// - /// Skip test if IIS native module is not enabled. To enable setup native module - /// and set environment variable IIS_NATIVE_VARIATIONS_ENABLED=true for the test process. - /// - [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] - public class SkipIfIISNativeVariationsNotEnabledAttribute : Attribute, ITestCondition - { - public bool IsMet - { - get - { - return Environment.GetEnvironmentVariable("IIS_NATIVE_VARIATIONS_ENABLED") == "true"; - } - } - - public string SkipReason - { - get - { - return "Skipping Native module test since native module variations are not enabled. " + - "To run the test, setup the native module and set the environment variable IIS_NATIVE_VARIATIONS_ENABLED=true."; - } - } - } -} \ No newline at end of file From 49035fd292773ef1a6d2d9c548fff3119a4b5e57 Mon Sep 17 00:00:00 2001 From: Anthony van der Hoorn Date: Mon, 28 Sep 2015 12:30:12 -0700 Subject: [PATCH 0769/1838] Order the setting of ContextAccessor so it happens before the BeginRequest event occurs. --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 97bdc06e23..6ecfb793ee 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -96,6 +96,7 @@ namespace Microsoft.AspNet.Hosting.Internal var httpContext = contextFactory.CreateHttpContext(features); httpContext.ApplicationServices = _applicationServices; var requestIdentifier = GetRequestIdentifier(httpContext); + contextAccessor.HttpContext = httpContext; if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { @@ -106,7 +107,6 @@ namespace Microsoft.AspNet.Hosting.Internal { using (logger.BeginScope("Request Id: {RequestId}", requestIdentifier)) { - contextAccessor.HttpContext = httpContext; await application(httpContext); } } From 371511aaf16ba0f0d9ab84cf9b617f7b12f0efea Mon Sep 17 00:00:00 2001 From: Hisham Bin Ateya Date: Wed, 23 Sep 2015 23:46:45 +0300 Subject: [PATCH 0770/1838] Add description to project.json --- src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index 07cab5d291..85f0dc5415 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -1,5 +1,6 @@ { "version": "1.0.0-*", + "description": "ASP.NET 5 Hosting server abstractions.", "repository": { "type": "git", "url": "git://github.com/aspnet/hosting" From 4eba4902171cefe0988b6700149af632bbcec1ec Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 28 Sep 2015 18:46:11 -0700 Subject: [PATCH 0771/1838] Only test for critical logging --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 3bdf2ade61..60174887af 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -104,12 +104,7 @@ namespace Microsoft.AspNet.Hosting.Internal try { - using (logger.IsEnabled(LogLevel.Critical) || - logger.IsEnabled(LogLevel.Error) || - logger.IsEnabled(LogLevel.Warning) || - logger.IsEnabled(LogLevel.Information) || - logger.IsEnabled(LogLevel.Verbose) || - logger.IsEnabled(LogLevel.Debug) + using (logger.IsEnabled(LogLevel.Critical) ? logger.BeginScope("Request Id: {RequestId}", requestIdentifier) : null) { From 326dc222f0a13809b8e6ddec8b2b36f1c8d9430c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 28 Sep 2015 23:12:17 -0700 Subject: [PATCH 0772/1838] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 430f83e13bad42bae840014d546966b723541eef Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 28 Sep 2015 23:12:40 -0700 Subject: [PATCH 0773/1838] Updating to release NuGet.config. --- NuGet.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/NuGet.config b/NuGet.config index 1707938c61..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + \ No newline at end of file From 3d5f70fd01ca93e308bf7b1ebb68dfb33f270255 Mon Sep 17 00:00:00 2001 From: moozzyk Date: Tue, 29 Sep 2015 13:52:13 -0700 Subject: [PATCH 0774/1838] Updating RuntimeEnvironment after IRuntimeEnvironment changes --- test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs index 276ba0ea8c..330ff30c29 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs @@ -16,5 +16,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public string RuntimeType { get; } = "TestRuntime"; public string RuntimeVersion { get; } = "TestRuntimeVersion"; + + public string RuntimePath { get; } = "TestRuntimePath"; } } From 894c8dbe2bac3210b95961ab40d4a131dc5e9a9f Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 30 Sep 2015 14:31:03 -0700 Subject: [PATCH 0775/1838] Hosting#359 Remove IDisposable from HttpContext and IFeatureCollection. --- src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs | 4 +--- src/Microsoft.AspNet.Http.Features/FeatureCollection.cs | 5 ----- src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs | 2 +- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 6 ------ 4 files changed, 2 insertions(+), 15 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 8029c68641..7a7a35e543 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -10,7 +10,7 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { - public abstract class HttpContext : IDisposable + public abstract class HttpContext { public abstract IFeatureCollection Features { get; } @@ -37,7 +37,5 @@ namespace Microsoft.AspNet.Http public abstract ISession Session { get; set; } public abstract void Abort(); - - public abstract void Dispose(); } } diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 25c86d06a9..eacad01a72 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -93,11 +93,6 @@ namespace Microsoft.AspNet.Http.Features } } - public virtual void Dispose() - { - _defaults?.Dispose(); - } - private class KeyComparer : IEqualityComparer> { public bool Equals(KeyValuePair x, KeyValuePair y) diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index 59741d9394..8da86ea5b9 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http.Features { - public interface IFeatureCollection : IEnumerable>, IDisposable + public interface IFeatureCollection : IEnumerable> { /// /// Indicates if the collection can be modified. diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index db0a4d27ad..29ad2e565c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -165,11 +165,5 @@ namespace Microsoft.AspNet.Http.Internal { LifetimeFeature.Abort(); } - - public override void Dispose() - { - // REVIEW: is this necessary? is the environment "owned" by the context? - _features.Dispose(); - } } } \ No newline at end of file From 8ef20c5c5677220dcf7d4e4b6ac14f764d89c92d Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 1 Oct 2015 11:57:25 -0700 Subject: [PATCH 0776/1838] Update 'build.cmd' alias parameter to use full name. --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 177997c42e..70d974a61f 100644 --- a/build.cmd +++ b/build.cmd @@ -30,7 +30,7 @@ IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 ) ELSE ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -a default + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -alias default ) CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 From b0a1a520688b6bc2bb7d5a823ddbac435fd64a66 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 1 Oct 2015 11:57:48 -0700 Subject: [PATCH 0777/1838] Update 'build.cmd' alias parameter to use full name. --- build.cmd | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.cmd b/build.cmd index 177997c42e..70d974a61f 100644 --- a/build.cmd +++ b/build.cmd @@ -30,7 +30,7 @@ IF "%SKIP_DNX_INSTALL%"=="1" goto run IF %BUILDCMD_DNX_VERSION%=="" ( CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 ) ELSE ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -a default + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -alias default ) CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 From 818575c20178103a5b61a30867e68f35995bacbb Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 1 Oct 2015 14:30:01 -0700 Subject: [PATCH 0778/1838] Fix server testing dnx scripts. --- src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs index 6619bc8e12..8a5961be4d 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Server.Testing throw new InvalidOperationException("kestrel is the only valid ServerType for Mono"); } - var dnxArgs = $"--appbase \"{DeploymentParameters.ApplicationPath}\" Microsoft.Dnx.ApplicationHost kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; Logger.LogInformation("Executing command: dnx {dnxArgs}", dnxArgs); diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index cd1293028d..07c175babc 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Server.Testing commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; } var dnxPath = Path.Combine(ChosenRuntimePath, "dnx.exe"); - var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" Microsoft.Dnx.ApplicationHost {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; Logger.LogInformation("Executing {dnxexe} {dnxArgs}", dnxPath, dnxArgs); var startInfo = new ProcessStartInfo From d61586c6a1b10583dd66e457a0484974963acfd0 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 2 Oct 2015 16:47:23 -0400 Subject: [PATCH 0779/1838] Use Jit recongised, standard loop construct For bounds check elimination. --- src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs index 50f2b22005..c9a814eaac 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.Hosting.Startup var serviceProvider = builder.ApplicationServices; var parameterInfos = MethodInfo.GetParameters(); var parameters = new object[parameterInfos.Length]; - for (var index = 0; index != parameterInfos.Length; ++index) + for (var index = 0; index < parameterInfos.Length; index++) { var parameterInfo = parameterInfos[index]; if (parameterInfo.ParameterType == typeof(IApplicationBuilder)) @@ -54,4 +54,4 @@ namespace Microsoft.AspNet.Hosting.Startup MethodInfo.Invoke(instance, parameters); } } -} \ No newline at end of file +} From 797962b60801b2bce54e8159f6b70d490e07105e Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 2 Oct 2015 16:56:39 -0400 Subject: [PATCH 0780/1838] Simpler loop construct --- src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index 70b6befd8d..924b30ebbf 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -509,9 +509,10 @@ namespace Microsoft.AspNet.Hosting.Startup private static IEnumerable FlattenAndReverseExceptionTree(Exception ex) { var list = new List(); - for (; ex != null; ex = ex.InnerException) + while (ex != null) { list.Add(ex); + ex = ex.InnerException; } list.Reverse(); return list; From e3298992e7bdacbe5ffce9c0b0c97093e4f32d96 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 2 Oct 2015 16:57:34 -0400 Subject: [PATCH 0781/1838] use var --- src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs index 48b47b4706..1835b55e52 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Server.Testing CancellationToken cancellationToken = default(CancellationToken), int retryCount = 60) { - for (int retry = 0; retry < retryCount; retry++) + for (var retry = 0; retry < retryCount; retry++) { if (cancellationToken.IsCancellationRequested) { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index ae1dfd19ca..e2ed03d89c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -235,7 +235,7 @@ namespace Microsoft.AspNet.TestHost // Assert var buffer = new byte[1]; - for (int i = 0; i < hello.Length; i++) + for (var i = 0; i < hello.Length; i++) { bool last = i == (hello.Length - 1); var result = await clientSocket.ReceiveAsync(new System.ArraySegment(buffer), CancellationToken.None); From 5f7a17b8e3097b3752a8970391c653b4e70774af Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 10:35:02 -0700 Subject: [PATCH 0782/1838] Move BufferedHtmlContent to HttpAbstractions --- HttpAbstractions.sln | 30 ++++ .../BufferedHtmlContent.cs | 125 +++++++++++++++ ...ramework.BufferedHtmlContent.Sources.xproj | 19 +++ .../project.json | 19 +++ .../BufferedHtmlContentTest.cs | 146 ++++++++++++++++++ ...t.Framework.BufferedHtmlContent.Test.xproj | 19 +++ .../project.json | 18 +++ 7 files changed, 376 insertions(+) create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json create mode 100644 test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs create mode 100644 test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj create mode 100644 test/Microsoft.Framework.BufferedHtmlContent.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index bbb59df0db..1e1b155ed3 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -49,6 +49,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\Sample EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Sources", "src\Microsoft.Framework.BufferedHtmlContent.Sources\Microsoft.Framework.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Test", "test\Microsoft.Framework.BufferedHtmlContent.Test\Microsoft.Framework.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -275,6 +279,30 @@ Global {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.Build.0 = Debug|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.Build.0 = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.ActiveCfg = Release|Any CPU + {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.Build.0 = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.ActiveCfg = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.Build.0 = Debug|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.Build.0 = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.ActiveCfg = Release|Any CPU + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -300,5 +328,7 @@ Global {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} + {B1B2B906-24AE-4C57-AAC5-19B734014504} = {A5A15F1C-885A-452A-A731-B0173DDBD913} + {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs new file mode 100644 index 0000000000..0b9ddc770f --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -0,0 +1,125 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using Microsoft.AspNet.Html.Abstractions; +using Microsoft.Framework.WebEncoders; + +namespace Microsoft.Framework.Internal +{ + /// + /// Enumerable object collection which knows how to write itself. + /// + [DebuggerDisplay("{DebuggerToString()}")] + internal class BufferedHtmlContent : IHtmlContentBuilder + { + // This is not List because that would lead to wrapping all strings to IHtmlContent + // which is not space performant. + // internal for testing. + internal List Entries { get; } = new List(); + + /// + /// Appends the to the collection. + /// + /// The string to be appended. + /// A reference to this instance after the Append operation has completed. + public IHtmlContentBuilder Append(string value) + { + Entries.Add(value); + return this; + } + + /// + /// Appends a to the collection. + /// + /// The to be appended. + /// A reference to this instance after the Append operation has completed. + public IHtmlContentBuilder Append(IHtmlContent htmlContent) + { + Entries.Add(htmlContent); + return this; + } + + /// + /// Appends the HTML encoded to the collection. + /// + /// The HTML encoded string to be appended. + /// A reference to this instance after the Append operation has completed. + public IHtmlContentBuilder AppendEncoded(string value) + { + Entries.Add(new HtmlEncodedString(value)); + return this; + } + /// + /// Removes all the entries from the collection. + /// + /// A reference to this instance after the Clear operation has completed. + public IHtmlContentBuilder Clear() + { + Entries.Clear(); + return this; + } + + /// + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + if (writer == null) + { + throw new ArgumentNullException(nameof(writer)); + } + + if (encoder == null) + { + throw new ArgumentNullException(nameof(encoder)); + } + + foreach (var entry in Entries) + { + if (entry == null) + { + continue; + } + + var entryAsString = entry as string; + if (entryAsString != null) + { + encoder.HtmlEncode(entryAsString, writer); + } + else + { + // Only string, IHtmlContent values can be added to the buffer. + ((IHtmlContent)entry).WriteTo(writer, encoder); + } + } + } + + private string DebuggerToString() + { + using (var writer = new StringWriter()) + { + WriteTo(writer, HtmlEncoder.Default); + return writer.ToString(); + } + } + + private class HtmlEncodedString : IHtmlContent + { + public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); + + private readonly string _value; + + public HtmlEncodedString(string value) + { + _value = value; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + writer.Write(_value); + } + } + } +} diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj new file mode 100644 index 0000000000..9185ec07d6 --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + b1b2b906-24ae-4c57-aac5-19b734014504 + Microsoft.Framework.BufferedHtmlContent.Sources + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json new file mode 100644 index 0000000000..6041a826dd --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json @@ -0,0 +1,19 @@ +{ + "version": "1.0.0-*", + "shared": "*.cs", + "dependencies": { }, + "frameworks" : { + "net45": { }, + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Runtime": "4.0.21-beta-*" + } + }, + "dotnet": { + "dependencies": { + "System.Runtime": "4.0.21-beta-*" + } + } + } +} diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs new file mode 100644 index 0000000000..aa0d20b2d3 --- /dev/null +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -0,0 +1,146 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using Microsoft.AspNet.Html.Abstractions; +using Microsoft.Framework.WebEncoders; +using Microsoft.Framework.WebEncoders.Testing; +using Xunit; + +namespace Microsoft.Framework.Internal +{ + public class BufferedHtmlContentTest + { + [Fact] + public void AppendString_AppendsAString() + { + // Arrange + var content = new BufferedHtmlContent(); + + // Act + content.Append("Hello"); + + // Assert + var result = Assert.Single(content.Entries); + Assert.IsType(result); + } + + [Fact] + public void AppendString_WrittenAsEncoded() + { + // Arrange + var content = new BufferedHtmlContent(); + content.Append("Hello"); + + var writer = new StringWriter(); + + // Act + content.WriteTo(writer, new CommonTestEncoder()); + + // Assert + Assert.Equal("HtmlEncode[[Hello]]", writer.ToString()); + } + + [Fact] + public void AppendEncoded_DoesNotGetWrittenAsEncoded() + { + // Arrange + var content = new BufferedHtmlContent(); + content.AppendEncoded("Hello"); + + var writer = new StringWriter(); + + // Act + content.WriteTo(writer, new CommonTestEncoder()); + + // Assert + Assert.Equal("Hello", writer.ToString()); + } + + [Fact] + public void AppendIHtmlContent_AppendsAsIs() + { + // Arrange + var content = new BufferedHtmlContent(); + var writer = new StringWriter(); + + // Act + content.Append(new TestHtmlContent("Hello")); + + // Assert + var result = Assert.Single(content.Entries); + var testHtmlContent = Assert.IsType(result); + testHtmlContent.WriteTo(writer, new CommonTestEncoder()); + Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString()); + } + + [Fact] + public void CanAppendMultipleItems() + { + // Arrange + var content = new BufferedHtmlContent(); + + // Act + content.Append(new TestHtmlContent("hello")); + content.Append("Test"); + + // Assert + Assert.Equal(2, content.Entries.Count); + Assert.Equal("Written from TestHtmlContent: hello", content.Entries[0].ToString()); + Assert.Equal("Test", content.Entries[1]); + } + + [Fact] + public void Clear_DeletesAllItems() + { + // Arrange + var content = new BufferedHtmlContent(); + content.Append(new TestHtmlContent("hello")); + content.Append("Test"); + + // Act + content.Clear(); + + // Assert + Assert.Equal(0, content.Entries.Count); + } + + [Fact] + public void WriteTo_WritesAllItems() + { + // Arrange + var content = new BufferedHtmlContent(); + var writer = new StringWriter(); + content.Append(new TestHtmlContent("Hello")); + content.Append("Test"); + + // Act + content.WriteTo(writer, new CommonTestEncoder()); + + // Assert + Assert.Equal(2, content.Entries.Count); + Assert.Equal("Written from TestHtmlContent: HelloHtmlEncode[[Test]]", writer.ToString()); + } + + private class TestHtmlContent : IHtmlContent + { + private string _content; + + public TestHtmlContent(string content) + { + _content = content; + } + + public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + { + writer.Write(ToString()); + } + + public override string ToString() + { + return "Written from TestHtmlContent: " + _content; + } + } + } +} diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj b/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj new file mode 100644 index 0000000000..a112b34876 --- /dev/null +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 3e5311e2-a73e-40cc-a58c-5a62cead43ae + Microsoft.Framework.BufferedHtmlContent.Test + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json new file mode 100644 index 0000000000..0e2b957585 --- /dev/null +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json @@ -0,0 +1,18 @@ +{ + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", + "Microsoft.Framework.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} From 079e4909f7b3a93b4217325690e026725d9a92dc Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:03:14 -0700 Subject: [PATCH 0783/1838] Adding BufferedHtmlContent to NuGetPackageVerifier --- NuGetPackageVerifier.json | 1 + 1 file changed, 1 insertion(+) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 6d1698dfd4..3a6a9f4229 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -16,6 +16,7 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, + "Microsoft.Framework.BufferedHtmlContent.Sources": { }, "Microsoft.Framework.WebEncoders": { }, "Microsoft.Framework.WebEncoders.Core": { }, "Microsoft.Net.Http.Headers": { } From 886849d890c544616d7e447d17edc68d858ec9e1 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:07:52 -0700 Subject: [PATCH 0784/1838] Adding AssemblyInfo.cs --- .../Properties/AssemblyInfo.cs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b2437d9ad6 --- /dev/null +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file From 78a8748248e8a5cb6be4acb9f74ee57a18a3ddf7 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:12:41 -0700 Subject: [PATCH 0785/1838] Fixing build break --- .../project.json | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json index 6041a826dd..812b75a205 100644 --- a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json @@ -7,11 +7,13 @@ "dnx451": { }, "dnxcore50": { "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*", "System.Runtime": "4.0.21-beta-*" } }, "dotnet": { "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*", "System.Runtime": "4.0.21-beta-*" } } From 3cb50b9cf5c92cd660b5d35c3064435d898ceeeb Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 11:12:41 -0700 Subject: [PATCH 0786/1838] Remove Microsoft.Framework.WebEncoders.Testing dependency --- .../HtmlContentBuilderExtensionsTest.cs | 5 +- .../project.json | 2 +- .../BufferedHtmlContentTest.cs | 2 - .../project.json | 2 +- .../CommonTestEncoder.cs | 103 ++++++++++++++++++ ...EncoderServiceCollectionExtensionsTests.cs | 4 +- .../project.json | 1 - 7 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 4493048940..a32724ca8f 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -7,7 +7,6 @@ using System.Globalization; using System.IO; using Microsoft.AspNet.Testing; using Microsoft.Framework.WebEncoders; -using Microsoft.Framework.WebEncoders.Testing; using Xunit; namespace Microsoft.AspNet.Html.Abstractions.Test @@ -230,7 +229,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test // Assert Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder)); } - + [Fact] public void Builder_AppendFormat_WithCulture() { @@ -248,7 +247,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test // Assert Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + + "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!", HtmlContentToString(builder)); } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 9d82a3d934..4536c6b8d2 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -2,9 +2,9 @@ "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, + "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index aa0d20b2d3..234da8af9c 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -1,11 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.IO; using Microsoft.AspNet.Html.Abstractions; using Microsoft.Framework.WebEncoders; -using Microsoft.Framework.WebEncoders.Testing; using Xunit; namespace Microsoft.Framework.Internal diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json index 0e2b957585..8064ceed44 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json +++ b/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json @@ -5,9 +5,9 @@ "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.Framework.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, + "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs new file mode 100644 index 0000000000..9f24eae292 --- /dev/null +++ b/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs @@ -0,0 +1,103 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Globalization; +using System.IO; +using System.Runtime.CompilerServices; + +namespace Microsoft.Framework.WebEncoders +{ + /// + /// Encoder used for unit testing. + /// + internal sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder + { + /// + /// Returns "HtmlEncode[[value]]". + /// + public string HtmlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "HtmlEncode[[value]]". + /// + public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "JavaScriptStringEncode[[value]]". + /// + public string JavaScriptStringEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "JavaScriptStringEncode[[value]]". + /// + public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Returns "UrlEncode[[value]]". + /// + public string UrlEncode(string value) + { + return EncodeCore(value); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + /// + /// Writes "UrlEncode[[value]]". + /// + public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) + { + EncodeCore(value, startIndex, charCount, output); + } + + private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) + { + return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); + } + + private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); + } + + private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) + { + output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); + } + } +} \ No newline at end of file diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index f45951277e..ff6acd3772 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,10 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Xunit; using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.WebEncoders.Testing; +using Xunit; namespace Microsoft.Framework.WebEncoders { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Framework.WebEncoders.Tests/project.json index 0968582e6b..c5c1f52c94 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Framework.WebEncoders.Tests/project.json @@ -2,7 +2,6 @@ "dependencies": { "Microsoft.Framework.DependencyInjection": "1.0.0-*", "Microsoft.Framework.WebEncoders": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Testing": "1.0.0-*", "Newtonsoft.Json": "6.0.6", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 61466af7a38497ae25d538e5eb0f4cbcb6f303a0 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 15:44:37 -0700 Subject: [PATCH 0787/1838] Renaming Microsoft.Framework.* -> Microsoft.Extensions.* --- HttpAbstractions.sln | 12 ++++++------ NuGetPackageVerifier.json | 6 +++--- samples/SampleApp/Program.cs | 4 ++-- .../HtmlContentBuilderExtensions.cs | 4 ++-- .../IHtmlContent.cs | 2 +- .../project.json | 4 ++-- .../Extensions/UseMiddlewareExtensions.cs | 2 +- .../IHeaderDictionary.cs | 2 +- .../IReadableStringCollection.cs | 2 +- .../PathString.cs | 2 +- .../QueryString.cs | 4 ++-- .../project.json | 4 ++-- .../HeaderDictionaryExtensions.cs | 4 ++-- .../HeaderDictionaryTypeExtensions.cs | 2 +- .../Internal/HeaderSegmentCollection.cs | 2 +- .../Internal/ParsingHelpers.cs | 2 +- .../QueryBuilder.cs | 2 +- .../project.json | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- src/Microsoft.AspNet.Http.Features/project.json | 2 +- .../Features/FormFeature.cs | 2 +- .../Features/HttpRequestFeature.cs | 2 +- .../Features/HttpResponseFeature.cs | 2 +- .../Features/QueryFeature.cs | 2 +- .../Features/RequestCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/FormCollection.cs | 2 +- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 2 +- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 2 +- .../ReadableStringCollection.cs | 2 +- .../RequestCookiesCollection.cs | 2 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 4 ++-- .../DictionaryStringArrayWrapper.cs | 4 ++-- .../DictionaryStringValuesWrapper.cs | 4 ++-- .../OwinFeatureCollection.cs | 2 +- src/Microsoft.AspNet.Owin/Utilities.cs | 2 +- src/Microsoft.AspNet.WebUtilities/FormReader.cs | 2 +- .../KeyValueAccumulator.cs | 2 +- .../MultipartReader.cs | 2 +- .../MultipartSection.cs | 2 +- .../QueryHelpers.cs | 4 ++-- src/Microsoft.AspNet.WebUtilities/project.json | 4 ++-- .../BufferedHtmlContent.cs | 4 ++-- ...xtensions.BufferedHtmlContent.Sources.xproj} | 4 ++-- .../Properties/AssemblyInfo.cs | 0 .../project.json | 0 .../AllowedCharsBitmap.cs | 2 +- .../CodePointFilter.cs | 2 +- .../EncoderCommon.cs | 2 +- .../EncoderExtensions.cs | 2 +- .../EncoderServiceProviderExtensions.cs | 2 +- .../HexUtil.cs | 2 +- .../HtmlEncoder.cs | 2 +- .../ICodePointFilter.cs | 2 +- .../IHtmlEncoder.cs | 2 +- .../IJavaScriptStringEncoder.cs | 2 +- .../IUrlEncoder.cs | 2 +- .../JavaScriptStringEncoder.cs | 2 +- ...Microsoft.Extensions.WebEncoders.Core.xproj} | 0 .../Properties/AssemblyInfo.cs | 2 +- .../UnicodeEncoderBase.cs | 2 +- .../UnicodeHelpers.cs | 2 +- .../UnicodeRange.cs | 2 +- .../UnicodeRanges.cs | 2 +- .../UnicodeRanges.generated.cs | 2 +- .../UrlEncoder.cs | 2 +- .../WebEncoderOptions.cs | 2 +- .../resources/unicode-defined-chars.bin | Bin .../project.json | 0 .../EncoderServiceCollectionExtensions.cs | 8 ++++---- .../Microsoft.Extensions.WebEncoders.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 6 +++--- .../HtmlContentBuilderExtensionsTest.cs | 4 ++-- .../project.json | 2 +- .../ResponseExtensionTests.cs | 4 ++-- .../project.json | 2 +- .../DefaultHttpRequestTests.cs | 2 +- .../HeaderDictionaryTests.cs | 2 +- .../BufferedHtmlContentTest.cs | 6 +++--- ...t.Extensions.BufferedHtmlContent.Test.xproj} | 4 ++-- .../project.json | 4 ++-- .../AllowedCharsBitmapTests.cs | 2 +- .../CodePointFilterTests.cs | 2 +- .../CommonTestEncoder.cs | 2 +- .../EncoderCommonTests.cs | 2 +- .../EncoderExtensionsTests.cs | 2 +- .../EncoderServiceCollectionExtensionsTests.cs | 4 ++-- .../EncoderServiceProviderExtensionsTests.cs | 2 +- .../Entities.cs | 2 +- .../Extensions.cs | 2 +- .../HtmlEncoderTests.cs | 2 +- .../JavaScriptStringEncoderTests.cs | 2 +- ...icrosoft.Extensions.WebEncoders.Tests.xproj} | 0 .../ParsedEntity.cs | 2 +- .../UnicodeEncoderBaseTests.cs | 2 +- .../UnicodeHelpersTests.cs | 2 +- .../UnicodeRangeTests.cs | 2 +- .../UnicodeRangesTests.cs | 2 +- .../UrlEncoderTests.cs | 2 +- .../project.json | 4 ++-- unicode/how-to-update.txt | 16 ++++++++-------- 102 files changed, 134 insertions(+), 134 deletions(-) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources => Microsoft.Extensions.BufferedHtmlContent.Sources}/BufferedHtmlContent.cs (98%) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj => Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj} (88%) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources => Microsoft.Extensions.BufferedHtmlContent.Sources}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Framework.BufferedHtmlContent.Sources => Microsoft.Extensions.BufferedHtmlContent.Sources}/project.json (100%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/AllowedCharsBitmap.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/CodePointFilter.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/EncoderCommon.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/EncoderExtensions.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/EncoderServiceProviderExtensions.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/HexUtil.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/HtmlEncoder.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/ICodePointFilter.cs (92%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/IHtmlEncoder.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/IJavaScriptStringEncoder.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/IUrlEncoder.cs (97%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/JavaScriptStringEncoder.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj => Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj} (100%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/Properties/AssemblyInfo.cs (72%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeEncoderBase.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeHelpers.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeRange.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeRanges.cs (98%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UnicodeRanges.generated.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/UrlEncoder.cs (99%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/WebEncoderOptions.cs (94%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/compiler/resources/unicode-defined-chars.bin (100%) rename src/{Microsoft.Framework.WebEncoders.Core => Microsoft.Extensions.WebEncoders.Core}/project.json (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Extensions.WebEncoders}/EncoderServiceCollectionExtensions.cs (92%) rename src/{Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj => Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj} (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Extensions.WebEncoders}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.Framework.WebEncoders => Microsoft.Extensions.WebEncoders}/project.json (69%) rename test/{Microsoft.Framework.BufferedHtmlContent.Test => Microsoft.Extensions.BufferedHtmlContent.Test}/BufferedHtmlContentTest.cs (96%) rename test/{Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj => Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj} (88%) rename test/{Microsoft.Framework.BufferedHtmlContent.Test => Microsoft.Extensions.BufferedHtmlContent.Test}/project.json (64%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/AllowedCharsBitmapTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/CodePointFilterTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/CommonTestEncoder.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderCommonTests.cs (95%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderExtensionsTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderServiceCollectionExtensionsTests.cs (97%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/EncoderServiceProviderExtensionsTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/Entities.cs (96%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/Extensions.cs (94%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/HtmlEncoderTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/JavaScriptStringEncoderTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj => Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj} (100%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/ParsedEntity.cs (90%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeEncoderBaseTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeHelpersTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeRangeTests.cs (98%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UnicodeRangesTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/UrlEncoderTests.cs (99%) rename test/{Microsoft.Framework.WebEncoders.Tests => Microsoft.Extensions.WebEncoders.Tests}/project.json (79%) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 1e1b155ed3..28574eee21 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 @@ -35,11 +35,11 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders", "src\Microsoft.Framework.WebEncoders\Microsoft.Framework.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders", "src\Microsoft.Extensions.WebEncoders\Microsoft.Extensions.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Tests", "test\Microsoft.Framework.WebEncoders.Tests\Microsoft.Framework.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.WebEncoders.Core", "src\Microsoft.Framework.WebEncoders.Core\Microsoft.Framework.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Core", "src\Microsoft.Extensions.WebEncoders.Core\Microsoft.Extensions.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" EndProject @@ -49,9 +49,9 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\Sample EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Sources", "src\Microsoft.Framework.BufferedHtmlContent.Sources\Microsoft.Framework.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Sources", "src\Microsoft.Extensions.BufferedHtmlContent.Sources\Microsoft.Extensions.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Framework.BufferedHtmlContent.Test", "test\Microsoft.Framework.BufferedHtmlContent.Test\Microsoft.Framework.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Test", "test\Microsoft.Extensions.BufferedHtmlContent.Test\Microsoft.Extensions.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 3a6a9f4229..d465e3b553 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -16,9 +16,9 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, - "Microsoft.Framework.BufferedHtmlContent.Sources": { }, - "Microsoft.Framework.WebEncoders": { }, - "Microsoft.Framework.WebEncoders.Core": { }, + "Microsoft.Extensions.BufferedHtmlContent.Sources": { }, + "Microsoft.Extensions.WebEncoders": { }, + "Microsoft.Extensions.WebEncoders.Core": { }, "Microsoft.Net.Http.Headers": { } } }, diff --git a/samples/SampleApp/Program.cs b/samples/SampleApp/Program.cs index c434e6c0a6..0bfe4fbd10 100644 --- a/samples/SampleApp/Program.cs +++ b/samples/SampleApp/Program.cs @@ -1,6 +1,6 @@ -using System; +using System; using System.Diagnostics; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace SampleApp { diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 0e15077764..5f8515bb03 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,7 +6,7 @@ using System.Diagnostics; using System.Globalization; using System.IO; using System.Text; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions { diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs index fc77f9edf4..05f09cb7b4 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions { diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index e4f6452bf1..fd368e97e6 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 HTML content interface.", "repository": { @@ -9,7 +9,7 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "net45" : { }, diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 04430164df..cac2100ce3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Abstractions; -using Microsoft.Framework.Internal; +using Microsoft.Extensions.Internal; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs index 36137ed45c..b6483c15a8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs index d85e960d9b..81c8408753 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index be6422063f..4f1499650d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,7 +3,7 @@ using System; using System.Linq; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index ed59879585..25ba1f2699 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Primitives; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.Primitives; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 3ae66b0aba..1d944cde2a 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -10,8 +10,8 @@ }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs index c986a530c0..6a8d909dba 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -1,8 +1,8 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 78bafd33bc..5b1f70f471 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using Microsoft.AspNet.Http.Headers; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index d3bfe5f4cf..6806dbaab0 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,7 +1,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index 93a5bfc631..f829eec939 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index fa23ebeced..060c04efc7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http.Extensions { diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 4ef0842096..1d330ebe5d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -10,7 +10,7 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index 7e61bb915a..d67143e096 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index b46b4ae4b6..2a8b10ab15 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 51e3cada2f..73e5663933 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -9,7 +9,7 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.Primitives": "1.0.0-*" + "Microsoft.Extensions.Primitives": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index 6d6ff1d012..b5e71b8cab 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index 73bf244cbf..900976e647 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 010a13c86c..50a204efcf 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 5dd7ca9163..b0ceafb3f1 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 0eb44ef102..3806a65f06 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index 550ad933eb..a0e7428567 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 20b520b783..2955cddec0 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -4,7 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 6bf5a57ae6..ef8c526945 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Globalization; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs index c1ed5d910e..8239699e1b 100644 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs index 8fb23def3d..d0001c1a5d 100644 --- a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index c4db554c47..e67251f61a 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -3,8 +3,8 @@ using System; using System.Linq; -using Microsoft.Framework.Primitives; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.Primitives; +using Microsoft.Extensions.WebEncoders; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs index fb1e812cca..4aec5c9d27 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs index e94ecbcb30..51cd330dd8 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index de01c47052..72a7b19f4f 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -17,7 +17,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index 98fc30ea26..a7aa9a752c 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; using Microsoft.AspNet.Http; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index d4e36264de..e361bac1c4 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -7,7 +7,7 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index eb8f311c50..c0ecc8c45c 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index 8c87e5db52..ef6f03a92f 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -7,7 +7,7 @@ using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index c420073eef..29dfc49574 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; using System.IO; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 17022d0b2d..465ce48a83 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; -using Microsoft.Framework.Primitives; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.Primitives; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.WebUtilities { diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 88b039b752..5a64ca96b6 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -9,8 +9,8 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.Primitives": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs similarity index 98% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 0b9ddc770f..3b79916d9c 100644 --- a/src/Microsoft.Framework.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; -namespace Microsoft.Framework.Internal +namespace Microsoft.Extensions.Internal { /// /// Enumerable object collection which knows how to write itself. diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj similarity index 88% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj index 9185ec07d6..6d93971523 100644 --- a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Microsoft.Framework.BufferedHtmlContent.Sources.xproj +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -7,7 +7,7 @@ b1b2b906-24ae-4c57-aac5-19b734014504 - Microsoft.Framework.BufferedHtmlContent.Sources + Microsoft.Extensions.BufferedHtmlContent.Sources ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json similarity index 100% rename from src/Microsoft.Framework.BufferedHtmlContent.Sources/project.json rename to src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json diff --git a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs rename to src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs index 5d396a473a..aae7b3c8b8 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/AllowedCharsBitmap.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs @@ -4,7 +4,7 @@ using System; using System.Diagnostics; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal struct AllowedCharsBitmap { diff --git a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs rename to src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs index 8858c2df17..dda6499604 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/CodePointFilter.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Represents a filter which allows only certain Unicode code points through. diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs rename to src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs index 3ec108fff2..940a8590ae 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderCommon.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal static class EncoderCommon { diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs rename to src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs index df01877f6d..d6428f866e 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs @@ -4,7 +4,7 @@ using System; using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Helpful extension methods for the encoder classes. diff --git a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs rename to src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs index 7d2b81a8fe..f08f37db52 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains extension methods for fetching encoders from an . diff --git a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs rename to src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs index a2a350b9a9..3262a1665d 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HexUtil.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.Runtime.CompilerServices; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains helpers for dealing with byte-hex char conversions. diff --git a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs index 5a0553e782..d1347c0338 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/HtmlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// A class which can perform HTML encoding given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs similarity index 92% rename from src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs rename to src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs index f39c3580f8..446bc354a5 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/ICodePointFilter.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Represents a filter which allows only certain Unicode code points through. diff --git a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs index f7c6adb064..e6bbb35a5c 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IHtmlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Provides services for HTML-encoding input. diff --git a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs index 19b7d843e2..29d07a46cc 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Provides services for JavaScript-escaping strings. diff --git a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs similarity index 97% rename from src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs index edcaaffea8..c3e92568ab 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/IUrlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Provides services for URL-escaping strings. diff --git a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs index 6328bdebc1..008c6bcc51 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/JavaScriptStringEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// A class which can perform JavaScript string escaping given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj b/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj similarity index 100% rename from src/Microsoft.Framework.WebEncoders.Core/Microsoft.Framework.WebEncoders.Core.xproj rename to src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj diff --git a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs similarity index 72% rename from src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs rename to src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs index 48510ed635..b781d6ca97 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -5,6 +5,6 @@ using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Microsoft.Framework.WebEncoders.Tests")] +[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs index 1588ec0e19..1a6baaf665 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeEncoderBase.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Text; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal unsafe abstract class UnicodeEncoderBase { diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs index fac3a2e4e1..53e52ef573 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeHelpers.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs @@ -7,7 +7,7 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains helpers for dealing with Unicode code points. diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs index 78a3c41a2f..8320350e16 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRange.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Represents a contiguous range of Unicode code points. diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs similarity index 98% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs index f78837bc6e..73d155e141 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Contains predefined instances which correspond to blocks diff --git a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs index 64d522f248..ae2079a309 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UnicodeRanges.generated.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs @@ -4,7 +4,7 @@ using System; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public static partial class UnicodeRanges { diff --git a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs similarity index 99% rename from src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs rename to src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs index e15096659f..f5d6ea1c99 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/UrlEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs @@ -7,7 +7,7 @@ using System.IO; using System.Runtime.CompilerServices; using System.Threading; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// A class which can perform URL string escaping given an allow list of characters which diff --git a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs similarity index 94% rename from src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs rename to src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs index 0e06693f3c..b68b05ee50 100644 --- a/src/Microsoft.Framework.WebEncoders.Core/WebEncoderOptions.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). diff --git a/src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin b/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin similarity index 100% rename from src/Microsoft.Framework.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin rename to src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin diff --git a/src/Microsoft.Framework.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json similarity index 100% rename from src/Microsoft.Framework.WebEncoders.Core/project.json rename to src/Microsoft.Extensions.WebEncoders.Core/project.json diff --git a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs similarity index 92% rename from src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs rename to src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs index 13505165d8..0cb40d8a62 100644 --- a/src/Microsoft.Framework.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.DependencyInjection.Extensions; -using Microsoft.Framework.OptionsModel; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.WebEncoders; -namespace Microsoft.Framework.DependencyInjection +namespace Microsoft.Extensions.DependencyInjection { public static class EncoderServiceCollectionExtensions { diff --git a/src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj b/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Microsoft.Framework.WebEncoders.xproj rename to src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj diff --git a/src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.Framework.WebEncoders/Properties/AssemblyInfo.cs rename to src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.Framework.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json similarity index 69% rename from src/Microsoft.Framework.WebEncoders/project.json rename to src/Microsoft.Extensions.WebEncoders/project.json index d2a1c401fb..7cd8aac9ad 100644 --- a/src/Microsoft.Framework.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -9,9 +9,9 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Framework.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*", - "Microsoft.Framework.WebEncoders.Core": "1.0.0-*" + "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", + "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { "net45": { }, diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index a32724ca8f..660b1a4dc6 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.IO; using Microsoft.AspNet.Testing; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; using Xunit; namespace Microsoft.AspNet.Html.Abstractions.Test diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 4536c6b8d2..789d27a38d 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Testing": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], + "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs index 2565ef1f80..383f75315e 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -7,7 +7,7 @@ using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Extensions diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index bac140231f..2b7a5ed450 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 4a767821ff..33f6a3ac9c 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs index c353d54d68..d69dd0a129 100644 --- a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; using Xunit; namespace Microsoft.AspNet.Http.Internal diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs similarity index 96% rename from test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs rename to test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index 234da8af9c..e883f84960 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -1,12 +1,12 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; using Xunit; -namespace Microsoft.Framework.Internal +namespace Microsoft.Extensions.Internal { public class BufferedHtmlContentTest { diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj similarity index 88% rename from test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj rename to test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj index a112b34876..a091460b76 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/Microsoft.Framework.BufferedHtmlContent.Test.xproj +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -7,7 +7,7 @@ 3e5311e2-a73e-40cc-a58c-5a62cead43ae - Microsoft.Framework.BufferedHtmlContent.Test + Microsoft.Extensions.BufferedHtmlContent.Test ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json similarity index 64% rename from test/Microsoft.Framework.BufferedHtmlContent.Test/project.json rename to test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json index 8064ceed44..0f4d9b84b3 100644 --- a/test/Microsoft.Framework.BufferedHtmlContent.Test/project.json +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json @@ -4,10 +4,10 @@ }, "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.Framework.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs" ], + "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs index faf6d4c982..24cdb75568 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class AllowedCharsBitmapTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs index 64e517a6f0..39624b1fb1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CodePointFilterTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class CodePointFilterTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs index 9f24eae292..b78d91e8c2 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/CommonTestEncoder.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.IO; using System.Runtime.CompilerServices; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { /// /// Encoder used for unit testing. diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs similarity index 95% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs index debec372ac..ac9fc8bb28 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderCommonTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderCommonTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs index 5b7797340f..abdc1d9cc2 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs @@ -5,7 +5,7 @@ using System; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderExtensionsTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs similarity index 97% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index ff6acd3772..790210be39 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderServiceCollectionExtensionsTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index 07b23933e1..b62068a941 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class EncoderServiceProviderExtensionsTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs similarity index 96% rename from test/Microsoft.Framework.WebEncoders.Tests/Entities.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs index e10ff951b0..c872b7bf9d 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Entities.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs @@ -7,7 +7,7 @@ using System.IO; using System.Linq; using Newtonsoft.Json; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal static class Entities { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs similarity index 94% rename from test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs index 14d0f21e9d..97b157b7d5 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/Extensions.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public static class Extensions { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs index 471ea4f385..8fe2ddde62 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/HtmlEncoderTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class HtmlEncoderTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs index 4acee36980..b4d4f250de 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs @@ -6,7 +6,7 @@ using System.Globalization; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class JavaScriptStringEncoderTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj b/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj similarity index 100% rename from test/Microsoft.Framework.WebEncoders.Tests/Microsoft.Framework.WebEncoders.Tests.xproj rename to test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj diff --git a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs similarity index 90% rename from test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs index e7bf1f49a6..b52ee7f04f 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/ParsedEntity.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs @@ -4,7 +4,7 @@ using System; using Newtonsoft.Json; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { internal sealed class ParsedEntity { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs index 6ee48c5954..1c088e8b16 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs @@ -7,7 +7,7 @@ using System.Globalization; using System.IO; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UnicodeEncoderBaseTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs index cf170bf3f8..57ba091465 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeHelpersTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs @@ -10,7 +10,7 @@ using System.Reflection; using System.Text; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public unsafe class UnicodeHelpersTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs similarity index 98% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs index fd64048673..dd9302f2a1 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangeTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs @@ -4,7 +4,7 @@ using System; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UnicodeRangeTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs index 208eb34c6b..ddb4b1c646 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UnicodeRangesTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs @@ -5,7 +5,7 @@ using System; using System.Reflection; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UnicodeRangesTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs similarity index 99% rename from test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs rename to test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs index 54ad81839e..2f31e0e16f 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/UrlEncoderTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Text; using Xunit; -namespace Microsoft.Framework.WebEncoders +namespace Microsoft.Extensions.WebEncoders { public class UrlEncoderTests { diff --git a/test/Microsoft.Framework.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json similarity index 79% rename from test/Microsoft.Framework.WebEncoders.Tests/project.json rename to test/Microsoft.Extensions.WebEncoders.Tests/project.json index c5c1f52c94..87d9e98e9c 100644 --- a/test/Microsoft.Framework.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { - "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.WebEncoders": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.Extensions.WebEncoders": "1.0.0-*", "Newtonsoft.Json": "6.0.6", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, diff --git a/unicode/how-to-update.txt b/unicode/how-to-update.txt index 246e84891a..5014ea151b 100644 --- a/unicode/how-to-update.txt +++ b/unicode/how-to-update.txt @@ -18,7 +18,7 @@ the WebEncoders project. Running this will drop a file unicode-defined-chars.bin into the output folder. Move this file into the following directory, overwriting the existing file in that directory: - src\Microsoft.Framework.WebEncoders.Core\compiler\resources + src\Microsoft.Extensions.WebEncoders.Core\compiler\resources 4) Open the Generators solution and run the UnicodeTablesGenerator project. Running this will drop two files UnicodeRanges.generated.txt and @@ -33,12 +33,12 @@ the WebEncoders project. - Low Surrogates (U+DC00..U+DFFF) - Private Use Area (U+E000..U+F8FF) -6) Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.generated.cs in +6) Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.generated.cs in your IDE. Delete everything within the partial class definition and replace it with the contents of UnicodeRanges.generated.txt. (Remember to remove the blocks mentioned in the previous step, otherwise unit tests will fail.) - Open src\Microsoft.Framework.WebEncoders.Core\UnicodeRanges.cs in your IDE. + Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.cs in your IDE. Update the doc comment at the top of the class to reflect the appropriate version of the Unicode specification. @@ -48,14 +48,14 @@ the WebEncoders project. See step (5) for the list of which blocks must be removed. Then re-save this file. -8) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeRangesTests.cs in +8) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeRangesTests.cs in your IDE. Delete all of the [InlineData] attributes on the Range_Unicode test, then paste the contents of UnicodeRangesTests.generated.txt in to restore the new [InlineData] list. IMPORTANT: Don't delete the [Theory] attribute on this method! -9) Open test\Microsoft.Framework.WebEncoders.Tests\UnicodeHelpersTests.cs in +9) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeHelpersTests.cs in your IDE. Scroll to the bottom of the ReadListOfDefinedCharacters method, and you'll see a section where the test special-cases CJK Ideographs and Hangul Syllables. As more characters are added to the Unicode specification @@ -77,14 +77,14 @@ reflect the version you just submitted. To recap, the files you should check in are: -src\Microsoft.Framework.WebEncoders.Core\compiler\resources\ +src\Microsoft.Extensions.WebEncoders.Core\compiler\resources\ unicode-defined-chars.bin -src\Microsoft.Framework.WebEncoders.Core\ +src\Microsoft.Extensions.WebEncoders.Core\ UnicodeRanges.cs UnicodeRanges.generated.cs -test\Microsoft.Framework.WebEncoders.Tests\ +test\Microsoft.Extensions.WebEncoders.Tests\ UnicodeHelpersTests.cs (if necessary, see step 9) UnicodeRangesTests.cs From 1ef8474be2fdcfae27b880cc3544979fd3d68d88 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Sat, 3 Oct 2015 15:44:40 -0700 Subject: [PATCH 0788/1838] Renaming Microsoft.Framework.* -> Microsoft.Extensions.* --- .../IServerFactory.cs | 2 +- .../project.json | 4 ++-- .../Internal/HostingEngine.cs | 6 +++--- .../Internal/RequestServicesContainerFeature.cs | 2 +- .../Internal/RequestServicesContainerMiddleware.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 4 ++-- src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs | 2 +- .../Startup/ConfigureDelegate.cs | 2 +- .../Startup/ConfigureServicesDelegate.cs | 2 +- .../Startup/StartupExceptionPage.cs | 4 ++-- .../Startup/StartupLoader.cs | 2 +- .../Startup/StartupMethods.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 6 +++--- src/Microsoft.AspNet.Hosting/project.json | 12 ++++++------ .../Common/RetryHelper.cs | 2 +- .../Deployers/ApplicationDeployer.cs | 2 +- .../Deployers/ApplicationDeployerFactory.cs | 2 +- .../Deployers/IISDeployer.cs | 2 +- .../Deployers/IISExpressDeployer.cs | 2 +- .../Deployers/MonoDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- src/Microsoft.AspNet.TestHost/RequestFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 2 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs | 2 +- .../Fakes/StartupBase.cs | 2 +- .../Fakes/StartupConfigureServicesThrows.cs | 2 +- .../Fakes/StartupConfigureThrows.cs | 2 +- .../Fakes/StartupTwoConfigureServices.cs | 2 +- .../Fakes/StartupWithConfigureServices.cs | 4 ++-- .../Fakes/StartupWithNullConfigureServices.cs | 4 ++-- .../HostingEngineTests.cs | 8 ++++---- .../StartupManagerTests.cs | 4 ++-- .../WebHostBuilderTests.cs | 4 ++-- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- .../TestServerTests.cs | 8 ++++---- test/Microsoft.AspNet.TestHost.Tests/project.json | 2 +- 38 files changed, 61 insertions(+), 61 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs index ff188af7d1..c685ff8570 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs @@ -4,7 +4,7 @@ using System; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Configuration; +using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting.Server { diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index 85f0dc5415..c36c180620 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 Hosting server abstractions.", "repository": { @@ -7,7 +7,7 @@ }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Framework.Configuration.Abstractions": "1.0.0-*" + "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 6d92a39688..786ba49eff 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -15,9 +15,9 @@ using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.Dnx.Runtime; -using Microsoft.Framework.Configuration; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Hosting.Internal { diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs index 6a0972fe58..0de3d46ac6 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs @@ -3,7 +3,7 @@ using System; using Microsoft.AspNet.Http.Features.Internal; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Internal { diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs index 25949db506..8cf659227e 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -7,7 +7,7 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Internal { diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 269f415d8b..7c2cbb2127 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -5,8 +5,8 @@ using System; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Server.Features; using Microsoft.Dnx.Runtime; -using Microsoft.Framework.Configuration; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs index 3a94dfaca5..4f3b5fe4f0 100644 --- a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs @@ -4,7 +4,7 @@ using System; using System.Linq; using System.Reflection; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Server { diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs index c9a814eaac..da39fa6d3c 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs @@ -4,7 +4,7 @@ using System; using System.Reflection; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs index 716795bc8d..f5eaea5aed 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs @@ -4,7 +4,7 @@ using System; using System.Linq; using System.Reflection; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index 924b30ebbf..bf3125e834 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -13,7 +13,7 @@ using System.Runtime.ExceptionServices; using System.Text; using Microsoft.Dnx.Compilation; using Microsoft.Dnx.Runtime; -using Microsoft.Framework.WebEncoders; +using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 28d716ffa4..f97b024bec 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Reflection; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs index e8b61efdab..b62dae27f7 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs @@ -3,7 +3,7 @@ using System; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Startup { diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 2563776356..2e969d90cc 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -11,9 +11,9 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; using Microsoft.Dnx.Runtime; -using Microsoft.Framework.Configuration; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index ac5468cff2..10d8cfadfb 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -12,12 +12,12 @@ "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Framework.Configuration": "1.0.0-*", - "Microsoft.Framework.Configuration.CommandLine": "1.0.0-*", - "Microsoft.Framework.Configuration.EnvironmentVariables": "1.0.0-*", - "Microsoft.Framework.Configuration.Json": "1.0.0-*", - "Microsoft.Framework.DependencyInjection": "1.0.0-*", - "Microsoft.Framework.Logging": "1.0.0-*", + "Microsoft.Extensions.Configuration": "1.0.0-*", + "Microsoft.Extensions.Configuration.CommandLine": "1.0.0-*", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-*", + "Microsoft.Extensions.Configuration.Json": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.Extensions.Logging": "1.0.0-*", "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", "Newtonsoft.Json": "6.0.6", diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs index 1835b55e52..e6f9038725 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs @@ -6,7 +6,7 @@ using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 19fe88337b..2c0d8f1742 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -7,7 +7,7 @@ using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Threading; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs index d40a6562c1..3bdcd17684 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index fe3e046254..744c216dfd 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -7,7 +7,7 @@ using System.IO; using System.Linq; using System.Threading; using System.Xml; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Web.Administration; namespace Microsoft.AspNet.Server.Testing diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index bd334652a8..a9aaea2a35 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.IO; using System.Threading; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs index 8a5961be4d..93913099f2 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -6,7 +6,7 @@ using System.Diagnostics; using System.IO; using System.Linq; using System.Threading; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 07c175babc..d9a67a6f89 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.IO; using System.Threading; -using Microsoft.Framework.Logging; +using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing { diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 44cd34edf5..90279d5ecf 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -7,7 +7,7 @@ }, "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.Logging.Abstractions": "1.0.0-*", + "Microsoft.Extensions.Logging.Abstractions": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index b55b02b6ff..a82bd17759 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.IO; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index 2f699e572d..ec63ebe73f 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; -using Microsoft.Framework.Primitives; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.TestHost { diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 3a6522c476..6cdaffc401 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -10,8 +10,8 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.Dnx.Runtime.Infrastructure; -using Microsoft.Framework.Configuration; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.TestHost { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs index 700fbf6d7e..d3fd5bb8bf 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using System; namespace Microsoft.AspNet.Hosting.Fakes diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs index d2f27bdf40..90edd4e1cc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs index b7b3cfcdef..f3c19ac07d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs @@ -3,7 +3,7 @@ using System; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs index 063404a4d1..55db505105 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs @@ -3,7 +3,7 @@ using System; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs index 0442c3785c..335dd4eaa8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs index 8c580bb13b..31213c0c08 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs @@ -1,6 +1,6 @@ -using System; +using System; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs index b14bf11e99..5a6df112ac 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs @@ -1,6 +1,6 @@ -using System; +using System; using Microsoft.AspNet.Builder; -using Microsoft.Framework.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index ded586de90..9594e06f26 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -18,10 +18,10 @@ using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.AspNet.Testing.xunit; using Microsoft.Dnx.Runtime.Infrastructure; -using Microsoft.Framework.Configuration; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Internal; -using Microsoft.Framework.OptionsModel; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Internal; +using Microsoft.Extensions.OptionsModel; using Moq; using Xunit; diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index a5afed8b7b..e186469f0b 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -8,8 +8,8 @@ using Microsoft.AspNet.Builder; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Startup; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.OptionsModel; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.OptionsModel; using Xunit; namespace Microsoft.AspNet.Hosting.Tests diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 8d1b812ad8..4cd92b967e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -11,7 +11,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; using Microsoft.Dnx.Runtime.Infrastructure; -using Microsoft.Framework.Configuration; +using Microsoft.Extensions.Configuration; using Xunit; namespace Microsoft.AspNet.Hosting diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index cb5c6a1159..f4cb38366d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -3,7 +3,7 @@ "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Framework.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.OptionsModel": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 174b29c092..58d8e09699 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -13,10 +13,10 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; -using Microsoft.Framework.Configuration; -using Microsoft.Framework.DependencyInjection; -using Microsoft.Framework.Logging; -using Microsoft.Framework.TelemetryAdapter; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.TelemetryAdapter; using Xunit; namespace Microsoft.AspNet.TestHost diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 1d9db6febe..af78732d7c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", - "Microsoft.Framework.TelemetryAdapter": "1.0.0-*", + "Microsoft.Extensions.TelemetryAdapter": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From 8ecb14733258afa8a8086ac8e53dc2cd0bfdf545 Mon Sep 17 00:00:00 2001 From: damianedwards Date: Fri, 2 Oct 2015 15:38:22 -0700 Subject: [PATCH 0789/1838] Added overload to PathString.StartsWithSegments to allow specifying StringComparison: - This allows us to have a fast-path (or just be more explicit) for the comparison by doing case-sensitive checks (which are cheaper) --- .../PathString.cs | 56 +++++++++++--- .../PathStringTests.cs | 77 +++++++++++++++++++ 2 files changed, 124 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 4f1499650d..f9538e7444 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Http /// The unescaped path to be assigned to the Value property. public PathString(string value) { - if (!String.IsNullOrEmpty(value) && value[0] != '/') + if (!string.IsNullOrEmpty(value) && value[0] != '/') { throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, nameof(value)); } @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Http /// public bool HasValue { - get { return !String.IsNullOrEmpty(_value); } + get { return !string.IsNullOrEmpty(_value); } } /// @@ -98,23 +98,61 @@ namespace Microsoft.AspNet.Http return new PathString("/" + uri.GetComponents(UriComponents.Path, UriFormat.Unescaped)); } + /// + /// Determines whether the beginning of this instance matches the specified . + /// + /// The to compare. + /// true if value matches the beginning of this string; otherwise, false. public bool StartsWithSegments(PathString other) { - string value1 = Value ?? String.Empty; - string value2 = other.Value ?? String.Empty; - if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase); + } + + /// + /// Determines whether the beginning of this instance matches the specified when compared + /// using the specified comparison option. + /// + /// The to compare. + /// One of the enumeration values that determines how this and value are compared. + /// true if value matches the beginning of this string; otherwise, false. + public bool StartsWithSegments(PathString other, StringComparison comparisonType) + { + var value1 = Value ?? string.Empty; + var value2 = other.Value ?? string.Empty; + if (value1.StartsWith(value2, comparisonType)) { return value1.Length == value2.Length || value1[value2.Length] == '/'; } return false; } + /// + /// Determines whether the beginning of this PathString instance matches the specified when compared + /// using the specified comparison option and returns the remaining segments. + /// + /// The to compare. + /// The remaining segments after the match. + /// true if value matches the beginning of this string; otherwise, false. [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] public bool StartsWithSegments(PathString other, out PathString remaining) { - string value1 = Value ?? String.Empty; - string value2 = other.Value ?? String.Empty; - if (value1.StartsWith(value2, StringComparison.OrdinalIgnoreCase)) + return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase, out remaining); + } + + /// + /// Determines whether the beginning of this instance matches the specified and returns + /// the remaining segments. + /// + /// The to compare. + /// One of the enumeration values that determines how this and value are compared. + /// The remaining segments after the match. + /// true if value matches the beginning of this string; otherwise, false. + [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] + public bool StartsWithSegments(PathString other, StringComparison comparisonType, out PathString remaining) + { + var value1 = Value ?? string.Empty; + var value2 = other.Value ?? string.Empty; + if (value1.StartsWith(value2, comparisonType)) { if (value1.Length == value2.Length || value1[value2.Length] == '/') { @@ -278,7 +316,7 @@ namespace Microsoft.AspNet.Http /// Implicitly calls ToString(). /// /// - public static implicit operator string(PathString path) + public static implicit operator string (PathString path) { return path.ToString(); } diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs index 245ce693e2..48d403a9ee 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using Microsoft.AspNet.Testing; using Xunit; @@ -70,5 +71,81 @@ namespace Microsoft.AspNet.Http result = path + "text"; Assert.Equal("/pathtext", result); } + + [Theory] + [InlineData("/test/path", "/TEST", true)] + [InlineData("/test/path", "/TEST/pa", false)] + [InlineData("/TEST/PATH", "/test", true)] + [InlineData("/TEST/path", "/test/pa", false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", true)] + public void StartsWithSegments_DoesACaseInsensitiveMatch(string sourcePath, string testPath, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + var result = source.StartsWithSegments(test); + + Assert.Equal(expectedResult, result); + } + + [Theory] + [InlineData("/test/path", "/TEST", true)] + [InlineData("/test/path", "/TEST/pa", false)] + [InlineData("/TEST/PATH", "/test", true)] + [InlineData("/TEST/path", "/test/pa", false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", true)] + public void StartsWithSegmentsWithRemainder_DoesACaseInsensitiveMatch(string sourcePath, string testPath, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + PathString remaining; + var result = source.StartsWithSegments(test, out remaining); + + Assert.Equal(expectedResult, result); + } + + [Theory] + [InlineData("/test/path", "/TEST", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/path", "/TEST", StringComparison.Ordinal, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.Ordinal, false)] + [InlineData("/TEST/PATH", "/test", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/TEST/PATH", "/test", StringComparison.Ordinal, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.Ordinal, false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.Ordinal, false)] + public void StartsWithSegments_DoesMatchUsingSpecifiedComparison(string sourcePath, string testPath, StringComparison comparison, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + var result = source.StartsWithSegments(test, comparison); + + Assert.Equal(expectedResult, result); + } + + [Theory] + [InlineData("/test/path", "/TEST", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/path", "/TEST", StringComparison.Ordinal, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/test/path", "/TEST/pa", StringComparison.Ordinal, false)] + [InlineData("/TEST/PATH", "/test", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/TEST/PATH", "/test", StringComparison.Ordinal, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.OrdinalIgnoreCase, false)] + [InlineData("/TEST/path", "/test/pa", StringComparison.Ordinal, false)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.OrdinalIgnoreCase, true)] + [InlineData("/test/PATH/path/TEST", "/TEST/path/PATH", StringComparison.Ordinal, false)] + public void StartsWithSegmentsWithRemainder_DoesMatchUsingSpecifiedComparison(string sourcePath, string testPath, StringComparison comparison, bool expectedResult) + { + var source = new PathString(sourcePath); + var test = new PathString(testPath); + + PathString remaining; + var result = source.StartsWithSegments(test, comparison, out remaining); + + Assert.Equal(expectedResult, result); + } } } From 7441855c3466aa03f63633dd19ca3660a5ea3089 Mon Sep 17 00:00:00 2001 From: damianedwards Date: Fri, 2 Oct 2015 11:44:34 -0700 Subject: [PATCH 0790/1838] Don't use a GUID for request ID because it's slow: - FastHttpRequestIdentifierFeature uses an incrementing long with an int seed - Everything is lazy so no computer incurred if ID is not asked for - Optimized routine to stringify the ID - #306 --- .../FastHttpRequestIdentifierFeature.cs | 60 +++++++++++++++++++ .../Internal/HostingEngine.cs | 6 +- .../HostingEngineTests.cs | 4 +- .../FastHttpRequestIdentifierFeatureTests.cs | 44 ++++++++++++++ 4 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs new file mode 100644 index 0000000000..74f7b36d6e --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs @@ -0,0 +1,60 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class FastHttpRequestIdentifierFeature : IHttpRequestIdentifierFeature + { + private static readonly string _hexChars = "0123456789ABCDEF"; + // Seed the _requestId for this application instance with a random int + private static long _requestId = new Random().Next(); + + private string _id = null; + + public string TraceIdentifier + { + get + { + // Don't incur the cost of generating the request ID until it's asked for + if (_id == null) + { + _id = GenerateRequestId(Interlocked.Increment(ref _requestId)); + } + return _id; + } + set + { + _id = value; + } + } + + private static string GenerateRequestId(long id) + { + // The following routine is ~33% faster than calling long.ToString() when testing in tight loops of + // 1 million iterations. + var charBuffer = new char[sizeof(long) * 2]; + charBuffer[0] = _hexChars[(int)(id >> 60) & 0x0f]; + charBuffer[1] = _hexChars[(int)(id >> 56) & 0x0f]; + charBuffer[2] = _hexChars[(int)(id >> 52) & 0x0f]; + charBuffer[3] = _hexChars[(int)(id >> 48) & 0x0f]; + charBuffer[4] = _hexChars[(int)(id >> 44) & 0x0f]; + charBuffer[5] = _hexChars[(int)(id >> 40) & 0x0f]; + charBuffer[6] = _hexChars[(int)(id >> 36) & 0x0f]; + charBuffer[7] = _hexChars[(int)(id >> 32) & 0x0f]; + charBuffer[8] = _hexChars[(int)(id >> 28) & 0x0f]; + charBuffer[9] = _hexChars[(int)(id >> 24) & 0x0f]; + charBuffer[10] = _hexChars[(int)(id >> 20) & 0x0f]; + charBuffer[11] = _hexChars[(int)(id >> 16) & 0x0f]; + charBuffer[12] = _hexChars[(int)(id >> 12) & 0x0f]; + charBuffer[13] = _hexChars[(int)(id >> 8) & 0x0f]; + charBuffer[14] = _hexChars[(int)(id >> 4) & 0x0f]; + charBuffer[15] = _hexChars[(int)(id >> 0) & 0x0f]; + + return new string(charBuffer); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 786ba49eff..55b4170469 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -12,7 +12,6 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.Dnx.Runtime; using Microsoft.Extensions.Configuration; @@ -278,10 +277,7 @@ namespace Microsoft.AspNet.Hosting.Internal var requestIdentifierFeature = httpContext.Features.Get(); if (requestIdentifierFeature == null) { - requestIdentifierFeature = new HttpRequestIdentifierFeature() - { - TraceIdentifier = Guid.NewGuid().ToString() - }; + requestIdentifierFeature = new FastHttpRequestIdentifierFeature(); httpContext.Features.Set(requestIdentifierFeature); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 9594e06f26..e3bd3759a7 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -305,7 +305,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.Features.Get()); + Assert.IsType(httpContext.Features.Get()); } [Fact] @@ -328,7 +328,7 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.Features.Get()); + Assert.IsType(httpContext.Features.Get()); } [Fact] diff --git a/test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs new file mode 100644 index 0000000000..fff0fb603a --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs @@ -0,0 +1,44 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Hosting.Internal; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests.Internal +{ + public class FastHttpRequestIdentifierFeatureTests + { + [Fact] + public void TraceIdentifier_ReturnsId() + { + var feature = new FastHttpRequestIdentifierFeature(); + + var id = feature.TraceIdentifier; + + Assert.NotNull(id); + } + + [Fact] + public void TraceIdentifier_ReturnsStableId() + { + var feature = new FastHttpRequestIdentifierFeature(); + + var id1 = feature.TraceIdentifier; + var id2 = feature.TraceIdentifier; + + Assert.Equal(id1, id2); + } + + [Fact] + public void TraceIdentifier_ReturnsUniqueIdForDifferentInstances() + { + var feature1 = new FastHttpRequestIdentifierFeature(); + var feature2 = new FastHttpRequestIdentifierFeature(); + + var id1 = feature1.TraceIdentifier; + var id2 = feature2.TraceIdentifier; + + Assert.NotEqual(id1, id2); + } + } +} From 62ce39afb6f0222ae33b082eee031ee32c3fc27f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=81=82=E3=81=BE=E3=81=BF=E3=82=84=20=E3=82=86=E3=81=86?= =?UTF-8?q?=E3=81=93?= <1@1234.sh> Date: Wed, 7 Oct 2015 07:11:56 +0800 Subject: [PATCH 0791/1838] To correct the word spelling To correct the word spelling --- .../compiler/resources/Compilation_Exception.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html b/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html index 4a4faf1d23..76f56157ba 100644 --- a/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html @@ -1,5 +1,5 @@ 
- One or more compilation errors occured:
+ One or more compilation errors occurred:
{0}
From f88b20608249a0d4e703b0e8048a16ff0b3dc548 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 7 Oct 2015 09:20:12 -0700 Subject: [PATCH 0792/1838] #310 Do not automatically wrap IFeatureCollections. --- .../Builder/HttpContextFactory.cs | 2 +- .../HostingEngineTests.cs | 23 ------------------- .../HttpContextFactoryFacts.cs | 2 +- 3 files changed, 2 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index 7fccad6854..d24250405b 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Hosting.Builder { public HttpContext CreateHttpContext(IFeatureCollection featureCollection) { - return new DefaultHttpContext(new FeatureCollection(featureCollection)); + return new DefaultHttpContext(featureCollection); } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index e3bd3759a7..159c2775b5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -308,29 +308,6 @@ namespace Microsoft.AspNet.Hosting Assert.IsType(httpContext.Features.Get()); } - [Fact] - public void Hosting_CreatesDefaultRequestIdentifierFeature_IfNotPresent_ForImmutableFeatureCollection() - { - // Arrange - HttpContext httpContext = null; - var requestDelegate = new RequestDelegate(innerHttpContext => - { - httpContext = innerHttpContext; - return Task.FromResult(0); - }); - - _featuresSupportedByThisHost = new ReadOnlyFeatureCollection(); - - var hostingEngine = CreateHostingEngine(requestDelegate); - - // Act - var disposable = hostingEngine.Start(); - - // Assert - Assert.NotNull(httpContext); - Assert.IsType(httpContext.Features.Get()); - } - [Fact] public void HostingEngine_DoesNot_CreateDefaultRequestIdentifierFeature_IfPresent() { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs index 302da49712..a355ca0842 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new Dictionary(); var contextFactory = new HttpContextFactory(); - var context = contextFactory.CreateHttpContext(new OwinFeatureCollection(env)); + var context = contextFactory.CreateHttpContext(new FeatureCollection(new OwinFeatureCollection(env))); // Setting a feature will throw if the above feature collection is not wrapped in a mutable feature collection. context.Features.Set(new CustomFeature(100)); From 3741d3869156ec03db45120ce181ee50e892a800 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 8 Oct 2015 08:36:27 -0700 Subject: [PATCH 0793/1838] #426 Move IHeaderDictionary to Features to reduce wrapping. --- .../IHeaderDictionary.cs | 34 ------------------- .../IHeaderDictionary.cs | 21 ++++++++++++ .../IHttpRequestFeature.cs | 4 +-- .../IHttpResponseFeature.cs | 4 +-- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 2 +- .../Features/HttpRequestFeature.cs | 8 ++--- .../Features/HttpResponseFeature.cs | 7 ++-- .../DictionaryStringArrayWrapper.cs | 7 ++-- .../DictionaryStringValuesWrapper.cs | 13 ++++++- src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 4 +-- .../OwinFeatureCollection.cs | 8 ++--- src/Microsoft.AspNet.Owin/Utilities.cs | 4 +-- .../ResponseExtensionTests.cs | 2 +- .../DefaultHttpRequestTests.cs | 10 +++--- 15 files changed, 61 insertions(+), 69 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs create mode 100644 src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs deleted file mode 100644 index b6483c15a8..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/IHeaderDictionary.cs +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace Microsoft.AspNet.Http -{ - /// - /// Represents request and response headers - /// - public interface IHeaderDictionary : IReadableStringCollection, IDictionary - { - // This property is duplicated to resolve an ambiguity between IReadableStringCollection and IDictionary - /// - /// - /// - /// - /// The stored value, or StringValues.Empty if the key is not present. - new StringValues this[string key] { get; set; } - - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Count and IDictionary.Count - /// - /// Gets the number of elements contained in the collection. - /// - new int Count { get; } - - // This property is duplicated to resolve an ambiguity between IReadableStringCollection.Keys and IDictionary.Keys - /// - /// Gets a collection containing the keys. - /// - new ICollection Keys { get; } - } -} diff --git a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs new file mode 100644 index 0000000000..0c03c29d90 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs @@ -0,0 +1,21 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Http +{ + /// + /// Represents request and response headers + /// + public interface IHeaderDictionary : IDictionary + { + /// + /// IHeaderDictionary has a different indexer contract than IDictionary, where it will return StringValues.Empty for missing entries. + /// + /// + /// The stored value, or StringValues.Empty if the key is not present. + new StringValues this[string key] { get; set; } + } +} diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs index d67143e096..988f2b6194 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs @@ -1,9 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; using System.IO; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -15,7 +13,7 @@ namespace Microsoft.AspNet.Http.Features string PathBase { get; set; } string Path { get; set; } string QueryString { get; set; } - IDictionary Headers { get; set; } + IHeaderDictionary Headers { get; set; } Stream Body { get; set; } } } diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs index 2a8b10ab15..67cfa28333 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs @@ -2,10 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features { @@ -13,7 +11,7 @@ namespace Microsoft.AspNet.Http.Features { int StatusCode { get; set; } string ReasonPhrase { get; set; } - IDictionary Headers { get; set; } + IHeaderDictionary Headers { get; set; } Stream Body { get; set; } bool HasStarted { get; } void OnStarting(Func callback, object state); diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 479ead6ebf..b06bc6f410 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Http.Internal public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpRequestFeature.Headers); } + get { return HttpRequestFeature.Headers; } } public override IReadableStringCollection Cookies diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index e5f09f7ca2..81c5539a81 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -43,7 +43,7 @@ namespace Microsoft.AspNet.Http.Internal public override IHeaderDictionary Headers { - get { return new HeaderDictionary(HttpResponseFeature.Headers); } + get { return HttpResponseFeature.Headers; } } public override Stream Body diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs index 900976e647..de48b71b8a 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs @@ -1,10 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; using System.IO; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { @@ -12,7 +10,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { public HttpRequestFeature() { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new HeaderDictionary(); Body = Stream.Null; Protocol = string.Empty; Scheme = string.Empty; @@ -28,7 +26,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string PathBase { get; set; } public string Path { get; set; } public string QueryString { get; set; } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public Stream Body { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs index 50a204efcf..adb411ee3a 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs @@ -2,10 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { @@ -14,7 +13,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public HttpResponseFeature() { StatusCode = 200; - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new HeaderDictionary(); Body = Stream.Null; } @@ -22,7 +21,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs index 4aec5c9d27..5fe22814d4 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs @@ -4,18 +4,19 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Http; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { internal class DictionaryStringArrayWrapper : IDictionary { - public DictionaryStringArrayWrapper(IDictionary inner) + public DictionaryStringArrayWrapper(IHeaderDictionary inner) { Inner = inner; } - public readonly IDictionary Inner; + public readonly IHeaderDictionary Inner; private KeyValuePair Convert(KeyValuePair item) => new KeyValuePair(item.Key, item.Value); @@ -27,7 +28,7 @@ namespace Microsoft.AspNet.Owin string[] IDictionary.this[string key] { - get { return Inner[key]; } + get { return ((IDictionary)Inner)[key]; } set { Inner[key] = value; } } diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs index 51cd330dd8..aec1a0d921 100644 --- a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs @@ -4,11 +4,12 @@ using System.Collections; using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Http; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { - internal class DictionaryStringValuesWrapper : IDictionary + internal class DictionaryStringValuesWrapper : IHeaderDictionary { public DictionaryStringValuesWrapper(IDictionary inner) { @@ -25,6 +26,16 @@ namespace Microsoft.AspNet.Owin private string[] Convert(StringValues item) => item; + StringValues IHeaderDictionary.this[string key] + { + get + { + string[] values; + return Inner.TryGetValue(key, out values) ? values : null; + } + set { Inner[key] = value; } + } + StringValues IDictionary.this[string key] { get { return Inner[key]; } diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index c6cdd63926..5e4db89d1a 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -56,13 +56,13 @@ namespace Microsoft.AspNet.Owin { OwinConstants.RequestPath, new FeatureMap(feature => feature.Path, () => string.Empty, (feature, value) => feature.Path = Convert.ToString(value)) }, { OwinConstants.RequestQueryString, new FeatureMap(feature => Utilities.RemoveQuestionMark(feature.QueryString), () => string.Empty, (feature, value) => feature.QueryString = Utilities.AddQuestionMark(Convert.ToString(value))) }, - { OwinConstants.RequestHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, + { OwinConstants.RequestHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeHeaderDictionary((IDictionary)value)) }, { OwinConstants.RequestBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.RequestUser, new FeatureMap(feature => feature.User, () => null, (feature, value) => feature.User = (ClaimsPrincipal)value) }, { OwinConstants.ResponseStatusCode, new FeatureMap(feature => feature.StatusCode, () => 200, (feature, value) => feature.StatusCode = Convert.ToInt32(value)) }, { OwinConstants.ResponseReasonPhrase, new FeatureMap(feature => feature.ReasonPhrase, (feature, value) => feature.ReasonPhrase = Convert.ToString(value)) }, - { OwinConstants.ResponseHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeDictionaryStringValues((IDictionary)value)) }, + { OwinConstants.ResponseHeaders, new FeatureMap(feature => Utilities.MakeDictionaryStringArray(feature.Headers), (feature, value) => feature.Headers = Utilities.MakeHeaderDictionary((IDictionary)value)) }, { OwinConstants.ResponseBody, new FeatureMap(feature => feature.Body, () => Stream.Null, (feature, value) => feature.Body = (Stream)value) }, { OwinConstants.CommonKeys.OnSendingHeaders, new FeatureMap( feature => new Action, object>((cb, state) => { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 72a7b19f4f..6d955194fa 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -106,9 +106,9 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.RequestQueryString, Utilities.RemoveQuestionMark(value)); } } - IDictionary IHttpRequestFeature.Headers + IHeaderDictionary IHttpRequestFeature.Headers { - get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.RequestHeaders)); } + get { return Utilities.MakeHeaderDictionary(Prop>(OwinConstants.RequestHeaders)); } set { Prop(OwinConstants.RequestHeaders, Utilities.MakeDictionaryStringArray(value)); } } @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.ResponseReasonPhrase, value); } } - IDictionary IHttpResponseFeature.Headers + IHeaderDictionary IHttpResponseFeature.Headers { - get { return Utilities.MakeDictionaryStringValues(Prop>(OwinConstants.ResponseHeaders)); } + get { return Utilities.MakeHeaderDictionary(Prop>(OwinConstants.ResponseHeaders)); } set { Prop(OwinConstants.ResponseHeaders, Utilities.MakeDictionaryStringArray(value)); } } diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNet.Owin/Utilities.cs index a7aa9a752c..00789a86c2 100644 --- a/src/Microsoft.AspNet.Owin/Utilities.cs +++ b/src/Microsoft.AspNet.Owin/Utilities.cs @@ -46,7 +46,7 @@ namespace Microsoft.AspNet.Owin return new ClaimsPrincipal(principal); } - internal static IDictionary MakeDictionaryStringValues(IDictionary dictionary) + internal static IHeaderDictionary MakeHeaderDictionary(IDictionary dictionary) { var wrapper = dictionary as DictionaryStringArrayWrapper; if (wrapper != null) @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Owin return new DictionaryStringValuesWrapper(dictionary); } - internal static IDictionary MakeDictionaryStringArray(IDictionary dictionary) + internal static IDictionary MakeDictionaryStringArray(IHeaderDictionary dictionary) { var wrapper = dictionary as DictionaryStringValuesWrapper; if (wrapper != null) diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs index 383f75315e..efa5f370ee 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Extensions public bool HasStarted { get { return true; } } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public string ReasonPhrase { get; set; } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 33f6a3ac9c..e020da61fa 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -65,7 +65,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "localhost:9001"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new HeaderDictionary() { { "Host", expected }, }; @@ -85,7 +85,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "löcalhöst"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase) + var headers = new HeaderDictionary() { { "Host", "xn--lcalhst-90ae" }, }; @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.Http.Internal // Arrange const string expected = "xn--lcalhst-90ae"; - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new HeaderDictionary(); var request = CreateRequest(headers); @@ -188,7 +188,7 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal(new[] { "name2=value2" }, cookieHeaders); } - private static HttpRequest CreateRequest(IDictionary headers) + private static HttpRequest CreateRequest(IHeaderDictionary headers) { var context = new DefaultHttpContext(); context.Features.Get().Headers = headers; @@ -217,7 +217,7 @@ namespace Microsoft.AspNet.Http.Internal private static HttpRequest GetRequestWithHeader(string headerName, string headerValue) { - var headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var headers = new HeaderDictionary(); if (headerValue != null) { headers.Add(headerName, headerValue); From 2da9f13db3d0e0e7b6ae69953a5356c98e321c92 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Mon, 5 Oct 2015 10:37:42 -0400 Subject: [PATCH 0794/1838] Less allocs in GenerateRequestId Case insentive base32 encoding --- .../FastHttpRequestIdentifierFeature.cs | 53 ++++++++++--------- src/Microsoft.AspNet.Hosting/project.json | 5 +- 2 files changed, 33 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs index 74f7b36d6e..95e7806557 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs @@ -9,9 +9,12 @@ namespace Microsoft.AspNet.Hosting.Internal { public class FastHttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { - private static readonly string _hexChars = "0123456789ABCDEF"; - // Seed the _requestId for this application instance with a random int - private static long _requestId = new Random().Next(); + // Base64 encoding - but in ascii sort order for easy text based sorting + private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; + // Seed the _requestId for this application instance with + // the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 + // for a roughly increasing _requestId over restarts + private static long _requestId = DateTime.UtcNow.Ticks; private string _id = null; @@ -32,29 +35,31 @@ namespace Microsoft.AspNet.Hosting.Internal } } - private static string GenerateRequestId(long id) + private static unsafe string GenerateRequestId(long id) { - // The following routine is ~33% faster than calling long.ToString() when testing in tight loops of - // 1 million iterations. - var charBuffer = new char[sizeof(long) * 2]; - charBuffer[0] = _hexChars[(int)(id >> 60) & 0x0f]; - charBuffer[1] = _hexChars[(int)(id >> 56) & 0x0f]; - charBuffer[2] = _hexChars[(int)(id >> 52) & 0x0f]; - charBuffer[3] = _hexChars[(int)(id >> 48) & 0x0f]; - charBuffer[4] = _hexChars[(int)(id >> 44) & 0x0f]; - charBuffer[5] = _hexChars[(int)(id >> 40) & 0x0f]; - charBuffer[6] = _hexChars[(int)(id >> 36) & 0x0f]; - charBuffer[7] = _hexChars[(int)(id >> 32) & 0x0f]; - charBuffer[8] = _hexChars[(int)(id >> 28) & 0x0f]; - charBuffer[9] = _hexChars[(int)(id >> 24) & 0x0f]; - charBuffer[10] = _hexChars[(int)(id >> 20) & 0x0f]; - charBuffer[11] = _hexChars[(int)(id >> 16) & 0x0f]; - charBuffer[12] = _hexChars[(int)(id >> 12) & 0x0f]; - charBuffer[13] = _hexChars[(int)(id >> 8) & 0x0f]; - charBuffer[14] = _hexChars[(int)(id >> 4) & 0x0f]; - charBuffer[15] = _hexChars[(int)(id >> 0) & 0x0f]; + // The following routine is ~310% faster than calling long.ToString() on x64 + // and ~600% faster than calling long.ToString() on x86 in tight loops of 1 million+ iterations + // See: https://github.com/aspnet/Hosting/pull/385 - return new string(charBuffer); + // stackalloc to allocate array on stack rather than heap + char* charBuffer = stackalloc char[13]; + + charBuffer[0] = _encode32Chars[(int)(id >> 60) & 31]; + charBuffer[1] = _encode32Chars[(int)(id >> 55) & 31]; + charBuffer[2] = _encode32Chars[(int)(id >> 50) & 31]; + charBuffer[3] = _encode32Chars[(int)(id >> 45) & 31]; + charBuffer[4] = _encode32Chars[(int)(id >> 40) & 31]; + charBuffer[5] = _encode32Chars[(int)(id >> 35) & 31]; + charBuffer[6] = _encode32Chars[(int)(id >> 30) & 31]; + charBuffer[7] = _encode32Chars[(int)(id >> 25) & 31]; + charBuffer[8] = _encode32Chars[(int)(id >> 20) & 31]; + charBuffer[9] = _encode32Chars[(int)(id >> 15) & 31]; + charBuffer[10] = _encode32Chars[(int)(id >> 10) & 31]; + charBuffer[11] = _encode32Chars[(int)(id >> 5) & 31]; + charBuffer[12] = _encode32Chars[(int)id & 31]; + + // string ctor overload that takes char* + return new string(charBuffer, 0, 13); } } } diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 10d8cfadfb..18ea116249 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -5,7 +5,10 @@ "type": "git", "url": "git://github.com/aspnet/hosting" }, - "compilationOptions": { "warningsAsErrors": true }, + "compilationOptions": { + "warningsAsErrors": true, + "allowUnsafe": true + }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", From 9a12085ef95bc5d9ab4f78aa3c2e5ab88f927816 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 8 Oct 2015 11:17:14 -0700 Subject: [PATCH 0795/1838] Suppress [Obsolete] warnings for TelemetrySource --- NuGet.config | 2 +- .../Internal/HostingEngine.cs | 12 ++++++++---- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 ++ .../TestServerTests.cs | 2 ++ 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/NuGet.config b/NuGet.config index 1707938c61..03704957e8 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 55b4170469..d0a951849d 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -88,7 +88,9 @@ namespace Microsoft.AspNet.Hosting.Internal var logger = _applicationServices.GetRequiredService>(); var contextFactory = _applicationServices.GetRequiredService(); var contextAccessor = _applicationServices.GetRequiredService(); +#pragma warning disable 0618 var telemetrySource = _applicationServices.GetRequiredService(); +#pragma warning restore 0618 var server = ServerFactory.Start(_serverInstance, async features => { @@ -96,12 +98,12 @@ namespace Microsoft.AspNet.Hosting.Internal httpContext.ApplicationServices = _applicationServices; var requestIdentifier = GetRequestIdentifier(httpContext); contextAccessor.HttpContext = httpContext; - +#pragma warning disable 0618 if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); } - +#pragma warning restore 0618 try { using (logger.IsEnabled(LogLevel.Critical) @@ -113,18 +115,20 @@ namespace Microsoft.AspNet.Hosting.Internal } catch (Exception ex) { +#pragma warning disable 0618 if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) { telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); } - +#pragma warning restore 0618 throw; } - +#pragma warning disable 0618 if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) { telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext }); } +#pragma warning restore 0618 }); _applicationLifetime.NotifyStarted(); diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 2e969d90cc..e3ae6b3517 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -99,9 +99,11 @@ namespace Microsoft.AspNet.Hosting services.AddSingleton(); services.AddLogging(); +#pragma warning disable 0618 var telemetrySource = new TelemetryListener("Microsoft.AspNet"); services.AddInstance(telemetrySource); services.AddInstance(telemetrySource); +#pragma warning restore 0618 // Conjure up a RequestServices services.AddTransient(); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 58d8e09699..9bb5cdd9e6 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -437,6 +437,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); } +#pragma warning disable 0618 [Fact] public async Task BeginEndTelemetryAvailable() { @@ -480,6 +481,7 @@ namespace Microsoft.AspNet.TestHost Assert.NotNull(listener.UnhandledException?.HttpContext); Assert.NotNull(listener.UnhandledException?.Exception); } +#pragma warning restore 0618 public class TestTelemetryListener { From f7c7306881770e3c3fbf06be66df7489487875f2 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 8 Oct 2015 10:17:28 -0700 Subject: [PATCH 0796/1838] React to IHeaderDictionary changes. --- src/Microsoft.AspNet.TestHost/RequestFeature.cs | 9 ++++----- src/Microsoft.AspNet.TestHost/ResponseFeature.cs | 8 ++++---- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNet.TestHost/RequestFeature.cs index a82bd17759..7f63957663 100644 --- a/src/Microsoft.AspNet.TestHost/RequestFeature.cs +++ b/src/Microsoft.AspNet.TestHost/RequestFeature.cs @@ -1,11 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections.Generic; using System.IO; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.TestHost { @@ -14,7 +13,7 @@ namespace Microsoft.AspNet.TestHost public RequestFeature() { Body = Stream.Null; - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new HeaderDictionary(); Method = "GET"; Path = ""; PathBase = ""; @@ -25,7 +24,7 @@ namespace Microsoft.AspNet.TestHost public Stream Body { get; set; } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public string Method { get; set; } diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs index ec63ebe73f..c0744d9239 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseFeature.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.Extensions.Primitives; +using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.TestHost { @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.TestHost public ResponseFeature() { - Headers = new Dictionary(StringComparer.OrdinalIgnoreCase); + Headers = new HeaderDictionary(); Body = new MemoryStream(); // 200 is the default status code all the way down to the host, so we set it @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.TestHost public string ReasonPhrase { get; set; } - public IDictionary Headers { get; set; } + public IHeaderDictionary Headers { get; set; } public Stream Body { get; set; } From a0c632d64331cd6a006c4ccf9c844b909a5e1cc7 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 8 Oct 2015 19:00:46 -0700 Subject: [PATCH 0797/1838] React to aspnet/Universe#290 fix --- build.cmd | 25 +++++++++++++------------ build.sh | 12 +++++++----- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/build.cmd b/build.cmd index 70d974a61f..84dc87e480 100644 --- a/build.cmd +++ b/build.cmd @@ -18,22 +18,23 @@ md .nuget copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore -IF EXIST packages\KoreBuild goto run +IF EXIST packages\Sake goto getdnx IF %BUILDCMD_KOREBUILD_VERSION%=="" ( - .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( - .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\nuget.exe install Sake -ExcludeVersion -Out packages +.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages -IF "%SKIP_DNX_INSTALL%"=="1" goto run -IF %BUILDCMD_DNX_VERSION%=="" ( - CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +:getdnx +IF "%SKIP_DNX_INSTALL%"=="" ( + IF "%BUILDCMD_DNX_VERSION%"=="" ( + BUILDCMD_DNX_VERSION=latest + ) + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default + CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default ) ELSE ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -alias default + CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 ) -CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 -:run -CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* \ No newline at end of file +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index 0c66139817..da4e3fcd1c 100755 --- a/build.sh +++ b/build.sh @@ -24,18 +24,20 @@ if test ! -e .nuget; then cp $cachePath .nuget/nuget.exe fi -if test ! -d packages/KoreBuild; then +if test ! -d packages/Sake; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Out packages + mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages fi if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi -if ! type dnx > /dev/null 2>&1; then - dnvm upgrade +if ! type dnx > /dev/null 2>&1 || [ -z "$SKIP_DNX_INSTALL" ]; then + dnvm install latest -runtime coreclr -alias default + dnvm install default -runtime mono -alias default +else + dnvm use default -runtime mono fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" - From 2303220cf658187754c2dacae77dd863af7fd8a4 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Thu, 8 Oct 2015 19:00:48 -0700 Subject: [PATCH 0798/1838] React to aspnet/Universe#290 fix --- build.cmd | 25 +++++++++++++------------ build.sh | 12 +++++++----- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/build.cmd b/build.cmd index 70d974a61f..84dc87e480 100644 --- a/build.cmd +++ b/build.cmd @@ -18,22 +18,23 @@ md .nuget copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore -IF EXIST packages\KoreBuild goto run +IF EXIST packages\Sake goto getdnx IF %BUILDCMD_KOREBUILD_VERSION%=="" ( - .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( - .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre + .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre ) -.nuget\nuget.exe install Sake -ExcludeVersion -Out packages +.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages -IF "%SKIP_DNX_INSTALL%"=="1" goto run -IF %BUILDCMD_DNX_VERSION%=="" ( - CALL packages\KoreBuild\build\dnvm upgrade -runtime CLR -arch x86 +:getdnx +IF "%SKIP_DNX_INSTALL%"=="" ( + IF "%BUILDCMD_DNX_VERSION%"=="" ( + BUILDCMD_DNX_VERSION=latest + ) + CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default + CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default ) ELSE ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CLR -arch x86 -alias default + CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 ) -CALL packages\KoreBuild\build\dnvm install default -runtime CoreCLR -arch x86 -:run -CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* \ No newline at end of file +packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* diff --git a/build.sh b/build.sh index 0c66139817..da4e3fcd1c 100755 --- a/build.sh +++ b/build.sh @@ -24,18 +24,20 @@ if test ! -e .nuget; then cp $cachePath .nuget/nuget.exe fi -if test ! -d packages/KoreBuild; then +if test ! -d packages/Sake; then mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Out packages + mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages fi if ! type dnvm > /dev/null 2>&1; then source packages/KoreBuild/build/dnvm.sh fi -if ! type dnx > /dev/null 2>&1; then - dnvm upgrade +if ! type dnx > /dev/null 2>&1 || [ -z "$SKIP_DNX_INSTALL" ]; then + dnvm install latest -runtime coreclr -alias default + dnvm install default -runtime mono -alias default +else + dnvm use default -runtime mono fi mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" - From 2a951aaeaa3fead9c5e095666a320578a2f1a21a Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 12 Oct 2015 12:55:15 -0700 Subject: [PATCH 0799/1838] Fix local build break --- build.cmd | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 84dc87e480..553e3929a0 100644 --- a/build.cmd +++ b/build.cmd @@ -4,8 +4,8 @@ cd %~dp0 SETLOCAL SET NUGET_VERSION=latest SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe -SET BUILDCMD_KOREBUILD_VERSION="" -SET BUILDCMD_DNX_VERSION="" +SET BUILDCMD_KOREBUILD_VERSION= +SET BUILDCMD_DNX_VERSION= IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... @@ -19,7 +19,7 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\Sake goto getdnx -IF %BUILDCMD_KOREBUILD_VERSION%=="" ( +IF "%BUILDCMD_KOREBUILD_VERSION%"=="" ( .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre @@ -27,10 +27,10 @@ IF %BUILDCMD_KOREBUILD_VERSION%=="" ( .nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages :getdnx +IF "%BUILDCMD_DNX_VERSION%"=="" ( + SET BUILDCMD_DNX_VERSION=latest +) IF "%SKIP_DNX_INSTALL%"=="" ( - IF "%BUILDCMD_DNX_VERSION%"=="" ( - BUILDCMD_DNX_VERSION=latest - ) CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default ) ELSE ( From a0b29e3f2bd487ead00b3f878a084b67350dd545 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 12 Oct 2015 12:55:41 -0700 Subject: [PATCH 0800/1838] Fix local build break --- build.cmd | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/build.cmd b/build.cmd index 84dc87e480..553e3929a0 100644 --- a/build.cmd +++ b/build.cmd @@ -4,8 +4,8 @@ cd %~dp0 SETLOCAL SET NUGET_VERSION=latest SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe -SET BUILDCMD_KOREBUILD_VERSION="" -SET BUILDCMD_DNX_VERSION="" +SET BUILDCMD_KOREBUILD_VERSION= +SET BUILDCMD_DNX_VERSION= IF EXIST %CACHED_NUGET% goto copynuget echo Downloading latest version of NuGet.exe... @@ -19,7 +19,7 @@ copy %CACHED_NUGET% .nuget\nuget.exe > nul :restore IF EXIST packages\Sake goto getdnx -IF %BUILDCMD_KOREBUILD_VERSION%=="" ( +IF "%BUILDCMD_KOREBUILD_VERSION%"=="" ( .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre ) ELSE ( .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre @@ -27,10 +27,10 @@ IF %BUILDCMD_KOREBUILD_VERSION%=="" ( .nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages :getdnx +IF "%BUILDCMD_DNX_VERSION%"=="" ( + SET BUILDCMD_DNX_VERSION=latest +) IF "%SKIP_DNX_INSTALL%"=="" ( - IF "%BUILDCMD_DNX_VERSION%"=="" ( - BUILDCMD_DNX_VERSION=latest - ) CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default ) ELSE ( From 79a8a4e799a9ca78cd53ce19fcbba006f4c388ff Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Thu, 24 Sep 2015 10:01:02 -0700 Subject: [PATCH 0801/1838] Fix deployers --- global.json | 2 +- .../Deployers/ApplicationDeployer.cs | 118 ++++++++++++++---- .../Deployers/MonoDeployer.cs | 32 +++-- .../Deployers/SelfHostDeployer.cs | 7 +- .../HostingEngineTests.cs | 3 +- 5 files changed, 127 insertions(+), 35 deletions(-) diff --git a/global.json b/global.json index 983ba0401e..dd6bbaf48b 100644 --- a/global.json +++ b/global.json @@ -1,3 +1,3 @@ { - "projects": ["src"] + "projects": ["src","c:/github/testing/src","/home/kiran/github/testing/src"] } diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 2c0d8f1742..c7a303affe 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -3,10 +3,12 @@ using System; using System.Diagnostics; +using System.Linq; using System.IO; using System.Text; using System.Text.RegularExpressions; using System.Threading; +using Microsoft.AspNet.Testing; using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing @@ -16,8 +18,14 @@ namespace Microsoft.AspNet.Server.Testing ///
public abstract class ApplicationDeployer : IApplicationDeployer { + /// + /// Example: runtimes/dnx-coreclr-win-x64.1.0.0-rc1-15844/bin + /// protected string ChosenRuntimePath { get; set; } + /// + /// Examples: dnx-coreclr-win-x64.1.0.0-rc1-15844, dnx-mono.1.0.0-rc1-15844 + /// protected string ChosenRuntimeName { get; set; } protected DeploymentParameters DeploymentParameters { get; private set; } @@ -26,6 +34,59 @@ namespace Microsoft.AspNet.Server.Testing protected Stopwatch StopWatch { get; private set; } = new Stopwatch(); + protected string OSPrefix + { + get + { + if (TestPlatformHelper.IsLinux) + { + return "linux"; + } + else if (TestPlatformHelper.IsMac) + { + return "darwin"; + } + else if (TestPlatformHelper.IsWindows) + { + return "win"; + } + else + { + throw new InvalidOperationException("Unrecognized operating system"); + } + } + } + + protected string DnuCommandName + { + get + { + if (TestPlatformHelper.IsWindows) + { + return "dnu.cmd"; + } + else + { + return "dnu"; + } + } + } + + protected string DnxCommandName + { + get + { + if (TestPlatformHelper.IsWindows) + { + return "dnx.exe"; + } + else + { + return "dnx"; + } + } + } + public abstract DeploymentResult Deploy(); public ApplicationDeployer( @@ -38,31 +99,44 @@ namespace Microsoft.AspNet.Server.Testing protected string PopulateChosenRuntimeInformation() { - var runtimePath = Process.GetCurrentProcess().MainModule.FileName; - Logger.LogInformation(string.Empty); - Logger.LogInformation($"Current runtime path is : {runtimePath}"); + // ex: runtimes/dnx-coreclr-win-x64.1.0.0-rc1-15844/bin + var currentRuntimeBinPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); + Logger.LogInformation($"Current runtime path is : {currentRuntimeBinPath}"); - var replaceStr = new StringBuilder(). - Append("dnx"). - Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr"). - Append("-win"). - Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64"). - ToString(); + var targetRuntimeName = new StringBuilder() + .Append("dnx") + .Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr") + .Append($"-{OSPrefix}") + .Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64") + .ToString(); - runtimePath = Regex.Replace(runtimePath, "dnx-(clr|coreclr)-win-(x86|x64)", replaceStr, RegexOptions.IgnoreCase); - ChosenRuntimePath = Path.GetDirectoryName(runtimePath); - - var runtimeDirectoryInfo = new DirectoryInfo(ChosenRuntimePath); - if (!runtimeDirectoryInfo.Exists) + string targetRuntimeBinPath; + // Ex: When current runtime is Mono and the tests are being run for CoreClr + if (currentRuntimeBinPath.Contains("dnx-mono")) { - throw new Exception( - string.Format("Requested runtime at location '{0}' does not exist. Please make sure it is installed before running test.", - runtimeDirectoryInfo.FullName)); + targetRuntimeBinPath = currentRuntimeBinPath.Replace("dnx-mono", targetRuntimeName); + } + else + { + targetRuntimeBinPath = Regex.Replace( + currentRuntimeBinPath, + "dnx-(clr|coreclr)-(win|linux|darwin)-(x86|x64)", + targetRuntimeName, + RegexOptions.IgnoreCase); } - ChosenRuntimeName = runtimeDirectoryInfo.Parent.Name; - Logger.LogInformation(string.Empty); - Logger.LogInformation($"Changing to use runtime : {ChosenRuntimeName}"); + var targetRuntimeBinDir = new DirectoryInfo(targetRuntimeBinPath); + if (targetRuntimeBinDir == null || !targetRuntimeBinDir.Exists) + { + throw new Exception($"Requested runtime at location '{targetRuntimeBinPath}' does not exist.Please make sure it is installed before running test."); + } + + ChosenRuntimePath = targetRuntimeBinDir.FullName; + ChosenRuntimeName = targetRuntimeBinDir.Parent.Name; + DeploymentParameters.DnxRuntime = ChosenRuntimeName; + + Logger.LogInformation($"Chosen runtime path is {ChosenRuntimePath}"); + return ChosenRuntimeName; } @@ -75,7 +149,7 @@ namespace Microsoft.AspNet.Server.Testing var parameters = $"publish {DeploymentParameters.ApplicationPath} -o {DeploymentParameters.PublishedApplicationRootPath}" + $" --runtime {DeploymentParameters.DnxRuntime} {noSource} --iis-command {command}"; - var dnuPath = Path.Combine(ChosenRuntimePath, "dnu.cmd"); + var dnuPath = Path.Combine(ChosenRuntimePath, DnuCommandName); Logger.LogInformation($"Executing command {dnuPath} {parameters}"); var startInfo = new ProcessStartInfo @@ -115,7 +189,7 @@ namespace Microsoft.AspNet.Server.Testing { try { - // We've originally published the application in a temp folder. We need to delete it. + // We've originally published the application in a temp folder. We need to delete it. Directory.Delete(DeploymentParameters.PublishedApplicationRootPath, true); } catch (Exception exception) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs index 93913099f2..00e1d9b999 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; @@ -36,13 +37,20 @@ namespace Microsoft.AspNet.Server.Testing throw new Exception("Runtime not detected on the machine."); } + var runtimeBinDir = new DirectoryInfo(runtimeBin); + ChosenRuntimePath = runtimeBinDir.FullName; + ChosenRuntimeName = runtimeBinDir.Parent.Name; + DeploymentParameters.DnxRuntime = ChosenRuntimeName; + if (DeploymentParameters.PublishApplicationBeforeDeployment) { // We use full path to runtime to pack. - DeploymentParameters.DnxRuntime = new DirectoryInfo(runtimeBin).Parent.FullName; DnuPublish(); } + DeploymentParameters.EnvironmentVariables + .Add(new KeyValuePair("DNX_APPBASE", DeploymentParameters.ApplicationPath)); + // Launch the host process. var hostExitToken = StartMonoHost(); @@ -62,29 +70,36 @@ namespace Microsoft.AspNet.Server.Testing throw new InvalidOperationException("kestrel is the only valid ServerType for Mono"); } + var dnxPath = Path.Combine(ChosenRuntimePath, DnxCommandName); var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; - - Logger.LogInformation("Executing command: dnx {dnxArgs}", dnxArgs); + Logger.LogInformation($"Executing command {dnxPath} {dnxArgs}"); var startInfo = new ProcessStartInfo { - FileName = "dnx", + FileName = dnxPath, Arguments = dnxArgs, UseShellExecute = false, CreateNoWindow = true, + RedirectStandardError = true, + RedirectStandardOutput = true, + // Trying a work around for https://github.com/aspnet/Hosting/issues/140. RedirectStandardInput = true }; - _hostProcess = Process.Start(startInfo); + AddEnvironmentVariablesToProcess(startInfo); + + _hostProcess = new Process() { StartInfo = startInfo }; + _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data ?? string.Empty); }; + _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data ?? string.Empty); }; _hostProcess.EnableRaisingEvents = true; var hostExitTokenSource = new CancellationTokenSource(); _hostProcess.Exited += (sender, e) => { - Logger.LogError("Host process {processName} exited with code {exitCode}.", startInfo.FileName, _hostProcess.ExitCode); TriggerHostShutdown(hostExitTokenSource); }; - - Logger.LogInformation("Started {0}. Process Id : {1}", _hostProcess.MainModule.FileName, _hostProcess.Id); + _hostProcess.Start(); + _hostProcess.BeginErrorReadLine(); + _hostProcess.BeginOutputReadLine(); if (_hostProcess.HasExited) { @@ -92,6 +107,7 @@ namespace Microsoft.AspNet.Server.Testing throw new Exception("Failed to start host"); } + Logger.LogInformation("Started {fileName}. Process Id : {processId}", startInfo.FileName, _hostProcess.Id); return hostExitTokenSource.Token; } diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index d9a67a6f89..1d2c2b1ed7 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -5,6 +5,7 @@ using System; using System.Diagnostics; using System.IO; using System.Threading; +using Microsoft.AspNet.Testing; using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing @@ -50,11 +51,11 @@ namespace Microsoft.AspNet.Server.Testing var commandName = DeploymentParameters.Command; if (string.IsNullOrEmpty(commandName)) { - commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "web" : "kestrel"; + commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "weblistener" : "kestrel"; } - var dnxPath = Path.Combine(ChosenRuntimePath, "dnx.exe"); + var dnxPath = Path.Combine(ChosenRuntimePath, DnxCommandName); var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; - Logger.LogInformation("Executing {dnxexe} {dnxArgs}", dnxPath, dnxArgs); + Logger.LogInformation($"Executing {dnxPath} {dnxArgs}"); var startInfo = new ProcessStartInfo { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 159c2775b5..e640180a97 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -281,7 +281,8 @@ namespace Microsoft.AspNet.Hosting } [ConditionalTheory] - [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] + [OSSkipCondition(OperatingSystems.Linux)] + [OSSkipCondition(OperatingSystems.MacOSX)] [InlineData(@"sub/sub2\sub3\", @"sub/sub2/sub3/")] public void MapPath_Windows_Facts(string virtualPath, string expectedSuffix) { From 374526b2704f6a6b1dbb6587b704efd29109ab30 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 13 Oct 2015 03:31:33 -0700 Subject: [PATCH 0802/1838] Merge IApplicationShutdown and IApplicationLifetime - Added StopApplication to IApplicationLifetime. This will replace IApplicationShutdown.RequestShutdown. --- .../IApplicationLifetime.cs | 5 +++ .../ApplicationLifetime.cs | 41 ++++++++----------- .../Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 8 ++-- 4 files changed, 27 insertions(+), 29 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs index 536e24c165..3dd7bcf8aa 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs @@ -30,5 +30,10 @@ namespace Microsoft.AspNet.Hosting ///
/// CancellationToken ApplicationStopped { get; } + + /// + /// Requests termination the current application. + /// + void StopApplication(); } } diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs index ced615c889..230b4fd4e3 100644 --- a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs @@ -19,20 +19,14 @@ namespace Microsoft.AspNet.Hosting /// Triggered when the application host has fully started and is about to wait /// for a graceful shutdown. ///
- public CancellationToken ApplicationStarted - { - get { return _startedSource.Token; } - } + public CancellationToken ApplicationStarted => _startedSource.Token; /// /// Triggered when the application host is performing a graceful shutdown. /// Request may still be in flight. Shutdown will block until this event completes. /// /// - public CancellationToken ApplicationStopping - { - get { return _stoppingSource.Token; } - } + public CancellationToken ApplicationStopping => _stoppingSource.Token; /// /// Triggered when the application host is performing a graceful shutdown. @@ -40,9 +34,21 @@ namespace Microsoft.AspNet.Hosting /// until this event completes. /// /// - public CancellationToken ApplicationStopped + public CancellationToken ApplicationStopped => _stoppedSource.Token; + + /// + /// Signals the ApplicationStopping event and blocks until it completes. + /// + public void StopApplication() { - get { return _stoppedSource.Token; } + try + { + _stoppingSource.Cancel(throwOnFirstException: false); + } + catch (Exception) + { + // TODO: LOG + } } /// @@ -60,21 +66,6 @@ namespace Microsoft.AspNet.Hosting } } - /// - /// Signals the ApplicationStopping event and blocks until it completes. - /// - public void NotifyStopping() - { - try - { - _stoppingSource.Cancel(throwOnFirstException: false); - } - catch (Exception) - { - // TODO: LOG - } - } - /// /// Signals the ApplicationStopped event and blocks until it completes. /// diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index d0a951849d..cde9a27c1c 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -135,7 +135,7 @@ namespace Microsoft.AspNet.Hosting.Internal return new Application(ApplicationServices, _serverInstance, new Disposable(() => { - _applicationLifetime.NotifyStopping(); + _applicationLifetime.StopApplication(); server.Dispose(); _applicationLifetime.NotifyStopped(); (_applicationServices as IDisposable)?.Dispose(); diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 7c2cbb2127..48a71bbcde 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -54,14 +54,16 @@ namespace Microsoft.AspNet.Hosting Console.WriteLine("Application started. Press Ctrl+C to shut down."); - var appShutdownService = app.Services.GetRequiredService(); + var appLifetime = app.Services.GetRequiredService(); + Console.CancelKeyPress += (sender, eventArgs) => { - appShutdownService.RequestShutdown(); + appLifetime.StopApplication(); // Don't terminate the process immediately, wait for the Main thread to exit gracefully. eventArgs.Cancel = true; }; - appShutdownService.ShutdownRequested.WaitHandle.WaitOne(); + + appLifetime.ApplicationStopping.WaitHandle.WaitOne(); } } } From 0581bcf0086159c55fae06d082595efdc723dfc0 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 14 Oct 2015 12:07:07 -0700 Subject: [PATCH 0803/1838] Update `MediaTypeHeaderValue.IsSubsetOf()` to perform consistent checks - aspnet/Mvc#3138 part 1/2 - check parameters with same polarity as type and subtype - ignore quality factors - bug was obscured because MVC has no formatters supporting wildcard media types nits: - add doc comments - spelling - correct typo in a `project.json` file --- .../MediaTypeHeaderValue.cs | 53 +++++++++++++------ ....Extensions.BufferedHtmlContent.Test.xproj | 6 ++- .../MediaTypeHeaderValueTest.cs | 33 ++++++++---- 3 files changed, 66 insertions(+), 26 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index aebf80e00b..23ed8b0cec 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -219,6 +219,21 @@ namespace Microsoft.Net.Http.Headers get { return _isReadOnly; } } + /// + /// Gets a value indicating whether this is a subset of + /// . A "subset" is defined as the same or a more specific media type + /// according to the precedence described in https://www.ietf.org/rfc/rfc2068.txt section 14.1, Accept. + /// + /// The to compare. + /// + /// A value indicating whether this is a subset of + /// . + /// + /// + /// For example "multipart/mixed; boundary=1234" is a subset of "multipart/mixed; boundary=1234", + /// "multipart/mixed", "multipart/*", and "*/*" but not "multipart/mixed; boundary=2345" or + /// "multipart/message; boundary=1234". + /// public bool IsSubsetOf(MediaTypeHeaderValue otherMediaType) { if (otherMediaType == null) @@ -226,6 +241,7 @@ namespace Microsoft.Net.Http.Headers return false; } + // "text/plain" is a subset of "text/plain", "text/*" and "*/*". "*/*" is a subset only of "*/*". if (!Type.Equals(otherMediaType.Type, StringComparison.OrdinalIgnoreCase)) { if (!otherMediaType.MatchesAllTypes) @@ -241,22 +257,29 @@ namespace Microsoft.Net.Http.Headers } } - if (Parameters != null) + // "text/plain; charset=utf-8; level=1" is a subset of "text/plain; charset=utf-8". In turn + // "text/plain; charset=utf-8" is a subset of "text/plain". + if (otherMediaType._parameters != null && otherMediaType._parameters.Count != 0) { - if (Parameters.Count != 0 && (otherMediaType.Parameters == null || otherMediaType.Parameters.Count == 0)) + // Make sure all parameters in the potential superset are included locally. Fine to have additional + // parameters locally; they make this one more specific. + foreach (var parameter in otherMediaType._parameters) { - return false; - } - - // Make sure all parameters listed locally are listed in the other one. The other one may have additional parameters. - foreach (var param in _parameters) - { - var otherParam = NameValueHeaderValue.Find(otherMediaType._parameters, param.Name); - if (otherParam == null) + if (string.Equals(parameter.Name, "q", StringComparison.OrdinalIgnoreCase)) { + // "q" and later parameters are not involved in media type matching. Quoting the RFC: The first + // "q" parameter (if any) separates the media-range parameter(s) from the accept-params. + break; + } + + var localParameter = NameValueHeaderValue.Find(_parameters, parameter.Name); + if (localParameter == null) + { + // Not found. return false; } - if (!string.Equals(param.Value, otherParam.Value, StringComparison.OrdinalIgnoreCase)) + + if (!string.Equals(parameter.Value, localParameter.Value, StringComparison.OrdinalIgnoreCase)) { return false; } @@ -364,7 +387,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - // Caller must remove leading whitespaces. If not, we'll return 0. + // Caller must remove leading whitespace. If not, we'll return 0. string mediaType = null; var mediaTypeLength = MediaTypeHeaderValue.GetMediaTypeExpressionLength(input, startIndex, out mediaType); @@ -432,7 +455,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - // If there are no whitespaces between and in / get the media type using + // If there is no whitespace between and in / get the media type using // one Substring call. Otherwise get substrings for and and combine them. var mediatTypeLength = current + subtypeLength - startIndex; if (typeLength + subtypeLength + 1 == mediatTypeLength) @@ -454,8 +477,8 @@ namespace Microsoft.Net.Http.Headers throw new ArgumentException("An empty string is not allowed.", parameterName); } - // When adding values using strongly typed objects, no leading/trailing LWS (whitespaces) are allowed. - // Also no LWS between type and subtype are allowed. + // When adding values using strongly typed objects, no leading/trailing LWS (whitespace) is allowed. + // Also no LWS between type and subtype is allowed. string tempMediaType; var mediaTypeLength = GetMediaTypeExpressionLength(mediaType, 0, out tempMediaType); if ((mediaTypeLength == 0) || (tempMediaType.Length != mediaType.Length)) diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj index a091460b76..f0c4c7f35a 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -11,9 +11,11 @@ ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ - 2.0 + + + \ No newline at end of file diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 9ca74a3632..48a4bfab12 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -542,13 +542,16 @@ namespace Microsoft.Net.Http.Headers [Theory] [InlineData("*/*;", "*/*")] - [InlineData("text/*;", "text/*")] + [InlineData("text/*", "text/*")] + [InlineData("text/*;", "*/*")] [InlineData("text/plain;", "text/plain")] - [InlineData("*/*;", "*/*;charset=utf-8;")] - [InlineData("text/*;", "*/*;charset=utf-8;")] - [InlineData("text/plain;", "*/*;charset=utf-8;")] - [InlineData("text/plain;", "text/*;charset=utf-8;")] - [InlineData("text/plain;", "text/plain;charset=utf-8;")] + [InlineData("text/plain", "text/*")] + [InlineData("text/plain;", "*/*")] + [InlineData("*/*;missingparam=4", "*/*")] + [InlineData("text/*;missingparam=4;", "*/*;")] + [InlineData("text/plain;missingparam=4", "*/*;")] + [InlineData("text/plain;missingparam=4", "text/*")] + [InlineData("text/plain;charset=utf-8", "text/plain;charset=utf-8")] [InlineData("text/plain;version=v1", "Text/plain;Version=v1")] [InlineData("text/plain;version=v1", "tExT/plain;version=V1")] [InlineData("text/plain;version=v1", "TEXT/PLAIN;VERSION=V1")] @@ -558,26 +561,38 @@ namespace Microsoft.Net.Http.Headers [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;charset=utf-8;foo=bar;q=0.0")] public void IsSubsetOf_PositiveCases(string mediaType1, string mediaType2) { + // Arrange var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + // Act var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + + // Assert Assert.True(isSubset); } [Theory] + [InlineData("application/html", "text/*")] + [InlineData("application/json", "application/html")] [InlineData("text/plain;version=v1", "text/plain;version=")] [InlineData("*/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] [InlineData("text/*;", "text/plain;charset=utf-8;foo=bar;q=0.0")] - [InlineData("text/plain;missingparam=4;", "text/plain;charset=utf-8;foo=bar;q=0.0")] - [InlineData("text/plain;missingparam=4;", "text/*;charset=utf-8;foo=bar;q=0.0")] - [InlineData("text/plain;missingparam=4;", "*/*;charset=utf-8;foo=bar;q=0.0")] + [InlineData("text/*;charset=utf-8;foo=bar;q=0.0", "text/plain;missingparam=4;")] + [InlineData("*/*;charset=utf-8;foo=bar;q=0.0", "text/plain;missingparam=4;")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/plain;missingparam=4;")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "text/*;missingparam=4;")] + [InlineData("text/plain;charset=utf-8;foo=bar;q=0.0", "*/*;missingparam=4;")] public void IsSubsetOf_NegativeCases(string mediaType1, string mediaType2) { + // Arrange var parsedMediaType1 = MediaTypeHeaderValue.Parse(mediaType1); var parsedMediaType2 = MediaTypeHeaderValue.Parse(mediaType2); + // Act var isSubset = parsedMediaType1.IsSubsetOf(parsedMediaType2); + + // Assert Assert.False(isSubset); } From d28c6e1dbbd6156a6168e331ec8137044cd05ee9 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Wed, 14 Oct 2015 14:44:50 -0700 Subject: [PATCH 0804/1838] Changes for error handling in Authentication --- .../Authentication/AuthenticationManager.cs | 19 ++++++++++------- .../Authentication/AuthenticateContext.cs | 12 +++++++++-- .../Authentication/ChallengeContext.cs | 4 ++-- .../Authentication/SignInContext.cs | 4 ++-- .../Authentication/SignOutContext.cs | 4 ++-- .../DefaultAuthenticationManager.cs | 21 +++++++++---------- .../DefaultAuthenticationManagerTests.cs | 4 ++-- 7 files changed, 40 insertions(+), 28 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index a18fe99c97..497ad3e25d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -11,6 +11,11 @@ namespace Microsoft.AspNet.Http.Authentication { public abstract class AuthenticationManager { + /// + /// Constant used to represent the automatic scheme + /// + public const string AutomaticScheme = "Automatic"; + public abstract IEnumerable GetAuthenticationSchemes(); public abstract Task AuthenticateAsync(AuthenticateContext context); @@ -34,14 +39,14 @@ namespace Microsoft.AspNet.Http.Authentication public virtual Task ChallengeAsync(AuthenticationProperties properties) { - return ChallengeAsync(authenticationScheme: string.Empty, properties: properties); + return ChallengeAsync(authenticationScheme: AutomaticScheme, properties: properties); } public virtual Task ChallengeAsync(string authenticationScheme) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } return ChallengeAsync(authenticationScheme: authenticationScheme, properties: null); @@ -50,9 +55,9 @@ namespace Microsoft.AspNet.Http.Authentication // Leave it up to authentication handler to do the right thing for the challenge public virtual Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Automatic); @@ -60,9 +65,9 @@ namespace Microsoft.AspNet.Http.Authentication public virtual Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } if (principal == null) diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs index c3ef43c071..187c372fad 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs @@ -11,9 +11,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication { public AuthenticateContext(string authenticationScheme) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } AuthenticationScheme = authenticationScheme; @@ -29,6 +29,8 @@ namespace Microsoft.AspNet.Http.Features.Authentication public IDictionary Description { get; private set; } + public Exception Error { get; private set; } + public virtual void Authenticated(ClaimsPrincipal principal, IDictionary properties, IDictionary description) { Accepted = true; @@ -41,5 +43,11 @@ namespace Microsoft.AspNet.Http.Features.Authentication { Accepted = true; } + + public virtual void Failed(Exception error) + { + Error = error; + Accepted = true; + } } } diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs index d632a5722e..5989ab4245 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs @@ -15,9 +15,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication public ChallengeContext(string authenticationScheme, IDictionary properties, ChallengeBehavior behavior) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } AuthenticationScheme = authenticationScheme; diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs index f4bdef8dcb..08591ffa82 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs @@ -11,9 +11,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication { public SignInContext(string authenticationScheme, ClaimsPrincipal principal, IDictionary properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } if (principal == null) diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs index ba27794c3e..ea89cf9f31 100644 --- a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs @@ -10,9 +10,9 @@ namespace Microsoft.AspNet.Http.Features.Authentication { public SignOutContext(string authenticationScheme, IDictionary properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } AuthenticationScheme = authenticationScheme; diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 4dcb81916c..f7de7fcd49 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -54,7 +54,6 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } var handler = HttpAuthenticationFeature.Handler; - if (handler != null) { await handler.AuthenticateAsync(context); @@ -62,15 +61,15 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!context.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {context.AuthenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to authenticate for the scheme: {context.AuthenticationScheme}"); } } public override async Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } var handler = HttpAuthenticationFeature.Handler; @@ -83,15 +82,15 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!challengeContext.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {authenticationScheme}"); } } public override async Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } if (principal == null) @@ -109,15 +108,15 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!signInContext.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {authenticationScheme}"); } } public override async Task SignOutAsync(string authenticationScheme, AuthenticationProperties properties) { - if (authenticationScheme == null) + if (string.IsNullOrEmpty(authenticationScheme)) { - throw new ArgumentNullException(nameof(authenticationScheme)); + throw new ArgumentException(nameof(authenticationScheme)); } var handler = HttpAuthenticationFeature.Handler; @@ -130,7 +129,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal if (!signOutContext.Accepted) { - throw new InvalidOperationException($"The following authentication scheme was not accepted: {authenticationScheme}"); + throw new InvalidOperationException($"No authentication handler is configured to handle the scheme: {authenticationScheme}"); } } } diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index a48e80ea03..2b3f666740 100644 --- a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -12,7 +12,7 @@ using Xunit; namespace Microsoft.AspNet.Http.Authentication.Internal { - public class AuthenticationManagerTests + public class DefaultAuthenticationManagerTests { [Fact] @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } [Theory] - [InlineData("")] + [InlineData("Automatic")] [InlineData("Foo")] public async Task ChallengeWithNoAuthMiddlewareMayThrow(string scheme) { From 1f4ca557994d6952294aa4b103dcffd607c7e2f9 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 27 Sep 2015 11:03:26 +0100 Subject: [PATCH 0805/1838] Features performance Use FeatureCacheHelpers static methods rather than struct FeatureReference by default for lower allocation --- .../DefaultAuthenticationManager.cs | 29 +++++- .../DefaultConnectionInfo.cs | 35 ++++++- .../DefaultHttpContext.cs | 76 +++++++++++---- .../DefaultHttpRequest.cs | 53 +++++++++-- .../DefaultHttpResponse.cs | 29 +++++- .../DefaultWebSocketManager.cs | 22 ++++- .../Features/FeatureHelpers.cs | 93 +++++++++++++++++++ .../Features/IFeatureCache.cs | 10 ++ .../Features/QueryFeature.cs | 26 +++++- .../Features/RequestCookiesFeature.cs | 26 +++++- .../Features/ResponseCookiesFeature.cs | 23 ++++- 11 files changed, 362 insertions(+), 60 deletions(-) create mode 100644 src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs create mode 100644 src/Microsoft.AspNet.Http/Features/IFeatureCache.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 4dcb81916c..e138f98f7d 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -12,25 +12,44 @@ using Microsoft.AspNet.Http.Features.Authentication.Internal; namespace Microsoft.AspNet.Http.Authentication.Internal { - public class DefaultAuthenticationManager : AuthenticationManager + public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache { private readonly IFeatureCollection _features; - private FeatureReference _authentication = FeatureReference.Default; - private FeatureReference _response = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpAuthenticationFeature _authentication; + private IHttpResponseFeature _response; public DefaultAuthenticationManager(IFeatureCollection features) { _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _authentication = null; + _response = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpAuthenticationFeature(), + ref _authentication); + } } private IHttpResponseFeature HttpResponseFeature { - get { return _response.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } } public override IEnumerable GetAuthenticationSchemes() diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 30a7ace398..c0fd423478 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -10,26 +10,51 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultConnectionInfo : ConnectionInfo + public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache { private readonly IFeatureCollection _features; + private int _cachedFeaturesRevision = -1; - private FeatureReference _connection = FeatureReference.Default; - private FeatureReference _tlsConnection = FeatureReference.Default; + private IHttpConnectionFeature _connection; + private ITlsConnectionFeature _tlsConnection; public DefaultConnectionInfo(IFeatureCollection features) { _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _connection = null; + _tlsConnection = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpConnectionFeature HttpConnectionFeature { - get { return _connection.Fetch(_features) ?? _connection.Update(_features, new HttpConnectionFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpConnectionFeature(), + ref _connection); + } } private ITlsConnectionFeature TlsConnectionFeature { - get { return _tlsConnection.Fetch(_features) ?? _tlsConnection.Update(_features, new TlsConnectionFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new TlsConnectionFeature(), + ref _tlsConnection); + } } public override IPAddress RemoteIpAddress diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index db0a4d27ad..089511e231 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -14,20 +14,22 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpContext : HttpContext + public class DefaultHttpContext : HttpContext, IFeatureCache { private readonly HttpRequest _request; private readonly HttpResponse _response; private readonly ConnectionInfo _connection; private readonly AuthenticationManager _authenticationManager; - private FeatureReference _items; - private FeatureReference _serviceProviders; - private FeatureReference _authentication; - private FeatureReference _lifetime; - private FeatureReference _session; + private IItemsFeature _items; + private IServiceProvidersFeature _serviceProviders; + private IHttpAuthenticationFeature _authentication; + private IHttpRequestLifetimeFeature _lifetime; + private ISessionFeature _session; private WebSocketManager _websockets; + private IFeatureCollection _features; + private int _cachedFeaturesRevision = -1; public DefaultHttpContext() : this(new FeatureCollection()) @@ -43,37 +45,77 @@ namespace Microsoft.AspNet.Http.Internal _response = new DefaultHttpResponse(this, features); _connection = new DefaultConnectionInfo(features); _authenticationManager = new DefaultAuthenticationManager(features); + } - _items = FeatureReference.Default; - _serviceProviders = FeatureReference.Default; - _authentication = FeatureReference.Default; - _lifetime = FeatureReference.Default; - _session = FeatureReference.Default; + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision !=_features.Revision) + { + _items = null; + _serviceProviders = null; + _authentication = null; + _lifetime = null; + _session = null; + _cachedFeaturesRevision = _features.Revision; + } } IItemsFeature ItemsFeature { - get { return _items.Fetch(_features) ?? _items.Update(_features, new ItemsFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new ItemsFeature(), + ref _items); + } } IServiceProvidersFeature ServiceProvidersFeature { - get { return _serviceProviders.Fetch(_features) ?? _serviceProviders.Update(_features, new ServiceProvidersFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new ServiceProvidersFeature(), + ref _serviceProviders); + } } private IHttpAuthenticationFeature HttpAuthenticationFeature { - get { return _authentication.Fetch(_features) ?? _authentication.Update(_features, new HttpAuthenticationFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpAuthenticationFeature(), + ref _authentication); + } } private IHttpRequestLifetimeFeature LifetimeFeature { - get { return _lifetime.Fetch(_features) ?? _lifetime.Update(_features, new HttpRequestLifetimeFeature()); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + () => new HttpRequestLifetimeFeature(), + ref _lifetime); + } } private ISessionFeature SessionFeature { - get { return _session.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _session); } + set + { + _features.Set(value); + _session = value; + } } public override IFeatureCollection Features { get { return _features; } } @@ -143,7 +185,7 @@ namespace Microsoft.AspNet.Http.Internal if (feature == null) { feature = new DefaultSessionFeature(); - _session.Update(_features, feature); + SessionFeature = feature; } feature.Session = value; } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 479ead6ebf..2bd87ba81c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -11,15 +11,16 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpRequest : HttpRequest + public class DefaultHttpRequest : HttpRequest, IFeatureCache { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; + private int _cachedFeaturesRevision = -1; - private FeatureReference _request = FeatureReference.Default; - private FeatureReference _query = FeatureReference.Default; - private FeatureReference _form = FeatureReference.Default; - private FeatureReference _cookies = FeatureReference.Default; + private IHttpRequestFeature _request; + private IQueryFeature _query; + private IFormFeature _form; + private IRequestCookiesFeature _cookies; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) { @@ -27,24 +28,58 @@ namespace Microsoft.AspNet.Http.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _query = null; + _form = null; + _cookies = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpRequestFeature HttpRequestFeature { - get { return _request.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } private IQueryFeature QueryFeature { - get { return _query.Fetch(_features) ?? _query.Update(_features, new QueryFeature(_features)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + (f) => new QueryFeature(f), + ref _query); + } } private IFormFeature FormFeature { - get { return _form.Fetch(_features) ?? _form.Update(_features, new FormFeature(this)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + this, + (r) => new FormFeature(r), + ref _form); + } } private IRequestCookiesFeature RequestCookiesFeature { - get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new RequestCookiesFeature(_features)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + (f) => new RequestCookiesFeature(f), + ref _cookies); + } } public override HttpContext HttpContext { get { return _context; } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index e5f09f7ca2..0d728fd30c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -10,12 +10,14 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpResponse : HttpResponse + public class DefaultHttpResponse : HttpResponse, IFeatureCache { private readonly DefaultHttpContext _context; private readonly IFeatureCollection _features; - private FeatureReference _response = FeatureReference.Default; - private FeatureReference _cookies = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpResponseFeature _response; + private IResponseCookiesFeature _cookies; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) { @@ -23,14 +25,31 @@ namespace Microsoft.AspNet.Http.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _response = null; + _cookies = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpResponseFeature HttpResponseFeature { - get { return _response.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } } private IResponseCookiesFeature ResponseCookiesFeature { - get { return _cookies.Fetch(_features) ?? _cookies.Update(_features, new ResponseCookiesFeature(_features)); } + get + { + return FeatureHelpers.GetOrCreateAndCache( + this, + _features, + (f) => new ResponseCookiesFeature(f), + ref _cookies); + } } public override HttpContext HttpContext { get { return _context; } } diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 9493859f7c..454b0fa61f 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -10,25 +10,37 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultWebSocketManager : WebSocketManager + public class DefaultWebSocketManager : WebSocketManager, IFeatureCache { private IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; - private FeatureReference _webSockets = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpRequestFeature _request; + private IHttpWebSocketFeature _webSockets; public DefaultWebSocketManager(IFeatureCollection features) { _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _webSockets = null; + _cachedFeaturesRevision = _features.Revision; + } + } + private IHttpRequestFeature HttpRequestFeature { - get { return _request.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } private IHttpWebSocketFeature WebSocketFeature { - get { return _webSockets.Fetch(_features); } + get { return FeatureHelpers.GetAndCache(this, _features, ref _webSockets); } } public override bool IsWebSocketRequest diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs new file mode 100644 index 0000000000..142e0e2aa5 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -0,0 +1,93 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http.Features +{ + internal sealed class FeatureHelpers + { + public static T GetAndCache( + IFeatureCache cache, + IFeatureCollection features, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + cachedObject = obj; + } + return obj; + } + + public static T GetOrCreateAndCache( + IFeatureCache cache, + IFeatureCollection features, + Func factory, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + if (obj == null) + { + obj = factory(); + cachedObject = obj; + features.Set(obj); + } + } + return obj; + } + + public static T GetOrCreateAndCache( + IFeatureCache cache, + IFeatureCollection features, + Func factory, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + if (obj == null) + { + obj = factory(features); + cachedObject = obj; + features.Set(obj); + } + } + return obj; + } + + public static T GetOrCreateAndCache( + IFeatureCache cache, + IFeatureCollection features, + HttpRequest request, + Func factory, + ref T cachedObject) + { + cache.CheckFeaturesRevision(); + + T obj = cachedObject; + if (obj == null) + { + obj = features.Get(); + if (obj == null) + { + obj = factory(request); + cachedObject = obj; + features.Set(obj); + } + } + return obj; + } + } +} diff --git a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs new file mode 100644 index 0000000000..80db1ee3c8 --- /dev/null +++ b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs @@ -0,0 +1,10 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Http.Features +{ + internal interface IFeatureCache + { + void CheckFeaturesRevision(); + } +} diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 5dd7ca9163..4a275ec6c3 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -9,10 +9,12 @@ using Microsoft.Framework.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { - public class QueryFeature : IQueryFeature + public class QueryFeature : IQueryFeature, IFeatureCache { private readonly IFeatureCollection _features; - private FeatureReference _request = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpRequestFeature _request; private string _original; private IReadableStringCollection _parsedValues; @@ -46,6 +48,20 @@ namespace Microsoft.AspNet.Http.Features.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _cachedFeaturesRevision = _features.Revision; + } + } + + private IHttpRequestFeature HttpRequestFeature + { + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } + } + public IReadableStringCollection Query { get @@ -55,7 +71,7 @@ namespace Microsoft.AspNet.Http.Features.Internal return _parsedValues ?? ReadableStringCollection.Empty; } - var current = _request.Fetch(_features).QueryString; + var current = HttpRequestFeature.QueryString; if (_parsedValues == null || !string.Equals(_original, current, StringComparison.Ordinal)) { _original = current; @@ -71,12 +87,12 @@ namespace Microsoft.AspNet.Http.Features.Internal if (value == null) { _original = string.Empty; - _request.Fetch(_features).QueryString = string.Empty; + HttpRequestFeature.QueryString = string.Empty; } else { _original = QueryString.Create(_parsedValues).ToString(); - _request.Fetch(_features).QueryString = _original; + HttpRequestFeature.QueryString = _original; } } } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 0eb44ef102..2a10f15a16 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -10,10 +10,12 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal { - public class RequestCookiesFeature : IRequestCookiesFeature + public class RequestCookiesFeature : IRequestCookiesFeature, IFeatureCache { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpRequestFeature _request; private StringValues _original; private IReadableStringCollection _parsedValues; @@ -43,6 +45,20 @@ namespace Microsoft.AspNet.Http.Features.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _request = null; + _cachedFeaturesRevision = _features.Revision; + } + } + + private IHttpRequestFeature HttpRequestFeature + { + get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } + } + public IReadableStringCollection Cookies { get @@ -52,7 +68,7 @@ namespace Microsoft.AspNet.Http.Features.Internal return _parsedValues ?? ReadableStringCollection.Empty; } - var headers = _request.Fetch(_features).Headers; + var headers = HttpRequestFeature.Headers; StringValues current; if (!headers.TryGetValue(HeaderNames.Cookie, out current)) { @@ -81,7 +97,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { if (_parsedValues == null || _parsedValues.Count == 0) { - _request.Fetch(_features).Headers.Remove(HeaderNames.Cookie); + HttpRequestFeature.Headers.Remove(HeaderNames.Cookie); } else { @@ -94,7 +110,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } } _original = headers.ToArray(); - _request.Fetch(_features).Headers[HeaderNames.Cookie] = _original; + HttpRequestFeature.Headers[HeaderNames.Cookie] = _original; } } } diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index 96504f1ff7..d56ba114ef 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -5,10 +5,12 @@ using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { - public class ResponseCookiesFeature : IResponseCookiesFeature + public class ResponseCookiesFeature : IResponseCookiesFeature, IFeatureCache { private readonly IFeatureCollection _features; - private readonly FeatureReference _request = FeatureReference.Default; + private int _cachedFeaturesRevision = -1; + + private IHttpResponseFeature _response; private IResponseCookies _cookiesCollection; public ResponseCookiesFeature(IFeatureCollection features) @@ -16,16 +18,29 @@ namespace Microsoft.AspNet.Http.Features.Internal _features = features; } + void IFeatureCache.CheckFeaturesRevision() + { + if (_cachedFeaturesRevision != _features.Revision) + { + _response = null; + _cachedFeaturesRevision = _features.Revision; + } + } + + private IHttpResponseFeature HttpResponseFeature + { + get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } + } + public IResponseCookies Cookies { get { if (_cookiesCollection == null) { - var headers = _request.Fetch(_features).Headers; + var headers = HttpResponseFeature.Headers; _cookiesCollection = new ResponseCookies(new HeaderDictionary(headers)); } - return _cookiesCollection; } } From e01a05d21439815370a6b82682839390b7c57a24 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 15 Oct 2015 19:56:41 +0100 Subject: [PATCH 0806/1838] Move RequestIdentifierFeature to HttpContext Rebased #435 Allow lazier instantiation Expose TraceIdentifier on Httpcontext Also resolves #412 Add tests --- .../HttpContext.cs | 2 + .../DefaultHttpContext.cs | 15 +++++ .../Features/FeatureHelpers.cs | 15 +++++ .../Features/HttpRequestIdentifierFeature.cs | 56 ++++++++++++++++++- src/Microsoft.AspNet.Http/project.json | 3 +- .../DefaultHttpContextTests.cs | 14 +++++ .../HttpRequestIdentifierFeatureTests.cs | 44 +++++++++++++++ 7 files changed, 147 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 7a7a35e543..191d0a5d42 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -34,6 +34,8 @@ namespace Microsoft.AspNet.Http public abstract CancellationToken RequestAborted { get; set; } + public abstract string TraceIdentifier { get; set; } + public abstract ISession Session { get; set; } public abstract void Abort(); diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index b3e92ee208..ffc6acc670 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -118,6 +118,15 @@ namespace Microsoft.AspNet.Http.Internal } } + private IHttpRequestIdentifierFeature RequestIdentifierFeature + { + get { + return FeatureHelpers.GetOrCreate( + _features, + () => new HttpRequestIdentifierFeature()); + } + } + public override IFeatureCollection Features { get { return _features; } } public override HttpRequest Request { get { return _request; } } @@ -167,6 +176,12 @@ namespace Microsoft.AspNet.Http.Internal set { LifetimeFeature.RequestAborted = value; } } + public override string TraceIdentifier + { + get { return RequestIdentifierFeature.TraceIdentifier; } + set { RequestIdentifierFeature.TraceIdentifier = value; } + } + public override ISession Session { get diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs index 142e0e2aa5..fc59b00e6e 100644 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -23,6 +23,21 @@ namespace Microsoft.AspNet.Http.Features return obj; } + public static T GetOrCreate( + IFeatureCollection features, + Func factory) + { + T obj = features.Get(); + if (obj == null) + { + obj = factory(); + features.Set(obj); + } + + return obj; + } + + public static T GetOrCreateAndCache( IFeatureCache cache, IFeatureCollection features, diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs index 01dd9d0ee5..71f78614e9 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs @@ -1,10 +1,64 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; +using System.Threading; + namespace Microsoft.AspNet.Http.Features.Internal { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { - public string TraceIdentifier { get; set; } + // Base64 encoding - but in ascii sort order for easy text based sorting + private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; + // Seed the _requestId for this application instance with + // the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 + // for a roughly increasing _requestId over restarts + private static long _requestId = DateTime.UtcNow.Ticks; + + private string _id = null; + + public string TraceIdentifier + { + get + { + // Don't incur the cost of generating the request ID until it's asked for + if (_id == null) + { + _id = GenerateRequestId(Interlocked.Increment(ref _requestId)); + } + return _id; + } + set + { + _id = value; + } + } + + private static unsafe string GenerateRequestId(long id) + { + // The following routine is ~310% faster than calling long.ToString() on x64 + // and ~600% faster than calling long.ToString() on x86 in tight loops of 1 million+ iterations + // See: https://github.com/aspnet/Hosting/pull/385 + + // stackalloc to allocate array on stack rather than heap + char* charBuffer = stackalloc char[13]; + + charBuffer[0] = _encode32Chars[(int)(id >> 60) & 31]; + charBuffer[1] = _encode32Chars[(int)(id >> 55) & 31]; + charBuffer[2] = _encode32Chars[(int)(id >> 50) & 31]; + charBuffer[3] = _encode32Chars[(int)(id >> 45) & 31]; + charBuffer[4] = _encode32Chars[(int)(id >> 40) & 31]; + charBuffer[5] = _encode32Chars[(int)(id >> 35) & 31]; + charBuffer[6] = _encode32Chars[(int)(id >> 30) & 31]; + charBuffer[7] = _encode32Chars[(int)(id >> 25) & 31]; + charBuffer[8] = _encode32Chars[(int)(id >> 20) & 31]; + charBuffer[9] = _encode32Chars[(int)(id >> 15) & 31]; + charBuffer[10] = _encode32Chars[(int)(id >> 10) & 31]; + charBuffer[11] = _encode32Chars[(int)(id >> 5) & 31]; + charBuffer[12] = _encode32Chars[(int)id & 31]; + + // string ctor overload that takes char* + return new string(charBuffer, 0, 13); + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 27cb110745..6ea620d194 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "allowUnsafe": true }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index b8c9691e35..3d7305b89d 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -119,6 +119,20 @@ namespace Microsoft.AspNet.Http.Internal Assert.Same(item, context.Items["foo"]); } + [Fact] + public void GetItems_DefaultRequestIdentifierAvailable() + { + var context = new DefaultHttpContext(new FeatureCollection()); + Assert.Null(context.Features.Get()); + var traceIdentifier = context.TraceIdentifier; + Assert.NotNull(context.Features.Get()); + Assert.NotNull(traceIdentifier); + Assert.Same(traceIdentifier, context.TraceIdentifier); + + context.TraceIdentifier = "Hello"; + Assert.Same("Hello", context.TraceIdentifier); + } + [Fact] public void SetItems_NewCollectionUsed() { diff --git a/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs new file mode 100644 index 0000000000..c117a48d66 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs @@ -0,0 +1,44 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features.Internal; +using Xunit; + +namespace Microsoft.AspNet.Http.Tests +{ + public class HttpRequestIdentifierFeatureTests + { + [Fact] + public void TraceIdentifier_ReturnsId() + { + var feature = new HttpRequestIdentifierFeature(); + + var id = feature.TraceIdentifier; + + Assert.NotNull(id); + } + + [Fact] + public void TraceIdentifier_ReturnsStableId() + { + var feature = new HttpRequestIdentifierFeature(); + + var id1 = feature.TraceIdentifier; + var id2 = feature.TraceIdentifier; + + Assert.Equal(id1, id2); + } + + [Fact] + public void TraceIdentifier_ReturnsUniqueIdForDifferentInstances() + { + var feature1 = new HttpRequestIdentifierFeature(); + var feature2 = new HttpRequestIdentifierFeature(); + + var id1 = feature1.TraceIdentifier; + var id2 = feature2.TraceIdentifier; + + Assert.NotEqual(id1, id2); + } + } +} \ No newline at end of file From 327611587735e688314a2ac8aff606aadc63cb2d Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 16 Oct 2015 00:40:37 +0100 Subject: [PATCH 0807/1838] Comment sp --- .../Features/HttpRequestIdentifierFeature.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs index 71f78614e9..ba7cac52d9 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { - // Base64 encoding - but in ascii sort order for easy text based sorting + // Base32 encoding - in ascii sort order for easy text based sorting private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; // Seed the _requestId for this application instance with // the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 @@ -61,4 +61,4 @@ namespace Microsoft.AspNet.Http.Features.Internal return new string(charBuffer, 0, 13); } } -} \ No newline at end of file +} From 221df714258668603319e75828e9546eaa13926d Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 8 Oct 2015 16:01:20 -0700 Subject: [PATCH 0808/1838] Incorporate StringSegment from primitives --- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 146 -------------------- 1 file changed, 146 deletions(-) diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index ef8c526945..9f6feb3d75 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -361,152 +361,6 @@ namespace Microsoft.AspNet.Http.Internal } } - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] - internal struct StringSegment : IEquatable - { - private readonly string _buffer; - private readonly int _offset; - private readonly int _count; - - // - // Initializes a new instance of the class. - // - public StringSegment(string buffer, int offset, int count) - { - _buffer = buffer; - _offset = offset; - _count = count; - } - - public string Buffer - { - get { return _buffer; } - } - - public int Offset - { - get { return _offset; } - } - - public int Count - { - get { return _count; } - } - - public string Value - { - get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } - } - - public bool HasValue - { - get { return _offset != -1 && _count != 0 && _buffer != null; } - } - - #region Equality members - - public bool Equals(StringSegment other) - { - return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is StringSegment && Equals((StringSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ _offset; - hashCode = (hashCode * 397) ^ _count; - return hashCode; - } - } - - public static bool operator ==(StringSegment left, StringSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(StringSegment left, StringSegment right) - { - return !left.Equals(right); - } - - #endregion - - public bool StartsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public bool EndsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; - } - - public bool Equals(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count != textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public string Substring(int offset, int length) - { - return _buffer.Substring(_offset + offset, length); - } - - public StringSegment Subsegment(int offset, int length) - { - return new StringSegment(_buffer, _offset + offset, length); - } - - public override string ToString() - { - return Value ?? string.Empty; - } - } - internal static class ParsingHelpers { public static StringValues GetHeader(IDictionary headers, string key) From 5f4f6194b8014ea0f63cd812db3b17143ef07890 Mon Sep 17 00:00:00 2001 From: Kirthi Krishnamraju Date: Fri, 16 Oct 2015 10:19:39 -0700 Subject: [PATCH 0809/1838] Add logic in test infrastructure to get runtime for coreclr on mac --- .../Deployers/ApplicationDeployer.cs | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index c7a303affe..a8dfd0e17a 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -99,16 +99,31 @@ namespace Microsoft.AspNet.Server.Testing protected string PopulateChosenRuntimeInformation() { - // ex: runtimes/dnx-coreclr-win-x64.1.0.0-rc1-15844/bin - var currentRuntimeBinPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); + string currentRuntimeBinPath = string.Empty; + if (TestPlatformHelper.IsMac && DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) + { + var path = Environment.GetEnvironmentVariable("PATH"); + currentRuntimeBinPath = path.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries). + Where(c => c.Contains("dnx-coreclr-darwin") || c.Contains("dnx-mono")).FirstOrDefault(); + + if (string.IsNullOrWhiteSpace(currentRuntimeBinPath)) + { + throw new Exception("Runtime not detected on the machine."); + } + } + else + { + // ex: runtimes/dnx-coreclr-win-x64.1.0.0-rc1-15844/bin + currentRuntimeBinPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); + } Logger.LogInformation($"Current runtime path is : {currentRuntimeBinPath}"); var targetRuntimeName = new StringBuilder() - .Append("dnx") - .Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr") - .Append($"-{OSPrefix}") - .Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64") - .ToString(); + .Append("dnx") + .Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr") + .Append($"-{OSPrefix}") + .Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64") + .ToString(); string targetRuntimeBinPath; // Ex: When current runtime is Mono and the tests are being run for CoreClr From f0438d69eb4792ea27eaa1c401d678413e5ab366 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Fri, 16 Oct 2015 11:33:26 -0700 Subject: [PATCH 0810/1838] Enable Microsoft.AspNet.TestHost.Tests on CoreCLR. --- test/Microsoft.AspNet.TestHost.Tests/project.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index af78732d7c..7b7222c16e 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -9,6 +9,7 @@ "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { } + "dnx451": { }, + "dnxcore50": { } } } From 5279786748163e60666a2ead5b1006faef778b46 Mon Sep 17 00:00:00 2001 From: DamianEdwards Date: Mon, 19 Oct 2015 10:51:08 -0700 Subject: [PATCH 0811/1838] Added doc-comments to IHostingEnvironment - Coherence-Signed#75 --- .../IHostingEnvironment.cs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs index b57ae9a6af..e478c25a6b 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs @@ -5,14 +5,27 @@ using Microsoft.AspNet.FileProviders; namespace Microsoft.AspNet.Hosting { + /// + /// Provides information about the web hosting environment an application is running in. + /// public interface IHostingEnvironment { + /// + /// Gets or sets the name of the environment. This property is automatically set by the host to the value + /// of the ASPNET_ENV environment variable. + /// // This must be settable! string EnvironmentName { get; set; } + /// + /// Gets or sets the absolute path to the directory that contains the web-servable application content files. + /// // This must be settable! string WebRootPath { get; set; } + /// + /// Gets or sets an pointing at . + /// // This must be settable! IFileProvider WebRootFileProvider { get; set; } } From 585c44536644b67dd071392427b446501bc079d5 Mon Sep 17 00:00:00 2001 From: DamianEdwards Date: Mon, 19 Oct 2015 10:59:39 -0700 Subject: [PATCH 0812/1838] More doc-comments & added IsStaging --- .../EnvironmentName.cs | 1 + .../HostingEnvironmentExtensions.cs | 39 +++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs b/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs index 664744383c..ec2533be13 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs @@ -6,6 +6,7 @@ namespace Microsoft.AspNet.Hosting public static class EnvironmentName { public static readonly string Development = "Development"; + public static readonly string Staging = "Staging"; public static readonly string Production = "Production"; } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index 1d62b061dc..ca638841b2 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -9,10 +9,10 @@ namespace Microsoft.AspNet.Hosting public static class HostingEnvironmentExtensions { /// - /// Checks if the current hosting environment name is development. + /// Checks if the current hosting environment name is "Development". /// - /// An instance of service. - /// True if the environment name is Development, otherwise false. + /// An instance of . + /// True if the environment name is "Development", otherwise false. public static bool IsDevelopment(this IHostingEnvironment hostingEnvironment) { if (hostingEnvironment == null) @@ -24,10 +24,25 @@ namespace Microsoft.AspNet.Hosting } /// - /// Checks if the current hosting environment name is Production. + /// Checks if the current hosting environment name is "Staging". /// - /// An instance of service. - /// True if the environment name is Production, otherwise false. + /// An instance of . + /// True if the environment name is "Staging", otherwise false. + public static bool IsStaging(this IHostingEnvironment hostingEnvironment) + { + if (hostingEnvironment == null) + { + throw new ArgumentNullException(nameof(hostingEnvironment)); + } + + return hostingEnvironment.IsEnvironment(EnvironmentName.Staging); + } + + /// + /// Checks if the current hosting environment name is "Production". + /// + /// An instance of . + /// True if the environment name is "Production", otherwise false. public static bool IsProduction(this IHostingEnvironment hostingEnvironment) { if (hostingEnvironment == null) @@ -41,9 +56,9 @@ namespace Microsoft.AspNet.Hosting /// /// Compares the current hosting environment name against the specified value. /// - /// An instance of service. + /// An instance of . /// Environment name to validate against. - /// True if the specified name is same as the current environment. + /// True if the specified name is the same as the current environment, otherwise false. public static bool IsEnvironment( this IHostingEnvironment hostingEnvironment, string environmentName) @@ -60,11 +75,11 @@ namespace Microsoft.AspNet.Hosting } /// - /// Gives the physical path corresponding to the given virtual path. + /// Determines the physical path corresponding to the given virtual path. /// - /// An instance of service. - /// Path relative to the root. - /// Physical path corresponding to virtual path. + /// An instance of . + /// Path relative to the application root. + /// Physical path corresponding to the virtual path. public static string MapPath( this IHostingEnvironment hostingEnvironment, string virtualPath) From dade325ac84e53c7ce167401873694a3aeeb198b Mon Sep 17 00:00:00 2001 From: DamianEdwards Date: Mon, 19 Oct 2015 14:19:03 -0700 Subject: [PATCH 0813/1838] CR feedback --- src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs | 3 +++ .../HostingEnvironmentExtensions.cs | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs b/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs index ec2533be13..6ab7b945c1 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs @@ -3,6 +3,9 @@ namespace Microsoft.AspNet.Hosting { + /// + /// Commonly used environment names. + /// public static class EnvironmentName { public static readonly string Development = "Development"; diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index ca638841b2..c8bc3993a7 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -6,6 +6,9 @@ using System.IO; namespace Microsoft.AspNet.Hosting { + /// + /// Extension methods for . + /// public static class HostingEnvironmentExtensions { /// From f00c7c6d060e6d318efe9d1ed320db49716ee0a0 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 19 Oct 2015 14:18:13 -0700 Subject: [PATCH 0814/1838] Fix CoreCLR test pass on Linux (fixes #442). --- .../HtmlContentBuilderExtensionsTest.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 660b1a4dc6..b1a8fab41f 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -326,7 +326,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - [ReplaceCulture] + [ReplaceCulture("de-DE", "de-DE")] public void Builder_AppendFormat_WithDifferentCurrentCulture() { // Arrange @@ -337,7 +337,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test // Assert Assert.Equal( - "HtmlEncode[[01 February 2015]]", + "HtmlEncode[[Sonntag, 1. Februar 2015]]", HtmlContentToString(builder)); } From 8bab053107838b407fb032b493579ad96016221f Mon Sep 17 00:00:00 2001 From: DamianEdwards Date: Mon, 19 Oct 2015 14:32:04 -0700 Subject: [PATCH 0815/1838] CR feedback --- .../IHostingEnvironment.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs index e478c25a6b..6f357d3ca2 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Hosting { /// /// Gets or sets the name of the environment. This property is automatically set by the host to the value - /// of the ASPNET_ENV environment variable. + /// of the "Hosting:Environment" (on Windows) or "Hosting__Environment" (on Linux & OS X) environment variable. /// // This must be settable! string EnvironmentName { get; set; } From 7ed6a6cb578ca9a18c44751acca2257d752c0699 Mon Sep 17 00:00:00 2001 From: DamianEdwards Date: Mon, 19 Oct 2015 14:16:50 -0700 Subject: [PATCH 0816/1838] Add doc-comments for main APIs - Coherence-Signed#75 --- .../HttpResponseWritingExtensions.cs | 18 +++--- .../Extensions/MapExtensions.cs | 17 +++--- .../Extensions/MapMiddleware.cs | 13 +++++ .../Extensions/MapOptions.cs | 6 +- .../Extensions/MapWhenExtensions.cs | 2 +- .../Extensions/MapWhenMiddleware.cs | 13 +++++ .../Extensions/MapWhenOptions.cs | 6 +- .../Extensions/RunExtensions.cs | 8 +++ .../Extensions/UseExtensions.cs | 9 ++- .../Extensions/UseMiddlewareExtensions.cs | 30 ++++++++-- .../HttpContext.cs | 46 +++++++++++++++ .../HttpRequest.cs | 6 ++ .../HttpResponse.cs | 58 +++++++++++++++++++ .../IApplicationBuilder.cs | 26 +++++++++ .../RequestDelegate.cs | 5 ++ .../WebSocketManager.cs | 18 ++++++ .../IFeatureCollection.cs | 5 +- 17 files changed, 253 insertions(+), 33 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs index 953cd7ce6e..fd0553b3c0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs @@ -16,10 +16,10 @@ namespace Microsoft.AspNet.Http /// /// Writes the given text to the response body. UTF-8 encoding will be used. /// - /// - /// - /// - /// + /// The . + /// The text to write to the response. + /// Notifies when request operations should be cancelled. + /// A task that represents the completion of the write operation. public static Task WriteAsync(this HttpResponse response, string text, CancellationToken cancellationToken = default(CancellationToken)) { if (response == null) @@ -38,11 +38,11 @@ namespace Microsoft.AspNet.Http /// /// Writes the given text to the response body using the given encoding. /// - /// - /// - /// - /// - /// + /// The . + /// The text to write to the response. + /// The encoding to use. + /// Notifies when request operations should be cancelled. + /// A task that represents the completion of the write operation. public static Task WriteAsync(this HttpResponse response, string text, Encoding encoding, CancellationToken cancellationToken = default(CancellationToken)) { if (response == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs index 94985df589..c06c37563a 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs @@ -7,16 +7,19 @@ using Microsoft.AspNet.Builder.Extensions; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for the . + /// public static class MapExtensions { /// - /// If the request path starts with the given pathMatch, execute the app configured via configuration parameter instead of - /// continuing to the next component in the pipeline. + /// Branches the request pipeline based on matches of the given request path. If the request path starts with + /// the given path, the branch is executed. /// - /// - /// The path to match - /// The branch to take for positive path matches - /// + /// The instance. + /// The request path to match. + /// The branch to take for positive path matches. + /// The instance. public static IApplicationBuilder Map(this IApplicationBuilder app, PathString pathMatch, Action configuration) { if (app == null) @@ -39,7 +42,7 @@ namespace Microsoft.AspNet.Builder configuration(branchBuilder); var branch = branchBuilder.Build(); - var options = new MapOptions() + var options = new MapOptions { Branch = branch, PathMatch = pathMatch, diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index f35e0a5480..2b2c80b06f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -7,11 +7,19 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { + /// + /// Respresents a middleware that maps a request path to a sub-request pipeline. + /// public class MapMiddleware { private readonly RequestDelegate _next; private readonly MapOptions _options; + /// + /// Creates a new instace of . + /// + /// The delegate representing the next middleware in the request pipeline. + /// The middleware options. public MapMiddleware(RequestDelegate next, MapOptions options) { if (next == null) @@ -28,6 +36,11 @@ namespace Microsoft.AspNet.Builder.Extensions _options = options; } + /// + /// Executes the middleware. + /// + /// The for the current request. + /// A task that represents the execution of this middleware. public async Task Invoke(HttpContext context) { if (context == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs index d0453902f4..dc16d15482 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs @@ -6,17 +6,17 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { /// - /// Options for the Map middleware + /// Options for the . /// public class MapOptions { /// - /// The path to match + /// The path to match. /// public PathString PathMatch { get; set; } /// - /// The branch taken for a positive match + /// The branch taken for a positive match. /// public RequestDelegate Branch { get; set; } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs index cabe45094d..7bd658460e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Builder using Predicate = Func; /// - /// Extension methods for the MapWhenMiddleware + /// Extension methods for the . /// public static class MapWhenExtensions { diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs index b1ac27f800..26ba9f0d81 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -7,11 +7,19 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { + /// + /// Respresents a middleware that runs a sub-request pipeline when a given predicate is matched. + /// public class MapWhenMiddleware { private readonly RequestDelegate _next; private readonly MapWhenOptions _options; + /// + /// Creates a new instance of . + /// + /// The delegate representing the next middleware in the request pipeline. + /// The middleware options. public MapWhenMiddleware(RequestDelegate next, MapWhenOptions options) { if (next == null) @@ -28,6 +36,11 @@ namespace Microsoft.AspNet.Builder.Extensions _options = options; } + /// + /// Executes the middleware. + /// + /// The for the current request. + /// A task that represents the execution of this middleware. public async Task Invoke(HttpContext context) { if (context == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs index aa6263366e..9b430b2d4d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -7,14 +7,14 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder.Extensions { /// - /// Options for the MapWhen middleware + /// Options for the . /// public class MapWhenOptions { private Func _predicate; /// - /// The user callback that determines if the branch should be taken + /// The user callback that determines if the branch should be taken. /// public Func Predicate { @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Builder.Extensions } /// - /// The branch taken for a positive match + /// The branch taken for a positive match. /// public RequestDelegate Branch { get; set; } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index d79949c5c8..8280b285ce 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -5,8 +5,16 @@ using System; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for adding terminal middleware. + /// public static class RunExtensions { + /// + /// Adds a terminal middleware delagate to the application's request pipeline. + /// + /// The instance. + /// A delegate that handles the request. public static void Run(this IApplicationBuilder app, RequestDelegate handler) { if (app == null) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs index 1a14048128..163dcfd19f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs @@ -7,14 +7,17 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for adding middleware. + /// public static class UseExtensions { /// - /// Use middleware defined in-line. + /// Adds a middleware delagate defined in-line to the application's request pipeline. /// - /// + /// The instance. /// A function that handles the request or calls the given next function. - /// + /// The instance. public static IApplicationBuilder Use(this IApplicationBuilder app, Func, Task> middleware) { return app.Use(next => diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index cac2100ce3..fe13dab8c8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -11,18 +11,36 @@ using Microsoft.Extensions.Internal; namespace Microsoft.AspNet.Builder { + /// + /// Extension methods for adding typed middlware. + /// public static class UseMiddlewareExtensions { const string InvokeMethodName = "Invoke"; - public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, params object[] args) + + /// + /// Adds a middleware type to the application's request pipeline. + /// + /// The middleware type. + /// The instance. + /// The arguments to pass to the middleware type instance's constructor. + /// The instance. + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder app, params object[] args) { - return builder.UseMiddleware(typeof(T), args); + return app.UseMiddleware(typeof(TMiddleware), args); } - public static IApplicationBuilder UseMiddleware(this IApplicationBuilder builder, Type middleware, params object[] args) + /// + /// Adds a middleware type to the application's request pipeline. + /// + /// The instance. + /// The middleware type. + /// The arguments to pass to the middleware type instance's constructor. + /// The instance. + public static IApplicationBuilder UseMiddleware(this IApplicationBuilder app, Type middleware, params object[] args) { - var applicationServices = builder.ApplicationServices; - return builder.Use(next => + var applicationServices = app.ApplicationServices; + return app.Use(next => { var methods = middleware.GetMethods(BindingFlags.Instance | BindingFlags.Public); var invokeMethods = methods.Where(m => string.Equals(m.Name, InvokeMethodName, StringComparison.Ordinal)).ToArray(); @@ -48,7 +66,7 @@ namespace Microsoft.AspNet.Builder throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName,nameof(HttpContext))); } - var instance = ActivatorUtilities.CreateInstance(builder.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); if (parameters.Length == 1) { return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 191d0a5d42..162f3c582d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -10,34 +10,80 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http { + /// + /// Encapsulates all HTTP-specific information about an individual HTTP request. + /// public abstract class HttpContext { + /// + /// Gets the collection of HTTP features provided by the server and middleware available on this request. + /// public abstract IFeatureCollection Features { get; } + /// + /// Gets the object for this request. + /// public abstract HttpRequest Request { get; } + /// + /// Gets the object for this request. + /// public abstract HttpResponse Response { get; } + /// + /// Gets information about the underlying connection for this request. + /// public abstract ConnectionInfo Connection { get; } + /// + /// Gets an object that manages the establishment of WebSocket connections for this request. + /// public abstract WebSocketManager WebSockets { get; } + /// + /// Gets an object that facilitates authentication for this request. + /// public abstract AuthenticationManager Authentication { get; } + /// + /// Gets or sets the the user for this request. + /// public abstract ClaimsPrincipal User { get; set; } + /// + /// Gets or sets a key/value collection that can be used to share data within the scope of this request. + /// public abstract IDictionary Items { get; set; } + /// + /// Gets or sets the that provides access to the application's service container. + /// public abstract IServiceProvider ApplicationServices { get; set; } + /// + /// Gets or sets the that provides access to the request's service container. + /// public abstract IServiceProvider RequestServices { get; set; } + /// + /// Notifies when the connection underlying this request is aborted and thus request operations should be + /// cancelled. + /// public abstract CancellationToken RequestAborted { get; set; } + /// + /// Gets or sets a unique identifier to represent this request in trace logs. + /// public abstract string TraceIdentifier { get; set; } + /// + /// Gets or sets the object used to manage user session data for this request. + /// public abstract ISession Session { get; set; } + /// + /// Aborts the connection underlying this request. + /// public abstract void Abort(); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 4cbbf62a6f..283eddf4b8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -7,8 +7,14 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { + /// + /// Represents the incoming side of an individual HTTP request. + /// public abstract class HttpRequest { + /// + /// Gets the this request; + /// public abstract HttpContext HttpContext { get; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs index 195ef02330..1e3344459c 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs @@ -7,6 +7,9 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { + /// + /// Represents the outgoing side of an individual HTTP request. + /// public abstract class HttpResponse { private static readonly Func _callbackDelegate = callback => ((Func)callback)(); @@ -16,34 +19,89 @@ namespace Microsoft.AspNet.Http return Task.FromResult(0); }; + /// + /// Gets the for this request. + /// public abstract HttpContext HttpContext { get; } + /// + /// Gets or sets the HTTP response code. + /// public abstract int StatusCode { get; set; } + /// + /// Gets the response headers. + /// public abstract IHeaderDictionary Headers { get; } + /// + /// Gets the response body . + /// public abstract Stream Body { get; set; } + /// + /// Gets or sets the value for the Content-Length response header. + /// public abstract long? ContentLength { get; set; } + /// + /// Gets or sets the value for the Content-Type response header. + /// public abstract string ContentType { get; set; } + /// + /// Gets an object that can be used to manage cookies for this response. + /// public abstract IResponseCookies Cookies { get; } + /// + /// Gets a value indicating whether response headers have been sent to the client. + /// public abstract bool HasStarted { get; } + /// + /// Adds a delegate to be invoked just before response headers will be sent to the client. + /// + /// The delegate to execute. + /// A state object to capture and pass back to the delegate. public abstract void OnStarting(Func callback, object state); + /// + /// Adds a delegate to be invoked just before response headers will be sent to the client. + /// + /// The delegate to execute. public virtual void OnStarting(Func callback) => OnStarting(_callbackDelegate, callback); + /// + /// Adds a delegate to be invoked after the response has finished being sent to the client. + /// + /// The delegate to invoke. + /// A state object to capture and pass back to the delegate. public abstract void OnCompleted(Func callback, object state); + /// + /// Registers an object for disposal by the host once the request has finished processing. + /// + /// The object to be disposed. public virtual void RegisterForDispose(IDisposable disposable) => OnCompleted(_disposeDelegate, disposable); + /// + /// Adds a delegate to be invoked after the response has finished being sent to the client. + /// + /// The delegate to invoke. public virtual void OnCompleted(Func callback) => OnCompleted(_callbackDelegate, callback); + /// + /// Returns a temporary redirect response (HTTP 302) to the client. + /// + /// The URL to redirect the client to. public virtual void Redirect(string location) => Redirect(location, permanent: false); + /// + /// Returns a redirect response (HTTP 301 or HTTP 302) to the client. + /// + /// The URL to redirect the client to. + /// True if the redirect is permanent (301), otherwise false (302). public abstract void Redirect(string location, bool permanent); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index e74bdec015..342b7b4f30 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -7,18 +7,44 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Builder { + /// + /// Defines a class that provides the mechanisms to configure an application's request pipeline. + /// public interface IApplicationBuilder { + /// + /// Gets or sets the that provides access to the application's service container. + /// IServiceProvider ApplicationServices { get; set; } + /// + /// Gets the set of HTTP features the application's server provides. + /// IFeatureCollection ServerFeatures { get; } + /// + /// Gets a key/value collection that can be used to share data between middleware. + /// IDictionary Properties { get; } + /// + /// Adds a middleware delegate to the application's request pipeline. + /// + /// The middleware delgate. + /// The . IApplicationBuilder Use(Func middleware); + /// + /// Creates a new that shares the of this + /// . + /// + /// The new . IApplicationBuilder New(); + /// + /// Builds the delegate used by this application to process HTTP requests. + /// + /// The request handling delegate. RequestDelegate Build(); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs index c4c2f8d94e..87d215ad6f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs @@ -6,5 +6,10 @@ using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { + /// + /// A function that can process an HTTP request. + /// + /// The for the request. + /// A task that represents the completion of request processing. public delegate Task RequestDelegate(HttpContext context); } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs index b1dd679ef0..e569e549b9 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs @@ -7,17 +7,35 @@ using System.Threading.Tasks; namespace Microsoft.AspNet.Http { + /// + /// Manages the establishment of WebSocket connections for a specific HTTP request. + /// public abstract class WebSocketManager { + /// + /// Gets a value indicating whether the request is a WebSocket establishment request. + /// public abstract bool IsWebSocketRequest { get; } + /// + /// Gets the list of requested WebSocket sub-protocols. + /// public abstract IList WebSocketRequestedProtocols { get; } + /// + /// Transitions the request to a WebSocket connection. + /// + /// A task representing the completion of the transition. public virtual Task AcceptWebSocketAsync() { return AcceptWebSocketAsync(subProtocol: null); } + /// + /// Transitions the request to a WebSocket connection using the specified sub-protocol. + /// + /// The sub-protocol to use. + /// A task representing the completion of the transition. public abstract Task AcceptWebSocketAsync(string subProtocol); } } diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index 8da86ea5b9..c7ad165c66 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -6,6 +6,9 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http.Features { + /// + /// Represents a collection of HTTP features. + /// public interface IFeatureCollection : IEnumerable> { /// @@ -14,7 +17,7 @@ namespace Microsoft.AspNet.Http.Features bool IsReadOnly { get; } /// - /// Incremented for each modification and can be used verify cached results. + /// Incremented for each modification and can be used to verify cached results. /// int Revision { get; } From 828e8d755e101d321678766aa071455b69b61f8e Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 19 Oct 2015 12:40:23 -0700 Subject: [PATCH 0817/1838] reacting to telemetry rename --- global.json | 2 +- .../Internal/HostingEngine.cs | 24 +++++-------- .../WebHostBuilder.cs | 12 +++---- src/Microsoft.AspNet.Hosting/project.json | 2 +- .../TestServerTests.cs | 36 +++++++++---------- .../project.json | 2 +- 6 files changed, 33 insertions(+), 45 deletions(-) diff --git a/global.json b/global.json index dd6bbaf48b..983ba0401e 100644 --- a/global.json +++ b/global.json @@ -1,3 +1,3 @@ { - "projects": ["src","c:/github/testing/src","/home/kiran/github/testing/src"] + "projects": ["src"] } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index cde9a27c1c..213b492f16 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using System.Diagnostics.Tracing; +using System.Diagnostics; using System.Linq; using System.Threading; using Microsoft.AspNet.Builder; @@ -88,9 +88,7 @@ namespace Microsoft.AspNet.Hosting.Internal var logger = _applicationServices.GetRequiredService>(); var contextFactory = _applicationServices.GetRequiredService(); var contextAccessor = _applicationServices.GetRequiredService(); -#pragma warning disable 0618 - var telemetrySource = _applicationServices.GetRequiredService(); -#pragma warning restore 0618 + var diagnosticSource = _applicationServices.GetRequiredService(); var server = ServerFactory.Start(_serverInstance, async features => { @@ -98,12 +96,10 @@ namespace Microsoft.AspNet.Hosting.Internal httpContext.ApplicationServices = _applicationServices; var requestIdentifier = GetRequestIdentifier(httpContext); contextAccessor.HttpContext = httpContext; -#pragma warning disable 0618 - if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) + if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { - telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); + diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); } -#pragma warning restore 0618 try { using (logger.IsEnabled(LogLevel.Critical) @@ -115,20 +111,16 @@ namespace Microsoft.AspNet.Hosting.Internal } catch (Exception ex) { -#pragma warning disable 0618 - if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) + if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) { - telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); + diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); } -#pragma warning restore 0618 throw; } -#pragma warning disable 0618 - if (telemetrySource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) + if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) { - telemetrySource.WriteTelemetry("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext }); + diagnosticSource.Write("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext }); } -#pragma warning restore 0618 }); _applicationLifetime.NotifyStarted(); diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index e3ae6b3517..16c7fb67e4 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics.Tracing; +using System.Diagnostics; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; @@ -98,12 +98,10 @@ namespace Microsoft.AspNet.Hosting services.AddTransient(); services.AddSingleton(); services.AddLogging(); - -#pragma warning disable 0618 - var telemetrySource = new TelemetryListener("Microsoft.AspNet"); - services.AddInstance(telemetrySource); - services.AddInstance(telemetrySource); -#pragma warning restore 0618 + + var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); + services.AddInstance(diagnosticSource); + services.AddInstance(diagnosticSource); // Conjure up a RequestServices services.AddTransient(); diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 18ea116249..83b490ebe0 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -24,7 +24,7 @@ "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", "Newtonsoft.Json": "6.0.6", - "System.Diagnostics.Tracing.Telemetry": "4.0.0-beta-*" + "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" }, "frameworks": { "dnx451": { diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 9bb5cdd9e6..9a1f79124b 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics.Tracing; +using System.Diagnostics; using System.IO; using System.Net; using System.Net.Http; @@ -16,7 +16,7 @@ using Microsoft.AspNet.Http.Features.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.TelemetryAdapter; +using Microsoft.Extensions.DiagnosticAdapter; using Xunit; namespace Microsoft.AspNet.TestHost @@ -436,22 +436,21 @@ namespace Microsoft.AspNet.TestHost Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); } - -#pragma warning disable 0618 + [Fact] - public async Task BeginEndTelemetryAvailable() + public async Task BeginEndDiagnosticAvailable() { - TelemetryListener telemetryListener = null; + DiagnosticListener diagnosticListener = null; var server = TestServer.Create(app => { - telemetryListener = app.ApplicationServices.GetRequiredService(); + diagnosticListener = app.ApplicationServices.GetRequiredService(); app.Run(context => { return context.Response.WriteAsync("Hello World"); }); }); - var listener = new TestTelemetryListener(); - telemetryListener.SubscribeWithAdapter(listener); + var listener = new TestDiagnosticListener(); + diagnosticListener.SubscribeWithAdapter(listener); var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Hello World", result); @@ -461,19 +460,19 @@ namespace Microsoft.AspNet.TestHost } [Fact] - public async Task ExceptionTelemetryAvailable() + public async Task ExceptionDiagnosticAvailable() { - TelemetryListener telemetryListener = null; + DiagnosticListener diagnosticListener = null; var server = TestServer.Create(app => { - telemetryListener = app.ApplicationServices.GetRequiredService(); + diagnosticListener = app.ApplicationServices.GetRequiredService(); app.Run(context => { throw new Exception("Test exception"); }); }); - var listener = new TestTelemetryListener(); - telemetryListener.SubscribeWithAdapter(listener); + var listener = new TestDiagnosticListener(); + diagnosticListener.SubscribeWithAdapter(listener); await Assert.ThrowsAsync(() => server.CreateClient().GetAsync("/path")); Assert.NotNull(listener.BeginRequest?.HttpContext); @@ -481,9 +480,8 @@ namespace Microsoft.AspNet.TestHost Assert.NotNull(listener.UnhandledException?.HttpContext); Assert.NotNull(listener.UnhandledException?.Exception); } -#pragma warning restore 0618 - public class TestTelemetryListener + public class TestDiagnosticListener { public class OnBeginRequestEventData { @@ -492,7 +490,7 @@ namespace Microsoft.AspNet.TestHost public OnBeginRequestEventData BeginRequest { get; set; } - [TelemetryName("Microsoft.AspNet.Hosting.BeginRequest")] + [DiagnosticName("Microsoft.AspNet.Hosting.BeginRequest")] public virtual void OnBeginRequest(IProxyHttpContext httpContext) { BeginRequest = new OnBeginRequestEventData() @@ -508,7 +506,7 @@ namespace Microsoft.AspNet.TestHost public OnEndRequestEventData EndRequest { get; set; } - [TelemetryName("Microsoft.AspNet.Hosting.EndRequest")] + [DiagnosticName("Microsoft.AspNet.Hosting.EndRequest")] public virtual void OnEndRequest(IProxyHttpContext httpContext) { EndRequest = new OnEndRequestEventData() @@ -525,7 +523,7 @@ namespace Microsoft.AspNet.TestHost public OnUnhandledExceptionEventData UnhandledException { get; set; } - [TelemetryName("Microsoft.AspNet.Hosting.UnhandledException")] + [DiagnosticName("Microsoft.AspNet.Hosting.UnhandledException")] public virtual void OnUnhandledException(IProxyHttpContext httpContext, IProxyException exception) { UnhandledException = new OnUnhandledExceptionEventData() diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 7b7222c16e..ef4d4de144 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -2,7 +2,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", - "Microsoft.Extensions.TelemetryAdapter": "1.0.0-*", + "Microsoft.Extensions.DiagnosticAdapter": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From 3774b6055f64e1ce478bce293d8a448a90fe5cc7 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 20 Oct 2015 09:11:02 -0700 Subject: [PATCH 0818/1838] React to xnd dependency injection refactorings --- src/Microsoft.AspNet.Hosting/Program.cs | 15 +++---- .../WebHostBuilder.cs | 39 +++++++------------ src/Microsoft.AspNet.TestHost/TestServer.cs | 27 +++++++------ .../HostingEngineTests.cs | 4 +- .../WebHostBuilderTests.cs | 2 +- .../TestServerTests.cs | 13 ------- 6 files changed, 35 insertions(+), 65 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 48a71bbcde..c324b4e9c1 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -4,9 +4,11 @@ using System; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Server.Features; +using Microsoft.Dnx.Compilation; using Microsoft.Dnx.Runtime; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; namespace Microsoft.AspNet.Hosting { @@ -15,21 +17,14 @@ namespace Microsoft.AspNet.Hosting private const string HostingJsonFile = "Microsoft.AspNet.Hosting.json"; private const string ConfigFileKey = "config"; - private readonly IServiceProvider _serviceProvider; - - public Program(IServiceProvider serviceProvider) - { - _serviceProvider = serviceProvider; - } - - public void Main(string[] args) + public static void Main(string[] args) { // Allow the location of the json file to be specified via a --config command line arg var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); var tempConfig = tempBuilder.Build(); var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; - var appBasePath = _serviceProvider.GetRequiredService().ApplicationBasePath; + var appBasePath = PlatformServices.Default.Application.ApplicationBasePath; var config = new ConfigurationBuilder() .SetBasePath(appBasePath) .AddJsonFile(configFilePath, optional: true) @@ -37,7 +32,7 @@ namespace Microsoft.AspNet.Hosting .AddCommandLine(args) .Build(); - var host = new WebHostBuilder(_serviceProvider, config, captureStartupErrors: true).Build(); + var host = new WebHostBuilder(config, captureStartupErrors: true).Build(); using (var app = host.Start()) { var hostingEnv = app.Services.GetRequiredService(); diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 16c7fb67e4..815684d2b9 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -10,9 +10,11 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; +using Microsoft.Dnx.Compilation; using Microsoft.Dnx.Runtime; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Hosting @@ -27,8 +29,7 @@ namespace Microsoft.AspNet.Hosting public const string OldServerKey = "server"; public const string ServerKey = "Hosting:Server"; - - private readonly IServiceProvider _services; + private readonly IHostingEnvironment _hostingEnvironment; private readonly ILoggerFactory _loggerFactory; private readonly IConfiguration _config; @@ -45,23 +46,18 @@ namespace Microsoft.AspNet.Hosting private string _serverFactoryLocation; private IServerFactory _serverFactory; - public WebHostBuilder(IServiceProvider services) - : this(services, config: new ConfigurationBuilder().Build()) + public WebHostBuilder() + : this(config: new ConfigurationBuilder().Build()) { } - public WebHostBuilder(IServiceProvider services, IConfiguration config) - : this(services, config: config, captureStartupErrors: false) + public WebHostBuilder(IConfiguration config) + : this(config: config, captureStartupErrors: false) { } - public WebHostBuilder(IServiceProvider services, IConfiguration config, bool captureStartupErrors) + public WebHostBuilder(IConfiguration config, bool captureStartupErrors) { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - if (config == null) { throw new ArgumentNullException(nameof(config)); @@ -69,7 +65,6 @@ namespace Microsoft.AspNet.Hosting _hostingEnvironment = new HostingEnvironment(); _loggerFactory = new LoggerFactory(); - _services = services; _config = config; _captureStartupErrors = captureStartupErrors; } @@ -77,17 +72,6 @@ namespace Microsoft.AspNet.Hosting private IServiceCollection BuildHostingServices() { var services = new ServiceCollection(); - - // Import from manifest - var manifest = _services.GetService(); - if (manifest != null) - { - foreach (var service in manifest.Services) - { - services.AddTransient(service, sp => _services.GetService(service)); - } - } - services.AddInstance(_hostingEnvironment); services.AddInstance(_loggerFactory); @@ -111,6 +95,13 @@ namespace Microsoft.AspNet.Hosting _configureServices(services); } + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Application)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoadContextAccessor)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); + services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.LibraryExporter)); + return services; } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 6cdaffc401..331ad7fd76 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -33,32 +33,32 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create() { - return Create(services: null, config: null, configureApp: null, configureServices: null); + return Create(config: null, configureApp: null, configureServices: null); } public static TestServer Create(Action configureApp) { - return Create(services: null, config: null, configureApp: configureApp, configureServices: null); + return Create(config: null, configureApp: configureApp, configureServices: null); } public static TestServer Create(Action configureApp, Action configureServices) { - return Create(services: null, config: null, configureApp: configureApp, configureServices: configureServices); + return Create(config: null, configureApp: configureApp, configureServices: configureServices); } - public static TestServer Create(IServiceProvider services, Action configureApp, Func configureServices) + public static TestServer Create(Action configureApp, Func configureServices) { - return new TestServer(CreateBuilder(services, config: null, configureApp: configureApp, configureServices: configureServices)); + return new TestServer(CreateBuilder(config: null, configureApp: configureApp, configureServices: configureServices)); } - public static TestServer Create(IServiceProvider services, IConfiguration config, Action configureApp, Action configureServices) + public static TestServer Create(IConfiguration config, Action configureApp, Action configureServices) { - return new TestServer(CreateBuilder(services, config, configureApp, configureServices)); + return new TestServer(CreateBuilder(config, configureApp, configureServices)); } - public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config, Action configureApp, Action configureServices) + public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Action configureServices) { - return CreateBuilder(services, config, configureApp, + return CreateBuilder(config, configureApp, s => { if (configureServices != null) @@ -69,21 +69,20 @@ namespace Microsoft.AspNet.TestHost }); } - public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config, Action configureApp, Func configureServices) + public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Func configureServices) { - return CreateBuilder(services, config).UseStartup(configureApp, configureServices); + return CreateBuilder(config).UseStartup(configureApp, configureServices); } - public static WebHostBuilder CreateBuilder(IServiceProvider services, IConfiguration config) + public static WebHostBuilder CreateBuilder(IConfiguration config) { return new WebHostBuilder( - services ?? CallContextServiceLocator.Locator.ServiceProvider, config ?? new ConfigurationBuilder().Build()); } public static WebHostBuilder CreateBuilder() { - return CreateBuilder(services: null, config: null); + return CreateBuilder(config: null); } public HttpMessageHandler CreateHandler() diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index e640180a97..11fa37b5fe 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -405,9 +405,7 @@ namespace Microsoft.AspNet.Hosting private WebHostBuilder CreateBuilder(IConfiguration config = null) { - return new WebHostBuilder( - CallContextServiceLocator.Locator.ServiceProvider, - config ?? new ConfigurationBuilder().Build()); + return new WebHostBuilder(config ?? new ConfigurationBuilder().Build()); } public IFeatureCollection Initialize(IConfiguration configuration) diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 4cd92b967e..078019aff5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -108,7 +108,7 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - return new WebHostBuilder(CallContextServiceLocator.Locator.ServiceProvider, config, captureStartupErrors: true); + return new WebHostBuilder(config, captureStartupErrors: true); } private async Task AssertResponseContains(Func app, string expectedText) diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 9a1f79124b..626ae24631 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -31,19 +31,6 @@ namespace Microsoft.AspNet.TestHost TestServer.Create(app => { }); } - [Fact] - public void ThrowsIfNoApplicationEnvironmentIsRegisteredWithTheProvider() - { - // Arrange - var services = new ServiceCollection().BuildServiceProvider(); - - // Act & Assert - Assert.Throws( - () => TestServer.Create( - services, - new ConfigurationBuilder().Build(), new Startup().Configure, configureServices: null)); - } - [Fact] public async Task RequestServicesAutoCreated() { From 99f5febc3b43e394325324fc8b4f74f8dba560f7 Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 20 Oct 2015 10:05:22 -0700 Subject: [PATCH 0819/1838] Changing argument type of serverFeatures to IFeatureCollection --- .../Builder/ApplicationBuilderFactory.cs | 5 +++-- .../Builder/IApplicationBuilderFactory.cs | 3 ++- .../Internal/HostingEngine.cs | 14 +++++++------- 3 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs index a5b00f5fbf..eaf8d178d4 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs @@ -4,6 +4,7 @@ using System; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Builder.Internal; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Hosting.Builder { @@ -16,9 +17,9 @@ namespace Microsoft.AspNet.Hosting.Builder _serviceProvider = serviceProvider; } - public IApplicationBuilder CreateBuilder(object server) + public IApplicationBuilder CreateBuilder(IFeatureCollection serverFeatures) { - return new ApplicationBuilder(_serviceProvider, server); + return new ApplicationBuilder(_serviceProvider, serverFeatures); } } } diff --git a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs index ddcf5807a5..00e64a0a2c 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs @@ -2,11 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Hosting.Builder { public interface IApplicationBuilderFactory { - IApplicationBuilder CreateBuilder(object server); + IApplicationBuilder CreateBuilder(IFeatureCollection serverFeatures); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 213b492f16..8c603b6e3c 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Only one of these should be set internal IServerFactory ServerFactory { get; set; } internal string ServerFactoryLocation { get; set; } - private IFeatureCollection _serverInstance; + private IFeatureCollection _serverFeatures; public HostingEngine( IServiceCollection appServices, @@ -89,7 +89,7 @@ namespace Microsoft.AspNet.Hosting.Internal var contextFactory = _applicationServices.GetRequiredService(); var contextAccessor = _applicationServices.GetRequiredService(); var diagnosticSource = _applicationServices.GetRequiredService(); - var server = ServerFactory.Start(_serverInstance, + var server = ServerFactory.Start(_serverFeatures, async features => { var httpContext = contextFactory.CreateHttpContext(features); @@ -125,7 +125,7 @@ namespace Microsoft.AspNet.Hosting.Internal _applicationLifetime.NotifyStarted(); - return new Application(ApplicationServices, _serverInstance, new Disposable(() => + return new Application(ApplicationServices, _serverFeatures, new Disposable(() => { _applicationLifetime.StopApplication(); server.Dispose(); @@ -181,7 +181,7 @@ namespace Microsoft.AspNet.Hosting.Internal EnsureServer(); var builderFactory = _applicationServices.GetRequiredService(); - var builder = builderFactory.CreateBuilder(_serverInstance); + var builder = builderFactory.CreateBuilder(_serverFeatures); builder.ApplicationServices = _applicationServices; var startupFilters = _applicationServices.GetService>(); @@ -247,10 +247,10 @@ namespace Microsoft.AspNet.Hosting.Internal ServerFactory = _applicationServices.GetRequiredService().LoadServerFactory(ServerFactoryLocation); } - if (_serverInstance == null) + if (_serverFeatures == null) { - _serverInstance = ServerFactory.Initialize(_config); - var addresses = _serverInstance?.Get()?.Addresses; + _serverFeatures = ServerFactory.Initialize(_config); + var addresses = _serverFeatures?.Get()?.Addresses; if (addresses != null && !addresses.IsReadOnly) { var port = _config[ServerPort]; From 7cc3e11a9e11341046828203fe8cd74d24852d7f Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 21 Oct 2015 14:12:23 -0700 Subject: [PATCH 0820/1838] Add compiler configuration to services and another overload for test server creation .. to alow host service configuration --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 1 + src/Microsoft.AspNet.TestHost/TestServer.cs | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 815684d2b9..ef7aeb0ecb 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -101,6 +101,7 @@ namespace Microsoft.AspNet.Hosting services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.LibraryExporter)); + services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.CompilerOptionsProvider)); return services; } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 331ad7fd76..56dce2e74c 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -48,7 +48,11 @@ namespace Microsoft.AspNet.TestHost public static TestServer Create(Action configureApp, Func configureServices) { - return new TestServer(CreateBuilder(config: null, configureApp: configureApp, configureServices: configureServices)); + return new TestServer(CreateBuilder(config: null, configureApp: configureApp, configureServices: configureServices, configureHostServices: null)); + } + public static TestServer Create(Action configureApp, Func configureServices, Action configureHostServices) + { + return new TestServer(CreateBuilder(config: null, configureApp: configureApp, configureServices: configureServices, configureHostServices: configureHostServices)); } public static TestServer Create(IConfiguration config, Action configureApp, Action configureServices) @@ -66,12 +70,16 @@ namespace Microsoft.AspNet.TestHost configureServices(s); } return s.BuildServiceProvider(); - }); + }, null); } - public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Func configureServices) { - return CreateBuilder(config).UseStartup(configureApp, configureServices); + return CreateBuilder(config, configureApp, configureServices, null); + } + + public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Func configureServices, Action configureHostServices) + { + return CreateBuilder(config).UseStartup(configureApp, configureServices).UseServices(configureHostServices); } public static WebHostBuilder CreateBuilder(IConfiguration config) From 39c355002b3afa7eaa901a5654b5eaddfcf62c94 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 21 Oct 2015 21:37:42 -0700 Subject: [PATCH 0821/1838] Switching to using generations TFM --- .../project.json | 28 +++---- .../project.json | 31 ++++---- src/Microsoft.AspNet.Hosting/project.json | 77 ++++++++++--------- 3 files changed, 68 insertions(+), 68 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index daaa329df3..0bc206ff72 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -1,16 +1,16 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 Hosting abstractions.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/hosting" - }, - "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*" - }, - "frameworks": { - "dnx451": {}, - "dnxcore50": {} - } + "version": "1.0.0-*", + "description": "ASP.NET 5 Hosting abstractions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "dependencies": { + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": {} + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index c36c180620..a3ccdf94bb 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -1,17 +1,16 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 Hosting server abstractions.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/hosting" - }, - "dependencies": { - "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" - }, - - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} + "version": "1.0.0-*", + "description": "ASP.NET 5 Hosting server abstractions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "dependencies": { + "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": {} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 83b490ebe0..01bf705d81 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -1,42 +1,43 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/hosting" + "version": "1.0.0-*", + "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "compilationOptions": { + "warningsAsErrors": true, + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", + "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", + "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.Extensions.Configuration": "1.0.0-*", + "Microsoft.Extensions.Configuration.CommandLine": "1.0.0-*", + "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-*", + "Microsoft.Extensions.Configuration.Json": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", + "Microsoft.Extensions.Logging": "1.0.0-*", + "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", + "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", + "Newtonsoft.Json": "6.0.6", + "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" + }, + "frameworks": { + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "" + } }, - "compilationOptions": { - "warningsAsErrors": true, - "allowUnsafe": true - }, - "dependencies": { - "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", - "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Extensions": "1.0.0-*", - "Microsoft.Extensions.Configuration": "1.0.0-*", - "Microsoft.Extensions.Configuration.CommandLine": "1.0.0-*", - "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-*", - "Microsoft.Extensions.Configuration.Json": "1.0.0-*", - "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "Microsoft.Extensions.Logging": "1.0.0-*", - "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", - "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", - "Newtonsoft.Json": "6.0.6", - "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" - }, - "frameworks": { - "dnx451": { - "frameworkAssemblies": { - "System.Runtime": "" - } - }, - "dnxcore50": { - "dependencies": { - "System.Console": "4.0.0-beta-*", - "System.Diagnostics.StackTrace": "4.0.1-beta-*" - } - } + "dnxcore50": { + "dependencies": { + "System.Console": "4.0.0-beta-*", + "System.Diagnostics.StackTrace": "4.0.1-beta-*", + "System.Reflection.Extensions": "4.0.1-beta-*" + } } + } } From 10822b3b4f4a7343cbf9eec6773f611e443e07b2 Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 20 Oct 2015 16:59:26 -0700 Subject: [PATCH 0822/1838] #411 Move webroot from project.json to config. --- .../HostingEnvironmentExtensions.cs | 14 +++++++-- .../Internal/HostingUtilities.cs | 31 ------------------- .../WebHostBuilder.cs | 5 +-- src/Microsoft.AspNet.Hosting/project.json | 1 - .../HostingEngineTests.cs | 13 ++++++-- .../HostingUtilitiesTests.cs | 18 ----------- .../project.json | 3 +- .../TestServerTests.cs | 2 +- 8 files changed, 25 insertions(+), 62 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index 98a839afdc..59aae860dc 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -3,20 +3,28 @@ using System.IO; using Microsoft.AspNet.FileProviders; -using Microsoft.AspNet.Hosting.Internal; +using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting { public static class HostingEnvironmentExtensions { - public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, string environmentName) + private const string OldEnvironmentKey = "ASPNET_ENV"; + private const string EnvironmentKey = "Hosting:Environment"; + + private const string WebRootKey = "Hosting:WebRoot"; + + public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, IConfiguration config) { - hostingEnvironment.WebRootPath = HostingUtilities.GetWebRoot(applicationBasePath); + var webRoot = config?[WebRootKey] ?? string.Empty; + hostingEnvironment.WebRootPath = Path.Combine(applicationBasePath, webRoot); if (!Directory.Exists(hostingEnvironment.WebRootPath)) { Directory.CreateDirectory(hostingEnvironment.WebRootPath); } hostingEnvironment.WebRootFileProvider = new PhysicalFileProvider(hostingEnvironment.WebRootPath); + + var environmentName = config?[EnvironmentKey] ?? config?[OldEnvironmentKey]; hostingEnvironment.EnvironmentName = environmentName ?? hostingEnvironment.EnvironmentName; } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs deleted file mode 100644 index 305888997d..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingUtilities.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public static class HostingUtilities - { - public static string GetWebRoot(string applicationBasePath) - { - var webroot = applicationBasePath; - using (var stream = File.OpenRead(Path.Combine(applicationBasePath, "project.json"))) - { - using (var reader = new JsonTextReader(new StreamReader(stream))) - { - var project = JObject.Load(reader); - JToken token; - if (project.TryGetValue("webroot", out token)) - { - webroot = Path.Combine(applicationBasePath, token.ToString()); - } - } - } - return Path.GetFullPath(webroot); - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index ef7aeb0ecb..d19ca7668b 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -21,9 +21,6 @@ namespace Microsoft.AspNet.Hosting { public class WebHostBuilder { - public const string OldEnvironmentKey = "ASPNET_ENV"; - public const string EnvironmentKey = "Hosting:Environment"; - public const string OldApplicationKey = "app"; public const string ApplicationKey = "Hosting:Application"; @@ -115,7 +112,7 @@ namespace Microsoft.AspNet.Hosting var appEnvironment = hostingContainer.GetRequiredService(); var startupLoader = hostingContainer.GetRequiredService(); - _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _config?[EnvironmentKey] ?? _config?[OldEnvironmentKey]); + _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _config); var engine = new HostingEngine(hostingServices, startupLoader, _config, _captureStartupErrors); // Only one of these should be set, but they are used in priority diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 01bf705d81..148bec393f 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -23,7 +23,6 @@ "Microsoft.Extensions.Logging": "1.0.0-*", "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", - "Newtonsoft.Json": "6.0.6", "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" }, "frameworks": { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 11fa37b5fe..afd3a1fc94 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -248,9 +248,18 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void WebRootCanBeResolvedFromTheProjectJson() + public void WebRootCanBeResolvedFromTheConfig() { - var engine = CreateBuilder().UseServer(this).Build(); + var vals = new Dictionary + { + { "Hosting:WebRoot", "testroot" } + }; + + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + + var engine = CreateBuilder(config).UseServer(this).Build(); var env = engine.ApplicationServices.GetRequiredService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs deleted file mode 100644 index 86de386a1e..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingUtilitiesTests.cs +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Hosting.Internal; -using Xunit; - -namespace Microsoft.AspNet.Hosting.Tests -{ - public class HostingUtilitiesTests - { - [Fact] - public void ReadWebRootFromProjectJson() - { - var root = HostingUtilities.GetWebRoot("."); - Assert.True(root.EndsWith("testroot")); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index f4cb38366d..935b44acbd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -13,6 +13,5 @@ }, "commands": { "test": "xunit.runner.aspnet" - }, - "webroot": "testroot" + } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 626ae24631..ffbdb0c470 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -344,7 +344,7 @@ namespace Microsoft.AspNet.TestHost } [Fact] - public void WebRootCanBeResolvedWhenNotInTheProjectJson() + public void WebRootCanBeResolvedWhenNotInTheConfig() { TestServer server = TestServer.Create(app => { From f2e7c49c36f2172b90f8a905293365bcc175490c Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 22 Oct 2015 06:13:25 -0700 Subject: [PATCH 0823/1838] Don't add platforms services if no available --- .../WebHostBuilder.cs | 22 +++++++++++++------ 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index d19ca7668b..8938b79333 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -92,13 +92,21 @@ namespace Microsoft.AspNet.Hosting _configureServices(services); } - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Application)); - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoadContextAccessor)); - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); - services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.LibraryExporter)); - services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.CompilerOptionsProvider)); + if (PlatformServices.Default != null) + { + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Application)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoadContextAccessor)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); + services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); + } + + // TODO: Remove this + if (CompilationServices.Default != null) + { + services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.LibraryExporter)); + services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.CompilerOptionsProvider)); + } return services; } From 4702752384ca4fbd447f34fcdb4385a8b1947ff4 Mon Sep 17 00:00:00 2001 From: Chris R Date: Thu, 22 Oct 2015 09:27:53 -0700 Subject: [PATCH 0824/1838] #411 Default webroot to wwwroot if the directory exists. --- .../HostingEnvironmentExtensions.cs | 23 +++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index 59aae860dc..4ff521aefb 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -16,8 +16,27 @@ namespace Microsoft.AspNet.Hosting public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, IConfiguration config) { - var webRoot = config?[WebRootKey] ?? string.Empty; - hostingEnvironment.WebRootPath = Path.Combine(applicationBasePath, webRoot); + var webRoot = config?[WebRootKey]; + if (webRoot == null) + { + // Default to /wwwroot if it exists. + var wwwroot = Path.Combine(applicationBasePath, "wwwroot"); + if (Directory.Exists(wwwroot)) + { + hostingEnvironment.WebRootPath = wwwroot; + } + else + { + hostingEnvironment.WebRootPath = applicationBasePath; + } + } + else + { + hostingEnvironment.WebRootPath = Path.Combine(applicationBasePath, webRoot); + } + + hostingEnvironment.WebRootPath = Path.GetFullPath(hostingEnvironment.WebRootPath); + if (!Directory.Exists(hostingEnvironment.WebRootPath)) { Directory.CreateDirectory(hostingEnvironment.WebRootPath); From 8e946798a1f8bec8a063a1940b80fa45327cd1b1 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 22 Oct 2015 11:01:51 -0700 Subject: [PATCH 0825/1838] Remove compilation options from services. - This was a temporary work around to allow MVC to build. - Reacts to aspnet/Mvc#3383 --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 8938b79333..9467721720 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Hosting public const string OldServerKey = "server"; public const string ServerKey = "Hosting:Server"; - + private readonly IHostingEnvironment _hostingEnvironment; private readonly ILoggerFactory _loggerFactory; private readonly IConfiguration _config; @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Hosting services.AddTransient(); services.AddSingleton(); services.AddLogging(); - + var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); services.AddInstance(diagnosticSource); services.AddInstance(diagnosticSource); @@ -101,13 +101,6 @@ namespace Microsoft.AspNet.Hosting services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); } - // TODO: Remove this - if (CompilationServices.Default != null) - { - services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.LibraryExporter)); - services.TryAdd(ServiceDescriptor.Instance(CompilationServices.Default.CompilerOptionsProvider)); - } - return services; } From 47365e421f5374c51566b3d2a5704d61dab6f15e Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 22 Oct 2015 08:52:05 -0700 Subject: [PATCH 0826/1838] Add generations TFMs to Hosting packages --- .../Startup/StartupExceptionPage.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 12 ++++ .../Common/RetryHelper.cs | 2 +- .../Deployers/ApplicationDeployer.cs | 8 +-- .../Deployers/ApplicationDeployerFactory.cs | 2 +- .../Deployers/IISDeployer.cs | 2 +- .../Deployers/IISExpressDeployer.cs | 4 +- .../project.json | 66 +++++++++---------- .../ResponseStream.cs | 4 +- src/Microsoft.AspNet.TestHost/TestServer.cs | 1 - src/Microsoft.AspNet.TestHost/project.json | 42 ++++++------ 11 files changed, 78 insertions(+), 67 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index bf3125e834..0f663b231e 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -379,7 +379,7 @@ namespace Microsoft.AspNet.Hosting.Startup private static string GenerateFooterEncoded(IRuntimeEnvironment environment) { var runtimeType = HtmlEncodeAndReplaceLineBreaks(environment.RuntimeType); -#if DNXCORE50 +#if DNXCORE50 || DOTNET5_4 var systemRuntimeAssembly = typeof(System.ComponentModel.DefaultValueAttribute).GetTypeInfo().Assembly; var assemblyVersion = new AssemblyName(systemRuntimeAssembly.FullName).Version.ToString(); var clrVersion = HtmlEncodeAndReplaceLineBreaks(assemblyVersion); diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 148bec393f..01d2233836 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -31,12 +31,24 @@ "System.Runtime": "" } }, + "net451": { + "frameworkAssemblies": { + "System.Runtime": "" + } + }, "dnxcore50": { "dependencies": { "System.Console": "4.0.0-beta-*", "System.Diagnostics.StackTrace": "4.0.1-beta-*", "System.Reflection.Extensions": "4.0.1-beta-*" } + }, + "dotnet5.4": { + "dependencies": { + "System.Console": "4.0.0-beta-*", + "System.Diagnostics.StackTrace": "4.0.1-beta-*", + "System.Reflection.Extensions": "4.0.1-beta-*" + } } } } diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs index e6f9038725..6ece35a2db 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Server.Testing else { if (exception is HttpRequestException -#if DNX451 +#if DNX451 || NET451 || exception is System.Net.WebException #endif ) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index a8dfd0e17a..8e9541199b 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -238,9 +238,9 @@ namespace Microsoft.AspNet.Server.Testing protected void AddEnvironmentVariablesToProcess(ProcessStartInfo startInfo) { var environment = -#if DNX451 +#if NET451 startInfo.EnvironmentVariables; -#elif DNXCORE50 +#elif DOTNET5_4 startInfo.Environment; #endif @@ -260,10 +260,10 @@ namespace Microsoft.AspNet.Server.Testing } } -#if DNX451 +#if DNX451 || NET451 protected void SetEnvironmentVariable(System.Collections.Specialized.StringDictionary environment, string name, string value) { -#elif DNXCORE50 +#elif DNXCORE50 || DOTNET5_4 protected void SetEnvironmentVariable(System.Collections.Generic.IDictionary environment, string name, string value) { #endif diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs index 3bdcd17684..2ceaa03eed 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Server.Testing { case ServerType.IISExpress: return new IISExpressDeployer(deploymentParameters, logger); -#if DNX451 +#if NET451 case ServerType.IIS: return new IISDeployer(deploymentParameters, logger); #endif diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index 744c216dfd..db2fd224d4 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#if DNX451 +#if NET451 using System; using System.IO; using System.Linq; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index a9aaea2a35..96f69b2b7f 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -92,10 +92,10 @@ namespace Microsoft.AspNet.Server.Testing AddEnvironmentVariablesToProcess(startInfo); // IIS express figures out the DNX from %PATH%. -#if DNX451 +#if NET451 SetEnvironmentVariable(startInfo.EnvironmentVariables, "PATH", ChosenRuntimePath + ";" + startInfo.EnvironmentVariables["PATH"]); SetEnvironmentVariable(startInfo.EnvironmentVariables, "DNX_APPBASE", DeploymentParameters.ApplicationPath); -#elif DNXCORE50 +#elif DOTNET5_4 SetEnvironmentVariable(startInfo.Environment, "PATH", ChosenRuntimePath + ";" + startInfo.Environment["PATH"]); SetEnvironmentVariable(startInfo.Environment, "DNX_APPBASE", DeploymentParameters.ApplicationPath); #endif diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 90279d5ecf..e3c02cd77b 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -1,36 +1,36 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/hosting" + "version": "1.0.0-*", + "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "dependencies": { + "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Extensions.Logging.Abstractions": "1.0.0-*", + "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*" + }, + "frameworks": { + "net451": { + "dependencies": { + "Microsoft.Web.Administration": "7.0.0" + }, + "frameworkAssemblies": { + "System.Net.Http": "", + "System.Xml": "" + } }, - "dependencies": { - "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Extensions.Logging.Abstractions": "1.0.0-*", - "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*" - }, - "frameworks": { - "dnx451": { - "dependencies": { - "Microsoft.Web.Administration": "7.0.0" - }, - "frameworkAssemblies": { - "System.Net.Http": "", - "System.Xml": "" - } - }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Process": "4.0.0-beta-*", - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Net.Http": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Text.RegularExpressions": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*", - "System.Threading.Thread": "4.0.0-*" - } - } + "dotnet5.4": { + "dependencies": { + "System.Diagnostics.Process": "4.0.0-beta-*", + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Net.Http": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Text.RegularExpressions": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*", + "System.Threading.Thread": "4.0.0-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index a1dd0df091..314bbec048 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -169,7 +169,7 @@ namespace Microsoft.AspNet.TestHost _readLock.Release(); } } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { // TODO: This option doesn't preserve the state object. @@ -266,7 +266,7 @@ namespace Microsoft.AspNet.TestHost _writeLock.Release(); } } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { Write(buffer, offset, count); diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 56dce2e74c..176431060c 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -9,7 +9,6 @@ using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 34769e53cd..20bd0b4016 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,24 +1,24 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 web server for writing and running tests.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/hosting" + "version": "1.0.0-*", + "description": "ASP.NET 5 web server for writing and running tests.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*" + }, + "frameworks": { + "net451": { + "frameworkAssemblies": { + "System.Net.Http": "" + } }, - "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*" - }, - "frameworks": { - "dnx451": { - "frameworkAssemblies": { - "System.Net.Http": "" - } - }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Contracts": "4.0.1-beta-*", - "System.Net.Http": "4.0.1-beta-*" - } - } + "dotnet5.4": { + "dependencies": { + "System.Diagnostics.Contracts": "4.0.1-beta-*", + "System.Net.Http": "4.0.1-beta-*" + } } -} + } +} \ No newline at end of file From 77f29142aa3649fec9246591acb9546cc8e7f105 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 19 Oct 2015 23:54:49 -0700 Subject: [PATCH 0827/1838] Disable tests that randomly hang on Linux (#442). --- test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs | 4 +++- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index d4092e5ea2..ec7976d685 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -223,7 +223,7 @@ namespace Microsoft.AspNet.TestHost } [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.Mono)] + [OSSkipCondition(OperatingSystems.Linux, SkipReason = "Hangs randomly (issue #422).")] public async Task ExceptionAfterFirstWriteIsReported() { ManualResetEvent block = new ManualResetEvent(false); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index e2ed03d89c..0d19dd88ef 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -11,6 +11,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Testing.xunit; using Xunit; namespace Microsoft.AspNet.TestHost @@ -280,7 +281,8 @@ namespace Microsoft.AspNet.TestHost var exception = await Assert.ThrowsAnyAsync(async () => await tcs.Task); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.CoreCLR, SkipReason = "Hangs randomly (issue #422).")] public async Task ClientCancellationAbortsRequest() { // Arrange diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index ffbdb0c470..a422818802 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -388,7 +389,8 @@ namespace Microsoft.AspNet.TestHost await Assert.ThrowsAsync(() => server.CreateClient().GetAsync("/")); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.CoreCLR, SkipReason = "Hangs randomly (issue #422).")] public void CancelAborts() { TestServer server = TestServer.Create(app => From 14c96f695a91207e2d5d048b38fce958fe69bbca Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 21 Oct 2015 15:43:42 -0700 Subject: [PATCH 0828/1838] Rename `AppendEncoded()` to `AppendHtml()` - aspnet/Mvc#3225, 1 of 3 --- .../HtmlContentBuilderExtensions.cs | 6 +++--- .../IHtmlContentBuilder.cs | 2 +- .../BufferedHtmlContent.cs | 2 +- .../HtmlContentBuilderExtensionsTest.cs | 6 +++--- .../BufferedHtmlContentTest.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 5f8515bb03..b3b9fc23e7 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . /// The HTML encoded to append. /// The . - public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) { - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -180,7 +180,7 @@ namespace Microsoft.AspNet.Html.Abstractions public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) { builder.Clear(); - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); return builder; } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index ced5bd763e..e55cec3530 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The HTML encoded to append. /// The . - IHtmlContentBuilder AppendEncoded(string encoded); + IHtmlContentBuilder AppendHtml(string encoded); /// /// Clears the content. diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 3b79916d9c..ba32edf99c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -48,7 +48,7 @@ namespace Microsoft.Extensions.Internal /// /// The HTML encoded string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder AppendEncoded(string value) + public IHtmlContentBuilder AppendHtml(string value) { Entries.Add(new HtmlEncodedString(value)); return this; diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index b1a8fab41f..1f2d9975ed 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -62,13 +62,13 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_AppendLineEncoded_String() + public void Builder_AppendHtmlLine_String() { // Arrange var builder = new TestHtmlContentBuilder(); // Act - builder.AppendLineEncoded("Hi"); + builder.AppendHtmlLine("Hi"); // Assert Assert.Collection( @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public IHtmlContentBuilder AppendEncoded(string encoded) + public IHtmlContentBuilder AppendHtml(string encoded) { Entries.Add(new EncodedString(encoded)); return this; diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index e883f84960..2eebd6041e 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -41,11 +41,11 @@ namespace Microsoft.Extensions.Internal } [Fact] - public void AppendEncoded_DoesNotGetWrittenAsEncoded() + public void AppendHtml_DoesNotGetWrittenAsEncoded() { // Arrange var content = new BufferedHtmlContent(); - content.AppendEncoded("Hello"); + content.AppendHtml("Hello"); var writer = new StringWriter(); From 9d7300c52bad4c249d953366156025edc9757b9d Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 21 Oct 2015 15:45:55 -0700 Subject: [PATCH 0829/1838] Revert "Rename `AppendEncoded()` to `AppendHtml()`" This reverts commit 14c96f695a91207e2d5d048b38fce958fe69bbca. --- .../HtmlContentBuilderExtensions.cs | 6 +++--- .../IHtmlContentBuilder.cs | 2 +- .../BufferedHtmlContent.cs | 2 +- .../HtmlContentBuilderExtensionsTest.cs | 6 +++--- .../BufferedHtmlContentTest.cs | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index b3b9fc23e7..5f8515bb03 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . /// The HTML encoded to append. /// The . - public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) { - builder.AppendHtml(encoded); + builder.AppendEncoded(encoded); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -180,7 +180,7 @@ namespace Microsoft.AspNet.Html.Abstractions public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) { builder.Clear(); - builder.AppendHtml(encoded); + builder.AppendEncoded(encoded); return builder; } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index e55cec3530..ced5bd763e 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The HTML encoded to append. /// The . - IHtmlContentBuilder AppendHtml(string encoded); + IHtmlContentBuilder AppendEncoded(string encoded); /// /// Clears the content. diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index ba32edf99c..3b79916d9c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -48,7 +48,7 @@ namespace Microsoft.Extensions.Internal /// /// The HTML encoded string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder AppendHtml(string value) + public IHtmlContentBuilder AppendEncoded(string value) { Entries.Add(new HtmlEncodedString(value)); return this; diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 1f2d9975ed..b1a8fab41f 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -62,13 +62,13 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_AppendHtmlLine_String() + public void Builder_AppendLineEncoded_String() { // Arrange var builder = new TestHtmlContentBuilder(); // Act - builder.AppendHtmlLine("Hi"); + builder.AppendLineEncoded("Hi"); // Assert Assert.Collection( @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public IHtmlContentBuilder AppendHtml(string encoded) + public IHtmlContentBuilder AppendEncoded(string encoded) { Entries.Add(new EncodedString(encoded)); return this; diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index 2eebd6041e..e883f84960 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -41,11 +41,11 @@ namespace Microsoft.Extensions.Internal } [Fact] - public void AppendHtml_DoesNotGetWrittenAsEncoded() + public void AppendEncoded_DoesNotGetWrittenAsEncoded() { // Arrange var content = new BufferedHtmlContent(); - content.AppendHtml("Hello"); + content.AppendEncoded("Hello"); var writer = new StringWriter(); From 0219aabc171d41aad412819a286add4e4f7ad2e5 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 21 Oct 2015 21:10:18 -0700 Subject: [PATCH 0830/1838] Switching to using generations TFM --- .../project.json | 39 ++++++----- .../project.json | 11 ++-- .../project.json | 14 ++-- .../project.json | 54 +++++++-------- .../HttpContextAccessor.cs | 8 +-- .../ReferenceReadStream.cs | 4 +- src/Microsoft.AspNet.Http/project.json | 48 +++++++------- src/Microsoft.AspNet.Owin/project.json | 66 +++++++++---------- .../BufferedReadStream.cs | 4 +- .../FileBufferingReadStream.cs | 4 +- .../MultipartReaderStream.cs | 4 +- .../project.json | 52 +++++++-------- .../project.json | 31 ++++----- .../project.json | 49 +++++++------- .../project.json | 39 ++++++----- src/Microsoft.Net.Http.Headers/project.json | 47 +++++++------ 16 files changed, 233 insertions(+), 241 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index fd368e97e6..9fe9c36612 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -1,23 +1,22 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTML content interface.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "net45" : { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTML content interface.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*" + } } + } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 1d944cde2a..8c0d539da3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -10,12 +10,15 @@ }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.ActivatorUtilities.Sources": { + "type": "build", + "version": "1.0.0-*" + }, "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { + "net451": {}, + "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-beta-*", "System.Diagnostics.Tools": "4.0.1-beta-*", @@ -35,4 +38,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1d330ebe5d..5cc71ea727 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -5,17 +5,17 @@ "type": "git", "url": "git://github.com/aspnet/httpabstractions" }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { + "net451": {}, + "dotnet5.4": { "dependencies": { "System.IO.FileSystem": "4.0.1-beta-*", "System.Runtime": "4.0.21-beta-*", @@ -23,4 +23,4 @@ } } } -} +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 73e5663933..0a3df94ed9 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -1,29 +1,29 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature interface definitions.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Net.WebSockets": "4.0.0-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature interface definitions.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.Primitives": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Net.WebSockets": "4.0.0-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Security.Claims": "4.0.1-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.1-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs index 384bb961ca..83b558161d 100644 --- a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -#if DNX451 +#if NET451 using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting; -#elif DNXCORE50 +#elif DOTNET5_4 using System.Threading; #endif @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Internal { public class HttpContextAccessor : IHttpContextAccessor { -#if DNX451 +#if NET451 private const string LogicalDataKey = "__HttpContext_Current__"; public HttpContext HttpContext @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Http.Internal } } -#elif DNXCORE50 +#elif DOTNET5_4 private AsyncLocal _httpContextCurrent = new AsyncLocal(); public HttpContext HttpContext { diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 509a6e44cd..1a413d4271 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -115,7 +115,7 @@ namespace Microsoft.AspNet.Http.Internal _position += read; return read; } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -164,7 +164,7 @@ namespace Microsoft.AspNet.Http.Internal { throw new NotSupportedException(); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 6ea620d194..cc8ecdc60c 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -1,26 +1,26 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP feature implementations.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true, - "allowUnsafe": true - }, - "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.Text.Encoding": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP feature implementations.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true, + "allowUnsafe": true + }, + "dependencies": { + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.Net.Http.Headers": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.Text.Encoding": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index a20dd5ccff..545a5bcb92 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -1,35 +1,35 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 component for running OWIN middleware.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Tools": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Runtime.InteropServices": "4.0.21-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*", - "System.Threading.Tasks": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 component for running OWIN middleware.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.AspNet.Http": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Tools": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Net.Primitives": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Runtime.InteropServices": "4.0.21-beta-*", + "System.Security.Claims": "4.0.1-beta-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", + "System.Security.Principal": "4.0.1-beta-*", + "System.Threading.Tasks": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index 88e2782938..d78d3b34ce 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.WebUtilities { _inner.Write(buffer, offset, count); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { return _inner.BeginWrite(buffer, offset, count, callback, state); @@ -198,7 +198,7 @@ namespace Microsoft.AspNet.WebUtilities return await _inner.ReadAsync(buffer, offset, count, cancellationToken); } -#if DNX451 +#if NET451 // We only anticipate using ReadAsync public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs index 3341b65857..f67eed3d93 100644 --- a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs @@ -163,7 +163,7 @@ namespace Microsoft.AspNet.WebUtilities return read; } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { ThrowIfDisposed(); @@ -239,7 +239,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int count, AsyncCallback callback, object state) { throw new NotSupportedException(); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs index 9350233c83..d87fae944f 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.WebUtilities { throw new NotSupportedException(); } -#if DNX451 +#if NET451 public override IAsyncResult BeginWrite(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { throw new NotSupportedException(); @@ -157,7 +157,7 @@ namespace Microsoft.AspNet.WebUtilities } return read; } -#if DNX451 +#if NET451 public override IAsyncResult BeginRead(byte[] buffer, int offset, int size, AsyncCallback callback, object state) { var tcs = new TaskCompletionSource(state); diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 5a64ca96b6..93b5d00c98 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -1,28 +1,28 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 common helper methods.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.Primitives": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 common helper methods.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.Primitives": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.IO.FileSystem": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json index 812b75a205..a60d35fe5c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json @@ -1,21 +1,14 @@ { - "version": "1.0.0-*", - "shared": "*.cs", - "dependencies": { }, - "frameworks" : { - "net45": { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*" - } - }, - "dotnet": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*" - } - } + "version": "1.0.0-*", + "shared": "*.cs", + "dependencies": {}, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Resources.ResourceManager": "4.0.1-beta-*", + "System.Runtime": "4.0.21-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json index 0da3e70874..990b9a373b 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/project.json +++ b/src/Microsoft.Extensions.WebEncoders.Core/project.json @@ -1,27 +1,26 @@ { - "version": "1.0.0-*", - "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "allowUnsafe": true, - "warningsAsErrors": true - }, - "frameworks": { - "net45": { }, - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Reflection": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*" - } - } + "version": "1.0.0-*", + "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "allowUnsafe": true, + "warningsAsErrors": true + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.ComponentModel": "4.0.1-beta-*", + "System.Diagnostics.Debug": "4.0.11-beta-*", + "System.IO": "4.0.11-beta-*", + "System.Reflection": "4.0.10-*", + "System.Resources.ResourceManager": "4.0.1-beta-*", + "System.Runtime.Extensions": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*" + } } -} + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index 7cd8aac9ad..ecc7c0a3d1 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -1,21 +1,20 @@ { - "version": "1.0.0-*", - "description": "Contains registration and configuration APIs for the core framework encoders.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" - }, - "frameworks": { - "net45": { }, - "dnx451": { }, - "dnxcore50": { } - } -} + "version": "1.0.0-*", + "description": "Contains registration and configuration APIs for the core framework encoders.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", + "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + }, + "frameworks": { + "net451": {}, + "dotnet5.4": {} + } +} \ No newline at end of file diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index effac85e1f..853c52324c 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -1,26 +1,25 @@ { - "version": "1.0.0-*", - "description": "ASP.NET 5 HTTP header implementations.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true - }, - "frameworks" : { - "net45" : { }, - "dnx451" : { }, - "dnxcore50" : { - "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Contracts": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.Globalization.Extensions": "4.0.1-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Text.Encoding": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*" - } - } + "version": "1.0.0-*", + "description": "ASP.NET 5 HTTP header implementations.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/httpabstractions" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "frameworks": { + "net451": {}, + "dotnet5.4": { + "dependencies": { + "System.Collections": "4.0.11-beta-*", + "System.Diagnostics.Contracts": "4.0.1-beta-*", + "System.Globalization": "4.0.11-beta-*", + "System.Globalization.Extensions": "4.0.1-beta-*", + "System.Linq": "4.0.1-beta-*", + "System.Text.Encoding": "4.0.11-beta-*", + "System.Runtime": "4.0.21-beta-*" + } } -} + } +} \ No newline at end of file From 0394987271383c5934395fa299f662991143b4fe Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 20 Oct 2015 10:43:43 -0700 Subject: [PATCH 0831/1838] Adding more specific error for private configure --- .../Startup/StartupLoader.cs | 2 +- .../Fakes/StartupPrivateConfigure.cs | 25 +++++++++++++++++++ .../StartupManagerTests.cs | 18 ++++++++++++- 3 files changed, 43 insertions(+), 2 deletions(-) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupPrivateConfigure.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index f97b024bec..1898dd818a 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.Hosting.Startup { if (required) { - throw new InvalidOperationException(string.Format("A method named '{0}' or '{1}' in the type '{2}' could not be found.", + throw new InvalidOperationException(string.Format("A public method named '{0}' or '{1}' could not be found in the '{2}' type.", methodNameWithEnv, methodNameWithNoEnv, startupType.FullName)); diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupPrivateConfigure.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupPrivateConfigure.cs new file mode 100644 index 0000000000..b06efe81da --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupPrivateConfigure.cs @@ -0,0 +1,25 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupPrivateConfigure + { + public StartupPrivateConfigure() + { + } + + public void ConfigureServices(IServiceCollection services) + { + + } + + private void Configure(IApplicationBuilder builder) + { + + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index e186469f0b..f7d835cd87 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Hosting.Tests var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); var ex = Assert.Throws(() => loader.LoadMethods(type, diagnosticMessages)); - Assert.Equal("A method named 'ConfigureBoom' or 'Configure' in the type 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' could not be found.", ex.Message); + Assert.Equal("A public method named 'ConfigureBoom' or 'Configure' could not be found in the 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' type.", ex.Message); } [Fact] @@ -98,6 +98,22 @@ namespace Microsoft.AspNet.Hosting.Tests var ex = Assert.Throws(() => loader.LoadMethods(type, diagnosticMessages)); Assert.Equal("Having multiple overloads of method 'Configure' is not supported.", ex.Message); } + + [Fact] + public void StartupWithPrivateConfiguresThrows() + { + var serviceCollection = new ServiceCollection(); + serviceCollection.AddInstance(this); + var services = serviceCollection.BuildServiceProvider(); + + var diagnosticMessages = new List(); + var hostingEnv = new HostingEnvironment { EnvironmentName = "PrivateConfigure" }; + var loader = new StartupLoader(services, hostingEnv); + var type = loader.FindStartupType("Microsoft.AspNet.Hosting.Tests", diagnosticMessages); + + var ex = Assert.Throws(() => loader.LoadMethods(type, diagnosticMessages)); + Assert.Equal("A public method named 'ConfigurePrivateConfigure' or 'Configure' could not be found in the 'Microsoft.AspNet.Hosting.Fakes.StartupPrivateConfigure' type.", ex.Message); + } [Fact] public void StartupWithTwoConfigureServicesThrows() From b72f95bdb5ed53578c8b4640ac3d31ce51e133b6 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 21 Oct 2015 16:14:01 -0700 Subject: [PATCH 0832/1838] Setting IHttpContextAccessor in CreateHttpContext #405 --- .../Builder/HttpContextFactory.cs | 11 ++++++++++- .../Internal/HostingEngine.cs | 2 -- .../HttpContextFactoryFacts.cs | 19 +++++++++++++++++-- 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs index d24250405b..c86cf451b5 100644 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs @@ -9,9 +9,18 @@ namespace Microsoft.AspNet.Hosting.Builder { public class HttpContextFactory : IHttpContextFactory { + private IHttpContextAccessor _httpContextAccessor; + + public HttpContextFactory(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + public HttpContext CreateHttpContext(IFeatureCollection featureCollection) { - return new DefaultHttpContext(featureCollection); + var httpContext = new DefaultHttpContext(featureCollection); + _httpContextAccessor.HttpContext = httpContext; + return httpContext; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 8c603b6e3c..4e175806e8 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -87,7 +87,6 @@ namespace Microsoft.AspNet.Hosting.Internal var logger = _applicationServices.GetRequiredService>(); var contextFactory = _applicationServices.GetRequiredService(); - var contextAccessor = _applicationServices.GetRequiredService(); var diagnosticSource = _applicationServices.GetRequiredService(); var server = ServerFactory.Start(_serverFeatures, async features => @@ -95,7 +94,6 @@ namespace Microsoft.AspNet.Hosting.Internal var httpContext = contextFactory.CreateHttpContext(features); httpContext.ApplicationServices = _applicationServices; var requestIdentifier = GetRequestIdentifier(httpContext); - contextAccessor.HttpContext = httpContext; if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs index a355ca0842..02f3a2cc2c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Owin; using Xunit; @@ -11,13 +12,27 @@ namespace Microsoft.AspNet.Hosting.Tests { public class HttpContextFactoryFacts { + [Fact] + public void CreateHttpContextSetsHttpContextAccessor() + { + // Arrange + var accessor = new HttpContextAccessor(); + var contextFactory = new HttpContextFactory(accessor); + + // Act + var context = contextFactory.CreateHttpContext(new FeatureCollection()); + + // Assert + Assert.True(ReferenceEquals(context, accessor.HttpContext)); + } + [Fact] public void Mutable_FeatureCollection_Wrapped_For_OwinFeatureCollection() { var env = new Dictionary(); - var contextFactory = new HttpContextFactory(); + var contextFactory = new HttpContextFactory(new HttpContextAccessor()); var context = contextFactory.CreateHttpContext(new FeatureCollection(new OwinFeatureCollection(env))); - + // Setting a feature will throw if the above feature collection is not wrapped in a mutable feature collection. context.Features.Set(new CustomFeature(100)); Assert.Equal(100, context.Features.Get().Value); From bcb56bdd1a771a514b005ee112140922b6dc852c Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Wed, 21 Oct 2015 15:43:42 -0700 Subject: [PATCH 0833/1838] Rename `AppendEncoded()` to `AppendHtml()` and `SetContentEncoded()` to `SetHtmlContent()` - aspnet/Mvc#3225, 1 of 3 Also correct parameter names and doc comments - add `xml-docs-test` to ensure this doc comments remain valid in the future --- makefile.shade | 3 +++ .../HtmlContentBuilderExtensions.cs | 27 ++++++++++--------- .../IHtmlContentBuilder.cs | 2 +- .../BufferedHtmlContent.cs | 14 +++++----- .../HtmlContentBuilderExtensionsTest.cs | 10 +++---- .../BufferedHtmlContentTest.cs | 4 +-- 6 files changed, 32 insertions(+), 28 deletions(-) diff --git a/makefile.shade b/makefile.shade index 562494d144..d5e473d558 100644 --- a/makefile.shade +++ b/makefile.shade @@ -5,3 +5,6 @@ var AUTHORS='Microsoft Open Technologies, Inc.' use-standard-lifecycle k-standard-goals + +#xml-docs-test .clean .build-compile description='Check generated XML documentation files for errors' target='package' + k-xml-docs-test diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 5f8515bb03..ef7f932226 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -5,7 +5,6 @@ using System; using System.Diagnostics; using System.Globalization; using System.IO; -using System.Text; using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Html.Abstractions @@ -20,6 +19,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// item with the HTML encoded representation of the corresponding item in the /// array. /// + /// The . /// /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. @@ -54,9 +54,10 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// Appends the specified to the existing content with information from the - /// after replacing each format item with the HTML encoded - /// representation of the corresponding item in the array. + /// after replacing each format item with the HTML encoded + /// representation of the corresponding item in the array. /// + /// The . /// An object that supplies culture-specific formatting information. /// /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). @@ -122,9 +123,9 @@ namespace Microsoft.AspNet.Html.Abstractions /// The . /// The to append. /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent htmlContent) + public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent content) { - builder.Append(htmlContent); + builder.Append(content); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -134,11 +135,11 @@ namespace Microsoft.AspNet.Html.Abstractions /// The value is treated as HTML encoded as-provided, and no further encoding will be performed. /// /// The . - /// The HTML encoded to append. + /// The HTML encoded to append. /// The . - public static IHtmlContentBuilder AppendLineEncoded(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) { - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); builder.Append(HtmlEncodedString.NewLine); return builder; } @@ -148,7 +149,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// and will be HTML encoded before writing to output. ///
/// The . - /// The value that replaces the content. + /// The value that replaces the content. /// The . public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, string unencoded) { @@ -161,7 +162,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// Sets the content to the value. ///
/// The . - /// The value that replaces the content. + /// The value that replaces the content. /// The . public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, IHtmlContent content) { @@ -175,12 +176,12 @@ namespace Microsoft.AspNet.Html.Abstractions /// no further encoding will be performed. ///
/// The . - /// The HTML encoded that replaces the content. + /// The HTML encoded that replaces the content. /// The . - public static IHtmlContentBuilder SetContentEncoded(this IHtmlContentBuilder builder, string encoded) + public static IHtmlContentBuilder SetHtmlContent(this IHtmlContentBuilder builder, string encoded) { builder.Clear(); - builder.AppendEncoded(encoded); + builder.AppendHtml(encoded); return builder; } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs index ced5bd763e..e55cec3530 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.Html.Abstractions ///
/// The HTML encoded to append. /// The . - IHtmlContentBuilder AppendEncoded(string encoded); + IHtmlContentBuilder AppendHtml(string encoded); /// /// Clears the content. diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 3b79916d9c..9d098518b8 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -24,11 +24,11 @@ namespace Microsoft.Extensions.Internal /// /// Appends the to the collection. /// - /// The string to be appended. + /// The string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder Append(string value) + public IHtmlContentBuilder Append(string unencoded) { - Entries.Add(value); + Entries.Add(unencoded); return this; } @@ -46,11 +46,11 @@ namespace Microsoft.Extensions.Internal /// /// Appends the HTML encoded to the collection. /// - /// The HTML encoded string to be appended. + /// The HTML encoded string to be appended. /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder AppendEncoded(string value) + public IHtmlContentBuilder AppendHtml(string encoded) { - Entries.Add(new HtmlEncodedString(value)); + Entries.Add(new HtmlEncodedString(encoded)); return this; } /// @@ -95,7 +95,7 @@ namespace Microsoft.Extensions.Internal } } } - + private string DebuggerToString() { using (var writer = new StringWriter()) diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index b1a8fab41f..8221fa524c 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -62,13 +62,13 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_AppendLineEncoded_String() + public void Builder_AppendHtmlLine_String() { // Arrange var builder = new TestHtmlContentBuilder(); // Act - builder.AppendLineEncoded("Hi"); + builder.AppendHtmlLine("Hi"); // Assert Assert.Collection( @@ -112,14 +112,14 @@ namespace Microsoft.AspNet.Html.Abstractions.Test } [Fact] - public void Builder_SetContentEncoded_String() + public void Builder_SetHtmlContent_String() { // Arrange var builder = new TestHtmlContentBuilder(); builder.Append("Existing Content. Will be Cleared."); // Act - builder.SetContentEncoded("Hi"); + builder.SetHtmlContent("Hi"); // Assert Assert.Collection( @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public IHtmlContentBuilder AppendEncoded(string encoded) + public IHtmlContentBuilder AppendHtml(string encoded) { Entries.Add(new EncodedString(encoded)); return this; diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index e883f84960..2eebd6041e 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -41,11 +41,11 @@ namespace Microsoft.Extensions.Internal } [Fact] - public void AppendEncoded_DoesNotGetWrittenAsEncoded() + public void AppendHtml_DoesNotGetWrittenAsEncoded() { // Arrange var content = new BufferedHtmlContent(); - content.AppendEncoded("Hello"); + content.AppendHtml("Hello"); var writer = new StringWriter(); From ea0abd82932b4a6734542306b2db7c182528edb8 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 22 Oct 2015 16:53:04 -0700 Subject: [PATCH 0834/1838] Rename Microsoft.Runtime.Abstractions to Microsoft.Extensions.PlatformAbstractions --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/Program.cs | 2 +- src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 1 - test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs | 1 - test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 8 files changed, 6 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 4e175806e8..7bcad0328c 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -13,10 +13,10 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Server.Features; -using Microsoft.Dnx.Runtime; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Internal { diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index c324b4e9c1..4715f818d5 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -5,10 +5,10 @@ using System; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Server.Features; using Microsoft.Dnx.Compilation; -using Microsoft.Dnx.Runtime; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; +using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index 0f663b231e..adc9656f89 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -12,7 +12,7 @@ using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Text; using Microsoft.Dnx.Compilation; -using Microsoft.Dnx.Runtime; +using Microsoft.Extensions.PlatformAbstractions; using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 9467721720..55126d83b7 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -11,11 +11,11 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; using Microsoft.Dnx.Compilation; -using Microsoft.Dnx.Runtime; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs index 330ff30c29..ee180c4f01 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.Dnx.Runtime; +using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Fakes { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index afd3a1fc94..9467dba265 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -17,7 +17,6 @@ using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.AspNet.Testing.xunit; -using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Internal; diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 078019aff5..d558dd40e3 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -10,7 +10,6 @@ using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; -using Microsoft.Dnx.Runtime.Infrastructure; using Microsoft.Extensions.Configuration; using Xunit; diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 935b44acbd..504a10b0b4 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -4,7 +4,7 @@ "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 02de506c28f1b1c2889d2ddc128bbbdc4739e9d6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 Oct 2015 00:33:48 -0700 Subject: [PATCH 0835/1838] React to rename of DNX abstractions --- src/Microsoft.AspNet.Hosting/project.json | 2 +- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 01d2233836..b2e9e33799 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -22,7 +22,7 @@ "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "Microsoft.Extensions.Logging": "1.0.0-*", "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", - "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*", + "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" }, "frameworks": { diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index e3c02cd77b..4d3ddd3fd1 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -8,7 +8,7 @@ "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Extensions.Logging.Abstractions": "1.0.0-*", - "Microsoft.Dnx.Runtime.Abstractions": "1.0.0-*" + "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*" }, "frameworks": { "net451": { From fa72b35883dccc39d6d3e9d66e738185f7e3f2f0 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 Oct 2015 02:59:50 -0700 Subject: [PATCH 0836/1838] More granualr null checks for platform services --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 55126d83b7..d3cb534555 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -92,12 +92,28 @@ namespace Microsoft.AspNet.Hosting _configureServices(services); } - if (PlatformServices.Default != null) + if (PlatformServices.Default?.Application != null) { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Application)); + } + + if (PlatformServices.Default?.Runtime != null) + { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); + } + + if (PlatformServices.Default?.AssemblyLoadContextAccessor != null) + { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoadContextAccessor)); + } + + if (PlatformServices.Default?.AssemblyLoaderContainer != null) + { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); + } + + if (PlatformServices.Default?.LibraryManager != null) + { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); } From d56e2fe59b226b43dc0ce676d5f9fd8786d6f94c Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 Oct 2015 03:11:50 -0700 Subject: [PATCH 0837/1838] Removed whitespace --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index d3cb534555..8d5c5648e6 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -96,22 +96,22 @@ namespace Microsoft.AspNet.Hosting { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Application)); } - + if (PlatformServices.Default?.Runtime != null) { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); } - + if (PlatformServices.Default?.AssemblyLoadContextAccessor != null) { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoadContextAccessor)); } - + if (PlatformServices.Default?.AssemblyLoaderContainer != null) { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); } - + if (PlatformServices.Default?.LibraryManager != null) { services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); From 460b9bcac162ab90c40ad13b448695dc2cf5ce39 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 23 Oct 2015 05:04:51 -0700 Subject: [PATCH 0838/1838] Exclude facade from .NET 4.5.1 target --- src/Microsoft.AspNet.Hosting/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index b2e9e33799..c5801b914d 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -33,7 +33,7 @@ }, "net451": { "frameworkAssemblies": { - "System.Runtime": "" + "System.Runtime": { "type": "build" } } }, "dnxcore50": { From 56256a013bf2acb5b47212c3e2d6ba4acc3828b5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 23 Oct 2015 09:43:59 -0700 Subject: [PATCH 0839/1838] #430 Move Program.Main into WebApplication.Run. --- src/Microsoft.AspNet.Hosting/Program.cs | 54 +----------- .../WebApplication.cs | 85 +++++++++++++++++++ 2 files changed, 86 insertions(+), 53 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/WebApplication.cs diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs index 4715f818d5..80fa43f73f 100644 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ b/src/Microsoft.AspNet.Hosting/Program.cs @@ -1,65 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Server.Features; -using Microsoft.Dnx.Compilation; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.PlatformAbstractions; - namespace Microsoft.AspNet.Hosting { public class Program { - private const string HostingJsonFile = "Microsoft.AspNet.Hosting.json"; - private const string ConfigFileKey = "config"; - public static void Main(string[] args) { - // Allow the location of the json file to be specified via a --config command line arg - var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); - var tempConfig = tempBuilder.Build(); - var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; - - var appBasePath = PlatformServices.Default.Application.ApplicationBasePath; - var config = new ConfigurationBuilder() - .SetBasePath(appBasePath) - .AddJsonFile(configFilePath, optional: true) - .AddEnvironmentVariables() - .AddCommandLine(args) - .Build(); - - var host = new WebHostBuilder(config, captureStartupErrors: true).Build(); - using (var app = host.Start()) - { - var hostingEnv = app.Services.GetRequiredService(); - Console.WriteLine("Hosting environment: " + hostingEnv.EnvironmentName); - - var serverAddresses = app.ServerFeatures.Get(); - if (serverAddresses != null) - { - foreach (var address in serverAddresses.Addresses) - { - Console.WriteLine("Now listening on: " + address); - } - } - - Console.WriteLine("Application started. Press Ctrl+C to shut down."); - - var appLifetime = app.Services.GetRequiredService(); - - Console.CancelKeyPress += (sender, eventArgs) => - { - appLifetime.StopApplication(); - // Don't terminate the process immediately, wait for the Main thread to exit gracefully. - eventArgs.Cancel = true; - }; - - appLifetime.ApplicationStopping.WaitHandle.WaitOne(); - } + WebApplication.Run(args); } } } diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs new file mode 100644 index 0000000000..fea0d58353 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -0,0 +1,85 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Server.Features; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public class WebApplication + { + private const string HostingJsonFile = "Microsoft.AspNet.Hosting.json"; + private const string ConfigFileKey = "config"; + + public static void Run(string[] args) + { + Run(startupType: null, args: args); + } + + public static void Run() + { + Run(typeof(TStartup), null); + } + + public static void Run(string[] args) + { + Run(typeof(TStartup), args); + } + + public static void Run(Type startupType) + { + Run(startupType, null); + } + + public static void Run(Type startupType, string[] args) + { + // Allow the location of the json file to be specified via a --config command line arg + var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); + var tempConfig = tempBuilder.Build(); + var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; + + var config = new ConfigurationBuilder() + .AddJsonFile(configFilePath, optional: true) + .AddEnvironmentVariables() + .AddCommandLine(args) + .Build(); + + var hostBuilder = new WebHostBuilder(config, captureStartupErrors: true); + if (startupType != null) + { + hostBuilder.UseStartup(startupType); + } + var host = hostBuilder.Build(); + using (var app = host.Start()) + { + var hostingEnv = app.Services.GetRequiredService(); + Console.WriteLine("Hosting environment: " + hostingEnv.EnvironmentName); + + var serverAddresses = app.ServerFeatures.Get(); + if (serverAddresses != null) + { + foreach (var address in serverAddresses.Addresses) + { + Console.WriteLine("Now listening on: " + address); + } + } + + Console.WriteLine("Application started. Press Ctrl+C to shut down."); + + var appLifetime = app.Services.GetRequiredService(); + + Console.CancelKeyPress += (sender, eventArgs) => + { + appLifetime.StopApplication(); + // Don't terminate the process immediately, wait for the Main thread to exit gracefully. + eventArgs.Cancel = true; + }; + + appLifetime.ApplicationStopping.WaitHandle.WaitOne(); + } + } + } +} From a20b3e6e377b738360d796bd0479a0d51d3703fc Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 23 Oct 2015 14:10:52 -0700 Subject: [PATCH 0840/1838] React to Testing changes --- .../Deployers/ApplicationDeployer.cs | 8 ++++---- src/Microsoft.AspNet.Server.Testing/project.json | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 8e9541199b..a8dfd0e17a 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -238,9 +238,9 @@ namespace Microsoft.AspNet.Server.Testing protected void AddEnvironmentVariablesToProcess(ProcessStartInfo startInfo) { var environment = -#if NET451 +#if DNX451 startInfo.EnvironmentVariables; -#elif DOTNET5_4 +#elif DNXCORE50 startInfo.Environment; #endif @@ -260,10 +260,10 @@ namespace Microsoft.AspNet.Server.Testing } } -#if DNX451 || NET451 +#if DNX451 protected void SetEnvironmentVariable(System.Collections.Specialized.StringDictionary environment, string name, string value) { -#elif DNXCORE50 || DOTNET5_4 +#elif DNXCORE50 protected void SetEnvironmentVariable(System.Collections.Generic.IDictionary environment, string name, string value) { #endif diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 4d3ddd3fd1..66ee97d55c 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -11,7 +11,7 @@ "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*" }, "frameworks": { - "net451": { + "dnx451": { "dependencies": { "Microsoft.Web.Administration": "7.0.0" }, @@ -20,7 +20,7 @@ "System.Xml": "" } }, - "dotnet5.4": { + "dnxcore50": { "dependencies": { "System.Diagnostics.Process": "4.0.0-beta-*", "System.IO.FileSystem": "4.0.1-beta-*", From f37375f43cd9e49ebcd61b62130d3455c8d41944 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Tue, 13 Oct 2015 14:10:26 -0700 Subject: [PATCH 0841/1838] Reduce logging overhead in hosting * TraceIdentifier is done at the last moment, or not at all * Request starting and finished messages are added * This pair provide many of the top-level values that you would have found in server log files. --- .../FastHttpRequestIdentifierFeature.cs | 65 ------ .../Internal/HostingEngine.cs | 41 ++-- .../Internal/HostingLoggerExtensions.cs | 189 ++++++++++++++++++ src/Microsoft.AspNet.Hosting/project.json | 3 +- .../HostingEngineTests.cs | 121 ++++++++++- .../FastHttpRequestIdentifierFeatureTests.cs | 44 ---- 6 files changed, 324 insertions(+), 139 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs deleted file mode 100644 index 95e7806557..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/FastHttpRequestIdentifierFeature.cs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public class FastHttpRequestIdentifierFeature : IHttpRequestIdentifierFeature - { - // Base64 encoding - but in ascii sort order for easy text based sorting - private static readonly string _encode32Chars = "0123456789ABCDEFGHIJKLMNOPQRSTUV"; - // Seed the _requestId for this application instance with - // the number of 100-nanosecond intervals that have elapsed since 12:00:00 midnight, January 1, 0001 - // for a roughly increasing _requestId over restarts - private static long _requestId = DateTime.UtcNow.Ticks; - - private string _id = null; - - public string TraceIdentifier - { - get - { - // Don't incur the cost of generating the request ID until it's asked for - if (_id == null) - { - _id = GenerateRequestId(Interlocked.Increment(ref _requestId)); - } - return _id; - } - set - { - _id = value; - } - } - - private static unsafe string GenerateRequestId(long id) - { - // The following routine is ~310% faster than calling long.ToString() on x64 - // and ~600% faster than calling long.ToString() on x86 in tight loops of 1 million+ iterations - // See: https://github.com/aspnet/Hosting/pull/385 - - // stackalloc to allocate array on stack rather than heap - char* charBuffer = stackalloc char[13]; - - charBuffer[0] = _encode32Chars[(int)(id >> 60) & 31]; - charBuffer[1] = _encode32Chars[(int)(id >> 55) & 31]; - charBuffer[2] = _encode32Chars[(int)(id >> 50) & 31]; - charBuffer[3] = _encode32Chars[(int)(id >> 45) & 31]; - charBuffer[4] = _encode32Chars[(int)(id >> 40) & 31]; - charBuffer[5] = _encode32Chars[(int)(id >> 35) & 31]; - charBuffer[6] = _encode32Chars[(int)(id >> 30) & 31]; - charBuffer[7] = _encode32Chars[(int)(id >> 25) & 31]; - charBuffer[8] = _encode32Chars[(int)(id >> 20) & 31]; - charBuffer[9] = _encode32Chars[(int)(id >> 15) & 31]; - charBuffer[10] = _encode32Chars[(int)(id >> 10) & 31]; - charBuffer[11] = _encode32Chars[(int)(id >> 5) & 31]; - charBuffer[12] = _encode32Chars[(int)id & 31]; - - // string ctor overload that takes char* - return new string(charBuffer, 0, 13); - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 7bcad0328c..b68e2f7c9b 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -93,27 +93,34 @@ namespace Microsoft.AspNet.Hosting.Internal { var httpContext = contextFactory.CreateHttpContext(features); httpContext.ApplicationServices = _applicationServices; - var requestIdentifier = GetRequestIdentifier(httpContext); + if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); } - try + + using (logger.RequestScope(httpContext)) { - using (logger.IsEnabled(LogLevel.Critical) - ? logger.BeginScope("Request Id: {RequestId}", requestIdentifier) - : null) + int startTime = 0; + try { + logger.RequestStarting(httpContext); + + startTime = Environment.TickCount; await application(httpContext); + + logger.RequestFinished(httpContext, startTime); } - } - catch (Exception ex) - { - if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) + catch (Exception ex) { - diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); + logger.RequestFailed(httpContext, startTime); + + if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) + { + diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); + } + throw; } - throw; } if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) { @@ -266,18 +273,6 @@ namespace Microsoft.AspNet.Hosting.Internal } } - private string GetRequestIdentifier(HttpContext httpContext) - { - var requestIdentifierFeature = httpContext.Features.Get(); - if (requestIdentifierFeature == null) - { - requestIdentifierFeature = new FastHttpRequestIdentifierFeature(); - httpContext.Features.Set(requestIdentifierFeature); - } - - return requestIdentifierFeature.TraceIdentifier; - } - private class Disposable : IDisposable { private Action _dispose; diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs new file mode 100644 index 0000000000..3f6b109c81 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -0,0 +1,189 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Threading; +using Microsoft.AspNet.Http; +using Microsoft.Extensions.Logging; + +namespace Microsoft.AspNet.Hosting.Internal +{ + internal static class HostingLoggerExtensions + { + public static IDisposable RequestScope(this ILogger logger, HttpContext httpContext) + { + return logger.BeginScopeImpl(new HostingLogScope(httpContext)); + } + + public static void RequestStarting(this ILogger logger, HttpContext httpContext) + { + if (logger.IsEnabled(LogLevel.Information)) + { + logger.Log( + logLevel: LogLevel.Information, + eventId: 1, + state: new HostingRequestStarting(httpContext), + exception: null, + formatter: HostingRequestStarting.Callback); + } + } + + public static void RequestFinished(this ILogger logger, HttpContext httpContext, int startTimeInTicks) + { + if (logger.IsEnabled(LogLevel.Information)) + { + var elapsed = new TimeSpan(Environment.TickCount - startTimeInTicks); + logger.Log( + logLevel: LogLevel.Information, + eventId: 2, + state: new HostingRequestFinished(httpContext, elapsed), + exception: null, + formatter: HostingRequestFinished.Callback); + } + } + + public static void RequestFailed(this ILogger logger, HttpContext httpContext, int startTimeInTicks) + { + if (logger.IsEnabled(LogLevel.Information)) + { + var elapsed = new TimeSpan(Environment.TickCount - startTimeInTicks); + logger.Log( + logLevel: LogLevel.Information, + eventId: 2, + state: new HostingRequestFailed(httpContext, elapsed), + exception: null, + formatter: HostingRequestFailed.Callback); + } + } + + + private class HostingLogScope : ILogValues + { + private readonly HttpContext _httpContext; + + private string _cachedToString; + private IEnumerable> _cachedGetValues; + + public HostingLogScope(HttpContext httpContext) + { + _httpContext = httpContext; + } + + public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( + ref _cachedToString, + $"RequestId:{_httpContext.TraceIdentifier} RequestPath:{_httpContext.Request.Path}", + null); + + public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( + ref _cachedGetValues, + new[] + { + new KeyValuePair("RequestId", _httpContext.TraceIdentifier), + new KeyValuePair("RequestPath", _httpContext.Request.Path.ToString()), + }, + null); + } + + private class HostingRequestStarting : ILogValues + { + internal static readonly Func Callback = (state, exception) => ((HostingRequestStarting)state).ToString(); + + private readonly HttpContext _httpContext; + + private string _cachedToString; + private IEnumerable> _cachedGetValues; + + public HostingRequestStarting(HttpContext httpContext) + { + _httpContext = httpContext; + } + + public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( + ref _cachedToString, + $"Request starting {_httpContext.Request.Protocol} {_httpContext.Request.Method} {_httpContext.Request.Scheme}://{_httpContext.Request.Host}{_httpContext.Request.PathBase}{_httpContext.Request.Path}{_httpContext.Request.QueryString} {_httpContext.Request.ContentType} {_httpContext.Request.ContentLength}", + null); + + public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( + ref _cachedGetValues, + new[] + { + new KeyValuePair("Protocol", _httpContext.Request.Protocol), + new KeyValuePair("Method", _httpContext.Request.Method), + new KeyValuePair("ContentType", _httpContext.Request.ContentType), + new KeyValuePair("ContentLength", _httpContext.Request.ContentLength), + new KeyValuePair("Scheme", _httpContext.Request.Scheme.ToString()), + new KeyValuePair("Host", _httpContext.Request.Host.ToString()), + new KeyValuePair("PathBase", _httpContext.Request.PathBase.ToString()), + new KeyValuePair("Path", _httpContext.Request.Path.ToString()), + new KeyValuePair("QueryString", _httpContext.Request.QueryString.ToString()), + }, + null); + } + + private class HostingRequestFinished + { + internal static readonly Func Callback = (state, exception) => ((HostingRequestFinished)state).ToString(); + + private readonly HttpContext _httpContext; + private readonly TimeSpan _elapsed; + + private IEnumerable> _cachedGetValues; + private string _cachedToString; + + public HostingRequestFinished(HttpContext httpContext, TimeSpan elapsed) + { + _httpContext = httpContext; + _elapsed = elapsed; + } + + public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( + ref _cachedToString, + $"Request finished in {_elapsed.TotalMilliseconds}ms {_httpContext.Response.StatusCode} {_httpContext.Response.ContentType}", + null); + + public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( + ref _cachedGetValues, + new[] + { + new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), + new KeyValuePair("StatusCode", _httpContext.Response.StatusCode), + new KeyValuePair("ContentType", _httpContext.Response.ContentType), + }, + null); + } + + private class HostingRequestFailed + { + internal static readonly Func Callback = (state, exception) => ((HostingRequestFailed)state).ToString(); + + private readonly HttpContext _httpContext; + private readonly TimeSpan _elapsed; + + private IEnumerable> _cachedGetValues; + private string _cachedToString; + + public HostingRequestFailed(HttpContext httpContext, TimeSpan elapsed) + { + _httpContext = httpContext; + _elapsed = elapsed; + } + + public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( + ref _cachedToString, + $"Request finished in {_elapsed.TotalMilliseconds}ms 500", + null); + + public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( + ref _cachedGetValues, + new[] + { + new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), + new KeyValuePair("StatusCode", 500), + new KeyValuePair("ContentType", null), + }, + null); + } + } +} + diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index c5801b914d..edd34b5469 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,8 +6,7 @@ "url": "git://github.com/aspnet/hosting" }, "compilationOptions": { - "warningsAsErrors": true, - "allowUnsafe": true + "warningsAsErrors": true }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 9467dba265..1d9ababa9d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -14,13 +14,13 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Internal; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.Primitives; using Moq; using Xunit; @@ -29,7 +29,16 @@ namespace Microsoft.AspNet.Hosting public class HostingEngineTests : IServerFactory { private readonly IList _startInstances = new List(); - private IFeatureCollection _featuresSupportedByThisHost = new FeatureCollection(); + private IFeatureCollection _featuresSupportedByThisHost = NewFeatureCollection(); + + static IFeatureCollection NewFeatureCollection() + { + var stub = new StubFeatures(); + var features = new FeatureCollection(); + features[typeof(IHttpRequestFeature)] = stub; + features[typeof(IHttpResponseFeature)] = stub; + return features; + } [Fact] public void HostingEngineThrowsWithNoServer() @@ -314,7 +323,9 @@ namespace Microsoft.AspNet.Hosting // Assert Assert.NotNull(httpContext); - Assert.IsType(httpContext.Features.Get()); + var featuresTraceIdentifier = httpContext.Features.Get().TraceIdentifier; + Assert.False(string.IsNullOrWhiteSpace(httpContext.TraceIdentifier)); + Assert.Same(httpContext.TraceIdentifier, featuresTraceIdentifier); } [Fact] @@ -393,7 +404,11 @@ namespace Microsoft.AspNet.Hosting var host = CreateBuilder() .UseServer(this) .UseStartup( - appBuilder => { appBuilder.Run(requestDelegate); }, + appBuilder => + { + appBuilder.ApplicationServices.GetRequiredService().AddProvider(new AllMessagesAreNeeded()); + appBuilder.Run(requestDelegate); + }, configureServices => configureServices.BuildServiceProvider()); return host.Build(); } @@ -498,5 +513,101 @@ namespace Microsoft.AspNet.Hosting { public ICollection Addresses { get; } = new List(); } + + private class AllMessagesAreNeeded : ILoggerProvider, ILogger + { + public bool IsEnabled(LogLevel logLevel) => true; + + public ILogger CreateLogger(string name) => this; + + public IDisposable BeginScopeImpl(object state) + { + var stringified = state.ToString(); + return this; + } + public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func formatter) + { + var stringified = formatter(state, exception); + } + + public void Dispose() + { + } + } + + private class StubFeatures : IHttpRequestFeature, IHttpResponseFeature, IHeaderDictionary + { + public StubFeatures() + { + Headers = this; + Body = new MemoryStream(); + } + + public StringValues this[string key] + { + get { return StringValues.Empty; } + set { } + } + + public Stream Body { get; set; } + + public int Count => 0; + + public bool HasStarted { get; set; } + + public IHeaderDictionary Headers { get; set; } + + public bool IsReadOnly => false; + + public ICollection Keys => null; + + public string Method { get; set; } + + public string Path { get; set; } + + public string PathBase { get; set; } + + public string Protocol { get; set; } + + public string QueryString { get; set; } + + public string ReasonPhrase { get; set; } + + public string Scheme { get; set; } + + public int StatusCode { get; set; } + + public ICollection Values => null; + + public void Add(KeyValuePair item) { } + + public void Add(string key, StringValues value) { } + + public void Clear() { } + + public bool Contains(KeyValuePair item) => false; + + public bool ContainsKey(string key) => false; + + public void CopyTo(KeyValuePair[] array, int arrayIndex) { } + + public IEnumerator> GetEnumerator() => null; + + public void OnCompleted(Func callback, object state) { } + + public void OnStarting(Func callback, object state) { } + + public bool Remove(KeyValuePair item) => false; + + public bool Remove(string key) => false; + + public bool TryGetValue(string key, out StringValues value) + { + value = StringValues.Empty; + return false; + } + + IEnumerator IEnumerable.GetEnumerator() => null; + } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs deleted file mode 100644 index fff0fb603a..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/Internal/FastHttpRequestIdentifierFeatureTests.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Hosting.Internal; -using Xunit; - -namespace Microsoft.AspNet.Hosting.Tests.Internal -{ - public class FastHttpRequestIdentifierFeatureTests - { - [Fact] - public void TraceIdentifier_ReturnsId() - { - var feature = new FastHttpRequestIdentifierFeature(); - - var id = feature.TraceIdentifier; - - Assert.NotNull(id); - } - - [Fact] - public void TraceIdentifier_ReturnsStableId() - { - var feature = new FastHttpRequestIdentifierFeature(); - - var id1 = feature.TraceIdentifier; - var id2 = feature.TraceIdentifier; - - Assert.Equal(id1, id2); - } - - [Fact] - public void TraceIdentifier_ReturnsUniqueIdForDifferentInstances() - { - var feature1 = new FastHttpRequestIdentifierFeature(); - var feature2 = new FastHttpRequestIdentifierFeature(); - - var id1 = feature1.TraceIdentifier; - var id2 = feature2.TraceIdentifier; - - Assert.NotEqual(id1, id2); - } - } -} From f931cb7c6d11786ffdc7c8eab35e2ed4a942b0db Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 23 Oct 2015 18:49:25 -0700 Subject: [PATCH 0842/1838] Moving httpcontextfactory to AspNet.Http.Abstractions --- .../IHttpContextFactory.cs | 13 +++++++++ .../HttpContextFactory.cs | 29 +++++++++++++++++++ .../HttpContextFactoryTests.cs | 25 ++++++++++++++++ 3 files changed, 67 insertions(+) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs create mode 100644 src/Microsoft.AspNet.Http/HttpContextFactory.cs create mode 100644 test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs new file mode 100644 index 0000000000..f0e28db8a7 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs @@ -0,0 +1,13 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http +{ + public interface IHttpContextFactory + { + HttpContext CreateHttpContext(IFeatureCollection featureCollection); + void Dispose(HttpContext httpContext); + } +} diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNet.Http/HttpContextFactory.cs new file mode 100644 index 0000000000..4557cd13fb --- /dev/null +++ b/src/Microsoft.AspNet.Http/HttpContextFactory.cs @@ -0,0 +1,29 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Http.Internal +{ + public class HttpContextFactory : IHttpContextFactory + { + private IHttpContextAccessor _httpContextAccessor; + + public HttpContextFactory(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public HttpContext CreateHttpContext(IFeatureCollection featureCollection) + { + var httpContext = new DefaultHttpContext(featureCollection); + _httpContextAccessor.HttpContext = httpContext; + return httpContext; + } + + public void Dispose(HttpContext httpContext) + { + _httpContextAccessor.HttpContext = null; + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs new file mode 100644 index 0000000000..8cb2cc6e9b --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs @@ -0,0 +1,25 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http.Features; +using Xunit; + +namespace Microsoft.AspNet.Http.Internal +{ + public class HttpContextFactoryTests + { + [Fact] + public void CreateHttpContextSetsHttpContextAccessor() + { + // Arrange + var accessor = new HttpContextAccessor(); + var contextFactory = new HttpContextFactory(accessor); + + // Act + var context = contextFactory.CreateHttpContext(new FeatureCollection()); + + // Assert + Assert.True(ReferenceEquals(context, accessor.HttpContext)); + } + } +} \ No newline at end of file From 018f3d1815853060c9b03cdef304106e36c7ef39 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 23 Oct 2015 21:58:22 -0700 Subject: [PATCH 0843/1838] Renaming HttpContextFactory Create method --- src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs | 2 +- src/Microsoft.AspNet.Http/HttpContextFactory.cs | 2 +- test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs index f0e28db8a7..cdeb2ce223 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs @@ -7,7 +7,7 @@ namespace Microsoft.AspNet.Http { public interface IHttpContextFactory { - HttpContext CreateHttpContext(IFeatureCollection featureCollection); + HttpContext Create(IFeatureCollection featureCollection); void Dispose(HttpContext httpContext); } } diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNet.Http/HttpContextFactory.cs index 4557cd13fb..9c98fd1594 100644 --- a/src/Microsoft.AspNet.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Http/HttpContextFactory.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal _httpContextAccessor = httpContextAccessor; } - public HttpContext CreateHttpContext(IFeatureCollection featureCollection) + public HttpContext Create(IFeatureCollection featureCollection) { var httpContext = new DefaultHttpContext(featureCollection); _httpContextAccessor.HttpContext = httpContext; diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs index 8cb2cc6e9b..1fcdcab423 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Http.Internal var contextFactory = new HttpContextFactory(accessor); // Act - var context = contextFactory.CreateHttpContext(new FeatureCollection()); + var context = contextFactory.Create(new FeatureCollection()); // Assert Assert.True(ReferenceEquals(context, accessor.HttpContext)); From 8e1a0768db01d56d9f1510def3a1e5666d68eba8 Mon Sep 17 00:00:00 2001 From: Chris R Date: Sun, 25 Oct 2015 09:12:33 -0700 Subject: [PATCH 0844/1838] Remove IHttpContextFactory, it was moved to HttpAbstractions. --- .../Builder/HttpContextFactory.cs | 26 -------- .../Builder/IHttpContextFactory.cs | 13 ---- .../HttpContextFactoryFacts.cs | 60 ------------------- 3 files changed, 99 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs delete mode 100644 test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs diff --git a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs deleted file mode 100644 index c86cf451b5..0000000000 --- a/src/Microsoft.AspNet.Hosting/Builder/HttpContextFactory.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; - -namespace Microsoft.AspNet.Hosting.Builder -{ - public class HttpContextFactory : IHttpContextFactory - { - private IHttpContextAccessor _httpContextAccessor; - - public HttpContextFactory(IHttpContextAccessor httpContextAccessor) - { - _httpContextAccessor = httpContextAccessor; - } - - public HttpContext CreateHttpContext(IFeatureCollection featureCollection) - { - var httpContext = new DefaultHttpContext(featureCollection); - _httpContextAccessor.HttpContext = httpContext; - return httpContext; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs b/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs deleted file mode 100644 index ed1d9f4cc3..0000000000 --- a/src/Microsoft.AspNet.Hosting/Builder/IHttpContextFactory.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Hosting.Builder -{ - public interface IHttpContextFactory - { - HttpContext CreateHttpContext(IFeatureCollection featureCollection); - } -} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs b/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs deleted file mode 100644 index 02f3a2cc2c..0000000000 --- a/test/Microsoft.AspNet.Hosting.Tests/HttpContextFactoryFacts.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.Owin; -using Xunit; - -namespace Microsoft.AspNet.Hosting.Tests -{ - public class HttpContextFactoryFacts - { - [Fact] - public void CreateHttpContextSetsHttpContextAccessor() - { - // Arrange - var accessor = new HttpContextAccessor(); - var contextFactory = new HttpContextFactory(accessor); - - // Act - var context = contextFactory.CreateHttpContext(new FeatureCollection()); - - // Assert - Assert.True(ReferenceEquals(context, accessor.HttpContext)); - } - - [Fact] - public void Mutable_FeatureCollection_Wrapped_For_OwinFeatureCollection() - { - var env = new Dictionary(); - var contextFactory = new HttpContextFactory(new HttpContextAccessor()); - var context = contextFactory.CreateHttpContext(new FeatureCollection(new OwinFeatureCollection(env))); - - // Setting a feature will throw if the above feature collection is not wrapped in a mutable feature collection. - context.Features.Set(new CustomFeature(100)); - Assert.Equal(100, context.Features.Get().Value); - } - - private interface ICustomFeature - { - int Value { get; } - } - - private class CustomFeature : ICustomFeature - { - private readonly int _value; - public CustomFeature(int value) - { - _value = value; - } - - public int Value - { - get { return _value; } - } - } - } -} \ No newline at end of file From 0107ba005b0a1a7f3b2aaee422aab167139437cf Mon Sep 17 00:00:00 2001 From: Chris R Date: Sun, 25 Oct 2015 09:12:55 -0700 Subject: [PATCH 0845/1838] One more line. --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index b68e2f7c9b..6c0ad5eedd 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -91,7 +91,7 @@ namespace Microsoft.AspNet.Hosting.Internal var server = ServerFactory.Start(_serverFeatures, async features => { - var httpContext = contextFactory.CreateHttpContext(features); + var httpContext = contextFactory.Create(features); httpContext.ApplicationServices = _applicationServices; if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) From 52796a09a209985b3967d1122dc05bd76f71aa8d Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 26 Oct 2015 08:59:47 -0700 Subject: [PATCH 0846/1838] #434 Make sure IApplicationLifetime gets added even if startup throws. --- .../Internal/HostingEngine.cs | 2 +- .../WebHostBuilderTests.cs | 25 +++++++++++++++---- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 6c0ad5eedd..6126d712ec 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -70,6 +70,7 @@ namespace Microsoft.AspNet.Hosting.Internal _startupLoader = startupLoader; _captureStartupErrors = captureStartupErrors; _applicationLifetime = new ApplicationLifetime(); + _applicationServiceCollection.AddInstance(_applicationLifetime); } public IServiceProvider ApplicationServices @@ -144,7 +145,6 @@ namespace Microsoft.AspNet.Hosting.Internal if (_applicationServices == null) { EnsureStartup(); - _applicationServiceCollection.AddInstance(_applicationLifetime); _applicationServices = Startup.ConfigureServicesDelegate(_applicationServiceCollection); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index d558dd40e3..b8aa7c6e6c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -11,6 +11,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; using Xunit; namespace Microsoft.AspNet.Hosting @@ -42,7 +43,7 @@ namespace Microsoft.AspNet.Hosting { var builder = CreateWebHostBuilder(); var serverFactory = new TestServerFactory(); - var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup("MissingStartupAssembly").Build(); + var engine = builder.UseServer(serverFactory).UseStartup("MissingStartupAssembly").Build(); using (engine.Start()) { await AssertResponseContains(serverFactory.Application, "MissingStartupAssembly"); @@ -54,7 +55,7 @@ namespace Microsoft.AspNet.Hosting { var builder = CreateWebHostBuilder(); var serverFactory = new TestServerFactory(); - var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + var engine = builder.UseServer(serverFactory).UseStartup().Build(); using (engine.Start()) { await AssertResponseContains(serverFactory.Application, "Exception from static constructor"); @@ -66,19 +67,33 @@ namespace Microsoft.AspNet.Hosting { var builder = CreateWebHostBuilder(); var serverFactory = new TestServerFactory(); - var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + var engine = builder.UseServer(serverFactory).UseStartup().Build(); using (engine.Start()) { await AssertResponseContains(serverFactory.Application, "Exception from constructor"); } } + [Fact] + public async Task IApplicationLifetimeRegisteredEvenWhenStartupCtorThrows_Fallback() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = builder.UseServer(serverFactory).UseStartup().Build(); + using (engine.Start()) + { + var service = engine.ApplicationServices.GetService(); + Assert.NotNull(service); + await AssertResponseContains(serverFactory.Application, "Exception from constructor"); + } + } + [Fact] public async Task StartupConfigureServicesThrows_Fallback() { var builder = CreateWebHostBuilder(); var serverFactory = new TestServerFactory(); - var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + var engine = builder.UseServer(serverFactory).UseStartup().Build(); using (engine.Start()) { await AssertResponseContains(serverFactory.Application, "Exception from ConfigureServices"); @@ -90,7 +105,7 @@ namespace Microsoft.AspNet.Hosting { var builder = CreateWebHostBuilder(); var serverFactory = new TestServerFactory(); - var engine = (HostingEngine)builder.UseServer(serverFactory).UseStartup().Build(); + var engine = builder.UseServer(serverFactory).UseStartup().Build(); using (engine.Start()) { await AssertResponseContains(serverFactory.Application, "Exception from Configure"); From 2f4c34476bc01b5a69863272f9c947e41b4e586c Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 26 Oct 2015 13:43:00 -0700 Subject: [PATCH 0847/1838] #411 Use "webroot" instead of "hosting:webroot" --- src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index 4ff521aefb..74cf50ec74 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Hosting private const string OldEnvironmentKey = "ASPNET_ENV"; private const string EnvironmentKey = "Hosting:Environment"; - private const string WebRootKey = "Hosting:WebRoot"; + private const string WebRootKey = "webroot"; public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, IConfiguration config) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 1d9ababa9d..928cd5bb35 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -260,7 +260,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - { "Hosting:WebRoot", "testroot" } + { "webroot", "testroot" } }; var builder = new ConfigurationBuilder() From 9be0758c4d1da87aa5afe931e030d59636d33cb6 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Mon, 26 Oct 2015 13:19:32 -0700 Subject: [PATCH 0848/1838] Event ids and more logging --- .../Internal/HostingEngine.cs | 7 ++- .../Internal/HostingLoggerExtensions.cs | 44 +++++++++++++++++-- .../Internal/LoggerEventIds.cs | 16 +++++++ 3 files changed, 63 insertions(+), 4 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 6126d712ec..55e2cd589c 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -89,6 +89,9 @@ namespace Microsoft.AspNet.Hosting.Internal var logger = _applicationServices.GetRequiredService>(); var contextFactory = _applicationServices.GetRequiredService(); var diagnosticSource = _applicationServices.GetRequiredService(); + + logger.Starting(); + var server = ServerFactory.Start(_serverFeatures, async features => { @@ -130,9 +133,11 @@ namespace Microsoft.AspNet.Hosting.Internal }); _applicationLifetime.NotifyStarted(); + logger.Started(); return new Application(ApplicationServices, _serverFeatures, new Disposable(() => { + logger.Shutdown(); _applicationLifetime.StopApplication(); server.Dispose(); _applicationLifetime.NotifyStopped(); @@ -218,7 +223,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Write errors to standard out so they can be retrieved when not in development mode. Console.Out.WriteLine("Application startup exception: " + ex.ToString()); var logger = _applicationServices.GetRequiredService>(); - logger.LogError("Application startup exception", ex); + logger.ApplicationError(ex); // Generate an HTML error page. var runtimeEnv = _applicationServices.GetRequiredService(); diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs index 3f6b109c81..0d79f7ae63 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Hosting.Internal { logger.Log( logLevel: LogLevel.Information, - eventId: 1, + eventId: LoggerEventIds.RequestStarting, state: new HostingRequestStarting(httpContext), exception: null, formatter: HostingRequestStarting.Callback); @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Hosting.Internal var elapsed = new TimeSpan(Environment.TickCount - startTimeInTicks); logger.Log( logLevel: LogLevel.Information, - eventId: 2, + eventId: LoggerEventIds.RequestFinished, state: new HostingRequestFinished(httpContext, elapsed), exception: null, formatter: HostingRequestFinished.Callback); @@ -50,13 +50,51 @@ namespace Microsoft.AspNet.Hosting.Internal var elapsed = new TimeSpan(Environment.TickCount - startTimeInTicks); logger.Log( logLevel: LogLevel.Information, - eventId: 2, + eventId: LoggerEventIds.RequestFailed, state: new HostingRequestFailed(httpContext, elapsed), exception: null, formatter: HostingRequestFailed.Callback); } } + public static void ApplicationError(this ILogger logger, Exception exception) + { + logger.LogError( + eventId: LoggerEventIds.ApplicationStartupException, + message: "Application startup exception", + error: exception); + } + + public static void Starting(this ILogger logger) + { + if (logger.IsEnabled(LogLevel.Verbose)) + { + logger.LogVerbose( + eventId: LoggerEventIds.Starting, + data: "Hosting starting"); + } + } + + public static void Started(this ILogger logger) + { + if (logger.IsEnabled(LogLevel.Verbose)) + { + logger.LogVerbose( + eventId: LoggerEventIds.Started, + data: "Hosting started"); + } + } + + public static void Shutdown(this ILogger logger) + { + if (logger.IsEnabled(LogLevel.Verbose)) + { + logger.LogVerbose( + eventId: LoggerEventIds.Shutdown, + data: "Hosting shutdown"); + } + } + private class HostingLogScope : ILogValues { diff --git a/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs b/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs new file mode 100644 index 0000000000..9bc4a4affe --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs @@ -0,0 +1,16 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting.Internal +{ + internal static class LoggerEventIds + { + public const int RequestStarting = 1; + public const int RequestFinished = 2; + public const int RequestFailed = 3; + public const int Starting = 4; + public const int Started = 5; + public const int Shutdown = 6; + public const int ApplicationStartupException = 7; + } +} From 7ad859b5c06006d2581c14926a66091c3118cbb9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Oct 2015 12:43:05 -0700 Subject: [PATCH 0849/1838] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From de35fba9c95da3df6020a33ca28af014704dc39c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 28 Oct 2015 12:43:06 -0700 Subject: [PATCH 0850/1838] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 2bb2f955327ea52c4b0536732d85b4a42f16e1a5 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Wed, 28 Oct 2015 12:10:07 -0700 Subject: [PATCH 0851/1838] Log messages from HostingEngine are sometimes null #454 --- .../Internal/HostingLoggerExtensions.cs | 159 +++++++++++------- 1 file changed, 99 insertions(+), 60 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs index 0d79f7ae63..a92eac1444 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Threading; using Microsoft.AspNet.Http; using Microsoft.Extensions.Logging; @@ -108,55 +107,75 @@ namespace Microsoft.AspNet.Hosting.Internal _httpContext = httpContext; } - public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( - ref _cachedToString, - $"RequestId:{_httpContext.TraceIdentifier} RequestPath:{_httpContext.Request.Path}", - null); - - public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( - ref _cachedGetValues, - new[] + public override string ToString() + { + if (_cachedToString == null) { - new KeyValuePair("RequestId", _httpContext.TraceIdentifier), - new KeyValuePair("RequestPath", _httpContext.Request.Path.ToString()), - }, - null); + _cachedToString = $"RequestId:{_httpContext.TraceIdentifier} RequestPath:{_httpContext.Request.Path}"; + } + + return _cachedToString; + } + + public IEnumerable> GetValues() + { + if (_cachedGetValues == null) + { + _cachedGetValues = new[] + { + new KeyValuePair("RequestId", _httpContext.TraceIdentifier), + new KeyValuePair("RequestPath", _httpContext.Request.Path.ToString()), + }; + } + + return _cachedGetValues; + } } private class HostingRequestStarting : ILogValues { internal static readonly Func Callback = (state, exception) => ((HostingRequestStarting)state).ToString(); - private readonly HttpContext _httpContext; + private readonly HttpRequest _request; private string _cachedToString; private IEnumerable> _cachedGetValues; public HostingRequestStarting(HttpContext httpContext) { - _httpContext = httpContext; + _request = httpContext.Request; } - public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( - ref _cachedToString, - $"Request starting {_httpContext.Request.Protocol} {_httpContext.Request.Method} {_httpContext.Request.Scheme}://{_httpContext.Request.Host}{_httpContext.Request.PathBase}{_httpContext.Request.Path}{_httpContext.Request.QueryString} {_httpContext.Request.ContentType} {_httpContext.Request.ContentLength}", - null); - - public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( - ref _cachedGetValues, - new[] + public override string ToString() + { + if (_cachedToString == null) { - new KeyValuePair("Protocol", _httpContext.Request.Protocol), - new KeyValuePair("Method", _httpContext.Request.Method), - new KeyValuePair("ContentType", _httpContext.Request.ContentType), - new KeyValuePair("ContentLength", _httpContext.Request.ContentLength), - new KeyValuePair("Scheme", _httpContext.Request.Scheme.ToString()), - new KeyValuePair("Host", _httpContext.Request.Host.ToString()), - new KeyValuePair("PathBase", _httpContext.Request.PathBase.ToString()), - new KeyValuePair("Path", _httpContext.Request.Path.ToString()), - new KeyValuePair("QueryString", _httpContext.Request.QueryString.ToString()), - }, - null); + _cachedToString = $"Request starting {_request.Protocol} {_request.Method} {_request.Scheme}://{_request.Host}{_request.PathBase}{_request.Path}{_request.QueryString} {_request.ContentType} {_request.ContentLength}"; + } + + return _cachedToString; + } + + public IEnumerable> GetValues() + { + if (_cachedGetValues == null) + { + _cachedGetValues = new[] + { + new KeyValuePair("Protocol", _request.Protocol), + new KeyValuePair("Method", _request.Method), + new KeyValuePair("ContentType", _request.ContentType), + new KeyValuePair("ContentLength", _request.ContentLength), + new KeyValuePair("Scheme", _request.Scheme.ToString()), + new KeyValuePair("Host", _request.Host.ToString()), + new KeyValuePair("PathBase", _request.PathBase.ToString()), + new KeyValuePair("Path", _request.Path.ToString()), + new KeyValuePair("QueryString", _request.QueryString.ToString()), + }; + } + + return _cachedGetValues; + } } private class HostingRequestFinished @@ -175,20 +194,30 @@ namespace Microsoft.AspNet.Hosting.Internal _elapsed = elapsed; } - public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( - ref _cachedToString, - $"Request finished in {_elapsed.TotalMilliseconds}ms {_httpContext.Response.StatusCode} {_httpContext.Response.ContentType}", - null); - - public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( - ref _cachedGetValues, - new[] + public override string ToString() + { + if (_cachedToString == null) { - new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), - new KeyValuePair("StatusCode", _httpContext.Response.StatusCode), - new KeyValuePair("ContentType", _httpContext.Response.ContentType), - }, - null); + _cachedToString = $"Request finished in {_elapsed.TotalMilliseconds}ms {_httpContext.Response.StatusCode} {_httpContext.Response.ContentType}"; + } + + return _cachedToString; + } + + public IEnumerable> GetValues() + { + if (_cachedGetValues == null) + { + _cachedGetValues = new[] + { + new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), + new KeyValuePair("StatusCode", _httpContext.Response.StatusCode), + new KeyValuePair("ContentType", _httpContext.Response.ContentType), + }; + } + + return _cachedGetValues; + } } private class HostingRequestFailed @@ -207,20 +236,30 @@ namespace Microsoft.AspNet.Hosting.Internal _elapsed = elapsed; } - public override string ToString() => _cachedToString ?? Interlocked.CompareExchange( - ref _cachedToString, - $"Request finished in {_elapsed.TotalMilliseconds}ms 500", - null); - - public IEnumerable> GetValues() => _cachedGetValues ?? Interlocked.CompareExchange( - ref _cachedGetValues, - new[] + public override string ToString() + { + if (_cachedToString == null) { - new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), - new KeyValuePair("StatusCode", 500), - new KeyValuePair("ContentType", null), - }, - null); + _cachedToString = $"Request finished in {_elapsed.TotalMilliseconds}ms 500"; + } + + return _cachedToString; + } + + public IEnumerable> GetValues() + { + if (_cachedGetValues == null) + { + _cachedGetValues = new[] + { + new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), + new KeyValuePair("StatusCode", 500), + new KeyValuePair("ContentType", null), + }; + } + + return _cachedGetValues; + } } } } From 995f0ca92fe4c85f01ef00df787f669a9882109c Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 28 Oct 2015 14:07:22 -0700 Subject: [PATCH 0852/1838] #452 Rename Microsoft.AspNet.Hosting.json to hosting.json. --- src/Microsoft.AspNet.Hosting/WebApplication.cs | 2 +- .../Deployers/IISDeployer.cs | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index fea0d58353..7d77a911db 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Hosting { public class WebApplication { - private const string HostingJsonFile = "Microsoft.AspNet.Hosting.json"; + private const string HostingJsonFile = "hosting.json"; private const string ConfigFileKey = "config"; public static void Run(string[] args) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index db2fd224d4..5403dbc1df 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -66,9 +66,9 @@ namespace Microsoft.AspNet.Server.Testing private void SetAspEnvironmentWithJson() { - // Drop a Microsoft.AspNet.Hosting.json with Hosting:Environment information. - Logger.LogInformation("Creating Microsoft.AspNet.Hosting.json file with Hosting:Environment."); - var jsonFile = Path.Combine(DeploymentParameters.ApplicationPath, "Microsoft.AspNet.Hosting.json"); + // Drop a hosting.json with Hosting:Environment information. + Logger.LogInformation("Creating hosting.json file with Hosting:Environment."); + var jsonFile = Path.Combine(DeploymentParameters.ApplicationPath, "hosting.json"); File.WriteAllText(jsonFile, string.Format("{ \"Hosting:Environment\":\"{0}\" }", DeploymentParameters.EnvironmentName)); } From 0b14bc135badce4d39f0c90432e3120b63212ae8 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 28 Oct 2015 12:12:37 -0700 Subject: [PATCH 0853/1838] Show type load exception on the startup error page --- .../Startup/StartupExceptionPage.cs | 15 +++++++++++ .../Fakes/StartupThrowTypeLoadException.cs | 25 +++++++++++++++++++ .../WebHostBuilderTests.cs | 12 +++++++++ 3 files changed, 52 insertions(+) create mode 100644 test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index adc9656f89..8e15772526 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -508,6 +508,21 @@ namespace Microsoft.AspNet.Hosting.Startup private static IEnumerable FlattenAndReverseExceptionTree(Exception ex) { + // ReflectionTypeLoadException is special because the details are in + // a the LoaderExceptions property + var typeLoadException = ex as ReflectionTypeLoadException; + if (typeLoadException != null) + { + var typeLoadExceptions = new List(); + foreach (Exception loadException in typeLoadException.LoaderExceptions) + { + typeLoadExceptions.AddRange(FlattenAndReverseExceptionTree(loadException)); + } + + typeLoadExceptions.Add(ex); + return typeLoadExceptions; + } + var list = new List(); while (ex != null) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs new file mode 100644 index 0000000000..fdfbc6a24e --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs @@ -0,0 +1,25 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Reflection; + +namespace Microsoft.AspNet.Hosting.Fakes +{ + public class StartupThrowTypeLoadException + { + public StartupThrowTypeLoadException() + { + // For this exception, the error page should contain details of the LoaderExceptions + throw new ReflectionTypeLoadException( + classes: new Type[] { GetType() }, + exceptions: new Exception[] { new FileNotFoundException("Message from the LoaderException") }, + message: "This should not be in the output"); + } + + public void Configure() + { + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index b8aa7c6e6c..988194f0a3 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -74,6 +74,18 @@ namespace Microsoft.AspNet.Hosting } } + [Fact] + public async Task StartupCtorThrows_TypeLoadException() + { + var builder = CreateWebHostBuilder(); + var serverFactory = new TestServerFactory(); + var engine = builder.UseServer(serverFactory).UseStartup().Build(); + using (engine.Start()) + { + await AssertResponseContains(serverFactory.Application, "Message from the LoaderException"); + } + } + [Fact] public async Task IApplicationLifetimeRegisteredEvenWhenStartupCtorThrows_Fallback() { From 4ad38625c776dbc636394cb912b890423efd4a2c Mon Sep 17 00:00:00 2001 From: Stephen Halter Date: Wed, 28 Oct 2015 15:45:33 -0700 Subject: [PATCH 0854/1838] Get the current runtime path via PlatformServices.Default - This fixes an issue whith ApplicationDeployer on Mono. Instead of giving the dnx path, Process.GetCurrentProcess().MainModule.FileName would give the path to the Mono executable. --- .../Deployers/ApplicationDeployer.cs | 19 ++----------------- 1 file changed, 2 insertions(+), 17 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index a8dfd0e17a..477348f7af 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -10,6 +10,7 @@ using System.Text.RegularExpressions; using System.Threading; using Microsoft.AspNet.Testing; using Microsoft.Extensions.Logging; +using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Server.Testing { @@ -99,23 +100,7 @@ namespace Microsoft.AspNet.Server.Testing protected string PopulateChosenRuntimeInformation() { - string currentRuntimeBinPath = string.Empty; - if (TestPlatformHelper.IsMac && DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) - { - var path = Environment.GetEnvironmentVariable("PATH"); - currentRuntimeBinPath = path.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries). - Where(c => c.Contains("dnx-coreclr-darwin") || c.Contains("dnx-mono")).FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(currentRuntimeBinPath)) - { - throw new Exception("Runtime not detected on the machine."); - } - } - else - { - // ex: runtimes/dnx-coreclr-win-x64.1.0.0-rc1-15844/bin - currentRuntimeBinPath = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName); - } + string currentRuntimeBinPath = PlatformServices.Default.Runtime.RuntimePath; Logger.LogInformation($"Current runtime path is : {currentRuntimeBinPath}"); var targetRuntimeName = new StringBuilder() From f177f0c760cd84cbd23553bc84196bd3b8eb0170 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 29 Oct 2015 10:03:07 -0700 Subject: [PATCH 0855/1838] Add ForbidAsync overload for automatic authentication scheme. --- .../Authentication/AuthenticationManager.cs | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs index 497ad3e25d..687e1c7474 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -78,6 +78,13 @@ namespace Microsoft.AspNet.Http.Authentication return SignInAsync(authenticationScheme, principal, properties: null); } + /// + /// Creates a challenge for the authentication manager with . + /// + /// A that represents the asynchronous challenge operation. + public virtual Task ForbidAsync() + => ForbidAsync(AutomaticScheme, properties: null); + public virtual Task ForbidAsync(string authenticationScheme) { if (authenticationScheme == null) @@ -99,6 +106,14 @@ namespace Microsoft.AspNet.Http.Authentication return ChallengeAsync(authenticationScheme, properties, ChallengeBehavior.Forbidden); } + /// + /// Creates a challenge for the authentication manager with . + /// + /// Additional arbitrary values which may be used by particular authentication types. + /// A that represents the asynchronous challenge operation. + public virtual Task ForbidAsync(AuthenticationProperties properties) + => ForbidAsync(AutomaticScheme, properties); + public abstract Task ChallengeAsync(string authenticationScheme, AuthenticationProperties properties, ChallengeBehavior behavior); public abstract Task SignInAsync(string authenticationScheme, ClaimsPrincipal principal, AuthenticationProperties properties); From be4fb46281ffaebb60788ae7f47574410d0af767 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:13:02 -0700 Subject: [PATCH 0856/1838] #391 Migrate to System.Text.Encoding.Web --- HttpAbstractions.sln | 16 - .../HtmlContentBuilderExtensions.cs | 16 +- .../IHtmlContent.cs | 6 +- .../project.json | 9 +- .../PathString.cs | 4 +- .../QueryString.cs | 34 +- .../project.json | 12 +- .../QueryBuilder.cs | 6 +- .../project.json | 3 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 14 +- src/Microsoft.AspNet.Http/project.json | 3 +- .../QueryHelpers.cs | 6 +- .../project.json | 8 +- .../BufferedHtmlContent.cs | 7 +- .../AllowedCharsBitmap.cs | 77 - .../CodePointFilter.cs | 312 - .../EncoderCommon.cs | 37 - .../EncoderExtensions.cs | 70 - .../HexUtil.cs | 48 - .../HtmlEncoder.cs | 208 - .../ICodePointFilter.cs | 19 - .../IHtmlEncoder.cs | 45 - .../IJavaScriptStringEncoder.cs | 40 - .../IUrlEncoder.cs | 44 - .../JavaScriptStringEncoder.cs | 231 - ...icrosoft.Extensions.WebEncoders.Core.xproj | 17 - .../Properties/AssemblyInfo.cs | 10 - .../UnicodeEncoderBase.cs | 301 - .../UnicodeHelpers.cs | 231 - .../UnicodeRange.cs | 64 - .../UnicodeRanges.cs | 51 - .../UnicodeRanges.generated.cs | 1415 - .../UrlEncoder.cs | 245 - .../resources/unicode-defined-chars.bin | Bin 8192 -> 0 bytes .../project.json | 26 - .../EncoderServiceCollectionExtensions.cs | 21 +- .../EncoderServiceProviderExtensions.cs | 19 +- .../Testing/HtmlTestEncoder.cs | 54 + .../Testing/JavaScriptTestEncoder.cs | 54 + .../Testing/UrlTestEncoder.cs | 54 + .../WebEncoderOptions.cs | 6 +- .../project.json | 12 +- .../HtmlContentBuilderExtensionsTest.cs | 15 +- .../project.json | 2 +- .../QueryStringTests.cs | 2 - .../BufferedHtmlContentTest.cs | 13 +- .../project.json | 7 +- .../AllowedCharsBitmapTests.cs | 125 - .../CodePointFilterTests.cs | 365 - .../CommonTestEncoder.cs | 103 - .../EncoderCommonTests.cs | 21 - .../EncoderExtensionsTests.cs | 72 - ...EncoderServiceCollectionExtensionsTests.cs | 50 +- .../EncoderServiceProviderExtensionsTests.cs | 17 +- .../Entities.cs | 38 - .../Extensions.cs | 27 - .../HtmlEncoderTests.cs | 269 - .../JavaScriptStringEncoderTests.cs | 331 - .../ParsedEntity.cs | 17 - .../UnicodeEncoderBaseTests.cs | 406 - .../UnicodeHelpersTests.cs | 222 - .../UnicodeRangeTests.cs | 69 - .../UnicodeRangesTests.cs | 211 - .../UrlEncoderTests.cs | 301 - .../project.json | 3 +- unicode/Blocks.txt | 298 - .../DefinedCharListGenerator/App.config | 6 - .../DefinedCharListGenerator.csproj | 61 - .../DefinedCharListGenerator/Program.cs | 180 - .../Properties/AssemblyInfo.cs | 36 - unicode/Generators/Generators.sln | 28 - .../UnicodeTablesGenerator/App.config | 6 - .../UnicodeTablesGenerator/Program.cs | 103 - .../Properties/AssemblyInfo.cs | 36 - .../UnicodeTablesGenerator.csproj | 61 - unicode/UnicodeData.txt | 29215 ---------------- unicode/how-to-update.txt | 94 - unicode/unicode-copyright.txt | 47 - 78 files changed, 334 insertions(+), 36378 deletions(-) delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin delete mode 100644 src/Microsoft.Extensions.WebEncoders.Core/project.json rename src/{Microsoft.Extensions.WebEncoders.Core => Microsoft.Extensions.WebEncoders}/EncoderServiceProviderExtensions.cs (59%) create mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs create mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs create mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs rename src/{Microsoft.Extensions.WebEncoders.Core => Microsoft.Extensions.WebEncoders}/WebEncoderOptions.cs (82%) delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs delete mode 100644 unicode/Blocks.txt delete mode 100644 unicode/Generators/DefinedCharListGenerator/App.config delete mode 100644 unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj delete mode 100644 unicode/Generators/DefinedCharListGenerator/Program.cs delete mode 100644 unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs delete mode 100644 unicode/Generators/Generators.sln delete mode 100644 unicode/Generators/UnicodeTablesGenerator/App.config delete mode 100644 unicode/Generators/UnicodeTablesGenerator/Program.cs delete mode 100644 unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs delete mode 100644 unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj delete mode 100644 unicode/UnicodeData.txt delete mode 100644 unicode/how-to-update.txt delete mode 100644 unicode/unicode-copyright.txt diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 28574eee21..289cdf8dcb 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,4 +1,3 @@ - Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.23107.0 @@ -39,8 +38,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEnc EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Core", "src\Microsoft.Extensions.WebEncoders.Core\Microsoft.Extensions.WebEncoders.Core.xproj", "{BE9112CB-D87D-4080-9CC3-24492D49CBE6}" -EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" @@ -231,18 +228,6 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.ActiveCfg = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Debug|x86.Build.0 = Debug|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Any CPU.Build.0 = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.ActiveCfg = Release|Any CPU - {BE9112CB-D87D-4080-9CC3-24492D49CBE6}.Release|x86.Build.0 = Release|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -324,7 +309,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {BE9112CB-D87D-4080-9CC3-24492D49CBE6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index ef7f932226..5b1164b438 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -5,7 +5,7 @@ using System; using System.Diagnostics; using System.Globalization; using System.IO; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Html.Abstractions { @@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Html.Abstractions _value = value; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(_value); } @@ -234,7 +234,7 @@ namespace Microsoft.AspNet.Html.Abstractions _args = args; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { if (writer == null) { @@ -269,10 +269,10 @@ namespace Microsoft.AspNet.Html.Abstractions // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example private class EncodingFormatProvider : IFormatProvider, ICustomFormatter { - private readonly IHtmlEncoder _encoder; + private readonly HtmlEncoder _encoder; private readonly IFormatProvider _formatProvider; - public EncodingFormatProvider(IFormatProvider formatProvider, IHtmlEncoder encoder) + public EncodingFormatProvider(IFormatProvider formatProvider, HtmlEncoder encoder) { Debug.Assert(formatProvider != null); Debug.Assert(encoder != null); @@ -306,7 +306,7 @@ namespace Microsoft.AspNet.Html.Abstractions var result = customFormatter.Format(format, arg, _formatProvider); if (result != null) { - return _encoder.HtmlEncode(result); + return _encoder.Encode(result); } } @@ -320,7 +320,7 @@ namespace Microsoft.AspNet.Html.Abstractions var result = formattable.ToString(format, _formatProvider); if (result != null) { - return _encoder.HtmlEncode(result); + return _encoder.Encode(result); } } @@ -330,7 +330,7 @@ namespace Microsoft.AspNet.Html.Abstractions var result = arg.ToString(); if (result != null) { - return _encoder.HtmlEncode(result); + return _encoder.Encode(result); } } diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs index 05f09cb7b4..d9b7099710 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Html.Abstractions { @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// to the specified . /// /// The to which the content is written. - /// The which encodes the content to be written. - void WriteTo(TextWriter writer, IHtmlEncoder encoder); + /// The which encodes the content to be written. + void WriteTo(TextWriter writer, HtmlEncoder encoder); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index 9fe9c36612..86a35720b2 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -9,10 +9,15 @@ "warningsAsErrors": true }, "dependencies": { - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.IO": "", + "System.Runtime": "" + } + }, "dotnet5.4": { "dependencies": { "System.Resources.ResourceManager": "4.0.1-beta-*" diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index f9538e7444..ebcc9b107e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,7 +3,7 @@ using System; using System.Linq; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Http { @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Http public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. - return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.UrlEncode)) : string.Empty; + return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.Encode)) : string.Empty; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 25ba1f2699..af2feeedb5 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Http { @@ -119,7 +119,16 @@ namespace Microsoft.AspNet.Http /// The resulting QueryString public static QueryString Create(string name, string value) { - return new QueryString("?" + UrlEncoder.Default.UrlEncode(name) + '=' + UrlEncoder.Default.UrlEncode(value)); + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + return new QueryString("?" + UrlEncoder.Default.Encode(name) + '=' + UrlEncoder.Default.Encode(value)); } /// @@ -135,9 +144,9 @@ namespace Microsoft.AspNet.Http { builder.Append(first ? "?" : "&"); first = false; - builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append(UrlEncoder.Default.Encode(pair.Key)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); + builder.Append(UrlEncoder.Default.Encode(pair.Value)); } return new QueryString(builder.ToString()); @@ -158,9 +167,9 @@ namespace Microsoft.AspNet.Http { builder.Append(first ? "?" : "&"); first = false; - builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append(UrlEncoder.Default.Encode(pair.Key)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(value)); + builder.Append(UrlEncoder.Default.Encode(value)); } } @@ -184,6 +193,15 @@ namespace Microsoft.AspNet.Http public QueryString Add(string name, string value) { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + if (!HasValue || Value.Equals("?", StringComparison.Ordinal)) { return Create(name, value); @@ -191,9 +209,9 @@ namespace Microsoft.AspNet.Http var builder = new StringBuilder(Value); builder.Append("&"); - builder.Append(UrlEncoder.Default.UrlEncode(name)); + builder.Append(UrlEncoder.Default.Encode(name)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(value)); + builder.Append(UrlEncoder.Default.Encode(value)); return new QueryString(builder.ToString()); } diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 8c0d539da3..8810641078 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -14,13 +14,19 @@ "type": "build", "version": "1.0.0-*" }, - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.IO": "", + "System.Runtime": "" + } + }, "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-beta-*", + "System.ComponentModel": "4.0.1-beta-*", "System.Diagnostics.Tools": "4.0.1-beta-*", "System.Globalization": "4.0.11-beta-*", "System.Globalization.Extensions": "4.0.1-beta-*", @@ -38,4 +44,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs index 060c04efc7..ec4ae68fec 100644 --- a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; using System.Text; -using Microsoft.Extensions.WebEncoders; +using System.Text.Encodings.Web; namespace Microsoft.AspNet.Http.Extensions { @@ -45,9 +45,9 @@ namespace Microsoft.AspNet.Http.Extensions var pair = _params[i]; builder.Append(first ? "?" : "&"); first = false; - builder.Append(UrlEncoder.Default.UrlEncode(pair.Key)); + builder.Append(UrlEncoder.Default.Encode(pair.Key)); builder.Append("="); - builder.Append(UrlEncoder.Default.UrlEncode(pair.Value)); + builder.Append(UrlEncoder.Default.Encode(pair.Value)); } return builder.ToString(); diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 5cc71ea727..c0adfdc59e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -10,7 +10,6 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { @@ -23,4 +22,4 @@ } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index e67251f61a..5075efb004 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -3,8 +3,8 @@ using System; using System.Linq; +using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.WebEncoders; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal @@ -38,8 +38,8 @@ namespace Microsoft.AspNet.Http.Internal public void Append(string key, string value) { var setCookieHeaderValue = new SetCookieHeaderValue( - UrlEncoder.Default.UrlEncode(key), - UrlEncoder.Default.UrlEncode(value)) + UrlEncoder.Default.Encode(key), + UrlEncoder.Default.Encode(value)) { Path = "/" }; @@ -61,8 +61,8 @@ namespace Microsoft.AspNet.Http.Internal } var setCookieHeaderValue = new SetCookieHeaderValue( - UrlEncoder.Default.UrlEncode(key), - UrlEncoder.Default.UrlEncode(value)) + UrlEncoder.Default.Encode(key), + UrlEncoder.Default.Encode(value)) { Domain = options.Domain, Path = options.Path, @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT"; @@ -107,7 +107,7 @@ namespace Microsoft.AspNet.Http.Internal throw new ArgumentNullException(nameof(options)); } - var encodedKeyPlusEquals = UrlEncoder.Default.UrlEncode(key) + "="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index cc8ecdc60c..e60dfd06d6 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -19,7 +19,8 @@ "dotnet5.4": { "dependencies": { "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.Text.Encoding": "4.0.11-beta-*" + "System.Text.Encoding": "4.0.11-beta-*", + "System.Threading": "4.0.11-beta-*" } } } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 465ce48a83..57ee90bc75 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -4,8 +4,8 @@ using System; using System.Collections.Generic; using System.Text; +using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.WebUtilities { @@ -92,9 +92,9 @@ namespace Microsoft.AspNet.WebUtilities foreach (var parameter in queryString) { sb.Append(hasQuery ? '&' : '?'); - sb.Append(UrlEncoder.Default.UrlEncode(parameter.Key)); + sb.Append(UrlEncoder.Default.Encode(parameter.Key)); sb.Append('='); - sb.Append(UrlEncoder.Default.UrlEncode(parameter.Value)); + sb.Append(UrlEncoder.Default.Encode(parameter.Value)); hasQuery = true; } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 93b5d00c98..e7878e15a7 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -10,10 +10,14 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.Runtime": "" + } + }, "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-beta-*", diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 9d098518b8..302692338b 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Html.Abstractions; using Microsoft.Extensions.WebEncoders; @@ -64,7 +65,7 @@ namespace Microsoft.Extensions.Internal } /// - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { if (writer == null) { @@ -86,7 +87,7 @@ namespace Microsoft.Extensions.Internal var entryAsString = entry as string; if (entryAsString != null) { - encoder.HtmlEncode(entryAsString, writer); + encoder.Encode(writer, entryAsString); } else { @@ -116,7 +117,7 @@ namespace Microsoft.Extensions.Internal _value = value; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(_value); } diff --git a/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs b/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs deleted file mode 100644 index aae7b3c8b8..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/AllowedCharsBitmap.cs +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; - -namespace Microsoft.Extensions.WebEncoders -{ - internal struct AllowedCharsBitmap - { - private const int ALLOWED_CHARS_BITMAP_LENGTH = 0x10000 / (8 * sizeof(uint)); - private readonly uint[] _allowedCharsBitmap; - - private AllowedCharsBitmap(uint[] allowedCharsBitmap) - { - Debug.Assert(allowedCharsBitmap != null); - _allowedCharsBitmap = allowedCharsBitmap; - } - - // Marks a character as allowed (can be returned unencoded) - public void AllowCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] |= 0x1U << offset; - } - - // Marks all characters as forbidden (must be returned encoded) - public void Clear() - { - Array.Clear(_allowedCharsBitmap, 0, _allowedCharsBitmap.Length); - } - - // Creates a deep copy of this bitmap - public AllowedCharsBitmap Clone() - { - return new AllowedCharsBitmap((uint[])_allowedCharsBitmap.Clone()); - } - - // should be called in place of the ctor - public static AllowedCharsBitmap CreateNew() - { - return new AllowedCharsBitmap(new uint[ALLOWED_CHARS_BITMAP_LENGTH]); - } - - // Marks a character as forbidden (must be returned encoded) - public void ForbidCharacter(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - _allowedCharsBitmap[index] &= ~(0x1U << offset); - } - - public void ForbidUndefinedCharacters() - { - // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) - uint[] definedCharactersBitmap = UnicodeHelpers.GetDefinedCharacterBitmap(); - Debug.Assert(definedCharactersBitmap.Length == _allowedCharsBitmap.Length); - for (int i = 0; i < _allowedCharsBitmap.Length; i++) - { - _allowedCharsBitmap[i] &= definedCharactersBitmap[i]; - } - } - - // Determines whether the given character can be returned unencoded. - public bool IsCharacterAllowed(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((_allowedCharsBitmap[index] >> offset) & 0x1U) != 0; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs deleted file mode 100644 index dda6499604..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/CodePointFilter.cs +++ /dev/null @@ -1,312 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Represents a filter which allows only certain Unicode code points through. - /// - public sealed class CodePointFilter : ICodePointFilter - { - private AllowedCharsBitmap _allowedCharsBitmap; - - /// - /// Instantiates an empty filter (allows no code points through by default). - /// - public CodePointFilter() - { - _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); - } - - /// - /// Instantiates the filter by cloning the allow list of another . - /// - public CodePointFilter(ICodePointFilter other) - { - if (other == null) - { - throw new ArgumentNullException(nameof(other)); - } - - CodePointFilter otherAsCodePointFilter = other as CodePointFilter; - if (otherAsCodePointFilter != null) - { - _allowedCharsBitmap = otherAsCodePointFilter.GetAllowedCharsBitmap(); - } - else - { - _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); - AllowFilter(other); - } - } - - /// - /// Instantiates the filter where only the character ranges specified by - /// are allowed by the filter. - /// - public CodePointFilter(params UnicodeRange[] allowedRanges) - { - _allowedCharsBitmap = AllowedCharsBitmap.CreateNew(); - AllowRanges(allowedRanges); - } - - /// - /// Allows the character specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowChar(char c) - { - _allowedCharsBitmap.AllowCharacter(c); - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowChars(params char[] chars) - { - if (chars != null) - { - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.AllowCharacter(chars[i]); - } - } - return this; - } - - /// - /// Allows all characters in the string through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowChars(string chars) - { - if (chars == null) - { - throw new ArgumentNullException(nameof(chars)); - } - - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.AllowCharacter(chars[i]); - } - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowFilter(ICodePointFilter filter) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - - foreach (var allowedCodePoint in filter.GetAllowedCodePoints()) - { - // If the code point can't be represented as a BMP character, skip it. - char codePointAsChar = (char)allowedCodePoint; - if (allowedCodePoint == codePointAsChar) - { - _allowedCharsBitmap.AllowCharacter(codePointAsChar); - } - } - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowRange(UnicodeRange range) - { - if (range == null) - { - throw new ArgumentNullException(nameof(range)); - } - - int firstCodePoint = range.FirstCodePoint; - int rangeSize = range.RangeSize; - for (int i = 0; i < rangeSize; i++) - { - _allowedCharsBitmap.AllowCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Allows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter AllowRanges(params UnicodeRange[] ranges) - { - if (ranges != null) - { - for (int i = 0; i < ranges.Length; i++) - { - AllowRange(ranges[i]); - } - } - return this; - } - - /// - /// Resets this filter by disallowing all characters. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter Clear() - { - _allowedCharsBitmap.Clear(); - return this; - } - - /// - /// Disallows the character through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidChar(char c) - { - _allowedCharsBitmap.ForbidCharacter(c); - return this; - } - - /// - /// Disallows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidChars(params char[] chars) - { - if (chars != null) - { - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.ForbidCharacter(chars[i]); - } - } - return this; - } - - /// - /// Disallows all characters in the string through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidChars(string chars) - { - if (chars == null) - { - throw new ArgumentNullException(nameof(chars)); - } - - for (int i = 0; i < chars.Length; i++) - { - _allowedCharsBitmap.ForbidCharacter(chars[i]); - } - return this; - } - - /// - /// Disallows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidRange(UnicodeRange range) - { - if (range == null) - { - throw new ArgumentNullException(nameof(range)); - } - - int firstCodePoint = range.FirstCodePoint; - int rangeSize = range.RangeSize; - for (int i = 0; i < rangeSize; i++) - { - _allowedCharsBitmap.ForbidCharacter((char)(firstCodePoint + i)); - } - return this; - } - - /// - /// Disallows all characters specified by through the filter. - /// - /// - /// The 'this' instance. - /// - public CodePointFilter ForbidRanges(params UnicodeRange[] ranges) - { - if (ranges != null) - { - for (int i = 0; i < ranges.Length; i++) - { - ForbidRange(ranges[i]); - } - } - return this; - } - - /// - /// Retrieves the bitmap of allowed characters from this filter. - /// The returned bitmap is a clone of the original bitmap to avoid unintentional modification. - /// - internal AllowedCharsBitmap GetAllowedCharsBitmap() - { - return _allowedCharsBitmap.Clone(); - } - - /// - /// Gets an enumeration of all allowed code points. - /// - public IEnumerable GetAllowedCodePoints() - { - for (int i = 0; i < 0x10000; i++) - { - if (_allowedCharsBitmap.IsCharacterAllowed((char)i)) - { - yield return i; - } - } - } - - /// - /// Returns a value stating whether the character is allowed through the filter. - /// - public bool IsCharacterAllowed(char c) - { - return _allowedCharsBitmap.IsCharacterAllowed(c); - } - - /// - /// Wraps the provided filter as a CodePointFilter, avoiding the clone if possible. - /// - internal static CodePointFilter Wrap(ICodePointFilter filter) - { - return (filter as CodePointFilter) ?? new CodePointFilter(filter); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs deleted file mode 100644 index 940a8590ae..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderCommon.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Extensions.WebEncoders -{ - internal static class EncoderCommon - { - // Gets the optimal capacity of the StringBuilder that will be used to build the output - // given a specified number of input characters and the worst-case growth. - public static int GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar) - { - // We treat 32KB byte size (16k chars) as a soft upper boundary for the length of any StringBuilder - // that we allocate. We'll try to avoid going above this boundary if we can avoid it so that we - // don't allocate objects on the LOH. - const int upperBound = 16 * 1024; - - // Once we have chosen an initial value for the StringBuilder size, the StringBuilder type will - // efficiently allocate additionally blocks if necessary. - - if (numCharsToEncode >= upperBound) - { - // We know that the output will contain at least as many characters as the input, so if the - // input length exceeds the soft upper boundary just preallocate the entire builder and hope for - // a best-case outcome. - return numCharsToEncode; - } - else - { - // Allocate the worst-case if we can, but don't exceed the soft upper boundary. - long worstCaseTotalChars = (long)numCharsToEncode * worstCaseOutputCharsPerInputChar; - return (int)Math.Min(upperBound, worstCaseTotalChars); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs b/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs deleted file mode 100644 index d6428f866e..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderExtensions.cs +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Helpful extension methods for the encoder classes. - /// - public static class EncoderExtensions - { - /// - /// HTML-encodes a string and writes the result to the supplied output. - /// - /// - /// The encoded value is also safe for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output) - { - if (htmlEncoder == null) - { - throw new ArgumentNullException(nameof(htmlEncoder)); - } - - if (!String.IsNullOrEmpty(value)) - { - htmlEncoder.HtmlEncode(value, 0, value.Length, output); - } - } - - /// - /// JavaScript-escapes a string and writes the result to the supplied output. - /// - public static void JavaScriptStringEncode(this IJavaScriptStringEncoder javaScriptStringEncoder, string value, TextWriter output) - { - if (javaScriptStringEncoder == null) - { - throw new ArgumentNullException(nameof(javaScriptStringEncoder)); - } - - if (!String.IsNullOrEmpty(value)) - { - javaScriptStringEncoder.JavaScriptStringEncode(value, 0, value.Length, output); - } - } - - /// - /// URL-encodes a string and writes the result to the supplied output. - /// - /// - /// The encoded value is safe for use in the segment, query, or - /// fragment portion of a URI. - /// - public static void UrlEncode(this IUrlEncoder urlEncoder, string value, TextWriter output) - { - if (urlEncoder == null) - { - throw new ArgumentNullException(nameof(urlEncoder)); - } - - if (!String.IsNullOrEmpty(value)) - { - urlEncoder.UrlEncode(value, 0, value.Length, output); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs b/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs deleted file mode 100644 index 3262a1665d..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/HexUtil.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains helpers for dealing with byte-hex char conversions. - /// - internal static class HexUtil - { - /// - /// Converts a number 0 - 15 to its associated hex character '0' - 'F'. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static char IntToChar(uint i) - { - Debug.Assert(i < 16); - return (i < 10) ? (char)('0' + i) : (char)('A' + (i - 10)); - } - - /// - /// Returns the integral form of this hexadecimal character. - /// - /// 0 - 15 if the character is valid, -1 if the character is invalid. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static int ParseHexCharacter(char c) - { - if ('0' <= c && c <= '9') { return c - '0'; } - else if ('A' <= c && c <= 'F') { return c - 'A' + 10; } - else if ('a' <= c && c <= 'f') { return c - 'a' + 10; } - else { return -1; } - } - - /// - /// Gets the uppercase hex-encoded form of a byte. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static void WriteHexEncodedByte(byte b, out char firstHexChar, out char secondHexChar) - { - firstHexChar = IntToChar((uint)b >> 4); - secondHexChar = IntToChar((uint)b & 0xFU); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs deleted file mode 100644 index d1347c0338..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/HtmlEncoder.cs +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// A class which can perform HTML encoding given an allow list of characters which - /// can be represented unencoded. - /// - /// - /// Instances of this type will always encode a certain set of characters (such as < - /// and >), even if the filter provided in the constructor allows such characters. - /// Once constructed, instances of this class are thread-safe for multiple callers. - /// - public unsafe sealed class HtmlEncoder : IHtmlEncoder - { - // The default HtmlEncoder (Basic Latin), instantiated on demand - private static HtmlEncoder _defaultEncoder; - - // The inner encoder, responsible for the actual encoding routines - private readonly HtmlUnicodeEncoder _innerUnicodeEncoder; - - /// - /// Instantiates an encoder using as its allow list. - /// Any character not in the range will be escaped. - /// - public HtmlEncoder() - : this(HtmlUnicodeEncoder.BasicLatin) - { - } - - /// - /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. Any character not in the set of ranges specified - /// by will be escaped. - /// - public HtmlEncoder(params UnicodeRange[] allowedRanges) - : this(new HtmlUnicodeEncoder(new CodePointFilter(allowedRanges))) - { - } - - /// - /// Instantiates an encoder using a custom code point filter. Any character not in the - /// set returned by 's - /// method will be escaped. - /// - public HtmlEncoder(ICodePointFilter filter) - : this(new HtmlUnicodeEncoder(CodePointFilter.Wrap(filter))) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - } - - private HtmlEncoder(HtmlUnicodeEncoder innerEncoder) - { - Debug.Assert(innerEncoder != null); - _innerUnicodeEncoder = innerEncoder; - } - - /// - /// A default instance of . - /// - /// - /// This normally corresponds to . However, this property is - /// settable so that a developer can change the default implementation application-wide. - /// - public static HtmlEncoder Default - { - get - { - return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - Volatile.Write(ref _defaultEncoder, value); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us - private static HtmlEncoder CreateDefaultEncoderSlow() - { - var onDemandEncoder = new HtmlEncoder(); - return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; - } - - /// - /// Everybody's favorite HtmlEncode routine. - /// - public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - /// - /// Everybody's favorite HtmlEncode routine. - /// - public string HtmlEncode(string value) - { - return _innerUnicodeEncoder.Encode(value); - } - - /// - /// Everybody's favorite HtmlEncode routine. - /// - public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - private sealed class HtmlUnicodeEncoder : UnicodeEncoderBase - { - // A singleton instance of the basic latin encoder. - private static HtmlUnicodeEncoder _basicLatinSingleton; - - // The worst case encoding is 8 output chars per input char: [input] U+FFFF -> [output] "￿" - // We don't need to worry about astral code points since they consume *two* input chars to - // generate at most 10 output chars ("􏿿"), which equates to 5 output chars per input char. - private const int MaxOutputCharsPerInputChar = 8; - - internal HtmlUnicodeEncoder(CodePointFilter filter) - : base(filter, MaxOutputCharsPerInputChar) - { - } - - internal static HtmlUnicodeEncoder BasicLatin - { - get - { - HtmlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); - if (encoder == null) - { - encoder = new HtmlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); - Volatile.Write(ref _basicLatinSingleton, encoder); - } - return encoder; - } - } - - // Writes a scalar value as an HTML-encoded entity. - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - if (value == (uint)'\"') { writer.Write("""); } - else if (value == (uint)'&') { writer.Write("&"); } - else if (value == (uint)'<') { writer.Write("<"); } - else if (value == (uint)'>') { writer.Write(">"); } - else { WriteEncodedScalarAsNumericEntity(ref writer, value); } - } - - // Writes a scalar value as an HTML-encoded numeric entity. - private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) - { - // We're building the characters up in reverse - char* chars = stackalloc char[8 /* "FFFFFFFF" */]; - int numCharsWritten = 0; - do - { - Debug.Assert(numCharsWritten < 8, "Couldn't have written 8 characters out by this point."); - // Pop off the last nibble - chars[numCharsWritten++] = HexUtil.IntToChar(value & 0xFU); - value >>= 4; - } while (value != 0); - - // Finally, write out the HTML-encoded scalar value. - writer.Write('&'); - writer.Write('#'); - writer.Write('x'); - Debug.Assert(numCharsWritten > 0, "At least one character should've been written."); - do - { - writer.Write(chars[--numCharsWritten]); - } while (numCharsWritten != 0); - writer.Write(';'); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs b/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs deleted file mode 100644 index 446bc354a5..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/ICodePointFilter.cs +++ /dev/null @@ -1,19 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Represents a filter which allows only certain Unicode code points through. - /// - public interface ICodePointFilter - { - /// - /// Gets an enumeration of all allowed code points. - /// - IEnumerable GetAllowedCodePoints(); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs deleted file mode 100644 index e6bbb35a5c..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/IHtmlEncoder.cs +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Provides services for HTML-encoding input. - /// - public interface IHtmlEncoder - { - /// - /// HTML-encodes a character array and writes the result to the supplied - /// output. - /// - /// - /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output); - - /// - /// HTML-encodes a given input string. - /// - /// - /// The HTML-encoded value, or null if the input string was null. - /// - /// - /// The return value is also appropriately encoded for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - string HtmlEncode(string value); - - /// - /// HTML-encodes a given input string and writes the result to the - /// supplied output. - /// - /// - /// The encoded value is also appropriately encoded for inclusion inside an HTML attribute - /// as long as the attribute value is surrounded by single or double quotes. - /// - void HtmlEncode(string value, int startIndex, int charCount, TextWriter output); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs deleted file mode 100644 index 29d07a46cc..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/IJavaScriptStringEncoder.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Provides services for JavaScript-escaping strings. - /// - public interface IJavaScriptStringEncoder - { - /// - /// JavaScript-escapes a character array and writes the result to the - /// supplied output. - /// - /// - /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. - /// - void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output); - - /// - /// JavaScript-escapes a given input string. - /// - /// - /// The JavaScript-escaped value, or null if the input string was null. - /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. - /// - string JavaScriptStringEncode(string value); - - /// - /// JavaScript-escapes a given input string and writes the - /// result to the supplied output. - /// - /// - /// The encoded value is appropriately encoded for inclusion inside a quoted JSON string. - /// - void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs deleted file mode 100644 index c3e92568ab..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/IUrlEncoder.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Provides services for URL-escaping strings. - /// - public interface IUrlEncoder - { - /// - /// URL-escapes a character array and writes the result to the supplied - /// output. - /// - /// - /// The encoded value is appropriately encoded for inclusion in the segment, query, or - /// fragment portion of a URI. - /// - void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output); - - /// - /// URL-escapes a given input string. - /// - /// - /// The URL-escaped value, or null if the input string was null. - /// - /// - /// The return value is appropriately encoded for inclusion in the segment, query, or - /// fragment portion of a URI. - /// - string UrlEncode(string value); - - /// - /// URL-escapes a string and writes the result to the supplied output. - /// - /// - /// The encoded value is appropriately encoded for inclusion in the segment, query, or - /// fragment portion of a URI. - /// - void UrlEncode(string value, int startIndex, int charCount, TextWriter output); - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs deleted file mode 100644 index 008c6bcc51..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/JavaScriptStringEncoder.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// A class which can perform JavaScript string escaping given an allow list of characters which - /// can be represented unescaped. - /// - /// - /// Instances of this type will always encode a certain set of characters (such as ' - /// and "), even if the filter provided in the constructor allows such characters. - /// Once constructed, instances of this class are thread-safe for multiple callers. - /// - public sealed class JavaScriptStringEncoder : IJavaScriptStringEncoder - { - // The default JavaScript string encoder (Basic Latin), instantiated on demand - private static JavaScriptStringEncoder _defaultEncoder; - - // The inner encoder, responsible for the actual encoding routines - private readonly JavaScriptStringUnicodeEncoder _innerUnicodeEncoder; - - /// - /// Instantiates an encoder using as its allow list. - /// Any character not in the range will be escaped. - /// - public JavaScriptStringEncoder() - : this(JavaScriptStringUnicodeEncoder.BasicLatin) - { - } - - /// - /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. Any character not in the set of ranges specified - /// by will be escaped. - /// - public JavaScriptStringEncoder(params UnicodeRange[] allowedRanges) - : this(new JavaScriptStringUnicodeEncoder(new CodePointFilter(allowedRanges))) - { - } - - /// - /// Instantiates an encoder using a custom code point filter. Any character not in the - /// set returned by 's - /// method will be escaped. - /// - public JavaScriptStringEncoder(ICodePointFilter filter) - : this(new JavaScriptStringUnicodeEncoder(CodePointFilter.Wrap(filter))) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - } - - private JavaScriptStringEncoder(JavaScriptStringUnicodeEncoder innerEncoder) - { - Debug.Assert(innerEncoder != null); - _innerUnicodeEncoder = innerEncoder; - } - - /// - /// A default instance of . - /// - /// - /// This normally corresponds to . However, this property is - /// settable so that a developer can change the default implementation application-wide. - /// - public static JavaScriptStringEncoder Default - { - get - { - return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - Volatile.Write(ref _defaultEncoder, value); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us - private static JavaScriptStringEncoder CreateDefaultEncoderSlow() - { - var onDemandEncoder = new JavaScriptStringEncoder(); - return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; - } - - /// - /// Everybody's favorite JavaScriptStringEncode routine. - /// - public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - /// - /// Everybody's favorite JavaScriptStringEncode routine. - /// - public string JavaScriptStringEncode(string value) - { - return _innerUnicodeEncoder.Encode(value); - } - - /// - /// Everybody's favorite JavaScriptStringEncode routine. - /// - public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - private sealed class JavaScriptStringUnicodeEncoder : UnicodeEncoderBase - { - // A singleton instance of the basic latin encoder. - private static JavaScriptStringUnicodeEncoder _basicLatinSingleton; - - // The worst case encoding is 6 output chars per input char: [input] U+FFFF -> [output] "\uFFFF" - // We don't need to worry about astral code points since they're represented as encoded - // surrogate pairs in the output. - private const int MaxOutputCharsPerInputChar = 6; - - internal JavaScriptStringUnicodeEncoder(CodePointFilter filter) - : base(filter, MaxOutputCharsPerInputChar) - { - // The only interesting characters above and beyond what the base encoder - // already covers are the solidus and reverse solidus. - ForbidCharacter('\\'); - ForbidCharacter('/'); - } - - internal static JavaScriptStringUnicodeEncoder BasicLatin - { - get - { - JavaScriptStringUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); - if (encoder == null) - { - encoder = new JavaScriptStringUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); - Volatile.Write(ref _basicLatinSingleton, encoder); - } - return encoder; - } - } - - // Writes a scalar value as a JavaScript-escaped character (or sequence of characters). - // See ECMA-262, Sec. 7.8.4, and ECMA-404, Sec. 9 - // http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4 - // http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - // ECMA-262 allows encoding U+000B as "\v", but ECMA-404 does not. - // Both ECMA-262 and ECMA-404 allow encoding U+002F SOLIDUS as "\/". - // (In ECMA-262 this character is a NonEscape character.) - // HTML-specific characters (including apostrophe and quotes) will - // be written out as numeric entities for defense-in-depth. - // See UnicodeEncoderBase ctor comments for more info. - - if (value == (uint)'\b') { writer.Write(@"\b"); } - else if (value == (uint)'\t') { writer.Write(@"\t"); } - else if (value == (uint)'\n') { writer.Write(@"\n"); } - else if (value == (uint)'\f') { writer.Write(@"\f"); } - else if (value == (uint)'\r') { writer.Write(@"\r"); } - else if (value == (uint)'/') { writer.Write(@"\/"); } - else if (value == (uint)'\\') { writer.Write(@"\\"); } - else { WriteEncodedScalarAsNumericEntity(ref writer, value); } - } - - // Writes a scalar value as an JavaScript-escaped character (or sequence of characters). - private static void WriteEncodedScalarAsNumericEntity(ref Writer writer, uint value) - { - if (UnicodeHelpers.IsSupplementaryCodePoint((int)value)) - { - // Convert this back to UTF-16 and write out both characters. - char leadingSurrogate, trailingSurrogate; - UnicodeHelpers.GetUtf16SurrogatePairFromAstralScalarValue((int)value, out leadingSurrogate, out trailingSurrogate); - WriteEncodedSingleCharacter(ref writer, leadingSurrogate); - WriteEncodedSingleCharacter(ref writer, trailingSurrogate); - } - else - { - // This is only a single character. - WriteEncodedSingleCharacter(ref writer, value); - } - } - - // Writes an encoded scalar value (in the BMP) as a JavaScript-escaped character. - private static void WriteEncodedSingleCharacter(ref Writer writer, uint value) - { - Debug.Assert(!UnicodeHelpers.IsSupplementaryCodePoint((int)value), "The incoming value should've been in the BMP."); - - // Encode this as 6 chars "\uFFFF". - writer.Write('\\'); - writer.Write('u'); - writer.Write(HexUtil.IntToChar(value >> 12)); - writer.Write(HexUtil.IntToChar((value >> 8) & 0xFU)); - writer.Write(HexUtil.IntToChar((value >> 4) & 0xFU)); - writer.Write(HexUtil.IntToChar(value & 0xFU)); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj b/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj deleted file mode 100644 index 559ec64868..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/Microsoft.Extensions.WebEncoders.Core.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - be9112cb-d87d-4080-9cc3-24492d49cbe6 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs deleted file mode 100644 index b781d6ca97..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")] -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs deleted file mode 100644 index 1a6baaf665..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeEncoderBase.cs +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Text; - -namespace Microsoft.Extensions.WebEncoders -{ - internal unsafe abstract class UnicodeEncoderBase - { - // A bitmap of characters which are allowed to be returned unescaped. - private AllowedCharsBitmap _allowedCharsBitmap; - - // The worst-case number of output chars generated for any input char. - private readonly int _maxOutputCharsPerInputChar; - - /// - /// Instantiates an encoder using a custom allow list of characters. - /// - protected UnicodeEncoderBase(CodePointFilter filter, int maxOutputCharsPerInputChar) - { - _maxOutputCharsPerInputChar = maxOutputCharsPerInputChar; - _allowedCharsBitmap = filter.GetAllowedCharsBitmap(); - - // Forbid characters that are special in HTML. - // Even though this is a common encoder used by everybody (including URL - // and JavaScript strings), it's unfortunately common for developers to - // forget to HTML-encode a string once it has been URL-encoded or - // JavaScript string-escaped, so this offers extra protection. - ForbidCharacter('<'); - ForbidCharacter('>'); - ForbidCharacter('&'); - ForbidCharacter('\''); // can be used to escape attributes - ForbidCharacter('\"'); // can be used to escape attributes - ForbidCharacter('+'); // technically not HTML-specific, but can be used to perform UTF7-based attacks - - // Forbid codepoints which aren't mapped to characters or which are otherwise always disallowed - // (includes categories Cc, Cs, Co, Cn, Zs [except U+0020 SPACE], Zl, Zp) - _allowedCharsBitmap.ForbidUndefinedCharacters(); - } - - // Marks a character as forbidden (must be returned encoded) - protected void ForbidCharacter(char c) - { - _allowedCharsBitmap.ForbidCharacter(c); - } - - /// - /// Entry point to the encoder. - /// - public void Encode(char[] value, int startIndex, int charCount, TextWriter output) - { - // Input checking - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - ValidateInputs(startIndex, charCount, actualInputLength: value.Length); - - if (charCount != 0) - { - fixed (char* pChars = value) - { - int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(&pChars[startIndex], charCount); - if (indexOfFirstCharWhichRequiresEncoding < 0) - { - // All chars are valid - just copy the buffer as-is. - output.Write(value, startIndex, charCount); - } - else - { - // Flush all chars which are known to be valid, then encode the remainder individually - if (indexOfFirstCharWhichRequiresEncoding > 0) - { - output.Write(value, startIndex, indexOfFirstCharWhichRequiresEncoding); - } - EncodeCore(&pChars[startIndex + indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); - } - } - } - } - - /// - /// Entry point to the encoder. - /// - public string Encode(string value) - { - if (String.IsNullOrEmpty(value)) - { - return value; - } - - // Quick check: does the string need to be encoded at all? - // If not, just return the input string as-is. - for (int i = 0; i < value.Length; i++) - { - if (!IsCharacterAllowed(value[i])) - { - return EncodeCore(value, idxOfFirstCharWhichRequiresEncoding: i); - } - } - return value; - } - - /// - /// Entry point to the encoder. - /// - public void Encode(string value, int startIndex, int charCount, TextWriter output) - { - // Input checking - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - ValidateInputs(startIndex, charCount, actualInputLength: value.Length); - - if (charCount != 0) - { - fixed (char* pChars = value) - { - if (charCount == value.Length) - { - // Optimize for the common case: we're being asked to encode the entire input string - // (not just a subset). If all characters are safe, we can just spit it out as-is. - int indexOfFirstCharWhichRequiresEncoding = GetIndexOfFirstCharWhichRequiresEncoding(pChars, charCount); - if (indexOfFirstCharWhichRequiresEncoding < 0) - { - output.Write(value); - } - else - { - // Flush all chars which are known to be valid, then encode the remainder individually - for (int i = 0; i < indexOfFirstCharWhichRequiresEncoding; i++) - { - output.Write(pChars[i]); - } - EncodeCore(&pChars[indexOfFirstCharWhichRequiresEncoding], (uint)(charCount - indexOfFirstCharWhichRequiresEncoding), output); - } - } - else - { - // We're being asked to encode a subset, so we need to go through the slow path of appending - // each character individually. - EncodeCore(&pChars[startIndex], (uint)charCount, output); - } - } - } - } - - private string EncodeCore(string input, int idxOfFirstCharWhichRequiresEncoding) - { - Debug.Assert(idxOfFirstCharWhichRequiresEncoding >= 0); - Debug.Assert(idxOfFirstCharWhichRequiresEncoding < input.Length); - - int numCharsWhichMayRequireEncoding = input.Length - idxOfFirstCharWhichRequiresEncoding; - int sbCapacity = checked(idxOfFirstCharWhichRequiresEncoding + EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsWhichMayRequireEncoding, _maxOutputCharsPerInputChar)); - Debug.Assert(sbCapacity >= input.Length); - - // Allocate the StringBuilder with the first (known to not require encoding) part of the input string, - // then begin encoding from the last (potentially requiring encoding) part of the input string. - StringBuilder builder = new StringBuilder(input, 0, idxOfFirstCharWhichRequiresEncoding, sbCapacity); - Writer writer = new Writer(builder); - fixed (char* pInput = input) - { - EncodeCore(ref writer, &pInput[idxOfFirstCharWhichRequiresEncoding], (uint)numCharsWhichMayRequireEncoding); - } - return builder.ToString(); - } - - private void EncodeCore(char* input, uint charsRemaining, TextWriter output) - { - Writer writer = new Writer(output); - EncodeCore(ref writer, input, charsRemaining); - } - - private void EncodeCore(ref Writer writer, char* input, uint charsRemaining) - { - while (charsRemaining != 0) - { - int nextScalar = UnicodeHelpers.GetScalarValueFromUtf16(input, endOfString: (charsRemaining == 1)); - if (UnicodeHelpers.IsSupplementaryCodePoint(nextScalar)) - { - // Supplementary characters should always be encoded numerically. - WriteEncodedScalar(ref writer, (uint)nextScalar); - - // We consume two UTF-16 characters for a single supplementary character. - input += 2; - charsRemaining -= 2; - } - else - { - // Otherwise, this was a BMP character. - input++; - charsRemaining--; - char c = (char)nextScalar; - if (IsCharacterAllowed(c)) - { - writer.Write(c); - } - else - { - WriteEncodedScalar(ref writer, (uint)nextScalar); - } - } - } - } - - private int GetIndexOfFirstCharWhichRequiresEncoding(char* input, int inputLength) - { - for (int i = 0; i < inputLength; i++) - { - if (!IsCharacterAllowed(input[i])) - { - return i; - } - } - return -1; // no characters require encoding - } - - // Determines whether the given character can be returned unencoded. - [MethodImpl(MethodImplOptions.AggressiveInlining)] - private bool IsCharacterAllowed(char c) - { - return _allowedCharsBitmap.IsCharacterAllowed(c); - } - - private static void ValidateInputs(int startIndex, int charCount, int actualInputLength) - { - if (startIndex < 0 || startIndex > actualInputLength) - { - throw new ArgumentOutOfRangeException(nameof(startIndex)); - } - if (charCount < 0 || charCount > (actualInputLength - startIndex)) - { - throw new ArgumentOutOfRangeException(nameof(charCount)); - } - } - - protected abstract void WriteEncodedScalar(ref Writer writer, uint value); - - /// - /// Provides an abstraction over both StringBuilder and TextWriter. - /// Declared as a struct so we can allocate on the stack and pass by - /// reference. Eliminates chatty virtual dispatches on hot paths. - /// - protected struct Writer - { - private readonly StringBuilder _innerBuilder; - private readonly TextWriter _innerWriter; - - public Writer(StringBuilder innerBuilder) - { - _innerBuilder = innerBuilder; - _innerWriter = null; - } - - public Writer(TextWriter innerWriter) - { - _innerBuilder = null; - _innerWriter = innerWriter; - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Write(char value) - { - if (_innerBuilder != null) - { - _innerBuilder.Append(value); - } - else - { - _innerWriter.Write(value); - } - } - - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public void Write(string value) - { - if (_innerBuilder != null) - { - _innerBuilder.Append(value); - } - else - { - _innerWriter.Write(value); - } - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs deleted file mode 100644 index 53e52ef573..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeHelpers.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains helpers for dealing with Unicode code points. - /// - internal unsafe static class UnicodeHelpers - { - /// - /// Used for invalid Unicode sequences or other unrepresentable values. - /// - private const char UNICODE_REPLACEMENT_CHAR = '\uFFFD'; - - /// - /// The last code point defined by the Unicode specification. - /// - internal const int UNICODE_LAST_CODEPOINT = 0x10FFFF; - - private static uint[] _definedCharacterBitmap; - - /// - /// Helper method which creates a bitmap of all characters which are - /// defined per version 8.0 of the Unicode specification. - /// - [MethodImpl(MethodImplOptions.NoInlining)] - private static uint[] CreateDefinedCharacterBitmap() - { - // The stream should be exactly 8KB in size. - var assembly = typeof(UnicodeHelpers).GetTypeInfo().Assembly; - var resourceName = assembly.GetName().Name + ".compiler.resources.unicode-defined-chars.bin"; - - var stream = assembly.GetManifestResourceStream(resourceName); - if (stream.Length != 8 * 1024) - { - Environment.FailFast("Corrupt data detected."); - } - - // Read everything in as raw bytes. - byte[] rawData = new byte[8 * 1024]; - for (int numBytesReadTotal = 0; numBytesReadTotal < rawData.Length;) - { - int numBytesReadThisIteration = stream.Read(rawData, numBytesReadTotal, rawData.Length - numBytesReadTotal); - if (numBytesReadThisIteration == 0) - { - Environment.FailFast("Corrupt data detected."); - } - numBytesReadTotal += numBytesReadThisIteration; - } - - // Finally, convert the byte[] to a uint[]. - // The incoming bytes are little-endian. - uint[] retVal = new uint[2 * 1024]; - for (int i = 0; i < retVal.Length; i++) - { - retVal[i] = (((uint)rawData[4 * i + 3]) << 24) - | (((uint)rawData[4 * i + 2]) << 16) - | (((uint)rawData[4 * i + 1]) << 8) - | (uint)rawData[4 * i]; - } - - // And we're done! - Volatile.Write(ref _definedCharacterBitmap, retVal); - return retVal; - } - - /// - /// Returns a bitmap of all characters which are defined per version 8.0 - /// of the Unicode specification. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static uint[] GetDefinedCharacterBitmap() - { - return Volatile.Read(ref _definedCharacterBitmap) ?? CreateDefinedCharacterBitmap(); - } - - /// - /// Given a UTF-16 character stream, reads the next scalar value from the stream. - /// Set 'endOfString' to true if 'pChar' points to the last character in the stream. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static int GetScalarValueFromUtf16(char* pChar, bool endOfString) - { - // This method is marked as AggressiveInlining to handle the common case of a non-surrogate - // character. The surrogate case is handled in the slower fallback code path. - char thisChar = *pChar; - return (Char.IsSurrogate(thisChar)) ? GetScalarValueFromUtf16Slow(pChar, endOfString) : thisChar; - } - - private static int GetScalarValueFromUtf16Slow(char* pChar, bool endOfString) - { - char firstChar = pChar[0]; - - if (!Char.IsSurrogate(firstChar)) - { - Debug.Fail("This case should've been handled by the fast path."); - return firstChar; - } - else if (Char.IsHighSurrogate(firstChar)) - { - if (endOfString) - { - // unmatched surrogate - substitute - return UNICODE_REPLACEMENT_CHAR; - } - else - { - char secondChar = pChar[1]; - if (Char.IsLowSurrogate(secondChar)) - { - // valid surrogate pair - extract codepoint - return GetScalarValueFromUtf16SurrogatePair(firstChar, secondChar); - } - else - { - // unmatched surrogate - substitute - return UNICODE_REPLACEMENT_CHAR; - } - } - } - else - { - // unmatched surrogate - substitute - Debug.Assert(Char.IsLowSurrogate(firstChar)); - return UNICODE_REPLACEMENT_CHAR; - } - } - - private static int GetScalarValueFromUtf16SurrogatePair(char highSurrogate, char lowSurrogate) - { - Debug.Assert(Char.IsHighSurrogate(highSurrogate)); - Debug.Assert(Char.IsLowSurrogate(lowSurrogate)); - - // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the - // details of this conversion. We don't use Char.ConvertToUtf32 because its exception - // handling shows up on the hot path, and our caller has already sanitized the inputs. - return (lowSurrogate & 0x3ff) | (((highSurrogate & 0x3ff) + (1 << 6)) << 10); - } - - internal static void GetUtf16SurrogatePairFromAstralScalarValue(int scalar, out char highSurrogate, out char lowSurrogate) - { - Debug.Assert(0x10000 <= scalar && scalar <= UNICODE_LAST_CODEPOINT); - - // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.5 for the - // details of this conversion. We don't use Char.ConvertFromUtf32 because its exception - // handling shows up on the hot path, it allocates temporary strings (which we don't want), - // and our caller has already sanitized the inputs. - - int x = scalar & 0xFFFF; - int u = scalar >> 16; - int w = u - 1; - highSurrogate = (char)(0xD800 | (w << 6) | (x >> 10)); - lowSurrogate = (char)(0xDC00 | (x & 0x3FF)); - } - - /// - /// Given a Unicode scalar value, returns the UTF-8 representation of the value. - /// The return value's bytes should be popped from the LSB. - /// - internal static int GetUtf8RepresentationForScalarValue(uint scalar) - { - Debug.Assert(scalar <= UNICODE_LAST_CODEPOINT); - - // See http://www.unicode.org/versions/Unicode6.2.0/ch03.pdf, Table 3.6 for the - // details of this conversion. We don't use UTF8Encoding since we're encoding - // a scalar code point, not a UTF16 character sequence. - if (scalar <= 0x7f) - { - // one byte used: scalar 00000000 0xxxxxxx -> byte sequence 0xxxxxxx - byte firstByte = (byte)scalar; - return firstByte; - } - else if (scalar <= 0x7ff) - { - // two bytes used: scalar 00000yyy yyxxxxxx -> byte sequence 110yyyyy 10xxxxxx - byte firstByte = (byte)(0xc0 | (scalar >> 6)); - byte secondByteByte = (byte)(0x80 | (scalar & 0x3f)); - return ((secondByteByte << 8) | firstByte); - } - else if (scalar <= 0xffff) - { - // three bytes used: scalar zzzzyyyy yyxxxxxx -> byte sequence 1110zzzz 10yyyyyy 10xxxxxx - byte firstByte = (byte)(0xe0 | (scalar >> 12)); - byte secondByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); - byte thirdByte = (byte)(0x80 | (scalar & 0x3f)); - return ((((thirdByte << 8) | secondByte) << 8) | firstByte); - } - else - { - // four bytes used: scalar 000uuuuu zzzzyyyy yyxxxxxx -> byte sequence 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx - byte firstByte = (byte)(0xf0 | (scalar >> 18)); - byte secondByte = (byte)(0x80 | ((scalar >> 12) & 0x3f)); - byte thirdByte = (byte)(0x80 | ((scalar >> 6) & 0x3f)); - byte fourthByte = (byte)(0x80 | (scalar & 0x3f)); - return ((((((fourthByte << 8) | thirdByte) << 8) | secondByte) << 8) | firstByte); - } - } - - /// - /// Returns a value stating whether a character is defined per version 8.0 - /// of the Unicode specification. Certain classes of characters (control chars, - /// private use, surrogates, some whitespace) are considered "undefined" for - /// our purposes. - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool IsCharacterDefined(char c) - { - uint codePoint = (uint)c; - int index = (int)(codePoint >> 5); - int offset = (int)(codePoint & 0x1FU); - return ((GetDefinedCharacterBitmap()[index] >> offset) & 0x1U) != 0; - } - - /// - /// Determines whether the given scalar value is in the supplementary plane and thus - /// requires 2 characters to be represented in UTF-16 (as a surrogate pair). - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - internal static bool IsSupplementaryCodePoint(int scalar) - { - return ((scalar & ~((int)Char.MaxValue)) != 0); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs deleted file mode 100644 index 8320350e16..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRange.cs +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Represents a contiguous range of Unicode code points. - /// - /// - /// Currently only the Basic Multilingual Plane is supported. - /// - public sealed class UnicodeRange - { - /// - /// Creates a new . - /// - /// The first code point in the range. - /// The number of code points in the range. - public UnicodeRange(int firstCodePoint, int rangeSize) - { - // Parameter checking: the first code point and last code point must - // lie within the BMP. See http://unicode.org/faq/blocks_ranges.html for more info. - if (firstCodePoint < 0 || firstCodePoint > 0xFFFF) - { - throw new ArgumentOutOfRangeException(nameof(firstCodePoint)); - } - if (rangeSize < 0 || ((long)firstCodePoint + (long)rangeSize > 0x10000)) - { - throw new ArgumentOutOfRangeException(nameof(rangeSize)); - } - - FirstCodePoint = firstCodePoint; - RangeSize = rangeSize; - } - - /// - /// The first code point in this range. - /// - public int FirstCodePoint { get; } - - /// - /// The number of code points in this range. - /// - public int RangeSize { get; } - - /// - /// Creates a new from a span of characters. - /// - /// The first character in the range. - /// The last character in the range. - /// The representing this span. - public static UnicodeRange FromSpan(char firstChar, char lastChar) - { - if (lastChar < firstChar) - { - throw new ArgumentOutOfRangeException(nameof(lastChar)); - } - - return new UnicodeRange(firstChar, 1 + (int)(lastChar - firstChar)); - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs deleted file mode 100644 index 73d155e141..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.cs +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains predefined instances which correspond to blocks - /// from the Unicode 8.0 specification. - /// - public static partial class UnicodeRanges - { - /// - /// An empty . This range contains no code points. - /// - public static UnicodeRange None => Volatile.Read(ref _none) ?? CreateEmptyRange(ref _none); - private static UnicodeRange _none; - - /// - /// A which contains all characters in the Unicode Basic - /// Multilingual Plane (U+0000..U+FFFF). - /// - public static UnicodeRange All => Volatile.Read(ref _all) ?? CreateRange(ref _all, '\u0000', '\uFFFF'); - private static UnicodeRange _all; - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeRange CreateEmptyRange(ref UnicodeRange range) - { - // If the range hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'range' value. - var newRange = new UnicodeRange(0, 0); - Volatile.Write(ref range, newRange); - return newRange; - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the caller should be inlined, not this method - private static UnicodeRange CreateRange(ref UnicodeRange range, char first, char last) - { - // If the range hasn't been created, create it now. - // It's ok if two threads race and one overwrites the other's 'range' value. - Debug.Assert(last > first, "Code points were specified out of order."); - var newRange = UnicodeRange.FromSpan(first, last); - Volatile.Write(ref range, newRange); - return newRange; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs b/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs deleted file mode 100644 index ae2079a309..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UnicodeRanges.generated.cs +++ /dev/null @@ -1,1415 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - public static partial class UnicodeRanges - { - /// - /// A corresponding to the 'Basic Latin' Unicode block (U+0000..U+007F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0000.pdf for the full set of characters in this block. - /// - public static UnicodeRange BasicLatin => Volatile.Read(ref _basicLatin) ?? CreateRange(ref _basicLatin, first: '\u0000', last: '\u007F'); - private static UnicodeRange _basicLatin; - - /// - /// A corresponding to the 'Latin-1 Supplement' Unicode block (U+0080..U+00FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0080.pdf for the full set of characters in this block. - /// - public static UnicodeRange Latin1Supplement => Volatile.Read(ref _latin1Supplement) ?? CreateRange(ref _latin1Supplement, first: '\u0080', last: '\u00FF'); - private static UnicodeRange _latin1Supplement; - - /// - /// A corresponding to the 'Latin Extended-A' Unicode block (U+0100..U+017F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0100.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedA => Volatile.Read(ref _latinExtendedA) ?? CreateRange(ref _latinExtendedA, first: '\u0100', last: '\u017F'); - private static UnicodeRange _latinExtendedA; - - /// - /// A corresponding to the 'Latin Extended-B' Unicode block (U+0180..U+024F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0180.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedB => Volatile.Read(ref _latinExtendedB) ?? CreateRange(ref _latinExtendedB, first: '\u0180', last: '\u024F'); - private static UnicodeRange _latinExtendedB; - - /// - /// A corresponding to the 'IPA Extensions' Unicode block (U+0250..U+02AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0250.pdf for the full set of characters in this block. - /// - public static UnicodeRange IPAExtensions => Volatile.Read(ref _ipaExtensions) ?? CreateRange(ref _ipaExtensions, first: '\u0250', last: '\u02AF'); - private static UnicodeRange _ipaExtensions; - - /// - /// A corresponding to the 'Spacing Modifier Letters' Unicode block (U+02B0..U+02FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U02B0.pdf for the full set of characters in this block. - /// - public static UnicodeRange SpacingModifierLetters => Volatile.Read(ref _spacingModifierLetters) ?? CreateRange(ref _spacingModifierLetters, first: '\u02B0', last: '\u02FF'); - private static UnicodeRange _spacingModifierLetters; - - /// - /// A corresponding to the 'Combining Diacritical Marks' Unicode block (U+0300..U+036F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0300.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarks => Volatile.Read(ref _combiningDiacriticalMarks) ?? CreateRange(ref _combiningDiacriticalMarks, first: '\u0300', last: '\u036F'); - private static UnicodeRange _combiningDiacriticalMarks; - - /// - /// A corresponding to the 'Greek and Coptic' Unicode block (U+0370..U+03FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0370.pdf for the full set of characters in this block. - /// - public static UnicodeRange GreekandCoptic => Volatile.Read(ref _greekandCoptic) ?? CreateRange(ref _greekandCoptic, first: '\u0370', last: '\u03FF'); - private static UnicodeRange _greekandCoptic; - - /// - /// A corresponding to the 'Cyrillic' Unicode block (U+0400..U+04FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0400.pdf for the full set of characters in this block. - /// - public static UnicodeRange Cyrillic => Volatile.Read(ref _cyrillic) ?? CreateRange(ref _cyrillic, first: '\u0400', last: '\u04FF'); - private static UnicodeRange _cyrillic; - - /// - /// A corresponding to the 'Cyrillic Supplement' Unicode block (U+0500..U+052F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0500.pdf for the full set of characters in this block. - /// - public static UnicodeRange CyrillicSupplement => Volatile.Read(ref _cyrillicSupplement) ?? CreateRange(ref _cyrillicSupplement, first: '\u0500', last: '\u052F'); - private static UnicodeRange _cyrillicSupplement; - - /// - /// A corresponding to the 'Armenian' Unicode block (U+0530..U+058F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0530.pdf for the full set of characters in this block. - /// - public static UnicodeRange Armenian => Volatile.Read(ref _armenian) ?? CreateRange(ref _armenian, first: '\u0530', last: '\u058F'); - private static UnicodeRange _armenian; - - /// - /// A corresponding to the 'Hebrew' Unicode block (U+0590..U+05FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0590.pdf for the full set of characters in this block. - /// - public static UnicodeRange Hebrew => Volatile.Read(ref _hebrew) ?? CreateRange(ref _hebrew, first: '\u0590', last: '\u05FF'); - private static UnicodeRange _hebrew; - - /// - /// A corresponding to the 'Arabic' Unicode block (U+0600..U+06FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0600.pdf for the full set of characters in this block. - /// - public static UnicodeRange Arabic => Volatile.Read(ref _arabic) ?? CreateRange(ref _arabic, first: '\u0600', last: '\u06FF'); - private static UnicodeRange _arabic; - - /// - /// A corresponding to the 'Syriac' Unicode block (U+0700..U+074F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0700.pdf for the full set of characters in this block. - /// - public static UnicodeRange Syriac => Volatile.Read(ref _syriac) ?? CreateRange(ref _syriac, first: '\u0700', last: '\u074F'); - private static UnicodeRange _syriac; - - /// - /// A corresponding to the 'Arabic Supplement' Unicode block (U+0750..U+077F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0750.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicSupplement => Volatile.Read(ref _arabicSupplement) ?? CreateRange(ref _arabicSupplement, first: '\u0750', last: '\u077F'); - private static UnicodeRange _arabicSupplement; - - /// - /// A corresponding to the 'Thaana' Unicode block (U+0780..U+07BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0780.pdf for the full set of characters in this block. - /// - public static UnicodeRange Thaana => Volatile.Read(ref _thaana) ?? CreateRange(ref _thaana, first: '\u0780', last: '\u07BF'); - private static UnicodeRange _thaana; - - /// - /// A corresponding to the 'NKo' Unicode block (U+07C0..U+07FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U07C0.pdf for the full set of characters in this block. - /// - public static UnicodeRange NKo => Volatile.Read(ref _nKo) ?? CreateRange(ref _nKo, first: '\u07C0', last: '\u07FF'); - private static UnicodeRange _nKo; - - /// - /// A corresponding to the 'Samaritan' Unicode block (U+0800..U+083F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0800.pdf for the full set of characters in this block. - /// - public static UnicodeRange Samaritan => Volatile.Read(ref _samaritan) ?? CreateRange(ref _samaritan, first: '\u0800', last: '\u083F'); - private static UnicodeRange _samaritan; - - /// - /// A corresponding to the 'Mandaic' Unicode block (U+0840..U+085F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0840.pdf for the full set of characters in this block. - /// - public static UnicodeRange Mandaic => Volatile.Read(ref _mandaic) ?? CreateRange(ref _mandaic, first: '\u0840', last: '\u085F'); - private static UnicodeRange _mandaic; - - /// - /// A corresponding to the 'Arabic Extended-A' Unicode block (U+08A0..U+08FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U08A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicExtendedA => Volatile.Read(ref _arabicExtendedA) ?? CreateRange(ref _arabicExtendedA, first: '\u08A0', last: '\u08FF'); - private static UnicodeRange _arabicExtendedA; - - /// - /// A corresponding to the 'Devanagari' Unicode block (U+0900..U+097F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0900.pdf for the full set of characters in this block. - /// - public static UnicodeRange Devanagari => Volatile.Read(ref _devanagari) ?? CreateRange(ref _devanagari, first: '\u0900', last: '\u097F'); - private static UnicodeRange _devanagari; - - /// - /// A corresponding to the 'Bengali' Unicode block (U+0980..U+09FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0980.pdf for the full set of characters in this block. - /// - public static UnicodeRange Bengali => Volatile.Read(ref _bengali) ?? CreateRange(ref _bengali, first: '\u0980', last: '\u09FF'); - private static UnicodeRange _bengali; - - /// - /// A corresponding to the 'Gurmukhi' Unicode block (U+0A00..U+0A7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Gurmukhi => Volatile.Read(ref _gurmukhi) ?? CreateRange(ref _gurmukhi, first: '\u0A00', last: '\u0A7F'); - private static UnicodeRange _gurmukhi; - - /// - /// A corresponding to the 'Gujarati' Unicode block (U+0A80..U+0AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0A80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Gujarati => Volatile.Read(ref _gujarati) ?? CreateRange(ref _gujarati, first: '\u0A80', last: '\u0AFF'); - private static UnicodeRange _gujarati; - - /// - /// A corresponding to the 'Oriya' Unicode block (U+0B00..U+0B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Oriya => Volatile.Read(ref _oriya) ?? CreateRange(ref _oriya, first: '\u0B00', last: '\u0B7F'); - private static UnicodeRange _oriya; - - /// - /// A corresponding to the 'Tamil' Unicode block (U+0B80..U+0BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0B80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tamil => Volatile.Read(ref _tamil) ?? CreateRange(ref _tamil, first: '\u0B80', last: '\u0BFF'); - private static UnicodeRange _tamil; - - /// - /// A corresponding to the 'Telugu' Unicode block (U+0C00..U+0C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Telugu => Volatile.Read(ref _telugu) ?? CreateRange(ref _telugu, first: '\u0C00', last: '\u0C7F'); - private static UnicodeRange _telugu; - - /// - /// A corresponding to the 'Kannada' Unicode block (U+0C80..U+0CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0C80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Kannada => Volatile.Read(ref _kannada) ?? CreateRange(ref _kannada, first: '\u0C80', last: '\u0CFF'); - private static UnicodeRange _kannada; - - /// - /// A corresponding to the 'Malayalam' Unicode block (U+0D00..U+0D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Malayalam => Volatile.Read(ref _malayalam) ?? CreateRange(ref _malayalam, first: '\u0D00', last: '\u0D7F'); - private static UnicodeRange _malayalam; - - /// - /// A corresponding to the 'Sinhala' Unicode block (U+0D80..U+0DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0D80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Sinhala => Volatile.Read(ref _sinhala) ?? CreateRange(ref _sinhala, first: '\u0D80', last: '\u0DFF'); - private static UnicodeRange _sinhala; - - /// - /// A corresponding to the 'Thai' Unicode block (U+0E00..U+0E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Thai => Volatile.Read(ref _thai) ?? CreateRange(ref _thai, first: '\u0E00', last: '\u0E7F'); - private static UnicodeRange _thai; - - /// - /// A corresponding to the 'Lao' Unicode block (U+0E80..U+0EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0E80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Lao => Volatile.Read(ref _lao) ?? CreateRange(ref _lao, first: '\u0E80', last: '\u0EFF'); - private static UnicodeRange _lao; - - /// - /// A corresponding to the 'Tibetan' Unicode block (U+0F00..U+0FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U0F00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tibetan => Volatile.Read(ref _tibetan) ?? CreateRange(ref _tibetan, first: '\u0F00', last: '\u0FFF'); - private static UnicodeRange _tibetan; - - /// - /// A corresponding to the 'Myanmar' Unicode block (U+1000..U+109F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1000.pdf for the full set of characters in this block. - /// - public static UnicodeRange Myanmar => Volatile.Read(ref _myanmar) ?? CreateRange(ref _myanmar, first: '\u1000', last: '\u109F'); - private static UnicodeRange _myanmar; - - /// - /// A corresponding to the 'Georgian' Unicode block (U+10A0..U+10FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U10A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Georgian => Volatile.Read(ref _georgian) ?? CreateRange(ref _georgian, first: '\u10A0', last: '\u10FF'); - private static UnicodeRange _georgian; - - /// - /// A corresponding to the 'Hangul Jamo' Unicode block (U+1100..U+11FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1100.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulJamo => Volatile.Read(ref _hangulJamo) ?? CreateRange(ref _hangulJamo, first: '\u1100', last: '\u11FF'); - private static UnicodeRange _hangulJamo; - - /// - /// A corresponding to the 'Ethiopic' Unicode block (U+1200..U+137F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1200.pdf for the full set of characters in this block. - /// - public static UnicodeRange Ethiopic => Volatile.Read(ref _ethiopic) ?? CreateRange(ref _ethiopic, first: '\u1200', last: '\u137F'); - private static UnicodeRange _ethiopic; - - /// - /// A corresponding to the 'Ethiopic Supplement' Unicode block (U+1380..U+139F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1380.pdf for the full set of characters in this block. - /// - public static UnicodeRange EthiopicSupplement => Volatile.Read(ref _ethiopicSupplement) ?? CreateRange(ref _ethiopicSupplement, first: '\u1380', last: '\u139F'); - private static UnicodeRange _ethiopicSupplement; - - /// - /// A corresponding to the 'Cherokee' Unicode block (U+13A0..U+13FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U13A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Cherokee => Volatile.Read(ref _cherokee) ?? CreateRange(ref _cherokee, first: '\u13A0', last: '\u13FF'); - private static UnicodeRange _cherokee; - - /// - /// A corresponding to the 'Unified Canadian Aboriginal Syllabics' Unicode block (U+1400..U+167F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1400.pdf for the full set of characters in this block. - /// - public static UnicodeRange UnifiedCanadianAboriginalSyllabics => Volatile.Read(ref _unifiedCanadianAboriginalSyllabics) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabics, first: '\u1400', last: '\u167F'); - private static UnicodeRange _unifiedCanadianAboriginalSyllabics; - - /// - /// A corresponding to the 'Ogham' Unicode block (U+1680..U+169F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1680.pdf for the full set of characters in this block. - /// - public static UnicodeRange Ogham => Volatile.Read(ref _ogham) ?? CreateRange(ref _ogham, first: '\u1680', last: '\u169F'); - private static UnicodeRange _ogham; - - /// - /// A corresponding to the 'Runic' Unicode block (U+16A0..U+16FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U16A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Runic => Volatile.Read(ref _runic) ?? CreateRange(ref _runic, first: '\u16A0', last: '\u16FF'); - private static UnicodeRange _runic; - - /// - /// A corresponding to the 'Tagalog' Unicode block (U+1700..U+171F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1700.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tagalog => Volatile.Read(ref _tagalog) ?? CreateRange(ref _tagalog, first: '\u1700', last: '\u171F'); - private static UnicodeRange _tagalog; - - /// - /// A corresponding to the 'Hanunoo' Unicode block (U+1720..U+173F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1720.pdf for the full set of characters in this block. - /// - public static UnicodeRange Hanunoo => Volatile.Read(ref _hanunoo) ?? CreateRange(ref _hanunoo, first: '\u1720', last: '\u173F'); - private static UnicodeRange _hanunoo; - - /// - /// A corresponding to the 'Buhid' Unicode block (U+1740..U+175F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1740.pdf for the full set of characters in this block. - /// - public static UnicodeRange Buhid => Volatile.Read(ref _buhid) ?? CreateRange(ref _buhid, first: '\u1740', last: '\u175F'); - private static UnicodeRange _buhid; - - /// - /// A corresponding to the 'Tagbanwa' Unicode block (U+1760..U+177F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1760.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tagbanwa => Volatile.Read(ref _tagbanwa) ?? CreateRange(ref _tagbanwa, first: '\u1760', last: '\u177F'); - private static UnicodeRange _tagbanwa; - - /// - /// A corresponding to the 'Khmer' Unicode block (U+1780..U+17FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1780.pdf for the full set of characters in this block. - /// - public static UnicodeRange Khmer => Volatile.Read(ref _khmer) ?? CreateRange(ref _khmer, first: '\u1780', last: '\u17FF'); - private static UnicodeRange _khmer; - - /// - /// A corresponding to the 'Mongolian' Unicode block (U+1800..U+18AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1800.pdf for the full set of characters in this block. - /// - public static UnicodeRange Mongolian => Volatile.Read(ref _mongolian) ?? CreateRange(ref _mongolian, first: '\u1800', last: '\u18AF'); - private static UnicodeRange _mongolian; - - /// - /// A corresponding to the 'Unified Canadian Aboriginal Syllabics Extended' Unicode block (U+18B0..U+18FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U18B0.pdf for the full set of characters in this block. - /// - public static UnicodeRange UnifiedCanadianAboriginalSyllabicsExtended => Volatile.Read(ref _unifiedCanadianAboriginalSyllabicsExtended) ?? CreateRange(ref _unifiedCanadianAboriginalSyllabicsExtended, first: '\u18B0', last: '\u18FF'); - private static UnicodeRange _unifiedCanadianAboriginalSyllabicsExtended; - - /// - /// A corresponding to the 'Limbu' Unicode block (U+1900..U+194F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1900.pdf for the full set of characters in this block. - /// - public static UnicodeRange Limbu => Volatile.Read(ref _limbu) ?? CreateRange(ref _limbu, first: '\u1900', last: '\u194F'); - private static UnicodeRange _limbu; - - /// - /// A corresponding to the 'Tai Le' Unicode block (U+1950..U+197F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1950.pdf for the full set of characters in this block. - /// - public static UnicodeRange TaiLe => Volatile.Read(ref _taiLe) ?? CreateRange(ref _taiLe, first: '\u1950', last: '\u197F'); - private static UnicodeRange _taiLe; - - /// - /// A corresponding to the 'New Tai Lue' Unicode block (U+1980..U+19DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1980.pdf for the full set of characters in this block. - /// - public static UnicodeRange NewTaiLue => Volatile.Read(ref _newTaiLue) ?? CreateRange(ref _newTaiLue, first: '\u1980', last: '\u19DF'); - private static UnicodeRange _newTaiLue; - - /// - /// A corresponding to the 'Khmer Symbols' Unicode block (U+19E0..U+19FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U19E0.pdf for the full set of characters in this block. - /// - public static UnicodeRange KhmerSymbols => Volatile.Read(ref _khmerSymbols) ?? CreateRange(ref _khmerSymbols, first: '\u19E0', last: '\u19FF'); - private static UnicodeRange _khmerSymbols; - - /// - /// A corresponding to the 'Buginese' Unicode block (U+1A00..U+1A1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Buginese => Volatile.Read(ref _buginese) ?? CreateRange(ref _buginese, first: '\u1A00', last: '\u1A1F'); - private static UnicodeRange _buginese; - - /// - /// A corresponding to the 'Tai Tham' Unicode block (U+1A20..U+1AAF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1A20.pdf for the full set of characters in this block. - /// - public static UnicodeRange TaiTham => Volatile.Read(ref _taiTham) ?? CreateRange(ref _taiTham, first: '\u1A20', last: '\u1AAF'); - private static UnicodeRange _taiTham; - - /// - /// A corresponding to the 'Combining Diacritical Marks Extended' Unicode block (U+1AB0..U+1AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1AB0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarksExtended => Volatile.Read(ref _combiningDiacriticalMarksExtended) ?? CreateRange(ref _combiningDiacriticalMarksExtended, first: '\u1AB0', last: '\u1AFF'); - private static UnicodeRange _combiningDiacriticalMarksExtended; - - /// - /// A corresponding to the 'Balinese' Unicode block (U+1B00..U+1B7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Balinese => Volatile.Read(ref _balinese) ?? CreateRange(ref _balinese, first: '\u1B00', last: '\u1B7F'); - private static UnicodeRange _balinese; - - /// - /// A corresponding to the 'Sundanese' Unicode block (U+1B80..U+1BBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1B80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Sundanese => Volatile.Read(ref _sundanese) ?? CreateRange(ref _sundanese, first: '\u1B80', last: '\u1BBF'); - private static UnicodeRange _sundanese; - - /// - /// A corresponding to the 'Batak' Unicode block (U+1BC0..U+1BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1BC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Batak => Volatile.Read(ref _batak) ?? CreateRange(ref _batak, first: '\u1BC0', last: '\u1BFF'); - private static UnicodeRange _batak; - - /// - /// A corresponding to the 'Lepcha' Unicode block (U+1C00..U+1C4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Lepcha => Volatile.Read(ref _lepcha) ?? CreateRange(ref _lepcha, first: '\u1C00', last: '\u1C4F'); - private static UnicodeRange _lepcha; - - /// - /// A corresponding to the 'Ol Chiki' Unicode block (U+1C50..U+1C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1C50.pdf for the full set of characters in this block. - /// - public static UnicodeRange OlChiki => Volatile.Read(ref _olChiki) ?? CreateRange(ref _olChiki, first: '\u1C50', last: '\u1C7F'); - private static UnicodeRange _olChiki; - - /// - /// A corresponding to the 'Sundanese Supplement' Unicode block (U+1CC0..U+1CCF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange SundaneseSupplement => Volatile.Read(ref _sundaneseSupplement) ?? CreateRange(ref _sundaneseSupplement, first: '\u1CC0', last: '\u1CCF'); - private static UnicodeRange _sundaneseSupplement; - - /// - /// A corresponding to the 'Vedic Extensions' Unicode block (U+1CD0..U+1CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1CD0.pdf for the full set of characters in this block. - /// - public static UnicodeRange VedicExtensions => Volatile.Read(ref _vedicExtensions) ?? CreateRange(ref _vedicExtensions, first: '\u1CD0', last: '\u1CFF'); - private static UnicodeRange _vedicExtensions; - - /// - /// A corresponding to the 'Phonetic Extensions' Unicode block (U+1D00..U+1D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D00.pdf for the full set of characters in this block. - /// - public static UnicodeRange PhoneticExtensions => Volatile.Read(ref _phoneticExtensions) ?? CreateRange(ref _phoneticExtensions, first: '\u1D00', last: '\u1D7F'); - private static UnicodeRange _phoneticExtensions; - - /// - /// A corresponding to the 'Phonetic Extensions Supplement' Unicode block (U+1D80..U+1DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1D80.pdf for the full set of characters in this block. - /// - public static UnicodeRange PhoneticExtensionsSupplement => Volatile.Read(ref _phoneticExtensionsSupplement) ?? CreateRange(ref _phoneticExtensionsSupplement, first: '\u1D80', last: '\u1DBF'); - private static UnicodeRange _phoneticExtensionsSupplement; - - /// - /// A corresponding to the 'Combining Diacritical Marks Supplement' Unicode block (U+1DC0..U+1DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1DC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarksSupplement => Volatile.Read(ref _combiningDiacriticalMarksSupplement) ?? CreateRange(ref _combiningDiacriticalMarksSupplement, first: '\u1DC0', last: '\u1DFF'); - private static UnicodeRange _combiningDiacriticalMarksSupplement; - - /// - /// A corresponding to the 'Latin Extended Additional' Unicode block (U+1E00..U+1EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedAdditional => Volatile.Read(ref _latinExtendedAdditional) ?? CreateRange(ref _latinExtendedAdditional, first: '\u1E00', last: '\u1EFF'); - private static UnicodeRange _latinExtendedAdditional; - - /// - /// A corresponding to the 'Greek Extended' Unicode block (U+1F00..U+1FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U1F00.pdf for the full set of characters in this block. - /// - public static UnicodeRange GreekExtended => Volatile.Read(ref _greekExtended) ?? CreateRange(ref _greekExtended, first: '\u1F00', last: '\u1FFF'); - private static UnicodeRange _greekExtended; - - /// - /// A corresponding to the 'General Punctuation' Unicode block (U+2000..U+206F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2000.pdf for the full set of characters in this block. - /// - public static UnicodeRange GeneralPunctuation => Volatile.Read(ref _generalPunctuation) ?? CreateRange(ref _generalPunctuation, first: '\u2000', last: '\u206F'); - private static UnicodeRange _generalPunctuation; - - /// - /// A corresponding to the 'Superscripts and Subscripts' Unicode block (U+2070..U+209F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2070.pdf for the full set of characters in this block. - /// - public static UnicodeRange SuperscriptsandSubscripts => Volatile.Read(ref _superscriptsandSubscripts) ?? CreateRange(ref _superscriptsandSubscripts, first: '\u2070', last: '\u209F'); - private static UnicodeRange _superscriptsandSubscripts; - - /// - /// A corresponding to the 'Currency Symbols' Unicode block (U+20A0..U+20CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CurrencySymbols => Volatile.Read(ref _currencySymbols) ?? CreateRange(ref _currencySymbols, first: '\u20A0', last: '\u20CF'); - private static UnicodeRange _currencySymbols; - - /// - /// A corresponding to the 'Combining Diacritical Marks for Symbols' Unicode block (U+20D0..U+20FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U20D0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningDiacriticalMarksforSymbols => Volatile.Read(ref _combiningDiacriticalMarksforSymbols) ?? CreateRange(ref _combiningDiacriticalMarksforSymbols, first: '\u20D0', last: '\u20FF'); - private static UnicodeRange _combiningDiacriticalMarksforSymbols; - - /// - /// A corresponding to the 'Letterlike Symbols' Unicode block (U+2100..U+214F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2100.pdf for the full set of characters in this block. - /// - public static UnicodeRange LetterlikeSymbols => Volatile.Read(ref _letterlikeSymbols) ?? CreateRange(ref _letterlikeSymbols, first: '\u2100', last: '\u214F'); - private static UnicodeRange _letterlikeSymbols; - - /// - /// A corresponding to the 'Number Forms' Unicode block (U+2150..U+218F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2150.pdf for the full set of characters in this block. - /// - public static UnicodeRange NumberForms => Volatile.Read(ref _numberForms) ?? CreateRange(ref _numberForms, first: '\u2150', last: '\u218F'); - private static UnicodeRange _numberForms; - - /// - /// A corresponding to the 'Arrows' Unicode block (U+2190..U+21FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2190.pdf for the full set of characters in this block. - /// - public static UnicodeRange Arrows => Volatile.Read(ref _arrows) ?? CreateRange(ref _arrows, first: '\u2190', last: '\u21FF'); - private static UnicodeRange _arrows; - - /// - /// A corresponding to the 'Mathematical Operators' Unicode block (U+2200..U+22FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2200.pdf for the full set of characters in this block. - /// - public static UnicodeRange MathematicalOperators => Volatile.Read(ref _mathematicalOperators) ?? CreateRange(ref _mathematicalOperators, first: '\u2200', last: '\u22FF'); - private static UnicodeRange _mathematicalOperators; - - /// - /// A corresponding to the 'Miscellaneous Technical' Unicode block (U+2300..U+23FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2300.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousTechnical => Volatile.Read(ref _miscellaneousTechnical) ?? CreateRange(ref _miscellaneousTechnical, first: '\u2300', last: '\u23FF'); - private static UnicodeRange _miscellaneousTechnical; - - /// - /// A corresponding to the 'Control Pictures' Unicode block (U+2400..U+243F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2400.pdf for the full set of characters in this block. - /// - public static UnicodeRange ControlPictures => Volatile.Read(ref _controlPictures) ?? CreateRange(ref _controlPictures, first: '\u2400', last: '\u243F'); - private static UnicodeRange _controlPictures; - - /// - /// A corresponding to the 'Optical Character Recognition' Unicode block (U+2440..U+245F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2440.pdf for the full set of characters in this block. - /// - public static UnicodeRange OpticalCharacterRecognition => Volatile.Read(ref _opticalCharacterRecognition) ?? CreateRange(ref _opticalCharacterRecognition, first: '\u2440', last: '\u245F'); - private static UnicodeRange _opticalCharacterRecognition; - - /// - /// A corresponding to the 'Enclosed Alphanumerics' Unicode block (U+2460..U+24FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2460.pdf for the full set of characters in this block. - /// - public static UnicodeRange EnclosedAlphanumerics => Volatile.Read(ref _enclosedAlphanumerics) ?? CreateRange(ref _enclosedAlphanumerics, first: '\u2460', last: '\u24FF'); - private static UnicodeRange _enclosedAlphanumerics; - - /// - /// A corresponding to the 'Box Drawing' Unicode block (U+2500..U+257F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2500.pdf for the full set of characters in this block. - /// - public static UnicodeRange BoxDrawing => Volatile.Read(ref _boxDrawing) ?? CreateRange(ref _boxDrawing, first: '\u2500', last: '\u257F'); - private static UnicodeRange _boxDrawing; - - /// - /// A corresponding to the 'Block Elements' Unicode block (U+2580..U+259F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2580.pdf for the full set of characters in this block. - /// - public static UnicodeRange BlockElements => Volatile.Read(ref _blockElements) ?? CreateRange(ref _blockElements, first: '\u2580', last: '\u259F'); - private static UnicodeRange _blockElements; - - /// - /// A corresponding to the 'Geometric Shapes' Unicode block (U+25A0..U+25FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U25A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange GeometricShapes => Volatile.Read(ref _geometricShapes) ?? CreateRange(ref _geometricShapes, first: '\u25A0', last: '\u25FF'); - private static UnicodeRange _geometricShapes; - - /// - /// A corresponding to the 'Miscellaneous Symbols' Unicode block (U+2600..U+26FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2600.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousSymbols => Volatile.Read(ref _miscellaneousSymbols) ?? CreateRange(ref _miscellaneousSymbols, first: '\u2600', last: '\u26FF'); - private static UnicodeRange _miscellaneousSymbols; - - /// - /// A corresponding to the 'Dingbats' Unicode block (U+2700..U+27BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2700.pdf for the full set of characters in this block. - /// - public static UnicodeRange Dingbats => Volatile.Read(ref _dingbats) ?? CreateRange(ref _dingbats, first: '\u2700', last: '\u27BF'); - private static UnicodeRange _dingbats; - - /// - /// A corresponding to the 'Miscellaneous Mathematical Symbols-A' Unicode block (U+27C0..U+27EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27C0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousMathematicalSymbolsA => Volatile.Read(ref _miscellaneousMathematicalSymbolsA) ?? CreateRange(ref _miscellaneousMathematicalSymbolsA, first: '\u27C0', last: '\u27EF'); - private static UnicodeRange _miscellaneousMathematicalSymbolsA; - - /// - /// A corresponding to the 'Supplemental Arrows-A' Unicode block (U+27F0..U+27FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U27F0.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalArrowsA => Volatile.Read(ref _supplementalArrowsA) ?? CreateRange(ref _supplementalArrowsA, first: '\u27F0', last: '\u27FF'); - private static UnicodeRange _supplementalArrowsA; - - /// - /// A corresponding to the 'Braille Patterns' Unicode block (U+2800..U+28FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2800.pdf for the full set of characters in this block. - /// - public static UnicodeRange BraillePatterns => Volatile.Read(ref _braillePatterns) ?? CreateRange(ref _braillePatterns, first: '\u2800', last: '\u28FF'); - private static UnicodeRange _braillePatterns; - - /// - /// A corresponding to the 'Supplemental Arrows-B' Unicode block (U+2900..U+297F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2900.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalArrowsB => Volatile.Read(ref _supplementalArrowsB) ?? CreateRange(ref _supplementalArrowsB, first: '\u2900', last: '\u297F'); - private static UnicodeRange _supplementalArrowsB; - - /// - /// A corresponding to the 'Miscellaneous Mathematical Symbols-B' Unicode block (U+2980..U+29FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2980.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousMathematicalSymbolsB => Volatile.Read(ref _miscellaneousMathematicalSymbolsB) ?? CreateRange(ref _miscellaneousMathematicalSymbolsB, first: '\u2980', last: '\u29FF'); - private static UnicodeRange _miscellaneousMathematicalSymbolsB; - - /// - /// A corresponding to the 'Supplemental Mathematical Operators' Unicode block (U+2A00..U+2AFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2A00.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalMathematicalOperators => Volatile.Read(ref _supplementalMathematicalOperators) ?? CreateRange(ref _supplementalMathematicalOperators, first: '\u2A00', last: '\u2AFF'); - private static UnicodeRange _supplementalMathematicalOperators; - - /// - /// A corresponding to the 'Miscellaneous Symbols and Arrows' Unicode block (U+2B00..U+2BFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2B00.pdf for the full set of characters in this block. - /// - public static UnicodeRange MiscellaneousSymbolsandArrows => Volatile.Read(ref _miscellaneousSymbolsandArrows) ?? CreateRange(ref _miscellaneousSymbolsandArrows, first: '\u2B00', last: '\u2BFF'); - private static UnicodeRange _miscellaneousSymbolsandArrows; - - /// - /// A corresponding to the 'Glagolitic' Unicode block (U+2C00..U+2C5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Glagolitic => Volatile.Read(ref _glagolitic) ?? CreateRange(ref _glagolitic, first: '\u2C00', last: '\u2C5F'); - private static UnicodeRange _glagolitic; - - /// - /// A corresponding to the 'Latin Extended-C' Unicode block (U+2C60..U+2C7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C60.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedC => Volatile.Read(ref _latinExtendedC) ?? CreateRange(ref _latinExtendedC, first: '\u2C60', last: '\u2C7F'); - private static UnicodeRange _latinExtendedC; - - /// - /// A corresponding to the 'Coptic' Unicode block (U+2C80..U+2CFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2C80.pdf for the full set of characters in this block. - /// - public static UnicodeRange Coptic => Volatile.Read(ref _coptic) ?? CreateRange(ref _coptic, first: '\u2C80', last: '\u2CFF'); - private static UnicodeRange _coptic; - - /// - /// A corresponding to the 'Georgian Supplement' Unicode block (U+2D00..U+2D2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D00.pdf for the full set of characters in this block. - /// - public static UnicodeRange GeorgianSupplement => Volatile.Read(ref _georgianSupplement) ?? CreateRange(ref _georgianSupplement, first: '\u2D00', last: '\u2D2F'); - private static UnicodeRange _georgianSupplement; - - /// - /// A corresponding to the 'Tifinagh' Unicode block (U+2D30..U+2D7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D30.pdf for the full set of characters in this block. - /// - public static UnicodeRange Tifinagh => Volatile.Read(ref _tifinagh) ?? CreateRange(ref _tifinagh, first: '\u2D30', last: '\u2D7F'); - private static UnicodeRange _tifinagh; - - /// - /// A corresponding to the 'Ethiopic Extended' Unicode block (U+2D80..U+2DDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2D80.pdf for the full set of characters in this block. - /// - public static UnicodeRange EthiopicExtended => Volatile.Read(ref _ethiopicExtended) ?? CreateRange(ref _ethiopicExtended, first: '\u2D80', last: '\u2DDF'); - private static UnicodeRange _ethiopicExtended; - - /// - /// A corresponding to the 'Cyrillic Extended-A' Unicode block (U+2DE0..U+2DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2DE0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CyrillicExtendedA => Volatile.Read(ref _cyrillicExtendedA) ?? CreateRange(ref _cyrillicExtendedA, first: '\u2DE0', last: '\u2DFF'); - private static UnicodeRange _cyrillicExtendedA; - - /// - /// A corresponding to the 'Supplemental Punctuation' Unicode block (U+2E00..U+2E7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange SupplementalPunctuation => Volatile.Read(ref _supplementalPunctuation) ?? CreateRange(ref _supplementalPunctuation, first: '\u2E00', last: '\u2E7F'); - private static UnicodeRange _supplementalPunctuation; - - /// - /// A corresponding to the 'CJK Radicals Supplement' Unicode block (U+2E80..U+2EFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2E80.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKRadicalsSupplement => Volatile.Read(ref _cjkRadicalsSupplement) ?? CreateRange(ref _cjkRadicalsSupplement, first: '\u2E80', last: '\u2EFF'); - private static UnicodeRange _cjkRadicalsSupplement; - - /// - /// A corresponding to the 'Kangxi Radicals' Unicode block (U+2F00..U+2FDF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2F00.pdf for the full set of characters in this block. - /// - public static UnicodeRange KangxiRadicals => Volatile.Read(ref _kangxiRadicals) ?? CreateRange(ref _kangxiRadicals, first: '\u2F00', last: '\u2FDF'); - private static UnicodeRange _kangxiRadicals; - - /// - /// A corresponding to the 'Ideographic Description Characters' Unicode block (U+2FF0..U+2FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U2FF0.pdf for the full set of characters in this block. - /// - public static UnicodeRange IdeographicDescriptionCharacters => Volatile.Read(ref _ideographicDescriptionCharacters) ?? CreateRange(ref _ideographicDescriptionCharacters, first: '\u2FF0', last: '\u2FFF'); - private static UnicodeRange _ideographicDescriptionCharacters; - - /// - /// A corresponding to the 'CJK Symbols and Punctuation' Unicode block (U+3000..U+303F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3000.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKSymbolsandPunctuation => Volatile.Read(ref _cjkSymbolsandPunctuation) ?? CreateRange(ref _cjkSymbolsandPunctuation, first: '\u3000', last: '\u303F'); - private static UnicodeRange _cjkSymbolsandPunctuation; - - /// - /// A corresponding to the 'Hiragana' Unicode block (U+3040..U+309F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3040.pdf for the full set of characters in this block. - /// - public static UnicodeRange Hiragana => Volatile.Read(ref _hiragana) ?? CreateRange(ref _hiragana, first: '\u3040', last: '\u309F'); - private static UnicodeRange _hiragana; - - /// - /// A corresponding to the 'Katakana' Unicode block (U+30A0..U+30FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U30A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Katakana => Volatile.Read(ref _katakana) ?? CreateRange(ref _katakana, first: '\u30A0', last: '\u30FF'); - private static UnicodeRange _katakana; - - /// - /// A corresponding to the 'Bopomofo' Unicode block (U+3100..U+312F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3100.pdf for the full set of characters in this block. - /// - public static UnicodeRange Bopomofo => Volatile.Read(ref _bopomofo) ?? CreateRange(ref _bopomofo, first: '\u3100', last: '\u312F'); - private static UnicodeRange _bopomofo; - - /// - /// A corresponding to the 'Hangul Compatibility Jamo' Unicode block (U+3130..U+318F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3130.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulCompatibilityJamo => Volatile.Read(ref _hangulCompatibilityJamo) ?? CreateRange(ref _hangulCompatibilityJamo, first: '\u3130', last: '\u318F'); - private static UnicodeRange _hangulCompatibilityJamo; - - /// - /// A corresponding to the 'Kanbun' Unicode block (U+3190..U+319F). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3190.pdf for the full set of characters in this block. - /// - public static UnicodeRange Kanbun => Volatile.Read(ref _kanbun) ?? CreateRange(ref _kanbun, first: '\u3190', last: '\u319F'); - private static UnicodeRange _kanbun; - - /// - /// A corresponding to the 'Bopomofo Extended' Unicode block (U+31A0..U+31BF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange BopomofoExtended => Volatile.Read(ref _bopomofoExtended) ?? CreateRange(ref _bopomofoExtended, first: '\u31A0', last: '\u31BF'); - private static UnicodeRange _bopomofoExtended; - - /// - /// A corresponding to the 'CJK Strokes' Unicode block (U+31C0..U+31EF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31C0.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKStrokes => Volatile.Read(ref _cjkStrokes) ?? CreateRange(ref _cjkStrokes, first: '\u31C0', last: '\u31EF'); - private static UnicodeRange _cjkStrokes; - - /// - /// A corresponding to the 'Katakana Phonetic Extensions' Unicode block (U+31F0..U+31FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U31F0.pdf for the full set of characters in this block. - /// - public static UnicodeRange KatakanaPhoneticExtensions => Volatile.Read(ref _katakanaPhoneticExtensions) ?? CreateRange(ref _katakanaPhoneticExtensions, first: '\u31F0', last: '\u31FF'); - private static UnicodeRange _katakanaPhoneticExtensions; - - /// - /// A corresponding to the 'Enclosed CJK Letters and Months' Unicode block (U+3200..U+32FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3200.pdf for the full set of characters in this block. - /// - public static UnicodeRange EnclosedCJKLettersandMonths => Volatile.Read(ref _enclosedCJKLettersandMonths) ?? CreateRange(ref _enclosedCJKLettersandMonths, first: '\u3200', last: '\u32FF'); - private static UnicodeRange _enclosedCJKLettersandMonths; - - /// - /// A corresponding to the 'CJK Compatibility' Unicode block (U+3300..U+33FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3300.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKCompatibility => Volatile.Read(ref _cjkCompatibility) ?? CreateRange(ref _cjkCompatibility, first: '\u3300', last: '\u33FF'); - private static UnicodeRange _cjkCompatibility; - - /// - /// A corresponding to the 'CJK Unified Ideographs Extension A' Unicode block (U+3400..U+4DBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U3400.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKUnifiedIdeographsExtensionA => Volatile.Read(ref _cjkUnifiedIdeographsExtensionA) ?? CreateRange(ref _cjkUnifiedIdeographsExtensionA, first: '\u3400', last: '\u4DBF'); - private static UnicodeRange _cjkUnifiedIdeographsExtensionA; - - /// - /// A corresponding to the 'Yijing Hexagram Symbols' Unicode block (U+4DC0..U+4DFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4DC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange YijingHexagramSymbols => Volatile.Read(ref _yijingHexagramSymbols) ?? CreateRange(ref _yijingHexagramSymbols, first: '\u4DC0', last: '\u4DFF'); - private static UnicodeRange _yijingHexagramSymbols; - - /// - /// A corresponding to the 'CJK Unified Ideographs' Unicode block (U+4E00..U+9FFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/U4E00.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKUnifiedIdeographs => Volatile.Read(ref _cjkUnifiedIdeographs) ?? CreateRange(ref _cjkUnifiedIdeographs, first: '\u4E00', last: '\u9FFF'); - private static UnicodeRange _cjkUnifiedIdeographs; - - /// - /// A corresponding to the 'Yi Syllables' Unicode block (U+A000..U+A48F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA000.pdf for the full set of characters in this block. - /// - public static UnicodeRange YiSyllables => Volatile.Read(ref _yiSyllables) ?? CreateRange(ref _yiSyllables, first: '\uA000', last: '\uA48F'); - private static UnicodeRange _yiSyllables; - - /// - /// A corresponding to the 'Yi Radicals' Unicode block (U+A490..U+A4CF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA490.pdf for the full set of characters in this block. - /// - public static UnicodeRange YiRadicals => Volatile.Read(ref _yiRadicals) ?? CreateRange(ref _yiRadicals, first: '\uA490', last: '\uA4CF'); - private static UnicodeRange _yiRadicals; - - /// - /// A corresponding to the 'Lisu' Unicode block (U+A4D0..U+A4FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA4D0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Lisu => Volatile.Read(ref _lisu) ?? CreateRange(ref _lisu, first: '\uA4D0', last: '\uA4FF'); - private static UnicodeRange _lisu; - - /// - /// A corresponding to the 'Vai' Unicode block (U+A500..U+A63F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA500.pdf for the full set of characters in this block. - /// - public static UnicodeRange Vai => Volatile.Read(ref _vai) ?? CreateRange(ref _vai, first: '\uA500', last: '\uA63F'); - private static UnicodeRange _vai; - - /// - /// A corresponding to the 'Cyrillic Extended-B' Unicode block (U+A640..U+A69F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA640.pdf for the full set of characters in this block. - /// - public static UnicodeRange CyrillicExtendedB => Volatile.Read(ref _cyrillicExtendedB) ?? CreateRange(ref _cyrillicExtendedB, first: '\uA640', last: '\uA69F'); - private static UnicodeRange _cyrillicExtendedB; - - /// - /// A corresponding to the 'Bamum' Unicode block (U+A6A0..U+A6FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA6A0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Bamum => Volatile.Read(ref _bamum) ?? CreateRange(ref _bamum, first: '\uA6A0', last: '\uA6FF'); - private static UnicodeRange _bamum; - - /// - /// A corresponding to the 'Modifier Tone Letters' Unicode block (U+A700..U+A71F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA700.pdf for the full set of characters in this block. - /// - public static UnicodeRange ModifierToneLetters => Volatile.Read(ref _modifierToneLetters) ?? CreateRange(ref _modifierToneLetters, first: '\uA700', last: '\uA71F'); - private static UnicodeRange _modifierToneLetters; - - /// - /// A corresponding to the 'Latin Extended-D' Unicode block (U+A720..U+A7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA720.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedD => Volatile.Read(ref _latinExtendedD) ?? CreateRange(ref _latinExtendedD, first: '\uA720', last: '\uA7FF'); - private static UnicodeRange _latinExtendedD; - - /// - /// A corresponding to the 'Syloti Nagri' Unicode block (U+A800..U+A82F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA800.pdf for the full set of characters in this block. - /// - public static UnicodeRange SylotiNagri => Volatile.Read(ref _sylotiNagri) ?? CreateRange(ref _sylotiNagri, first: '\uA800', last: '\uA82F'); - private static UnicodeRange _sylotiNagri; - - /// - /// A corresponding to the 'Common Indic Number Forms' Unicode block (U+A830..U+A83F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA830.pdf for the full set of characters in this block. - /// - public static UnicodeRange CommonIndicNumberForms => Volatile.Read(ref _commonIndicNumberForms) ?? CreateRange(ref _commonIndicNumberForms, first: '\uA830', last: '\uA83F'); - private static UnicodeRange _commonIndicNumberForms; - - /// - /// A corresponding to the 'Phags-pa' Unicode block (U+A840..U+A87F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA840.pdf for the full set of characters in this block. - /// - public static UnicodeRange Phagspa => Volatile.Read(ref _phagspa) ?? CreateRange(ref _phagspa, first: '\uA840', last: '\uA87F'); - private static UnicodeRange _phagspa; - - /// - /// A corresponding to the 'Saurashtra' Unicode block (U+A880..U+A8DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA880.pdf for the full set of characters in this block. - /// - public static UnicodeRange Saurashtra => Volatile.Read(ref _saurashtra) ?? CreateRange(ref _saurashtra, first: '\uA880', last: '\uA8DF'); - private static UnicodeRange _saurashtra; - - /// - /// A corresponding to the 'Devanagari Extended' Unicode block (U+A8E0..U+A8FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA8E0.pdf for the full set of characters in this block. - /// - public static UnicodeRange DevanagariExtended => Volatile.Read(ref _devanagariExtended) ?? CreateRange(ref _devanagariExtended, first: '\uA8E0', last: '\uA8FF'); - private static UnicodeRange _devanagariExtended; - - /// - /// A corresponding to the 'Kayah Li' Unicode block (U+A900..U+A92F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA900.pdf for the full set of characters in this block. - /// - public static UnicodeRange KayahLi => Volatile.Read(ref _kayahLi) ?? CreateRange(ref _kayahLi, first: '\uA900', last: '\uA92F'); - private static UnicodeRange _kayahLi; - - /// - /// A corresponding to the 'Rejang' Unicode block (U+A930..U+A95F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA930.pdf for the full set of characters in this block. - /// - public static UnicodeRange Rejang => Volatile.Read(ref _rejang) ?? CreateRange(ref _rejang, first: '\uA930', last: '\uA95F'); - private static UnicodeRange _rejang; - - /// - /// A corresponding to the 'Hangul Jamo Extended-A' Unicode block (U+A960..U+A97F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA960.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulJamoExtendedA => Volatile.Read(ref _hangulJamoExtendedA) ?? CreateRange(ref _hangulJamoExtendedA, first: '\uA960', last: '\uA97F'); - private static UnicodeRange _hangulJamoExtendedA; - - /// - /// A corresponding to the 'Javanese' Unicode block (U+A980..U+A9DF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA980.pdf for the full set of characters in this block. - /// - public static UnicodeRange Javanese => Volatile.Read(ref _javanese) ?? CreateRange(ref _javanese, first: '\uA980', last: '\uA9DF'); - private static UnicodeRange _javanese; - - /// - /// A corresponding to the 'Myanmar Extended-B' Unicode block (U+A9E0..U+A9FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UA9E0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MyanmarExtendedB => Volatile.Read(ref _myanmarExtendedB) ?? CreateRange(ref _myanmarExtendedB, first: '\uA9E0', last: '\uA9FF'); - private static UnicodeRange _myanmarExtendedB; - - /// - /// A corresponding to the 'Cham' Unicode block (U+AA00..U+AA5F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA00.pdf for the full set of characters in this block. - /// - public static UnicodeRange Cham => Volatile.Read(ref _cham) ?? CreateRange(ref _cham, first: '\uAA00', last: '\uAA5F'); - private static UnicodeRange _cham; - - /// - /// A corresponding to the 'Myanmar Extended-A' Unicode block (U+AA60..U+AA7F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA60.pdf for the full set of characters in this block. - /// - public static UnicodeRange MyanmarExtendedA => Volatile.Read(ref _myanmarExtendedA) ?? CreateRange(ref _myanmarExtendedA, first: '\uAA60', last: '\uAA7F'); - private static UnicodeRange _myanmarExtendedA; - - /// - /// A corresponding to the 'Tai Viet' Unicode block (U+AA80..U+AADF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAA80.pdf for the full set of characters in this block. - /// - public static UnicodeRange TaiViet => Volatile.Read(ref _taiViet) ?? CreateRange(ref _taiViet, first: '\uAA80', last: '\uAADF'); - private static UnicodeRange _taiViet; - - /// - /// A corresponding to the 'Meetei Mayek Extensions' Unicode block (U+AAE0..U+AAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAAE0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MeeteiMayekExtensions => Volatile.Read(ref _meeteiMayekExtensions) ?? CreateRange(ref _meeteiMayekExtensions, first: '\uAAE0', last: '\uAAFF'); - private static UnicodeRange _meeteiMayekExtensions; - - /// - /// A corresponding to the 'Ethiopic Extended-A' Unicode block (U+AB00..U+AB2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB00.pdf for the full set of characters in this block. - /// - public static UnicodeRange EthiopicExtendedA => Volatile.Read(ref _ethiopicExtendedA) ?? CreateRange(ref _ethiopicExtendedA, first: '\uAB00', last: '\uAB2F'); - private static UnicodeRange _ethiopicExtendedA; - - /// - /// A corresponding to the 'Latin Extended-E' Unicode block (U+AB30..U+AB6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB30.pdf for the full set of characters in this block. - /// - public static UnicodeRange LatinExtendedE => Volatile.Read(ref _latinExtendedE) ?? CreateRange(ref _latinExtendedE, first: '\uAB30', last: '\uAB6F'); - private static UnicodeRange _latinExtendedE; - - /// - /// A corresponding to the 'Cherokee Supplement' Unicode block (U+AB70..U+ABBF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAB70.pdf for the full set of characters in this block. - /// - public static UnicodeRange CherokeeSupplement => Volatile.Read(ref _cherokeeSupplement) ?? CreateRange(ref _cherokeeSupplement, first: '\uAB70', last: '\uABBF'); - private static UnicodeRange _cherokeeSupplement; - - /// - /// A corresponding to the 'Meetei Mayek' Unicode block (U+ABC0..U+ABFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UABC0.pdf for the full set of characters in this block. - /// - public static UnicodeRange MeeteiMayek => Volatile.Read(ref _meeteiMayek) ?? CreateRange(ref _meeteiMayek, first: '\uABC0', last: '\uABFF'); - private static UnicodeRange _meeteiMayek; - - /// - /// A corresponding to the 'Hangul Syllables' Unicode block (U+AC00..U+D7AF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UAC00.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulSyllables => Volatile.Read(ref _hangulSyllables) ?? CreateRange(ref _hangulSyllables, first: '\uAC00', last: '\uD7AF'); - private static UnicodeRange _hangulSyllables; - - /// - /// A corresponding to the 'Hangul Jamo Extended-B' Unicode block (U+D7B0..U+D7FF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UD7B0.pdf for the full set of characters in this block. - /// - public static UnicodeRange HangulJamoExtendedB => Volatile.Read(ref _hangulJamoExtendedB) ?? CreateRange(ref _hangulJamoExtendedB, first: '\uD7B0', last: '\uD7FF'); - private static UnicodeRange _hangulJamoExtendedB; - - /// - /// A corresponding to the 'CJK Compatibility Ideographs' Unicode block (U+F900..U+FAFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UF900.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKCompatibilityIdeographs => Volatile.Read(ref _cjkCompatibilityIdeographs) ?? CreateRange(ref _cjkCompatibilityIdeographs, first: '\uF900', last: '\uFAFF'); - private static UnicodeRange _cjkCompatibilityIdeographs; - - /// - /// A corresponding to the 'Alphabetic Presentation Forms' Unicode block (U+FB00..U+FB4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB00.pdf for the full set of characters in this block. - /// - public static UnicodeRange AlphabeticPresentationForms => Volatile.Read(ref _alphabeticPresentationForms) ?? CreateRange(ref _alphabeticPresentationForms, first: '\uFB00', last: '\uFB4F'); - private static UnicodeRange _alphabeticPresentationForms; - - /// - /// A corresponding to the 'Arabic Presentation Forms-A' Unicode block (U+FB50..U+FDFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFB50.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicPresentationFormsA => Volatile.Read(ref _arabicPresentationFormsA) ?? CreateRange(ref _arabicPresentationFormsA, first: '\uFB50', last: '\uFDFF'); - private static UnicodeRange _arabicPresentationFormsA; - - /// - /// A corresponding to the 'Variation Selectors' Unicode block (U+FE00..U+FE0F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE00.pdf for the full set of characters in this block. - /// - public static UnicodeRange VariationSelectors => Volatile.Read(ref _variationSelectors) ?? CreateRange(ref _variationSelectors, first: '\uFE00', last: '\uFE0F'); - private static UnicodeRange _variationSelectors; - - /// - /// A corresponding to the 'Vertical Forms' Unicode block (U+FE10..U+FE1F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE10.pdf for the full set of characters in this block. - /// - public static UnicodeRange VerticalForms => Volatile.Read(ref _verticalForms) ?? CreateRange(ref _verticalForms, first: '\uFE10', last: '\uFE1F'); - private static UnicodeRange _verticalForms; - - /// - /// A corresponding to the 'Combining Half Marks' Unicode block (U+FE20..U+FE2F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE20.pdf for the full set of characters in this block. - /// - public static UnicodeRange CombiningHalfMarks => Volatile.Read(ref _combiningHalfMarks) ?? CreateRange(ref _combiningHalfMarks, first: '\uFE20', last: '\uFE2F'); - private static UnicodeRange _combiningHalfMarks; - - /// - /// A corresponding to the 'CJK Compatibility Forms' Unicode block (U+FE30..U+FE4F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE30.pdf for the full set of characters in this block. - /// - public static UnicodeRange CJKCompatibilityForms => Volatile.Read(ref _cjkCompatibilityForms) ?? CreateRange(ref _cjkCompatibilityForms, first: '\uFE30', last: '\uFE4F'); - private static UnicodeRange _cjkCompatibilityForms; - - /// - /// A corresponding to the 'Small Form Variants' Unicode block (U+FE50..U+FE6F). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE50.pdf for the full set of characters in this block. - /// - public static UnicodeRange SmallFormVariants => Volatile.Read(ref _smallFormVariants) ?? CreateRange(ref _smallFormVariants, first: '\uFE50', last: '\uFE6F'); - private static UnicodeRange _smallFormVariants; - - /// - /// A corresponding to the 'Arabic Presentation Forms-B' Unicode block (U+FE70..U+FEFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFE70.pdf for the full set of characters in this block. - /// - public static UnicodeRange ArabicPresentationFormsB => Volatile.Read(ref _arabicPresentationFormsB) ?? CreateRange(ref _arabicPresentationFormsB, first: '\uFE70', last: '\uFEFF'); - private static UnicodeRange _arabicPresentationFormsB; - - /// - /// A corresponding to the 'Halfwidth and Fullwidth Forms' Unicode block (U+FF00..U+FFEF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFF00.pdf for the full set of characters in this block. - /// - public static UnicodeRange HalfwidthandFullwidthForms => Volatile.Read(ref _halfwidthandFullwidthForms) ?? CreateRange(ref _halfwidthandFullwidthForms, first: '\uFF00', last: '\uFFEF'); - private static UnicodeRange _halfwidthandFullwidthForms; - - /// - /// A corresponding to the 'Specials' Unicode block (U+FFF0..U+FFFF). - /// - /// - /// See http://www.unicode.org/charts/PDF/UFFF0.pdf for the full set of characters in this block. - /// - public static UnicodeRange Specials => Volatile.Read(ref _specials) ?? CreateRange(ref _specials, first: '\uFFF0', last: '\uFFFF'); - private static UnicodeRange _specials; - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs b/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs deleted file mode 100644 index f5d6ea1c99..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/UrlEncoder.cs +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Runtime.CompilerServices; -using System.Threading; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// A class which can perform URL string escaping given an allow list of characters which - /// can be represented unescaped. - /// - /// - /// Instances of this type will always encode a certain set of characters (such as + - /// and ?), even if the filter provided in the constructor allows such characters. - /// Once constructed, instances of this class are thread-safe for multiple callers. - /// - public sealed class UrlEncoder : IUrlEncoder - { - // The default URL string encoder (Basic Latin), instantiated on demand - private static UrlEncoder _defaultEncoder; - - // The inner encoder, responsible for the actual encoding routines - private readonly UrlUnicodeEncoder _innerUnicodeEncoder; - - /// - /// Instantiates an encoder using as its allow list. - /// Any character not in the range will be escaped. - /// - public UrlEncoder() - : this(UrlUnicodeEncoder.BasicLatin) - { - } - - /// - /// Instantiates an encoder specifying which Unicode character ranges are allowed to - /// pass through the encoder unescaped. Any character not in the set of ranges specified - /// by will be escaped. - /// - public UrlEncoder(params UnicodeRange[] allowedRanges) - : this(new UrlUnicodeEncoder(new CodePointFilter(allowedRanges))) - { - } - - /// - /// Instantiates an encoder using a custom code point filter. Any character not in the - /// set returned by 's - /// method will be escaped. - /// - public UrlEncoder(ICodePointFilter filter) - : this(new UrlUnicodeEncoder(CodePointFilter.Wrap(filter))) - { - if (filter == null) - { - throw new ArgumentNullException(nameof(filter)); - } - } - - private UrlEncoder(UrlUnicodeEncoder innerEncoder) - { - Debug.Assert(innerEncoder != null); - _innerUnicodeEncoder = innerEncoder; - } - - /// - /// A default instance of . - /// - /// - /// This normally corresponds to . However, this property is - /// settable so that a developer can change the default implementation application-wide. - /// - public static UrlEncoder Default - { - get - { - return Volatile.Read(ref _defaultEncoder) ?? CreateDefaultEncoderSlow(); - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - Volatile.Write(ref _defaultEncoder, value); - } - } - - [MethodImpl(MethodImplOptions.NoInlining)] // the JITter can attempt to inline the caller itself without worrying about us - private static UrlEncoder CreateDefaultEncoderSlow() - { - var onDemandEncoder = new UrlEncoder(); - return Interlocked.CompareExchange(ref _defaultEncoder, onDemandEncoder, null) ?? onDemandEncoder; - } - - /// - /// Everybody's favorite UrlEncode routine. - /// - public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - /// - /// Everybody's favorite UrlEncode routine. - /// - public string UrlEncode(string value) - { - return _innerUnicodeEncoder.Encode(value); - } - - /// - /// Everybody's favorite UrlEncode routine. - /// - public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - _innerUnicodeEncoder.Encode(value, startIndex, charCount, output); - } - - private sealed class UrlUnicodeEncoder : UnicodeEncoderBase - { - // A singleton instance of the basic latin encoder. - private static UrlUnicodeEncoder _basicLatinSingleton; - - // We perform UTF8 conversion of input, which means that the worst case is - // 9 output chars per input char: [input] U+FFFF -> [output] "%XX%YY%ZZ". - // We don't need to worry about astral code points since they consume 2 input - // chars to produce 12 output chars "%XX%YY%ZZ%WW", which is 6 output chars per input char. - private const int MaxOutputCharsPerInputChar = 9; - - internal UrlUnicodeEncoder(CodePointFilter filter) - : base(filter, MaxOutputCharsPerInputChar) - { - // Per RFC 3987, Sec. 2.2, we want encodings that are safe for - // four particular components: 'isegment', 'ipath-noscheme', - // 'iquery', and 'ifragment'. The relevant definitions are below. - // - // ipath-noscheme = isegment-nz-nc *( "/" isegment ) - // - // isegment = *ipchar - // - // isegment-nz-nc = 1*( iunreserved / pct-encoded / sub-delims - // / "@" ) - // ; non-zero-length segment without any colon ":" - // - // ipchar = iunreserved / pct-encoded / sub-delims / ":" - // / "@" - // - // iquery = *( ipchar / iprivate / "/" / "?" ) - // - // ifragment = *( ipchar / "/" / "?" ) - // - // iunreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" / ucschar - // - // ucschar = %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF - // / %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD - // / %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD - // / %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD - // / %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD - // / %xD0000-DFFFD / %xE1000-EFFFD - // - // pct-encoded = "%" HEXDIG HEXDIG - // - // sub-delims = "!" / "$" / "&" / "'" / "(" / ")" - // / "*" / "+" / "," / ";" / "=" - // - // The only common characters between these four components are the - // intersection of 'isegment-nz-nc' and 'ipchar', which is really - // just 'isegment-nz-nc' (colons forbidden). - // - // From this list, the base encoder already forbids "&", "'", "+", - // and we'll additionally forbid "=" since it has special meaning - // in x-www-form-urlencoded representations. - // - // This means that the full list of allowed characters from the - // Basic Latin set is: - // ALPHA / DIGIT / "-" / "." / "_" / "~" / "!" / "$" / "(" / ")" / "*" / "," / ";" / "@" - - const string forbiddenChars = @" #%/:=?[\]^`{|}"; // chars from Basic Latin which aren't already disallowed by the base encoder - foreach (char c in forbiddenChars) - { - ForbidCharacter(c); - } - - // Specials (U+FFF0 .. U+FFFF) are forbidden by the definition of 'ucschar' above - for (int i = 0; i < 16; i++) - { - ForbidCharacter((char)(0xFFF0 | i)); - } - - // Supplementary characters are forbidden anyway by the base encoder - } - - internal static UrlUnicodeEncoder BasicLatin - { - get - { - UrlUnicodeEncoder encoder = Volatile.Read(ref _basicLatinSingleton); - if (encoder == null) - { - encoder = new UrlUnicodeEncoder(new CodePointFilter(UnicodeRanges.BasicLatin)); - Volatile.Write(ref _basicLatinSingleton, encoder); - } - return encoder; - } - } - - // Writes a scalar value as a percent-encoded sequence of UTF8 bytes, per RFC 3987. - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue(value); - do - { - char highNibble, lowNibble; - HexUtil.WriteHexEncodedByte((byte)asUtf8, out highNibble, out lowNibble); - writer.Write('%'); - writer.Write(highNibble); - writer.Write(lowNibble); - } while ((asUtf8 >>= 8) != 0); - } - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin b/src/Microsoft.Extensions.WebEncoders.Core/compiler/resources/unicode-defined-chars.bin deleted file mode 100644 index 48fa163f088cc88591c84b3e962c82fbfac136db..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8192 zcmeHMv2GJV5MAdaT%l_zA{`AibrhN95BLMj5AXp<;4u=C|A5v#1>z5EDMBu!cbIt;gI{)H0!dCSw<2PP9I&Hu3tbf6l!8ocCXK zKc&p^v?unw;I>6|br}^NpVN#CvrW${m_YZ~=ZziMG*9Rj$8nxb1Nd9ik_-Byjk zC6&G!oXHv?T(RNoe#r;3MJ5r_tmK0U5OJ#liWQqU=J=Q3R{Da(xFQ~@&WveQA(VaX z6YEL16>%<<(q=O^0q2S`pYhmft`*v8ORDDPL#vftx37X*y5kt-2RN*A%Jio*<{xBa zk-t`yGR|eR2`uC0sUXPN??cy32x}H zUw59`Q@iXy1qloU1_A?tf&a#U>|2uTdt*1-{}F^LFc26B4AdC7){m0ih{gerF*sm5 z#;;BL`-Th0hkEd~1@17*CtMu=ifE>KnB<=!e>26Ix++D#a&l9FafrNF>=T(Me*n(= Bra=Gz diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json deleted file mode 100644 index 990b9a373b..0000000000 --- a/src/Microsoft.Extensions.WebEncoders.Core/project.json +++ /dev/null @@ -1,26 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "Contains core encoders for HTML, JavaScript strings, and URLs.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "allowUnsafe": true, - "warningsAsErrors": true - }, - "frameworks": { - "net451": {}, - "dotnet5.4": { - "dependencies": { - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Reflection": "4.0.10-*", - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*" - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs index 0cb40d8a62..c2327d330d 100644 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text.Encodings.Web; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.WebEncoders; @@ -31,12 +32,12 @@ namespace Microsoft.Extensions.DependencyInjection // Register the default encoders // We want to call the 'Default' property getters lazily since they perform static caching - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => HtmlEncoder.Default, filter => new HtmlEncoder(filter)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => JavaScriptStringEncoder.Default, filter => new JavaScriptStringEncoder(filter)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => UrlEncoder.Default, filter => new UrlEncoder(filter)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => HtmlEncoder.Default, settings => HtmlEncoder.Create(settings)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => JavaScriptEncoder.Default, settings => JavaScriptEncoder.Create(settings)))); + services.TryAdd(ServiceDescriptor.Singleton( + CreateFactory(() => UrlEncoder.Default, settings => UrlEncoder.Create(settings)))); if (configureOptions != null) { @@ -48,14 +49,14 @@ namespace Microsoft.Extensions.DependencyInjection private static Func CreateFactory( Func defaultFactory, - Func customFilterFactory) + Func customSettingsFactory) { return serviceProvider => { - var codePointFilter = serviceProvider?.GetService>()? + var settings = serviceProvider?.GetService>()? .Value? - .CodePointFilter; - return (codePointFilter != null) ? customFilterFactory(codePointFilter) : defaultFactory(); + .TextEncoderSettings; + return (settings != null) ? customSettingsFactory(settings) : defaultFactory(); }; } } diff --git a/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs similarity index 59% rename from src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs rename to src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs index f08f37db52..8d9d2da4e8 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/EncoderServiceProviderExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text.Encodings.Web; namespace Microsoft.Extensions.WebEncoders { @@ -11,39 +12,39 @@ namespace Microsoft.Extensions.WebEncoders public static class EncoderServiceProviderExtensions { /// - /// Retrieves an from an . + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. /// It will return a default encoder instance if does not contain one or is null. /// - public static IHtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) + public static HtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) { - return (IHtmlEncoder)serviceProvider?.GetService(typeof(IHtmlEncoder)) ?? HtmlEncoder.Default; + return (HtmlEncoder)serviceProvider?.GetService(typeof(HtmlEncoder)) ?? HtmlEncoder.Default; } /// - /// Retrieves an from an . + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. /// It will return a default encoder instance if does not contain one or is null. /// - public static IJavaScriptStringEncoder GetJavaScriptStringEncoder(this IServiceProvider serviceProvider) + public static JavaScriptEncoder GetJavaScriptEncoder(this IServiceProvider serviceProvider) { - return (IJavaScriptStringEncoder)serviceProvider?.GetService(typeof(IJavaScriptStringEncoder)) ?? JavaScriptStringEncoder.Default; + return (JavaScriptEncoder)serviceProvider?.GetService(typeof(JavaScriptEncoder)) ?? JavaScriptEncoder.Default; } /// - /// Retrieves an from an . + /// Retrieves an from an . /// /// /// This method is guaranteed never to return null. /// It will return a default encoder instance if does not contain one or is null. /// - public static IUrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) + public static UrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) { - return (IUrlEncoder)serviceProvider?.GetService(typeof(IUrlEncoder)) ?? UrlEncoder.Default; + return (UrlEncoder)serviceProvider?.GetService(typeof(UrlEncoder)) ?? UrlEncoder.Default; } } } diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs new file mode 100644 index 0000000000..7768d65bfa --- /dev/null +++ b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + /// + /// Encoder used for unit testing. + /// + public sealed class HtmlTestEncoder : HtmlEncoder + { + public override int MaxOutputCharactersPerInputCharacter + { + get { return 1; } + } + + public override string Encode(string value) + { + return $"HtmlEncode[[{value}]]"; + } + + public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) + { + output.Write("HtmlEncode[["); + output.Write(value, startIndex, characterCount); + output.Write("]]"); + } + + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + output.Write("HtmlEncode[["); + output.Write(value.Substring(startIndex, characterCount)); + output.Write("]]"); + } + + public override bool WillEncode(int unicodeScalar) + { + return false; + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + return -1; + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + { + numberOfCharactersWritten = 0; + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs new file mode 100644 index 0000000000..4207e8a43f --- /dev/null +++ b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + /// + /// Encoder used for unit testing. + /// + public class JavaScriptTestEncoder : JavaScriptEncoder + { + public override int MaxOutputCharactersPerInputCharacter + { + get { return 1; } + } + + public override string Encode(string value) + { + return $"JavaScriptEncode[[{value}]]"; + } + + public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) + { + output.Write("JavaScriptEncode[["); + output.Write(value, startIndex, characterCount); + output.Write("]]"); + } + + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + output.Write("JavaScriptEncode[["); + output.Write(value.Substring(startIndex, characterCount)); + output.Write("]]"); + } + + public override bool WillEncode(int unicodeScalar) + { + return false; + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + return -1; + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + { + numberOfCharactersWritten = 0; + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs new file mode 100644 index 0000000000..d10ee75594 --- /dev/null +++ b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + /// + /// Encoder used for unit testing. + /// + public class UrlTestEncoder : UrlEncoder + { + public override int MaxOutputCharactersPerInputCharacter + { + get { return 1; } + } + + public override string Encode(string value) + { + return $"UrlEncode[[{value}]]"; + } + + public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) + { + output.Write("UrlEncode[["); + output.Write(value, startIndex, characterCount); + output.Write("]]"); + } + + public override void Encode(TextWriter output, string value, int startIndex, int characterCount) + { + output.Write("UrlEncode[["); + output.Write(value.Substring(startIndex, characterCount)); + output.Write("]]"); + } + + public override bool WillEncode(int unicodeScalar) + { + return false; + } + + public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) + { + return -1; + } + + public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + { + numberOfCharactersWritten = 0; + return false; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs similarity index 82% rename from src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs rename to src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs index b68b05ee50..2f5e770a0c 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/WebEncoderOptions.cs +++ b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs @@ -1,12 +1,12 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Text.Encodings.Web; namespace Microsoft.Extensions.WebEncoders { /// - /// Specifies options common to all three encoders (HtmlEncode, JavaScriptStringEncode, UrlEncode). + /// Specifies options common to all three encoders (HtmlEncode, JavaScriptEncode, UrlEncode). /// public sealed class WebEncoderOptions { @@ -16,6 +16,6 @@ namespace Microsoft.Extensions.WebEncoders /// /// If this property is null, then the encoders will use their default allow lists. /// - public ICodePointFilter CodePointFilter { get; set; } + public TextEncoderSettings TextEncoderSettings { get; set; } } } diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index ecc7c0a3d1..c92247832b 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -6,15 +6,21 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "allowUnsafe": true }, "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" + "System.Text.Encodings.Web": "4.0.0-beta-*" }, "frameworks": { - "net451": {}, + "net451": { + "frameworkAssemblies": { + "System.IO": "", + "System.Runtime": "" + } + }, "dotnet5.4": {} } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs index 8221fa524c..1641f92caf 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs @@ -5,8 +5,9 @@ using System; using System.Collections.Generic; using System.Globalization; using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Testing; -using Microsoft.Extensions.WebEncoders; +using Microsoft.Extensions.WebEncoders.Testing; using Xunit; namespace Microsoft.AspNet.Html.Abstractions.Test @@ -345,7 +346,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test { using (var writer = new StringWriter()) { - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); return writer.ToString(); } } @@ -378,7 +379,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test return this; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { foreach (var entry in Entries) { @@ -396,7 +397,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public string Value { get; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(Value); } @@ -411,9 +412,9 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public string Value { get; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { - encoder.HtmlEncode(Value, writer); + encoder.Encode(writer, Value); } } @@ -426,7 +427,7 @@ namespace Microsoft.AspNet.Html.Abstractions.Test public string Value { get; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 789d27a38d..06a8d06a2c 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -2,9 +2,9 @@ "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Extensions.WebEncoders": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs index f36b8eeefc..3084aec482 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs @@ -56,7 +56,6 @@ namespace Microsoft.AspNet.Http.Abstractions [InlineData("name", "", "?name=")] [InlineData("", "value", "?=value")] [InlineData("", "", "?=")] - [InlineData(null, null, "?=")] public void CreateNameValue_Success(string name, string value, string exepcted) { var query = QueryString.Create(name, value); @@ -94,7 +93,6 @@ namespace Microsoft.AspNet.Http.Abstractions } [Theory] - [InlineData(null, null, null, "?=")] [InlineData("", "", "", "?=")] [InlineData("?", "", "", "?=")] [InlineData("?", "name2", "value2", "?name2=value2")] diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs index 2eebd6041e..f65cb4eaaf 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs @@ -2,8 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Text.Encodings.Web; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Extensions.WebEncoders; +using Microsoft.Extensions.WebEncoders.Testing; using Xunit; namespace Microsoft.Extensions.Internal @@ -34,7 +35,7 @@ namespace Microsoft.Extensions.Internal var writer = new StringWriter(); // Act - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); // Assert Assert.Equal("HtmlEncode[[Hello]]", writer.ToString()); @@ -50,7 +51,7 @@ namespace Microsoft.Extensions.Internal var writer = new StringWriter(); // Act - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); // Assert Assert.Equal("Hello", writer.ToString()); @@ -69,7 +70,7 @@ namespace Microsoft.Extensions.Internal // Assert var result = Assert.Single(content.Entries); var testHtmlContent = Assert.IsType(result); - testHtmlContent.WriteTo(writer, new CommonTestEncoder()); + testHtmlContent.WriteTo(writer, new HtmlTestEncoder()); Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString()); } @@ -114,7 +115,7 @@ namespace Microsoft.Extensions.Internal content.Append("Test"); // Act - content.WriteTo(writer, new CommonTestEncoder()); + content.WriteTo(writer, new HtmlTestEncoder()); // Assert Assert.Equal(2, content.Entries.Count); @@ -130,7 +131,7 @@ namespace Microsoft.Extensions.Internal _content = content; } - public void WriteTo(TextWriter writer, IHtmlEncoder encoder) + public void WriteTo(TextWriter writer, HtmlEncoder encoder) { writer.Write(ToString()); } diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json index 0f4d9b84b3..8ed950043b 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json +++ b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json @@ -4,10 +4,13 @@ }, "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.Extensions.BufferedHtmlContent.Sources": { "type": "build", "version": "1.0.0-*" }, + "Microsoft.Extensions.BufferedHtmlContent.Sources": { + "type": "build", + "version": "1.0.0-*" + }, + "Microsoft.Extensions.WebEncoders.Tests" : "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, - "compile": [ "../Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs" ], "commands": { "test": "xunit.runner.aspnet" }, diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs deleted file mode 100644 index 24cdb75568..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/AllowedCharsBitmapTests.cs +++ /dev/null @@ -1,125 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class AllowedCharsBitmapTests - { - [Fact] - public void Ctor_EmptyByDefault() - { - // Act - var bitmap = AllowedCharsBitmap.CreateNew(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(bitmap.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Allow_Forbid_ZigZag() - { - // Arrange - var bitmap = AllowedCharsBitmap.CreateNew(); - - // Act - // The only chars which are allowed are those whose code points are multiples of 3 or 7 - // who aren't also multiples of 5. Exception: multiples of 35 are allowed. - for (int i = 0; i <= Char.MaxValue; i += 3) - { - bitmap.AllowCharacter((char)i); - } - for (int i = 0; i <= Char.MaxValue; i += 5) - { - bitmap.ForbidCharacter((char)i); - } - for (int i = 0; i <= Char.MaxValue; i += 7) - { - bitmap.AllowCharacter((char)i); - } - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - bool isAllowed = false; - if (i % 3 == 0) { isAllowed = true; } - if (i % 5 == 0) { isAllowed = false; } - if (i % 7 == 0) { isAllowed = true; } - Assert.Equal(isAllowed, bitmap.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Clear_ForbidsEverything() - { - // Arrange - var bitmap = AllowedCharsBitmap.CreateNew(); - for (int i = 1; i <= Char.MaxValue; i++) - { - bitmap.AllowCharacter((char)i); - } - - // Act - bitmap.Clear(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(bitmap.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Clone_MakesDeepCopy() - { - // Arrange - var originalBitmap = AllowedCharsBitmap.CreateNew(); - originalBitmap.AllowCharacter('x'); - - // Act - var clonedBitmap = originalBitmap.Clone(); - clonedBitmap.AllowCharacter('y'); - - // Assert - Assert.True(originalBitmap.IsCharacterAllowed('x')); - Assert.False(originalBitmap.IsCharacterAllowed('y')); - Assert.True(clonedBitmap.IsCharacterAllowed('x')); - Assert.True(clonedBitmap.IsCharacterAllowed('y')); - } - - [Fact] - public void ForbidUndefinedCharacters_RemovesUndefinedChars() - { - // Arrange - // We only allow odd-numbered characters in this test so that - // we can validate that we properly merged the two bitmaps together - // rather than simply overwriting the target. - var bitmap = AllowedCharsBitmap.CreateNew(); - for (int i = 1; i <= Char.MaxValue; i += 2) - { - bitmap.AllowCharacter((char)i); - } - - // Act - bitmap.ForbidUndefinedCharacters(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (i % 2 == 0) - { - Assert.False(bitmap.IsCharacterAllowed((char)i)); // these chars were never allowed in the original description - } - else - { - Assert.Equal(UnicodeHelpers.IsCharacterDefined((char)i), bitmap.IsCharacterAllowed((char)i)); - } - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs deleted file mode 100644 index 39624b1fb1..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/CodePointFilterTests.cs +++ /dev/null @@ -1,365 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class CodePointFilterTests - { - [Fact] - public void Ctor_Parameterless_CreatesEmptyFilter() - { - // Act - var filter = new CodePointFilter(); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Ctor_OtherCodePointFilterAsInterface() - { - // Arrange - var originalFilter = new OddCodePointFilter(); - - // Act - var newFilter = new CodePointFilter(originalFilter); - - // Assert - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.Equal((i % 2) == 1, newFilter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Ctor_OtherCodePointFilterAsConcreteType_Clones() - { - // Arrange - var originalFilter = new CodePointFilter().AllowChar('x'); - - // Act - var newFilter = new CodePointFilter(originalFilter).AllowChar('y'); - - // Assert - Assert.True(originalFilter.IsCharacterAllowed('x')); - Assert.False(originalFilter.IsCharacterAllowed('y')); - Assert.True(newFilter.IsCharacterAllowed('x')); - Assert.True(newFilter.IsCharacterAllowed('y')); - } - - [Fact] - public void Ctor_UnicodeRanges() - { - // Act - var filter = new CodePointFilter(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); - - // Assert - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i < 0x2C60; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C60; i <= 0x2C7F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C80; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowChar() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowChar('\u0100'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('\u0100')); - Assert.False(filter.IsCharacterAllowed('\u0101')); - } - - [Fact] - public void AllowChars_Array() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowChars('\u0100', '\u0102'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('\u0100')); - Assert.False(filter.IsCharacterAllowed('\u0101')); - Assert.True(filter.IsCharacterAllowed('\u0102')); - Assert.False(filter.IsCharacterAllowed('\u0103')); - } - - [Fact] - public void AllowChars_String() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowChars("\u0100\u0102"); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('\u0100')); - Assert.False(filter.IsCharacterAllowed('\u0101')); - Assert.True(filter.IsCharacterAllowed('\u0102')); - Assert.False(filter.IsCharacterAllowed('\u0103')); - } - - [Fact] - public void AllowFilter() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.AllowFilter(new OddCodePointFilter()); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= 0x007F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0080; i <= Char.MaxValue; i++) - { - Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowRange() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowRange(UnicodeRanges.LatinExtendedA); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void AllowRanges() - { - // Arrange - var filter = new CodePointFilter(); - - // Act - var retVal = filter.AllowRanges(UnicodeRanges.LatinExtendedA, UnicodeRanges.LatinExtendedC); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i < 0x0100; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0100; i <= 0x017F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0180; i < 0x2C60; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C60; i <= 0x2C7F; i++) - { - Assert.True(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x2C80; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void Clear() - { - // Arrange - var filter = new CodePointFilter(); - for (int i = 1; i <= Char.MaxValue; i++) - { - filter.AllowChar((char)i); - } - - // Act - var retVal = filter.Clear(); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void ForbidChar() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.ForbidChar('x'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.True(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_Array() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.ForbidChars('x', 'z'); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidChars_String() - { - // Arrange - var filter = new CodePointFilter(UnicodeRanges.BasicLatin); - - // Act - var retVal = filter.ForbidChars("xz"); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - Assert.True(filter.IsCharacterAllowed('w')); - Assert.False(filter.IsCharacterAllowed('x')); - Assert.True(filter.IsCharacterAllowed('y')); - Assert.False(filter.IsCharacterAllowed('z')); - } - - [Fact] - public void ForbidRange() - { - // Arrange - var filter = new CodePointFilter(new OddCodePointFilter()); - - // Act - var retVal = filter.ForbidRange(UnicodeRanges.Specials); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= 0xFFEF; i++) - { - Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); - } - for (int i = 0xFFF0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void ForbidRanges() - { - // Arrange - var filter = new CodePointFilter(new OddCodePointFilter()); - - // Act - var retVal = filter.ForbidRanges(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); - - // Assert - Assert.Same(filter, retVal); // returns 'this' instance - for (int i = 0; i <= 0x007F; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - for (int i = 0x0080; i <= 0xFFEF; i++) - { - Assert.Equal((i % 2) == 1, filter.IsCharacterAllowed((char)i)); - } - for (int i = 0xFFF0; i <= Char.MaxValue; i++) - { - Assert.False(filter.IsCharacterAllowed((char)i)); - } - } - - [Fact] - public void GetAllowedCodePoints() - { - // Arrange - var expected = Enumerable.Range(UnicodeRanges.BasicLatin.FirstCodePoint, UnicodeRanges.BasicLatin.RangeSize) - .Concat(Enumerable.Range(UnicodeRanges.Specials.FirstCodePoint, UnicodeRanges.Specials.RangeSize)) - .Except(new int[] { 'x' }) - .OrderBy(i => i) - .ToArray(); - - var filter = new CodePointFilter(UnicodeRanges.BasicLatin, UnicodeRanges.Specials); - filter.ForbidChar('x'); - - // Act - var retVal = filter.GetAllowedCodePoints().OrderBy(i => i).ToArray(); - - // Assert - Assert.Equal(expected, retVal); - } - - // a code point filter which allows only odd code points through - private sealed class OddCodePointFilter : ICodePointFilter - { - public IEnumerable GetAllowedCodePoints() - { - for (int i = 1; i <= Char.MaxValue; i += 2) - { - yield return i; - } - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs b/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs deleted file mode 100644 index b78d91e8c2..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/CommonTestEncoder.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Runtime.CompilerServices; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Encoder used for unit testing. - /// - internal sealed class CommonTestEncoder : IHtmlEncoder, IJavaScriptStringEncoder, IUrlEncoder - { - /// - /// Returns "HtmlEncode[[value]]". - /// - public string HtmlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "HtmlEncode[[value]]". - /// - public void HtmlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "JavaScriptStringEncode[[value]]". - /// - public string JavaScriptStringEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "JavaScriptStringEncode[[value]]". - /// - public void JavaScriptStringEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Returns "UrlEncode[[value]]". - /// - public string UrlEncode(string value) - { - return EncodeCore(value); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(string value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - /// - /// Writes "UrlEncode[[value]]". - /// - public void UrlEncode(char[] value, int startIndex, int charCount, TextWriter output) - { - EncodeCore(value, startIndex, charCount, output); - } - - private static string EncodeCore(string value, [CallerMemberName] string encodeType = null) - { - return String.Format(CultureInfo.InvariantCulture, "{0}[[{1}]]", encodeType, value); - } - - private static void EncodeCore(string value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(value.Substring(startIndex, charCount), encodeType)); - } - - private static void EncodeCore(char[] value, int startIndex, int charCount, TextWriter output, [CallerMemberName] string encodeType = null) - { - output.Write(EncodeCore(new string(value, startIndex, charCount), encodeType)); - } - } -} \ No newline at end of file diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs deleted file mode 100644 index ac9fc8bb28..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderCommonTests.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderCommonTests - { - [Theory] - [InlineData(10000, 3, 16 * 1024)] // we cap at 16k chars - [InlineData(5000, 3, 15000)] // haven't exceeded the 16k cap - [InlineData(40000, 3, 40000)] // if we spill over the LOH, we still allocate an output buffer equivalent in length to the input buffer - [InlineData(512, Int32.MaxValue, 16 * 1024)] // make sure we can handle numeric overflow - public void GetCapacityOfOutputStringBuilder(int numCharsToEncode, int worstCaseOutputCharsPerInputChar, int expectedResult) - { - Assert.Equal(expectedResult, EncoderCommon.GetCapacityOfOutputStringBuilder(numCharsToEncode, worstCaseOutputCharsPerInputChar)); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs deleted file mode 100644 index abdc1d9cc2..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderExtensionsTests.cs +++ /dev/null @@ -1,72 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderExtensionsTests - { - [Fact] - public void HtmlEncode_ParameterChecks() - { - Assert.Throws(() => EncoderExtensions.HtmlEncode(null, "Hello!", new StringWriter())); - } - - [Fact] - public void HtmlEncode_PositiveTestCase() - { - // Arrange - IHtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); - StringWriter writer = new StringWriter(); - - // Act - encoder.HtmlEncode("Hello+there!", writer); - - // Assert - Assert.Equal("Hello+there!", writer.ToString()); - } - - [Fact] - public void JavaScriptStringEncode_ParameterChecks() - { - Assert.Throws(() => EncoderExtensions.JavaScriptStringEncode(null, "Hello!", new StringWriter())); - } - - [Fact] - public void JavaScriptStringEncode_PositiveTestCase() - { - // Arrange - IJavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - StringWriter writer = new StringWriter(); - - // Act - encoder.JavaScriptStringEncode("Hello+there!", writer); - - // Assert - Assert.Equal(@"Hello\u002Bthere!", writer.ToString()); - } - - [Fact] - public void UrlEncode_ParameterChecks() - { - Assert.Throws(() => EncoderExtensions.UrlEncode(null, "Hello!", new StringWriter())); - } - - [Fact] - public void UrlEncode_PositiveTestCase() - { - // Arrange - IUrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); - StringWriter writer = new StringWriter(); - - // Act - encoder.UrlEncode("Hello+there!", writer); - - // Assert - Assert.Equal("Hello%2Bthere!", writer.ToString()); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs index 790210be39..8e060102bb 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs @@ -1,7 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Text.Encodings.Web; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.WebEncoders.Testing; using Xunit; namespace Microsoft.Extensions.WebEncoders @@ -19,12 +21,12 @@ namespace Microsoft.Extensions.WebEncoders // Assert var serviceProvider = serviceCollection.BuildServiceProvider(); - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(JavaScriptStringEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder + Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance } [Fact] @@ -36,23 +38,24 @@ namespace Microsoft.Extensions.WebEncoders // Act serviceCollection.AddWebEncoders(options => { - options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + options.TextEncoderSettings = new TextEncoderSettings(); + options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed }); // Assert var serviceProvider = serviceCollection.BuildServiceProvider(); - var htmlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("abcde", htmlEncoder.HtmlEncode("abcde")); - Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + var htmlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("abcde", htmlEncoder.Encode("abcde")); + Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance - var javaScriptStringEncoder = serviceProvider.GetRequiredService(); - Assert.Equal(@"a\u0062c\u0064e", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); - Assert.Same(javaScriptStringEncoder, serviceProvider.GetRequiredService()); // as singleton instance + var javaScriptEncoder = serviceProvider.GetRequiredService(); + Assert.Equal(@"a\u0062c\u0064e", javaScriptEncoder.Encode("abcde")); + Assert.Same(javaScriptEncoder, serviceProvider.GetRequiredService()); // as singleton instance - var urlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); - Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance + var urlEncoder = serviceProvider.GetRequiredService(); + Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); + Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance } [Fact] @@ -62,25 +65,26 @@ namespace Microsoft.Extensions.WebEncoders var serviceCollection = new ServiceCollection(); // Act - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); + serviceCollection.AddSingleton(); // we don't register an existing URL encoder serviceCollection.AddWebEncoders(options => { - options.CodePointFilter = new CodePointFilter().AllowChars("ace"); // only these three chars are allowed + options.TextEncoderSettings = new TextEncoderSettings(); + options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed }); // Assert var serviceProvider = serviceCollection.BuildServiceProvider(); var htmlEncoder = serviceProvider.GetHtmlEncoder(); - Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.HtmlEncode("abcde")); + Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.Encode("abcde")); - var javaScriptStringEncoder = serviceProvider.GetJavaScriptStringEncoder(); - Assert.Equal("JavaScriptStringEncode[[abcde]]", javaScriptStringEncoder.JavaScriptStringEncode("abcde")); + var javaScriptEncoder = serviceProvider.GetJavaScriptEncoder(); + Assert.Equal("JavaScriptEncode[[abcde]]", javaScriptEncoder.Encode("abcde")); var urlEncoder = serviceProvider.GetUrlEncoder(); - Assert.Equal("a%62c%64e", urlEncoder.UrlEncode("abcde")); + Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); } } } diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs index b62068a941..01492e759e 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text.Encodings.Web; using Xunit; namespace Microsoft.Extensions.WebEncoders @@ -25,7 +26,7 @@ namespace Microsoft.Extensions.WebEncoders public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new HtmlEncoder(); + var expectedEncoder = HtmlEncoder.Default; var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act @@ -36,27 +37,27 @@ namespace Microsoft.Extensions.WebEncoders } [Fact] - public void GetJavaScriptStringEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() + public void GetJavaScriptEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() { // Arrange var serviceProvider = new TestServiceProvider(); // Act - var retVal = serviceProvider.GetJavaScriptStringEncoder(); + var retVal = serviceProvider.GetJavaScriptEncoder(); // Assert - Assert.Same(JavaScriptStringEncoder.Default, retVal); + Assert.Same(JavaScriptEncoder.Default, retVal); } [Fact] - public void GetJavaScriptStringEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() + public void GetJavaScriptEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new JavaScriptStringEncoder(); + var expectedEncoder = JavaScriptEncoder.Default; var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act - var retVal = serviceProvider.GetJavaScriptStringEncoder(); + var retVal = serviceProvider.GetJavaScriptEncoder(); // Assert Assert.Same(expectedEncoder, retVal); @@ -79,7 +80,7 @@ namespace Microsoft.Extensions.WebEncoders public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() { // Arrange - var expectedEncoder = new UrlEncoder(); + var expectedEncoder = UrlEncoder.Default; var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; // Act diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs deleted file mode 100644 index c872b7bf9d..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/Entities.cs +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using Newtonsoft.Json; - -namespace Microsoft.Extensions.WebEncoders -{ - internal static class Entities - { - public static readonly IDictionary ParsedEntities = GetParsedEntities(); - - private static IDictionary GetParsedEntities() - { - // read all entries - string allEntitiesText = ReadEntitiesJsonFile(); - var deserializedRawData = new JsonSerializer().Deserialize>(new JsonTextReader(new StringReader(allEntitiesText))); - - // strip out all entries which aren't of the form "&entity;" - foreach (var key in deserializedRawData.Keys.ToArray() /* dupe since we're mutating original structure */) - { - if (!key.StartsWith("&", StringComparison.Ordinal) || !key.EndsWith(";", StringComparison.Ordinal)) - { - deserializedRawData.Remove(key); - } - } - return deserializedRawData; - } - - private static string ReadEntitiesJsonFile() - { - return File.ReadAllText("entities.json"); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs b/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs deleted file mode 100644 index 97b157b7d5..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/Extensions.cs +++ /dev/null @@ -1,27 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; - -namespace Microsoft.Extensions.WebEncoders -{ - public static class Extensions - { - public static string[] ReadAllLines(this TextReader reader) - { - return ReadAllLinesImpl(reader).ToArray(); - } - - private static IEnumerable ReadAllLinesImpl(TextReader reader) - { - string line; - while ((line = reader.ReadLine()) != null) - { - yield return line; - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs deleted file mode 100644 index 8fe2ddde62..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlEncoderTests.cs +++ /dev/null @@ -1,269 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class HtmlEncoderTests - { - [Fact] - public void Ctor_WithCodePointFilter() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - HtmlEncoder encoder = new HtmlEncoder(filter); - - // Act & assert - Assert.Equal("a", encoder.HtmlEncode("a")); - Assert.Equal("b", encoder.HtmlEncode("b")); - Assert.Equal("c", encoder.HtmlEncode("c")); - Assert.Equal("d", encoder.HtmlEncode("d")); - Assert.Equal("�", encoder.HtmlEncode("\0")); // we still always encode control chars - Assert.Equal("&", encoder.HtmlEncode("&")); // we still always encode HTML-special chars - Assert.Equal("￿", encoder.HtmlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); - - // Act & assert - Assert.Equal("a", encoder.HtmlEncode("a")); - Assert.Equal("\u00E9", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.HtmlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Ctor_WithNoParameters_DefaultsToBasicLatin() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - - // Act & assert - Assert.Equal("a", encoder.HtmlEncode("a")); - Assert.Equal("é", encoder.HtmlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("☁", encoder.HtmlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Default_EquivalentToBasicLatin() - { - // Arrange - HtmlEncoder controlEncoder = new HtmlEncoder(UnicodeRanges.BasicLatin); - HtmlEncoder testEncoder = HtmlEncoder.Default; - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (!IsSurrogateCodePoint(i)) - { - string input = new String((char)i, 1); - Assert.Equal(controlEncoder.HtmlEncode(input), testEncoder.HtmlEncode(input)); - } - } - } - - [Fact] - public void Default_ReturnsSingletonInstance() - { - // Act - HtmlEncoder encoder1 = HtmlEncoder.Default; - HtmlEncoder encoder2 = HtmlEncoder.Default; - - // Assert - Assert.Same(encoder1, encoder2); - } - - [Theory] - [InlineData("<", "<")] - [InlineData(">", ">")] - [InlineData("&", "&")] - [InlineData("'", "'")] - [InlineData("\"", """)] - [InlineData("+", "+")] - public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); - - // Act - string retVal = encoder.HtmlEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void HtmlEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char - } - else - { - if (input == "<") { expected = "<"; } - else if (input == ">") { expected = ">"; } - else if (input == "&") { expected = "&"; } - else if (input == "\"") { expected = """; } - else - { - bool mustEncode = false; - if (i == '\'' || i == '+') - { - mustEncode = true; // apostrophe, plus - } - else if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) - { - mustEncode = true; // control char - } - else if (!UnicodeHelpers.IsCharacterDefined((char)i)) - { - mustEncode = true; // undefined (or otherwise disallowed) char - } - - if (mustEncode) - { - expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); - } - else - { - expected = input; // no encoding - } - } - } - - string retVal = encoder.HtmlEncode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = String.Format(CultureInfo.InvariantCulture, "&#x{0:X};", i); - string retVal = encoder.HtmlEncode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void HtmlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD𐏿e\uFFFD"; - - // Act - string retVal = encoder.HtmlEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void HtmlEncode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - - // Act & assert - Assert.Equal("", encoder.HtmlEncode("")); - } - - [Fact] - public void HtmlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - string input = "Hello, there!"; - - // Act & assert - Assert.Same(input, encoder.HtmlEncode(input)); - } - - [Fact] - public void HtmlEncode_NullInput_ReturnsNull() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - - // Act & assert - Assert.Null(encoder.HtmlEncode(null)); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal("&Hello, there!", new HtmlEncoder().HtmlEncode("&Hello, there!")); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal("Hello, there!&", new HtmlEncoder().HtmlEncode("Hello, there!&")); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal("Hello, &there!", new HtmlEncoder().HtmlEncode("Hello, &there!")); - } - - [Fact] - public void HtmlEncode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal("Hello, <there>!", new HtmlEncoder().HtmlEncode("Hello, !")); - } - - [Fact] - public void HtmlEncode_CharArray() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - var output = new StringWriter(); - - // Act - encoder.HtmlEncode("Hello+world!".ToCharArray(), 3, 5, output); - - // Assert - Assert.Equal("lo+wo", output.ToString()); - } - - [Fact] - public void HtmlEncode_StringSubstring() - { - // Arrange - HtmlEncoder encoder = new HtmlEncoder(); - var output = new StringWriter(); - - // Act - encoder.HtmlEncode("Hello+world!", 3, 5, output); - - // Assert - Assert.Equal("lo+wo", output.ToString()); - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs deleted file mode 100644 index b4d4f250de..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/JavaScriptStringEncoderTests.cs +++ /dev/null @@ -1,331 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class JavaScriptStringEncoderTests - { - [Fact] - public void Ctor_WithCodePointFilter() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(filter); - - // Act & assert - Assert.Equal("a", encoder.JavaScriptStringEncode("a")); - Assert.Equal("b", encoder.JavaScriptStringEncode("b")); - Assert.Equal(@"\u0063", encoder.JavaScriptStringEncode("c")); - Assert.Equal("d", encoder.JavaScriptStringEncode("d")); - Assert.Equal(@"\u0000", encoder.JavaScriptStringEncode("\0")); // we still always encode control chars - Assert.Equal(@"\u0026", encoder.JavaScriptStringEncode("&")); // we still always encode HTML-special chars - Assert.Equal(@"\uFFFF", encoder.JavaScriptStringEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); - - // Act & assert - Assert.Equal(@"\u0061", encoder.JavaScriptStringEncode("a")); - Assert.Equal("\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Ctor_WithNoParameters_DefaultsToBasicLatin() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - - // Act & assert - Assert.Equal("a", encoder.JavaScriptStringEncode("a")); - Assert.Equal(@"\u00E9", encoder.JavaScriptStringEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal(@"\u2601", encoder.JavaScriptStringEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Default_EquivalentToBasicLatin() - { - // Arrange - JavaScriptStringEncoder controlEncoder = new JavaScriptStringEncoder(UnicodeRanges.BasicLatin); - JavaScriptStringEncoder testEncoder = JavaScriptStringEncoder.Default; - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (!IsSurrogateCodePoint(i)) - { - string input = new String((char)i, 1); - Assert.Equal(controlEncoder.JavaScriptStringEncode(input), testEncoder.JavaScriptStringEncode(input)); - } - } - } - - [Fact] - public void Default_ReturnsSingletonInstance() - { - // Act - JavaScriptStringEncoder encoder1 = JavaScriptStringEncoder.Default; - JavaScriptStringEncoder encoder2 = JavaScriptStringEncoder.Default; - - // Assert - Assert.Same(encoder1, encoder2); - } - - [Theory] - [InlineData("<", @"\u003C")] - [InlineData(">", @"\u003E")] - [InlineData("&", @"\u0026")] - [InlineData("'", @"\u0027")] - [InlineData("\"", @"\u0022")] - [InlineData("+", @"\u002B")] - [InlineData("\\", @"\\")] - [InlineData("/", @"\/")] - [InlineData("\b", @"\b")] - [InlineData("\f", @"\f")] - [InlineData("\n", @"\n")] - [InlineData("\t", @"\t")] - [InlineData("\r", @"\r")] - public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Simple(string input, string expected) - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - - // Act - string retVal = encoder.JavaScriptStringEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void JavaScriptStringEncode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char - } - else - { - if (input == "\b") { expected = @"\b"; } - else if (input == "\t") { expected = @"\t"; } - else if (input == "\n") { expected = @"\n"; } - else if (input == "\f") { expected = @"\f"; } - else if (input == "\r") { expected = @"\r"; } - else if (input == "\\") { expected = @"\\"; } - else if (input == "/") { expected = @"\/"; } - else - { - bool mustEncode = false; - switch (i) - { - case '<': - case '>': - case '&': - case '\"': - case '\'': - case '+': - mustEncode = true; - break; - } - - if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) - { - mustEncode = true; // control char - } - else if (!UnicodeHelpers.IsCharacterDefined((char)i)) - { - mustEncode = true; // undefined (or otherwise disallowed) char - } - - if (mustEncode) - { - expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}", i); - } - else - { - expected = input; // no encoding - } - } - } - - string retVal = encoder.JavaScriptStringEncode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = String.Format(CultureInfo.InvariantCulture, @"\u{0:X4}\u{1:X4}", (uint)input[0], (uint)input[1]); - string retVal = encoder.JavaScriptStringEncode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void JavaScriptStringEncode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD\\uD800\\uDFFFe\uFFFD"; // 'D800' 'DFFF' was preserved since it's valid - - // Act - string retVal = encoder.JavaScriptStringEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void JavaScriptStringEncode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - - // Act & assert - Assert.Equal("", encoder.JavaScriptStringEncode("")); - } - - [Fact] - public void JavaScriptStringEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - string input = "Hello, there!"; - - // Act & assert - Assert.Same(input, encoder.JavaScriptStringEncode(input)); - } - - [Fact] - public void JavaScriptStringEncode_NullInput_ReturnsNull() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - - // Act & assert - Assert.Null(encoder.JavaScriptStringEncode(null)); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal(@"\u0026Hello, there!", new JavaScriptStringEncoder().JavaScriptStringEncode("&Hello, there!")); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal(@"Hello, there!\u0026", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, there!&")); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal(@"Hello, \u0026there!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, &there!")); - } - - [Fact] - public void JavaScriptStringEncode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal(@"Hello, \u003Cthere\u003E!", new JavaScriptStringEncoder().JavaScriptStringEncode("Hello, !")); - } - - [Fact] - public void JavaScriptStringEncode_CharArray() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - var output = new StringWriter(); - - // Act - encoder.JavaScriptStringEncode("Hello+world!".ToCharArray(), 3, 5, output); - - // Assert - Assert.Equal(@"lo\u002Bwo", output.ToString()); - } - - [Fact] - public void JavaScriptStringEncode_StringSubstring() - { - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(); - var output = new StringWriter(); - - // Act - encoder.JavaScriptStringEncode("Hello+world!", 3, 5, output); - - // Assert - Assert.Equal(@"lo\u002Bwo", output.ToString()); - } - - [Theory] - [InlineData("\"", @"\u0022")] - [InlineData("'", @"\u0027")] - public void JavaScriptStringEncode_Quotes(string input, string expected) - { - // Per the design document, we provide additional defense-in-depth - // against breaking out of HTML attributes by having the encoders - // never emit the ' or " characters. This means that we want to - // \u-escape these characters instead of using \' and \". - - // Arrange - JavaScriptStringEncoder encoder = new JavaScriptStringEncoder(UnicodeRanges.All); - - // Act - string retVal = encoder.JavaScriptStringEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void JavaScriptStringEncode_DoesNotOutputHtmlSensitiveCharacters() - { - // Per the design document, we provide additional defense-in-depth - // by never emitting HTML-sensitive characters unescaped. - - // Arrange - JavaScriptStringEncoder javaScriptStringEncoder = new JavaScriptStringEncoder(UnicodeRanges.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); - - // Act & assert - for (int i = 0; i <= 0x10FFFF; i++) - { - if (IsSurrogateCodePoint(i)) - { - continue; // surrogates don't matter here - } - - string javaScriptStringEncoded = javaScriptStringEncoder.JavaScriptStringEncode(Char.ConvertFromUtf32(i)); - string thenHtmlEncoded = htmlEncoder.HtmlEncode(javaScriptStringEncoded); - Assert.Equal(javaScriptStringEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters - } - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs b/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs deleted file mode 100644 index b52ee7f04f..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/ParsedEntity.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Newtonsoft.Json; - -namespace Microsoft.Extensions.WebEncoders -{ - internal sealed class ParsedEntity - { - [JsonProperty("codepoints")] - public int[] Codepoints { get; set; } - - [JsonProperty("characters")] - public string DecodedString { get; set; } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs deleted file mode 100644 index 1c088e8b16..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeEncoderBaseTests.cs +++ /dev/null @@ -1,406 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UnicodeEncoderBaseTests - { - [Fact] - public void Ctor_WithCustomFilters() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(filter); - - // Act & assert - Assert.Equal("a", encoder.Encode("a")); - Assert.Equal("b", encoder.Encode("b")); - Assert.Equal("[U+0063]", encoder.Encode("c")); - Assert.Equal("d", encoder.Encode("d")); - Assert.Equal("[U+0000]", encoder.Encode("\0")); // we still always encode control chars - Assert.Equal("[U+0026]", encoder.Encode("&")); // we still always encode HTML-special chars - Assert.Equal("[U+FFFF]", encoder.Encode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(new CodePointFilter(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols)); - - // Act & assert - Assert.Equal("[U+0061]", encoder.Encode("a")); - Assert.Equal("\u00E9", encoder.Encode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.Encode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Simple() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - const string input = "Hello <>&\'\"+ there!"; - const string expected = "Hello [U+003C][U+003E][U+0026][U+0027][U+0022][U+002B] there!"; - - // Act & assert - Assert.Equal(expected, encoder.Encode(input)); - } - - [Fact] - public void Encode_AllRangesAllowed_StillEncodesForbiddenChars_Extended() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "\uFFFD"; // unpaired surrogate -> Unicode replacement char - } - else - { - bool mustEncode = false; - switch (i) - { - case '<': - case '>': - case '&': - case '\"': - case '\'': - case '+': - mustEncode = true; - break; - } - - if (i <= 0x001F || (0x007F <= i && i <= 0x9F)) - { - mustEncode = true; // control char - } - else if (!UnicodeHelpers.IsCharacterDefined((char)i)) - { - mustEncode = true; // undefined (or otherwise disallowed) char - } - - if (mustEncode) - { - expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", i); - } - else - { - expected = input; // no encoding - } - } - - string retVal = encoder.Encode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = String.Format(CultureInfo.InvariantCulture, "[U+{0:X}]", i); - string retVal = encoder.Encode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void Encode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a\uFFFDb\uFFFDc\uFFFD\uFFFDd\uFFFD[U+103FF]e\uFFFD"; - - // Act - string retVal = encoder.Encode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void Encode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - - // Act & assert - Assert.Equal("", encoder.Encode("")); - } - - [Fact] - public void Encode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - string input = "Hello, there!"; - - // Act & assert - Assert.Same(input, encoder.Encode(input)); - } - - [Fact] - public void Encode_NullInput_ReturnsNull() - { - // Arrange - UnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - - // Act & assert - Assert.Null(encoder.Encode(null)); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal("[U+0026]Hello, there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("&Hello, there!")); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal("Hello, there![U+0026]", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, there!&")); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal("Hello, [U+0026]there!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, &there!")); - } - - [Fact] - public void Encode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal("Hello, [U+003C]there[U+003E]!", new CustomUnicodeEncoderBase(UnicodeRanges.All).Encode("Hello, !")); - } - - [Fact] - public void Encode_CharArray_ParameterChecking_NegativeTestCases() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - - // Act & assert - Assert.Throws(() => encoder.Encode((char[])null, 0, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 0, 3, null)); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), -1, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 4, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 2, -1, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc".ToCharArray(), 1, 3, new StringWriter())); - } - - [Fact] - public void Encode_CharArray_ZeroCount_DoesNotCallIntoTextWriter() - { - // Arrange - var encoder = new CustomUnicodeEncoderBase(); - var output = new StringWriter(); - output.Dispose(); // Throws ODE if written to. - - // Act - encoder.Encode("abc".ToCharArray(), 2, 0, output); - - // Assert - // If we got this far (without TextWriter throwing), success! - } - - [Fact] - public void Encode_CharArray_AllCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); - - // Assert - Assert.Equal("xy", output.ToString()); - } - - [Fact] - public void Encode_CharArray_AllCharsInvalid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz".ToCharArray(), 4, 2, output); - - // Assert - Assert.Equal("[U+0078][U+0079]", output.ToString()); - } - - [Fact] - public void Encode_CharArray_SomeCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz".ToCharArray(), 2, 3, output); - - // Assert - Assert.Equal("c[U+0026]x", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_ParameterChecking_NegativeTestCases() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - - // Act & assert - Assert.Throws(() => encoder.Encode((string)null, 0, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 0, 3, null)); - Assert.Throws(() => encoder.Encode("abc", -1, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 2, 2, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 4, 0, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 2, -1, new StringWriter())); - Assert.Throws(() => encoder.Encode("abc", 1, 3, new StringWriter())); - } - - [Fact] - public void Encode_StringSubstring_ZeroCount_DoesNotCallIntoTextWriter() - { - // Arrange - var encoder = new CustomUnicodeEncoderBase(); - var output = new StringWriter(); - output.Dispose(); // Throws ODE if written to. - - // Act - encoder.Encode("abc", 2, 0, output); - - // Assert - // If we got this far (without TextWriter throwing), success! - } - - [Fact] - public void Encode_StringSubstring_AllCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz", 4, 2, output); - - // Assert - Assert.Equal("xy", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_EntireString_AllCharsValid_ForwardDirectlyToOutput() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc", 0, 3, output); - - // Assert - Assert.Equal("abc", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_AllCharsInvalid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz", 4, 2, output); - - // Assert - Assert.Equal("[U+0078][U+0079]", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_SomeCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - encoder.Encode("abc&xyz", 2, 3, output); - - // Assert - Assert.Equal("c[U+0026]x", output.ToString()); - } - - [Fact] - public void Encode_StringSubstring_EntireString_SomeCharsValid() - { - // Arrange - CustomUnicodeEncoderBase encoder = new CustomUnicodeEncoderBase(UnicodeRanges.All); - StringWriter output = new StringWriter(); - - // Act - const string input = "abc&xyz"; - encoder.Encode(input, 0, input.Length, output); - - // Assert - Assert.Equal("abc[U+0026]xyz", output.ToString()); - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - - private sealed class CustomCodePointFilter : ICodePointFilter - { - private readonly int[] _allowedCodePoints; - - public CustomCodePointFilter(params int[] allowedCodePoints) - { - _allowedCodePoints = allowedCodePoints; - } - - public IEnumerable GetAllowedCodePoints() - { - return _allowedCodePoints; - } - } - - private sealed class CustomUnicodeEncoderBase : UnicodeEncoderBase - { - // We pass a (known bad) value of 1 for 'max output chars per input char', - // which also tests that the code behaves properly even if the original - // estimate is incorrect. - public CustomUnicodeEncoderBase(CodePointFilter filter) - : base(filter, maxOutputCharsPerInputChar: 1) - { - } - - public CustomUnicodeEncoderBase(params UnicodeRange[] allowedRanges) - : this(new CodePointFilter(allowedRanges)) - { - } - - protected override void WriteEncodedScalar(ref Writer writer, uint value) - { - writer.Write(String.Format(CultureInfo.InvariantCulture, "[U+{0:X4}]", value)); - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs deleted file mode 100644 index 57ba091465..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeHelpersTests.cs +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public unsafe class UnicodeHelpersTests - { - private const int UnicodeReplacementChar = '\uFFFD'; - - private static readonly UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); - - [Fact] - public void GetDefinedCharacterBitmap_ReturnsSingletonInstance() - { - // Act - uint[] retVal1 = UnicodeHelpers.GetDefinedCharacterBitmap(); - uint[] retVal2 = UnicodeHelpers.GetDefinedCharacterBitmap(); - - // Assert - Assert.Same(retVal1, retVal2); - } - - public static TheoryData Utf16ScalarValues - { - get - { - var dataset = new TheoryData(); - dataset.Add(1, "a", (int)'a'); // normal BMP char, end of string - dataset.Add(2, "ab", (int)'a'); // normal BMP char, not end of string - dataset.Add(3, "\uDFFF", UnicodeReplacementChar); // trailing surrogate, end of string - dataset.Add(4, "\uDFFFx", UnicodeReplacementChar); // trailing surrogate, not end of string - dataset.Add(5, "\uD800", UnicodeReplacementChar); // leading surrogate, end of string - dataset.Add(6, "\uD800x", UnicodeReplacementChar); // leading surrogate, not end of string, followed by non-surrogate - dataset.Add(7, "\uD800\uD800", UnicodeReplacementChar); // leading surrogate, not end of string, followed by leading surrogate - dataset.Add(8, "\uD800\uDFFF", 0x103FF); // leading surrogate, not end of string, followed by trailing surrogate - - return dataset; - } - } - - [Theory] - [MemberData(nameof(Utf16ScalarValues))] - public void GetScalarValueFromUtf16(int unused, string input, int expectedResult) - { - // The 'unused' parameter exists because the xunit runner can't distinguish - // the individual malformed data test cases from each other without this - // additional identifier. - - fixed (char* pInput = input) - { - Assert.Equal(expectedResult, UnicodeHelpers.GetScalarValueFromUtf16(pInput, endOfString: (input.Length == 1))); - } - } - - [Fact] - public void GetUtf8RepresentationForScalarValue() - { - for (int i = 0; i <= 0x10FFFF; i++) - { - if (i <= 0xFFFF && Char.IsSurrogate((char)i)) - { - continue; // no surrogates - } - - // Arrange - byte[] expectedUtf8Bytes = _utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(i)); - - // Act - List actualUtf8Bytes = new List(4); - uint asUtf8 = (uint)UnicodeHelpers.GetUtf8RepresentationForScalarValue((uint)i); - do - { - actualUtf8Bytes.Add((byte)asUtf8); - } while ((asUtf8 >>= 8) != 0); - - // Assert - Assert.Equal(expectedUtf8Bytes, actualUtf8Bytes); - } - } - - [Fact] - public void IsCharacterDefined() - { - // Arrange - bool[] definedChars = ReadListOfDefinedCharacters(); - List errors = new List(); - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - bool expected = definedChars[i]; - bool actual = UnicodeHelpers.IsCharacterDefined((char)i); - if (expected != actual) - { - errors.Add($"Character U+{i:X4}: expected = {expected}, actual = {actual}"); - } - } - - if (errors.Count > 0) - { - Assert.True(false, String.Join(Environment.NewLine, errors)); - } - } - - private static bool[] ReadListOfDefinedCharacters() - { - HashSet allowedCategories = new HashSet(); - - // Letters - allowedCategories.Add("Lu"); - allowedCategories.Add("Ll"); - allowedCategories.Add("Lt"); - allowedCategories.Add("Lm"); - allowedCategories.Add("Lo"); - - // Marks - allowedCategories.Add("Mn"); - allowedCategories.Add("Mc"); - allowedCategories.Add("Me"); - - // Numbers - allowedCategories.Add("Nd"); - allowedCategories.Add("Nl"); - allowedCategories.Add("No"); - - // Punctuation - allowedCategories.Add("Pc"); - allowedCategories.Add("Pd"); - allowedCategories.Add("Ps"); - allowedCategories.Add("Pe"); - allowedCategories.Add("Pi"); - allowedCategories.Add("Pf"); - allowedCategories.Add("Po"); - - // Symbols - allowedCategories.Add("Sm"); - allowedCategories.Add("Sc"); - allowedCategories.Add("Sk"); - allowedCategories.Add("So"); - - // Separators - // With the exception of U+0020 SPACE, these aren't allowed - - // Other - // We only allow one category of 'other' characters - allowedCategories.Add("Cf"); - - HashSet seenCategories = new HashSet(); - - bool[] retVal = new bool[0x10000]; - - var assembly = typeof(UnicodeHelpersTests).GetTypeInfo().Assembly; - var resourceName = assembly.GetName().Name + ".UnicodeData.txt"; - string[] allLines = new StreamReader(assembly.GetManifestResourceStream(resourceName)).ReadAllLines(); - - foreach (string line in allLines) - { - string[] splitLine = line.Split(';'); - uint codePoint = UInt32.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); - string name = splitLine[1]; - if (codePoint >= retVal.Length) - { - continue; // don't care about supplementary chars - } - - if (name.EndsWith(", First>", StringComparison.Ordinal) || name.EndsWith(", Last>", StringComparison.Ordinal)) - { - // ignore spans - we'll handle them separately - continue; - } - - if (codePoint == (uint)' ') - { - retVal[codePoint] = true; // we allow U+0020 SPACE as our only valid Zs (whitespace) char - } - else - { - string category = splitLine[2]; - if (allowedCategories.Contains(category)) - { - retVal[codePoint] = true; // chars in this category are allowable - seenCategories.Add(category); - } - } - } - - // Handle known spans from Unicode 8.0's UnicodeData.txt - - // CJK Ideograph Extension A - for (int i = '\u3400'; i <= '\u4DB5'; i++) - { - retVal[i] = true; - } - // CJK Ideograph - for (int i = '\u4E00'; i <= '\u9FD5'; i++) - { - retVal[i] = true; - } - // Hangul Syllable - for (int i = '\uAC00'; i <= '\uD7A3'; i++) - { - retVal[i] = true; - } - - // Finally, we need to make sure we've seen every category which contains - // allowed characters. This provides extra defense against having a typo - // in the list of categories. - Assert.Equal(allowedCategories.OrderBy(c => c), seenCategories.OrderBy(c => c)); - - return retVal; - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs deleted file mode 100644 index dd9302f2a1..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangeTests.cs +++ /dev/null @@ -1,69 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UnicodeRangeTests - { - [Theory] - [InlineData(-1, 16)] - [InlineData(0x10000, 16)] - public void Ctor_FailureCase_FirstCodePoint(int firstCodePoint, int rangeSize) - { - var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); - Assert.Equal("firstCodePoint", ex.ParamName); - } - - [Theory] - [InlineData(0x0100, -1)] - [InlineData(0x0100, 0x10000)] - public void Ctor_FailureCase_RangeSize(int firstCodePoint, int rangeSize) - { - var ex = Assert.Throws(() => new UnicodeRange(firstCodePoint, rangeSize)); - Assert.Equal("rangeSize", ex.ParamName); - } - - [Fact] - public void Ctor_SuccessCase() - { - // Act - var range = new UnicodeRange(0x0100, 128); // Latin Extended-A - - // Assert - Assert.Equal(0x0100, range.FirstCodePoint); - Assert.Equal(128, range.RangeSize); - } - - [Fact] - public void FromSpan_FailureCase() - { - var ex = Assert.Throws(() => UnicodeRange.FromSpan('\u0020', '\u0010')); - Assert.Equal("lastChar", ex.ParamName); - } - - [Fact] - public void FromSpan_SuccessCase() - { - // Act - var range = UnicodeRange.FromSpan('\u0180', '\u024F'); // Latin Extended-B - - // Assert - Assert.Equal(0x0180, range.FirstCodePoint); - Assert.Equal(208, range.RangeSize); - } - - [Fact] - public void FromSpan_SuccessCase_All() - { - // Act - var range = UnicodeRange.FromSpan('\u0000', '\uFFFF'); - - // Assert - Assert.Equal(0, range.FirstCodePoint); - Assert.Equal(0x10000, range.RangeSize); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs deleted file mode 100644 index ddb4b1c646..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UnicodeRangesTests.cs +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Reflection; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UnicodeRangesTests - { - [Fact] - public void Range_None() - { - UnicodeRange range = UnicodeRanges.None; - Assert.NotNull(range); - - // Test 1: the range should be empty - Assert.Equal(0, range.FirstCodePoint); - Assert.Equal(0, range.RangeSize); - - // Test 2: calling the property multiple times should cache and return the same range instance - UnicodeRange range2 = UnicodeRanges.None; - Assert.Same(range, range2); - } - - [Fact] - public void Range_All() - { - Range_Unicode('\u0000', '\uFFFF', nameof(UnicodeRanges.All)); - } - - [Theory] - [InlineData('\u0000', '\u007F', nameof(UnicodeRanges.BasicLatin))] - [InlineData('\u0080', '\u00FF', nameof(UnicodeRanges.Latin1Supplement))] - [InlineData('\u0100', '\u017F', nameof(UnicodeRanges.LatinExtendedA))] - [InlineData('\u0180', '\u024F', nameof(UnicodeRanges.LatinExtendedB))] - [InlineData('\u0250', '\u02AF', nameof(UnicodeRanges.IPAExtensions))] - [InlineData('\u02B0', '\u02FF', nameof(UnicodeRanges.SpacingModifierLetters))] - [InlineData('\u0300', '\u036F', nameof(UnicodeRanges.CombiningDiacriticalMarks))] - [InlineData('\u0370', '\u03FF', nameof(UnicodeRanges.GreekandCoptic))] - [InlineData('\u0400', '\u04FF', nameof(UnicodeRanges.Cyrillic))] - [InlineData('\u0500', '\u052F', nameof(UnicodeRanges.CyrillicSupplement))] - [InlineData('\u0530', '\u058F', nameof(UnicodeRanges.Armenian))] - [InlineData('\u0590', '\u05FF', nameof(UnicodeRanges.Hebrew))] - [InlineData('\u0600', '\u06FF', nameof(UnicodeRanges.Arabic))] - [InlineData('\u0700', '\u074F', nameof(UnicodeRanges.Syriac))] - [InlineData('\u0750', '\u077F', nameof(UnicodeRanges.ArabicSupplement))] - [InlineData('\u0780', '\u07BF', nameof(UnicodeRanges.Thaana))] - [InlineData('\u07C0', '\u07FF', nameof(UnicodeRanges.NKo))] - [InlineData('\u0800', '\u083F', nameof(UnicodeRanges.Samaritan))] - [InlineData('\u0840', '\u085F', nameof(UnicodeRanges.Mandaic))] - [InlineData('\u08A0', '\u08FF', nameof(UnicodeRanges.ArabicExtendedA))] - [InlineData('\u0900', '\u097F', nameof(UnicodeRanges.Devanagari))] - [InlineData('\u0980', '\u09FF', nameof(UnicodeRanges.Bengali))] - [InlineData('\u0A00', '\u0A7F', nameof(UnicodeRanges.Gurmukhi))] - [InlineData('\u0A80', '\u0AFF', nameof(UnicodeRanges.Gujarati))] - [InlineData('\u0B00', '\u0B7F', nameof(UnicodeRanges.Oriya))] - [InlineData('\u0B80', '\u0BFF', nameof(UnicodeRanges.Tamil))] - [InlineData('\u0C00', '\u0C7F', nameof(UnicodeRanges.Telugu))] - [InlineData('\u0C80', '\u0CFF', nameof(UnicodeRanges.Kannada))] - [InlineData('\u0D00', '\u0D7F', nameof(UnicodeRanges.Malayalam))] - [InlineData('\u0D80', '\u0DFF', nameof(UnicodeRanges.Sinhala))] - [InlineData('\u0E00', '\u0E7F', nameof(UnicodeRanges.Thai))] - [InlineData('\u0E80', '\u0EFF', nameof(UnicodeRanges.Lao))] - [InlineData('\u0F00', '\u0FFF', nameof(UnicodeRanges.Tibetan))] - [InlineData('\u1000', '\u109F', nameof(UnicodeRanges.Myanmar))] - [InlineData('\u10A0', '\u10FF', nameof(UnicodeRanges.Georgian))] - [InlineData('\u1100', '\u11FF', nameof(UnicodeRanges.HangulJamo))] - [InlineData('\u1200', '\u137F', nameof(UnicodeRanges.Ethiopic))] - [InlineData('\u1380', '\u139F', nameof(UnicodeRanges.EthiopicSupplement))] - [InlineData('\u13A0', '\u13FF', nameof(UnicodeRanges.Cherokee))] - [InlineData('\u1400', '\u167F', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabics))] - [InlineData('\u1680', '\u169F', nameof(UnicodeRanges.Ogham))] - [InlineData('\u16A0', '\u16FF', nameof(UnicodeRanges.Runic))] - [InlineData('\u1700', '\u171F', nameof(UnicodeRanges.Tagalog))] - [InlineData('\u1720', '\u173F', nameof(UnicodeRanges.Hanunoo))] - [InlineData('\u1740', '\u175F', nameof(UnicodeRanges.Buhid))] - [InlineData('\u1760', '\u177F', nameof(UnicodeRanges.Tagbanwa))] - [InlineData('\u1780', '\u17FF', nameof(UnicodeRanges.Khmer))] - [InlineData('\u1800', '\u18AF', nameof(UnicodeRanges.Mongolian))] - [InlineData('\u18B0', '\u18FF', nameof(UnicodeRanges.UnifiedCanadianAboriginalSyllabicsExtended))] - [InlineData('\u1900', '\u194F', nameof(UnicodeRanges.Limbu))] - [InlineData('\u1950', '\u197F', nameof(UnicodeRanges.TaiLe))] - [InlineData('\u1980', '\u19DF', nameof(UnicodeRanges.NewTaiLue))] - [InlineData('\u19E0', '\u19FF', nameof(UnicodeRanges.KhmerSymbols))] - [InlineData('\u1A00', '\u1A1F', nameof(UnicodeRanges.Buginese))] - [InlineData('\u1A20', '\u1AAF', nameof(UnicodeRanges.TaiTham))] - [InlineData('\u1AB0', '\u1AFF', nameof(UnicodeRanges.CombiningDiacriticalMarksExtended))] - [InlineData('\u1B00', '\u1B7F', nameof(UnicodeRanges.Balinese))] - [InlineData('\u1B80', '\u1BBF', nameof(UnicodeRanges.Sundanese))] - [InlineData('\u1BC0', '\u1BFF', nameof(UnicodeRanges.Batak))] - [InlineData('\u1C00', '\u1C4F', nameof(UnicodeRanges.Lepcha))] - [InlineData('\u1C50', '\u1C7F', nameof(UnicodeRanges.OlChiki))] - [InlineData('\u1CC0', '\u1CCF', nameof(UnicodeRanges.SundaneseSupplement))] - [InlineData('\u1CD0', '\u1CFF', nameof(UnicodeRanges.VedicExtensions))] - [InlineData('\u1D00', '\u1D7F', nameof(UnicodeRanges.PhoneticExtensions))] - [InlineData('\u1D80', '\u1DBF', nameof(UnicodeRanges.PhoneticExtensionsSupplement))] - [InlineData('\u1DC0', '\u1DFF', nameof(UnicodeRanges.CombiningDiacriticalMarksSupplement))] - [InlineData('\u1E00', '\u1EFF', nameof(UnicodeRanges.LatinExtendedAdditional))] - [InlineData('\u1F00', '\u1FFF', nameof(UnicodeRanges.GreekExtended))] - [InlineData('\u2000', '\u206F', nameof(UnicodeRanges.GeneralPunctuation))] - [InlineData('\u2070', '\u209F', nameof(UnicodeRanges.SuperscriptsandSubscripts))] - [InlineData('\u20A0', '\u20CF', nameof(UnicodeRanges.CurrencySymbols))] - [InlineData('\u20D0', '\u20FF', nameof(UnicodeRanges.CombiningDiacriticalMarksforSymbols))] - [InlineData('\u2100', '\u214F', nameof(UnicodeRanges.LetterlikeSymbols))] - [InlineData('\u2150', '\u218F', nameof(UnicodeRanges.NumberForms))] - [InlineData('\u2190', '\u21FF', nameof(UnicodeRanges.Arrows))] - [InlineData('\u2200', '\u22FF', nameof(UnicodeRanges.MathematicalOperators))] - [InlineData('\u2300', '\u23FF', nameof(UnicodeRanges.MiscellaneousTechnical))] - [InlineData('\u2400', '\u243F', nameof(UnicodeRanges.ControlPictures))] - [InlineData('\u2440', '\u245F', nameof(UnicodeRanges.OpticalCharacterRecognition))] - [InlineData('\u2460', '\u24FF', nameof(UnicodeRanges.EnclosedAlphanumerics))] - [InlineData('\u2500', '\u257F', nameof(UnicodeRanges.BoxDrawing))] - [InlineData('\u2580', '\u259F', nameof(UnicodeRanges.BlockElements))] - [InlineData('\u25A0', '\u25FF', nameof(UnicodeRanges.GeometricShapes))] - [InlineData('\u2600', '\u26FF', nameof(UnicodeRanges.MiscellaneousSymbols))] - [InlineData('\u2700', '\u27BF', nameof(UnicodeRanges.Dingbats))] - [InlineData('\u27C0', '\u27EF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsA))] - [InlineData('\u27F0', '\u27FF', nameof(UnicodeRanges.SupplementalArrowsA))] - [InlineData('\u2800', '\u28FF', nameof(UnicodeRanges.BraillePatterns))] - [InlineData('\u2900', '\u297F', nameof(UnicodeRanges.SupplementalArrowsB))] - [InlineData('\u2980', '\u29FF', nameof(UnicodeRanges.MiscellaneousMathematicalSymbolsB))] - [InlineData('\u2A00', '\u2AFF', nameof(UnicodeRanges.SupplementalMathematicalOperators))] - [InlineData('\u2B00', '\u2BFF', nameof(UnicodeRanges.MiscellaneousSymbolsandArrows))] - [InlineData('\u2C00', '\u2C5F', nameof(UnicodeRanges.Glagolitic))] - [InlineData('\u2C60', '\u2C7F', nameof(UnicodeRanges.LatinExtendedC))] - [InlineData('\u2C80', '\u2CFF', nameof(UnicodeRanges.Coptic))] - [InlineData('\u2D00', '\u2D2F', nameof(UnicodeRanges.GeorgianSupplement))] - [InlineData('\u2D30', '\u2D7F', nameof(UnicodeRanges.Tifinagh))] - [InlineData('\u2D80', '\u2DDF', nameof(UnicodeRanges.EthiopicExtended))] - [InlineData('\u2DE0', '\u2DFF', nameof(UnicodeRanges.CyrillicExtendedA))] - [InlineData('\u2E00', '\u2E7F', nameof(UnicodeRanges.SupplementalPunctuation))] - [InlineData('\u2E80', '\u2EFF', nameof(UnicodeRanges.CJKRadicalsSupplement))] - [InlineData('\u2F00', '\u2FDF', nameof(UnicodeRanges.KangxiRadicals))] - [InlineData('\u2FF0', '\u2FFF', nameof(UnicodeRanges.IdeographicDescriptionCharacters))] - [InlineData('\u3000', '\u303F', nameof(UnicodeRanges.CJKSymbolsandPunctuation))] - [InlineData('\u3040', '\u309F', nameof(UnicodeRanges.Hiragana))] - [InlineData('\u30A0', '\u30FF', nameof(UnicodeRanges.Katakana))] - [InlineData('\u3100', '\u312F', nameof(UnicodeRanges.Bopomofo))] - [InlineData('\u3130', '\u318F', nameof(UnicodeRanges.HangulCompatibilityJamo))] - [InlineData('\u3190', '\u319F', nameof(UnicodeRanges.Kanbun))] - [InlineData('\u31A0', '\u31BF', nameof(UnicodeRanges.BopomofoExtended))] - [InlineData('\u31C0', '\u31EF', nameof(UnicodeRanges.CJKStrokes))] - [InlineData('\u31F0', '\u31FF', nameof(UnicodeRanges.KatakanaPhoneticExtensions))] - [InlineData('\u3200', '\u32FF', nameof(UnicodeRanges.EnclosedCJKLettersandMonths))] - [InlineData('\u3300', '\u33FF', nameof(UnicodeRanges.CJKCompatibility))] - [InlineData('\u3400', '\u4DBF', nameof(UnicodeRanges.CJKUnifiedIdeographsExtensionA))] - [InlineData('\u4DC0', '\u4DFF', nameof(UnicodeRanges.YijingHexagramSymbols))] - [InlineData('\u4E00', '\u9FFF', nameof(UnicodeRanges.CJKUnifiedIdeographs))] - [InlineData('\uA000', '\uA48F', nameof(UnicodeRanges.YiSyllables))] - [InlineData('\uA490', '\uA4CF', nameof(UnicodeRanges.YiRadicals))] - [InlineData('\uA4D0', '\uA4FF', nameof(UnicodeRanges.Lisu))] - [InlineData('\uA500', '\uA63F', nameof(UnicodeRanges.Vai))] - [InlineData('\uA640', '\uA69F', nameof(UnicodeRanges.CyrillicExtendedB))] - [InlineData('\uA6A0', '\uA6FF', nameof(UnicodeRanges.Bamum))] - [InlineData('\uA700', '\uA71F', nameof(UnicodeRanges.ModifierToneLetters))] - [InlineData('\uA720', '\uA7FF', nameof(UnicodeRanges.LatinExtendedD))] - [InlineData('\uA800', '\uA82F', nameof(UnicodeRanges.SylotiNagri))] - [InlineData('\uA830', '\uA83F', nameof(UnicodeRanges.CommonIndicNumberForms))] - [InlineData('\uA840', '\uA87F', nameof(UnicodeRanges.Phagspa))] - [InlineData('\uA880', '\uA8DF', nameof(UnicodeRanges.Saurashtra))] - [InlineData('\uA8E0', '\uA8FF', nameof(UnicodeRanges.DevanagariExtended))] - [InlineData('\uA900', '\uA92F', nameof(UnicodeRanges.KayahLi))] - [InlineData('\uA930', '\uA95F', nameof(UnicodeRanges.Rejang))] - [InlineData('\uA960', '\uA97F', nameof(UnicodeRanges.HangulJamoExtendedA))] - [InlineData('\uA980', '\uA9DF', nameof(UnicodeRanges.Javanese))] - [InlineData('\uA9E0', '\uA9FF', nameof(UnicodeRanges.MyanmarExtendedB))] - [InlineData('\uAA00', '\uAA5F', nameof(UnicodeRanges.Cham))] - [InlineData('\uAA60', '\uAA7F', nameof(UnicodeRanges.MyanmarExtendedA))] - [InlineData('\uAA80', '\uAADF', nameof(UnicodeRanges.TaiViet))] - [InlineData('\uAAE0', '\uAAFF', nameof(UnicodeRanges.MeeteiMayekExtensions))] - [InlineData('\uAB00', '\uAB2F', nameof(UnicodeRanges.EthiopicExtendedA))] - [InlineData('\uAB30', '\uAB6F', nameof(UnicodeRanges.LatinExtendedE))] - [InlineData('\uAB70', '\uABBF', nameof(UnicodeRanges.CherokeeSupplement))] - [InlineData('\uABC0', '\uABFF', nameof(UnicodeRanges.MeeteiMayek))] - [InlineData('\uAC00', '\uD7AF', nameof(UnicodeRanges.HangulSyllables))] - [InlineData('\uD7B0', '\uD7FF', nameof(UnicodeRanges.HangulJamoExtendedB))] - [InlineData('\uF900', '\uFAFF', nameof(UnicodeRanges.CJKCompatibilityIdeographs))] - [InlineData('\uFB00', '\uFB4F', nameof(UnicodeRanges.AlphabeticPresentationForms))] - [InlineData('\uFB50', '\uFDFF', nameof(UnicodeRanges.ArabicPresentationFormsA))] - [InlineData('\uFE00', '\uFE0F', nameof(UnicodeRanges.VariationSelectors))] - [InlineData('\uFE10', '\uFE1F', nameof(UnicodeRanges.VerticalForms))] - [InlineData('\uFE20', '\uFE2F', nameof(UnicodeRanges.CombiningHalfMarks))] - [InlineData('\uFE30', '\uFE4F', nameof(UnicodeRanges.CJKCompatibilityForms))] - [InlineData('\uFE50', '\uFE6F', nameof(UnicodeRanges.SmallFormVariants))] - [InlineData('\uFE70', '\uFEFF', nameof(UnicodeRanges.ArabicPresentationFormsB))] - [InlineData('\uFF00', '\uFFEF', nameof(UnicodeRanges.HalfwidthandFullwidthForms))] - [InlineData('\uFFF0', '\uFFFF', nameof(UnicodeRanges.Specials))] - public void Range_Unicode(char first, char last, string blockName) - { - Assert.Equal(0x0, first & 0xF); // first char in any block should be U+nnn0 - Assert.Equal(0xF, last & 0xF); // last char in any block should be U+nnnF - Assert.True(first < last); // code point ranges should be ordered - - var propInfo = typeof(UnicodeRanges).GetProperty(blockName, BindingFlags.Public | BindingFlags.Static); - Assert.NotNull(propInfo); - - UnicodeRange range = (UnicodeRange)propInfo.GetValue(null); - Assert.NotNull(range); - - // Test 1: the range should span the range first..last - Assert.Equal(first, range.FirstCodePoint); - Assert.Equal(last, range.FirstCodePoint + range.RangeSize - 1); - - // Test 2: calling the property multiple times should cache and return the same range instance - UnicodeRange range2 = (UnicodeRange)propInfo.GetValue(null); - Assert.Same(range, range2); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs deleted file mode 100644 index 2f31e0e16f..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/UrlEncoderTests.cs +++ /dev/null @@ -1,301 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class UrlEncoderTests - { - private static UTF8Encoding _utf8EncodingThrowOnInvalidBytes = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); - - [Fact] - public void Ctor_WithCodePointFilter() - { - // Arrange - var filter = new CodePointFilter().AllowChars("ab").AllowChars('\0', '&', '\uFFFF', 'd'); - UrlEncoder encoder = new UrlEncoder(filter); - - // Act & assert - Assert.Equal("a", encoder.UrlEncode("a")); - Assert.Equal("b", encoder.UrlEncode("b")); - Assert.Equal("%63", encoder.UrlEncode("c")); - Assert.Equal("d", encoder.UrlEncode("d")); - Assert.Equal("%00", encoder.UrlEncode("\0")); // we still always encode control chars - Assert.Equal("%26", encoder.UrlEncode("&")); // we still always encode HTML-special chars - Assert.Equal("%EF%BF%BF", encoder.UrlEncode("\uFFFF")); // we still always encode non-chars and other forbidden chars - } - - [Fact] - public void Ctor_WithUnicodeRanges() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeRanges.Latin1Supplement, UnicodeRanges.MiscellaneousSymbols); - - // Act & assert - Assert.Equal("%61", encoder.UrlEncode("a")); - Assert.Equal("\u00E9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("\u2601", encoder.UrlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Ctor_WithNoParameters_DefaultsToBasicLatin() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - - // Act & assert - Assert.Equal("a", encoder.UrlEncode("a")); - Assert.Equal("%C3%A9", encoder.UrlEncode("\u00E9" /* LATIN SMALL LETTER E WITH ACUTE */)); - Assert.Equal("%E2%98%81", encoder.UrlEncode("\u2601" /* CLOUD */)); - } - - [Fact] - public void Default_EquivalentToBasicLatin() - { - // Arrange - UrlEncoder controlEncoder = new UrlEncoder(UnicodeRanges.BasicLatin); - UrlEncoder testEncoder = UrlEncoder.Default; - - // Act & assert - for (int i = 0; i <= Char.MaxValue; i++) - { - if (!IsSurrogateCodePoint(i)) - { - string input = new String((char)i, 1); - Assert.Equal(controlEncoder.UrlEncode(input), testEncoder.UrlEncode(input)); - } - } - } - - [Fact] - public void Default_ReturnsSingletonInstance() - { - // Act - UrlEncoder encoder1 = UrlEncoder.Default; - UrlEncoder encoder2 = UrlEncoder.Default; - - // Assert - Assert.Same(encoder1, encoder2); - } - - [Fact] - public void UrlEncode_AllRangesAllowed_StillEncodesForbiddenChars() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); - - // Act & assert - BMP chars - for (int i = 0; i <= 0xFFFF; i++) - { - string input = new String((char)i, 1); - string expected; - if (IsSurrogateCodePoint(i)) - { - expected = "%EF%BF%BD"; // unpaired surrogate -> Unicode replacement char - } - else - { - bool mustEncode = true; - - // RFC 3987, Sec. 2.2 gives the list of allowed chars - // (We allow 'ipchar' except for "'", "&", "+", "%", and "=" - if (('a' <= i && i <= 'z') || ('A' <= i && i <= 'Z') || ('0' <= i && i <= '9')) - { - mustEncode = false; // ALPHA / DIGIT - } - else if ((0x00A0 <= i && i <= 0xD7FF) | (0xF900 <= i && i <= 0xFDCF) | (0xFDF0 <= i && i <= 0xFFEF)) - { - mustEncode = !UnicodeHelpers.IsCharacterDefined((char)i); // 'ucschar' - } - else - { - switch (i) - { - // iunreserved - case '-': - case '.': - case '_': - case '~': - - // isegment-nz-nc - case '@': - - // sub-delims - case '!': - case '$': - case '(': - case ')': - case '*': - case ',': - case ';': - mustEncode = false; - break; - } - } - - if (mustEncode) - { - expected = GetKnownGoodPercentEncodedValue(i); - } - else - { - expected = input; // no encoding - } - } - - string retVal = encoder.UrlEncode(input); - Assert.Equal(expected, retVal); - } - - // Act & assert - astral chars - for (int i = 0x10000; i <= 0x10FFFF; i++) - { - string input = Char.ConvertFromUtf32(i); - string expected = GetKnownGoodPercentEncodedValue(i); - string retVal = encoder.UrlEncode(input); - Assert.Equal(expected, retVal); - } - } - - [Fact] - public void UrlEncode_BadSurrogates_ReturnsUnicodeReplacementChar() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(UnicodeRanges.All); // allow all codepoints - - // "abcde" - const string input = "a\uD800b\uDFFFc\uDFFF\uD800d\uDFFF\uD800\uDFFFe\uD800"; - const string expected = "a%EF%BF%BDb%EF%BF%BDc%EF%BF%BD%EF%BF%BDd%EF%BF%BD%F0%90%8F%BFe%EF%BF%BD"; // 'D800' 'DFFF' was preserved since it's valid - - // Act - string retVal = encoder.UrlEncode(input); - - // Assert - Assert.Equal(expected, retVal); - } - - [Fact] - public void UrlEncode_EmptyStringInput_ReturnsEmptyString() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - - // Act & assert - Assert.Equal("", encoder.UrlEncode("")); - } - - [Fact] - public void UrlEncode_InputDoesNotRequireEncoding_ReturnsOriginalStringInstance() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - string input = "Hello,there!"; - - // Act & assert - Assert.Same(input, encoder.UrlEncode(input)); - } - - [Fact] - public void UrlEncode_NullInput_ReturnsNull() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - - // Act & assert - Assert.Null(encoder.UrlEncode(null)); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingAtBeginning() - { - Assert.Equal(@"%26Hello,there!", new UrlEncoder().UrlEncode("&Hello,there!")); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingAtEnd() - { - Assert.Equal(@"Hello,there!%26", new UrlEncoder().UrlEncode("Hello,there!&")); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingInMiddle() - { - Assert.Equal(@"Hello,%20%26there!", new UrlEncoder().UrlEncode("Hello, &there!")); - } - - [Fact] - public void UrlEncode_WithCharsRequiringEncodingInterspersed() - { - Assert.Equal(@"Hello,%20%3Cthere%3E!", new UrlEncoder().UrlEncode("Hello, !")); - } - - [Fact] - public void UrlEncode_CharArray() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - var output = new StringWriter(); - - // Act - encoder.UrlEncode("Hello+world!".ToCharArray(), 3, 5, output); - - // Assert - Assert.Equal("lo%2Bwo", output.ToString()); - } - - [Fact] - public void UrlEncode_StringSubstring() - { - // Arrange - UrlEncoder encoder = new UrlEncoder(); - var output = new StringWriter(); - - // Act - encoder.UrlEncode("Hello+world!", 3, 5, output); - - // Assert - Assert.Equal("lo%2Bwo", output.ToString()); - } - - [Fact] - public void UrlEncode_DoesNotOutputHtmlSensitiveCharacters() - { - // Per the design document, we provide additional defense-in-depth - // by never emitting HTML-sensitive characters unescaped. - - // Arrange - UrlEncoder urlEncoder = new UrlEncoder(UnicodeRanges.All); - HtmlEncoder htmlEncoder = new HtmlEncoder(UnicodeRanges.All); - - // Act & assert - for (int i = 0; i <= 0x10FFFF; i++) - { - if (IsSurrogateCodePoint(i)) - { - continue; // surrogates don't matter here - } - - string urlEncoded = urlEncoder.UrlEncode(Char.ConvertFromUtf32(i)); - string thenHtmlEncoded = htmlEncoder.HtmlEncode(urlEncoded); - Assert.Equal(urlEncoded, thenHtmlEncoded); // should have contained no HTML-sensitive characters - } - } - - private static string GetKnownGoodPercentEncodedValue(int codePoint) - { - // Convert the code point to UTF16, then call Encoding.UTF8.GetBytes, then hex-encode everything - return String.Concat(_utf8EncodingThrowOnInvalidBytes.GetBytes(Char.ConvertFromUtf32(codePoint)).Select(b => String.Format(CultureInfo.InvariantCulture, "%{0:X2}", b))); - } - - private static bool IsSurrogateCodePoint(int codePoint) - { - return (0xD800 <= codePoint && codePoint <= 0xDFFF); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json index 87d9e98e9c..c2b08aa51f 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -18,6 +18,5 @@ "System.Text.Encoding.Extensions": "4.0.11-beta-*" } } - }, - "resource": "..\\..\\unicode\\UnicodeData.txt" + } } diff --git a/unicode/Blocks.txt b/unicode/Blocks.txt deleted file mode 100644 index 0a4a580763..0000000000 --- a/unicode/Blocks.txt +++ /dev/null @@ -1,298 +0,0 @@ -# Blocks-8.0.0.txt -# Date: 2014-11-10, 23:04:00 GMT [KW] -# -# Unicode Character Database -# Copyright (c) 1991-2014 Unicode, Inc. -# For terms of use, see http://www.unicode.org/terms_of_use.html -# For documentation, see http://www.unicode.org/reports/tr44/ -# -# Format: -# Start Code..End Code; Block Name - -# ================================================ - -# Note: When comparing block names, casing, whitespace, hyphens, -# and underbars are ignored. -# For example, "Latin Extended-A" and "latin extended a" are equivalent. -# For more information on the comparison of property values, -# see UAX #44: http://www.unicode.org/reports/tr44/ -# -# All block ranges start with a value where (cp MOD 16) = 0, -# and end with a value where (cp MOD 16) = 15. In other words, -# the last hexadecimal digit of the start of range is ...0 -# and the last hexadecimal digit of the end of range is ...F. -# This constraint on block ranges guarantees that allocations -# are done in terms of whole columns, and that code chart display -# never involves splitting columns in the charts. -# -# All code points not explicitly listed for Block -# have the value No_Block. - -# Property: Block -# -# @missing: 0000..10FFFF; No_Block - -0000..007F; Basic Latin -0080..00FF; Latin-1 Supplement -0100..017F; Latin Extended-A -0180..024F; Latin Extended-B -0250..02AF; IPA Extensions -02B0..02FF; Spacing Modifier Letters -0300..036F; Combining Diacritical Marks -0370..03FF; Greek and Coptic -0400..04FF; Cyrillic -0500..052F; Cyrillic Supplement -0530..058F; Armenian -0590..05FF; Hebrew -0600..06FF; Arabic -0700..074F; Syriac -0750..077F; Arabic Supplement -0780..07BF; Thaana -07C0..07FF; NKo -0800..083F; Samaritan -0840..085F; Mandaic -08A0..08FF; Arabic Extended-A -0900..097F; Devanagari -0980..09FF; Bengali -0A00..0A7F; Gurmukhi -0A80..0AFF; Gujarati -0B00..0B7F; Oriya -0B80..0BFF; Tamil -0C00..0C7F; Telugu -0C80..0CFF; Kannada -0D00..0D7F; Malayalam -0D80..0DFF; Sinhala -0E00..0E7F; Thai -0E80..0EFF; Lao -0F00..0FFF; Tibetan -1000..109F; Myanmar -10A0..10FF; Georgian -1100..11FF; Hangul Jamo -1200..137F; Ethiopic -1380..139F; Ethiopic Supplement -13A0..13FF; Cherokee -1400..167F; Unified Canadian Aboriginal Syllabics -1680..169F; Ogham -16A0..16FF; Runic -1700..171F; Tagalog -1720..173F; Hanunoo -1740..175F; Buhid -1760..177F; Tagbanwa -1780..17FF; Khmer -1800..18AF; Mongolian -18B0..18FF; Unified Canadian Aboriginal Syllabics Extended -1900..194F; Limbu -1950..197F; Tai Le -1980..19DF; New Tai Lue -19E0..19FF; Khmer Symbols -1A00..1A1F; Buginese -1A20..1AAF; Tai Tham -1AB0..1AFF; Combining Diacritical Marks Extended -1B00..1B7F; Balinese -1B80..1BBF; Sundanese -1BC0..1BFF; Batak -1C00..1C4F; Lepcha -1C50..1C7F; Ol Chiki -1CC0..1CCF; Sundanese Supplement -1CD0..1CFF; Vedic Extensions -1D00..1D7F; Phonetic Extensions -1D80..1DBF; Phonetic Extensions Supplement -1DC0..1DFF; Combining Diacritical Marks Supplement -1E00..1EFF; Latin Extended Additional -1F00..1FFF; Greek Extended -2000..206F; General Punctuation -2070..209F; Superscripts and Subscripts -20A0..20CF; Currency Symbols -20D0..20FF; Combining Diacritical Marks for Symbols -2100..214F; Letterlike Symbols -2150..218F; Number Forms -2190..21FF; Arrows -2200..22FF; Mathematical Operators -2300..23FF; Miscellaneous Technical -2400..243F; Control Pictures -2440..245F; Optical Character Recognition -2460..24FF; Enclosed Alphanumerics -2500..257F; Box Drawing -2580..259F; Block Elements -25A0..25FF; Geometric Shapes -2600..26FF; Miscellaneous Symbols -2700..27BF; Dingbats -27C0..27EF; Miscellaneous Mathematical Symbols-A -27F0..27FF; Supplemental Arrows-A -2800..28FF; Braille Patterns -2900..297F; Supplemental Arrows-B -2980..29FF; Miscellaneous Mathematical Symbols-B -2A00..2AFF; Supplemental Mathematical Operators -2B00..2BFF; Miscellaneous Symbols and Arrows -2C00..2C5F; Glagolitic -2C60..2C7F; Latin Extended-C -2C80..2CFF; Coptic -2D00..2D2F; Georgian Supplement -2D30..2D7F; Tifinagh -2D80..2DDF; Ethiopic Extended -2DE0..2DFF; Cyrillic Extended-A -2E00..2E7F; Supplemental Punctuation -2E80..2EFF; CJK Radicals Supplement -2F00..2FDF; Kangxi Radicals -2FF0..2FFF; Ideographic Description Characters -3000..303F; CJK Symbols and Punctuation -3040..309F; Hiragana -30A0..30FF; Katakana -3100..312F; Bopomofo -3130..318F; Hangul Compatibility Jamo -3190..319F; Kanbun -31A0..31BF; Bopomofo Extended -31C0..31EF; CJK Strokes -31F0..31FF; Katakana Phonetic Extensions -3200..32FF; Enclosed CJK Letters and Months -3300..33FF; CJK Compatibility -3400..4DBF; CJK Unified Ideographs Extension A -4DC0..4DFF; Yijing Hexagram Symbols -4E00..9FFF; CJK Unified Ideographs -A000..A48F; Yi Syllables -A490..A4CF; Yi Radicals -A4D0..A4FF; Lisu -A500..A63F; Vai -A640..A69F; Cyrillic Extended-B -A6A0..A6FF; Bamum -A700..A71F; Modifier Tone Letters -A720..A7FF; Latin Extended-D -A800..A82F; Syloti Nagri -A830..A83F; Common Indic Number Forms -A840..A87F; Phags-pa -A880..A8DF; Saurashtra -A8E0..A8FF; Devanagari Extended -A900..A92F; Kayah Li -A930..A95F; Rejang -A960..A97F; Hangul Jamo Extended-A -A980..A9DF; Javanese -A9E0..A9FF; Myanmar Extended-B -AA00..AA5F; Cham -AA60..AA7F; Myanmar Extended-A -AA80..AADF; Tai Viet -AAE0..AAFF; Meetei Mayek Extensions -AB00..AB2F; Ethiopic Extended-A -AB30..AB6F; Latin Extended-E -AB70..ABBF; Cherokee Supplement -ABC0..ABFF; Meetei Mayek -AC00..D7AF; Hangul Syllables -D7B0..D7FF; Hangul Jamo Extended-B -D800..DB7F; High Surrogates -DB80..DBFF; High Private Use Surrogates -DC00..DFFF; Low Surrogates -E000..F8FF; Private Use Area -F900..FAFF; CJK Compatibility Ideographs -FB00..FB4F; Alphabetic Presentation Forms -FB50..FDFF; Arabic Presentation Forms-A -FE00..FE0F; Variation Selectors -FE10..FE1F; Vertical Forms -FE20..FE2F; Combining Half Marks -FE30..FE4F; CJK Compatibility Forms -FE50..FE6F; Small Form Variants -FE70..FEFF; Arabic Presentation Forms-B -FF00..FFEF; Halfwidth and Fullwidth Forms -FFF0..FFFF; Specials -10000..1007F; Linear B Syllabary -10080..100FF; Linear B Ideograms -10100..1013F; Aegean Numbers -10140..1018F; Ancient Greek Numbers -10190..101CF; Ancient Symbols -101D0..101FF; Phaistos Disc -10280..1029F; Lycian -102A0..102DF; Carian -102E0..102FF; Coptic Epact Numbers -10300..1032F; Old Italic -10330..1034F; Gothic -10350..1037F; Old Permic -10380..1039F; Ugaritic -103A0..103DF; Old Persian -10400..1044F; Deseret -10450..1047F; Shavian -10480..104AF; Osmanya -10500..1052F; Elbasan -10530..1056F; Caucasian Albanian -10600..1077F; Linear A -10800..1083F; Cypriot Syllabary -10840..1085F; Imperial Aramaic -10860..1087F; Palmyrene -10880..108AF; Nabataean -108E0..108FF; Hatran -10900..1091F; Phoenician -10920..1093F; Lydian -10980..1099F; Meroitic Hieroglyphs -109A0..109FF; Meroitic Cursive -10A00..10A5F; Kharoshthi -10A60..10A7F; Old South Arabian -10A80..10A9F; Old North Arabian -10AC0..10AFF; Manichaean -10B00..10B3F; Avestan -10B40..10B5F; Inscriptional Parthian -10B60..10B7F; Inscriptional Pahlavi -10B80..10BAF; Psalter Pahlavi -10C00..10C4F; Old Turkic -10C80..10CFF; Old Hungarian -10E60..10E7F; Rumi Numeral Symbols -11000..1107F; Brahmi -11080..110CF; Kaithi -110D0..110FF; Sora Sompeng -11100..1114F; Chakma -11150..1117F; Mahajani -11180..111DF; Sharada -111E0..111FF; Sinhala Archaic Numbers -11200..1124F; Khojki -11280..112AF; Multani -112B0..112FF; Khudawadi -11300..1137F; Grantha -11480..114DF; Tirhuta -11580..115FF; Siddham -11600..1165F; Modi -11680..116CF; Takri -11700..1173F; Ahom -118A0..118FF; Warang Citi -11AC0..11AFF; Pau Cin Hau -12000..123FF; Cuneiform -12400..1247F; Cuneiform Numbers and Punctuation -12480..1254F; Early Dynastic Cuneiform -13000..1342F; Egyptian Hieroglyphs -14400..1467F; Anatolian Hieroglyphs -16800..16A3F; Bamum Supplement -16A40..16A6F; Mro -16AD0..16AFF; Bassa Vah -16B00..16B8F; Pahawh Hmong -16F00..16F9F; Miao -1B000..1B0FF; Kana Supplement -1BC00..1BC9F; Duployan -1BCA0..1BCAF; Shorthand Format Controls -1D000..1D0FF; Byzantine Musical Symbols -1D100..1D1FF; Musical Symbols -1D200..1D24F; Ancient Greek Musical Notation -1D300..1D35F; Tai Xuan Jing Symbols -1D360..1D37F; Counting Rod Numerals -1D400..1D7FF; Mathematical Alphanumeric Symbols -1D800..1DAAF; Sutton SignWriting -1E800..1E8DF; Mende Kikakui -1EE00..1EEFF; Arabic Mathematical Alphabetic Symbols -1F000..1F02F; Mahjong Tiles -1F030..1F09F; Domino Tiles -1F0A0..1F0FF; Playing Cards -1F100..1F1FF; Enclosed Alphanumeric Supplement -1F200..1F2FF; Enclosed Ideographic Supplement -1F300..1F5FF; Miscellaneous Symbols and Pictographs -1F600..1F64F; Emoticons -1F650..1F67F; Ornamental Dingbats -1F680..1F6FF; Transport and Map Symbols -1F700..1F77F; Alchemical Symbols -1F780..1F7FF; Geometric Shapes Extended -1F800..1F8FF; Supplemental Arrows-C -1F900..1F9FF; Supplemental Symbols and Pictographs -20000..2A6DF; CJK Unified Ideographs Extension B -2A700..2B73F; CJK Unified Ideographs Extension C -2B740..2B81F; CJK Unified Ideographs Extension D -2B820..2CEAF; CJK Unified Ideographs Extension E -2F800..2FA1F; CJK Compatibility Ideographs Supplement -E0000..E007F; Tags -E0100..E01EF; Variation Selectors Supplement -F0000..FFFFF; Supplementary Private Use Area-A -100000..10FFFF; Supplementary Private Use Area-B - -# EOF diff --git a/unicode/Generators/DefinedCharListGenerator/App.config b/unicode/Generators/DefinedCharListGenerator/App.config deleted file mode 100644 index 9c05822ff5..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj b/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj deleted file mode 100644 index b1e3df2dc8..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/DefinedCharListGenerator.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4} - Exe - Properties - DefinedCharListGenerator - DefinedCharListGenerator - v4.5.1 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - UnicodeData.txt - PreserveNewest - - - - - \ No newline at end of file diff --git a/unicode/Generators/DefinedCharListGenerator/Program.cs b/unicode/Generators/DefinedCharListGenerator/Program.cs deleted file mode 100644 index edcd0f3602..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/Program.cs +++ /dev/null @@ -1,180 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Globalization; -using System.IO; - -namespace DefinedCharListGenerator -{ - /// - /// This program outputs the 'unicode-defined-chars.bin' bitmap file. - /// - class Program - { - static void Main(string[] args) - { - // The input file should be UnicodeData.txt from the UCD corresponding to the - // version of the Unicode spec we're consuming. - // More info: http://www.unicode.org/reports/tr44/tr44-14.html#UCD_Files - // Latest UnicodeData.txt: http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt - - const uint MAX_UNICODE_CHAR = 0x10FFFF; // Unicode range is U+0000 .. U+10FFFF - bool[] definedChars = new bool[MAX_UNICODE_CHAR + 1]; - Dictionary spans = new Dictionary(); - - // Read all defined characters from the input file. - string[] allLines = File.ReadAllLines("UnicodeData.txt"); - - // Each line is a semicolon-delimited list of information: - // ;;;... - foreach (string line in allLines) - { - string[] splitLine = line.Split(new char[] { ';' }, 4); - uint codepoint = uint.Parse(splitLine[0], NumberStyles.AllowHexSpecifier, CultureInfo.InvariantCulture); - string rawName = splitLine[1]; - string category = splitLine[2]; - - // spans go into their own dictionary for later processing - string spanName; - bool isStartOfSpan; - if (IsSpanDefinition(rawName, out spanName, out isStartOfSpan)) - { - if (isStartOfSpan) - { - spans.Add(spanName, new Span() { FirstCodePoint = codepoint, Category = category }); - } - else - { - var existingSpan = spans[spanName]; - Debug.Assert(existingSpan.FirstCodePoint != 0, "We should've seen the start of this span already."); - Debug.Assert(existingSpan.LastCodePoint == 0, "We shouldn't have seen the end of this span already."); - Debug.Assert(existingSpan.Category == category, "Span start Unicode category doesn't match span end Unicode category."); - existingSpan.LastCodePoint = codepoint; - } - continue; - } - - // We only allow certain categories of code points. - // Zs (space separators) aren't included, but we allow U+0020 SPACE as a special case - - if (!(codepoint == (uint)' ' || IsAllowedUnicodeCategory(category))) - { - continue; - } - - Debug.Assert(codepoint <= MAX_UNICODE_CHAR); - definedChars[codepoint] = true; - } - - // Next, populate characters that weren't defined on their own lines - // but which are instead defined as members of a named span. - foreach (var span in spans.Values) - { - if (IsAllowedUnicodeCategory(span.Category)) - { - Debug.Assert(span.FirstCodePoint <= MAX_UNICODE_CHAR); - Debug.Assert(span.LastCodePoint <= MAX_UNICODE_CHAR); - for (uint i = span.FirstCodePoint; i <= span.LastCodePoint; i++) - { - definedChars[i] = true; - } - } - } - - // Finally, write the list of defined characters out as a bitmap. - // Each consecutive block of 8 chars is written as a single byte. - // For instance, the first byte of the output file contains the - // bitmap for the following codepoints: - // - (bit 7) U+0007 [MSB] - // - (bit 6) U+0006 - // - (bit 5) U+0005 - // - (bit 4) U+0004 - // - (bit 3) U+0003 - // - (bit 2) U+0002 - // - (bit 1) U+0001 - // - (bit 0) U+0000 [LSB] - // The next byte will contain the bitmap for U+000F to U+0008, - // and so on until the last byte, which is U+FFFF to U+FFF8. - // The bytes are written out in little-endian order. - // We're only concerned about the BMP (U+0000 .. U+FFFF) for now. - MemoryStream outBuffer = new MemoryStream(); - for (int i = 0; i < 0x10000; i += 8) - { - int thisByte = 0; - for (int j = 7; j >= 0; j--) - { - thisByte <<= 1; - if (definedChars[i + j]) - { - thisByte |= 0x1; - } - } - outBuffer.WriteByte((byte)thisByte); - } - - File.WriteAllBytes("unicode-defined-chars.bin", outBuffer.ToArray()); - } - - private static bool IsAllowedUnicodeCategory(string category) - { - // We only allow certain classes of characters - return category == "Lu" /* letters */ - || category == "Ll" - || category == "Lt" - || category == "Lm" - || category == "Lo" - || category == "Mn" /* marks */ - || category == "Mc" - || category == "Me" - || category == "Nd" /* numbers */ - || category == "Nl" - || category == "No" - || category == "Pc" /* punctuation */ - || category == "Pd" - || category == "Ps" - || category == "Pe" - || category == "Pi" - || category == "Pf" - || category == "Po" - || category == "Sm" /* symbols */ - || category == "Sc" - || category == "Sk" - || category == "So" - || category == "Cf"; /* other */ - } - - private static bool IsSpanDefinition(string rawName, out string spanName, out bool isStartOfSpan) - { - // Spans are represented within angle brackets, such as the following: - // DC00;;Cs;0;L;;;;;N;;;;; - // DFFF;;Cs;0;L;;;;;N;;;;; - if (rawName.StartsWith("<", StringComparison.Ordinal)) - { - if (rawName.EndsWith(", First>", StringComparison.Ordinal)) - { - spanName = rawName.Substring(1, rawName.Length - 1 - ", First>".Length); - isStartOfSpan = true; - return true; - } - else if (rawName.EndsWith(", Last>", StringComparison.Ordinal)) - { - spanName = rawName.Substring(1, rawName.Length - 1 - ", Last>".Length); - isStartOfSpan = false; - return true; - } - } - - // not surrounded by <>, or or some other non-span - spanName = null; - isStartOfSpan = false; - return false; - } - - private class Span - { - public uint FirstCodePoint; - public uint LastCodePoint; - public string Category; - } - } -} diff --git a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index 693c041be1..0000000000 --- a/unicode/Generators/DefinedCharListGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("DefinedCharListGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DefinedCharListGenerator")] -[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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("5089f890-38f7-413c-87b0-d8eb1e238ef5")] - -// 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")] diff --git a/unicode/Generators/Generators.sln b/unicode/Generators/Generators.sln deleted file mode 100644 index acfaad9b24..0000000000 --- a/unicode/Generators/Generators.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.31101.0 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DefinedCharListGenerator", "DefinedCharListGenerator\DefinedCharListGenerator.csproj", "{0E87CEC9-46CE-4B6B-A613-93AA773C10A4}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "UnicodeTablesGenerator", "UnicodeTablesGenerator\UnicodeTablesGenerator.csproj", "{3D181114-6946-4D34-A3B9-0F83B6B8FEAE}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0E87CEC9-46CE-4B6B-A613-93AA773C10A4}.Release|Any CPU.Build.0 = Release|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/unicode/Generators/UnicodeTablesGenerator/App.config b/unicode/Generators/UnicodeTablesGenerator/App.config deleted file mode 100644 index 9c05822ff5..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/unicode/Generators/UnicodeTablesGenerator/Program.cs b/unicode/Generators/UnicodeTablesGenerator/Program.cs deleted file mode 100644 index 76e4d7bd15..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/Program.cs +++ /dev/null @@ -1,103 +0,0 @@ -using System; -using System.Globalization; -using System.IO; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; - -namespace UnicodeTablesGenerator -{ - /// - /// This program outputs the 'UnicodeBlocks.generated.txt' and - /// 'UnicodeBlocksTests.generated.txt' source files. - /// - /// - /// The generated files require some hand-tweaking. For instance, you'll need - /// to remove surrogates and private use blocks. The files can then be merged - /// into the *.generated.cs files as appropriate. - /// - class Program - { - private const string _codePointFiltersGeneratedFormat = @" -/// -/// A corresponding to the '{0}' Unicode block (U+{1}..U+{2}). -/// -/// -/// See http://www.unicode.org/charts/PDF/U{1}.pdf for the full set of characters in this block. -/// -public static UnicodeRange {3} => Volatile.Read(ref _{4}) ?? CreateRange(ref _{4}, first: '\u{1}', last: '\u{2}'); -private static UnicodeRange _{4}; -"; - - private const string _codePointFiltersTestsGeneratedFormat = @"[InlineData('\u{1}', '\u{2}', nameof(UnicodeRanges.{0}))]"; - - private static void Main() - { - // The input file should be Blocks.txt from the UCD corresponding to the - // version of the Unicode spec we're consuming. - // More info: http://www.unicode.org/reports/tr44/ - // Latest Blocks.txt: http://www.unicode.org/Public/UCD/latest/ucd/Blocks.txt - - StringBuilder runtimeCodeBuilder = new StringBuilder(); - StringBuilder testCodeBuilder = new StringBuilder(); - string[] allLines = File.ReadAllLines("Blocks.txt"); - - Regex regex = new Regex(@"^(?[0-9A-F]{4})\.\.(?[0-9A-F]{4}); (?.+)$"); - - foreach (var line in allLines) - { - // We only care about lines of the form "XXXX..XXXX; Block name" - var match = regex.Match(line); - if (match == null || !match.Success) - { - continue; - } - - string startCode = match.Groups["startCode"].Value; - string endCode = match.Groups["endCode"].Value; - string blockName = match.Groups["blockName"].Value; - string blockNameAsProperty = RemoveAllNonAlphanumeric(blockName); - string blockNameAsField = WithDotNetFieldCasing(blockNameAsProperty); - - runtimeCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersGeneratedFormat, - blockName, startCode, endCode, blockNameAsProperty, blockNameAsField); - - testCodeBuilder.AppendFormat(CultureInfo.InvariantCulture, _codePointFiltersTestsGeneratedFormat, - blockNameAsProperty, startCode, endCode); - testCodeBuilder.AppendLine(); - } - - File.WriteAllText("UnicodeRanges.generated.txt", runtimeCodeBuilder.ToString()); - File.WriteAllText("UnicodeRangesTests.generated.txt", testCodeBuilder.ToString()); - } - - private static string RemoveAllNonAlphanumeric(string blockName) - { - // Allow only A-Z 0-9 - return new String(blockName.ToCharArray().Where(c => ('A' <= c && c <= 'Z') || ('a' <= c && c <= 'z') || ('0' <= c && c <= '9')).ToArray()); - } - - private static string WithDotNetFieldCasing(string input) - { - char[] chars = input.ToCharArray(); - for (int i = 0; i < chars.Length; i++) - { - if (Char.IsLower(chars[i])) - { - if (i > 1) - { - // restore original casing for the previous char unless the previous - // char was at the front of the string - chars[i - 1] = input[i - 1]; - } - break; - } - else - { - chars[i] = Char.ToLowerInvariant(chars[i]); - } - } - return new String(chars); - } - } -} diff --git a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs b/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs deleted file mode 100644 index b7fc3fb222..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("UnicodeTablesGenerator")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("UnicodeTablesGenerator")] -[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)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("c9286457-3d25-4143-9458-028aabedc4f5")] - -// 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")] diff --git a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj b/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj deleted file mode 100644 index 2821a1533c..0000000000 --- a/unicode/Generators/UnicodeTablesGenerator/UnicodeTablesGenerator.csproj +++ /dev/null @@ -1,61 +0,0 @@ - - - - - Debug - AnyCPU - {3D181114-6946-4D34-A3B9-0F83B6B8FEAE} - Exe - Properties - UnicodeTablesGenerator - UnicodeTablesGenerator - v4.5.1 - 512 - true - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - Blocks.txt - PreserveNewest - - - - - \ No newline at end of file diff --git a/unicode/UnicodeData.txt b/unicode/UnicodeData.txt deleted file mode 100644 index aa0e914f84..0000000000 --- a/unicode/UnicodeData.txt +++ /dev/null @@ -1,29215 +0,0 @@ -0000;;Cc;0;BN;;;;;N;NULL;;;; -0001;;Cc;0;BN;;;;;N;START OF HEADING;;;; -0002;;Cc;0;BN;;;;;N;START OF TEXT;;;; -0003;;Cc;0;BN;;;;;N;END OF TEXT;;;; -0004;;Cc;0;BN;;;;;N;END OF TRANSMISSION;;;; -0005;;Cc;0;BN;;;;;N;ENQUIRY;;;; -0006;;Cc;0;BN;;;;;N;ACKNOWLEDGE;;;; -0007;;Cc;0;BN;;;;;N;BELL;;;; -0008;;Cc;0;BN;;;;;N;BACKSPACE;;;; -0009;;Cc;0;S;;;;;N;CHARACTER TABULATION;;;; -000A;;Cc;0;B;;;;;N;LINE FEED (LF);;;; -000B;;Cc;0;S;;;;;N;LINE TABULATION;;;; -000C;;Cc;0;WS;;;;;N;FORM FEED (FF);;;; -000D;;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;; -000E;;Cc;0;BN;;;;;N;SHIFT OUT;;;; -000F;;Cc;0;BN;;;;;N;SHIFT IN;;;; -0010;;Cc;0;BN;;;;;N;DATA LINK ESCAPE;;;; -0011;;Cc;0;BN;;;;;N;DEVICE CONTROL ONE;;;; -0012;;Cc;0;BN;;;;;N;DEVICE CONTROL TWO;;;; -0013;;Cc;0;BN;;;;;N;DEVICE CONTROL THREE;;;; -0014;;Cc;0;BN;;;;;N;DEVICE CONTROL FOUR;;;; -0015;;Cc;0;BN;;;;;N;NEGATIVE ACKNOWLEDGE;;;; -0016;;Cc;0;BN;;;;;N;SYNCHRONOUS IDLE;;;; -0017;;Cc;0;BN;;;;;N;END OF TRANSMISSION BLOCK;;;; -0018;;Cc;0;BN;;;;;N;CANCEL;;;; -0019;;Cc;0;BN;;;;;N;END OF MEDIUM;;;; -001A;;Cc;0;BN;;;;;N;SUBSTITUTE;;;; -001B;;Cc;0;BN;;;;;N;ESCAPE;;;; -001C;;Cc;0;B;;;;;N;INFORMATION SEPARATOR FOUR;;;; -001D;;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;; -001E;;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;; -001F;;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;; -0020;SPACE;Zs;0;WS;;;;;N;;;;; -0021;EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -0022;QUOTATION MARK;Po;0;ON;;;;;N;;;;; -0023;NUMBER SIGN;Po;0;ET;;;;;N;;;;; -0024;DOLLAR SIGN;Sc;0;ET;;;;;N;;;;; -0025;PERCENT SIGN;Po;0;ET;;;;;N;;;;; -0026;AMPERSAND;Po;0;ON;;;;;N;;;;; -0027;APOSTROPHE;Po;0;ON;;;;;N;APOSTROPHE-QUOTE;;;; -0028;LEFT PARENTHESIS;Ps;0;ON;;;;;Y;OPENING PARENTHESIS;;;; -0029;RIGHT PARENTHESIS;Pe;0;ON;;;;;Y;CLOSING PARENTHESIS;;;; -002A;ASTERISK;Po;0;ON;;;;;N;;;;; -002B;PLUS SIGN;Sm;0;ES;;;;;N;;;;; -002C;COMMA;Po;0;CS;;;;;N;;;;; -002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;; -002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;; -002F;SOLIDUS;Po;0;CS;;;;;N;SLASH;;;; -0030;DIGIT ZERO;Nd;0;EN;;0;0;0;N;;;;; -0031;DIGIT ONE;Nd;0;EN;;1;1;1;N;;;;; -0032;DIGIT TWO;Nd;0;EN;;2;2;2;N;;;;; -0033;DIGIT THREE;Nd;0;EN;;3;3;3;N;;;;; -0034;DIGIT FOUR;Nd;0;EN;;4;4;4;N;;;;; -0035;DIGIT FIVE;Nd;0;EN;;5;5;5;N;;;;; -0036;DIGIT SIX;Nd;0;EN;;6;6;6;N;;;;; -0037;DIGIT SEVEN;Nd;0;EN;;7;7;7;N;;;;; -0038;DIGIT EIGHT;Nd;0;EN;;8;8;8;N;;;;; -0039;DIGIT NINE;Nd;0;EN;;9;9;9;N;;;;; -003A;COLON;Po;0;CS;;;;;N;;;;; -003B;SEMICOLON;Po;0;ON;;;;;N;;;;; -003C;LESS-THAN SIGN;Sm;0;ON;;;;;Y;;;;; -003D;EQUALS SIGN;Sm;0;ON;;;;;N;;;;; -003E;GREATER-THAN SIGN;Sm;0;ON;;;;;Y;;;;; -003F;QUESTION MARK;Po;0;ON;;;;;N;;;;; -0040;COMMERCIAL AT;Po;0;ON;;;;;N;;;;; -0041;LATIN CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0061; -0042;LATIN CAPITAL LETTER B;Lu;0;L;;;;;N;;;;0062; -0043;LATIN CAPITAL LETTER C;Lu;0;L;;;;;N;;;;0063; -0044;LATIN CAPITAL LETTER D;Lu;0;L;;;;;N;;;;0064; -0045;LATIN CAPITAL LETTER E;Lu;0;L;;;;;N;;;;0065; -0046;LATIN CAPITAL LETTER F;Lu;0;L;;;;;N;;;;0066; -0047;LATIN CAPITAL LETTER G;Lu;0;L;;;;;N;;;;0067; -0048;LATIN CAPITAL LETTER H;Lu;0;L;;;;;N;;;;0068; -0049;LATIN CAPITAL LETTER I;Lu;0;L;;;;;N;;;;0069; -004A;LATIN CAPITAL LETTER J;Lu;0;L;;;;;N;;;;006A; -004B;LATIN CAPITAL LETTER K;Lu;0;L;;;;;N;;;;006B; -004C;LATIN CAPITAL LETTER L;Lu;0;L;;;;;N;;;;006C; -004D;LATIN CAPITAL LETTER M;Lu;0;L;;;;;N;;;;006D; -004E;LATIN CAPITAL LETTER N;Lu;0;L;;;;;N;;;;006E; -004F;LATIN CAPITAL LETTER O;Lu;0;L;;;;;N;;;;006F; -0050;LATIN CAPITAL LETTER P;Lu;0;L;;;;;N;;;;0070; -0051;LATIN CAPITAL LETTER Q;Lu;0;L;;;;;N;;;;0071; -0052;LATIN CAPITAL LETTER R;Lu;0;L;;;;;N;;;;0072; -0053;LATIN CAPITAL LETTER S;Lu;0;L;;;;;N;;;;0073; -0054;LATIN CAPITAL LETTER T;Lu;0;L;;;;;N;;;;0074; -0055;LATIN CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0075; -0056;LATIN CAPITAL LETTER V;Lu;0;L;;;;;N;;;;0076; -0057;LATIN CAPITAL LETTER W;Lu;0;L;;;;;N;;;;0077; -0058;LATIN CAPITAL LETTER X;Lu;0;L;;;;;N;;;;0078; -0059;LATIN CAPITAL LETTER Y;Lu;0;L;;;;;N;;;;0079; -005A;LATIN CAPITAL LETTER Z;Lu;0;L;;;;;N;;;;007A; -005B;LEFT SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING SQUARE BRACKET;;;; -005C;REVERSE SOLIDUS;Po;0;ON;;;;;N;BACKSLASH;;;; -005D;RIGHT SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING SQUARE BRACKET;;;; -005E;CIRCUMFLEX ACCENT;Sk;0;ON;;;;;N;SPACING CIRCUMFLEX;;;; -005F;LOW LINE;Pc;0;ON;;;;;N;SPACING UNDERSCORE;;;; -0060;GRAVE ACCENT;Sk;0;ON;;;;;N;SPACING GRAVE;;;; -0061;LATIN SMALL LETTER A;Ll;0;L;;;;;N;;;0041;;0041 -0062;LATIN SMALL LETTER B;Ll;0;L;;;;;N;;;0042;;0042 -0063;LATIN SMALL LETTER C;Ll;0;L;;;;;N;;;0043;;0043 -0064;LATIN SMALL LETTER D;Ll;0;L;;;;;N;;;0044;;0044 -0065;LATIN SMALL LETTER E;Ll;0;L;;;;;N;;;0045;;0045 -0066;LATIN SMALL LETTER F;Ll;0;L;;;;;N;;;0046;;0046 -0067;LATIN SMALL LETTER G;Ll;0;L;;;;;N;;;0047;;0047 -0068;LATIN SMALL LETTER H;Ll;0;L;;;;;N;;;0048;;0048 -0069;LATIN SMALL LETTER I;Ll;0;L;;;;;N;;;0049;;0049 -006A;LATIN SMALL LETTER J;Ll;0;L;;;;;N;;;004A;;004A -006B;LATIN SMALL LETTER K;Ll;0;L;;;;;N;;;004B;;004B -006C;LATIN SMALL LETTER L;Ll;0;L;;;;;N;;;004C;;004C -006D;LATIN SMALL LETTER M;Ll;0;L;;;;;N;;;004D;;004D -006E;LATIN SMALL LETTER N;Ll;0;L;;;;;N;;;004E;;004E -006F;LATIN SMALL LETTER O;Ll;0;L;;;;;N;;;004F;;004F -0070;LATIN SMALL LETTER P;Ll;0;L;;;;;N;;;0050;;0050 -0071;LATIN SMALL LETTER Q;Ll;0;L;;;;;N;;;0051;;0051 -0072;LATIN SMALL LETTER R;Ll;0;L;;;;;N;;;0052;;0052 -0073;LATIN SMALL LETTER S;Ll;0;L;;;;;N;;;0053;;0053 -0074;LATIN SMALL LETTER T;Ll;0;L;;;;;N;;;0054;;0054 -0075;LATIN SMALL LETTER U;Ll;0;L;;;;;N;;;0055;;0055 -0076;LATIN SMALL LETTER V;Ll;0;L;;;;;N;;;0056;;0056 -0077;LATIN SMALL LETTER W;Ll;0;L;;;;;N;;;0057;;0057 -0078;LATIN SMALL LETTER X;Ll;0;L;;;;;N;;;0058;;0058 -0079;LATIN SMALL LETTER Y;Ll;0;L;;;;;N;;;0059;;0059 -007A;LATIN SMALL LETTER Z;Ll;0;L;;;;;N;;;005A;;005A -007B;LEFT CURLY BRACKET;Ps;0;ON;;;;;Y;OPENING CURLY BRACKET;;;; -007C;VERTICAL LINE;Sm;0;ON;;;;;N;VERTICAL BAR;;;; -007D;RIGHT CURLY BRACKET;Pe;0;ON;;;;;Y;CLOSING CURLY BRACKET;;;; -007E;TILDE;Sm;0;ON;;;;;N;;;;; -007F;;Cc;0;BN;;;;;N;DELETE;;;; -0080;;Cc;0;BN;;;;;N;;;;; -0081;;Cc;0;BN;;;;;N;;;;; -0082;;Cc;0;BN;;;;;N;BREAK PERMITTED HERE;;;; -0083;;Cc;0;BN;;;;;N;NO BREAK HERE;;;; -0084;;Cc;0;BN;;;;;N;;;;; -0085;;Cc;0;B;;;;;N;NEXT LINE (NEL);;;; -0086;;Cc;0;BN;;;;;N;START OF SELECTED AREA;;;; -0087;;Cc;0;BN;;;;;N;END OF SELECTED AREA;;;; -0088;;Cc;0;BN;;;;;N;CHARACTER TABULATION SET;;;; -0089;;Cc;0;BN;;;;;N;CHARACTER TABULATION WITH JUSTIFICATION;;;; -008A;;Cc;0;BN;;;;;N;LINE TABULATION SET;;;; -008B;;Cc;0;BN;;;;;N;PARTIAL LINE FORWARD;;;; -008C;;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;; -008D;;Cc;0;BN;;;;;N;REVERSE LINE FEED;;;; -008E;;Cc;0;BN;;;;;N;SINGLE SHIFT TWO;;;; -008F;;Cc;0;BN;;;;;N;SINGLE SHIFT THREE;;;; -0090;;Cc;0;BN;;;;;N;DEVICE CONTROL STRING;;;; -0091;;Cc;0;BN;;;;;N;PRIVATE USE ONE;;;; -0092;;Cc;0;BN;;;;;N;PRIVATE USE TWO;;;; -0093;;Cc;0;BN;;;;;N;SET TRANSMIT STATE;;;; -0094;;Cc;0;BN;;;;;N;CANCEL CHARACTER;;;; -0095;;Cc;0;BN;;;;;N;MESSAGE WAITING;;;; -0096;;Cc;0;BN;;;;;N;START OF GUARDED AREA;;;; -0097;;Cc;0;BN;;;;;N;END OF GUARDED AREA;;;; -0098;;Cc;0;BN;;;;;N;START OF STRING;;;; -0099;;Cc;0;BN;;;;;N;;;;; -009A;;Cc;0;BN;;;;;N;SINGLE CHARACTER INTRODUCER;;;; -009B;;Cc;0;BN;;;;;N;CONTROL SEQUENCE INTRODUCER;;;; -009C;;Cc;0;BN;;;;;N;STRING TERMINATOR;;;; -009D;;Cc;0;BN;;;;;N;OPERATING SYSTEM COMMAND;;;; -009E;;Cc;0;BN;;;;;N;PRIVACY MESSAGE;;;; -009F;;Cc;0;BN;;;;;N;APPLICATION PROGRAM COMMAND;;;; -00A0;NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;NON-BREAKING SPACE;;;; -00A1;INVERTED EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -00A2;CENT SIGN;Sc;0;ET;;;;;N;;;;; -00A3;POUND SIGN;Sc;0;ET;;;;;N;;;;; -00A4;CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; -00A5;YEN SIGN;Sc;0;ET;;;;;N;;;;; -00A6;BROKEN BAR;So;0;ON;;;;;N;BROKEN VERTICAL BAR;;;; -00A7;SECTION SIGN;Po;0;ON;;;;;N;;;;; -00A8;DIAERESIS;Sk;0;ON; 0020 0308;;;;N;SPACING DIAERESIS;;;; -00A9;COPYRIGHT SIGN;So;0;ON;;;;;N;;;;; -00AA;FEMININE ORDINAL INDICATOR;Lo;0;L; 0061;;;;N;;;;; -00AB;LEFT-POINTING DOUBLE ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING GUILLEMET;;;; -00AC;NOT SIGN;Sm;0;ON;;;;;N;;;;; -00AD;SOFT HYPHEN;Cf;0;BN;;;;;N;;;;; -00AE;REGISTERED SIGN;So;0;ON;;;;;N;REGISTERED TRADE MARK SIGN;;;; -00AF;MACRON;Sk;0;ON; 0020 0304;;;;N;SPACING MACRON;;;; -00B0;DEGREE SIGN;So;0;ET;;;;;N;;;;; -00B1;PLUS-MINUS SIGN;Sm;0;ET;;;;;N;PLUS-OR-MINUS SIGN;;;; -00B2;SUPERSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUPERSCRIPT DIGIT TWO;;;; -00B3;SUPERSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUPERSCRIPT DIGIT THREE;;;; -00B4;ACUTE ACCENT;Sk;0;ON; 0020 0301;;;;N;SPACING ACUTE;;;; -00B5;MICRO SIGN;Ll;0;L; 03BC;;;;N;;;039C;;039C -00B6;PILCROW SIGN;Po;0;ON;;;;;N;PARAGRAPH SIGN;;;; -00B7;MIDDLE DOT;Po;0;ON;;;;;N;;;;; -00B8;CEDILLA;Sk;0;ON; 0020 0327;;;;N;SPACING CEDILLA;;;; -00B9;SUPERSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUPERSCRIPT DIGIT ONE;;;; -00BA;MASCULINE ORDINAL INDICATOR;Lo;0;L; 006F;;;;N;;;;; -00BB;RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING GUILLEMET;;;; -00BC;VULGAR FRACTION ONE QUARTER;No;0;ON; 0031 2044 0034;;;1/4;N;FRACTION ONE QUARTER;;;; -00BD;VULGAR FRACTION ONE HALF;No;0;ON; 0031 2044 0032;;;1/2;N;FRACTION ONE HALF;;;; -00BE;VULGAR FRACTION THREE QUARTERS;No;0;ON; 0033 2044 0034;;;3/4;N;FRACTION THREE QUARTERS;;;; -00BF;INVERTED QUESTION MARK;Po;0;ON;;;;;N;;;;; -00C0;LATIN CAPITAL LETTER A WITH GRAVE;Lu;0;L;0041 0300;;;;N;LATIN CAPITAL LETTER A GRAVE;;;00E0; -00C1;LATIN CAPITAL LETTER A WITH ACUTE;Lu;0;L;0041 0301;;;;N;LATIN CAPITAL LETTER A ACUTE;;;00E1; -00C2;LATIN CAPITAL LETTER A WITH CIRCUMFLEX;Lu;0;L;0041 0302;;;;N;LATIN CAPITAL LETTER A CIRCUMFLEX;;;00E2; -00C3;LATIN CAPITAL LETTER A WITH TILDE;Lu;0;L;0041 0303;;;;N;LATIN CAPITAL LETTER A TILDE;;;00E3; -00C4;LATIN CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0041 0308;;;;N;LATIN CAPITAL LETTER A DIAERESIS;;;00E4; -00C5;LATIN CAPITAL LETTER A WITH RING ABOVE;Lu;0;L;0041 030A;;;;N;LATIN CAPITAL LETTER A RING;;;00E5; -00C6;LATIN CAPITAL LETTER AE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER A E;;;00E6; -00C7;LATIN CAPITAL LETTER C WITH CEDILLA;Lu;0;L;0043 0327;;;;N;LATIN CAPITAL LETTER C CEDILLA;;;00E7; -00C8;LATIN CAPITAL LETTER E WITH GRAVE;Lu;0;L;0045 0300;;;;N;LATIN CAPITAL LETTER E GRAVE;;;00E8; -00C9;LATIN CAPITAL LETTER E WITH ACUTE;Lu;0;L;0045 0301;;;;N;LATIN CAPITAL LETTER E ACUTE;;;00E9; -00CA;LATIN CAPITAL LETTER E WITH CIRCUMFLEX;Lu;0;L;0045 0302;;;;N;LATIN CAPITAL LETTER E CIRCUMFLEX;;;00EA; -00CB;LATIN CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;0045 0308;;;;N;LATIN CAPITAL LETTER E DIAERESIS;;;00EB; -00CC;LATIN CAPITAL LETTER I WITH GRAVE;Lu;0;L;0049 0300;;;;N;LATIN CAPITAL LETTER I GRAVE;;;00EC; -00CD;LATIN CAPITAL LETTER I WITH ACUTE;Lu;0;L;0049 0301;;;;N;LATIN CAPITAL LETTER I ACUTE;;;00ED; -00CE;LATIN CAPITAL LETTER I WITH CIRCUMFLEX;Lu;0;L;0049 0302;;;;N;LATIN CAPITAL LETTER I CIRCUMFLEX;;;00EE; -00CF;LATIN CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0049 0308;;;;N;LATIN CAPITAL LETTER I DIAERESIS;;;00EF; -00D0;LATIN CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;00F0; -00D1;LATIN CAPITAL LETTER N WITH TILDE;Lu;0;L;004E 0303;;;;N;LATIN CAPITAL LETTER N TILDE;;;00F1; -00D2;LATIN CAPITAL LETTER O WITH GRAVE;Lu;0;L;004F 0300;;;;N;LATIN CAPITAL LETTER O GRAVE;;;00F2; -00D3;LATIN CAPITAL LETTER O WITH ACUTE;Lu;0;L;004F 0301;;;;N;LATIN CAPITAL LETTER O ACUTE;;;00F3; -00D4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX;Lu;0;L;004F 0302;;;;N;LATIN CAPITAL LETTER O CIRCUMFLEX;;;00F4; -00D5;LATIN CAPITAL LETTER O WITH TILDE;Lu;0;L;004F 0303;;;;N;LATIN CAPITAL LETTER O TILDE;;;00F5; -00D6;LATIN CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;004F 0308;;;;N;LATIN CAPITAL LETTER O DIAERESIS;;;00F6; -00D7;MULTIPLICATION SIGN;Sm;0;ON;;;;;N;;;;; -00D8;LATIN CAPITAL LETTER O WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O SLASH;;;00F8; -00D9;LATIN CAPITAL LETTER U WITH GRAVE;Lu;0;L;0055 0300;;;;N;LATIN CAPITAL LETTER U GRAVE;;;00F9; -00DA;LATIN CAPITAL LETTER U WITH ACUTE;Lu;0;L;0055 0301;;;;N;LATIN CAPITAL LETTER U ACUTE;;;00FA; -00DB;LATIN CAPITAL LETTER U WITH CIRCUMFLEX;Lu;0;L;0055 0302;;;;N;LATIN CAPITAL LETTER U CIRCUMFLEX;;;00FB; -00DC;LATIN CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0055 0308;;;;N;LATIN CAPITAL LETTER U DIAERESIS;;;00FC; -00DD;LATIN CAPITAL LETTER Y WITH ACUTE;Lu;0;L;0059 0301;;;;N;LATIN CAPITAL LETTER Y ACUTE;;;00FD; -00DE;LATIN CAPITAL LETTER THORN;Lu;0;L;;;;;N;;;;00FE; -00DF;LATIN SMALL LETTER SHARP S;Ll;0;L;;;;;N;;;;; -00E0;LATIN SMALL LETTER A WITH GRAVE;Ll;0;L;0061 0300;;;;N;LATIN SMALL LETTER A GRAVE;;00C0;;00C0 -00E1;LATIN SMALL LETTER A WITH ACUTE;Ll;0;L;0061 0301;;;;N;LATIN SMALL LETTER A ACUTE;;00C1;;00C1 -00E2;LATIN SMALL LETTER A WITH CIRCUMFLEX;Ll;0;L;0061 0302;;;;N;LATIN SMALL LETTER A CIRCUMFLEX;;00C2;;00C2 -00E3;LATIN SMALL LETTER A WITH TILDE;Ll;0;L;0061 0303;;;;N;LATIN SMALL LETTER A TILDE;;00C3;;00C3 -00E4;LATIN SMALL LETTER A WITH DIAERESIS;Ll;0;L;0061 0308;;;;N;LATIN SMALL LETTER A DIAERESIS;;00C4;;00C4 -00E5;LATIN SMALL LETTER A WITH RING ABOVE;Ll;0;L;0061 030A;;;;N;LATIN SMALL LETTER A RING;;00C5;;00C5 -00E6;LATIN SMALL LETTER AE;Ll;0;L;;;;;N;LATIN SMALL LETTER A E;;00C6;;00C6 -00E7;LATIN SMALL LETTER C WITH CEDILLA;Ll;0;L;0063 0327;;;;N;LATIN SMALL LETTER C CEDILLA;;00C7;;00C7 -00E8;LATIN SMALL LETTER E WITH GRAVE;Ll;0;L;0065 0300;;;;N;LATIN SMALL LETTER E GRAVE;;00C8;;00C8 -00E9;LATIN SMALL LETTER E WITH ACUTE;Ll;0;L;0065 0301;;;;N;LATIN SMALL LETTER E ACUTE;;00C9;;00C9 -00EA;LATIN SMALL LETTER E WITH CIRCUMFLEX;Ll;0;L;0065 0302;;;;N;LATIN SMALL LETTER E CIRCUMFLEX;;00CA;;00CA -00EB;LATIN SMALL LETTER E WITH DIAERESIS;Ll;0;L;0065 0308;;;;N;LATIN SMALL LETTER E DIAERESIS;;00CB;;00CB -00EC;LATIN SMALL LETTER I WITH GRAVE;Ll;0;L;0069 0300;;;;N;LATIN SMALL LETTER I GRAVE;;00CC;;00CC -00ED;LATIN SMALL LETTER I WITH ACUTE;Ll;0;L;0069 0301;;;;N;LATIN SMALL LETTER I ACUTE;;00CD;;00CD -00EE;LATIN SMALL LETTER I WITH CIRCUMFLEX;Ll;0;L;0069 0302;;;;N;LATIN SMALL LETTER I CIRCUMFLEX;;00CE;;00CE -00EF;LATIN SMALL LETTER I WITH DIAERESIS;Ll;0;L;0069 0308;;;;N;LATIN SMALL LETTER I DIAERESIS;;00CF;;00CF -00F0;LATIN SMALL LETTER ETH;Ll;0;L;;;;;N;;;00D0;;00D0 -00F1;LATIN SMALL LETTER N WITH TILDE;Ll;0;L;006E 0303;;;;N;LATIN SMALL LETTER N TILDE;;00D1;;00D1 -00F2;LATIN SMALL LETTER O WITH GRAVE;Ll;0;L;006F 0300;;;;N;LATIN SMALL LETTER O GRAVE;;00D2;;00D2 -00F3;LATIN SMALL LETTER O WITH ACUTE;Ll;0;L;006F 0301;;;;N;LATIN SMALL LETTER O ACUTE;;00D3;;00D3 -00F4;LATIN SMALL LETTER O WITH CIRCUMFLEX;Ll;0;L;006F 0302;;;;N;LATIN SMALL LETTER O CIRCUMFLEX;;00D4;;00D4 -00F5;LATIN SMALL LETTER O WITH TILDE;Ll;0;L;006F 0303;;;;N;LATIN SMALL LETTER O TILDE;;00D5;;00D5 -00F6;LATIN SMALL LETTER O WITH DIAERESIS;Ll;0;L;006F 0308;;;;N;LATIN SMALL LETTER O DIAERESIS;;00D6;;00D6 -00F7;DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -00F8;LATIN SMALL LETTER O WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER O SLASH;;00D8;;00D8 -00F9;LATIN SMALL LETTER U WITH GRAVE;Ll;0;L;0075 0300;;;;N;LATIN SMALL LETTER U GRAVE;;00D9;;00D9 -00FA;LATIN SMALL LETTER U WITH ACUTE;Ll;0;L;0075 0301;;;;N;LATIN SMALL LETTER U ACUTE;;00DA;;00DA -00FB;LATIN SMALL LETTER U WITH CIRCUMFLEX;Ll;0;L;0075 0302;;;;N;LATIN SMALL LETTER U CIRCUMFLEX;;00DB;;00DB -00FC;LATIN SMALL LETTER U WITH DIAERESIS;Ll;0;L;0075 0308;;;;N;LATIN SMALL LETTER U DIAERESIS;;00DC;;00DC -00FD;LATIN SMALL LETTER Y WITH ACUTE;Ll;0;L;0079 0301;;;;N;LATIN SMALL LETTER Y ACUTE;;00DD;;00DD -00FE;LATIN SMALL LETTER THORN;Ll;0;L;;;;;N;;;00DE;;00DE -00FF;LATIN SMALL LETTER Y WITH DIAERESIS;Ll;0;L;0079 0308;;;;N;LATIN SMALL LETTER Y DIAERESIS;;0178;;0178 -0100;LATIN CAPITAL LETTER A WITH MACRON;Lu;0;L;0041 0304;;;;N;LATIN CAPITAL LETTER A MACRON;;;0101; -0101;LATIN SMALL LETTER A WITH MACRON;Ll;0;L;0061 0304;;;;N;LATIN SMALL LETTER A MACRON;;0100;;0100 -0102;LATIN CAPITAL LETTER A WITH BREVE;Lu;0;L;0041 0306;;;;N;LATIN CAPITAL LETTER A BREVE;;;0103; -0103;LATIN SMALL LETTER A WITH BREVE;Ll;0;L;0061 0306;;;;N;LATIN SMALL LETTER A BREVE;;0102;;0102 -0104;LATIN CAPITAL LETTER A WITH OGONEK;Lu;0;L;0041 0328;;;;N;LATIN CAPITAL LETTER A OGONEK;;;0105; -0105;LATIN SMALL LETTER A WITH OGONEK;Ll;0;L;0061 0328;;;;N;LATIN SMALL LETTER A OGONEK;;0104;;0104 -0106;LATIN CAPITAL LETTER C WITH ACUTE;Lu;0;L;0043 0301;;;;N;LATIN CAPITAL LETTER C ACUTE;;;0107; -0107;LATIN SMALL LETTER C WITH ACUTE;Ll;0;L;0063 0301;;;;N;LATIN SMALL LETTER C ACUTE;;0106;;0106 -0108;LATIN CAPITAL LETTER C WITH CIRCUMFLEX;Lu;0;L;0043 0302;;;;N;LATIN CAPITAL LETTER C CIRCUMFLEX;;;0109; -0109;LATIN SMALL LETTER C WITH CIRCUMFLEX;Ll;0;L;0063 0302;;;;N;LATIN SMALL LETTER C CIRCUMFLEX;;0108;;0108 -010A;LATIN CAPITAL LETTER C WITH DOT ABOVE;Lu;0;L;0043 0307;;;;N;LATIN CAPITAL LETTER C DOT;;;010B; -010B;LATIN SMALL LETTER C WITH DOT ABOVE;Ll;0;L;0063 0307;;;;N;LATIN SMALL LETTER C DOT;;010A;;010A -010C;LATIN CAPITAL LETTER C WITH CARON;Lu;0;L;0043 030C;;;;N;LATIN CAPITAL LETTER C HACEK;;;010D; -010D;LATIN SMALL LETTER C WITH CARON;Ll;0;L;0063 030C;;;;N;LATIN SMALL LETTER C HACEK;;010C;;010C -010E;LATIN CAPITAL LETTER D WITH CARON;Lu;0;L;0044 030C;;;;N;LATIN CAPITAL LETTER D HACEK;;;010F; -010F;LATIN SMALL LETTER D WITH CARON;Ll;0;L;0064 030C;;;;N;LATIN SMALL LETTER D HACEK;;010E;;010E -0110;LATIN CAPITAL LETTER D WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D BAR;;;0111; -0111;LATIN SMALL LETTER D WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER D BAR;;0110;;0110 -0112;LATIN CAPITAL LETTER E WITH MACRON;Lu;0;L;0045 0304;;;;N;LATIN CAPITAL LETTER E MACRON;;;0113; -0113;LATIN SMALL LETTER E WITH MACRON;Ll;0;L;0065 0304;;;;N;LATIN SMALL LETTER E MACRON;;0112;;0112 -0114;LATIN CAPITAL LETTER E WITH BREVE;Lu;0;L;0045 0306;;;;N;LATIN CAPITAL LETTER E BREVE;;;0115; -0115;LATIN SMALL LETTER E WITH BREVE;Ll;0;L;0065 0306;;;;N;LATIN SMALL LETTER E BREVE;;0114;;0114 -0116;LATIN CAPITAL LETTER E WITH DOT ABOVE;Lu;0;L;0045 0307;;;;N;LATIN CAPITAL LETTER E DOT;;;0117; -0117;LATIN SMALL LETTER E WITH DOT ABOVE;Ll;0;L;0065 0307;;;;N;LATIN SMALL LETTER E DOT;;0116;;0116 -0118;LATIN CAPITAL LETTER E WITH OGONEK;Lu;0;L;0045 0328;;;;N;LATIN CAPITAL LETTER E OGONEK;;;0119; -0119;LATIN SMALL LETTER E WITH OGONEK;Ll;0;L;0065 0328;;;;N;LATIN SMALL LETTER E OGONEK;;0118;;0118 -011A;LATIN CAPITAL LETTER E WITH CARON;Lu;0;L;0045 030C;;;;N;LATIN CAPITAL LETTER E HACEK;;;011B; -011B;LATIN SMALL LETTER E WITH CARON;Ll;0;L;0065 030C;;;;N;LATIN SMALL LETTER E HACEK;;011A;;011A -011C;LATIN CAPITAL LETTER G WITH CIRCUMFLEX;Lu;0;L;0047 0302;;;;N;LATIN CAPITAL LETTER G CIRCUMFLEX;;;011D; -011D;LATIN SMALL LETTER G WITH CIRCUMFLEX;Ll;0;L;0067 0302;;;;N;LATIN SMALL LETTER G CIRCUMFLEX;;011C;;011C -011E;LATIN CAPITAL LETTER G WITH BREVE;Lu;0;L;0047 0306;;;;N;LATIN CAPITAL LETTER G BREVE;;;011F; -011F;LATIN SMALL LETTER G WITH BREVE;Ll;0;L;0067 0306;;;;N;LATIN SMALL LETTER G BREVE;;011E;;011E -0120;LATIN CAPITAL LETTER G WITH DOT ABOVE;Lu;0;L;0047 0307;;;;N;LATIN CAPITAL LETTER G DOT;;;0121; -0121;LATIN SMALL LETTER G WITH DOT ABOVE;Ll;0;L;0067 0307;;;;N;LATIN SMALL LETTER G DOT;;0120;;0120 -0122;LATIN CAPITAL LETTER G WITH CEDILLA;Lu;0;L;0047 0327;;;;N;LATIN CAPITAL LETTER G CEDILLA;;;0123; -0123;LATIN SMALL LETTER G WITH CEDILLA;Ll;0;L;0067 0327;;;;N;LATIN SMALL LETTER G CEDILLA;;0122;;0122 -0124;LATIN CAPITAL LETTER H WITH CIRCUMFLEX;Lu;0;L;0048 0302;;;;N;LATIN CAPITAL LETTER H CIRCUMFLEX;;;0125; -0125;LATIN SMALL LETTER H WITH CIRCUMFLEX;Ll;0;L;0068 0302;;;;N;LATIN SMALL LETTER H CIRCUMFLEX;;0124;;0124 -0126;LATIN CAPITAL LETTER H WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER H BAR;;;0127; -0127;LATIN SMALL LETTER H WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER H BAR;;0126;;0126 -0128;LATIN CAPITAL LETTER I WITH TILDE;Lu;0;L;0049 0303;;;;N;LATIN CAPITAL LETTER I TILDE;;;0129; -0129;LATIN SMALL LETTER I WITH TILDE;Ll;0;L;0069 0303;;;;N;LATIN SMALL LETTER I TILDE;;0128;;0128 -012A;LATIN CAPITAL LETTER I WITH MACRON;Lu;0;L;0049 0304;;;;N;LATIN CAPITAL LETTER I MACRON;;;012B; -012B;LATIN SMALL LETTER I WITH MACRON;Ll;0;L;0069 0304;;;;N;LATIN SMALL LETTER I MACRON;;012A;;012A -012C;LATIN CAPITAL LETTER I WITH BREVE;Lu;0;L;0049 0306;;;;N;LATIN CAPITAL LETTER I BREVE;;;012D; -012D;LATIN SMALL LETTER I WITH BREVE;Ll;0;L;0069 0306;;;;N;LATIN SMALL LETTER I BREVE;;012C;;012C -012E;LATIN CAPITAL LETTER I WITH OGONEK;Lu;0;L;0049 0328;;;;N;LATIN CAPITAL LETTER I OGONEK;;;012F; -012F;LATIN SMALL LETTER I WITH OGONEK;Ll;0;L;0069 0328;;;;N;LATIN SMALL LETTER I OGONEK;;012E;;012E -0130;LATIN CAPITAL LETTER I WITH DOT ABOVE;Lu;0;L;0049 0307;;;;N;LATIN CAPITAL LETTER I DOT;;;0069; -0131;LATIN SMALL LETTER DOTLESS I;Ll;0;L;;;;;N;;;0049;;0049 -0132;LATIN CAPITAL LIGATURE IJ;Lu;0;L; 0049 004A;;;;N;LATIN CAPITAL LETTER I J;;;0133; -0133;LATIN SMALL LIGATURE IJ;Ll;0;L; 0069 006A;;;;N;LATIN SMALL LETTER I J;;0132;;0132 -0134;LATIN CAPITAL LETTER J WITH CIRCUMFLEX;Lu;0;L;004A 0302;;;;N;LATIN CAPITAL LETTER J CIRCUMFLEX;;;0135; -0135;LATIN SMALL LETTER J WITH CIRCUMFLEX;Ll;0;L;006A 0302;;;;N;LATIN SMALL LETTER J CIRCUMFLEX;;0134;;0134 -0136;LATIN CAPITAL LETTER K WITH CEDILLA;Lu;0;L;004B 0327;;;;N;LATIN CAPITAL LETTER K CEDILLA;;;0137; -0137;LATIN SMALL LETTER K WITH CEDILLA;Ll;0;L;006B 0327;;;;N;LATIN SMALL LETTER K CEDILLA;;0136;;0136 -0138;LATIN SMALL LETTER KRA;Ll;0;L;;;;;N;;;;; -0139;LATIN CAPITAL LETTER L WITH ACUTE;Lu;0;L;004C 0301;;;;N;LATIN CAPITAL LETTER L ACUTE;;;013A; -013A;LATIN SMALL LETTER L WITH ACUTE;Ll;0;L;006C 0301;;;;N;LATIN SMALL LETTER L ACUTE;;0139;;0139 -013B;LATIN CAPITAL LETTER L WITH CEDILLA;Lu;0;L;004C 0327;;;;N;LATIN CAPITAL LETTER L CEDILLA;;;013C; -013C;LATIN SMALL LETTER L WITH CEDILLA;Ll;0;L;006C 0327;;;;N;LATIN SMALL LETTER L CEDILLA;;013B;;013B -013D;LATIN CAPITAL LETTER L WITH CARON;Lu;0;L;004C 030C;;;;N;LATIN CAPITAL LETTER L HACEK;;;013E; -013E;LATIN SMALL LETTER L WITH CARON;Ll;0;L;006C 030C;;;;N;LATIN SMALL LETTER L HACEK;;013D;;013D -013F;LATIN CAPITAL LETTER L WITH MIDDLE DOT;Lu;0;L; 004C 00B7;;;;N;;;;0140; -0140;LATIN SMALL LETTER L WITH MIDDLE DOT;Ll;0;L; 006C 00B7;;;;N;;;013F;;013F -0141;LATIN CAPITAL LETTER L WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER L SLASH;;;0142; -0142;LATIN SMALL LETTER L WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER L SLASH;;0141;;0141 -0143;LATIN CAPITAL LETTER N WITH ACUTE;Lu;0;L;004E 0301;;;;N;LATIN CAPITAL LETTER N ACUTE;;;0144; -0144;LATIN SMALL LETTER N WITH ACUTE;Ll;0;L;006E 0301;;;;N;LATIN SMALL LETTER N ACUTE;;0143;;0143 -0145;LATIN CAPITAL LETTER N WITH CEDILLA;Lu;0;L;004E 0327;;;;N;LATIN CAPITAL LETTER N CEDILLA;;;0146; -0146;LATIN SMALL LETTER N WITH CEDILLA;Ll;0;L;006E 0327;;;;N;LATIN SMALL LETTER N CEDILLA;;0145;;0145 -0147;LATIN CAPITAL LETTER N WITH CARON;Lu;0;L;004E 030C;;;;N;LATIN CAPITAL LETTER N HACEK;;;0148; -0148;LATIN SMALL LETTER N WITH CARON;Ll;0;L;006E 030C;;;;N;LATIN SMALL LETTER N HACEK;;0147;;0147 -0149;LATIN SMALL LETTER N PRECEDED BY APOSTROPHE;Ll;0;L; 02BC 006E;;;;N;LATIN SMALL LETTER APOSTROPHE N;;;; -014A;LATIN CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;014B; -014B;LATIN SMALL LETTER ENG;Ll;0;L;;;;;N;;;014A;;014A -014C;LATIN CAPITAL LETTER O WITH MACRON;Lu;0;L;004F 0304;;;;N;LATIN CAPITAL LETTER O MACRON;;;014D; -014D;LATIN SMALL LETTER O WITH MACRON;Ll;0;L;006F 0304;;;;N;LATIN SMALL LETTER O MACRON;;014C;;014C -014E;LATIN CAPITAL LETTER O WITH BREVE;Lu;0;L;004F 0306;;;;N;LATIN CAPITAL LETTER O BREVE;;;014F; -014F;LATIN SMALL LETTER O WITH BREVE;Ll;0;L;006F 0306;;;;N;LATIN SMALL LETTER O BREVE;;014E;;014E -0150;LATIN CAPITAL LETTER O WITH DOUBLE ACUTE;Lu;0;L;004F 030B;;;;N;LATIN CAPITAL LETTER O DOUBLE ACUTE;;;0151; -0151;LATIN SMALL LETTER O WITH DOUBLE ACUTE;Ll;0;L;006F 030B;;;;N;LATIN SMALL LETTER O DOUBLE ACUTE;;0150;;0150 -0152;LATIN CAPITAL LIGATURE OE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O E;;;0153; -0153;LATIN SMALL LIGATURE OE;Ll;0;L;;;;;N;LATIN SMALL LETTER O E;;0152;;0152 -0154;LATIN CAPITAL LETTER R WITH ACUTE;Lu;0;L;0052 0301;;;;N;LATIN CAPITAL LETTER R ACUTE;;;0155; -0155;LATIN SMALL LETTER R WITH ACUTE;Ll;0;L;0072 0301;;;;N;LATIN SMALL LETTER R ACUTE;;0154;;0154 -0156;LATIN CAPITAL LETTER R WITH CEDILLA;Lu;0;L;0052 0327;;;;N;LATIN CAPITAL LETTER R CEDILLA;;;0157; -0157;LATIN SMALL LETTER R WITH CEDILLA;Ll;0;L;0072 0327;;;;N;LATIN SMALL LETTER R CEDILLA;;0156;;0156 -0158;LATIN CAPITAL LETTER R WITH CARON;Lu;0;L;0052 030C;;;;N;LATIN CAPITAL LETTER R HACEK;;;0159; -0159;LATIN SMALL LETTER R WITH CARON;Ll;0;L;0072 030C;;;;N;LATIN SMALL LETTER R HACEK;;0158;;0158 -015A;LATIN CAPITAL LETTER S WITH ACUTE;Lu;0;L;0053 0301;;;;N;LATIN CAPITAL LETTER S ACUTE;;;015B; -015B;LATIN SMALL LETTER S WITH ACUTE;Ll;0;L;0073 0301;;;;N;LATIN SMALL LETTER S ACUTE;;015A;;015A -015C;LATIN CAPITAL LETTER S WITH CIRCUMFLEX;Lu;0;L;0053 0302;;;;N;LATIN CAPITAL LETTER S CIRCUMFLEX;;;015D; -015D;LATIN SMALL LETTER S WITH CIRCUMFLEX;Ll;0;L;0073 0302;;;;N;LATIN SMALL LETTER S CIRCUMFLEX;;015C;;015C -015E;LATIN CAPITAL LETTER S WITH CEDILLA;Lu;0;L;0053 0327;;;;N;LATIN CAPITAL LETTER S CEDILLA;;;015F; -015F;LATIN SMALL LETTER S WITH CEDILLA;Ll;0;L;0073 0327;;;;N;LATIN SMALL LETTER S CEDILLA;;015E;;015E -0160;LATIN CAPITAL LETTER S WITH CARON;Lu;0;L;0053 030C;;;;N;LATIN CAPITAL LETTER S HACEK;;;0161; -0161;LATIN SMALL LETTER S WITH CARON;Ll;0;L;0073 030C;;;;N;LATIN SMALL LETTER S HACEK;;0160;;0160 -0162;LATIN CAPITAL LETTER T WITH CEDILLA;Lu;0;L;0054 0327;;;;N;LATIN CAPITAL LETTER T CEDILLA;;;0163; -0163;LATIN SMALL LETTER T WITH CEDILLA;Ll;0;L;0074 0327;;;;N;LATIN SMALL LETTER T CEDILLA;;0162;;0162 -0164;LATIN CAPITAL LETTER T WITH CARON;Lu;0;L;0054 030C;;;;N;LATIN CAPITAL LETTER T HACEK;;;0165; -0165;LATIN SMALL LETTER T WITH CARON;Ll;0;L;0074 030C;;;;N;LATIN SMALL LETTER T HACEK;;0164;;0164 -0166;LATIN CAPITAL LETTER T WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T BAR;;;0167; -0167;LATIN SMALL LETTER T WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER T BAR;;0166;;0166 -0168;LATIN CAPITAL LETTER U WITH TILDE;Lu;0;L;0055 0303;;;;N;LATIN CAPITAL LETTER U TILDE;;;0169; -0169;LATIN SMALL LETTER U WITH TILDE;Ll;0;L;0075 0303;;;;N;LATIN SMALL LETTER U TILDE;;0168;;0168 -016A;LATIN CAPITAL LETTER U WITH MACRON;Lu;0;L;0055 0304;;;;N;LATIN CAPITAL LETTER U MACRON;;;016B; -016B;LATIN SMALL LETTER U WITH MACRON;Ll;0;L;0075 0304;;;;N;LATIN SMALL LETTER U MACRON;;016A;;016A -016C;LATIN CAPITAL LETTER U WITH BREVE;Lu;0;L;0055 0306;;;;N;LATIN CAPITAL LETTER U BREVE;;;016D; -016D;LATIN SMALL LETTER U WITH BREVE;Ll;0;L;0075 0306;;;;N;LATIN SMALL LETTER U BREVE;;016C;;016C -016E;LATIN CAPITAL LETTER U WITH RING ABOVE;Lu;0;L;0055 030A;;;;N;LATIN CAPITAL LETTER U RING;;;016F; -016F;LATIN SMALL LETTER U WITH RING ABOVE;Ll;0;L;0075 030A;;;;N;LATIN SMALL LETTER U RING;;016E;;016E -0170;LATIN CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0055 030B;;;;N;LATIN CAPITAL LETTER U DOUBLE ACUTE;;;0171; -0171;LATIN SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0075 030B;;;;N;LATIN SMALL LETTER U DOUBLE ACUTE;;0170;;0170 -0172;LATIN CAPITAL LETTER U WITH OGONEK;Lu;0;L;0055 0328;;;;N;LATIN CAPITAL LETTER U OGONEK;;;0173; -0173;LATIN SMALL LETTER U WITH OGONEK;Ll;0;L;0075 0328;;;;N;LATIN SMALL LETTER U OGONEK;;0172;;0172 -0174;LATIN CAPITAL LETTER W WITH CIRCUMFLEX;Lu;0;L;0057 0302;;;;N;LATIN CAPITAL LETTER W CIRCUMFLEX;;;0175; -0175;LATIN SMALL LETTER W WITH CIRCUMFLEX;Ll;0;L;0077 0302;;;;N;LATIN SMALL LETTER W CIRCUMFLEX;;0174;;0174 -0176;LATIN CAPITAL LETTER Y WITH CIRCUMFLEX;Lu;0;L;0059 0302;;;;N;LATIN CAPITAL LETTER Y CIRCUMFLEX;;;0177; -0177;LATIN SMALL LETTER Y WITH CIRCUMFLEX;Ll;0;L;0079 0302;;;;N;LATIN SMALL LETTER Y CIRCUMFLEX;;0176;;0176 -0178;LATIN CAPITAL LETTER Y WITH DIAERESIS;Lu;0;L;0059 0308;;;;N;LATIN CAPITAL LETTER Y DIAERESIS;;;00FF; -0179;LATIN CAPITAL LETTER Z WITH ACUTE;Lu;0;L;005A 0301;;;;N;LATIN CAPITAL LETTER Z ACUTE;;;017A; -017A;LATIN SMALL LETTER Z WITH ACUTE;Ll;0;L;007A 0301;;;;N;LATIN SMALL LETTER Z ACUTE;;0179;;0179 -017B;LATIN CAPITAL LETTER Z WITH DOT ABOVE;Lu;0;L;005A 0307;;;;N;LATIN CAPITAL LETTER Z DOT;;;017C; -017C;LATIN SMALL LETTER Z WITH DOT ABOVE;Ll;0;L;007A 0307;;;;N;LATIN SMALL LETTER Z DOT;;017B;;017B -017D;LATIN CAPITAL LETTER Z WITH CARON;Lu;0;L;005A 030C;;;;N;LATIN CAPITAL LETTER Z HACEK;;;017E; -017E;LATIN SMALL LETTER Z WITH CARON;Ll;0;L;007A 030C;;;;N;LATIN SMALL LETTER Z HACEK;;017D;;017D -017F;LATIN SMALL LETTER LONG S;Ll;0;L; 0073;;;;N;;;0053;;0053 -0180;LATIN SMALL LETTER B WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER B BAR;;0243;;0243 -0181;LATIN CAPITAL LETTER B WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B HOOK;;;0253; -0182;LATIN CAPITAL LETTER B WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER B TOPBAR;;;0183; -0183;LATIN SMALL LETTER B WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER B TOPBAR;;0182;;0182 -0184;LATIN CAPITAL LETTER TONE SIX;Lu;0;L;;;;;N;;;;0185; -0185;LATIN SMALL LETTER TONE SIX;Ll;0;L;;;;;N;;;0184;;0184 -0186;LATIN CAPITAL LETTER OPEN O;Lu;0;L;;;;;N;;;;0254; -0187;LATIN CAPITAL LETTER C WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER C HOOK;;;0188; -0188;LATIN SMALL LETTER C WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER C HOOK;;0187;;0187 -0189;LATIN CAPITAL LETTER AFRICAN D;Lu;0;L;;;;;N;;;;0256; -018A;LATIN CAPITAL LETTER D WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D HOOK;;;0257; -018B;LATIN CAPITAL LETTER D WITH TOPBAR;Lu;0;L;;;;;N;LATIN CAPITAL LETTER D TOPBAR;;;018C; -018C;LATIN SMALL LETTER D WITH TOPBAR;Ll;0;L;;;;;N;LATIN SMALL LETTER D TOPBAR;;018B;;018B -018D;LATIN SMALL LETTER TURNED DELTA;Ll;0;L;;;;;N;;;;; -018E;LATIN CAPITAL LETTER REVERSED E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER TURNED E;;;01DD; -018F;LATIN CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;0259; -0190;LATIN CAPITAL LETTER OPEN E;Lu;0;L;;;;;N;LATIN CAPITAL LETTER EPSILON;;;025B; -0191;LATIN CAPITAL LETTER F WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER F HOOK;;;0192; -0192;LATIN SMALL LETTER F WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT F;;0191;;0191 -0193;LATIN CAPITAL LETTER G WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G HOOK;;;0260; -0194;LATIN CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;0263; -0195;LATIN SMALL LETTER HV;Ll;0;L;;;;;N;LATIN SMALL LETTER H V;;01F6;;01F6 -0196;LATIN CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;0269; -0197;LATIN CAPITAL LETTER I WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED I;;;0268; -0198;LATIN CAPITAL LETTER K WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER K HOOK;;;0199; -0199;LATIN SMALL LETTER K WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER K HOOK;;0198;;0198 -019A;LATIN SMALL LETTER L WITH BAR;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED L;;023D;;023D -019B;LATIN SMALL LETTER LAMBDA WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED LAMBDA;;;; -019C;LATIN CAPITAL LETTER TURNED M;Lu;0;L;;;;;N;;;;026F; -019D;LATIN CAPITAL LETTER N WITH LEFT HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER N HOOK;;;0272; -019E;LATIN SMALL LETTER N WITH LONG RIGHT LEG;Ll;0;L;;;;;N;;;0220;;0220 -019F;LATIN CAPITAL LETTER O WITH MIDDLE TILDE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER BARRED O;;;0275; -01A0;LATIN CAPITAL LETTER O WITH HORN;Lu;0;L;004F 031B;;;;N;LATIN CAPITAL LETTER O HORN;;;01A1; -01A1;LATIN SMALL LETTER O WITH HORN;Ll;0;L;006F 031B;;;;N;LATIN SMALL LETTER O HORN;;01A0;;01A0 -01A2;LATIN CAPITAL LETTER OI;Lu;0;L;;;;;N;LATIN CAPITAL LETTER O I;;;01A3; -01A3;LATIN SMALL LETTER OI;Ll;0;L;;;;;N;LATIN SMALL LETTER O I;;01A2;;01A2 -01A4;LATIN CAPITAL LETTER P WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER P HOOK;;;01A5; -01A5;LATIN SMALL LETTER P WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER P HOOK;;01A4;;01A4 -01A6;LATIN LETTER YR;Lu;0;L;;;;;N;LATIN LETTER Y R;;;0280; -01A7;LATIN CAPITAL LETTER TONE TWO;Lu;0;L;;;;;N;;;;01A8; -01A8;LATIN SMALL LETTER TONE TWO;Ll;0;L;;;;;N;;;01A7;;01A7 -01A9;LATIN CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;0283; -01AA;LATIN LETTER REVERSED ESH LOOP;Ll;0;L;;;;;N;;;;; -01AB;LATIN SMALL LETTER T WITH PALATAL HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T PALATAL HOOK;;;; -01AC;LATIN CAPITAL LETTER T WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T HOOK;;;01AD; -01AD;LATIN SMALL LETTER T WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T HOOK;;01AC;;01AC -01AE;LATIN CAPITAL LETTER T WITH RETROFLEX HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER T RETROFLEX HOOK;;;0288; -01AF;LATIN CAPITAL LETTER U WITH HORN;Lu;0;L;0055 031B;;;;N;LATIN CAPITAL LETTER U HORN;;;01B0; -01B0;LATIN SMALL LETTER U WITH HORN;Ll;0;L;0075 031B;;;;N;LATIN SMALL LETTER U HORN;;01AF;;01AF -01B1;LATIN CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;028A; -01B2;LATIN CAPITAL LETTER V WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER SCRIPT V;;;028B; -01B3;LATIN CAPITAL LETTER Y WITH HOOK;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Y HOOK;;;01B4; -01B4;LATIN SMALL LETTER Y WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Y HOOK;;01B3;;01B3 -01B5;LATIN CAPITAL LETTER Z WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER Z BAR;;;01B6; -01B6;LATIN SMALL LETTER Z WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER Z BAR;;01B5;;01B5 -01B7;LATIN CAPITAL LETTER EZH;Lu;0;L;;;;;N;LATIN CAPITAL LETTER YOGH;;;0292; -01B8;LATIN CAPITAL LETTER EZH REVERSED;Lu;0;L;;;;;N;LATIN CAPITAL LETTER REVERSED YOGH;;;01B9; -01B9;LATIN SMALL LETTER EZH REVERSED;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED YOGH;;01B8;;01B8 -01BA;LATIN SMALL LETTER EZH WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH WITH TAIL;;;; -01BB;LATIN LETTER TWO WITH STROKE;Lo;0;L;;;;;N;LATIN LETTER TWO BAR;;;; -01BC;LATIN CAPITAL LETTER TONE FIVE;Lu;0;L;;;;;N;;;;01BD; -01BD;LATIN SMALL LETTER TONE FIVE;Ll;0;L;;;;;N;;;01BC;;01BC -01BE;LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER INVERTED GLOTTAL STOP BAR;;;; -01BF;LATIN LETTER WYNN;Ll;0;L;;;;;N;;;01F7;;01F7 -01C0;LATIN LETTER DENTAL CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE;;;; -01C1;LATIN LETTER LATERAL CLICK;Lo;0;L;;;;;N;LATIN LETTER DOUBLE PIPE;;;; -01C2;LATIN LETTER ALVEOLAR CLICK;Lo;0;L;;;;;N;LATIN LETTER PIPE DOUBLE BAR;;;; -01C3;LATIN LETTER RETROFLEX CLICK;Lo;0;L;;;;;N;LATIN LETTER EXCLAMATION MARK;;;; -01C4;LATIN CAPITAL LETTER DZ WITH CARON;Lu;0;L; 0044 017D;;;;N;LATIN CAPITAL LETTER D Z HACEK;;;01C6;01C5 -01C5;LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON;Lt;0;L; 0044 017E;;;;N;LATIN LETTER CAPITAL D SMALL Z HACEK;;01C4;01C6;01C5 -01C6;LATIN SMALL LETTER DZ WITH CARON;Ll;0;L; 0064 017E;;;;N;LATIN SMALL LETTER D Z HACEK;;01C4;;01C5 -01C7;LATIN CAPITAL LETTER LJ;Lu;0;L; 004C 004A;;;;N;LATIN CAPITAL LETTER L J;;;01C9;01C8 -01C8;LATIN CAPITAL LETTER L WITH SMALL LETTER J;Lt;0;L; 004C 006A;;;;N;LATIN LETTER CAPITAL L SMALL J;;01C7;01C9;01C8 -01C9;LATIN SMALL LETTER LJ;Ll;0;L; 006C 006A;;;;N;LATIN SMALL LETTER L J;;01C7;;01C8 -01CA;LATIN CAPITAL LETTER NJ;Lu;0;L; 004E 004A;;;;N;LATIN CAPITAL LETTER N J;;;01CC;01CB -01CB;LATIN CAPITAL LETTER N WITH SMALL LETTER J;Lt;0;L; 004E 006A;;;;N;LATIN LETTER CAPITAL N SMALL J;;01CA;01CC;01CB -01CC;LATIN SMALL LETTER NJ;Ll;0;L; 006E 006A;;;;N;LATIN SMALL LETTER N J;;01CA;;01CB -01CD;LATIN CAPITAL LETTER A WITH CARON;Lu;0;L;0041 030C;;;;N;LATIN CAPITAL LETTER A HACEK;;;01CE; -01CE;LATIN SMALL LETTER A WITH CARON;Ll;0;L;0061 030C;;;;N;LATIN SMALL LETTER A HACEK;;01CD;;01CD -01CF;LATIN CAPITAL LETTER I WITH CARON;Lu;0;L;0049 030C;;;;N;LATIN CAPITAL LETTER I HACEK;;;01D0; -01D0;LATIN SMALL LETTER I WITH CARON;Ll;0;L;0069 030C;;;;N;LATIN SMALL LETTER I HACEK;;01CF;;01CF -01D1;LATIN CAPITAL LETTER O WITH CARON;Lu;0;L;004F 030C;;;;N;LATIN CAPITAL LETTER O HACEK;;;01D2; -01D2;LATIN SMALL LETTER O WITH CARON;Ll;0;L;006F 030C;;;;N;LATIN SMALL LETTER O HACEK;;01D1;;01D1 -01D3;LATIN CAPITAL LETTER U WITH CARON;Lu;0;L;0055 030C;;;;N;LATIN CAPITAL LETTER U HACEK;;;01D4; -01D4;LATIN SMALL LETTER U WITH CARON;Ll;0;L;0075 030C;;;;N;LATIN SMALL LETTER U HACEK;;01D3;;01D3 -01D5;LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON;Lu;0;L;00DC 0304;;;;N;LATIN CAPITAL LETTER U DIAERESIS MACRON;;;01D6; -01D6;LATIN SMALL LETTER U WITH DIAERESIS AND MACRON;Ll;0;L;00FC 0304;;;;N;LATIN SMALL LETTER U DIAERESIS MACRON;;01D5;;01D5 -01D7;LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE;Lu;0;L;00DC 0301;;;;N;LATIN CAPITAL LETTER U DIAERESIS ACUTE;;;01D8; -01D8;LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE;Ll;0;L;00FC 0301;;;;N;LATIN SMALL LETTER U DIAERESIS ACUTE;;01D7;;01D7 -01D9;LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON;Lu;0;L;00DC 030C;;;;N;LATIN CAPITAL LETTER U DIAERESIS HACEK;;;01DA; -01DA;LATIN SMALL LETTER U WITH DIAERESIS AND CARON;Ll;0;L;00FC 030C;;;;N;LATIN SMALL LETTER U DIAERESIS HACEK;;01D9;;01D9 -01DB;LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE;Lu;0;L;00DC 0300;;;;N;LATIN CAPITAL LETTER U DIAERESIS GRAVE;;;01DC; -01DC;LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE;Ll;0;L;00FC 0300;;;;N;LATIN SMALL LETTER U DIAERESIS GRAVE;;01DB;;01DB -01DD;LATIN SMALL LETTER TURNED E;Ll;0;L;;;;;N;;;018E;;018E -01DE;LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON;Lu;0;L;00C4 0304;;;;N;LATIN CAPITAL LETTER A DIAERESIS MACRON;;;01DF; -01DF;LATIN SMALL LETTER A WITH DIAERESIS AND MACRON;Ll;0;L;00E4 0304;;;;N;LATIN SMALL LETTER A DIAERESIS MACRON;;01DE;;01DE -01E0;LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON;Lu;0;L;0226 0304;;;;N;LATIN CAPITAL LETTER A DOT MACRON;;;01E1; -01E1;LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON;Ll;0;L;0227 0304;;;;N;LATIN SMALL LETTER A DOT MACRON;;01E0;;01E0 -01E2;LATIN CAPITAL LETTER AE WITH MACRON;Lu;0;L;00C6 0304;;;;N;LATIN CAPITAL LETTER A E MACRON;;;01E3; -01E3;LATIN SMALL LETTER AE WITH MACRON;Ll;0;L;00E6 0304;;;;N;LATIN SMALL LETTER A E MACRON;;01E2;;01E2 -01E4;LATIN CAPITAL LETTER G WITH STROKE;Lu;0;L;;;;;N;LATIN CAPITAL LETTER G BAR;;;01E5; -01E5;LATIN SMALL LETTER G WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER G BAR;;01E4;;01E4 -01E6;LATIN CAPITAL LETTER G WITH CARON;Lu;0;L;0047 030C;;;;N;LATIN CAPITAL LETTER G HACEK;;;01E7; -01E7;LATIN SMALL LETTER G WITH CARON;Ll;0;L;0067 030C;;;;N;LATIN SMALL LETTER G HACEK;;01E6;;01E6 -01E8;LATIN CAPITAL LETTER K WITH CARON;Lu;0;L;004B 030C;;;;N;LATIN CAPITAL LETTER K HACEK;;;01E9; -01E9;LATIN SMALL LETTER K WITH CARON;Ll;0;L;006B 030C;;;;N;LATIN SMALL LETTER K HACEK;;01E8;;01E8 -01EA;LATIN CAPITAL LETTER O WITH OGONEK;Lu;0;L;004F 0328;;;;N;LATIN CAPITAL LETTER O OGONEK;;;01EB; -01EB;LATIN SMALL LETTER O WITH OGONEK;Ll;0;L;006F 0328;;;;N;LATIN SMALL LETTER O OGONEK;;01EA;;01EA -01EC;LATIN CAPITAL LETTER O WITH OGONEK AND MACRON;Lu;0;L;01EA 0304;;;;N;LATIN CAPITAL LETTER O OGONEK MACRON;;;01ED; -01ED;LATIN SMALL LETTER O WITH OGONEK AND MACRON;Ll;0;L;01EB 0304;;;;N;LATIN SMALL LETTER O OGONEK MACRON;;01EC;;01EC -01EE;LATIN CAPITAL LETTER EZH WITH CARON;Lu;0;L;01B7 030C;;;;N;LATIN CAPITAL LETTER YOGH HACEK;;;01EF; -01EF;LATIN SMALL LETTER EZH WITH CARON;Ll;0;L;0292 030C;;;;N;LATIN SMALL LETTER YOGH HACEK;;01EE;;01EE -01F0;LATIN SMALL LETTER J WITH CARON;Ll;0;L;006A 030C;;;;N;LATIN SMALL LETTER J HACEK;;;; -01F1;LATIN CAPITAL LETTER DZ;Lu;0;L; 0044 005A;;;;N;;;;01F3;01F2 -01F2;LATIN CAPITAL LETTER D WITH SMALL LETTER Z;Lt;0;L; 0044 007A;;;;N;;;01F1;01F3;01F2 -01F3;LATIN SMALL LETTER DZ;Ll;0;L; 0064 007A;;;;N;;;01F1;;01F2 -01F4;LATIN CAPITAL LETTER G WITH ACUTE;Lu;0;L;0047 0301;;;;N;;;;01F5; -01F5;LATIN SMALL LETTER G WITH ACUTE;Ll;0;L;0067 0301;;;;N;;;01F4;;01F4 -01F6;LATIN CAPITAL LETTER HWAIR;Lu;0;L;;;;;N;;;;0195; -01F7;LATIN CAPITAL LETTER WYNN;Lu;0;L;;;;;N;;;;01BF; -01F8;LATIN CAPITAL LETTER N WITH GRAVE;Lu;0;L;004E 0300;;;;N;;;;01F9; -01F9;LATIN SMALL LETTER N WITH GRAVE;Ll;0;L;006E 0300;;;;N;;;01F8;;01F8 -01FA;LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE;Lu;0;L;00C5 0301;;;;N;;;;01FB; -01FB;LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE;Ll;0;L;00E5 0301;;;;N;;;01FA;;01FA -01FC;LATIN CAPITAL LETTER AE WITH ACUTE;Lu;0;L;00C6 0301;;;;N;;;;01FD; -01FD;LATIN SMALL LETTER AE WITH ACUTE;Ll;0;L;00E6 0301;;;;N;;;01FC;;01FC -01FE;LATIN CAPITAL LETTER O WITH STROKE AND ACUTE;Lu;0;L;00D8 0301;;;;N;;;;01FF; -01FF;LATIN SMALL LETTER O WITH STROKE AND ACUTE;Ll;0;L;00F8 0301;;;;N;;;01FE;;01FE -0200;LATIN CAPITAL LETTER A WITH DOUBLE GRAVE;Lu;0;L;0041 030F;;;;N;;;;0201; -0201;LATIN SMALL LETTER A WITH DOUBLE GRAVE;Ll;0;L;0061 030F;;;;N;;;0200;;0200 -0202;LATIN CAPITAL LETTER A WITH INVERTED BREVE;Lu;0;L;0041 0311;;;;N;;;;0203; -0203;LATIN SMALL LETTER A WITH INVERTED BREVE;Ll;0;L;0061 0311;;;;N;;;0202;;0202 -0204;LATIN CAPITAL LETTER E WITH DOUBLE GRAVE;Lu;0;L;0045 030F;;;;N;;;;0205; -0205;LATIN SMALL LETTER E WITH DOUBLE GRAVE;Ll;0;L;0065 030F;;;;N;;;0204;;0204 -0206;LATIN CAPITAL LETTER E WITH INVERTED BREVE;Lu;0;L;0045 0311;;;;N;;;;0207; -0207;LATIN SMALL LETTER E WITH INVERTED BREVE;Ll;0;L;0065 0311;;;;N;;;0206;;0206 -0208;LATIN CAPITAL LETTER I WITH DOUBLE GRAVE;Lu;0;L;0049 030F;;;;N;;;;0209; -0209;LATIN SMALL LETTER I WITH DOUBLE GRAVE;Ll;0;L;0069 030F;;;;N;;;0208;;0208 -020A;LATIN CAPITAL LETTER I WITH INVERTED BREVE;Lu;0;L;0049 0311;;;;N;;;;020B; -020B;LATIN SMALL LETTER I WITH INVERTED BREVE;Ll;0;L;0069 0311;;;;N;;;020A;;020A -020C;LATIN CAPITAL LETTER O WITH DOUBLE GRAVE;Lu;0;L;004F 030F;;;;N;;;;020D; -020D;LATIN SMALL LETTER O WITH DOUBLE GRAVE;Ll;0;L;006F 030F;;;;N;;;020C;;020C -020E;LATIN CAPITAL LETTER O WITH INVERTED BREVE;Lu;0;L;004F 0311;;;;N;;;;020F; -020F;LATIN SMALL LETTER O WITH INVERTED BREVE;Ll;0;L;006F 0311;;;;N;;;020E;;020E -0210;LATIN CAPITAL LETTER R WITH DOUBLE GRAVE;Lu;0;L;0052 030F;;;;N;;;;0211; -0211;LATIN SMALL LETTER R WITH DOUBLE GRAVE;Ll;0;L;0072 030F;;;;N;;;0210;;0210 -0212;LATIN CAPITAL LETTER R WITH INVERTED BREVE;Lu;0;L;0052 0311;;;;N;;;;0213; -0213;LATIN SMALL LETTER R WITH INVERTED BREVE;Ll;0;L;0072 0311;;;;N;;;0212;;0212 -0214;LATIN CAPITAL LETTER U WITH DOUBLE GRAVE;Lu;0;L;0055 030F;;;;N;;;;0215; -0215;LATIN SMALL LETTER U WITH DOUBLE GRAVE;Ll;0;L;0075 030F;;;;N;;;0214;;0214 -0216;LATIN CAPITAL LETTER U WITH INVERTED BREVE;Lu;0;L;0055 0311;;;;N;;;;0217; -0217;LATIN SMALL LETTER U WITH INVERTED BREVE;Ll;0;L;0075 0311;;;;N;;;0216;;0216 -0218;LATIN CAPITAL LETTER S WITH COMMA BELOW;Lu;0;L;0053 0326;;;;N;;;;0219; -0219;LATIN SMALL LETTER S WITH COMMA BELOW;Ll;0;L;0073 0326;;;;N;;;0218;;0218 -021A;LATIN CAPITAL LETTER T WITH COMMA BELOW;Lu;0;L;0054 0326;;;;N;;;;021B; -021B;LATIN SMALL LETTER T WITH COMMA BELOW;Ll;0;L;0074 0326;;;;N;;;021A;;021A -021C;LATIN CAPITAL LETTER YOGH;Lu;0;L;;;;;N;;;;021D; -021D;LATIN SMALL LETTER YOGH;Ll;0;L;;;;;N;;;021C;;021C -021E;LATIN CAPITAL LETTER H WITH CARON;Lu;0;L;0048 030C;;;;N;;;;021F; -021F;LATIN SMALL LETTER H WITH CARON;Ll;0;L;0068 030C;;;;N;;;021E;;021E -0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E; -0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;; -0222;LATIN CAPITAL LETTER OU;Lu;0;L;;;;;N;;;;0223; -0223;LATIN SMALL LETTER OU;Ll;0;L;;;;;N;;;0222;;0222 -0224;LATIN CAPITAL LETTER Z WITH HOOK;Lu;0;L;;;;;N;;;;0225; -0225;LATIN SMALL LETTER Z WITH HOOK;Ll;0;L;;;;;N;;;0224;;0224 -0226;LATIN CAPITAL LETTER A WITH DOT ABOVE;Lu;0;L;0041 0307;;;;N;;;;0227; -0227;LATIN SMALL LETTER A WITH DOT ABOVE;Ll;0;L;0061 0307;;;;N;;;0226;;0226 -0228;LATIN CAPITAL LETTER E WITH CEDILLA;Lu;0;L;0045 0327;;;;N;;;;0229; -0229;LATIN SMALL LETTER E WITH CEDILLA;Ll;0;L;0065 0327;;;;N;;;0228;;0228 -022A;LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON;Lu;0;L;00D6 0304;;;;N;;;;022B; -022B;LATIN SMALL LETTER O WITH DIAERESIS AND MACRON;Ll;0;L;00F6 0304;;;;N;;;022A;;022A -022C;LATIN CAPITAL LETTER O WITH TILDE AND MACRON;Lu;0;L;00D5 0304;;;;N;;;;022D; -022D;LATIN SMALL LETTER O WITH TILDE AND MACRON;Ll;0;L;00F5 0304;;;;N;;;022C;;022C -022E;LATIN CAPITAL LETTER O WITH DOT ABOVE;Lu;0;L;004F 0307;;;;N;;;;022F; -022F;LATIN SMALL LETTER O WITH DOT ABOVE;Ll;0;L;006F 0307;;;;N;;;022E;;022E -0230;LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON;Lu;0;L;022E 0304;;;;N;;;;0231; -0231;LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON;Ll;0;L;022F 0304;;;;N;;;0230;;0230 -0232;LATIN CAPITAL LETTER Y WITH MACRON;Lu;0;L;0059 0304;;;;N;;;;0233; -0233;LATIN SMALL LETTER Y WITH MACRON;Ll;0;L;0079 0304;;;;N;;;0232;;0232 -0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;; -0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;; -0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;; -0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;; -0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;; -0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;; -023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65; -023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C; -023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B -023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A; -023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66; -023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7E;;2C7E -0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;2C7F;;2C7F -0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242; -0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241 -0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180; -0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289; -0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C; -0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247; -0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246 -0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249; -0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248 -024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B; -024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A -024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D; -024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C -024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F; -024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E -0250;LATIN SMALL LETTER TURNED A;Ll;0;L;;;;;N;;;2C6F;;2C6F -0251;LATIN SMALL LETTER ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT A;;2C6D;;2C6D -0252;LATIN SMALL LETTER TURNED ALPHA;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED SCRIPT A;;2C70;;2C70 -0253;LATIN SMALL LETTER B WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER B HOOK;;0181;;0181 -0254;LATIN SMALL LETTER OPEN O;Ll;0;L;;;;;N;;;0186;;0186 -0255;LATIN SMALL LETTER C WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER C CURL;;;; -0256;LATIN SMALL LETTER D WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER D RETROFLEX HOOK;;0189;;0189 -0257;LATIN SMALL LETTER D WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER D HOOK;;018A;;018A -0258;LATIN SMALL LETTER REVERSED E;Ll;0;L;;;;;N;;;;; -0259;LATIN SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;018F;;018F -025A;LATIN SMALL LETTER SCHWA WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCHWA HOOK;;;; -025B;LATIN SMALL LETTER OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER EPSILON;;0190;;0190 -025C;LATIN SMALL LETTER REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON;;A7AB;;A7AB -025D;LATIN SMALL LETTER REVERSED OPEN E WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED EPSILON HOOK;;;; -025E;LATIN SMALL LETTER CLOSED REVERSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED REVERSED EPSILON;;;; -025F;LATIN SMALL LETTER DOTLESS J WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR;;;; -0260;LATIN SMALL LETTER G WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER G HOOK;;0193;;0193 -0261;LATIN SMALL LETTER SCRIPT G;Ll;0;L;;;;;N;;;A7AC;;A7AC -0262;LATIN LETTER SMALL CAPITAL G;Ll;0;L;;;;;N;;;;; -0263;LATIN SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0194;;0194 -0264;LATIN SMALL LETTER RAMS HORN;Ll;0;L;;;;;N;LATIN SMALL LETTER BABY GAMMA;;;; -0265;LATIN SMALL LETTER TURNED H;Ll;0;L;;;;;N;;;A78D;;A78D -0266;LATIN SMALL LETTER H WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER H HOOK;;A7AA;;A7AA -0267;LATIN SMALL LETTER HENG WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER HENG HOOK;;;; -0268;LATIN SMALL LETTER I WITH STROKE;Ll;0;L;;;;;N;LATIN SMALL LETTER BARRED I;;0197;;0197 -0269;LATIN SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0196;;0196 -026A;LATIN LETTER SMALL CAPITAL I;Ll;0;L;;;;;N;;;;; -026B;LATIN SMALL LETTER L WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;2C62;;2C62 -026C;LATIN SMALL LETTER L WITH BELT;Ll;0;L;;;;;N;LATIN SMALL LETTER L BELT;;A7AD;;A7AD -026D;LATIN SMALL LETTER L WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER L RETROFLEX HOOK;;;; -026E;LATIN SMALL LETTER LEZH;Ll;0;L;;;;;N;LATIN SMALL LETTER L YOGH;;;; -026F;LATIN SMALL LETTER TURNED M;Ll;0;L;;;;;N;;;019C;;019C -0270;LATIN SMALL LETTER TURNED M WITH LONG LEG;Ll;0;L;;;;;N;;;;; -0271;LATIN SMALL LETTER M WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER M HOOK;;2C6E;;2C6E -0272;LATIN SMALL LETTER N WITH LEFT HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N HOOK;;019D;;019D -0273;LATIN SMALL LETTER N WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER N RETROFLEX HOOK;;;; -0274;LATIN LETTER SMALL CAPITAL N;Ll;0;L;;;;;N;;;;; -0275;LATIN SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;019F;;019F -0276;LATIN LETTER SMALL CAPITAL OE;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL O E;;;; -0277;LATIN SMALL LETTER CLOSED OMEGA;Ll;0;L;;;;;N;;;;; -0278;LATIN SMALL LETTER PHI;Ll;0;L;;;;;N;;;;; -0279;LATIN SMALL LETTER TURNED R;Ll;0;L;;;;;N;;;;; -027A;LATIN SMALL LETTER TURNED R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027B;LATIN SMALL LETTER TURNED R WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER TURNED R HOOK;;;; -027C;LATIN SMALL LETTER R WITH LONG LEG;Ll;0;L;;;;;N;;;;; -027D;LATIN SMALL LETTER R WITH TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER R HOOK;;2C64;;2C64 -027E;LATIN SMALL LETTER R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER FISHHOOK R;;;; -027F;LATIN SMALL LETTER REVERSED R WITH FISHHOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER REVERSED FISHHOOK R;;;; -0280;LATIN LETTER SMALL CAPITAL R;Ll;0;L;;;;;N;;;01A6;;01A6 -0281;LATIN LETTER SMALL CAPITAL INVERTED R;Ll;0;L;;;;;N;;;;; -0282;LATIN SMALL LETTER S WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER S HOOK;;;; -0283;LATIN SMALL LETTER ESH;Ll;0;L;;;;;N;;;01A9;;01A9 -0284;LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER DOTLESS J BAR HOOK;;;; -0285;LATIN SMALL LETTER SQUAT REVERSED ESH;Ll;0;L;;;;;N;;;;; -0286;LATIN SMALL LETTER ESH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER ESH CURL;;;; -0287;LATIN SMALL LETTER TURNED T;Ll;0;L;;;;;N;;;A7B1;;A7B1 -0288;LATIN SMALL LETTER T WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER T RETROFLEX HOOK;;01AE;;01AE -0289;LATIN SMALL LETTER U BAR;Ll;0;L;;;;;N;;;0244;;0244 -028A;LATIN SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;01B1;;01B1 -028B;LATIN SMALL LETTER V WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER SCRIPT V;;01B2;;01B2 -028C;LATIN SMALL LETTER TURNED V;Ll;0;L;;;;;N;;;0245;;0245 -028D;LATIN SMALL LETTER TURNED W;Ll;0;L;;;;;N;;;;; -028E;LATIN SMALL LETTER TURNED Y;Ll;0;L;;;;;N;;;;; -028F;LATIN LETTER SMALL CAPITAL Y;Ll;0;L;;;;;N;;;;; -0290;LATIN SMALL LETTER Z WITH RETROFLEX HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Z RETROFLEX HOOK;;;; -0291;LATIN SMALL LETTER Z WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER Z CURL;;;; -0292;LATIN SMALL LETTER EZH;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH;;01B7;;01B7 -0293;LATIN SMALL LETTER EZH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER YOGH CURL;;;; -0294;LATIN LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -0295;LATIN LETTER PHARYNGEAL VOICED FRICATIVE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP;;;; -0296;LATIN LETTER INVERTED GLOTTAL STOP;Ll;0;L;;;;;N;;;;; -0297;LATIN LETTER STRETCHED C;Ll;0;L;;;;;N;;;;; -0298;LATIN LETTER BILABIAL CLICK;Ll;0;L;;;;;N;LATIN LETTER BULLSEYE;;;; -0299;LATIN LETTER SMALL CAPITAL B;Ll;0;L;;;;;N;;;;; -029A;LATIN SMALL LETTER CLOSED OPEN E;Ll;0;L;;;;;N;LATIN SMALL LETTER CLOSED EPSILON;;;; -029B;LATIN LETTER SMALL CAPITAL G WITH HOOK;Ll;0;L;;;;;N;LATIN LETTER SMALL CAPITAL G HOOK;;;; -029C;LATIN LETTER SMALL CAPITAL H;Ll;0;L;;;;;N;;;;; -029D;LATIN SMALL LETTER J WITH CROSSED-TAIL;Ll;0;L;;;;;N;LATIN SMALL LETTER CROSSED-TAIL J;;A7B2;;A7B2 -029E;LATIN SMALL LETTER TURNED K;Ll;0;L;;;;;N;;;A7B0;;A7B0 -029F;LATIN LETTER SMALL CAPITAL L;Ll;0;L;;;;;N;;;;; -02A0;LATIN SMALL LETTER Q WITH HOOK;Ll;0;L;;;;;N;LATIN SMALL LETTER Q HOOK;;;; -02A1;LATIN LETTER GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER GLOTTAL STOP BAR;;;; -02A2;LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE;Ll;0;L;;;;;N;LATIN LETTER REVERSED GLOTTAL STOP BAR;;;; -02A3;LATIN SMALL LETTER DZ DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z;;;; -02A4;LATIN SMALL LETTER DEZH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER D YOGH;;;; -02A5;LATIN SMALL LETTER DZ DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER D Z CURL;;;; -02A6;LATIN SMALL LETTER TS DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T S;;;; -02A7;LATIN SMALL LETTER TESH DIGRAPH;Ll;0;L;;;;;N;LATIN SMALL LETTER T ESH;;;; -02A8;LATIN SMALL LETTER TC DIGRAPH WITH CURL;Ll;0;L;;;;;N;LATIN SMALL LETTER T C CURL;;;; -02A9;LATIN SMALL LETTER FENG DIGRAPH;Ll;0;L;;;;;N;;;;; -02AA;LATIN SMALL LETTER LS DIGRAPH;Ll;0;L;;;;;N;;;;; -02AB;LATIN SMALL LETTER LZ DIGRAPH;Ll;0;L;;;;;N;;;;; -02AC;LATIN LETTER BILABIAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AD;LATIN LETTER BIDENTAL PERCUSSIVE;Ll;0;L;;;;;N;;;;; -02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;; -02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;Ll;0;L;;;;;N;;;;; -02B0;MODIFIER LETTER SMALL H;Lm;0;L; 0068;;;;N;;;;; -02B1;MODIFIER LETTER SMALL H WITH HOOK;Lm;0;L; 0266;;;;N;MODIFIER LETTER SMALL H HOOK;;;; -02B2;MODIFIER LETTER SMALL J;Lm;0;L; 006A;;;;N;;;;; -02B3;MODIFIER LETTER SMALL R;Lm;0;L; 0072;;;;N;;;;; -02B4;MODIFIER LETTER SMALL TURNED R;Lm;0;L; 0279;;;;N;;;;; -02B5;MODIFIER LETTER SMALL TURNED R WITH HOOK;Lm;0;L; 027B;;;;N;MODIFIER LETTER SMALL TURNED R HOOK;;;; -02B6;MODIFIER LETTER SMALL CAPITAL INVERTED R;Lm;0;L; 0281;;;;N;;;;; -02B7;MODIFIER LETTER SMALL W;Lm;0;L; 0077;;;;N;;;;; -02B8;MODIFIER LETTER SMALL Y;Lm;0;L; 0079;;;;N;;;;; -02B9;MODIFIER LETTER PRIME;Lm;0;ON;;;;;N;;;;; -02BA;MODIFIER LETTER DOUBLE PRIME;Lm;0;ON;;;;;N;;;;; -02BB;MODIFIER LETTER TURNED COMMA;Lm;0;L;;;;;N;;;;; -02BC;MODIFIER LETTER APOSTROPHE;Lm;0;L;;;;;N;;;;; -02BD;MODIFIER LETTER REVERSED COMMA;Lm;0;L;;;;;N;;;;; -02BE;MODIFIER LETTER RIGHT HALF RING;Lm;0;L;;;;;N;;;;; -02BF;MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; -02C0;MODIFIER LETTER GLOTTAL STOP;Lm;0;L;;;;;N;;;;; -02C1;MODIFIER LETTER REVERSED GLOTTAL STOP;Lm;0;L;;;;;N;;;;; -02C2;MODIFIER LETTER LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C3;MODIFIER LETTER RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C4;MODIFIER LETTER UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C5;MODIFIER LETTER DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02C6;MODIFIER LETTER CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;; -02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;;;; -02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;; -02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;;;; -02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;;;; -02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;;;; -02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;; -02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;; -02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;; -02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW ACUTE;;;; -02D0;MODIFIER LETTER TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; -02D1;MODIFIER LETTER HALF TRIANGULAR COLON;Lm;0;L;;;;;N;;;;; -02D2;MODIFIER LETTER CENTRED RIGHT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED RIGHT HALF RING;;;; -02D3;MODIFIER LETTER CENTRED LEFT HALF RING;Sk;0;ON;;;;;N;MODIFIER LETTER CENTERED LEFT HALF RING;;;; -02D4;MODIFIER LETTER UP TACK;Sk;0;ON;;;;;N;;;;; -02D5;MODIFIER LETTER DOWN TACK;Sk;0;ON;;;;;N;;;;; -02D6;MODIFIER LETTER PLUS SIGN;Sk;0;ON;;;;;N;;;;; -02D7;MODIFIER LETTER MINUS SIGN;Sk;0;ON;;;;;N;;;;; -02D8;BREVE;Sk;0;ON; 0020 0306;;;;N;SPACING BREVE;;;; -02D9;DOT ABOVE;Sk;0;ON; 0020 0307;;;;N;SPACING DOT ABOVE;;;; -02DA;RING ABOVE;Sk;0;ON; 0020 030A;;;;N;SPACING RING ABOVE;;;; -02DB;OGONEK;Sk;0;ON; 0020 0328;;;;N;SPACING OGONEK;;;; -02DC;SMALL TILDE;Sk;0;ON; 0020 0303;;;;N;SPACING TILDE;;;; -02DD;DOUBLE ACUTE ACCENT;Sk;0;ON; 0020 030B;;;;N;SPACING DOUBLE ACUTE;;;; -02DE;MODIFIER LETTER RHOTIC HOOK;Sk;0;ON;;;;;N;;;;; -02DF;MODIFIER LETTER CROSS ACCENT;Sk;0;ON;;;;;N;;;;; -02E0;MODIFIER LETTER SMALL GAMMA;Lm;0;L; 0263;;;;N;;;;; -02E1;MODIFIER LETTER SMALL L;Lm;0;L; 006C;;;;N;;;;; -02E2;MODIFIER LETTER SMALL S;Lm;0;L; 0073;;;;N;;;;; -02E3;MODIFIER LETTER SMALL X;Lm;0;L; 0078;;;;N;;;;; -02E4;MODIFIER LETTER SMALL REVERSED GLOTTAL STOP;Lm;0;L; 0295;;;;N;;;;; -02E5;MODIFIER LETTER EXTRA-HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; -02E6;MODIFIER LETTER HIGH TONE BAR;Sk;0;ON;;;;;N;;;;; -02E7;MODIFIER LETTER MID TONE BAR;Sk;0;ON;;;;;N;;;;; -02E8;MODIFIER LETTER LOW TONE BAR;Sk;0;ON;;;;;N;;;;; -02E9;MODIFIER LETTER EXTRA-LOW TONE BAR;Sk;0;ON;;;;;N;;;;; -02EA;MODIFIER LETTER YIN DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EB;MODIFIER LETTER YANG DEPARTING TONE MARK;Sk;0;ON;;;;;N;;;;; -02EC;MODIFIER LETTER VOICING;Lm;0;ON;;;;;N;;;;; -02ED;MODIFIER LETTER UNASPIRATED;Sk;0;ON;;;;;N;;;;; -02EE;MODIFIER LETTER DOUBLE APOSTROPHE;Lm;0;L;;;;;N;;;;; -02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;; -02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;; -02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; -02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;; -02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;; -02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;; -02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;; -02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;; -02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;; -02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;; -02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;; -02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;; -02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;; -02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;N;;;;; -0300;COMBINING GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING GRAVE;;;; -0301;COMBINING ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING ACUTE;;;; -0302;COMBINING CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;NON-SPACING CIRCUMFLEX;;;; -0303;COMBINING TILDE;Mn;230;NSM;;;;;N;NON-SPACING TILDE;;;; -0304;COMBINING MACRON;Mn;230;NSM;;;;;N;NON-SPACING MACRON;;;; -0305;COMBINING OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING OVERSCORE;;;; -0306;COMBINING BREVE;Mn;230;NSM;;;;;N;NON-SPACING BREVE;;;; -0307;COMBINING DOT ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOT ABOVE;;;; -0308;COMBINING DIAERESIS;Mn;230;NSM;;;;;N;NON-SPACING DIAERESIS;;;; -0309;COMBINING HOOK ABOVE;Mn;230;NSM;;;;;N;NON-SPACING HOOK ABOVE;;;; -030A;COMBINING RING ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RING ABOVE;;;; -030B;COMBINING DOUBLE ACUTE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE ACUTE;;;; -030C;COMBINING CARON;Mn;230;NSM;;;;;N;NON-SPACING HACEK;;;; -030D;COMBINING VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL LINE ABOVE;;;; -030E;COMBINING DOUBLE VERTICAL LINE ABOVE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE VERTICAL LINE ABOVE;;;; -030F;COMBINING DOUBLE GRAVE ACCENT;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE GRAVE;;;; -0310;COMBINING CANDRABINDU;Mn;230;NSM;;;;;N;NON-SPACING CANDRABINDU;;;; -0311;COMBINING INVERTED BREVE;Mn;230;NSM;;;;;N;NON-SPACING INVERTED BREVE;;;; -0312;COMBINING TURNED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING TURNED COMMA ABOVE;;;; -0313;COMBINING COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING COMMA ABOVE;;;; -0314;COMBINING REVERSED COMMA ABOVE;Mn;230;NSM;;;;;N;NON-SPACING REVERSED COMMA ABOVE;;;; -0315;COMBINING COMMA ABOVE RIGHT;Mn;232;NSM;;;;;N;NON-SPACING COMMA ABOVE RIGHT;;;; -0316;COMBINING GRAVE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING GRAVE BELOW;;;; -0317;COMBINING ACUTE ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING ACUTE BELOW;;;; -0318;COMBINING LEFT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT TACK BELOW;;;; -0319;COMBINING RIGHT TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT TACK BELOW;;;; -031A;COMBINING LEFT ANGLE ABOVE;Mn;232;NSM;;;;;N;NON-SPACING LEFT ANGLE ABOVE;;;; -031B;COMBINING HORN;Mn;216;NSM;;;;;N;NON-SPACING HORN;;;; -031C;COMBINING LEFT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING LEFT HALF RING BELOW;;;; -031D;COMBINING UP TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING UP TACK BELOW;;;; -031E;COMBINING DOWN TACK BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOWN TACK BELOW;;;; -031F;COMBINING PLUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING PLUS SIGN BELOW;;;; -0320;COMBINING MINUS SIGN BELOW;Mn;220;NSM;;;;;N;NON-SPACING MINUS SIGN BELOW;;;; -0321;COMBINING PALATALIZED HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING PALATALIZED HOOK BELOW;;;; -0322;COMBINING RETROFLEX HOOK BELOW;Mn;202;NSM;;;;;N;NON-SPACING RETROFLEX HOOK BELOW;;;; -0323;COMBINING DOT BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOT BELOW;;;; -0324;COMBINING DIAERESIS BELOW;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE DOT BELOW;;;; -0325;COMBINING RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RING BELOW;;;; -0326;COMBINING COMMA BELOW;Mn;220;NSM;;;;;N;NON-SPACING COMMA BELOW;;;; -0327;COMBINING CEDILLA;Mn;202;NSM;;;;;N;NON-SPACING CEDILLA;;;; -0328;COMBINING OGONEK;Mn;202;NSM;;;;;N;NON-SPACING OGONEK;;;; -0329;COMBINING VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;NON-SPACING VERTICAL LINE BELOW;;;; -032A;COMBINING BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BRIDGE BELOW;;;; -032B;COMBINING INVERTED DOUBLE ARCH BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED DOUBLE ARCH BELOW;;;; -032C;COMBINING CARON BELOW;Mn;220;NSM;;;;;N;NON-SPACING HACEK BELOW;;;; -032D;COMBINING CIRCUMFLEX ACCENT BELOW;Mn;220;NSM;;;;;N;NON-SPACING CIRCUMFLEX BELOW;;;; -032E;COMBINING BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING BREVE BELOW;;;; -032F;COMBINING INVERTED BREVE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BREVE BELOW;;;; -0330;COMBINING TILDE BELOW;Mn;220;NSM;;;;;N;NON-SPACING TILDE BELOW;;;; -0331;COMBINING MACRON BELOW;Mn;220;NSM;;;;;N;NON-SPACING MACRON BELOW;;;; -0332;COMBINING LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING UNDERSCORE;;;; -0333;COMBINING DOUBLE LOW LINE;Mn;220;NSM;;;;;N;NON-SPACING DOUBLE UNDERSCORE;;;; -0334;COMBINING TILDE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING TILDE OVERLAY;;;; -0335;COMBINING SHORT STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT BAR OVERLAY;;;; -0336;COMBINING LONG STROKE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG BAR OVERLAY;;;; -0337;COMBINING SHORT SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT SLASH OVERLAY;;;; -0338;COMBINING LONG SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG SLASH OVERLAY;;;; -0339;COMBINING RIGHT HALF RING BELOW;Mn;220;NSM;;;;;N;NON-SPACING RIGHT HALF RING BELOW;;;; -033A;COMBINING INVERTED BRIDGE BELOW;Mn;220;NSM;;;;;N;NON-SPACING INVERTED BRIDGE BELOW;;;; -033B;COMBINING SQUARE BELOW;Mn;220;NSM;;;;;N;NON-SPACING SQUARE BELOW;;;; -033C;COMBINING SEAGULL BELOW;Mn;220;NSM;;;;;N;NON-SPACING SEAGULL BELOW;;;; -033D;COMBINING X ABOVE;Mn;230;NSM;;;;;N;NON-SPACING X ABOVE;;;; -033E;COMBINING VERTICAL TILDE;Mn;230;NSM;;;;;N;NON-SPACING VERTICAL TILDE;;;; -033F;COMBINING DOUBLE OVERLINE;Mn;230;NSM;;;;;N;NON-SPACING DOUBLE OVERSCORE;;;; -0340;COMBINING GRAVE TONE MARK;Mn;230;NSM;0300;;;;N;NON-SPACING GRAVE TONE MARK;;;; -0341;COMBINING ACUTE TONE MARK;Mn;230;NSM;0301;;;;N;NON-SPACING ACUTE TONE MARK;;;; -0342;COMBINING GREEK PERISPOMENI;Mn;230;NSM;;;;;N;;;;; -0343;COMBINING GREEK KORONIS;Mn;230;NSM;0313;;;;N;;;;; -0344;COMBINING GREEK DIALYTIKA TONOS;Mn;230;NSM;0308 0301;;;;N;GREEK NON-SPACING DIAERESIS TONOS;;;; -0345;COMBINING GREEK YPOGEGRAMMENI;Mn;240;NSM;;;;;N;GREEK NON-SPACING IOTA BELOW;;0399;;0399 -0346;COMBINING BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; -0347;COMBINING EQUALS SIGN BELOW;Mn;220;NSM;;;;;N;;;;; -0348;COMBINING DOUBLE VERTICAL LINE BELOW;Mn;220;NSM;;;;;N;;;;; -0349;COMBINING LEFT ANGLE BELOW;Mn;220;NSM;;;;;N;;;;; -034A;COMBINING NOT TILDE ABOVE;Mn;230;NSM;;;;;N;;;;; -034B;COMBINING HOMOTHETIC ABOVE;Mn;230;NSM;;;;;N;;;;; -034C;COMBINING ALMOST EQUAL TO ABOVE;Mn;230;NSM;;;;;N;;;;; -034D;COMBINING LEFT RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -034E;COMBINING UPWARDS ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;; -0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; -0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;; -0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;; -0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;; -0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;; -0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;; -035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; -035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;; -035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;; -035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;; -035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;; -035F;COMBINING DOUBLE MACRON BELOW;Mn;233;NSM;;;;;N;;;;; -0360;COMBINING DOUBLE TILDE;Mn;234;NSM;;;;;N;;;;; -0361;COMBINING DOUBLE INVERTED BREVE;Mn;234;NSM;;;;;N;;;;; -0362;COMBINING DOUBLE RIGHTWARDS ARROW BELOW;Mn;233;NSM;;;;;N;;;;; -0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;; -0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;; -0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;; -0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;; -0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;; -0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;; -0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;; -036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;; -036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;; -036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;; -036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;; -036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;; -036F;COMBINING LATIN SMALL LETTER X;Mn;230;NSM;;;;;N;;;;; -0370;GREEK CAPITAL LETTER HETA;Lu;0;L;;;;;N;;;;0371; -0371;GREEK SMALL LETTER HETA;Ll;0;L;;;;;N;;;0370;;0370 -0372;GREEK CAPITAL LETTER ARCHAIC SAMPI;Lu;0;L;;;;;N;;;;0373; -0373;GREEK SMALL LETTER ARCHAIC SAMPI;Ll;0;L;;;;;N;;;0372;;0372 -0374;GREEK NUMERAL SIGN;Lm;0;ON;02B9;;;;N;GREEK UPPER NUMERAL SIGN;;;; -0375;GREEK LOWER NUMERAL SIGN;Sk;0;ON;;;;;N;;;;; -0376;GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA;Lu;0;L;;;;;N;;;;0377; -0377;GREEK SMALL LETTER PAMPHYLIAN DIGAMMA;Ll;0;L;;;;;N;;;0376;;0376 -037A;GREEK YPOGEGRAMMENI;Lm;0;L; 0020 0345;;;;N;GREEK SPACING IOTA BELOW;;;; -037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD -037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE -037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF -037E;GREEK QUESTION MARK;Po;0;ON;003B;;;;N;;;;; -037F;GREEK CAPITAL LETTER YOT;Lu;0;L;;;;;N;;;;03F3; -0384;GREEK TONOS;Sk;0;ON; 0020 0301;;;;N;GREEK SPACING TONOS;;;; -0385;GREEK DIALYTIKA TONOS;Sk;0;ON;00A8 0301;;;;N;GREEK SPACING DIAERESIS TONOS;;;; -0386;GREEK CAPITAL LETTER ALPHA WITH TONOS;Lu;0;L;0391 0301;;;;N;GREEK CAPITAL LETTER ALPHA TONOS;;;03AC; -0387;GREEK ANO TELEIA;Po;0;ON;00B7;;;;N;;;;; -0388;GREEK CAPITAL LETTER EPSILON WITH TONOS;Lu;0;L;0395 0301;;;;N;GREEK CAPITAL LETTER EPSILON TONOS;;;03AD; -0389;GREEK CAPITAL LETTER ETA WITH TONOS;Lu;0;L;0397 0301;;;;N;GREEK CAPITAL LETTER ETA TONOS;;;03AE; -038A;GREEK CAPITAL LETTER IOTA WITH TONOS;Lu;0;L;0399 0301;;;;N;GREEK CAPITAL LETTER IOTA TONOS;;;03AF; -038C;GREEK CAPITAL LETTER OMICRON WITH TONOS;Lu;0;L;039F 0301;;;;N;GREEK CAPITAL LETTER OMICRON TONOS;;;03CC; -038E;GREEK CAPITAL LETTER UPSILON WITH TONOS;Lu;0;L;03A5 0301;;;;N;GREEK CAPITAL LETTER UPSILON TONOS;;;03CD; -038F;GREEK CAPITAL LETTER OMEGA WITH TONOS;Lu;0;L;03A9 0301;;;;N;GREEK CAPITAL LETTER OMEGA TONOS;;;03CE; -0390;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS;Ll;0;L;03CA 0301;;;;N;GREEK SMALL LETTER IOTA DIAERESIS TONOS;;;; -0391;GREEK CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;03B1; -0392;GREEK CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;03B2; -0393;GREEK CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;03B3; -0394;GREEK CAPITAL LETTER DELTA;Lu;0;L;;;;;N;;;;03B4; -0395;GREEK CAPITAL LETTER EPSILON;Lu;0;L;;;;;N;;;;03B5; -0396;GREEK CAPITAL LETTER ZETA;Lu;0;L;;;;;N;;;;03B6; -0397;GREEK CAPITAL LETTER ETA;Lu;0;L;;;;;N;;;;03B7; -0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8; -0399;GREEK CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;03B9; -039A;GREEK CAPITAL LETTER KAPPA;Lu;0;L;;;;;N;;;;03BA; -039B;GREEK CAPITAL LETTER LAMDA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER LAMBDA;;;03BB; -039C;GREEK CAPITAL LETTER MU;Lu;0;L;;;;;N;;;;03BC; -039D;GREEK CAPITAL LETTER NU;Lu;0;L;;;;;N;;;;03BD; -039E;GREEK CAPITAL LETTER XI;Lu;0;L;;;;;N;;;;03BE; -039F;GREEK CAPITAL LETTER OMICRON;Lu;0;L;;;;;N;;;;03BF; -03A0;GREEK CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;03C0; -03A1;GREEK CAPITAL LETTER RHO;Lu;0;L;;;;;N;;;;03C1; -03A3;GREEK CAPITAL LETTER SIGMA;Lu;0;L;;;;;N;;;;03C3; -03A4;GREEK CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;03C4; -03A5;GREEK CAPITAL LETTER UPSILON;Lu;0;L;;;;;N;;;;03C5; -03A6;GREEK CAPITAL LETTER PHI;Lu;0;L;;;;;N;;;;03C6; -03A7;GREEK CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;03C7; -03A8;GREEK CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;03C8; -03A9;GREEK CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;03C9; -03AA;GREEK CAPITAL LETTER IOTA WITH DIALYTIKA;Lu;0;L;0399 0308;;;;N;GREEK CAPITAL LETTER IOTA DIAERESIS;;;03CA; -03AB;GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA;Lu;0;L;03A5 0308;;;;N;GREEK CAPITAL LETTER UPSILON DIAERESIS;;;03CB; -03AC;GREEK SMALL LETTER ALPHA WITH TONOS;Ll;0;L;03B1 0301;;;;N;GREEK SMALL LETTER ALPHA TONOS;;0386;;0386 -03AD;GREEK SMALL LETTER EPSILON WITH TONOS;Ll;0;L;03B5 0301;;;;N;GREEK SMALL LETTER EPSILON TONOS;;0388;;0388 -03AE;GREEK SMALL LETTER ETA WITH TONOS;Ll;0;L;03B7 0301;;;;N;GREEK SMALL LETTER ETA TONOS;;0389;;0389 -03AF;GREEK SMALL LETTER IOTA WITH TONOS;Ll;0;L;03B9 0301;;;;N;GREEK SMALL LETTER IOTA TONOS;;038A;;038A -03B0;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS;Ll;0;L;03CB 0301;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS TONOS;;;; -03B1;GREEK SMALL LETTER ALPHA;Ll;0;L;;;;;N;;;0391;;0391 -03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392 -03B3;GREEK SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;0393;;0393 -03B4;GREEK SMALL LETTER DELTA;Ll;0;L;;;;;N;;;0394;;0394 -03B5;GREEK SMALL LETTER EPSILON;Ll;0;L;;;;;N;;;0395;;0395 -03B6;GREEK SMALL LETTER ZETA;Ll;0;L;;;;;N;;;0396;;0396 -03B7;GREEK SMALL LETTER ETA;Ll;0;L;;;;;N;;;0397;;0397 -03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398 -03B9;GREEK SMALL LETTER IOTA;Ll;0;L;;;;;N;;;0399;;0399 -03BA;GREEK SMALL LETTER KAPPA;Ll;0;L;;;;;N;;;039A;;039A -03BB;GREEK SMALL LETTER LAMDA;Ll;0;L;;;;;N;GREEK SMALL LETTER LAMBDA;;039B;;039B -03BC;GREEK SMALL LETTER MU;Ll;0;L;;;;;N;;;039C;;039C -03BD;GREEK SMALL LETTER NU;Ll;0;L;;;;;N;;;039D;;039D -03BE;GREEK SMALL LETTER XI;Ll;0;L;;;;;N;;;039E;;039E -03BF;GREEK SMALL LETTER OMICRON;Ll;0;L;;;;;N;;;039F;;039F -03C0;GREEK SMALL LETTER PI;Ll;0;L;;;;;N;;;03A0;;03A0 -03C1;GREEK SMALL LETTER RHO;Ll;0;L;;;;;N;;;03A1;;03A1 -03C2;GREEK SMALL LETTER FINAL SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 -03C3;GREEK SMALL LETTER SIGMA;Ll;0;L;;;;;N;;;03A3;;03A3 -03C4;GREEK SMALL LETTER TAU;Ll;0;L;;;;;N;;;03A4;;03A4 -03C5;GREEK SMALL LETTER UPSILON;Ll;0;L;;;;;N;;;03A5;;03A5 -03C6;GREEK SMALL LETTER PHI;Ll;0;L;;;;;N;;;03A6;;03A6 -03C7;GREEK SMALL LETTER CHI;Ll;0;L;;;;;N;;;03A7;;03A7 -03C8;GREEK SMALL LETTER PSI;Ll;0;L;;;;;N;;;03A8;;03A8 -03C9;GREEK SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;03A9;;03A9 -03CA;GREEK SMALL LETTER IOTA WITH DIALYTIKA;Ll;0;L;03B9 0308;;;;N;GREEK SMALL LETTER IOTA DIAERESIS;;03AA;;03AA -03CB;GREEK SMALL LETTER UPSILON WITH DIALYTIKA;Ll;0;L;03C5 0308;;;;N;GREEK SMALL LETTER UPSILON DIAERESIS;;03AB;;03AB -03CC;GREEK SMALL LETTER OMICRON WITH TONOS;Ll;0;L;03BF 0301;;;;N;GREEK SMALL LETTER OMICRON TONOS;;038C;;038C -03CD;GREEK SMALL LETTER UPSILON WITH TONOS;Ll;0;L;03C5 0301;;;;N;GREEK SMALL LETTER UPSILON TONOS;;038E;;038E -03CE;GREEK SMALL LETTER OMEGA WITH TONOS;Ll;0;L;03C9 0301;;;;N;GREEK SMALL LETTER OMEGA TONOS;;038F;;038F -03CF;GREEK CAPITAL KAI SYMBOL;Lu;0;L;;;;;N;;;;03D7; -03D0;GREEK BETA SYMBOL;Ll;0;L; 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392 -03D1;GREEK THETA SYMBOL;Ll;0;L; 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398 -03D2;GREEK UPSILON WITH HOOK SYMBOL;Lu;0;L; 03A5;;;;N;GREEK CAPITAL LETTER UPSILON HOOK;;;; -03D3;GREEK UPSILON WITH ACUTE AND HOOK SYMBOL;Lu;0;L;03D2 0301;;;;N;GREEK CAPITAL LETTER UPSILON HOOK TONOS;;;; -03D4;GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL;Lu;0;L;03D2 0308;;;;N;GREEK CAPITAL LETTER UPSILON HOOK DIAERESIS;;;; -03D5;GREEK PHI SYMBOL;Ll;0;L; 03C6;;;;N;GREEK SMALL LETTER SCRIPT PHI;;03A6;;03A6 -03D6;GREEK PI SYMBOL;Ll;0;L; 03C0;;;;N;GREEK SMALL LETTER OMEGA PI;;03A0;;03A0 -03D7;GREEK KAI SYMBOL;Ll;0;L;;;;;N;;;03CF;;03CF -03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;;;03D9; -03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;;03D8;;03D8 -03DA;GREEK LETTER STIGMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER STIGMA;;;03DB; -03DB;GREEK SMALL LETTER STIGMA;Ll;0;L;;;;;N;;;03DA;;03DA -03DC;GREEK LETTER DIGAMMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DIGAMMA;;;03DD; -03DD;GREEK SMALL LETTER DIGAMMA;Ll;0;L;;;;;N;;;03DC;;03DC -03DE;GREEK LETTER KOPPA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KOPPA;;;03DF; -03DF;GREEK SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;03DE;;03DE -03E0;GREEK LETTER SAMPI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SAMPI;;;03E1; -03E1;GREEK SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;03E0;;03E0 -03E2;COPTIC CAPITAL LETTER SHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHEI;;;03E3; -03E3;COPTIC SMALL LETTER SHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER SHEI;;03E2;;03E2 -03E4;COPTIC CAPITAL LETTER FEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER FEI;;;03E5; -03E5;COPTIC SMALL LETTER FEI;Ll;0;L;;;;;N;GREEK SMALL LETTER FEI;;03E4;;03E4 -03E6;COPTIC CAPITAL LETTER KHEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER KHEI;;;03E7; -03E7;COPTIC SMALL LETTER KHEI;Ll;0;L;;;;;N;GREEK SMALL LETTER KHEI;;03E6;;03E6 -03E8;COPTIC CAPITAL LETTER HORI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER HORI;;;03E9; -03E9;COPTIC SMALL LETTER HORI;Ll;0;L;;;;;N;GREEK SMALL LETTER HORI;;03E8;;03E8 -03EA;COPTIC CAPITAL LETTER GANGIA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER GANGIA;;;03EB; -03EB;COPTIC SMALL LETTER GANGIA;Ll;0;L;;;;;N;GREEK SMALL LETTER GANGIA;;03EA;;03EA -03EC;COPTIC CAPITAL LETTER SHIMA;Lu;0;L;;;;;N;GREEK CAPITAL LETTER SHIMA;;;03ED; -03ED;COPTIC SMALL LETTER SHIMA;Ll;0;L;;;;;N;GREEK SMALL LETTER SHIMA;;03EC;;03EC -03EE;COPTIC CAPITAL LETTER DEI;Lu;0;L;;;;;N;GREEK CAPITAL LETTER DEI;;;03EF; -03EF;COPTIC SMALL LETTER DEI;Ll;0;L;;;;;N;GREEK SMALL LETTER DEI;;03EE;;03EE -03F0;GREEK KAPPA SYMBOL;Ll;0;L; 03BA;;;;N;GREEK SMALL LETTER SCRIPT KAPPA;;039A;;039A -03F1;GREEK RHO SYMBOL;Ll;0;L; 03C1;;;;N;GREEK SMALL LETTER TAILED RHO;;03A1;;03A1 -03F2;GREEK LUNATE SIGMA SYMBOL;Ll;0;L; 03C2;;;;N;GREEK SMALL LETTER LUNATE SIGMA;;03F9;;03F9 -03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;037F;;037F -03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L; 0398;;;;N;;;;03B8; -03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L; 03B5;;;;N;;;0395;;0395 -03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;; -03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8; -03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7 -03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L; 03A3;;;;N;;;;03F2; -03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB; -03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA -03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;; -03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B; -03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C; -03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D; -0400;CYRILLIC CAPITAL LETTER IE WITH GRAVE;Lu;0;L;0415 0300;;;;N;;;;0450; -0401;CYRILLIC CAPITAL LETTER IO;Lu;0;L;0415 0308;;;;N;;;;0451; -0402;CYRILLIC CAPITAL LETTER DJE;Lu;0;L;;;;;N;;;;0452; -0403;CYRILLIC CAPITAL LETTER GJE;Lu;0;L;0413 0301;;;;N;;;;0453; -0404;CYRILLIC CAPITAL LETTER UKRAINIAN IE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER E;;;0454; -0405;CYRILLIC CAPITAL LETTER DZE;Lu;0;L;;;;;N;;;;0455; -0406;CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER I;;;0456; -0407;CYRILLIC CAPITAL LETTER YI;Lu;0;L;0406 0308;;;;N;;;;0457; -0408;CYRILLIC CAPITAL LETTER JE;Lu;0;L;;;;;N;;;;0458; -0409;CYRILLIC CAPITAL LETTER LJE;Lu;0;L;;;;;N;;;;0459; -040A;CYRILLIC CAPITAL LETTER NJE;Lu;0;L;;;;;N;;;;045A; -040B;CYRILLIC CAPITAL LETTER TSHE;Lu;0;L;;;;;N;;;;045B; -040C;CYRILLIC CAPITAL LETTER KJE;Lu;0;L;041A 0301;;;;N;;;;045C; -040D;CYRILLIC CAPITAL LETTER I WITH GRAVE;Lu;0;L;0418 0300;;;;N;;;;045D; -040E;CYRILLIC CAPITAL LETTER SHORT U;Lu;0;L;0423 0306;;;;N;;;;045E; -040F;CYRILLIC CAPITAL LETTER DZHE;Lu;0;L;;;;;N;;;;045F; -0410;CYRILLIC CAPITAL LETTER A;Lu;0;L;;;;;N;;;;0430; -0411;CYRILLIC CAPITAL LETTER BE;Lu;0;L;;;;;N;;;;0431; -0412;CYRILLIC CAPITAL LETTER VE;Lu;0;L;;;;;N;;;;0432; -0413;CYRILLIC CAPITAL LETTER GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE;;;0433; -0414;CYRILLIC CAPITAL LETTER DE;Lu;0;L;;;;;N;;;;0434; -0415;CYRILLIC CAPITAL LETTER IE;Lu;0;L;;;;;N;;;;0435; -0416;CYRILLIC CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;0436; -0417;CYRILLIC CAPITAL LETTER ZE;Lu;0;L;;;;;N;;;;0437; -0418;CYRILLIC CAPITAL LETTER I;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER II;;;0438; -0419;CYRILLIC CAPITAL LETTER SHORT I;Lu;0;L;0418 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT II;;;0439; -041A;CYRILLIC CAPITAL LETTER KA;Lu;0;L;;;;;N;;;;043A; -041B;CYRILLIC CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;043B; -041C;CYRILLIC CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;043C; -041D;CYRILLIC CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;043D; -041E;CYRILLIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;043E; -041F;CYRILLIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;043F; -0420;CYRILLIC CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;0440; -0421;CYRILLIC CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;0441; -0422;CYRILLIC CAPITAL LETTER TE;Lu;0;L;;;;;N;;;;0442; -0423;CYRILLIC CAPITAL LETTER U;Lu;0;L;;;;;N;;;;0443; -0424;CYRILLIC CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;0444; -0425;CYRILLIC CAPITAL LETTER HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA;;;0445; -0426;CYRILLIC CAPITAL LETTER TSE;Lu;0;L;;;;;N;;;;0446; -0427;CYRILLIC CAPITAL LETTER CHE;Lu;0;L;;;;;N;;;;0447; -0428;CYRILLIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0448; -0429;CYRILLIC CAPITAL LETTER SHCHA;Lu;0;L;;;;;N;;;;0449; -042A;CYRILLIC CAPITAL LETTER HARD SIGN;Lu;0;L;;;;;N;;;;044A; -042B;CYRILLIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER YERI;;;044B; -042C;CYRILLIC CAPITAL LETTER SOFT SIGN;Lu;0;L;;;;;N;;;;044C; -042D;CYRILLIC CAPITAL LETTER E;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED E;;;044D; -042E;CYRILLIC CAPITAL LETTER YU;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IU;;;044E; -042F;CYRILLIC CAPITAL LETTER YA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IA;;;044F; -0430;CYRILLIC SMALL LETTER A;Ll;0;L;;;;;N;;;0410;;0410 -0431;CYRILLIC SMALL LETTER BE;Ll;0;L;;;;;N;;;0411;;0411 -0432;CYRILLIC SMALL LETTER VE;Ll;0;L;;;;;N;;;0412;;0412 -0433;CYRILLIC SMALL LETTER GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE;;0413;;0413 -0434;CYRILLIC SMALL LETTER DE;Ll;0;L;;;;;N;;;0414;;0414 -0435;CYRILLIC SMALL LETTER IE;Ll;0;L;;;;;N;;;0415;;0415 -0436;CYRILLIC SMALL LETTER ZHE;Ll;0;L;;;;;N;;;0416;;0416 -0437;CYRILLIC SMALL LETTER ZE;Ll;0;L;;;;;N;;;0417;;0417 -0438;CYRILLIC SMALL LETTER I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER II;;0418;;0418 -0439;CYRILLIC SMALL LETTER SHORT I;Ll;0;L;0438 0306;;;;N;CYRILLIC SMALL LETTER SHORT II;;0419;;0419 -043A;CYRILLIC SMALL LETTER KA;Ll;0;L;;;;;N;;;041A;;041A -043B;CYRILLIC SMALL LETTER EL;Ll;0;L;;;;;N;;;041B;;041B -043C;CYRILLIC SMALL LETTER EM;Ll;0;L;;;;;N;;;041C;;041C -043D;CYRILLIC SMALL LETTER EN;Ll;0;L;;;;;N;;;041D;;041D -043E;CYRILLIC SMALL LETTER O;Ll;0;L;;;;;N;;;041E;;041E -043F;CYRILLIC SMALL LETTER PE;Ll;0;L;;;;;N;;;041F;;041F -0440;CYRILLIC SMALL LETTER ER;Ll;0;L;;;;;N;;;0420;;0420 -0441;CYRILLIC SMALL LETTER ES;Ll;0;L;;;;;N;;;0421;;0421 -0442;CYRILLIC SMALL LETTER TE;Ll;0;L;;;;;N;;;0422;;0422 -0443;CYRILLIC SMALL LETTER U;Ll;0;L;;;;;N;;;0423;;0423 -0444;CYRILLIC SMALL LETTER EF;Ll;0;L;;;;;N;;;0424;;0424 -0445;CYRILLIC SMALL LETTER HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA;;0425;;0425 -0446;CYRILLIC SMALL LETTER TSE;Ll;0;L;;;;;N;;;0426;;0426 -0447;CYRILLIC SMALL LETTER CHE;Ll;0;L;;;;;N;;;0427;;0427 -0448;CYRILLIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;0428;;0428 -0449;CYRILLIC SMALL LETTER SHCHA;Ll;0;L;;;;;N;;;0429;;0429 -044A;CYRILLIC SMALL LETTER HARD SIGN;Ll;0;L;;;;;N;;;042A;;042A -044B;CYRILLIC SMALL LETTER YERU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER YERI;;042B;;042B -044C;CYRILLIC SMALL LETTER SOFT SIGN;Ll;0;L;;;;;N;;;042C;;042C -044D;CYRILLIC SMALL LETTER E;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED E;;042D;;042D -044E;CYRILLIC SMALL LETTER YU;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IU;;042E;;042E -044F;CYRILLIC SMALL LETTER YA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IA;;042F;;042F -0450;CYRILLIC SMALL LETTER IE WITH GRAVE;Ll;0;L;0435 0300;;;;N;;;0400;;0400 -0451;CYRILLIC SMALL LETTER IO;Ll;0;L;0435 0308;;;;N;;;0401;;0401 -0452;CYRILLIC SMALL LETTER DJE;Ll;0;L;;;;;N;;;0402;;0402 -0453;CYRILLIC SMALL LETTER GJE;Ll;0;L;0433 0301;;;;N;;;0403;;0403 -0454;CYRILLIC SMALL LETTER UKRAINIAN IE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER E;;0404;;0404 -0455;CYRILLIC SMALL LETTER DZE;Ll;0;L;;;;;N;;;0405;;0405 -0456;CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER I;;0406;;0406 -0457;CYRILLIC SMALL LETTER YI;Ll;0;L;0456 0308;;;;N;;;0407;;0407 -0458;CYRILLIC SMALL LETTER JE;Ll;0;L;;;;;N;;;0408;;0408 -0459;CYRILLIC SMALL LETTER LJE;Ll;0;L;;;;;N;;;0409;;0409 -045A;CYRILLIC SMALL LETTER NJE;Ll;0;L;;;;;N;;;040A;;040A -045B;CYRILLIC SMALL LETTER TSHE;Ll;0;L;;;;;N;;;040B;;040B -045C;CYRILLIC SMALL LETTER KJE;Ll;0;L;043A 0301;;;;N;;;040C;;040C -045D;CYRILLIC SMALL LETTER I WITH GRAVE;Ll;0;L;0438 0300;;;;N;;;040D;;040D -045E;CYRILLIC SMALL LETTER SHORT U;Ll;0;L;0443 0306;;;;N;;;040E;;040E -045F;CYRILLIC SMALL LETTER DZHE;Ll;0;L;;;;;N;;;040F;;040F -0460;CYRILLIC CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;0461; -0461;CYRILLIC SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;0460;;0460 -0462;CYRILLIC CAPITAL LETTER YAT;Lu;0;L;;;;;N;;;;0463; -0463;CYRILLIC SMALL LETTER YAT;Ll;0;L;;;;;N;;;0462;;0462 -0464;CYRILLIC CAPITAL LETTER IOTIFIED E;Lu;0;L;;;;;N;;;;0465; -0465;CYRILLIC SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;0464;;0464 -0466;CYRILLIC CAPITAL LETTER LITTLE YUS;Lu;0;L;;;;;N;;;;0467; -0467;CYRILLIC SMALL LETTER LITTLE YUS;Ll;0;L;;;;;N;;;0466;;0466 -0468;CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS;Lu;0;L;;;;;N;;;;0469; -0469;CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS;Ll;0;L;;;;;N;;;0468;;0468 -046A;CYRILLIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;046B; -046B;CYRILLIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;046A;;046A -046C;CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS;Lu;0;L;;;;;N;;;;046D; -046D;CYRILLIC SMALL LETTER IOTIFIED BIG YUS;Ll;0;L;;;;;N;;;046C;;046C -046E;CYRILLIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;046F; -046F;CYRILLIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;046E;;046E -0470;CYRILLIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;0471; -0471;CYRILLIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;0470;;0470 -0472;CYRILLIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;0473; -0473;CYRILLIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;0472;;0472 -0474;CYRILLIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;0475; -0475;CYRILLIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;0474;;0474 -0476;CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Lu;0;L;0474 030F;;;;N;CYRILLIC CAPITAL LETTER IZHITSA DOUBLE GRAVE;;;0477; -0477;CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT;Ll;0;L;0475 030F;;;;N;CYRILLIC SMALL LETTER IZHITSA DOUBLE GRAVE;;0476;;0476 -0478;CYRILLIC CAPITAL LETTER UK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER UK DIGRAPH;;;0479; -0479;CYRILLIC SMALL LETTER UK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER UK DIGRAPH;;0478;;0478 -047A;CYRILLIC CAPITAL LETTER ROUND OMEGA;Lu;0;L;;;;;N;;;;047B; -047B;CYRILLIC SMALL LETTER ROUND OMEGA;Ll;0;L;;;;;N;;;047A;;047A -047C;CYRILLIC CAPITAL LETTER OMEGA WITH TITLO;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER OMEGA TITLO;;;047D; -047D;CYRILLIC SMALL LETTER OMEGA WITH TITLO;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER OMEGA TITLO;;047C;;047C -047E;CYRILLIC CAPITAL LETTER OT;Lu;0;L;;;;;N;;;;047F; -047F;CYRILLIC SMALL LETTER OT;Ll;0;L;;;;;N;;;047E;;047E -0480;CYRILLIC CAPITAL LETTER KOPPA;Lu;0;L;;;;;N;;;;0481; -0481;CYRILLIC SMALL LETTER KOPPA;Ll;0;L;;;;;N;;;0480;;0480 -0482;CYRILLIC THOUSANDS SIGN;So;0;L;;;;;N;;;;; -0483;COMBINING CYRILLIC TITLO;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING TITLO;;;; -0484;COMBINING CYRILLIC PALATALIZATION;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PALATALIZATION;;;; -0485;COMBINING CYRILLIC DASIA PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING DASIA PNEUMATA;;;; -0486;COMBINING CYRILLIC PSILI PNEUMATA;Mn;230;NSM;;;;;N;CYRILLIC NON-SPACING PSILI PNEUMATA;;;; -0487;COMBINING CYRILLIC POKRYTIE;Mn;230;NSM;;;;;N;;;;; -0488;COMBINING CYRILLIC HUNDRED THOUSANDS SIGN;Me;0;NSM;;;;;N;;;;; -0489;COMBINING CYRILLIC MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B; -048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A -048C;CYRILLIC CAPITAL LETTER SEMISOFT SIGN;Lu;0;L;;;;;N;;;;048D; -048D;CYRILLIC SMALL LETTER SEMISOFT SIGN;Ll;0;L;;;;;N;;;048C;;048C -048E;CYRILLIC CAPITAL LETTER ER WITH TICK;Lu;0;L;;;;;N;;;;048F; -048F;CYRILLIC SMALL LETTER ER WITH TICK;Ll;0;L;;;;;N;;;048E;;048E -0490;CYRILLIC CAPITAL LETTER GHE WITH UPTURN;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE WITH UPTURN;;;0491; -0491;CYRILLIC SMALL LETTER GHE WITH UPTURN;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE WITH UPTURN;;0490;;0490 -0492;CYRILLIC CAPITAL LETTER GHE WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE BAR;;;0493; -0493;CYRILLIC SMALL LETTER GHE WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE BAR;;0492;;0492 -0494;CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER GE HOOK;;;0495; -0495;CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER GE HOOK;;0494;;0494 -0496;CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZHE WITH RIGHT DESCENDER;;;0497; -0497;CYRILLIC SMALL LETTER ZHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZHE WITH RIGHT DESCENDER;;0496;;0496 -0498;CYRILLIC CAPITAL LETTER ZE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ZE CEDILLA;;;0499; -0499;CYRILLIC SMALL LETTER ZE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ZE CEDILLA;;0498;;0498 -049A;CYRILLIC CAPITAL LETTER KA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA WITH RIGHT DESCENDER;;;049B; -049B;CYRILLIC SMALL LETTER KA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA WITH RIGHT DESCENDER;;049A;;049A -049C;CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA VERTICAL BAR;;;049D; -049D;CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA VERTICAL BAR;;049C;;049C -049E;CYRILLIC CAPITAL LETTER KA WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA BAR;;;049F; -049F;CYRILLIC SMALL LETTER KA WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA BAR;;049E;;049E -04A0;CYRILLIC CAPITAL LETTER BASHKIR KA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER REVERSED GE KA;;;04A1; -04A1;CYRILLIC SMALL LETTER BASHKIR KA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER REVERSED GE KA;;04A0;;04A0 -04A2;CYRILLIC CAPITAL LETTER EN WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN WITH RIGHT DESCENDER;;;04A3; -04A3;CYRILLIC SMALL LETTER EN WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN WITH RIGHT DESCENDER;;04A2;;04A2 -04A4;CYRILLIC CAPITAL LIGATURE EN GHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN GE;;;04A5; -04A5;CYRILLIC SMALL LIGATURE EN GHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN GE;;04A4;;04A4 -04A6;CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER PE HOOK;;;04A7; -04A7;CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER PE HOOK;;04A6;;04A6 -04A8;CYRILLIC CAPITAL LETTER ABKHASIAN HA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER O HOOK;;;04A9; -04A9;CYRILLIC SMALL LETTER ABKHASIAN HA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER O HOOK;;04A8;;04A8 -04AA;CYRILLIC CAPITAL LETTER ES WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER ES CEDILLA;;;04AB; -04AB;CYRILLIC SMALL LETTER ES WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER ES CEDILLA;;04AA;;04AA -04AC;CYRILLIC CAPITAL LETTER TE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE WITH RIGHT DESCENDER;;;04AD; -04AD;CYRILLIC SMALL LETTER TE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE WITH RIGHT DESCENDER;;04AC;;04AC -04AE;CYRILLIC CAPITAL LETTER STRAIGHT U;Lu;0;L;;;;;N;;;;04AF; -04AF;CYRILLIC SMALL LETTER STRAIGHT U;Ll;0;L;;;;;N;;;04AE;;04AE -04B0;CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER STRAIGHT U BAR;;;04B1; -04B1;CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER STRAIGHT U BAR;;04B0;;04B0 -04B2;CYRILLIC CAPITAL LETTER HA WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KHA WITH RIGHT DESCENDER;;;04B3; -04B3;CYRILLIC SMALL LETTER HA WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KHA WITH RIGHT DESCENDER;;04B2;;04B2 -04B4;CYRILLIC CAPITAL LIGATURE TE TSE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER TE TSE;;;04B5; -04B5;CYRILLIC SMALL LIGATURE TE TSE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER TE TSE;;04B4;;04B4 -04B6;CYRILLIC CAPITAL LETTER CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH RIGHT DESCENDER;;;04B7; -04B7;CYRILLIC SMALL LETTER CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH RIGHT DESCENDER;;04B6;;04B6 -04B8;CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE VERTICAL BAR;;;04B9; -04B9;CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE VERTICAL BAR;;04B8;;04B8 -04BA;CYRILLIC CAPITAL LETTER SHHA;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER H;;;04BB; -04BB;CYRILLIC SMALL LETTER SHHA;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER H;;04BA;;04BA -04BC;CYRILLIC CAPITAL LETTER ABKHASIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK;;;04BD; -04BD;CYRILLIC SMALL LETTER ABKHASIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK;;04BC;;04BC -04BE;CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER IE HOOK OGONEK;;;04BF; -04BF;CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER IE HOOK OGONEK;;04BE;;04BE -04C0;CYRILLIC LETTER PALOCHKA;Lu;0;L;;;;;N;CYRILLIC LETTER I;;;04CF; -04C1;CYRILLIC CAPITAL LETTER ZHE WITH BREVE;Lu;0;L;0416 0306;;;;N;CYRILLIC CAPITAL LETTER SHORT ZHE;;;04C2; -04C2;CYRILLIC SMALL LETTER ZHE WITH BREVE;Ll;0;L;0436 0306;;;;N;CYRILLIC SMALL LETTER SHORT ZHE;;04C1;;04C1 -04C3;CYRILLIC CAPITAL LETTER KA WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER KA HOOK;;;04C4; -04C4;CYRILLIC SMALL LETTER KA WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER KA HOOK;;04C3;;04C3 -04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6; -04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5 -04C7;CYRILLIC CAPITAL LETTER EN WITH HOOK;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER EN HOOK;;;04C8; -04C8;CYRILLIC SMALL LETTER EN WITH HOOK;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER EN HOOK;;04C7;;04C7 -04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA; -04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9 -04CB;CYRILLIC CAPITAL LETTER KHAKASSIAN CHE;Lu;0;L;;;;;N;CYRILLIC CAPITAL LETTER CHE WITH LEFT DESCENDER;;;04CC; -04CC;CYRILLIC SMALL LETTER KHAKASSIAN CHE;Ll;0;L;;;;;N;CYRILLIC SMALL LETTER CHE WITH LEFT DESCENDER;;04CB;;04CB -04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE; -04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD -04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0 -04D0;CYRILLIC CAPITAL LETTER A WITH BREVE;Lu;0;L;0410 0306;;;;N;;;;04D1; -04D1;CYRILLIC SMALL LETTER A WITH BREVE;Ll;0;L;0430 0306;;;;N;;;04D0;;04D0 -04D2;CYRILLIC CAPITAL LETTER A WITH DIAERESIS;Lu;0;L;0410 0308;;;;N;;;;04D3; -04D3;CYRILLIC SMALL LETTER A WITH DIAERESIS;Ll;0;L;0430 0308;;;;N;;;04D2;;04D2 -04D4;CYRILLIC CAPITAL LIGATURE A IE;Lu;0;L;;;;;N;;;;04D5; -04D5;CYRILLIC SMALL LIGATURE A IE;Ll;0;L;;;;;N;;;04D4;;04D4 -04D6;CYRILLIC CAPITAL LETTER IE WITH BREVE;Lu;0;L;0415 0306;;;;N;;;;04D7; -04D7;CYRILLIC SMALL LETTER IE WITH BREVE;Ll;0;L;0435 0306;;;;N;;;04D6;;04D6 -04D8;CYRILLIC CAPITAL LETTER SCHWA;Lu;0;L;;;;;N;;;;04D9; -04D9;CYRILLIC SMALL LETTER SCHWA;Ll;0;L;;;;;N;;;04D8;;04D8 -04DA;CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS;Lu;0;L;04D8 0308;;;;N;;;;04DB; -04DB;CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS;Ll;0;L;04D9 0308;;;;N;;;04DA;;04DA -04DC;CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS;Lu;0;L;0416 0308;;;;N;;;;04DD; -04DD;CYRILLIC SMALL LETTER ZHE WITH DIAERESIS;Ll;0;L;0436 0308;;;;N;;;04DC;;04DC -04DE;CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS;Lu;0;L;0417 0308;;;;N;;;;04DF; -04DF;CYRILLIC SMALL LETTER ZE WITH DIAERESIS;Ll;0;L;0437 0308;;;;N;;;04DE;;04DE -04E0;CYRILLIC CAPITAL LETTER ABKHASIAN DZE;Lu;0;L;;;;;N;;;;04E1; -04E1;CYRILLIC SMALL LETTER ABKHASIAN DZE;Ll;0;L;;;;;N;;;04E0;;04E0 -04E2;CYRILLIC CAPITAL LETTER I WITH MACRON;Lu;0;L;0418 0304;;;;N;;;;04E3; -04E3;CYRILLIC SMALL LETTER I WITH MACRON;Ll;0;L;0438 0304;;;;N;;;04E2;;04E2 -04E4;CYRILLIC CAPITAL LETTER I WITH DIAERESIS;Lu;0;L;0418 0308;;;;N;;;;04E5; -04E5;CYRILLIC SMALL LETTER I WITH DIAERESIS;Ll;0;L;0438 0308;;;;N;;;04E4;;04E4 -04E6;CYRILLIC CAPITAL LETTER O WITH DIAERESIS;Lu;0;L;041E 0308;;;;N;;;;04E7; -04E7;CYRILLIC SMALL LETTER O WITH DIAERESIS;Ll;0;L;043E 0308;;;;N;;;04E6;;04E6 -04E8;CYRILLIC CAPITAL LETTER BARRED O;Lu;0;L;;;;;N;;;;04E9; -04E9;CYRILLIC SMALL LETTER BARRED O;Ll;0;L;;;;;N;;;04E8;;04E8 -04EA;CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS;Lu;0;L;04E8 0308;;;;N;;;;04EB; -04EB;CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS;Ll;0;L;04E9 0308;;;;N;;;04EA;;04EA -04EC;CYRILLIC CAPITAL LETTER E WITH DIAERESIS;Lu;0;L;042D 0308;;;;N;;;;04ED; -04ED;CYRILLIC SMALL LETTER E WITH DIAERESIS;Ll;0;L;044D 0308;;;;N;;;04EC;;04EC -04EE;CYRILLIC CAPITAL LETTER U WITH MACRON;Lu;0;L;0423 0304;;;;N;;;;04EF; -04EF;CYRILLIC SMALL LETTER U WITH MACRON;Ll;0;L;0443 0304;;;;N;;;04EE;;04EE -04F0;CYRILLIC CAPITAL LETTER U WITH DIAERESIS;Lu;0;L;0423 0308;;;;N;;;;04F1; -04F1;CYRILLIC SMALL LETTER U WITH DIAERESIS;Ll;0;L;0443 0308;;;;N;;;04F0;;04F0 -04F2;CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE;Lu;0;L;0423 030B;;;;N;;;;04F3; -04F3;CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE;Ll;0;L;0443 030B;;;;N;;;04F2;;04F2 -04F4;CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS;Lu;0;L;0427 0308;;;;N;;;;04F5; -04F5;CYRILLIC SMALL LETTER CHE WITH DIAERESIS;Ll;0;L;0447 0308;;;;N;;;04F4;;04F4 -04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7; -04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6 -04F8;CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS;Lu;0;L;042B 0308;;;;N;;;;04F9; -04F9;CYRILLIC SMALL LETTER YERU WITH DIAERESIS;Ll;0;L;044B 0308;;;;N;;;04F8;;04F8 -04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB; -04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA -04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD; -04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC -04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF; -04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE -0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501; -0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500 -0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503; -0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502 -0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505; -0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504 -0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507; -0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506 -0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509; -0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508 -050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B; -050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A -050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D; -050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C -050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F; -050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E -0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511; -0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510 -0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513; -0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512 -0514;CYRILLIC CAPITAL LETTER LHA;Lu;0;L;;;;;N;;;;0515; -0515;CYRILLIC SMALL LETTER LHA;Ll;0;L;;;;;N;;;0514;;0514 -0516;CYRILLIC CAPITAL LETTER RHA;Lu;0;L;;;;;N;;;;0517; -0517;CYRILLIC SMALL LETTER RHA;Ll;0;L;;;;;N;;;0516;;0516 -0518;CYRILLIC CAPITAL LETTER YAE;Lu;0;L;;;;;N;;;;0519; -0519;CYRILLIC SMALL LETTER YAE;Ll;0;L;;;;;N;;;0518;;0518 -051A;CYRILLIC CAPITAL LETTER QA;Lu;0;L;;;;;N;;;;051B; -051B;CYRILLIC SMALL LETTER QA;Ll;0;L;;;;;N;;;051A;;051A -051C;CYRILLIC CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;051D; -051D;CYRILLIC SMALL LETTER WE;Ll;0;L;;;;;N;;;051C;;051C -051E;CYRILLIC CAPITAL LETTER ALEUT KA;Lu;0;L;;;;;N;;;;051F; -051F;CYRILLIC SMALL LETTER ALEUT KA;Ll;0;L;;;;;N;;;051E;;051E -0520;CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0521; -0521;CYRILLIC SMALL LETTER EL WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0520;;0520 -0522;CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;0523; -0523;CYRILLIC SMALL LETTER EN WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;0522;;0522 -0524;CYRILLIC CAPITAL LETTER PE WITH DESCENDER;Lu;0;L;;;;;N;;;;0525; -0525;CYRILLIC SMALL LETTER PE WITH DESCENDER;Ll;0;L;;;;;N;;;0524;;0524 -0526;CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER;Lu;0;L;;;;;N;;;;0527; -0527;CYRILLIC SMALL LETTER SHHA WITH DESCENDER;Ll;0;L;;;;;N;;;0526;;0526 -0528;CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK;Lu;0;L;;;;;N;;;;0529; -0529;CYRILLIC SMALL LETTER EN WITH LEFT HOOK;Ll;0;L;;;;;N;;;0528;;0528 -052A;CYRILLIC CAPITAL LETTER DZZHE;Lu;0;L;;;;;N;;;;052B; -052B;CYRILLIC SMALL LETTER DZZHE;Ll;0;L;;;;;N;;;052A;;052A -052C;CYRILLIC CAPITAL LETTER DCHE;Lu;0;L;;;;;N;;;;052D; -052D;CYRILLIC SMALL LETTER DCHE;Ll;0;L;;;;;N;;;052C;;052C -052E;CYRILLIC CAPITAL LETTER EL WITH DESCENDER;Lu;0;L;;;;;N;;;;052F; -052F;CYRILLIC SMALL LETTER EL WITH DESCENDER;Ll;0;L;;;;;N;;;052E;;052E -0531;ARMENIAN CAPITAL LETTER AYB;Lu;0;L;;;;;N;;;;0561; -0532;ARMENIAN CAPITAL LETTER BEN;Lu;0;L;;;;;N;;;;0562; -0533;ARMENIAN CAPITAL LETTER GIM;Lu;0;L;;;;;N;;;;0563; -0534;ARMENIAN CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;0564; -0535;ARMENIAN CAPITAL LETTER ECH;Lu;0;L;;;;;N;;;;0565; -0536;ARMENIAN CAPITAL LETTER ZA;Lu;0;L;;;;;N;;;;0566; -0537;ARMENIAN CAPITAL LETTER EH;Lu;0;L;;;;;N;;;;0567; -0538;ARMENIAN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;0568; -0539;ARMENIAN CAPITAL LETTER TO;Lu;0;L;;;;;N;;;;0569; -053A;ARMENIAN CAPITAL LETTER ZHE;Lu;0;L;;;;;N;;;;056A; -053B;ARMENIAN CAPITAL LETTER INI;Lu;0;L;;;;;N;;;;056B; -053C;ARMENIAN CAPITAL LETTER LIWN;Lu;0;L;;;;;N;;;;056C; -053D;ARMENIAN CAPITAL LETTER XEH;Lu;0;L;;;;;N;;;;056D; -053E;ARMENIAN CAPITAL LETTER CA;Lu;0;L;;;;;N;;;;056E; -053F;ARMENIAN CAPITAL LETTER KEN;Lu;0;L;;;;;N;;;;056F; -0540;ARMENIAN CAPITAL LETTER HO;Lu;0;L;;;;;N;;;;0570; -0541;ARMENIAN CAPITAL LETTER JA;Lu;0;L;;;;;N;;;;0571; -0542;ARMENIAN CAPITAL LETTER GHAD;Lu;0;L;;;;;N;ARMENIAN CAPITAL LETTER LAD;;;0572; -0543;ARMENIAN CAPITAL LETTER CHEH;Lu;0;L;;;;;N;;;;0573; -0544;ARMENIAN CAPITAL LETTER MEN;Lu;0;L;;;;;N;;;;0574; -0545;ARMENIAN CAPITAL LETTER YI;Lu;0;L;;;;;N;;;;0575; -0546;ARMENIAN CAPITAL LETTER NOW;Lu;0;L;;;;;N;;;;0576; -0547;ARMENIAN CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;0577; -0548;ARMENIAN CAPITAL LETTER VO;Lu;0;L;;;;;N;;;;0578; -0549;ARMENIAN CAPITAL LETTER CHA;Lu;0;L;;;;;N;;;;0579; -054A;ARMENIAN CAPITAL LETTER PEH;Lu;0;L;;;;;N;;;;057A; -054B;ARMENIAN CAPITAL LETTER JHEH;Lu;0;L;;;;;N;;;;057B; -054C;ARMENIAN CAPITAL LETTER RA;Lu;0;L;;;;;N;;;;057C; -054D;ARMENIAN CAPITAL LETTER SEH;Lu;0;L;;;;;N;;;;057D; -054E;ARMENIAN CAPITAL LETTER VEW;Lu;0;L;;;;;N;;;;057E; -054F;ARMENIAN CAPITAL LETTER TIWN;Lu;0;L;;;;;N;;;;057F; -0550;ARMENIAN CAPITAL LETTER REH;Lu;0;L;;;;;N;;;;0580; -0551;ARMENIAN CAPITAL LETTER CO;Lu;0;L;;;;;N;;;;0581; -0552;ARMENIAN CAPITAL LETTER YIWN;Lu;0;L;;;;;N;;;;0582; -0553;ARMENIAN CAPITAL LETTER PIWR;Lu;0;L;;;;;N;;;;0583; -0554;ARMENIAN CAPITAL LETTER KEH;Lu;0;L;;;;;N;;;;0584; -0555;ARMENIAN CAPITAL LETTER OH;Lu;0;L;;;;;N;;;;0585; -0556;ARMENIAN CAPITAL LETTER FEH;Lu;0;L;;;;;N;;;;0586; -0559;ARMENIAN MODIFIER LETTER LEFT HALF RING;Lm;0;L;;;;;N;;;;; -055A;ARMENIAN APOSTROPHE;Po;0;L;;;;;N;ARMENIAN MODIFIER LETTER RIGHT HALF RING;;;; -055B;ARMENIAN EMPHASIS MARK;Po;0;L;;;;;N;;;;; -055C;ARMENIAN EXCLAMATION MARK;Po;0;L;;;;;N;;;;; -055D;ARMENIAN COMMA;Po;0;L;;;;;N;;;;; -055E;ARMENIAN QUESTION MARK;Po;0;L;;;;;N;;;;; -055F;ARMENIAN ABBREVIATION MARK;Po;0;L;;;;;N;;;;; -0561;ARMENIAN SMALL LETTER AYB;Ll;0;L;;;;;N;;;0531;;0531 -0562;ARMENIAN SMALL LETTER BEN;Ll;0;L;;;;;N;;;0532;;0532 -0563;ARMENIAN SMALL LETTER GIM;Ll;0;L;;;;;N;;;0533;;0533 -0564;ARMENIAN SMALL LETTER DA;Ll;0;L;;;;;N;;;0534;;0534 -0565;ARMENIAN SMALL LETTER ECH;Ll;0;L;;;;;N;;;0535;;0535 -0566;ARMENIAN SMALL LETTER ZA;Ll;0;L;;;;;N;;;0536;;0536 -0567;ARMENIAN SMALL LETTER EH;Ll;0;L;;;;;N;;;0537;;0537 -0568;ARMENIAN SMALL LETTER ET;Ll;0;L;;;;;N;;;0538;;0538 -0569;ARMENIAN SMALL LETTER TO;Ll;0;L;;;;;N;;;0539;;0539 -056A;ARMENIAN SMALL LETTER ZHE;Ll;0;L;;;;;N;;;053A;;053A -056B;ARMENIAN SMALL LETTER INI;Ll;0;L;;;;;N;;;053B;;053B -056C;ARMENIAN SMALL LETTER LIWN;Ll;0;L;;;;;N;;;053C;;053C -056D;ARMENIAN SMALL LETTER XEH;Ll;0;L;;;;;N;;;053D;;053D -056E;ARMENIAN SMALL LETTER CA;Ll;0;L;;;;;N;;;053E;;053E -056F;ARMENIAN SMALL LETTER KEN;Ll;0;L;;;;;N;;;053F;;053F -0570;ARMENIAN SMALL LETTER HO;Ll;0;L;;;;;N;;;0540;;0540 -0571;ARMENIAN SMALL LETTER JA;Ll;0;L;;;;;N;;;0541;;0541 -0572;ARMENIAN SMALL LETTER GHAD;Ll;0;L;;;;;N;ARMENIAN SMALL LETTER LAD;;0542;;0542 -0573;ARMENIAN SMALL LETTER CHEH;Ll;0;L;;;;;N;;;0543;;0543 -0574;ARMENIAN SMALL LETTER MEN;Ll;0;L;;;;;N;;;0544;;0544 -0575;ARMENIAN SMALL LETTER YI;Ll;0;L;;;;;N;;;0545;;0545 -0576;ARMENIAN SMALL LETTER NOW;Ll;0;L;;;;;N;;;0546;;0546 -0577;ARMENIAN SMALL LETTER SHA;Ll;0;L;;;;;N;;;0547;;0547 -0578;ARMENIAN SMALL LETTER VO;Ll;0;L;;;;;N;;;0548;;0548 -0579;ARMENIAN SMALL LETTER CHA;Ll;0;L;;;;;N;;;0549;;0549 -057A;ARMENIAN SMALL LETTER PEH;Ll;0;L;;;;;N;;;054A;;054A -057B;ARMENIAN SMALL LETTER JHEH;Ll;0;L;;;;;N;;;054B;;054B -057C;ARMENIAN SMALL LETTER RA;Ll;0;L;;;;;N;;;054C;;054C -057D;ARMENIAN SMALL LETTER SEH;Ll;0;L;;;;;N;;;054D;;054D -057E;ARMENIAN SMALL LETTER VEW;Ll;0;L;;;;;N;;;054E;;054E -057F;ARMENIAN SMALL LETTER TIWN;Ll;0;L;;;;;N;;;054F;;054F -0580;ARMENIAN SMALL LETTER REH;Ll;0;L;;;;;N;;;0550;;0550 -0581;ARMENIAN SMALL LETTER CO;Ll;0;L;;;;;N;;;0551;;0551 -0582;ARMENIAN SMALL LETTER YIWN;Ll;0;L;;;;;N;;;0552;;0552 -0583;ARMENIAN SMALL LETTER PIWR;Ll;0;L;;;;;N;;;0553;;0553 -0584;ARMENIAN SMALL LETTER KEH;Ll;0;L;;;;;N;;;0554;;0554 -0585;ARMENIAN SMALL LETTER OH;Ll;0;L;;;;;N;;;0555;;0555 -0586;ARMENIAN SMALL LETTER FEH;Ll;0;L;;;;;N;;;0556;;0556 -0587;ARMENIAN SMALL LIGATURE ECH YIWN;Ll;0;L; 0565 0582;;;;N;;;;; -0589;ARMENIAN FULL STOP;Po;0;L;;;;;N;ARMENIAN PERIOD;;;; -058A;ARMENIAN HYPHEN;Pd;0;ON;;;;;N;;;;; -058D;RIGHT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; -058E;LEFT-FACING ARMENIAN ETERNITY SIGN;So;0;ON;;;;;N;;;;; -058F;ARMENIAN DRAM SIGN;Sc;0;ET;;;;;N;;;;; -0591;HEBREW ACCENT ETNAHTA;Mn;220;NSM;;;;;N;;;;; -0592;HEBREW ACCENT SEGOL;Mn;230;NSM;;;;;N;;;;; -0593;HEBREW ACCENT SHALSHELET;Mn;230;NSM;;;;;N;;;;; -0594;HEBREW ACCENT ZAQEF QATAN;Mn;230;NSM;;;;;N;;;;; -0595;HEBREW ACCENT ZAQEF GADOL;Mn;230;NSM;;;;;N;;;;; -0596;HEBREW ACCENT TIPEHA;Mn;220;NSM;;;;;N;;;;; -0597;HEBREW ACCENT REVIA;Mn;230;NSM;;;;;N;;;;; -0598;HEBREW ACCENT ZARQA;Mn;230;NSM;;;;;N;;;;; -0599;HEBREW ACCENT PASHTA;Mn;230;NSM;;;;;N;;;;; -059A;HEBREW ACCENT YETIV;Mn;222;NSM;;;;;N;;;;; -059B;HEBREW ACCENT TEVIR;Mn;220;NSM;;;;;N;;;;; -059C;HEBREW ACCENT GERESH;Mn;230;NSM;;;;;N;;;;; -059D;HEBREW ACCENT GERESH MUQDAM;Mn;230;NSM;;;;;N;;;;; -059E;HEBREW ACCENT GERSHAYIM;Mn;230;NSM;;;;;N;;;;; -059F;HEBREW ACCENT QARNEY PARA;Mn;230;NSM;;;;;N;;;;; -05A0;HEBREW ACCENT TELISHA GEDOLA;Mn;230;NSM;;;;;N;;;;; -05A1;HEBREW ACCENT PAZER;Mn;230;NSM;;;;;N;;;;; -05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;NSM;;;;;N;;;;; -05A3;HEBREW ACCENT MUNAH;Mn;220;NSM;;;;;N;;;;; -05A4;HEBREW ACCENT MAHAPAKH;Mn;220;NSM;;;;;N;;;;; -05A5;HEBREW ACCENT MERKHA;Mn;220;NSM;;;;;N;;;;; -05A6;HEBREW ACCENT MERKHA KEFULA;Mn;220;NSM;;;;;N;;;;; -05A7;HEBREW ACCENT DARGA;Mn;220;NSM;;;;;N;;;;; -05A8;HEBREW ACCENT QADMA;Mn;230;NSM;;;;;N;;;;; -05A9;HEBREW ACCENT TELISHA QETANA;Mn;230;NSM;;;;;N;;;;; -05AA;HEBREW ACCENT YERAH BEN YOMO;Mn;220;NSM;;;;;N;;;;; -05AB;HEBREW ACCENT OLE;Mn;230;NSM;;;;;N;;;;; -05AC;HEBREW ACCENT ILUY;Mn;230;NSM;;;;;N;;;;; -05AD;HEBREW ACCENT DEHI;Mn;222;NSM;;;;;N;;;;; -05AE;HEBREW ACCENT ZINOR;Mn;228;NSM;;;;;N;;;;; -05AF;HEBREW MARK MASORA CIRCLE;Mn;230;NSM;;;;;N;;;;; -05B0;HEBREW POINT SHEVA;Mn;10;NSM;;;;;N;;;;; -05B1;HEBREW POINT HATAF SEGOL;Mn;11;NSM;;;;;N;;;;; -05B2;HEBREW POINT HATAF PATAH;Mn;12;NSM;;;;;N;;;;; -05B3;HEBREW POINT HATAF QAMATS;Mn;13;NSM;;;;;N;;;;; -05B4;HEBREW POINT HIRIQ;Mn;14;NSM;;;;;N;;;;; -05B5;HEBREW POINT TSERE;Mn;15;NSM;;;;;N;;;;; -05B6;HEBREW POINT SEGOL;Mn;16;NSM;;;;;N;;;;; -05B7;HEBREW POINT PATAH;Mn;17;NSM;;;;;N;;;;; -05B8;HEBREW POINT QAMATS;Mn;18;NSM;;;;;N;;;;; -05B9;HEBREW POINT HOLAM;Mn;19;NSM;;;;;N;;;;; -05BA;HEBREW POINT HOLAM HASER FOR VAV;Mn;19;NSM;;;;;N;;;;; -05BB;HEBREW POINT QUBUTS;Mn;20;NSM;;;;;N;;;;; -05BC;HEBREW POINT DAGESH OR MAPIQ;Mn;21;NSM;;;;;N;HEBREW POINT DAGESH;;;; -05BD;HEBREW POINT METEG;Mn;22;NSM;;;;;N;;;;; -05BE;HEBREW PUNCTUATION MAQAF;Pd;0;R;;;;;N;;;;; -05BF;HEBREW POINT RAFE;Mn;23;NSM;;;;;N;;;;; -05C0;HEBREW PUNCTUATION PASEQ;Po;0;R;;;;;N;HEBREW POINT PASEQ;;;; -05C1;HEBREW POINT SHIN DOT;Mn;24;NSM;;;;;N;;;;; -05C2;HEBREW POINT SIN DOT;Mn;25;NSM;;;;;N;;;;; -05C3;HEBREW PUNCTUATION SOF PASUQ;Po;0;R;;;;;N;;;;; -05C4;HEBREW MARK UPPER DOT;Mn;230;NSM;;;;;N;;;;; -05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;; -05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;; -05C7;HEBREW POINT QAMATS QATAN;Mn;18;NSM;;;;;N;;;;; -05D0;HEBREW LETTER ALEF;Lo;0;R;;;;;N;;;;; -05D1;HEBREW LETTER BET;Lo;0;R;;;;;N;;;;; -05D2;HEBREW LETTER GIMEL;Lo;0;R;;;;;N;;;;; -05D3;HEBREW LETTER DALET;Lo;0;R;;;;;N;;;;; -05D4;HEBREW LETTER HE;Lo;0;R;;;;;N;;;;; -05D5;HEBREW LETTER VAV;Lo;0;R;;;;;N;;;;; -05D6;HEBREW LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -05D7;HEBREW LETTER HET;Lo;0;R;;;;;N;;;;; -05D8;HEBREW LETTER TET;Lo;0;R;;;;;N;;;;; -05D9;HEBREW LETTER YOD;Lo;0;R;;;;;N;;;;; -05DA;HEBREW LETTER FINAL KAF;Lo;0;R;;;;;N;;;;; -05DB;HEBREW LETTER KAF;Lo;0;R;;;;;N;;;;; -05DC;HEBREW LETTER LAMED;Lo;0;R;;;;;N;;;;; -05DD;HEBREW LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; -05DE;HEBREW LETTER MEM;Lo;0;R;;;;;N;;;;; -05DF;HEBREW LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -05E0;HEBREW LETTER NUN;Lo;0;R;;;;;N;;;;; -05E1;HEBREW LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -05E2;HEBREW LETTER AYIN;Lo;0;R;;;;;N;;;;; -05E3;HEBREW LETTER FINAL PE;Lo;0;R;;;;;N;;;;; -05E4;HEBREW LETTER PE;Lo;0;R;;;;;N;;;;; -05E5;HEBREW LETTER FINAL TSADI;Lo;0;R;;;;;N;;;;; -05E6;HEBREW LETTER TSADI;Lo;0;R;;;;;N;;;;; -05E7;HEBREW LETTER QOF;Lo;0;R;;;;;N;;;;; -05E8;HEBREW LETTER RESH;Lo;0;R;;;;;N;;;;; -05E9;HEBREW LETTER SHIN;Lo;0;R;;;;;N;;;;; -05EA;HEBREW LETTER TAV;Lo;0;R;;;;;N;;;;; -05F0;HEBREW LIGATURE YIDDISH DOUBLE VAV;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE VAV;;;; -05F1;HEBREW LIGATURE YIDDISH VAV YOD;Lo;0;R;;;;;N;HEBREW LETTER VAV YOD;;;; -05F2;HEBREW LIGATURE YIDDISH DOUBLE YOD;Lo;0;R;;;;;N;HEBREW LETTER DOUBLE YOD;;;; -05F3;HEBREW PUNCTUATION GERESH;Po;0;R;;;;;N;;;;; -05F4;HEBREW PUNCTUATION GERSHAYIM;Po;0;R;;;;;N;;;;; -0600;ARABIC NUMBER SIGN;Cf;0;AN;;;;;N;;;;; -0601;ARABIC SIGN SANAH;Cf;0;AN;;;;;N;;;;; -0602;ARABIC FOOTNOTE MARKER;Cf;0;AN;;;;;N;;;;; -0603;ARABIC SIGN SAFHA;Cf;0;AN;;;;;N;;;;; -0604;ARABIC SIGN SAMVAT;Cf;0;AN;;;;;N;;;;; -0605;ARABIC NUMBER MARK ABOVE;Cf;0;AN;;;;;N;;;;; -0606;ARABIC-INDIC CUBE ROOT;Sm;0;ON;;;;;N;;;;; -0607;ARABIC-INDIC FOURTH ROOT;Sm;0;ON;;;;;N;;;;; -0608;ARABIC RAY;Sm;0;AL;;;;;N;;;;; -0609;ARABIC-INDIC PER MILLE SIGN;Po;0;ET;;;;;N;;;;; -060A;ARABIC-INDIC PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; -060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;; -060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;; -060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;; -060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;; -060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;; -0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;; -0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;; -0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;; -0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;; -0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;; -0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;; -0616;ARABIC SMALL HIGH LIGATURE ALEF WITH LAM WITH YEH;Mn;230;NSM;;;;;N;;;;; -0617;ARABIC SMALL HIGH ZAIN;Mn;230;NSM;;;;;N;;;;; -0618;ARABIC SMALL FATHA;Mn;30;NSM;;;;;N;;;;; -0619;ARABIC SMALL DAMMA;Mn;31;NSM;;;;;N;;;;; -061A;ARABIC SMALL KASRA;Mn;32;NSM;;;;;N;;;;; -061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;; -061C;ARABIC LETTER MARK;Cf;0;AL;;;;;N;;;;; -061E;ARABIC TRIPLE DOT PUNCTUATION MARK;Po;0;AL;;;;;N;;;;; -061F;ARABIC QUESTION MARK;Po;0;AL;;;;;N;;;;; -0620;ARABIC LETTER KASHMIRI YEH;Lo;0;AL;;;;;N;;;;; -0621;ARABIC LETTER HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH;;;; -0622;ARABIC LETTER ALEF WITH MADDA ABOVE;Lo;0;AL;0627 0653;;;;N;ARABIC LETTER MADDAH ON ALEF;;;; -0623;ARABIC LETTER ALEF WITH HAMZA ABOVE;Lo;0;AL;0627 0654;;;;N;ARABIC LETTER HAMZAH ON ALEF;;;; -0624;ARABIC LETTER WAW WITH HAMZA ABOVE;Lo;0;AL;0648 0654;;;;N;ARABIC LETTER HAMZAH ON WAW;;;; -0625;ARABIC LETTER ALEF WITH HAMZA BELOW;Lo;0;AL;0627 0655;;;;N;ARABIC LETTER HAMZAH UNDER ALEF;;;; -0626;ARABIC LETTER YEH WITH HAMZA ABOVE;Lo;0;AL;064A 0654;;;;N;ARABIC LETTER HAMZAH ON YA;;;; -0627;ARABIC LETTER ALEF;Lo;0;AL;;;;;N;;;;; -0628;ARABIC LETTER BEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA;;;; -0629;ARABIC LETTER TEH MARBUTA;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH;;;; -062A;ARABIC LETTER TEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA;;;; -062B;ARABIC LETTER THEH;Lo;0;AL;;;;;N;ARABIC LETTER THAA;;;; -062C;ARABIC LETTER JEEM;Lo;0;AL;;;;;N;;;;; -062D;ARABIC LETTER HAH;Lo;0;AL;;;;;N;ARABIC LETTER HAA;;;; -062E;ARABIC LETTER KHAH;Lo;0;AL;;;;;N;ARABIC LETTER KHAA;;;; -062F;ARABIC LETTER DAL;Lo;0;AL;;;;;N;;;;; -0630;ARABIC LETTER THAL;Lo;0;AL;;;;;N;;;;; -0631;ARABIC LETTER REH;Lo;0;AL;;;;;N;ARABIC LETTER RA;;;; -0632;ARABIC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; -0633;ARABIC LETTER SEEN;Lo;0;AL;;;;;N;;;;; -0634;ARABIC LETTER SHEEN;Lo;0;AL;;;;;N;;;;; -0635;ARABIC LETTER SAD;Lo;0;AL;;;;;N;;;;; -0636;ARABIC LETTER DAD;Lo;0;AL;;;;;N;;;;; -0637;ARABIC LETTER TAH;Lo;0;AL;;;;;N;;;;; -0638;ARABIC LETTER ZAH;Lo;0;AL;;;;;N;ARABIC LETTER DHAH;;;; -0639;ARABIC LETTER AIN;Lo;0;AL;;;;;N;;;;; -063A;ARABIC LETTER GHAIN;Lo;0;AL;;;;;N;;;;; -063B;ARABIC LETTER KEHEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -063C;ARABIC LETTER KEHEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -063D;ARABIC LETTER FARSI YEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -063E;ARABIC LETTER FARSI YEH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -063F;ARABIC LETTER FARSI YEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0640;ARABIC TATWEEL;Lm;0;AL;;;;;N;;;;; -0641;ARABIC LETTER FEH;Lo;0;AL;;;;;N;ARABIC LETTER FA;;;; -0642;ARABIC LETTER QAF;Lo;0;AL;;;;;N;;;;; -0643;ARABIC LETTER KAF;Lo;0;AL;;;;;N;ARABIC LETTER CAF;;;; -0644;ARABIC LETTER LAM;Lo;0;AL;;;;;N;;;;; -0645;ARABIC LETTER MEEM;Lo;0;AL;;;;;N;;;;; -0646;ARABIC LETTER NOON;Lo;0;AL;;;;;N;;;;; -0647;ARABIC LETTER HEH;Lo;0;AL;;;;;N;ARABIC LETTER HA;;;; -0648;ARABIC LETTER WAW;Lo;0;AL;;;;;N;;;;; -0649;ARABIC LETTER ALEF MAKSURA;Lo;0;AL;;;;;N;ARABIC LETTER ALEF MAQSURAH;;;; -064A;ARABIC LETTER YEH;Lo;0;AL;;;;;N;ARABIC LETTER YA;;;; -064B;ARABIC FATHATAN;Mn;27;NSM;;;;;N;;;;; -064C;ARABIC DAMMATAN;Mn;28;NSM;;;;;N;;;;; -064D;ARABIC KASRATAN;Mn;29;NSM;;;;;N;;;;; -064E;ARABIC FATHA;Mn;30;NSM;;;;;N;ARABIC FATHAH;;;; -064F;ARABIC DAMMA;Mn;31;NSM;;;;;N;ARABIC DAMMAH;;;; -0650;ARABIC KASRA;Mn;32;NSM;;;;;N;ARABIC KASRAH;;;; -0651;ARABIC SHADDA;Mn;33;NSM;;;;;N;ARABIC SHADDAH;;;; -0652;ARABIC SUKUN;Mn;34;NSM;;;;;N;;;;; -0653;ARABIC MADDAH ABOVE;Mn;230;NSM;;;;;N;;;;; -0654;ARABIC HAMZA ABOVE;Mn;230;NSM;;;;;N;;;;; -0655;ARABIC HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; -0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;; -0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;; -0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; -0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;; -065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; -065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;; -065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; -065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;; -065E;ARABIC FATHA WITH TWO DOTS;Mn;230;NSM;;;;;N;;;;; -065F;ARABIC WAVY HAMZA BELOW;Mn;220;NSM;;;;;N;;;;; -0660;ARABIC-INDIC DIGIT ZERO;Nd;0;AN;;0;0;0;N;;;;; -0661;ARABIC-INDIC DIGIT ONE;Nd;0;AN;;1;1;1;N;;;;; -0662;ARABIC-INDIC DIGIT TWO;Nd;0;AN;;2;2;2;N;;;;; -0663;ARABIC-INDIC DIGIT THREE;Nd;0;AN;;3;3;3;N;;;;; -0664;ARABIC-INDIC DIGIT FOUR;Nd;0;AN;;4;4;4;N;;;;; -0665;ARABIC-INDIC DIGIT FIVE;Nd;0;AN;;5;5;5;N;;;;; -0666;ARABIC-INDIC DIGIT SIX;Nd;0;AN;;6;6;6;N;;;;; -0667;ARABIC-INDIC DIGIT SEVEN;Nd;0;AN;;7;7;7;N;;;;; -0668;ARABIC-INDIC DIGIT EIGHT;Nd;0;AN;;8;8;8;N;;;;; -0669;ARABIC-INDIC DIGIT NINE;Nd;0;AN;;9;9;9;N;;;;; -066A;ARABIC PERCENT SIGN;Po;0;ET;;;;;N;;;;; -066B;ARABIC DECIMAL SEPARATOR;Po;0;AN;;;;;N;;;;; -066C;ARABIC THOUSANDS SEPARATOR;Po;0;AN;;;;;N;;;;; -066D;ARABIC FIVE POINTED STAR;Po;0;AL;;;;;N;;;;; -066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;; -066F;ARABIC LETTER DOTLESS QAF;Lo;0;AL;;;;;N;;;;; -0670;ARABIC LETTER SUPERSCRIPT ALEF;Mn;35;NSM;;;;;N;ARABIC ALEF ABOVE;;;; -0671;ARABIC LETTER ALEF WASLA;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAT WASL ON ALEF;;;; -0672;ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH ON ALEF;;;; -0673;ARABIC LETTER ALEF WITH WAVY HAMZA BELOW;Lo;0;AL;;;;;N;ARABIC LETTER WAVY HAMZAH UNDER ALEF;;;; -0674;ARABIC LETTER HIGH HAMZA;Lo;0;AL;;;;;N;ARABIC LETTER HIGH HAMZAH;;;; -0675;ARABIC LETTER HIGH HAMZA ALEF;Lo;0;AL; 0627 0674;;;;N;ARABIC LETTER HIGH HAMZAH ALEF;;;; -0676;ARABIC LETTER HIGH HAMZA WAW;Lo;0;AL; 0648 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW;;;; -0677;ARABIC LETTER U WITH HAMZA ABOVE;Lo;0;AL; 06C7 0674;;;;N;ARABIC LETTER HIGH HAMZAH WAW WITH DAMMAH;;;; -0678;ARABIC LETTER HIGH HAMZA YEH;Lo;0;AL; 064A 0674;;;;N;ARABIC LETTER HIGH HAMZAH YA;;;; -0679;ARABIC LETTER TTEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH SMALL TAH;;;; -067A;ARABIC LETTER TTEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH TWO DOTS VERTICAL ABOVE;;;; -067B;ARABIC LETTER BEEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH TWO DOTS VERTICAL BELOW;;;; -067C;ARABIC LETTER TEH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH RING;;;; -067D;ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS ABOVE DOWNWARD;;;; -067E;ARABIC LETTER PEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH THREE DOTS BELOW;;;; -067F;ARABIC LETTER TEHEH;Lo;0;AL;;;;;N;ARABIC LETTER TAA WITH FOUR DOTS ABOVE;;;; -0680;ARABIC LETTER BEHEH;Lo;0;AL;;;;;N;ARABIC LETTER BAA WITH FOUR DOTS BELOW;;;; -0681;ARABIC LETTER HAH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAMZAH ON HAA;;;; -0682;ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH TWO DOTS VERTICAL ABOVE;;;; -0683;ARABIC LETTER NYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS;;;; -0684;ARABIC LETTER DYEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE TWO DOTS VERTICAL;;;; -0685;ARABIC LETTER HAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH THREE DOTS ABOVE;;;; -0686;ARABIC LETTER TCHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE THREE DOTS DOWNWARD;;;; -0687;ARABIC LETTER TCHEHEH;Lo;0;AL;;;;;N;ARABIC LETTER HAA WITH MIDDLE FOUR DOTS;;;; -0688;ARABIC LETTER DDAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH SMALL TAH;;;; -0689;ARABIC LETTER DAL WITH RING;Lo;0;AL;;;;;N;;;;; -068A;ARABIC LETTER DAL WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -068B;ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; -068C;ARABIC LETTER DAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS ABOVE;;;; -068D;ARABIC LETTER DDAHAL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH TWO DOTS BELOW;;;; -068E;ARABIC LETTER DUL;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE;;;; -068F;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS;Lo;0;AL;;;;;N;ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARD;;;; -0690;ARABIC LETTER DAL WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0691;ARABIC LETTER RREH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL TAH;;;; -0692;ARABIC LETTER REH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V;;;; -0693;ARABIC LETTER REH WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH RING;;;; -0694;ARABIC LETTER REH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW;;;; -0695;ARABIC LETTER REH WITH SMALL V BELOW;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH SMALL V BELOW;;;; -0696;ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH DOT BELOW AND DOT ABOVE;;;; -0697;ARABIC LETTER REH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH TWO DOTS ABOVE;;;; -0698;ARABIC LETTER JEH;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH THREE DOTS ABOVE;;;; -0699;ARABIC LETTER REH WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER RA WITH FOUR DOTS ABOVE;;;; -069A;ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -069B;ARABIC LETTER SEEN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -069C;ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -069D;ARABIC LETTER SAD WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -069E;ARABIC LETTER SAD WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -069F;ARABIC LETTER TAH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A0;ARABIC LETTER AIN WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A1;ARABIC LETTER DOTLESS FEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS FA;;;; -06A2;ARABIC LETTER FEH WITH DOT MOVED BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT MOVED BELOW;;;; -06A3;ARABIC LETTER FEH WITH DOT BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH DOT BELOW;;;; -06A4;ARABIC LETTER VEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS ABOVE;;;; -06A5;ARABIC LETTER FEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH THREE DOTS BELOW;;;; -06A6;ARABIC LETTER PEHEH;Lo;0;AL;;;;;N;ARABIC LETTER FA WITH FOUR DOTS ABOVE;;;; -06A7;ARABIC LETTER QAF WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06A8;ARABIC LETTER QAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06A9;ARABIC LETTER KEHEH;Lo;0;AL;;;;;N;ARABIC LETTER OPEN CAF;;;; -06AA;ARABIC LETTER SWASH KAF;Lo;0;AL;;;;;N;ARABIC LETTER SWASH CAF;;;; -06AB;ARABIC LETTER KAF WITH RING;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH RING;;;; -06AC;ARABIC LETTER KAF WITH DOT ABOVE;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH DOT ABOVE;;;; -06AD;ARABIC LETTER NG;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS ABOVE;;;; -06AE;ARABIC LETTER KAF WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER CAF WITH THREE DOTS BELOW;;;; -06AF;ARABIC LETTER GAF;Lo;0;AL;;;;;N;;;;; -06B0;ARABIC LETTER GAF WITH RING;Lo;0;AL;;;;;N;;;;; -06B1;ARABIC LETTER NGOEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS ABOVE;;;; -06B2;ARABIC LETTER GAF WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -06B3;ARABIC LETTER GUEH;Lo;0;AL;;;;;N;ARABIC LETTER GAF WITH TWO DOTS VERTICAL BELOW;;;; -06B4;ARABIC LETTER GAF WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06B5;ARABIC LETTER LAM WITH SMALL V;Lo;0;AL;;;;;N;;;;; -06B6;ARABIC LETTER LAM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06B7;ARABIC LETTER LAM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06B8;ARABIC LETTER LAM WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -06B9;ARABIC LETTER NOON WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06BA;ARABIC LETTER NOON GHUNNA;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON;;;; -06BB;ARABIC LETTER RNOON;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS NOON WITH SMALL TAH;;;; -06BC;ARABIC LETTER NOON WITH RING;Lo;0;AL;;;;;N;;;;; -06BD;ARABIC LETTER NOON WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06BE;ARABIC LETTER HEH DOACHASHMEE;Lo;0;AL;;;;;N;ARABIC LETTER KNOTTED HA;;;; -06BF;ARABIC LETTER TCHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06C0;ARABIC LETTER HEH WITH YEH ABOVE;Lo;0;AL;06D5 0654;;;;N;ARABIC LETTER HAMZAH ON HA;;;; -06C1;ARABIC LETTER HEH GOAL;Lo;0;AL;;;;;N;ARABIC LETTER HA GOAL;;;; -06C2;ARABIC LETTER HEH GOAL WITH HAMZA ABOVE;Lo;0;AL;06C1 0654;;;;N;ARABIC LETTER HAMZAH ON HA GOAL;;;; -06C3;ARABIC LETTER TEH MARBUTA GOAL;Lo;0;AL;;;;;N;ARABIC LETTER TAA MARBUTAH GOAL;;;; -06C4;ARABIC LETTER WAW WITH RING;Lo;0;AL;;;;;N;;;;; -06C5;ARABIC LETTER KIRGHIZ OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH BAR;;;; -06C6;ARABIC LETTER OE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH SMALL V;;;; -06C7;ARABIC LETTER U;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH DAMMAH;;;; -06C8;ARABIC LETTER YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH ALEF ABOVE;;;; -06C9;ARABIC LETTER KIRGHIZ YU;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH INVERTED SMALL V;;;; -06CA;ARABIC LETTER WAW WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -06CB;ARABIC LETTER VE;Lo;0;AL;;;;;N;ARABIC LETTER WAW WITH THREE DOTS ABOVE;;;; -06CC;ARABIC LETTER FARSI YEH;Lo;0;AL;;;;;N;ARABIC LETTER DOTLESS YA;;;; -06CD;ARABIC LETTER YEH WITH TAIL;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TAIL;;;; -06CE;ARABIC LETTER YEH WITH SMALL V;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH SMALL V;;;; -06CF;ARABIC LETTER WAW WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -06D0;ARABIC LETTER E;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH TWO DOTS VERTICAL BELOW;;;; -06D1;ARABIC LETTER YEH WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;ARABIC LETTER YA WITH THREE DOTS BELOW;;;; -06D2;ARABIC LETTER YEH BARREE;Lo;0;AL;;;;;N;ARABIC LETTER YA BARREE;;;; -06D3;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE;Lo;0;AL;06D2 0654;;;;N;ARABIC LETTER HAMZAH ON YA BARREE;;;; -06D4;ARABIC FULL STOP;Po;0;AL;;;;;N;ARABIC PERIOD;;;; -06D5;ARABIC LETTER AE;Lo;0;AL;;;;;N;;;;; -06D6;ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; -06D7;ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA;Mn;230;NSM;;;;;N;;;;; -06D8;ARABIC SMALL HIGH MEEM INITIAL FORM;Mn;230;NSM;;;;;N;;;;; -06D9;ARABIC SMALL HIGH LAM ALEF;Mn;230;NSM;;;;;N;;;;; -06DA;ARABIC SMALL HIGH JEEM;Mn;230;NSM;;;;;N;;;;; -06DB;ARABIC SMALL HIGH THREE DOTS;Mn;230;NSM;;;;;N;;;;; -06DC;ARABIC SMALL HIGH SEEN;Mn;230;NSM;;;;;N;;;;; -06DD;ARABIC END OF AYAH;Cf;0;AN;;;;;N;;;;; -06DE;ARABIC START OF RUB EL HIZB;So;0;ON;;;;;N;;;;; -06DF;ARABIC SMALL HIGH ROUNDED ZERO;Mn;230;NSM;;;;;N;;;;; -06E0;ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO;Mn;230;NSM;;;;;N;;;;; -06E1;ARABIC SMALL HIGH DOTLESS HEAD OF KHAH;Mn;230;NSM;;;;;N;;;;; -06E2;ARABIC SMALL HIGH MEEM ISOLATED FORM;Mn;230;NSM;;;;;N;;;;; -06E3;ARABIC SMALL LOW SEEN;Mn;220;NSM;;;;;N;;;;; -06E4;ARABIC SMALL HIGH MADDA;Mn;230;NSM;;;;;N;;;;; -06E5;ARABIC SMALL WAW;Lm;0;AL;;;;;N;;;;; -06E6;ARABIC SMALL YEH;Lm;0;AL;;;;;N;;;;; -06E7;ARABIC SMALL HIGH YEH;Mn;230;NSM;;;;;N;;;;; -06E8;ARABIC SMALL HIGH NOON;Mn;230;NSM;;;;;N;;;;; -06E9;ARABIC PLACE OF SAJDAH;So;0;ON;;;;;N;;;;; -06EA;ARABIC EMPTY CENTRE LOW STOP;Mn;220;NSM;;;;;N;;;;; -06EB;ARABIC EMPTY CENTRE HIGH STOP;Mn;230;NSM;;;;;N;;;;; -06EC;ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE;Mn;230;NSM;;;;;N;;;;; -06ED;ARABIC SMALL LOW MEEM;Mn;220;NSM;;;;;N;;;;; -06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -06F0;EXTENDED ARABIC-INDIC DIGIT ZERO;Nd;0;EN;;0;0;0;N;EASTERN ARABIC-INDIC DIGIT ZERO;;;; -06F1;EXTENDED ARABIC-INDIC DIGIT ONE;Nd;0;EN;;1;1;1;N;EASTERN ARABIC-INDIC DIGIT ONE;;;; -06F2;EXTENDED ARABIC-INDIC DIGIT TWO;Nd;0;EN;;2;2;2;N;EASTERN ARABIC-INDIC DIGIT TWO;;;; -06F3;EXTENDED ARABIC-INDIC DIGIT THREE;Nd;0;EN;;3;3;3;N;EASTERN ARABIC-INDIC DIGIT THREE;;;; -06F4;EXTENDED ARABIC-INDIC DIGIT FOUR;Nd;0;EN;;4;4;4;N;EASTERN ARABIC-INDIC DIGIT FOUR;;;; -06F5;EXTENDED ARABIC-INDIC DIGIT FIVE;Nd;0;EN;;5;5;5;N;EASTERN ARABIC-INDIC DIGIT FIVE;;;; -06F6;EXTENDED ARABIC-INDIC DIGIT SIX;Nd;0;EN;;6;6;6;N;EASTERN ARABIC-INDIC DIGIT SIX;;;; -06F7;EXTENDED ARABIC-INDIC DIGIT SEVEN;Nd;0;EN;;7;7;7;N;EASTERN ARABIC-INDIC DIGIT SEVEN;;;; -06F8;EXTENDED ARABIC-INDIC DIGIT EIGHT;Nd;0;EN;;8;8;8;N;EASTERN ARABIC-INDIC DIGIT EIGHT;;;; -06F9;EXTENDED ARABIC-INDIC DIGIT NINE;Nd;0;EN;;9;9;9;N;EASTERN ARABIC-INDIC DIGIT NINE;;;; -06FA;ARABIC LETTER SHEEN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FB;ARABIC LETTER DAD WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FC;ARABIC LETTER GHAIN WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -06FD;ARABIC SIGN SINDHI AMPERSAND;So;0;AL;;;;;N;;;;; -06FE;ARABIC SIGN SINDHI POSTPOSITION MEN;So;0;AL;;;;;N;;;;; -06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -0700;SYRIAC END OF PARAGRAPH;Po;0;AL;;;;;N;;;;; -0701;SYRIAC SUPRALINEAR FULL STOP;Po;0;AL;;;;;N;;;;; -0702;SYRIAC SUBLINEAR FULL STOP;Po;0;AL;;;;;N;;;;; -0703;SYRIAC SUPRALINEAR COLON;Po;0;AL;;;;;N;;;;; -0704;SYRIAC SUBLINEAR COLON;Po;0;AL;;;;;N;;;;; -0705;SYRIAC HORIZONTAL COLON;Po;0;AL;;;;;N;;;;; -0706;SYRIAC COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; -0707;SYRIAC COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; -0708;SYRIAC SUPRALINEAR COLON SKEWED LEFT;Po;0;AL;;;;;N;;;;; -0709;SYRIAC SUBLINEAR COLON SKEWED RIGHT;Po;0;AL;;;;;N;;;;; -070A;SYRIAC CONTRACTION;Po;0;AL;;;;;N;;;;; -070B;SYRIAC HARKLEAN OBELUS;Po;0;AL;;;;;N;;;;; -070C;SYRIAC HARKLEAN METOBELUS;Po;0;AL;;;;;N;;;;; -070D;SYRIAC HARKLEAN ASTERISCUS;Po;0;AL;;;;;N;;;;; -070F;SYRIAC ABBREVIATION MARK;Cf;0;AL;;;;;N;;;;; -0710;SYRIAC LETTER ALAPH;Lo;0;AL;;;;;N;;;;; -0711;SYRIAC LETTER SUPERSCRIPT ALAPH;Mn;36;NSM;;;;;N;;;;; -0712;SYRIAC LETTER BETH;Lo;0;AL;;;;;N;;;;; -0713;SYRIAC LETTER GAMAL;Lo;0;AL;;;;;N;;;;; -0714;SYRIAC LETTER GAMAL GARSHUNI;Lo;0;AL;;;;;N;;;;; -0715;SYRIAC LETTER DALATH;Lo;0;AL;;;;;N;;;;; -0716;SYRIAC LETTER DOTLESS DALATH RISH;Lo;0;AL;;;;;N;;;;; -0717;SYRIAC LETTER HE;Lo;0;AL;;;;;N;;;;; -0718;SYRIAC LETTER WAW;Lo;0;AL;;;;;N;;;;; -0719;SYRIAC LETTER ZAIN;Lo;0;AL;;;;;N;;;;; -071A;SYRIAC LETTER HETH;Lo;0;AL;;;;;N;;;;; -071B;SYRIAC LETTER TETH;Lo;0;AL;;;;;N;;;;; -071C;SYRIAC LETTER TETH GARSHUNI;Lo;0;AL;;;;;N;;;;; -071D;SYRIAC LETTER YUDH;Lo;0;AL;;;;;N;;;;; -071E;SYRIAC LETTER YUDH HE;Lo;0;AL;;;;;N;;;;; -071F;SYRIAC LETTER KAPH;Lo;0;AL;;;;;N;;;;; -0720;SYRIAC LETTER LAMADH;Lo;0;AL;;;;;N;;;;; -0721;SYRIAC LETTER MIM;Lo;0;AL;;;;;N;;;;; -0722;SYRIAC LETTER NUN;Lo;0;AL;;;;;N;;;;; -0723;SYRIAC LETTER SEMKATH;Lo;0;AL;;;;;N;;;;; -0724;SYRIAC LETTER FINAL SEMKATH;Lo;0;AL;;;;;N;;;;; -0725;SYRIAC LETTER E;Lo;0;AL;;;;;N;;;;; -0726;SYRIAC LETTER PE;Lo;0;AL;;;;;N;;;;; -0727;SYRIAC LETTER REVERSED PE;Lo;0;AL;;;;;N;;;;; -0728;SYRIAC LETTER SADHE;Lo;0;AL;;;;;N;;;;; -0729;SYRIAC LETTER QAPH;Lo;0;AL;;;;;N;;;;; -072A;SYRIAC LETTER RISH;Lo;0;AL;;;;;N;;;;; -072B;SYRIAC LETTER SHIN;Lo;0;AL;;;;;N;;;;; -072C;SYRIAC LETTER TAW;Lo;0;AL;;;;;N;;;;; -072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;; -072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;; -072F;SYRIAC LETTER PERSIAN DHALATH;Lo;0;AL;;;;;N;;;;; -0730;SYRIAC PTHAHA ABOVE;Mn;230;NSM;;;;;N;;;;; -0731;SYRIAC PTHAHA BELOW;Mn;220;NSM;;;;;N;;;;; -0732;SYRIAC PTHAHA DOTTED;Mn;230;NSM;;;;;N;;;;; -0733;SYRIAC ZQAPHA ABOVE;Mn;230;NSM;;;;;N;;;;; -0734;SYRIAC ZQAPHA BELOW;Mn;220;NSM;;;;;N;;;;; -0735;SYRIAC ZQAPHA DOTTED;Mn;230;NSM;;;;;N;;;;; -0736;SYRIAC RBASA ABOVE;Mn;230;NSM;;;;;N;;;;; -0737;SYRIAC RBASA BELOW;Mn;220;NSM;;;;;N;;;;; -0738;SYRIAC DOTTED ZLAMA HORIZONTAL;Mn;220;NSM;;;;;N;;;;; -0739;SYRIAC DOTTED ZLAMA ANGULAR;Mn;220;NSM;;;;;N;;;;; -073A;SYRIAC HBASA ABOVE;Mn;230;NSM;;;;;N;;;;; -073B;SYRIAC HBASA BELOW;Mn;220;NSM;;;;;N;;;;; -073C;SYRIAC HBASA-ESASA DOTTED;Mn;220;NSM;;;;;N;;;;; -073D;SYRIAC ESASA ABOVE;Mn;230;NSM;;;;;N;;;;; -073E;SYRIAC ESASA BELOW;Mn;220;NSM;;;;;N;;;;; -073F;SYRIAC RWAHA;Mn;230;NSM;;;;;N;;;;; -0740;SYRIAC FEMININE DOT;Mn;230;NSM;;;;;N;;;;; -0741;SYRIAC QUSHSHAYA;Mn;230;NSM;;;;;N;;;;; -0742;SYRIAC RUKKAKHA;Mn;220;NSM;;;;;N;;;;; -0743;SYRIAC TWO VERTICAL DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -0744;SYRIAC TWO VERTICAL DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -0745;SYRIAC THREE DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -0746;SYRIAC THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -0747;SYRIAC OBLIQUE LINE ABOVE;Mn;230;NSM;;;;;N;;;;; -0748;SYRIAC OBLIQUE LINE BELOW;Mn;220;NSM;;;;;N;;;;; -0749;SYRIAC MUSIC;Mn;230;NSM;;;;;N;;;;; -074A;SYRIAC BARREKH;Mn;230;NSM;;;;;N;;;;; -074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;; -074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;; -074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;; -0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;; -0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; -0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;; -0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;; -075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;; -075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;; -075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;; -075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; -0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;; -0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;; -0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;; -0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;; -0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;; -076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;; -076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; -076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; -076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;; -076E;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH BELOW;Lo;0;AL;;;;;N;;;;; -076F;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; -0770;ARABIC LETTER SEEN WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; -0771;ARABIC LETTER REH WITH SMALL ARABIC LETTER TAH AND TWO DOTS;Lo;0;AL;;;;;N;;;;; -0772;ARABIC LETTER HAH WITH SMALL ARABIC LETTER TAH ABOVE;Lo;0;AL;;;;;N;;;;; -0773;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -0774;ARABIC LETTER ALEF WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -0775;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -0776;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -0777;ARABIC LETTER FARSI YEH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; -0778;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -0779;ARABIC LETTER WAW WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -077A;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT TWO ABOVE;Lo;0;AL;;;;;N;;;;; -077B;ARABIC LETTER YEH BARREE WITH EXTENDED ARABIC-INDIC DIGIT THREE ABOVE;Lo;0;AL;;;;;N;;;;; -077C;ARABIC LETTER HAH WITH EXTENDED ARABIC-INDIC DIGIT FOUR BELOW;Lo;0;AL;;;;;N;;;;; -077D;ARABIC LETTER SEEN WITH EXTENDED ARABIC-INDIC DIGIT FOUR ABOVE;Lo;0;AL;;;;;N;;;;; -077E;ARABIC LETTER SEEN WITH INVERTED V;Lo;0;AL;;;;;N;;;;; -077F;ARABIC LETTER KAF WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -0780;THAANA LETTER HAA;Lo;0;AL;;;;;N;;;;; -0781;THAANA LETTER SHAVIYANI;Lo;0;AL;;;;;N;;;;; -0782;THAANA LETTER NOONU;Lo;0;AL;;;;;N;;;;; -0783;THAANA LETTER RAA;Lo;0;AL;;;;;N;;;;; -0784;THAANA LETTER BAA;Lo;0;AL;;;;;N;;;;; -0785;THAANA LETTER LHAVIYANI;Lo;0;AL;;;;;N;;;;; -0786;THAANA LETTER KAAFU;Lo;0;AL;;;;;N;;;;; -0787;THAANA LETTER ALIFU;Lo;0;AL;;;;;N;;;;; -0788;THAANA LETTER VAAVU;Lo;0;AL;;;;;N;;;;; -0789;THAANA LETTER MEEMU;Lo;0;AL;;;;;N;;;;; -078A;THAANA LETTER FAAFU;Lo;0;AL;;;;;N;;;;; -078B;THAANA LETTER DHAALU;Lo;0;AL;;;;;N;;;;; -078C;THAANA LETTER THAA;Lo;0;AL;;;;;N;;;;; -078D;THAANA LETTER LAAMU;Lo;0;AL;;;;;N;;;;; -078E;THAANA LETTER GAAFU;Lo;0;AL;;;;;N;;;;; -078F;THAANA LETTER GNAVIYANI;Lo;0;AL;;;;;N;;;;; -0790;THAANA LETTER SEENU;Lo;0;AL;;;;;N;;;;; -0791;THAANA LETTER DAVIYANI;Lo;0;AL;;;;;N;;;;; -0792;THAANA LETTER ZAVIYANI;Lo;0;AL;;;;;N;;;;; -0793;THAANA LETTER TAVIYANI;Lo;0;AL;;;;;N;;;;; -0794;THAANA LETTER YAA;Lo;0;AL;;;;;N;;;;; -0795;THAANA LETTER PAVIYANI;Lo;0;AL;;;;;N;;;;; -0796;THAANA LETTER JAVIYANI;Lo;0;AL;;;;;N;;;;; -0797;THAANA LETTER CHAVIYANI;Lo;0;AL;;;;;N;;;;; -0798;THAANA LETTER TTAA;Lo;0;AL;;;;;N;;;;; -0799;THAANA LETTER HHAA;Lo;0;AL;;;;;N;;;;; -079A;THAANA LETTER KHAA;Lo;0;AL;;;;;N;;;;; -079B;THAANA LETTER THAALU;Lo;0;AL;;;;;N;;;;; -079C;THAANA LETTER ZAA;Lo;0;AL;;;;;N;;;;; -079D;THAANA LETTER SHEENU;Lo;0;AL;;;;;N;;;;; -079E;THAANA LETTER SAADHU;Lo;0;AL;;;;;N;;;;; -079F;THAANA LETTER DAADHU;Lo;0;AL;;;;;N;;;;; -07A0;THAANA LETTER TO;Lo;0;AL;;;;;N;;;;; -07A1;THAANA LETTER ZO;Lo;0;AL;;;;;N;;;;; -07A2;THAANA LETTER AINU;Lo;0;AL;;;;;N;;;;; -07A3;THAANA LETTER GHAINU;Lo;0;AL;;;;;N;;;;; -07A4;THAANA LETTER QAAFU;Lo;0;AL;;;;;N;;;;; -07A5;THAANA LETTER WAAVU;Lo;0;AL;;;;;N;;;;; -07A6;THAANA ABAFILI;Mn;0;NSM;;;;;N;;;;; -07A7;THAANA AABAAFILI;Mn;0;NSM;;;;;N;;;;; -07A8;THAANA IBIFILI;Mn;0;NSM;;;;;N;;;;; -07A9;THAANA EEBEEFILI;Mn;0;NSM;;;;;N;;;;; -07AA;THAANA UBUFILI;Mn;0;NSM;;;;;N;;;;; -07AB;THAANA OOBOOFILI;Mn;0;NSM;;;;;N;;;;; -07AC;THAANA EBEFILI;Mn;0;NSM;;;;;N;;;;; -07AD;THAANA EYBEYFILI;Mn;0;NSM;;;;;N;;;;; -07AE;THAANA OBOFILI;Mn;0;NSM;;;;;N;;;;; -07AF;THAANA OABOAFILI;Mn;0;NSM;;;;;N;;;;; -07B0;THAANA SUKUN;Mn;0;NSM;;;;;N;;;;; -07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;; -07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;; -07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;; -07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;; -07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;; -07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;; -07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;; -07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;; -07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;; -07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;; -07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;; -07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;; -07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;; -07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;; -07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;; -07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;; -07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;; -07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;; -07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;; -07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;; -07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;; -07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;; -07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;; -07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;; -07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;; -07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;; -07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;; -07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;; -07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;; -07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;; -07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;; -07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;; -07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;; -07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;; -07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;; -07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;; -07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;; -07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;; -07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;; -07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;; -07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;; -07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;; -07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;; -07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;; -07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;; -07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;; -07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;; -07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;; -07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;; -07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;; -07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;; -07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;; -07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; -07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; -07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;; -07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;; -07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;; -07F8;NKO COMMA;Po;0;ON;;;;;N;;;;; -07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -07FA;NKO LAJANYALAN;Lm;0;R;;;;;N;;;;; -0800;SAMARITAN LETTER ALAF;Lo;0;R;;;;;N;;;;; -0801;SAMARITAN LETTER BIT;Lo;0;R;;;;;N;;;;; -0802;SAMARITAN LETTER GAMAN;Lo;0;R;;;;;N;;;;; -0803;SAMARITAN LETTER DALAT;Lo;0;R;;;;;N;;;;; -0804;SAMARITAN LETTER IY;Lo;0;R;;;;;N;;;;; -0805;SAMARITAN LETTER BAA;Lo;0;R;;;;;N;;;;; -0806;SAMARITAN LETTER ZEN;Lo;0;R;;;;;N;;;;; -0807;SAMARITAN LETTER IT;Lo;0;R;;;;;N;;;;; -0808;SAMARITAN LETTER TIT;Lo;0;R;;;;;N;;;;; -0809;SAMARITAN LETTER YUT;Lo;0;R;;;;;N;;;;; -080A;SAMARITAN LETTER KAAF;Lo;0;R;;;;;N;;;;; -080B;SAMARITAN LETTER LABAT;Lo;0;R;;;;;N;;;;; -080C;SAMARITAN LETTER MIM;Lo;0;R;;;;;N;;;;; -080D;SAMARITAN LETTER NUN;Lo;0;R;;;;;N;;;;; -080E;SAMARITAN LETTER SINGAAT;Lo;0;R;;;;;N;;;;; -080F;SAMARITAN LETTER IN;Lo;0;R;;;;;N;;;;; -0810;SAMARITAN LETTER FI;Lo;0;R;;;;;N;;;;; -0811;SAMARITAN LETTER TSAADIY;Lo;0;R;;;;;N;;;;; -0812;SAMARITAN LETTER QUF;Lo;0;R;;;;;N;;;;; -0813;SAMARITAN LETTER RISH;Lo;0;R;;;;;N;;;;; -0814;SAMARITAN LETTER SHAN;Lo;0;R;;;;;N;;;;; -0815;SAMARITAN LETTER TAAF;Lo;0;R;;;;;N;;;;; -0816;SAMARITAN MARK IN;Mn;230;NSM;;;;;N;;;;; -0817;SAMARITAN MARK IN-ALAF;Mn;230;NSM;;;;;N;;;;; -0818;SAMARITAN MARK OCCLUSION;Mn;230;NSM;;;;;N;;;;; -0819;SAMARITAN MARK DAGESH;Mn;230;NSM;;;;;N;;;;; -081A;SAMARITAN MODIFIER LETTER EPENTHETIC YUT;Lm;0;R;;;;;N;;;;; -081B;SAMARITAN MARK EPENTHETIC YUT;Mn;230;NSM;;;;;N;;;;; -081C;SAMARITAN VOWEL SIGN LONG E;Mn;230;NSM;;;;;N;;;;; -081D;SAMARITAN VOWEL SIGN E;Mn;230;NSM;;;;;N;;;;; -081E;SAMARITAN VOWEL SIGN OVERLONG AA;Mn;230;NSM;;;;;N;;;;; -081F;SAMARITAN VOWEL SIGN LONG AA;Mn;230;NSM;;;;;N;;;;; -0820;SAMARITAN VOWEL SIGN AA;Mn;230;NSM;;;;;N;;;;; -0821;SAMARITAN VOWEL SIGN OVERLONG A;Mn;230;NSM;;;;;N;;;;; -0822;SAMARITAN VOWEL SIGN LONG A;Mn;230;NSM;;;;;N;;;;; -0823;SAMARITAN VOWEL SIGN A;Mn;230;NSM;;;;;N;;;;; -0824;SAMARITAN MODIFIER LETTER SHORT A;Lm;0;R;;;;;N;;;;; -0825;SAMARITAN VOWEL SIGN SHORT A;Mn;230;NSM;;;;;N;;;;; -0826;SAMARITAN VOWEL SIGN LONG U;Mn;230;NSM;;;;;N;;;;; -0827;SAMARITAN VOWEL SIGN U;Mn;230;NSM;;;;;N;;;;; -0828;SAMARITAN MODIFIER LETTER I;Lm;0;R;;;;;N;;;;; -0829;SAMARITAN VOWEL SIGN LONG I;Mn;230;NSM;;;;;N;;;;; -082A;SAMARITAN VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; -082B;SAMARITAN VOWEL SIGN O;Mn;230;NSM;;;;;N;;;;; -082C;SAMARITAN VOWEL SIGN SUKUN;Mn;230;NSM;;;;;N;;;;; -082D;SAMARITAN MARK NEQUDAA;Mn;230;NSM;;;;;N;;;;; -0830;SAMARITAN PUNCTUATION NEQUDAA;Po;0;R;;;;;N;;;;; -0831;SAMARITAN PUNCTUATION AFSAAQ;Po;0;R;;;;;N;;;;; -0832;SAMARITAN PUNCTUATION ANGED;Po;0;R;;;;;N;;;;; -0833;SAMARITAN PUNCTUATION BAU;Po;0;R;;;;;N;;;;; -0834;SAMARITAN PUNCTUATION ATMAAU;Po;0;R;;;;;N;;;;; -0835;SAMARITAN PUNCTUATION SHIYYAALAA;Po;0;R;;;;;N;;;;; -0836;SAMARITAN ABBREVIATION MARK;Po;0;R;;;;;N;;;;; -0837;SAMARITAN PUNCTUATION MELODIC QITSA;Po;0;R;;;;;N;;;;; -0838;SAMARITAN PUNCTUATION ZIQAA;Po;0;R;;;;;N;;;;; -0839;SAMARITAN PUNCTUATION QITSA;Po;0;R;;;;;N;;;;; -083A;SAMARITAN PUNCTUATION ZAEF;Po;0;R;;;;;N;;;;; -083B;SAMARITAN PUNCTUATION TURU;Po;0;R;;;;;N;;;;; -083C;SAMARITAN PUNCTUATION ARKAANU;Po;0;R;;;;;N;;;;; -083D;SAMARITAN PUNCTUATION SOF MASHFAAT;Po;0;R;;;;;N;;;;; -083E;SAMARITAN PUNCTUATION ANNAAU;Po;0;R;;;;;N;;;;; -0840;MANDAIC LETTER HALQA;Lo;0;R;;;;;N;;;;; -0841;MANDAIC LETTER AB;Lo;0;R;;;;;N;;;;; -0842;MANDAIC LETTER AG;Lo;0;R;;;;;N;;;;; -0843;MANDAIC LETTER AD;Lo;0;R;;;;;N;;;;; -0844;MANDAIC LETTER AH;Lo;0;R;;;;;N;;;;; -0845;MANDAIC LETTER USHENNA;Lo;0;R;;;;;N;;;;; -0846;MANDAIC LETTER AZ;Lo;0;R;;;;;N;;;;; -0847;MANDAIC LETTER IT;Lo;0;R;;;;;N;;;;; -0848;MANDAIC LETTER ATT;Lo;0;R;;;;;N;;;;; -0849;MANDAIC LETTER AKSA;Lo;0;R;;;;;N;;;;; -084A;MANDAIC LETTER AK;Lo;0;R;;;;;N;;;;; -084B;MANDAIC LETTER AL;Lo;0;R;;;;;N;;;;; -084C;MANDAIC LETTER AM;Lo;0;R;;;;;N;;;;; -084D;MANDAIC LETTER AN;Lo;0;R;;;;;N;;;;; -084E;MANDAIC LETTER AS;Lo;0;R;;;;;N;;;;; -084F;MANDAIC LETTER IN;Lo;0;R;;;;;N;;;;; -0850;MANDAIC LETTER AP;Lo;0;R;;;;;N;;;;; -0851;MANDAIC LETTER ASZ;Lo;0;R;;;;;N;;;;; -0852;MANDAIC LETTER AQ;Lo;0;R;;;;;N;;;;; -0853;MANDAIC LETTER AR;Lo;0;R;;;;;N;;;;; -0854;MANDAIC LETTER ASH;Lo;0;R;;;;;N;;;;; -0855;MANDAIC LETTER AT;Lo;0;R;;;;;N;;;;; -0856;MANDAIC LETTER DUSHENNA;Lo;0;R;;;;;N;;;;; -0857;MANDAIC LETTER KAD;Lo;0;R;;;;;N;;;;; -0858;MANDAIC LETTER AIN;Lo;0;R;;;;;N;;;;; -0859;MANDAIC AFFRICATION MARK;Mn;220;NSM;;;;;N;;;;; -085A;MANDAIC VOCALIZATION MARK;Mn;220;NSM;;;;;N;;;;; -085B;MANDAIC GEMINATION MARK;Mn;220;NSM;;;;;N;;;;; -085E;MANDAIC PUNCTUATION;Po;0;R;;;;;N;;;;; -08A0;ARABIC LETTER BEH WITH SMALL V BELOW;Lo;0;AL;;;;;N;;;;; -08A1;ARABIC LETTER BEH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; -08A2;ARABIC LETTER JEEM WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A3;ARABIC LETTER TAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A4;ARABIC LETTER FEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A5;ARABIC LETTER QAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -08A6;ARABIC LETTER LAM WITH DOUBLE BAR;Lo;0;AL;;;;;N;;;;; -08A7;ARABIC LETTER MEEM WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;; -08A8;ARABIC LETTER YEH WITH TWO DOTS BELOW AND HAMZA ABOVE;Lo;0;AL;;;;;N;;;;; -08A9;ARABIC LETTER YEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;; -08AA;ARABIC LETTER REH WITH LOOP;Lo;0;AL;;;;;N;;;;; -08AB;ARABIC LETTER WAW WITH DOT WITHIN;Lo;0;AL;;;;;N;;;;; -08AC;ARABIC LETTER ROHINGYA YEH;Lo;0;AL;;;;;N;;;;; -08AD;ARABIC LETTER LOW ALEF;Lo;0;AL;;;;;N;;;;; -08AE;ARABIC LETTER DAL WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -08AF;ARABIC LETTER SAD WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -08B0;ARABIC LETTER GAF WITH INVERTED STROKE;Lo;0;AL;;;;;N;;;;; -08B1;ARABIC LETTER STRAIGHT WAW;Lo;0;AL;;;;;N;;;;; -08B2;ARABIC LETTER ZAIN WITH INVERTED V ABOVE;Lo;0;AL;;;;;N;;;;; -08B3;ARABIC LETTER AIN WITH THREE DOTS BELOW;Lo;0;AL;;;;;N;;;;; -08B4;ARABIC LETTER KAF WITH DOT BELOW;Lo;0;AL;;;;;N;;;;; -08E3;ARABIC TURNED DAMMA BELOW;Mn;220;NSM;;;;;N;;;;; -08E4;ARABIC CURLY FATHA;Mn;230;NSM;;;;;N;;;;; -08E5;ARABIC CURLY DAMMA;Mn;230;NSM;;;;;N;;;;; -08E6;ARABIC CURLY KASRA;Mn;220;NSM;;;;;N;;;;; -08E7;ARABIC CURLY FATHATAN;Mn;230;NSM;;;;;N;;;;; -08E8;ARABIC CURLY DAMMATAN;Mn;230;NSM;;;;;N;;;;; -08E9;ARABIC CURLY KASRATAN;Mn;220;NSM;;;;;N;;;;; -08EA;ARABIC TONE ONE DOT ABOVE;Mn;230;NSM;;;;;N;;;;; -08EB;ARABIC TONE TWO DOTS ABOVE;Mn;230;NSM;;;;;N;;;;; -08EC;ARABIC TONE LOOP ABOVE;Mn;230;NSM;;;;;N;;;;; -08ED;ARABIC TONE ONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; -08EE;ARABIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -08EF;ARABIC TONE LOOP BELOW;Mn;220;NSM;;;;;N;;;;; -08F0;ARABIC OPEN FATHATAN;Mn;27;NSM;;;;;N;;;;; -08F1;ARABIC OPEN DAMMATAN;Mn;28;NSM;;;;;N;;;;; -08F2;ARABIC OPEN KASRATAN;Mn;29;NSM;;;;;N;;;;; -08F3;ARABIC SMALL HIGH WAW;Mn;230;NSM;;;;;N;;;;; -08F4;ARABIC FATHA WITH RING;Mn;230;NSM;;;;;N;;;;; -08F5;ARABIC FATHA WITH DOT ABOVE;Mn;230;NSM;;;;;N;;;;; -08F6;ARABIC KASRA WITH DOT BELOW;Mn;220;NSM;;;;;N;;;;; -08F7;ARABIC LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -08F8;ARABIC RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -08F9;ARABIC LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -08FA;ARABIC RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -08FB;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -08FC;ARABIC DOUBLE RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; -08FD;ARABIC RIGHT ARROWHEAD ABOVE WITH DOT;Mn;230;NSM;;;;;N;;;;; -08FE;ARABIC DAMMA WITH DOT;Mn;230;NSM;;;;;N;;;;; -08FF;ARABIC MARK SIDEWAYS NOON GHUNNA;Mn;230;NSM;;;;;N;;;;; -0900;DEVANAGARI SIGN INVERTED CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0901;DEVANAGARI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0902;DEVANAGARI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0903;DEVANAGARI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0904;DEVANAGARI LETTER SHORT A;Lo;0;L;;;;;N;;;;; -0905;DEVANAGARI LETTER A;Lo;0;L;;;;;N;;;;; -0906;DEVANAGARI LETTER AA;Lo;0;L;;;;;N;;;;; -0907;DEVANAGARI LETTER I;Lo;0;L;;;;;N;;;;; -0908;DEVANAGARI LETTER II;Lo;0;L;;;;;N;;;;; -0909;DEVANAGARI LETTER U;Lo;0;L;;;;;N;;;;; -090A;DEVANAGARI LETTER UU;Lo;0;L;;;;;N;;;;; -090B;DEVANAGARI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -090C;DEVANAGARI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -090D;DEVANAGARI LETTER CANDRA E;Lo;0;L;;;;;N;;;;; -090E;DEVANAGARI LETTER SHORT E;Lo;0;L;;;;;N;;;;; -090F;DEVANAGARI LETTER E;Lo;0;L;;;;;N;;;;; -0910;DEVANAGARI LETTER AI;Lo;0;L;;;;;N;;;;; -0911;DEVANAGARI LETTER CANDRA O;Lo;0;L;;;;;N;;;;; -0912;DEVANAGARI LETTER SHORT O;Lo;0;L;;;;;N;;;;; -0913;DEVANAGARI LETTER O;Lo;0;L;;;;;N;;;;; -0914;DEVANAGARI LETTER AU;Lo;0;L;;;;;N;;;;; -0915;DEVANAGARI LETTER KA;Lo;0;L;;;;;N;;;;; -0916;DEVANAGARI LETTER KHA;Lo;0;L;;;;;N;;;;; -0917;DEVANAGARI LETTER GA;Lo;0;L;;;;;N;;;;; -0918;DEVANAGARI LETTER GHA;Lo;0;L;;;;;N;;;;; -0919;DEVANAGARI LETTER NGA;Lo;0;L;;;;;N;;;;; -091A;DEVANAGARI LETTER CA;Lo;0;L;;;;;N;;;;; -091B;DEVANAGARI LETTER CHA;Lo;0;L;;;;;N;;;;; -091C;DEVANAGARI LETTER JA;Lo;0;L;;;;;N;;;;; -091D;DEVANAGARI LETTER JHA;Lo;0;L;;;;;N;;;;; -091E;DEVANAGARI LETTER NYA;Lo;0;L;;;;;N;;;;; -091F;DEVANAGARI LETTER TTA;Lo;0;L;;;;;N;;;;; -0920;DEVANAGARI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0921;DEVANAGARI LETTER DDA;Lo;0;L;;;;;N;;;;; -0922;DEVANAGARI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0923;DEVANAGARI LETTER NNA;Lo;0;L;;;;;N;;;;; -0924;DEVANAGARI LETTER TA;Lo;0;L;;;;;N;;;;; -0925;DEVANAGARI LETTER THA;Lo;0;L;;;;;N;;;;; -0926;DEVANAGARI LETTER DA;Lo;0;L;;;;;N;;;;; -0927;DEVANAGARI LETTER DHA;Lo;0;L;;;;;N;;;;; -0928;DEVANAGARI LETTER NA;Lo;0;L;;;;;N;;;;; -0929;DEVANAGARI LETTER NNNA;Lo;0;L;0928 093C;;;;N;;;;; -092A;DEVANAGARI LETTER PA;Lo;0;L;;;;;N;;;;; -092B;DEVANAGARI LETTER PHA;Lo;0;L;;;;;N;;;;; -092C;DEVANAGARI LETTER BA;Lo;0;L;;;;;N;;;;; -092D;DEVANAGARI LETTER BHA;Lo;0;L;;;;;N;;;;; -092E;DEVANAGARI LETTER MA;Lo;0;L;;;;;N;;;;; -092F;DEVANAGARI LETTER YA;Lo;0;L;;;;;N;;;;; -0930;DEVANAGARI LETTER RA;Lo;0;L;;;;;N;;;;; -0931;DEVANAGARI LETTER RRA;Lo;0;L;0930 093C;;;;N;;;;; -0932;DEVANAGARI LETTER LA;Lo;0;L;;;;;N;;;;; -0933;DEVANAGARI LETTER LLA;Lo;0;L;;;;;N;;;;; -0934;DEVANAGARI LETTER LLLA;Lo;0;L;0933 093C;;;;N;;;;; -0935;DEVANAGARI LETTER VA;Lo;0;L;;;;;N;;;;; -0936;DEVANAGARI LETTER SHA;Lo;0;L;;;;;N;;;;; -0937;DEVANAGARI LETTER SSA;Lo;0;L;;;;;N;;;;; -0938;DEVANAGARI LETTER SA;Lo;0;L;;;;;N;;;;; -0939;DEVANAGARI LETTER HA;Lo;0;L;;;;;N;;;;; -093A;DEVANAGARI VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; -093B;DEVANAGARI VOWEL SIGN OOE;Mc;0;L;;;;;N;;;;; -093C;DEVANAGARI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -093D;DEVANAGARI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -093E;DEVANAGARI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -093F;DEVANAGARI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0940;DEVANAGARI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0941;DEVANAGARI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0942;DEVANAGARI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0943;DEVANAGARI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0944;DEVANAGARI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0945;DEVANAGARI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; -0946;DEVANAGARI VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; -0947;DEVANAGARI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0948;DEVANAGARI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0949;DEVANAGARI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; -094A;DEVANAGARI VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; -094B;DEVANAGARI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -094C;DEVANAGARI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -094D;DEVANAGARI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -094E;DEVANAGARI VOWEL SIGN PRISHTHAMATRA E;Mc;0;L;;;;;N;;;;; -094F;DEVANAGARI VOWEL SIGN AW;Mc;0;L;;;;;N;;;;; -0950;DEVANAGARI OM;Lo;0;L;;;;;N;;;;; -0951;DEVANAGARI STRESS SIGN UDATTA;Mn;230;NSM;;;;;N;;;;; -0952;DEVANAGARI STRESS SIGN ANUDATTA;Mn;220;NSM;;;;;N;;;;; -0953;DEVANAGARI GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; -0954;DEVANAGARI ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; -0955;DEVANAGARI VOWEL SIGN CANDRA LONG E;Mn;0;NSM;;;;;N;;;;; -0956;DEVANAGARI VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; -0957;DEVANAGARI VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; -0958;DEVANAGARI LETTER QA;Lo;0;L;0915 093C;;;;N;;;;; -0959;DEVANAGARI LETTER KHHA;Lo;0;L;0916 093C;;;;N;;;;; -095A;DEVANAGARI LETTER GHHA;Lo;0;L;0917 093C;;;;N;;;;; -095B;DEVANAGARI LETTER ZA;Lo;0;L;091C 093C;;;;N;;;;; -095C;DEVANAGARI LETTER DDDHA;Lo;0;L;0921 093C;;;;N;;;;; -095D;DEVANAGARI LETTER RHA;Lo;0;L;0922 093C;;;;N;;;;; -095E;DEVANAGARI LETTER FA;Lo;0;L;092B 093C;;;;N;;;;; -095F;DEVANAGARI LETTER YYA;Lo;0;L;092F 093C;;;;N;;;;; -0960;DEVANAGARI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0961;DEVANAGARI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0962;DEVANAGARI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0963;DEVANAGARI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0964;DEVANAGARI DANDA;Po;0;L;;;;;N;;;;; -0965;DEVANAGARI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -0966;DEVANAGARI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0967;DEVANAGARI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0968;DEVANAGARI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0969;DEVANAGARI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -096A;DEVANAGARI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -096B;DEVANAGARI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -096C;DEVANAGARI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -096D;DEVANAGARI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -096E;DEVANAGARI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -096F;DEVANAGARI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0970;DEVANAGARI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -0971;DEVANAGARI SIGN HIGH SPACING DOT;Lm;0;L;;;;;N;;;;; -0972;DEVANAGARI LETTER CANDRA A;Lo;0;L;;;;;N;;;;; -0973;DEVANAGARI LETTER OE;Lo;0;L;;;;;N;;;;; -0974;DEVANAGARI LETTER OOE;Lo;0;L;;;;;N;;;;; -0975;DEVANAGARI LETTER AW;Lo;0;L;;;;;N;;;;; -0976;DEVANAGARI LETTER UE;Lo;0;L;;;;;N;;;;; -0977;DEVANAGARI LETTER UUE;Lo;0;L;;;;;N;;;;; -0978;DEVANAGARI LETTER MARWARI DDA;Lo;0;L;;;;;N;;;;; -0979;DEVANAGARI LETTER ZHA;Lo;0;L;;;;;N;;;;; -097A;DEVANAGARI LETTER HEAVY YA;Lo;0;L;;;;;N;;;;; -097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;; -097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;; -097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;; -097F;DEVANAGARI LETTER BBA;Lo;0;L;;;;;N;;;;; -0980;BENGALI ANJI;Lo;0;L;;;;;N;;;;; -0981;BENGALI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0982;BENGALI SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0983;BENGALI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0985;BENGALI LETTER A;Lo;0;L;;;;;N;;;;; -0986;BENGALI LETTER AA;Lo;0;L;;;;;N;;;;; -0987;BENGALI LETTER I;Lo;0;L;;;;;N;;;;; -0988;BENGALI LETTER II;Lo;0;L;;;;;N;;;;; -0989;BENGALI LETTER U;Lo;0;L;;;;;N;;;;; -098A;BENGALI LETTER UU;Lo;0;L;;;;;N;;;;; -098B;BENGALI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -098C;BENGALI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -098F;BENGALI LETTER E;Lo;0;L;;;;;N;;;;; -0990;BENGALI LETTER AI;Lo;0;L;;;;;N;;;;; -0993;BENGALI LETTER O;Lo;0;L;;;;;N;;;;; -0994;BENGALI LETTER AU;Lo;0;L;;;;;N;;;;; -0995;BENGALI LETTER KA;Lo;0;L;;;;;N;;;;; -0996;BENGALI LETTER KHA;Lo;0;L;;;;;N;;;;; -0997;BENGALI LETTER GA;Lo;0;L;;;;;N;;;;; -0998;BENGALI LETTER GHA;Lo;0;L;;;;;N;;;;; -0999;BENGALI LETTER NGA;Lo;0;L;;;;;N;;;;; -099A;BENGALI LETTER CA;Lo;0;L;;;;;N;;;;; -099B;BENGALI LETTER CHA;Lo;0;L;;;;;N;;;;; -099C;BENGALI LETTER JA;Lo;0;L;;;;;N;;;;; -099D;BENGALI LETTER JHA;Lo;0;L;;;;;N;;;;; -099E;BENGALI LETTER NYA;Lo;0;L;;;;;N;;;;; -099F;BENGALI LETTER TTA;Lo;0;L;;;;;N;;;;; -09A0;BENGALI LETTER TTHA;Lo;0;L;;;;;N;;;;; -09A1;BENGALI LETTER DDA;Lo;0;L;;;;;N;;;;; -09A2;BENGALI LETTER DDHA;Lo;0;L;;;;;N;;;;; -09A3;BENGALI LETTER NNA;Lo;0;L;;;;;N;;;;; -09A4;BENGALI LETTER TA;Lo;0;L;;;;;N;;;;; -09A5;BENGALI LETTER THA;Lo;0;L;;;;;N;;;;; -09A6;BENGALI LETTER DA;Lo;0;L;;;;;N;;;;; -09A7;BENGALI LETTER DHA;Lo;0;L;;;;;N;;;;; -09A8;BENGALI LETTER NA;Lo;0;L;;;;;N;;;;; -09AA;BENGALI LETTER PA;Lo;0;L;;;;;N;;;;; -09AB;BENGALI LETTER PHA;Lo;0;L;;;;;N;;;;; -09AC;BENGALI LETTER BA;Lo;0;L;;;;;N;;;;; -09AD;BENGALI LETTER BHA;Lo;0;L;;;;;N;;;;; -09AE;BENGALI LETTER MA;Lo;0;L;;;;;N;;;;; -09AF;BENGALI LETTER YA;Lo;0;L;;;;;N;;;;; -09B0;BENGALI LETTER RA;Lo;0;L;;;;;N;;;;; -09B2;BENGALI LETTER LA;Lo;0;L;;;;;N;;;;; -09B6;BENGALI LETTER SHA;Lo;0;L;;;;;N;;;;; -09B7;BENGALI LETTER SSA;Lo;0;L;;;;;N;;;;; -09B8;BENGALI LETTER SA;Lo;0;L;;;;;N;;;;; -09B9;BENGALI LETTER HA;Lo;0;L;;;;;N;;;;; -09BC;BENGALI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -09BE;BENGALI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -09BF;BENGALI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -09C0;BENGALI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -09C1;BENGALI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -09C2;BENGALI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -09C3;BENGALI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -09C4;BENGALI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -09C7;BENGALI VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -09C8;BENGALI VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -09CB;BENGALI VOWEL SIGN O;Mc;0;L;09C7 09BE;;;;N;;;;; -09CC;BENGALI VOWEL SIGN AU;Mc;0;L;09C7 09D7;;;;N;;;;; -09CD;BENGALI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;N;;;;; -09D7;BENGALI AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -09DC;BENGALI LETTER RRA;Lo;0;L;09A1 09BC;;;;N;;;;; -09DD;BENGALI LETTER RHA;Lo;0;L;09A2 09BC;;;;N;;;;; -09DF;BENGALI LETTER YYA;Lo;0;L;09AF 09BC;;;;N;;;;; -09E0;BENGALI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -09E1;BENGALI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -09E2;BENGALI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -09E3;BENGALI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -09E6;BENGALI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -09E7;BENGALI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -09E8;BENGALI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -09E9;BENGALI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -09EA;BENGALI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -09EB;BENGALI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -09EC;BENGALI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -09ED;BENGALI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -09EE;BENGALI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -09EF;BENGALI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -09F0;BENGALI LETTER RA WITH MIDDLE DIAGONAL;Lo;0;L;;;;;N;;;;; -09F1;BENGALI LETTER RA WITH LOWER DIAGONAL;Lo;0;L;;;;;N;BENGALI LETTER VA WITH LOWER DIAGONAL;;;; -09F2;BENGALI RUPEE MARK;Sc;0;ET;;;;;N;;;;; -09F3;BENGALI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -09F4;BENGALI CURRENCY NUMERATOR ONE;No;0;L;;;;1/16;N;;;;; -09F5;BENGALI CURRENCY NUMERATOR TWO;No;0;L;;;;1/8;N;;;;; -09F6;BENGALI CURRENCY NUMERATOR THREE;No;0;L;;;;3/16;N;;;;; -09F7;BENGALI CURRENCY NUMERATOR FOUR;No;0;L;;;;1/4;N;;;;; -09F8;BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR;No;0;L;;;;3/4;N;;;;; -09F9;BENGALI CURRENCY DENOMINATOR SIXTEEN;No;0;L;;;;16;N;;;;; -09FA;BENGALI ISSHAR;So;0;L;;;;;N;;;;; -09FB;BENGALI GANDA MARK;Sc;0;ET;;;;;N;;;;; -0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;; -0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;; -0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0A05;GURMUKHI LETTER A;Lo;0;L;;;;;N;;;;; -0A06;GURMUKHI LETTER AA;Lo;0;L;;;;;N;;;;; -0A07;GURMUKHI LETTER I;Lo;0;L;;;;;N;;;;; -0A08;GURMUKHI LETTER II;Lo;0;L;;;;;N;;;;; -0A09;GURMUKHI LETTER U;Lo;0;L;;;;;N;;;;; -0A0A;GURMUKHI LETTER UU;Lo;0;L;;;;;N;;;;; -0A0F;GURMUKHI LETTER EE;Lo;0;L;;;;;N;;;;; -0A10;GURMUKHI LETTER AI;Lo;0;L;;;;;N;;;;; -0A13;GURMUKHI LETTER OO;Lo;0;L;;;;;N;;;;; -0A14;GURMUKHI LETTER AU;Lo;0;L;;;;;N;;;;; -0A15;GURMUKHI LETTER KA;Lo;0;L;;;;;N;;;;; -0A16;GURMUKHI LETTER KHA;Lo;0;L;;;;;N;;;;; -0A17;GURMUKHI LETTER GA;Lo;0;L;;;;;N;;;;; -0A18;GURMUKHI LETTER GHA;Lo;0;L;;;;;N;;;;; -0A19;GURMUKHI LETTER NGA;Lo;0;L;;;;;N;;;;; -0A1A;GURMUKHI LETTER CA;Lo;0;L;;;;;N;;;;; -0A1B;GURMUKHI LETTER CHA;Lo;0;L;;;;;N;;;;; -0A1C;GURMUKHI LETTER JA;Lo;0;L;;;;;N;;;;; -0A1D;GURMUKHI LETTER JHA;Lo;0;L;;;;;N;;;;; -0A1E;GURMUKHI LETTER NYA;Lo;0;L;;;;;N;;;;; -0A1F;GURMUKHI LETTER TTA;Lo;0;L;;;;;N;;;;; -0A20;GURMUKHI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0A21;GURMUKHI LETTER DDA;Lo;0;L;;;;;N;;;;; -0A22;GURMUKHI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0A23;GURMUKHI LETTER NNA;Lo;0;L;;;;;N;;;;; -0A24;GURMUKHI LETTER TA;Lo;0;L;;;;;N;;;;; -0A25;GURMUKHI LETTER THA;Lo;0;L;;;;;N;;;;; -0A26;GURMUKHI LETTER DA;Lo;0;L;;;;;N;;;;; -0A27;GURMUKHI LETTER DHA;Lo;0;L;;;;;N;;;;; -0A28;GURMUKHI LETTER NA;Lo;0;L;;;;;N;;;;; -0A2A;GURMUKHI LETTER PA;Lo;0;L;;;;;N;;;;; -0A2B;GURMUKHI LETTER PHA;Lo;0;L;;;;;N;;;;; -0A2C;GURMUKHI LETTER BA;Lo;0;L;;;;;N;;;;; -0A2D;GURMUKHI LETTER BHA;Lo;0;L;;;;;N;;;;; -0A2E;GURMUKHI LETTER MA;Lo;0;L;;;;;N;;;;; -0A2F;GURMUKHI LETTER YA;Lo;0;L;;;;;N;;;;; -0A30;GURMUKHI LETTER RA;Lo;0;L;;;;;N;;;;; -0A32;GURMUKHI LETTER LA;Lo;0;L;;;;;N;;;;; -0A33;GURMUKHI LETTER LLA;Lo;0;L;0A32 0A3C;;;;N;;;;; -0A35;GURMUKHI LETTER VA;Lo;0;L;;;;;N;;;;; -0A36;GURMUKHI LETTER SHA;Lo;0;L;0A38 0A3C;;;;N;;;;; -0A38;GURMUKHI LETTER SA;Lo;0;L;;;;;N;;;;; -0A39;GURMUKHI LETTER HA;Lo;0;L;;;;;N;;;;; -0A3C;GURMUKHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0A3E;GURMUKHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0A3F;GURMUKHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0A40;GURMUKHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0A41;GURMUKHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0A42;GURMUKHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0A47;GURMUKHI VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -0A48;GURMUKHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0A4B;GURMUKHI VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; -0A4C;GURMUKHI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0A4D;GURMUKHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0A51;GURMUKHI SIGN UDAAT;Mn;0;NSM;;;;;N;;;;; -0A59;GURMUKHI LETTER KHHA;Lo;0;L;0A16 0A3C;;;;N;;;;; -0A5A;GURMUKHI LETTER GHHA;Lo;0;L;0A17 0A3C;;;;N;;;;; -0A5B;GURMUKHI LETTER ZA;Lo;0;L;0A1C 0A3C;;;;N;;;;; -0A5C;GURMUKHI LETTER RRA;Lo;0;L;;;;;N;;;;; -0A5E;GURMUKHI LETTER FA;Lo;0;L;0A2B 0A3C;;;;N;;;;; -0A66;GURMUKHI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0A67;GURMUKHI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0A68;GURMUKHI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0A69;GURMUKHI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0A6A;GURMUKHI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0A6B;GURMUKHI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0A6C;GURMUKHI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0A6D;GURMUKHI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0A6E;GURMUKHI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0A6F;GURMUKHI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0A70;GURMUKHI TIPPI;Mn;0;NSM;;;;;N;;;;; -0A71;GURMUKHI ADDAK;Mn;0;NSM;;;;;N;;;;; -0A72;GURMUKHI IRI;Lo;0;L;;;;;N;;;;; -0A73;GURMUKHI URA;Lo;0;L;;;;;N;;;;; -0A74;GURMUKHI EK ONKAR;Lo;0;L;;;;;N;;;;; -0A75;GURMUKHI SIGN YAKASH;Mn;0;NSM;;;;;N;;;;; -0A81;GUJARATI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0A82;GUJARATI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0A83;GUJARATI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0A85;GUJARATI LETTER A;Lo;0;L;;;;;N;;;;; -0A86;GUJARATI LETTER AA;Lo;0;L;;;;;N;;;;; -0A87;GUJARATI LETTER I;Lo;0;L;;;;;N;;;;; -0A88;GUJARATI LETTER II;Lo;0;L;;;;;N;;;;; -0A89;GUJARATI LETTER U;Lo;0;L;;;;;N;;;;; -0A8A;GUJARATI LETTER UU;Lo;0;L;;;;;N;;;;; -0A8B;GUJARATI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0A8C;GUJARATI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0A8D;GUJARATI VOWEL CANDRA E;Lo;0;L;;;;;N;;;;; -0A8F;GUJARATI LETTER E;Lo;0;L;;;;;N;;;;; -0A90;GUJARATI LETTER AI;Lo;0;L;;;;;N;;;;; -0A91;GUJARATI VOWEL CANDRA O;Lo;0;L;;;;;N;;;;; -0A93;GUJARATI LETTER O;Lo;0;L;;;;;N;;;;; -0A94;GUJARATI LETTER AU;Lo;0;L;;;;;N;;;;; -0A95;GUJARATI LETTER KA;Lo;0;L;;;;;N;;;;; -0A96;GUJARATI LETTER KHA;Lo;0;L;;;;;N;;;;; -0A97;GUJARATI LETTER GA;Lo;0;L;;;;;N;;;;; -0A98;GUJARATI LETTER GHA;Lo;0;L;;;;;N;;;;; -0A99;GUJARATI LETTER NGA;Lo;0;L;;;;;N;;;;; -0A9A;GUJARATI LETTER CA;Lo;0;L;;;;;N;;;;; -0A9B;GUJARATI LETTER CHA;Lo;0;L;;;;;N;;;;; -0A9C;GUJARATI LETTER JA;Lo;0;L;;;;;N;;;;; -0A9D;GUJARATI LETTER JHA;Lo;0;L;;;;;N;;;;; -0A9E;GUJARATI LETTER NYA;Lo;0;L;;;;;N;;;;; -0A9F;GUJARATI LETTER TTA;Lo;0;L;;;;;N;;;;; -0AA0;GUJARATI LETTER TTHA;Lo;0;L;;;;;N;;;;; -0AA1;GUJARATI LETTER DDA;Lo;0;L;;;;;N;;;;; -0AA2;GUJARATI LETTER DDHA;Lo;0;L;;;;;N;;;;; -0AA3;GUJARATI LETTER NNA;Lo;0;L;;;;;N;;;;; -0AA4;GUJARATI LETTER TA;Lo;0;L;;;;;N;;;;; -0AA5;GUJARATI LETTER THA;Lo;0;L;;;;;N;;;;; -0AA6;GUJARATI LETTER DA;Lo;0;L;;;;;N;;;;; -0AA7;GUJARATI LETTER DHA;Lo;0;L;;;;;N;;;;; -0AA8;GUJARATI LETTER NA;Lo;0;L;;;;;N;;;;; -0AAA;GUJARATI LETTER PA;Lo;0;L;;;;;N;;;;; -0AAB;GUJARATI LETTER PHA;Lo;0;L;;;;;N;;;;; -0AAC;GUJARATI LETTER BA;Lo;0;L;;;;;N;;;;; -0AAD;GUJARATI LETTER BHA;Lo;0;L;;;;;N;;;;; -0AAE;GUJARATI LETTER MA;Lo;0;L;;;;;N;;;;; -0AAF;GUJARATI LETTER YA;Lo;0;L;;;;;N;;;;; -0AB0;GUJARATI LETTER RA;Lo;0;L;;;;;N;;;;; -0AB2;GUJARATI LETTER LA;Lo;0;L;;;;;N;;;;; -0AB3;GUJARATI LETTER LLA;Lo;0;L;;;;;N;;;;; -0AB5;GUJARATI LETTER VA;Lo;0;L;;;;;N;;;;; -0AB6;GUJARATI LETTER SHA;Lo;0;L;;;;;N;;;;; -0AB7;GUJARATI LETTER SSA;Lo;0;L;;;;;N;;;;; -0AB8;GUJARATI LETTER SA;Lo;0;L;;;;;N;;;;; -0AB9;GUJARATI LETTER HA;Lo;0;L;;;;;N;;;;; -0ABC;GUJARATI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0ABD;GUJARATI SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0ABE;GUJARATI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0ABF;GUJARATI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0AC0;GUJARATI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0AC1;GUJARATI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0AC2;GUJARATI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0AC3;GUJARATI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0AC4;GUJARATI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0AC5;GUJARATI VOWEL SIGN CANDRA E;Mn;0;NSM;;;;;N;;;;; -0AC7;GUJARATI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0AC8;GUJARATI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -0AC9;GUJARATI VOWEL SIGN CANDRA O;Mc;0;L;;;;;N;;;;; -0ACB;GUJARATI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -0ACC;GUJARATI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -0ACD;GUJARATI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0AD0;GUJARATI OM;Lo;0;L;;;;;N;;;;; -0AE0;GUJARATI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0AE6;GUJARATI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0AE7;GUJARATI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0AE8;GUJARATI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0AE9;GUJARATI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0AEA;GUJARATI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0AEB;GUJARATI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0AEC;GUJARATI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0AED;GUJARATI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0AEE;GUJARATI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0AEF;GUJARATI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0AF0;GUJARATI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -0AF9;GUJARATI LETTER ZHA;Lo;0;L;;;;;N;;;;; -0B01;ORIYA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0B02;ORIYA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0B03;ORIYA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0B05;ORIYA LETTER A;Lo;0;L;;;;;N;;;;; -0B06;ORIYA LETTER AA;Lo;0;L;;;;;N;;;;; -0B07;ORIYA LETTER I;Lo;0;L;;;;;N;;;;; -0B08;ORIYA LETTER II;Lo;0;L;;;;;N;;;;; -0B09;ORIYA LETTER U;Lo;0;L;;;;;N;;;;; -0B0A;ORIYA LETTER UU;Lo;0;L;;;;;N;;;;; -0B0B;ORIYA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0B0C;ORIYA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0B0F;ORIYA LETTER E;Lo;0;L;;;;;N;;;;; -0B10;ORIYA LETTER AI;Lo;0;L;;;;;N;;;;; -0B13;ORIYA LETTER O;Lo;0;L;;;;;N;;;;; -0B14;ORIYA LETTER AU;Lo;0;L;;;;;N;;;;; -0B15;ORIYA LETTER KA;Lo;0;L;;;;;N;;;;; -0B16;ORIYA LETTER KHA;Lo;0;L;;;;;N;;;;; -0B17;ORIYA LETTER GA;Lo;0;L;;;;;N;;;;; -0B18;ORIYA LETTER GHA;Lo;0;L;;;;;N;;;;; -0B19;ORIYA LETTER NGA;Lo;0;L;;;;;N;;;;; -0B1A;ORIYA LETTER CA;Lo;0;L;;;;;N;;;;; -0B1B;ORIYA LETTER CHA;Lo;0;L;;;;;N;;;;; -0B1C;ORIYA LETTER JA;Lo;0;L;;;;;N;;;;; -0B1D;ORIYA LETTER JHA;Lo;0;L;;;;;N;;;;; -0B1E;ORIYA LETTER NYA;Lo;0;L;;;;;N;;;;; -0B1F;ORIYA LETTER TTA;Lo;0;L;;;;;N;;;;; -0B20;ORIYA LETTER TTHA;Lo;0;L;;;;;N;;;;; -0B21;ORIYA LETTER DDA;Lo;0;L;;;;;N;;;;; -0B22;ORIYA LETTER DDHA;Lo;0;L;;;;;N;;;;; -0B23;ORIYA LETTER NNA;Lo;0;L;;;;;N;;;;; -0B24;ORIYA LETTER TA;Lo;0;L;;;;;N;;;;; -0B25;ORIYA LETTER THA;Lo;0;L;;;;;N;;;;; -0B26;ORIYA LETTER DA;Lo;0;L;;;;;N;;;;; -0B27;ORIYA LETTER DHA;Lo;0;L;;;;;N;;;;; -0B28;ORIYA LETTER NA;Lo;0;L;;;;;N;;;;; -0B2A;ORIYA LETTER PA;Lo;0;L;;;;;N;;;;; -0B2B;ORIYA LETTER PHA;Lo;0;L;;;;;N;;;;; -0B2C;ORIYA LETTER BA;Lo;0;L;;;;;N;;;;; -0B2D;ORIYA LETTER BHA;Lo;0;L;;;;;N;;;;; -0B2E;ORIYA LETTER MA;Lo;0;L;;;;;N;;;;; -0B2F;ORIYA LETTER YA;Lo;0;L;;;;;N;;;;; -0B30;ORIYA LETTER RA;Lo;0;L;;;;;N;;;;; -0B32;ORIYA LETTER LA;Lo;0;L;;;;;N;;;;; -0B33;ORIYA LETTER LLA;Lo;0;L;;;;;N;;;;; -0B35;ORIYA LETTER VA;Lo;0;L;;;;;N;;;;; -0B36;ORIYA LETTER SHA;Lo;0;L;;;;;N;;;;; -0B37;ORIYA LETTER SSA;Lo;0;L;;;;;N;;;;; -0B38;ORIYA LETTER SA;Lo;0;L;;;;;N;;;;; -0B39;ORIYA LETTER HA;Lo;0;L;;;;;N;;;;; -0B3C;ORIYA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0B3D;ORIYA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0B3E;ORIYA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0B3F;ORIYA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0B40;ORIYA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0B41;ORIYA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0B42;ORIYA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0B43;ORIYA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0B44;ORIYA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0B47;ORIYA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0B48;ORIYA VOWEL SIGN AI;Mc;0;L;0B47 0B56;;;;N;;;;; -0B4B;ORIYA VOWEL SIGN O;Mc;0;L;0B47 0B3E;;;;N;;;;; -0B4C;ORIYA VOWEL SIGN AU;Mc;0;L;0B47 0B57;;;;N;;;;; -0B4D;ORIYA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0B56;ORIYA AI LENGTH MARK;Mn;0;NSM;;;;;N;;;;; -0B57;ORIYA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0B5C;ORIYA LETTER RRA;Lo;0;L;0B21 0B3C;;;;N;;;;; -0B5D;ORIYA LETTER RHA;Lo;0;L;0B22 0B3C;;;;N;;;;; -0B5F;ORIYA LETTER YYA;Lo;0;L;;;;;N;;;;; -0B60;ORIYA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0B61;ORIYA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0B62;ORIYA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0B63;ORIYA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0B66;ORIYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0B67;ORIYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0B68;ORIYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0B69;ORIYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0B6A;ORIYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0B6B;ORIYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0B6C;ORIYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0B6D;ORIYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0B6E;ORIYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0B6F;ORIYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0B70;ORIYA ISSHAR;So;0;L;;;;;N;;;;; -0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;; -0B72;ORIYA FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; -0B73;ORIYA FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; -0B74;ORIYA FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; -0B75;ORIYA FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; -0B76;ORIYA FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; -0B77;ORIYA FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; -0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -0B83;TAMIL SIGN VISARGA;Lo;0;L;;;;;N;;;;; -0B85;TAMIL LETTER A;Lo;0;L;;;;;N;;;;; -0B86;TAMIL LETTER AA;Lo;0;L;;;;;N;;;;; -0B87;TAMIL LETTER I;Lo;0;L;;;;;N;;;;; -0B88;TAMIL LETTER II;Lo;0;L;;;;;N;;;;; -0B89;TAMIL LETTER U;Lo;0;L;;;;;N;;;;; -0B8A;TAMIL LETTER UU;Lo;0;L;;;;;N;;;;; -0B8E;TAMIL LETTER E;Lo;0;L;;;;;N;;;;; -0B8F;TAMIL LETTER EE;Lo;0;L;;;;;N;;;;; -0B90;TAMIL LETTER AI;Lo;0;L;;;;;N;;;;; -0B92;TAMIL LETTER O;Lo;0;L;;;;;N;;;;; -0B93;TAMIL LETTER OO;Lo;0;L;;;;;N;;;;; -0B94;TAMIL LETTER AU;Lo;0;L;0B92 0BD7;;;;N;;;;; -0B95;TAMIL LETTER KA;Lo;0;L;;;;;N;;;;; -0B99;TAMIL LETTER NGA;Lo;0;L;;;;;N;;;;; -0B9A;TAMIL LETTER CA;Lo;0;L;;;;;N;;;;; -0B9C;TAMIL LETTER JA;Lo;0;L;;;;;N;;;;; -0B9E;TAMIL LETTER NYA;Lo;0;L;;;;;N;;;;; -0B9F;TAMIL LETTER TTA;Lo;0;L;;;;;N;;;;; -0BA3;TAMIL LETTER NNA;Lo;0;L;;;;;N;;;;; -0BA4;TAMIL LETTER TA;Lo;0;L;;;;;N;;;;; -0BA8;TAMIL LETTER NA;Lo;0;L;;;;;N;;;;; -0BA9;TAMIL LETTER NNNA;Lo;0;L;;;;;N;;;;; -0BAA;TAMIL LETTER PA;Lo;0;L;;;;;N;;;;; -0BAE;TAMIL LETTER MA;Lo;0;L;;;;;N;;;;; -0BAF;TAMIL LETTER YA;Lo;0;L;;;;;N;;;;; -0BB0;TAMIL LETTER RA;Lo;0;L;;;;;N;;;;; -0BB1;TAMIL LETTER RRA;Lo;0;L;;;;;N;;;;; -0BB2;TAMIL LETTER LA;Lo;0;L;;;;;N;;;;; -0BB3;TAMIL LETTER LLA;Lo;0;L;;;;;N;;;;; -0BB4;TAMIL LETTER LLLA;Lo;0;L;;;;;N;;;;; -0BB5;TAMIL LETTER VA;Lo;0;L;;;;;N;;;;; -0BB6;TAMIL LETTER SHA;Lo;0;L;;;;;N;;;;; -0BB7;TAMIL LETTER SSA;Lo;0;L;;;;;N;;;;; -0BB8;TAMIL LETTER SA;Lo;0;L;;;;;N;;;;; -0BB9;TAMIL LETTER HA;Lo;0;L;;;;;N;;;;; -0BBE;TAMIL VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0BBF;TAMIL VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0BC0;TAMIL VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0BC1;TAMIL VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0BC2;TAMIL VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0BC6;TAMIL VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0BC7;TAMIL VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -0BC8;TAMIL VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -0BCA;TAMIL VOWEL SIGN O;Mc;0;L;0BC6 0BBE;;;;N;;;;; -0BCB;TAMIL VOWEL SIGN OO;Mc;0;L;0BC7 0BBE;;;;N;;;;; -0BCC;TAMIL VOWEL SIGN AU;Mc;0;L;0BC6 0BD7;;;;N;;;;; -0BCD;TAMIL SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0BD0;TAMIL OM;Lo;0;L;;;;;N;;;;; -0BD7;TAMIL AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0BE7;TAMIL DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0BE8;TAMIL DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0BE9;TAMIL DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0BEA;TAMIL DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0BEB;TAMIL DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0BEC;TAMIL DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0BED;TAMIL DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0BEE;TAMIL DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0BEF;TAMIL DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0BF0;TAMIL NUMBER TEN;No;0;L;;;;10;N;;;;; -0BF1;TAMIL NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -0BF2;TAMIL NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;;;; -0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;;;; -0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;;;; -0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;;;; -0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;;;; -0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;;;; -0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;;;; -0C00;TELUGU SIGN COMBINING CANDRABINDU ABOVE;Mn;0;NSM;;;;;N;;;;; -0C01;TELUGU SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; -0C02;TELUGU SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0C03;TELUGU SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0C05;TELUGU LETTER A;Lo;0;L;;;;;N;;;;; -0C06;TELUGU LETTER AA;Lo;0;L;;;;;N;;;;; -0C07;TELUGU LETTER I;Lo;0;L;;;;;N;;;;; -0C08;TELUGU LETTER II;Lo;0;L;;;;;N;;;;; -0C09;TELUGU LETTER U;Lo;0;L;;;;;N;;;;; -0C0A;TELUGU LETTER UU;Lo;0;L;;;;;N;;;;; -0C0B;TELUGU LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0C0C;TELUGU LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0C0E;TELUGU LETTER E;Lo;0;L;;;;;N;;;;; -0C0F;TELUGU LETTER EE;Lo;0;L;;;;;N;;;;; -0C10;TELUGU LETTER AI;Lo;0;L;;;;;N;;;;; -0C12;TELUGU LETTER O;Lo;0;L;;;;;N;;;;; -0C13;TELUGU LETTER OO;Lo;0;L;;;;;N;;;;; -0C14;TELUGU LETTER AU;Lo;0;L;;;;;N;;;;; -0C15;TELUGU LETTER KA;Lo;0;L;;;;;N;;;;; -0C16;TELUGU LETTER KHA;Lo;0;L;;;;;N;;;;; -0C17;TELUGU LETTER GA;Lo;0;L;;;;;N;;;;; -0C18;TELUGU LETTER GHA;Lo;0;L;;;;;N;;;;; -0C19;TELUGU LETTER NGA;Lo;0;L;;;;;N;;;;; -0C1A;TELUGU LETTER CA;Lo;0;L;;;;;N;;;;; -0C1B;TELUGU LETTER CHA;Lo;0;L;;;;;N;;;;; -0C1C;TELUGU LETTER JA;Lo;0;L;;;;;N;;;;; -0C1D;TELUGU LETTER JHA;Lo;0;L;;;;;N;;;;; -0C1E;TELUGU LETTER NYA;Lo;0;L;;;;;N;;;;; -0C1F;TELUGU LETTER TTA;Lo;0;L;;;;;N;;;;; -0C20;TELUGU LETTER TTHA;Lo;0;L;;;;;N;;;;; -0C21;TELUGU LETTER DDA;Lo;0;L;;;;;N;;;;; -0C22;TELUGU LETTER DDHA;Lo;0;L;;;;;N;;;;; -0C23;TELUGU LETTER NNA;Lo;0;L;;;;;N;;;;; -0C24;TELUGU LETTER TA;Lo;0;L;;;;;N;;;;; -0C25;TELUGU LETTER THA;Lo;0;L;;;;;N;;;;; -0C26;TELUGU LETTER DA;Lo;0;L;;;;;N;;;;; -0C27;TELUGU LETTER DHA;Lo;0;L;;;;;N;;;;; -0C28;TELUGU LETTER NA;Lo;0;L;;;;;N;;;;; -0C2A;TELUGU LETTER PA;Lo;0;L;;;;;N;;;;; -0C2B;TELUGU LETTER PHA;Lo;0;L;;;;;N;;;;; -0C2C;TELUGU LETTER BA;Lo;0;L;;;;;N;;;;; -0C2D;TELUGU LETTER BHA;Lo;0;L;;;;;N;;;;; -0C2E;TELUGU LETTER MA;Lo;0;L;;;;;N;;;;; -0C2F;TELUGU LETTER YA;Lo;0;L;;;;;N;;;;; -0C30;TELUGU LETTER RA;Lo;0;L;;;;;N;;;;; -0C31;TELUGU LETTER RRA;Lo;0;L;;;;;N;;;;; -0C32;TELUGU LETTER LA;Lo;0;L;;;;;N;;;;; -0C33;TELUGU LETTER LLA;Lo;0;L;;;;;N;;;;; -0C34;TELUGU LETTER LLLA;Lo;0;L;;;;;N;;;;; -0C35;TELUGU LETTER VA;Lo;0;L;;;;;N;;;;; -0C36;TELUGU LETTER SHA;Lo;0;L;;;;;N;;;;; -0C37;TELUGU LETTER SSA;Lo;0;L;;;;;N;;;;; -0C38;TELUGU LETTER SA;Lo;0;L;;;;;N;;;;; -0C39;TELUGU LETTER HA;Lo;0;L;;;;;N;;;;; -0C3D;TELUGU SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0C3E;TELUGU VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -0C3F;TELUGU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0C40;TELUGU VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0C41;TELUGU VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0C42;TELUGU VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0C43;TELUGU VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -0C44;TELUGU VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -0C46;TELUGU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -0C47;TELUGU VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -0C48;TELUGU VOWEL SIGN AI;Mn;0;NSM;0C46 0C56;;;;N;;;;; -0C4A;TELUGU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -0C4B;TELUGU VOWEL SIGN OO;Mn;0;NSM;;;;;N;;;;; -0C4C;TELUGU VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0C4D;TELUGU SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0C55;TELUGU LENGTH MARK;Mn;84;NSM;;;;;N;;;;; -0C56;TELUGU AI LENGTH MARK;Mn;91;NSM;;;;;N;;;;; -0C58;TELUGU LETTER TSA;Lo;0;L;;;;;N;;;;; -0C59;TELUGU LETTER DZA;Lo;0;L;;;;;N;;;;; -0C5A;TELUGU LETTER RRRA;Lo;0;L;;;;;N;;;;; -0C60;TELUGU LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0C61;TELUGU LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0C62;TELUGU VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0C63;TELUGU VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0C66;TELUGU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0C67;TELUGU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0C68;TELUGU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0C69;TELUGU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0C6A;TELUGU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0C6B;TELUGU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0C6C;TELUGU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0C6D;TELUGU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0C6E;TELUGU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0C6F;TELUGU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0C78;TELUGU FRACTION DIGIT ZERO FOR ODD POWERS OF FOUR;No;0;ON;;;;0;N;;;;; -0C79;TELUGU FRACTION DIGIT ONE FOR ODD POWERS OF FOUR;No;0;ON;;;;1;N;;;;; -0C7A;TELUGU FRACTION DIGIT TWO FOR ODD POWERS OF FOUR;No;0;ON;;;;2;N;;;;; -0C7B;TELUGU FRACTION DIGIT THREE FOR ODD POWERS OF FOUR;No;0;ON;;;;3;N;;;;; -0C7C;TELUGU FRACTION DIGIT ONE FOR EVEN POWERS OF FOUR;No;0;ON;;;;1;N;;;;; -0C7D;TELUGU FRACTION DIGIT TWO FOR EVEN POWERS OF FOUR;No;0;ON;;;;2;N;;;;; -0C7E;TELUGU FRACTION DIGIT THREE FOR EVEN POWERS OF FOUR;No;0;ON;;;;3;N;;;;; -0C7F;TELUGU SIGN TUUMU;So;0;L;;;;;N;;;;; -0C81;KANNADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0C82;KANNADA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0C83;KANNADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0C85;KANNADA LETTER A;Lo;0;L;;;;;N;;;;; -0C86;KANNADA LETTER AA;Lo;0;L;;;;;N;;;;; -0C87;KANNADA LETTER I;Lo;0;L;;;;;N;;;;; -0C88;KANNADA LETTER II;Lo;0;L;;;;;N;;;;; -0C89;KANNADA LETTER U;Lo;0;L;;;;;N;;;;; -0C8A;KANNADA LETTER UU;Lo;0;L;;;;;N;;;;; -0C8B;KANNADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0C8C;KANNADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0C8E;KANNADA LETTER E;Lo;0;L;;;;;N;;;;; -0C8F;KANNADA LETTER EE;Lo;0;L;;;;;N;;;;; -0C90;KANNADA LETTER AI;Lo;0;L;;;;;N;;;;; -0C92;KANNADA LETTER O;Lo;0;L;;;;;N;;;;; -0C93;KANNADA LETTER OO;Lo;0;L;;;;;N;;;;; -0C94;KANNADA LETTER AU;Lo;0;L;;;;;N;;;;; -0C95;KANNADA LETTER KA;Lo;0;L;;;;;N;;;;; -0C96;KANNADA LETTER KHA;Lo;0;L;;;;;N;;;;; -0C97;KANNADA LETTER GA;Lo;0;L;;;;;N;;;;; -0C98;KANNADA LETTER GHA;Lo;0;L;;;;;N;;;;; -0C99;KANNADA LETTER NGA;Lo;0;L;;;;;N;;;;; -0C9A;KANNADA LETTER CA;Lo;0;L;;;;;N;;;;; -0C9B;KANNADA LETTER CHA;Lo;0;L;;;;;N;;;;; -0C9C;KANNADA LETTER JA;Lo;0;L;;;;;N;;;;; -0C9D;KANNADA LETTER JHA;Lo;0;L;;;;;N;;;;; -0C9E;KANNADA LETTER NYA;Lo;0;L;;;;;N;;;;; -0C9F;KANNADA LETTER TTA;Lo;0;L;;;;;N;;;;; -0CA0;KANNADA LETTER TTHA;Lo;0;L;;;;;N;;;;; -0CA1;KANNADA LETTER DDA;Lo;0;L;;;;;N;;;;; -0CA2;KANNADA LETTER DDHA;Lo;0;L;;;;;N;;;;; -0CA3;KANNADA LETTER NNA;Lo;0;L;;;;;N;;;;; -0CA4;KANNADA LETTER TA;Lo;0;L;;;;;N;;;;; -0CA5;KANNADA LETTER THA;Lo;0;L;;;;;N;;;;; -0CA6;KANNADA LETTER DA;Lo;0;L;;;;;N;;;;; -0CA7;KANNADA LETTER DHA;Lo;0;L;;;;;N;;;;; -0CA8;KANNADA LETTER NA;Lo;0;L;;;;;N;;;;; -0CAA;KANNADA LETTER PA;Lo;0;L;;;;;N;;;;; -0CAB;KANNADA LETTER PHA;Lo;0;L;;;;;N;;;;; -0CAC;KANNADA LETTER BA;Lo;0;L;;;;;N;;;;; -0CAD;KANNADA LETTER BHA;Lo;0;L;;;;;N;;;;; -0CAE;KANNADA LETTER MA;Lo;0;L;;;;;N;;;;; -0CAF;KANNADA LETTER YA;Lo;0;L;;;;;N;;;;; -0CB0;KANNADA LETTER RA;Lo;0;L;;;;;N;;;;; -0CB1;KANNADA LETTER RRA;Lo;0;L;;;;;N;;;;; -0CB2;KANNADA LETTER LA;Lo;0;L;;;;;N;;;;; -0CB3;KANNADA LETTER LLA;Lo;0;L;;;;;N;;;;; -0CB5;KANNADA LETTER VA;Lo;0;L;;;;;N;;;;; -0CB6;KANNADA LETTER SHA;Lo;0;L;;;;;N;;;;; -0CB7;KANNADA LETTER SSA;Lo;0;L;;;;;N;;;;; -0CB8;KANNADA LETTER SA;Lo;0;L;;;;;N;;;;; -0CB9;KANNADA LETTER HA;Lo;0;L;;;;;N;;;;; -0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;N;;;;; -0CC0;KANNADA VOWEL SIGN II;Mc;0;L;0CBF 0CD5;;;;N;;;;; -0CC1;KANNADA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -0CC2;KANNADA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -0CC3;KANNADA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -0CC4;KANNADA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -0CC6;KANNADA VOWEL SIGN E;Mn;0;L;;;;;N;;;;; -0CC7;KANNADA VOWEL SIGN EE;Mc;0;L;0CC6 0CD5;;;;N;;;;; -0CC8;KANNADA VOWEL SIGN AI;Mc;0;L;0CC6 0CD6;;;;N;;;;; -0CCA;KANNADA VOWEL SIGN O;Mc;0;L;0CC6 0CC2;;;;N;;;;; -0CCB;KANNADA VOWEL SIGN OO;Mc;0;L;0CCA 0CD5;;;;N;;;;; -0CCC;KANNADA VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -0CCD;KANNADA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0CD5;KANNADA LENGTH MARK;Mc;0;L;;;;;N;;;;; -0CD6;KANNADA AI LENGTH MARK;Mc;0;L;;;;;N;;;;; -0CDE;KANNADA LETTER FA;Lo;0;L;;;;;N;;;;; -0CE0;KANNADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0CE1;KANNADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0CE6;KANNADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0CE7;KANNADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0CE8;KANNADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0CE9;KANNADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0CEA;KANNADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0CEB;KANNADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0CEC;KANNADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0CED;KANNADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0CEE;KANNADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0CEF;KANNADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0CF1;KANNADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -0CF2;KANNADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -0D01;MALAYALAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -0D02;MALAYALAM SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -0D03;MALAYALAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; -0D05;MALAYALAM LETTER A;Lo;0;L;;;;;N;;;;; -0D06;MALAYALAM LETTER AA;Lo;0;L;;;;;N;;;;; -0D07;MALAYALAM LETTER I;Lo;0;L;;;;;N;;;;; -0D08;MALAYALAM LETTER II;Lo;0;L;;;;;N;;;;; -0D09;MALAYALAM LETTER U;Lo;0;L;;;;;N;;;;; -0D0A;MALAYALAM LETTER UU;Lo;0;L;;;;;N;;;;; -0D0B;MALAYALAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -0D0C;MALAYALAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -0D0E;MALAYALAM LETTER E;Lo;0;L;;;;;N;;;;; -0D0F;MALAYALAM LETTER EE;Lo;0;L;;;;;N;;;;; -0D10;MALAYALAM LETTER AI;Lo;0;L;;;;;N;;;;; -0D12;MALAYALAM LETTER O;Lo;0;L;;;;;N;;;;; -0D13;MALAYALAM LETTER OO;Lo;0;L;;;;;N;;;;; -0D14;MALAYALAM LETTER AU;Lo;0;L;;;;;N;;;;; -0D15;MALAYALAM LETTER KA;Lo;0;L;;;;;N;;;;; -0D16;MALAYALAM LETTER KHA;Lo;0;L;;;;;N;;;;; -0D17;MALAYALAM LETTER GA;Lo;0;L;;;;;N;;;;; -0D18;MALAYALAM LETTER GHA;Lo;0;L;;;;;N;;;;; -0D19;MALAYALAM LETTER NGA;Lo;0;L;;;;;N;;;;; -0D1A;MALAYALAM LETTER CA;Lo;0;L;;;;;N;;;;; -0D1B;MALAYALAM LETTER CHA;Lo;0;L;;;;;N;;;;; -0D1C;MALAYALAM LETTER JA;Lo;0;L;;;;;N;;;;; -0D1D;MALAYALAM LETTER JHA;Lo;0;L;;;;;N;;;;; -0D1E;MALAYALAM LETTER NYA;Lo;0;L;;;;;N;;;;; -0D1F;MALAYALAM LETTER TTA;Lo;0;L;;;;;N;;;;; -0D20;MALAYALAM LETTER TTHA;Lo;0;L;;;;;N;;;;; -0D21;MALAYALAM LETTER DDA;Lo;0;L;;;;;N;;;;; -0D22;MALAYALAM LETTER DDHA;Lo;0;L;;;;;N;;;;; -0D23;MALAYALAM LETTER NNA;Lo;0;L;;;;;N;;;;; -0D24;MALAYALAM LETTER TA;Lo;0;L;;;;;N;;;;; -0D25;MALAYALAM LETTER THA;Lo;0;L;;;;;N;;;;; -0D26;MALAYALAM LETTER DA;Lo;0;L;;;;;N;;;;; -0D27;MALAYALAM LETTER DHA;Lo;0;L;;;;;N;;;;; -0D28;MALAYALAM LETTER NA;Lo;0;L;;;;;N;;;;; -0D29;MALAYALAM LETTER NNNA;Lo;0;L;;;;;N;;;;; -0D2A;MALAYALAM LETTER PA;Lo;0;L;;;;;N;;;;; -0D2B;MALAYALAM LETTER PHA;Lo;0;L;;;;;N;;;;; -0D2C;MALAYALAM LETTER BA;Lo;0;L;;;;;N;;;;; -0D2D;MALAYALAM LETTER BHA;Lo;0;L;;;;;N;;;;; -0D2E;MALAYALAM LETTER MA;Lo;0;L;;;;;N;;;;; -0D2F;MALAYALAM LETTER YA;Lo;0;L;;;;;N;;;;; -0D30;MALAYALAM LETTER RA;Lo;0;L;;;;;N;;;;; -0D31;MALAYALAM LETTER RRA;Lo;0;L;;;;;N;;;;; -0D32;MALAYALAM LETTER LA;Lo;0;L;;;;;N;;;;; -0D33;MALAYALAM LETTER LLA;Lo;0;L;;;;;N;;;;; -0D34;MALAYALAM LETTER LLLA;Lo;0;L;;;;;N;;;;; -0D35;MALAYALAM LETTER VA;Lo;0;L;;;;;N;;;;; -0D36;MALAYALAM LETTER SHA;Lo;0;L;;;;;N;;;;; -0D37;MALAYALAM LETTER SSA;Lo;0;L;;;;;N;;;;; -0D38;MALAYALAM LETTER SA;Lo;0;L;;;;;N;;;;; -0D39;MALAYALAM LETTER HA;Lo;0;L;;;;;N;;;;; -0D3A;MALAYALAM LETTER TTTA;Lo;0;L;;;;;N;;;;; -0D3D;MALAYALAM SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -0D3E;MALAYALAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -0D3F;MALAYALAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -0D40;MALAYALAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -0D41;MALAYALAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -0D42;MALAYALAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -0D43;MALAYALAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -0D44;MALAYALAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -0D46;MALAYALAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -0D47;MALAYALAM VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -0D48;MALAYALAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -0D4A;MALAYALAM VOWEL SIGN O;Mc;0;L;0D46 0D3E;;;;N;;;;; -0D4B;MALAYALAM VOWEL SIGN OO;Mc;0;L;0D47 0D3E;;;;N;;;;; -0D4C;MALAYALAM VOWEL SIGN AU;Mc;0;L;0D46 0D57;;;;N;;;;; -0D4D;MALAYALAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -0D4E;MALAYALAM LETTER DOT REPH;Lo;0;L;;;;;N;;;;; -0D57;MALAYALAM AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -0D5F;MALAYALAM LETTER ARCHAIC II;Lo;0;L;;;;;N;;;;; -0D60;MALAYALAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -0D61;MALAYALAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -0D62;MALAYALAM VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -0D63;MALAYALAM VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -0D66;MALAYALAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0D67;MALAYALAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0D68;MALAYALAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0D69;MALAYALAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0D6A;MALAYALAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0D6B;MALAYALAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0D6C;MALAYALAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0D6D;MALAYALAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0D6E;MALAYALAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0D6F;MALAYALAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0D70;MALAYALAM NUMBER TEN;No;0;L;;;;10;N;;;;; -0D71;MALAYALAM NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -0D72;MALAYALAM NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -0D73;MALAYALAM FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; -0D74;MALAYALAM FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; -0D75;MALAYALAM FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; -0D79;MALAYALAM DATE MARK;So;0;L;;;;;N;;;;; -0D7A;MALAYALAM LETTER CHILLU NN;Lo;0;L;;;;;N;;;;; -0D7B;MALAYALAM LETTER CHILLU N;Lo;0;L;;;;;N;;;;; -0D7C;MALAYALAM LETTER CHILLU RR;Lo;0;L;;;;;N;;;;; -0D7D;MALAYALAM LETTER CHILLU L;Lo;0;L;;;;;N;;;;; -0D7E;MALAYALAM LETTER CHILLU LL;Lo;0;L;;;;;N;;;;; -0D7F;MALAYALAM LETTER CHILLU K;Lo;0;L;;;;;N;;;;; -0D82;SINHALA SIGN ANUSVARAYA;Mc;0;L;;;;;N;;;;; -0D83;SINHALA SIGN VISARGAYA;Mc;0;L;;;;;N;;;;; -0D85;SINHALA LETTER AYANNA;Lo;0;L;;;;;N;;;;; -0D86;SINHALA LETTER AAYANNA;Lo;0;L;;;;;N;;;;; -0D87;SINHALA LETTER AEYANNA;Lo;0;L;;;;;N;;;;; -0D88;SINHALA LETTER AEEYANNA;Lo;0;L;;;;;N;;;;; -0D89;SINHALA LETTER IYANNA;Lo;0;L;;;;;N;;;;; -0D8A;SINHALA LETTER IIYANNA;Lo;0;L;;;;;N;;;;; -0D8B;SINHALA LETTER UYANNA;Lo;0;L;;;;;N;;;;; -0D8C;SINHALA LETTER UUYANNA;Lo;0;L;;;;;N;;;;; -0D8D;SINHALA LETTER IRUYANNA;Lo;0;L;;;;;N;;;;; -0D8E;SINHALA LETTER IRUUYANNA;Lo;0;L;;;;;N;;;;; -0D8F;SINHALA LETTER ILUYANNA;Lo;0;L;;;;;N;;;;; -0D90;SINHALA LETTER ILUUYANNA;Lo;0;L;;;;;N;;;;; -0D91;SINHALA LETTER EYANNA;Lo;0;L;;;;;N;;;;; -0D92;SINHALA LETTER EEYANNA;Lo;0;L;;;;;N;;;;; -0D93;SINHALA LETTER AIYANNA;Lo;0;L;;;;;N;;;;; -0D94;SINHALA LETTER OYANNA;Lo;0;L;;;;;N;;;;; -0D95;SINHALA LETTER OOYANNA;Lo;0;L;;;;;N;;;;; -0D96;SINHALA LETTER AUYANNA;Lo;0;L;;;;;N;;;;; -0D9A;SINHALA LETTER ALPAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; -0D9B;SINHALA LETTER MAHAAPRAANA KAYANNA;Lo;0;L;;;;;N;;;;; -0D9C;SINHALA LETTER ALPAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; -0D9D;SINHALA LETTER MAHAAPRAANA GAYANNA;Lo;0;L;;;;;N;;;;; -0D9E;SINHALA LETTER KANTAJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; -0D9F;SINHALA LETTER SANYAKA GAYANNA;Lo;0;L;;;;;N;;;;; -0DA0;SINHALA LETTER ALPAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; -0DA1;SINHALA LETTER MAHAAPRAANA CAYANNA;Lo;0;L;;;;;N;;;;; -0DA2;SINHALA LETTER ALPAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA3;SINHALA LETTER MAHAAPRAANA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA4;SINHALA LETTER TAALUJA NAASIKYAYA;Lo;0;L;;;;;N;;;;; -0DA5;SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA;Lo;0;L;;;;;N;;;;; -0DA6;SINHALA LETTER SANYAKA JAYANNA;Lo;0;L;;;;;N;;;;; -0DA7;SINHALA LETTER ALPAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; -0DA8;SINHALA LETTER MAHAAPRAANA TTAYANNA;Lo;0;L;;;;;N;;;;; -0DA9;SINHALA LETTER ALPAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAA;SINHALA LETTER MAHAAPRAANA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAB;SINHALA LETTER MUURDHAJA NAYANNA;Lo;0;L;;;;;N;;;;; -0DAC;SINHALA LETTER SANYAKA DDAYANNA;Lo;0;L;;;;;N;;;;; -0DAD;SINHALA LETTER ALPAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; -0DAE;SINHALA LETTER MAHAAPRAANA TAYANNA;Lo;0;L;;;;;N;;;;; -0DAF;SINHALA LETTER ALPAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB0;SINHALA LETTER MAHAAPRAANA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB1;SINHALA LETTER DANTAJA NAYANNA;Lo;0;L;;;;;N;;;;; -0DB3;SINHALA LETTER SANYAKA DAYANNA;Lo;0;L;;;;;N;;;;; -0DB4;SINHALA LETTER ALPAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; -0DB5;SINHALA LETTER MAHAAPRAANA PAYANNA;Lo;0;L;;;;;N;;;;; -0DB6;SINHALA LETTER ALPAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; -0DB7;SINHALA LETTER MAHAAPRAANA BAYANNA;Lo;0;L;;;;;N;;;;; -0DB8;SINHALA LETTER MAYANNA;Lo;0;L;;;;;N;;;;; -0DB9;SINHALA LETTER AMBA BAYANNA;Lo;0;L;;;;;N;;;;; -0DBA;SINHALA LETTER YAYANNA;Lo;0;L;;;;;N;;;;; -0DBB;SINHALA LETTER RAYANNA;Lo;0;L;;;;;N;;;;; -0DBD;SINHALA LETTER DANTAJA LAYANNA;Lo;0;L;;;;;N;;;;; -0DC0;SINHALA LETTER VAYANNA;Lo;0;L;;;;;N;;;;; -0DC1;SINHALA LETTER TAALUJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC2;SINHALA LETTER MUURDHAJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC3;SINHALA LETTER DANTAJA SAYANNA;Lo;0;L;;;;;N;;;;; -0DC4;SINHALA LETTER HAYANNA;Lo;0;L;;;;;N;;;;; -0DC5;SINHALA LETTER MUURDHAJA LAYANNA;Lo;0;L;;;;;N;;;;; -0DC6;SINHALA LETTER FAYANNA;Lo;0;L;;;;;N;;;;; -0DCA;SINHALA SIGN AL-LAKUNA;Mn;9;NSM;;;;;N;;;;; -0DCF;SINHALA VOWEL SIGN AELA-PILLA;Mc;0;L;;;;;N;;;;; -0DD0;SINHALA VOWEL SIGN KETTI AEDA-PILLA;Mc;0;L;;;;;N;;;;; -0DD1;SINHALA VOWEL SIGN DIGA AEDA-PILLA;Mc;0;L;;;;;N;;;;; -0DD2;SINHALA VOWEL SIGN KETTI IS-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD3;SINHALA VOWEL SIGN DIGA IS-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD4;SINHALA VOWEL SIGN KETTI PAA-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD6;SINHALA VOWEL SIGN DIGA PAA-PILLA;Mn;0;NSM;;;;;N;;;;; -0DD8;SINHALA VOWEL SIGN GAETTA-PILLA;Mc;0;L;;;;;N;;;;; -0DD9;SINHALA VOWEL SIGN KOMBUVA;Mc;0;L;;;;;N;;;;; -0DDA;SINHALA VOWEL SIGN DIGA KOMBUVA;Mc;0;L;0DD9 0DCA;;;;N;;;;; -0DDB;SINHALA VOWEL SIGN KOMBU DEKA;Mc;0;L;;;;;N;;;;; -0DDC;SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA;Mc;0;L;0DD9 0DCF;;;;N;;;;; -0DDD;SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA;Mc;0;L;0DDC 0DCA;;;;N;;;;; -0DDE;SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA;Mc;0;L;0DD9 0DDF;;;;N;;;;; -0DDF;SINHALA VOWEL SIGN GAYANUKITTA;Mc;0;L;;;;;N;;;;; -0DE6;SINHALA LITH DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0DE7;SINHALA LITH DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0DE8;SINHALA LITH DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0DE9;SINHALA LITH DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0DEA;SINHALA LITH DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0DEB;SINHALA LITH DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0DEC;SINHALA LITH DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0DED;SINHALA LITH DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0DEE;SINHALA LITH DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0DEF;SINHALA LITH DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0DF2;SINHALA VOWEL SIGN DIGA GAETTA-PILLA;Mc;0;L;;;;;N;;;;; -0DF3;SINHALA VOWEL SIGN DIGA GAYANUKITTA;Mc;0;L;;;;;N;;;;; -0DF4;SINHALA PUNCTUATION KUNDDALIYA;Po;0;L;;;;;N;;;;; -0E01;THAI CHARACTER KO KAI;Lo;0;L;;;;;N;THAI LETTER KO KAI;;;; -0E02;THAI CHARACTER KHO KHAI;Lo;0;L;;;;;N;THAI LETTER KHO KHAI;;;; -0E03;THAI CHARACTER KHO KHUAT;Lo;0;L;;;;;N;THAI LETTER KHO KHUAT;;;; -0E04;THAI CHARACTER KHO KHWAI;Lo;0;L;;;;;N;THAI LETTER KHO KHWAI;;;; -0E05;THAI CHARACTER KHO KHON;Lo;0;L;;;;;N;THAI LETTER KHO KHON;;;; -0E06;THAI CHARACTER KHO RAKHANG;Lo;0;L;;;;;N;THAI LETTER KHO RAKHANG;;;; -0E07;THAI CHARACTER NGO NGU;Lo;0;L;;;;;N;THAI LETTER NGO NGU;;;; -0E08;THAI CHARACTER CHO CHAN;Lo;0;L;;;;;N;THAI LETTER CHO CHAN;;;; -0E09;THAI CHARACTER CHO CHING;Lo;0;L;;;;;N;THAI LETTER CHO CHING;;;; -0E0A;THAI CHARACTER CHO CHANG;Lo;0;L;;;;;N;THAI LETTER CHO CHANG;;;; -0E0B;THAI CHARACTER SO SO;Lo;0;L;;;;;N;THAI LETTER SO SO;;;; -0E0C;THAI CHARACTER CHO CHOE;Lo;0;L;;;;;N;THAI LETTER CHO CHOE;;;; -0E0D;THAI CHARACTER YO YING;Lo;0;L;;;;;N;THAI LETTER YO YING;;;; -0E0E;THAI CHARACTER DO CHADA;Lo;0;L;;;;;N;THAI LETTER DO CHADA;;;; -0E0F;THAI CHARACTER TO PATAK;Lo;0;L;;;;;N;THAI LETTER TO PATAK;;;; -0E10;THAI CHARACTER THO THAN;Lo;0;L;;;;;N;THAI LETTER THO THAN;;;; -0E11;THAI CHARACTER THO NANGMONTHO;Lo;0;L;;;;;N;THAI LETTER THO NANGMONTHO;;;; -0E12;THAI CHARACTER THO PHUTHAO;Lo;0;L;;;;;N;THAI LETTER THO PHUTHAO;;;; -0E13;THAI CHARACTER NO NEN;Lo;0;L;;;;;N;THAI LETTER NO NEN;;;; -0E14;THAI CHARACTER DO DEK;Lo;0;L;;;;;N;THAI LETTER DO DEK;;;; -0E15;THAI CHARACTER TO TAO;Lo;0;L;;;;;N;THAI LETTER TO TAO;;;; -0E16;THAI CHARACTER THO THUNG;Lo;0;L;;;;;N;THAI LETTER THO THUNG;;;; -0E17;THAI CHARACTER THO THAHAN;Lo;0;L;;;;;N;THAI LETTER THO THAHAN;;;; -0E18;THAI CHARACTER THO THONG;Lo;0;L;;;;;N;THAI LETTER THO THONG;;;; -0E19;THAI CHARACTER NO NU;Lo;0;L;;;;;N;THAI LETTER NO NU;;;; -0E1A;THAI CHARACTER BO BAIMAI;Lo;0;L;;;;;N;THAI LETTER BO BAIMAI;;;; -0E1B;THAI CHARACTER PO PLA;Lo;0;L;;;;;N;THAI LETTER PO PLA;;;; -0E1C;THAI CHARACTER PHO PHUNG;Lo;0;L;;;;;N;THAI LETTER PHO PHUNG;;;; -0E1D;THAI CHARACTER FO FA;Lo;0;L;;;;;N;THAI LETTER FO FA;;;; -0E1E;THAI CHARACTER PHO PHAN;Lo;0;L;;;;;N;THAI LETTER PHO PHAN;;;; -0E1F;THAI CHARACTER FO FAN;Lo;0;L;;;;;N;THAI LETTER FO FAN;;;; -0E20;THAI CHARACTER PHO SAMPHAO;Lo;0;L;;;;;N;THAI LETTER PHO SAMPHAO;;;; -0E21;THAI CHARACTER MO MA;Lo;0;L;;;;;N;THAI LETTER MO MA;;;; -0E22;THAI CHARACTER YO YAK;Lo;0;L;;;;;N;THAI LETTER YO YAK;;;; -0E23;THAI CHARACTER RO RUA;Lo;0;L;;;;;N;THAI LETTER RO RUA;;;; -0E24;THAI CHARACTER RU;Lo;0;L;;;;;N;THAI LETTER RU;;;; -0E25;THAI CHARACTER LO LING;Lo;0;L;;;;;N;THAI LETTER LO LING;;;; -0E26;THAI CHARACTER LU;Lo;0;L;;;;;N;THAI LETTER LU;;;; -0E27;THAI CHARACTER WO WAEN;Lo;0;L;;;;;N;THAI LETTER WO WAEN;;;; -0E28;THAI CHARACTER SO SALA;Lo;0;L;;;;;N;THAI LETTER SO SALA;;;; -0E29;THAI CHARACTER SO RUSI;Lo;0;L;;;;;N;THAI LETTER SO RUSI;;;; -0E2A;THAI CHARACTER SO SUA;Lo;0;L;;;;;N;THAI LETTER SO SUA;;;; -0E2B;THAI CHARACTER HO HIP;Lo;0;L;;;;;N;THAI LETTER HO HIP;;;; -0E2C;THAI CHARACTER LO CHULA;Lo;0;L;;;;;N;THAI LETTER LO CHULA;;;; -0E2D;THAI CHARACTER O ANG;Lo;0;L;;;;;N;THAI LETTER O ANG;;;; -0E2E;THAI CHARACTER HO NOKHUK;Lo;0;L;;;;;N;THAI LETTER HO NOK HUK;;;; -0E2F;THAI CHARACTER PAIYANNOI;Lo;0;L;;;;;N;THAI PAI YAN NOI;;;; -0E30;THAI CHARACTER SARA A;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA A;;;; -0E31;THAI CHARACTER MAI HAN-AKAT;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI HAN-AKAT;;;; -0E32;THAI CHARACTER SARA AA;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AA;;;; -0E33;THAI CHARACTER SARA AM;Lo;0;L; 0E4D 0E32;;;;N;THAI VOWEL SIGN SARA AM;;;; -0E34;THAI CHARACTER SARA I;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA I;;;; -0E35;THAI CHARACTER SARA II;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA II;;;; -0E36;THAI CHARACTER SARA UE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UE;;;; -0E37;THAI CHARACTER SARA UEE;Mn;0;NSM;;;;;N;THAI VOWEL SIGN SARA UEE;;;; -0E38;THAI CHARACTER SARA U;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA U;;;; -0E39;THAI CHARACTER SARA UU;Mn;103;NSM;;;;;N;THAI VOWEL SIGN SARA UU;;;; -0E3A;THAI CHARACTER PHINTHU;Mn;9;NSM;;;;;N;THAI VOWEL SIGN PHINTHU;;;; -0E3F;THAI CURRENCY SYMBOL BAHT;Sc;0;ET;;;;;N;THAI BAHT SIGN;;;; -0E40;THAI CHARACTER SARA E;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA E;;;; -0E41;THAI CHARACTER SARA AE;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA AE;;;; -0E42;THAI CHARACTER SARA O;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA O;;;; -0E43;THAI CHARACTER SARA AI MAIMUAN;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MUAN;;;; -0E44;THAI CHARACTER SARA AI MAIMALAI;Lo;0;L;;;;;N;THAI VOWEL SIGN SARA MAI MALAI;;;; -0E45;THAI CHARACTER LAKKHANGYAO;Lo;0;L;;;;;N;THAI LAK KHANG YAO;;;; -0E46;THAI CHARACTER MAIYAMOK;Lm;0;L;;;;;N;THAI MAI YAMOK;;;; -0E47;THAI CHARACTER MAITAIKHU;Mn;0;NSM;;;;;N;THAI VOWEL SIGN MAI TAI KHU;;;; -0E48;THAI CHARACTER MAI EK;Mn;107;NSM;;;;;N;THAI TONE MAI EK;;;; -0E49;THAI CHARACTER MAI THO;Mn;107;NSM;;;;;N;THAI TONE MAI THO;;;; -0E4A;THAI CHARACTER MAI TRI;Mn;107;NSM;;;;;N;THAI TONE MAI TRI;;;; -0E4B;THAI CHARACTER MAI CHATTAWA;Mn;107;NSM;;;;;N;THAI TONE MAI CHATTAWA;;;; -0E4C;THAI CHARACTER THANTHAKHAT;Mn;0;NSM;;;;;N;THAI THANTHAKHAT;;;; -0E4D;THAI CHARACTER NIKHAHIT;Mn;0;NSM;;;;;N;THAI NIKKHAHIT;;;; -0E4E;THAI CHARACTER YAMAKKAN;Mn;0;NSM;;;;;N;THAI YAMAKKAN;;;; -0E4F;THAI CHARACTER FONGMAN;Po;0;L;;;;;N;THAI FONGMAN;;;; -0E50;THAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0E51;THAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0E52;THAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0E53;THAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0E54;THAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0E55;THAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0E56;THAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0E57;THAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0E58;THAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0E59;THAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0E5A;THAI CHARACTER ANGKHANKHU;Po;0;L;;;;;N;THAI ANGKHANKHU;;;; -0E5B;THAI CHARACTER KHOMUT;Po;0;L;;;;;N;THAI KHOMUT;;;; -0E81;LAO LETTER KO;Lo;0;L;;;;;N;;;;; -0E82;LAO LETTER KHO SUNG;Lo;0;L;;;;;N;;;;; -0E84;LAO LETTER KHO TAM;Lo;0;L;;;;;N;;;;; -0E87;LAO LETTER NGO;Lo;0;L;;;;;N;;;;; -0E88;LAO LETTER CO;Lo;0;L;;;;;N;;;;; -0E8A;LAO LETTER SO TAM;Lo;0;L;;;;;N;;;;; -0E8D;LAO LETTER NYO;Lo;0;L;;;;;N;;;;; -0E94;LAO LETTER DO;Lo;0;L;;;;;N;;;;; -0E95;LAO LETTER TO;Lo;0;L;;;;;N;;;;; -0E96;LAO LETTER THO SUNG;Lo;0;L;;;;;N;;;;; -0E97;LAO LETTER THO TAM;Lo;0;L;;;;;N;;;;; -0E99;LAO LETTER NO;Lo;0;L;;;;;N;;;;; -0E9A;LAO LETTER BO;Lo;0;L;;;;;N;;;;; -0E9B;LAO LETTER PO;Lo;0;L;;;;;N;;;;; -0E9C;LAO LETTER PHO SUNG;Lo;0;L;;;;;N;;;;; -0E9D;LAO LETTER FO TAM;Lo;0;L;;;;;N;;;;; -0E9E;LAO LETTER PHO TAM;Lo;0;L;;;;;N;;;;; -0E9F;LAO LETTER FO SUNG;Lo;0;L;;;;;N;;;;; -0EA1;LAO LETTER MO;Lo;0;L;;;;;N;;;;; -0EA2;LAO LETTER YO;Lo;0;L;;;;;N;;;;; -0EA3;LAO LETTER LO LING;Lo;0;L;;;;;N;;;;; -0EA5;LAO LETTER LO LOOT;Lo;0;L;;;;;N;;;;; -0EA7;LAO LETTER WO;Lo;0;L;;;;;N;;;;; -0EAA;LAO LETTER SO SUNG;Lo;0;L;;;;;N;;;;; -0EAB;LAO LETTER HO SUNG;Lo;0;L;;;;;N;;;;; -0EAD;LAO LETTER O;Lo;0;L;;;;;N;;;;; -0EAE;LAO LETTER HO TAM;Lo;0;L;;;;;N;;;;; -0EAF;LAO ELLIPSIS;Lo;0;L;;;;;N;;;;; -0EB0;LAO VOWEL SIGN A;Lo;0;L;;;;;N;;;;; -0EB1;LAO VOWEL SIGN MAI KAN;Mn;0;NSM;;;;;N;;;;; -0EB2;LAO VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; -0EB3;LAO VOWEL SIGN AM;Lo;0;L; 0ECD 0EB2;;;;N;;;;; -0EB4;LAO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -0EB5;LAO VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -0EB6;LAO VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; -0EB7;LAO VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; -0EB8;LAO VOWEL SIGN U;Mn;118;NSM;;;;;N;;;;; -0EB9;LAO VOWEL SIGN UU;Mn;118;NSM;;;;;N;;;;; -0EBB;LAO VOWEL SIGN MAI KON;Mn;0;NSM;;;;;N;;;;; -0EBC;LAO SEMIVOWEL SIGN LO;Mn;0;NSM;;;;;N;;;;; -0EBD;LAO SEMIVOWEL SIGN NYO;Lo;0;L;;;;;N;;;;; -0EC0;LAO VOWEL SIGN E;Lo;0;L;;;;;N;;;;; -0EC1;LAO VOWEL SIGN EI;Lo;0;L;;;;;N;;;;; -0EC2;LAO VOWEL SIGN O;Lo;0;L;;;;;N;;;;; -0EC3;LAO VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; -0EC4;LAO VOWEL SIGN AI;Lo;0;L;;;;;N;;;;; -0EC6;LAO KO LA;Lm;0;L;;;;;N;;;;; -0EC8;LAO TONE MAI EK;Mn;122;NSM;;;;;N;;;;; -0EC9;LAO TONE MAI THO;Mn;122;NSM;;;;;N;;;;; -0ECA;LAO TONE MAI TI;Mn;122;NSM;;;;;N;;;;; -0ECB;LAO TONE MAI CATAWA;Mn;122;NSM;;;;;N;;;;; -0ECC;LAO CANCELLATION MARK;Mn;0;NSM;;;;;N;;;;; -0ECD;LAO NIGGAHITA;Mn;0;NSM;;;;;N;;;;; -0ED0;LAO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0ED1;LAO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0ED2;LAO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0ED3;LAO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0ED4;LAO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0ED5;LAO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0ED6;LAO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0ED7;LAO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0ED8;LAO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0ED9;LAO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0EDC;LAO HO NO;Lo;0;L; 0EAB 0E99;;;;N;;;;; -0EDD;LAO HO MO;Lo;0;L; 0EAB 0EA1;;;;N;;;;; -0EDE;LAO LETTER KHMU GO;Lo;0;L;;;;;N;;;;; -0EDF;LAO LETTER KHMU NYO;Lo;0;L;;;;;N;;;;; -0F00;TIBETAN SYLLABLE OM;Lo;0;L;;;;;N;;;;; -0F01;TIBETAN MARK GTER YIG MGO TRUNCATED A;So;0;L;;;;;N;;;;; -0F02;TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA;So;0;L;;;;;N;;;;; -0F03;TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA;So;0;L;;;;;N;;;;; -0F04;TIBETAN MARK INITIAL YIG MGO MDUN MA;Po;0;L;;;;;N;TIBETAN SINGLE ORNAMENT;;;; -0F05;TIBETAN MARK CLOSING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; -0F06;TIBETAN MARK CARET YIG MGO PHUR SHAD MA;Po;0;L;;;;;N;;;;; -0F07;TIBETAN MARK YIG MGO TSHEG SHAD MA;Po;0;L;;;;;N;;;;; -0F08;TIBETAN MARK SBRUL SHAD;Po;0;L;;;;;N;TIBETAN RGYANSHAD;;;; -0F09;TIBETAN MARK BSKUR YIG MGO;Po;0;L;;;;;N;;;;; -0F0A;TIBETAN MARK BKA- SHOG YIG MGO;Po;0;L;;;;;N;;;;; -0F0B;TIBETAN MARK INTERSYLLABIC TSHEG;Po;0;L;;;;;N;TIBETAN TSEG;;;; -0F0C;TIBETAN MARK DELIMITER TSHEG BSTAR;Po;0;L; 0F0B;;;;N;;;;; -0F0D;TIBETAN MARK SHAD;Po;0;L;;;;;N;TIBETAN SHAD;;;; -0F0E;TIBETAN MARK NYIS SHAD;Po;0;L;;;;;N;TIBETAN DOUBLE SHAD;;;; -0F0F;TIBETAN MARK TSHEG SHAD;Po;0;L;;;;;N;;;;; -0F10;TIBETAN MARK NYIS TSHEG SHAD;Po;0;L;;;;;N;;;;; -0F11;TIBETAN MARK RIN CHEN SPUNGS SHAD;Po;0;L;;;;;N;TIBETAN RINCHANPHUNGSHAD;;;; -0F12;TIBETAN MARK RGYA GRAM SHAD;Po;0;L;;;;;N;;;;; -0F13;TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN;So;0;L;;;;;N;;;;; -0F14;TIBETAN MARK GTER TSHEG;Po;0;L;;;;;N;TIBETAN COMMA;;;; -0F15;TIBETAN LOGOTYPE SIGN CHAD RTAGS;So;0;L;;;;;N;;;;; -0F16;TIBETAN LOGOTYPE SIGN LHAG RTAGS;So;0;L;;;;;N;;;;; -0F17;TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS;So;0;L;;;;;N;;;;; -0F18;TIBETAN ASTROLOGICAL SIGN -KHYUD PA;Mn;220;NSM;;;;;N;;;;; -0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS;Mn;220;NSM;;;;;N;;;;; -0F1A;TIBETAN SIGN RDEL DKAR GCIG;So;0;L;;;;;N;;;;; -0F1B;TIBETAN SIGN RDEL DKAR GNYIS;So;0;L;;;;;N;;;;; -0F1C;TIBETAN SIGN RDEL DKAR GSUM;So;0;L;;;;;N;;;;; -0F1D;TIBETAN SIGN RDEL NAG GCIG;So;0;L;;;;;N;;;;; -0F1E;TIBETAN SIGN RDEL NAG GNYIS;So;0;L;;;;;N;;;;; -0F1F;TIBETAN SIGN RDEL DKAR RDEL NAG;So;0;L;;;;;N;;;;; -0F20;TIBETAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -0F21;TIBETAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -0F22;TIBETAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -0F23;TIBETAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -0F24;TIBETAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -0F25;TIBETAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -0F26;TIBETAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -0F27;TIBETAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -0F28;TIBETAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -0F29;TIBETAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -0F2A;TIBETAN DIGIT HALF ONE;No;0;L;;;;1/2;N;;;;; -0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;3/2;N;;;;; -0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;5/2;N;;;;; -0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;7/2;N;;;;; -0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;9/2;N;;;;; -0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;11/2;N;;;;; -0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;13/2;N;;;;; -0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;15/2;N;;;;; -0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;17/2;N;;;;; -0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;-1/2;N;;;;; -0F34;TIBETAN MARK BSDUS RTAGS;So;0;L;;;;;N;;;;; -0F35;TIBETAN MARK NGAS BZUNG NYI ZLA;Mn;220;NSM;;;;;N;TIBETAN HONORIFIC UNDER RING;;;; -0F36;TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN;So;0;L;;;;;N;;;;; -0F37;TIBETAN MARK NGAS BZUNG SGOR RTAGS;Mn;220;NSM;;;;;N;TIBETAN UNDER RING;;;; -0F38;TIBETAN MARK CHE MGO;So;0;L;;;;;N;;;;; -0F39;TIBETAN MARK TSA -PHRU;Mn;216;NSM;;;;;N;TIBETAN LENITION MARK;;;; -0F3A;TIBETAN MARK GUG RTAGS GYON;Ps;0;ON;;;;;Y;;;;; -0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;;;; -0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;;;; -0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;TIBETAN RIGHT BRACE;;;; -0F3E;TIBETAN SIGN YAR TSHES;Mc;0;L;;;;;N;;;;; -0F3F;TIBETAN SIGN MAR TSHES;Mc;0;L;;;;;N;;;;; -0F40;TIBETAN LETTER KA;Lo;0;L;;;;;N;;;;; -0F41;TIBETAN LETTER KHA;Lo;0;L;;;;;N;;;;; -0F42;TIBETAN LETTER GA;Lo;0;L;;;;;N;;;;; -0F43;TIBETAN LETTER GHA;Lo;0;L;0F42 0FB7;;;;N;;;;; -0F44;TIBETAN LETTER NGA;Lo;0;L;;;;;N;;;;; -0F45;TIBETAN LETTER CA;Lo;0;L;;;;;N;;;;; -0F46;TIBETAN LETTER CHA;Lo;0;L;;;;;N;;;;; -0F47;TIBETAN LETTER JA;Lo;0;L;;;;;N;;;;; -0F49;TIBETAN LETTER NYA;Lo;0;L;;;;;N;;;;; -0F4A;TIBETAN LETTER TTA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED TA;;;; -0F4B;TIBETAN LETTER TTHA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED THA;;;; -0F4C;TIBETAN LETTER DDA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED DA;;;; -0F4D;TIBETAN LETTER DDHA;Lo;0;L;0F4C 0FB7;;;;N;;;;; -0F4E;TIBETAN LETTER NNA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED NA;;;; -0F4F;TIBETAN LETTER TA;Lo;0;L;;;;;N;;;;; -0F50;TIBETAN LETTER THA;Lo;0;L;;;;;N;;;;; -0F51;TIBETAN LETTER DA;Lo;0;L;;;;;N;;;;; -0F52;TIBETAN LETTER DHA;Lo;0;L;0F51 0FB7;;;;N;;;;; -0F53;TIBETAN LETTER NA;Lo;0;L;;;;;N;;;;; -0F54;TIBETAN LETTER PA;Lo;0;L;;;;;N;;;;; -0F55;TIBETAN LETTER PHA;Lo;0;L;;;;;N;;;;; -0F56;TIBETAN LETTER BA;Lo;0;L;;;;;N;;;;; -0F57;TIBETAN LETTER BHA;Lo;0;L;0F56 0FB7;;;;N;;;;; -0F58;TIBETAN LETTER MA;Lo;0;L;;;;;N;;;;; -0F59;TIBETAN LETTER TSA;Lo;0;L;;;;;N;;;;; -0F5A;TIBETAN LETTER TSHA;Lo;0;L;;;;;N;;;;; -0F5B;TIBETAN LETTER DZA;Lo;0;L;;;;;N;;;;; -0F5C;TIBETAN LETTER DZHA;Lo;0;L;0F5B 0FB7;;;;N;;;;; -0F5D;TIBETAN LETTER WA;Lo;0;L;;;;;N;;;;; -0F5E;TIBETAN LETTER ZHA;Lo;0;L;;;;;N;;;;; -0F5F;TIBETAN LETTER ZA;Lo;0;L;;;;;N;;;;; -0F60;TIBETAN LETTER -A;Lo;0;L;;;;;N;TIBETAN LETTER AA;;;; -0F61;TIBETAN LETTER YA;Lo;0;L;;;;;N;;;;; -0F62;TIBETAN LETTER RA;Lo;0;L;;;;;N;;;;; -0F63;TIBETAN LETTER LA;Lo;0;L;;;;;N;;;;; -0F64;TIBETAN LETTER SHA;Lo;0;L;;;;;N;;;;; -0F65;TIBETAN LETTER SSA;Lo;0;L;;;;;N;TIBETAN LETTER REVERSED SHA;;;; -0F66;TIBETAN LETTER SA;Lo;0;L;;;;;N;;;;; -0F67;TIBETAN LETTER HA;Lo;0;L;;;;;N;;;;; -0F68;TIBETAN LETTER A;Lo;0;L;;;;;N;;;;; -0F69;TIBETAN LETTER KSSA;Lo;0;L;0F40 0FB5;;;;N;;;;; -0F6A;TIBETAN LETTER FIXED-FORM RA;Lo;0;L;;;;;N;;;;; -0F6B;TIBETAN LETTER KKA;Lo;0;L;;;;;N;;;;; -0F6C;TIBETAN LETTER RRA;Lo;0;L;;;;;N;;;;; -0F71;TIBETAN VOWEL SIGN AA;Mn;129;NSM;;;;;N;;;;; -0F72;TIBETAN VOWEL SIGN I;Mn;130;NSM;;;;;N;;;;; -0F73;TIBETAN VOWEL SIGN II;Mn;0;NSM;0F71 0F72;;;;N;;;;; -0F74;TIBETAN VOWEL SIGN U;Mn;132;NSM;;;;;N;;;;; -0F75;TIBETAN VOWEL SIGN UU;Mn;0;NSM;0F71 0F74;;;;N;;;;; -0F76;TIBETAN VOWEL SIGN VOCALIC R;Mn;0;NSM;0FB2 0F80;;;;N;;;;; -0F77;TIBETAN VOWEL SIGN VOCALIC RR;Mn;0;NSM; 0FB2 0F81;;;;N;;;;; -0F78;TIBETAN VOWEL SIGN VOCALIC L;Mn;0;NSM;0FB3 0F80;;;;N;;;;; -0F79;TIBETAN VOWEL SIGN VOCALIC LL;Mn;0;NSM; 0FB3 0F81;;;;N;;;;; -0F7A;TIBETAN VOWEL SIGN E;Mn;130;NSM;;;;;N;;;;; -0F7B;TIBETAN VOWEL SIGN EE;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AI;;;; -0F7C;TIBETAN VOWEL SIGN O;Mn;130;NSM;;;;;N;;;;; -0F7D;TIBETAN VOWEL SIGN OO;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN AU;;;; -0F7E;TIBETAN SIGN RJES SU NGA RO;Mn;0;NSM;;;;;N;TIBETAN ANUSVARA;;;; -0F7F;TIBETAN SIGN RNAM BCAD;Mc;0;L;;;;;N;TIBETAN VISARGA;;;; -0F80;TIBETAN VOWEL SIGN REVERSED I;Mn;130;NSM;;;;;N;TIBETAN VOWEL SIGN SHORT I;;;; -0F81;TIBETAN VOWEL SIGN REVERSED II;Mn;0;NSM;0F71 0F80;;;;N;;;;; -0F82;TIBETAN SIGN NYI ZLA NAA DA;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU WITH ORNAMENT;;;; -0F83;TIBETAN SIGN SNA LDAN;Mn;230;NSM;;;;;N;TIBETAN CANDRABINDU;;;; -0F84;TIBETAN MARK HALANTA;Mn;9;NSM;;;;;N;TIBETAN VIRAMA;;;; -0F85;TIBETAN MARK PALUTA;Po;0;L;;;;;N;TIBETAN CHUCHENYIGE;;;; -0F86;TIBETAN SIGN LCI RTAGS;Mn;230;NSM;;;;;N;;;;; -0F87;TIBETAN SIGN YANG RTAGS;Mn;230;NSM;;;;;N;;;;; -0F88;TIBETAN SIGN LCE TSA CAN;Lo;0;L;;;;;N;;;;; -0F89;TIBETAN SIGN MCHU CAN;Lo;0;L;;;;;N;;;;; -0F8A;TIBETAN SIGN GRU CAN RGYINGS;Lo;0;L;;;;;N;;;;; -0F8B;TIBETAN SIGN GRU MED RGYINGS;Lo;0;L;;;;;N;;;;; -0F8C;TIBETAN SIGN INVERTED MCHU CAN;Lo;0;L;;;;;N;;;;; -0F8D;TIBETAN SUBJOINED SIGN LCE TSA CAN;Mn;0;NSM;;;;;N;;;;; -0F8E;TIBETAN SUBJOINED SIGN MCHU CAN;Mn;0;NSM;;;;;N;;;;; -0F8F;TIBETAN SUBJOINED SIGN INVERTED MCHU CAN;Mn;0;NSM;;;;;N;;;;; -0F90;TIBETAN SUBJOINED LETTER KA;Mn;0;NSM;;;;;N;;;;; -0F91;TIBETAN SUBJOINED LETTER KHA;Mn;0;NSM;;;;;N;;;;; -0F92;TIBETAN SUBJOINED LETTER GA;Mn;0;NSM;;;;;N;;;;; -0F93;TIBETAN SUBJOINED LETTER GHA;Mn;0;NSM;0F92 0FB7;;;;N;;;;; -0F94;TIBETAN SUBJOINED LETTER NGA;Mn;0;NSM;;;;;N;;;;; -0F95;TIBETAN SUBJOINED LETTER CA;Mn;0;NSM;;;;;N;;;;; -0F96;TIBETAN SUBJOINED LETTER CHA;Mn;0;NSM;;;;;N;;;;; -0F97;TIBETAN SUBJOINED LETTER JA;Mn;0;NSM;;;;;N;;;;; -0F99;TIBETAN SUBJOINED LETTER NYA;Mn;0;NSM;;;;;N;;;;; -0F9A;TIBETAN SUBJOINED LETTER TTA;Mn;0;NSM;;;;;N;;;;; -0F9B;TIBETAN SUBJOINED LETTER TTHA;Mn;0;NSM;;;;;N;;;;; -0F9C;TIBETAN SUBJOINED LETTER DDA;Mn;0;NSM;;;;;N;;;;; -0F9D;TIBETAN SUBJOINED LETTER DDHA;Mn;0;NSM;0F9C 0FB7;;;;N;;;;; -0F9E;TIBETAN SUBJOINED LETTER NNA;Mn;0;NSM;;;;;N;;;;; -0F9F;TIBETAN SUBJOINED LETTER TA;Mn;0;NSM;;;;;N;;;;; -0FA0;TIBETAN SUBJOINED LETTER THA;Mn;0;NSM;;;;;N;;;;; -0FA1;TIBETAN SUBJOINED LETTER DA;Mn;0;NSM;;;;;N;;;;; -0FA2;TIBETAN SUBJOINED LETTER DHA;Mn;0;NSM;0FA1 0FB7;;;;N;;;;; -0FA3;TIBETAN SUBJOINED LETTER NA;Mn;0;NSM;;;;;N;;;;; -0FA4;TIBETAN SUBJOINED LETTER PA;Mn;0;NSM;;;;;N;;;;; -0FA5;TIBETAN SUBJOINED LETTER PHA;Mn;0;NSM;;;;;N;;;;; -0FA6;TIBETAN SUBJOINED LETTER BA;Mn;0;NSM;;;;;N;;;;; -0FA7;TIBETAN SUBJOINED LETTER BHA;Mn;0;NSM;0FA6 0FB7;;;;N;;;;; -0FA8;TIBETAN SUBJOINED LETTER MA;Mn;0;NSM;;;;;N;;;;; -0FA9;TIBETAN SUBJOINED LETTER TSA;Mn;0;NSM;;;;;N;;;;; -0FAA;TIBETAN SUBJOINED LETTER TSHA;Mn;0;NSM;;;;;N;;;;; -0FAB;TIBETAN SUBJOINED LETTER DZA;Mn;0;NSM;;;;;N;;;;; -0FAC;TIBETAN SUBJOINED LETTER DZHA;Mn;0;NSM;0FAB 0FB7;;;;N;;;;; -0FAD;TIBETAN SUBJOINED LETTER WA;Mn;0;NSM;;;;;N;;;;; -0FAE;TIBETAN SUBJOINED LETTER ZHA;Mn;0;NSM;;;;;N;;;;; -0FAF;TIBETAN SUBJOINED LETTER ZA;Mn;0;NSM;;;;;N;;;;; -0FB0;TIBETAN SUBJOINED LETTER -A;Mn;0;NSM;;;;;N;;;;; -0FB1;TIBETAN SUBJOINED LETTER YA;Mn;0;NSM;;;;;N;;;;; -0FB2;TIBETAN SUBJOINED LETTER RA;Mn;0;NSM;;;;;N;;;;; -0FB3;TIBETAN SUBJOINED LETTER LA;Mn;0;NSM;;;;;N;;;;; -0FB4;TIBETAN SUBJOINED LETTER SHA;Mn;0;NSM;;;;;N;;;;; -0FB5;TIBETAN SUBJOINED LETTER SSA;Mn;0;NSM;;;;;N;;;;; -0FB6;TIBETAN SUBJOINED LETTER SA;Mn;0;NSM;;;;;N;;;;; -0FB7;TIBETAN SUBJOINED LETTER HA;Mn;0;NSM;;;;;N;;;;; -0FB8;TIBETAN SUBJOINED LETTER A;Mn;0;NSM;;;;;N;;;;; -0FB9;TIBETAN SUBJOINED LETTER KSSA;Mn;0;NSM;0F90 0FB5;;;;N;;;;; -0FBA;TIBETAN SUBJOINED LETTER FIXED-FORM WA;Mn;0;NSM;;;;;N;;;;; -0FBB;TIBETAN SUBJOINED LETTER FIXED-FORM YA;Mn;0;NSM;;;;;N;;;;; -0FBC;TIBETAN SUBJOINED LETTER FIXED-FORM RA;Mn;0;NSM;;;;;N;;;;; -0FBE;TIBETAN KU RU KHA;So;0;L;;;;;N;;;;; -0FBF;TIBETAN KU RU KHA BZHI MIG CAN;So;0;L;;;;;N;;;;; -0FC0;TIBETAN CANTILLATION SIGN HEAVY BEAT;So;0;L;;;;;N;;;;; -0FC1;TIBETAN CANTILLATION SIGN LIGHT BEAT;So;0;L;;;;;N;;;;; -0FC2;TIBETAN CANTILLATION SIGN CANG TE-U;So;0;L;;;;;N;;;;; -0FC3;TIBETAN CANTILLATION SIGN SBUB -CHAL;So;0;L;;;;;N;;;;; -0FC4;TIBETAN SYMBOL DRIL BU;So;0;L;;;;;N;;;;; -0FC5;TIBETAN SYMBOL RDO RJE;So;0;L;;;;;N;;;;; -0FC6;TIBETAN SYMBOL PADMA GDAN;Mn;220;NSM;;;;;N;;;;; -0FC7;TIBETAN SYMBOL RDO RJE RGYA GRAM;So;0;L;;;;;N;;;;; -0FC8;TIBETAN SYMBOL PHUR PA;So;0;L;;;;;N;;;;; -0FC9;TIBETAN SYMBOL NOR BU;So;0;L;;;;;N;;;;; -0FCA;TIBETAN SYMBOL NOR BU NYIS -KHYIL;So;0;L;;;;;N;;;;; -0FCB;TIBETAN SYMBOL NOR BU GSUM -KHYIL;So;0;L;;;;;N;;;;; -0FCC;TIBETAN SYMBOL NOR BU BZHI -KHYIL;So;0;L;;;;;N;;;;; -0FCE;TIBETAN SIGN RDEL NAG RDEL DKAR;So;0;L;;;;;N;;;;; -0FCF;TIBETAN SIGN RDEL NAG GSUM;So;0;L;;;;;N;;;;; -0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;;;; -0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;;;; -0FD2;TIBETAN MARK NYIS TSHEG;Po;0;L;;;;;N;;;;; -0FD3;TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA;Po;0;L;;;;;N;;;;; -0FD4;TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA;Po;0;L;;;;;N;;;;; -0FD5;RIGHT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; -0FD6;LEFT-FACING SVASTI SIGN;So;0;L;;;;;N;;;;; -0FD7;RIGHT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; -0FD8;LEFT-FACING SVASTI SIGN WITH DOTS;So;0;L;;;;;N;;;;; -0FD9;TIBETAN MARK LEADING MCHAN RTAGS;Po;0;L;;;;;N;;;;; -0FDA;TIBETAN MARK TRAILING MCHAN RTAGS;Po;0;L;;;;;N;;;;; -1000;MYANMAR LETTER KA;Lo;0;L;;;;;N;;;;; -1001;MYANMAR LETTER KHA;Lo;0;L;;;;;N;;;;; -1002;MYANMAR LETTER GA;Lo;0;L;;;;;N;;;;; -1003;MYANMAR LETTER GHA;Lo;0;L;;;;;N;;;;; -1004;MYANMAR LETTER NGA;Lo;0;L;;;;;N;;;;; -1005;MYANMAR LETTER CA;Lo;0;L;;;;;N;;;;; -1006;MYANMAR LETTER CHA;Lo;0;L;;;;;N;;;;; -1007;MYANMAR LETTER JA;Lo;0;L;;;;;N;;;;; -1008;MYANMAR LETTER JHA;Lo;0;L;;;;;N;;;;; -1009;MYANMAR LETTER NYA;Lo;0;L;;;;;N;;;;; -100A;MYANMAR LETTER NNYA;Lo;0;L;;;;;N;;;;; -100B;MYANMAR LETTER TTA;Lo;0;L;;;;;N;;;;; -100C;MYANMAR LETTER TTHA;Lo;0;L;;;;;N;;;;; -100D;MYANMAR LETTER DDA;Lo;0;L;;;;;N;;;;; -100E;MYANMAR LETTER DDHA;Lo;0;L;;;;;N;;;;; -100F;MYANMAR LETTER NNA;Lo;0;L;;;;;N;;;;; -1010;MYANMAR LETTER TA;Lo;0;L;;;;;N;;;;; -1011;MYANMAR LETTER THA;Lo;0;L;;;;;N;;;;; -1012;MYANMAR LETTER DA;Lo;0;L;;;;;N;;;;; -1013;MYANMAR LETTER DHA;Lo;0;L;;;;;N;;;;; -1014;MYANMAR LETTER NA;Lo;0;L;;;;;N;;;;; -1015;MYANMAR LETTER PA;Lo;0;L;;;;;N;;;;; -1016;MYANMAR LETTER PHA;Lo;0;L;;;;;N;;;;; -1017;MYANMAR LETTER BA;Lo;0;L;;;;;N;;;;; -1018;MYANMAR LETTER BHA;Lo;0;L;;;;;N;;;;; -1019;MYANMAR LETTER MA;Lo;0;L;;;;;N;;;;; -101A;MYANMAR LETTER YA;Lo;0;L;;;;;N;;;;; -101B;MYANMAR LETTER RA;Lo;0;L;;;;;N;;;;; -101C;MYANMAR LETTER LA;Lo;0;L;;;;;N;;;;; -101D;MYANMAR LETTER WA;Lo;0;L;;;;;N;;;;; -101E;MYANMAR LETTER SA;Lo;0;L;;;;;N;;;;; -101F;MYANMAR LETTER HA;Lo;0;L;;;;;N;;;;; -1020;MYANMAR LETTER LLA;Lo;0;L;;;;;N;;;;; -1021;MYANMAR LETTER A;Lo;0;L;;;;;N;;;;; -1022;MYANMAR LETTER SHAN A;Lo;0;L;;;;;N;;;;; -1023;MYANMAR LETTER I;Lo;0;L;;;;;N;;;;; -1024;MYANMAR LETTER II;Lo;0;L;;;;;N;;;;; -1025;MYANMAR LETTER U;Lo;0;L;;;;;N;;;;; -1026;MYANMAR LETTER UU;Lo;0;L;1025 102E;;;;N;;;;; -1027;MYANMAR LETTER E;Lo;0;L;;;;;N;;;;; -1028;MYANMAR LETTER MON E;Lo;0;L;;;;;N;;;;; -1029;MYANMAR LETTER O;Lo;0;L;;;;;N;;;;; -102A;MYANMAR LETTER AU;Lo;0;L;;;;;N;;;;; -102B;MYANMAR VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; -102C;MYANMAR VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -102D;MYANMAR VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -102E;MYANMAR VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -102F;MYANMAR VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1030;MYANMAR VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1031;MYANMAR VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1032;MYANMAR VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1033;MYANMAR VOWEL SIGN MON II;Mn;0;NSM;;;;;N;;;;; -1034;MYANMAR VOWEL SIGN MON O;Mn;0;NSM;;;;;N;;;;; -1035;MYANMAR VOWEL SIGN E ABOVE;Mn;0;NSM;;;;;N;;;;; -1036;MYANMAR SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1037;MYANMAR SIGN DOT BELOW;Mn;7;NSM;;;;;N;;;;; -1038;MYANMAR SIGN VISARGA;Mc;0;L;;;;;N;;;;; -1039;MYANMAR SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -103A;MYANMAR SIGN ASAT;Mn;9;NSM;;;;;N;;;;; -103B;MYANMAR CONSONANT SIGN MEDIAL YA;Mc;0;L;;;;;N;;;;; -103C;MYANMAR CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; -103D;MYANMAR CONSONANT SIGN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; -103E;MYANMAR CONSONANT SIGN MEDIAL HA;Mn;0;NSM;;;;;N;;;;; -103F;MYANMAR LETTER GREAT SA;Lo;0;L;;;;;N;;;;; -1040;MYANMAR DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1041;MYANMAR DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1042;MYANMAR DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1043;MYANMAR DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1044;MYANMAR DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1045;MYANMAR DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1046;MYANMAR DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1047;MYANMAR DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1048;MYANMAR DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1049;MYANMAR DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -104A;MYANMAR SIGN LITTLE SECTION;Po;0;L;;;;;N;;;;; -104B;MYANMAR SIGN SECTION;Po;0;L;;;;;N;;;;; -104C;MYANMAR SYMBOL LOCATIVE;Po;0;L;;;;;N;;;;; -104D;MYANMAR SYMBOL COMPLETED;Po;0;L;;;;;N;;;;; -104E;MYANMAR SYMBOL AFOREMENTIONED;Po;0;L;;;;;N;;;;; -104F;MYANMAR SYMBOL GENITIVE;Po;0;L;;;;;N;;;;; -1050;MYANMAR LETTER SHA;Lo;0;L;;;;;N;;;;; -1051;MYANMAR LETTER SSA;Lo;0;L;;;;;N;;;;; -1052;MYANMAR LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1053;MYANMAR LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1054;MYANMAR LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1055;MYANMAR LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1056;MYANMAR VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -1057;MYANMAR VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -1058;MYANMAR VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -1059;MYANMAR VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -105A;MYANMAR LETTER MON NGA;Lo;0;L;;;;;N;;;;; -105B;MYANMAR LETTER MON JHA;Lo;0;L;;;;;N;;;;; -105C;MYANMAR LETTER MON BBA;Lo;0;L;;;;;N;;;;; -105D;MYANMAR LETTER MON BBE;Lo;0;L;;;;;N;;;;; -105E;MYANMAR CONSONANT SIGN MON MEDIAL NA;Mn;0;NSM;;;;;N;;;;; -105F;MYANMAR CONSONANT SIGN MON MEDIAL MA;Mn;0;NSM;;;;;N;;;;; -1060;MYANMAR CONSONANT SIGN MON MEDIAL LA;Mn;0;NSM;;;;;N;;;;; -1061;MYANMAR LETTER SGAW KAREN SHA;Lo;0;L;;;;;N;;;;; -1062;MYANMAR VOWEL SIGN SGAW KAREN EU;Mc;0;L;;;;;N;;;;; -1063;MYANMAR TONE MARK SGAW KAREN HATHI;Mc;0;L;;;;;N;;;;; -1064;MYANMAR TONE MARK SGAW KAREN KE PHO;Mc;0;L;;;;;N;;;;; -1065;MYANMAR LETTER WESTERN PWO KAREN THA;Lo;0;L;;;;;N;;;;; -1066;MYANMAR LETTER WESTERN PWO KAREN PWA;Lo;0;L;;;;;N;;;;; -1067;MYANMAR VOWEL SIGN WESTERN PWO KAREN EU;Mc;0;L;;;;;N;;;;; -1068;MYANMAR VOWEL SIGN WESTERN PWO KAREN UE;Mc;0;L;;;;;N;;;;; -1069;MYANMAR SIGN WESTERN PWO KAREN TONE-1;Mc;0;L;;;;;N;;;;; -106A;MYANMAR SIGN WESTERN PWO KAREN TONE-2;Mc;0;L;;;;;N;;;;; -106B;MYANMAR SIGN WESTERN PWO KAREN TONE-3;Mc;0;L;;;;;N;;;;; -106C;MYANMAR SIGN WESTERN PWO KAREN TONE-4;Mc;0;L;;;;;N;;;;; -106D;MYANMAR SIGN WESTERN PWO KAREN TONE-5;Mc;0;L;;;;;N;;;;; -106E;MYANMAR LETTER EASTERN PWO KAREN NNA;Lo;0;L;;;;;N;;;;; -106F;MYANMAR LETTER EASTERN PWO KAREN YWA;Lo;0;L;;;;;N;;;;; -1070;MYANMAR LETTER EASTERN PWO KAREN GHWA;Lo;0;L;;;;;N;;;;; -1071;MYANMAR VOWEL SIGN GEBA KAREN I;Mn;0;NSM;;;;;N;;;;; -1072;MYANMAR VOWEL SIGN KAYAH OE;Mn;0;NSM;;;;;N;;;;; -1073;MYANMAR VOWEL SIGN KAYAH U;Mn;0;NSM;;;;;N;;;;; -1074;MYANMAR VOWEL SIGN KAYAH EE;Mn;0;NSM;;;;;N;;;;; -1075;MYANMAR LETTER SHAN KA;Lo;0;L;;;;;N;;;;; -1076;MYANMAR LETTER SHAN KHA;Lo;0;L;;;;;N;;;;; -1077;MYANMAR LETTER SHAN GA;Lo;0;L;;;;;N;;;;; -1078;MYANMAR LETTER SHAN CA;Lo;0;L;;;;;N;;;;; -1079;MYANMAR LETTER SHAN ZA;Lo;0;L;;;;;N;;;;; -107A;MYANMAR LETTER SHAN NYA;Lo;0;L;;;;;N;;;;; -107B;MYANMAR LETTER SHAN DA;Lo;0;L;;;;;N;;;;; -107C;MYANMAR LETTER SHAN NA;Lo;0;L;;;;;N;;;;; -107D;MYANMAR LETTER SHAN PHA;Lo;0;L;;;;;N;;;;; -107E;MYANMAR LETTER SHAN FA;Lo;0;L;;;;;N;;;;; -107F;MYANMAR LETTER SHAN BA;Lo;0;L;;;;;N;;;;; -1080;MYANMAR LETTER SHAN THA;Lo;0;L;;;;;N;;;;; -1081;MYANMAR LETTER SHAN HA;Lo;0;L;;;;;N;;;;; -1082;MYANMAR CONSONANT SIGN SHAN MEDIAL WA;Mn;0;NSM;;;;;N;;;;; -1083;MYANMAR VOWEL SIGN SHAN AA;Mc;0;L;;;;;N;;;;; -1084;MYANMAR VOWEL SIGN SHAN E;Mc;0;L;;;;;N;;;;; -1085;MYANMAR VOWEL SIGN SHAN E ABOVE;Mn;0;NSM;;;;;N;;;;; -1086;MYANMAR VOWEL SIGN SHAN FINAL Y;Mn;0;NSM;;;;;N;;;;; -1087;MYANMAR SIGN SHAN TONE-2;Mc;0;L;;;;;N;;;;; -1088;MYANMAR SIGN SHAN TONE-3;Mc;0;L;;;;;N;;;;; -1089;MYANMAR SIGN SHAN TONE-5;Mc;0;L;;;;;N;;;;; -108A;MYANMAR SIGN SHAN TONE-6;Mc;0;L;;;;;N;;;;; -108B;MYANMAR SIGN SHAN COUNCIL TONE-2;Mc;0;L;;;;;N;;;;; -108C;MYANMAR SIGN SHAN COUNCIL TONE-3;Mc;0;L;;;;;N;;;;; -108D;MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE;Mn;220;NSM;;;;;N;;;;; -108E;MYANMAR LETTER RUMAI PALAUNG FA;Lo;0;L;;;;;N;;;;; -108F;MYANMAR SIGN RUMAI PALAUNG TONE-5;Mc;0;L;;;;;N;;;;; -1090;MYANMAR SHAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1091;MYANMAR SHAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1092;MYANMAR SHAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1093;MYANMAR SHAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1094;MYANMAR SHAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1095;MYANMAR SHAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1096;MYANMAR SHAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1097;MYANMAR SHAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1098;MYANMAR SHAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1099;MYANMAR SHAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -109A;MYANMAR SIGN KHAMTI TONE-1;Mc;0;L;;;;;N;;;;; -109B;MYANMAR SIGN KHAMTI TONE-3;Mc;0;L;;;;;N;;;;; -109C;MYANMAR VOWEL SIGN AITON A;Mc;0;L;;;;;N;;;;; -109D;MYANMAR VOWEL SIGN AITON AI;Mn;0;NSM;;;;;N;;;;; -109E;MYANMAR SYMBOL SHAN ONE;So;0;L;;;;;N;;;;; -109F;MYANMAR SYMBOL SHAN EXCLAMATION;So;0;L;;;;;N;;;;; -10A0;GEORGIAN CAPITAL LETTER AN;Lu;0;L;;;;;N;;;;2D00; -10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;;;2D01; -10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;;;2D02; -10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;;;2D03; -10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;2D04; -10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;;;2D05; -10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;;;2D06; -10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;;;2D07; -10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;;;2D08; -10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;;;2D09; -10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;;;2D0A; -10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;;;2D0B; -10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;;;2D0C; -10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;;;2D0D; -10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;;;2D0E; -10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;;;2D0F; -10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;;;2D10; -10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;2D11; -10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;;;2D12; -10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;;;2D13; -10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;;;2D14; -10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;;;2D15; -10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;;;2D16; -10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;;;2D17; -10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;;;2D18; -10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;;;2D19; -10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;;;2D1A; -10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;;;2D1B; -10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;;;2D1C; -10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;;;2D1D; -10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;;;2D1E; -10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;;;2D1F; -10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;;;2D20; -10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;;;2D21; -10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;;;2D22; -10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;;;2D23; -10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;2D24; -10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;;;2D25; -10C7;GEORGIAN CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;2D27; -10CD;GEORGIAN CAPITAL LETTER AEN;Lu;0;L;;;;;N;;;;2D2D; -10D0;GEORGIAN LETTER AN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER AN;;;; -10D1;GEORGIAN LETTER BAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER BAN;;;; -10D2;GEORGIAN LETTER GAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GAN;;;; -10D3;GEORGIAN LETTER DON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER DON;;;; -10D4;GEORGIAN LETTER EN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER EN;;;; -10D5;GEORGIAN LETTER VIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER VIN;;;; -10D6;GEORGIAN LETTER ZEN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZEN;;;; -10D7;GEORGIAN LETTER TAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAN;;;; -10D8;GEORGIAN LETTER IN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER IN;;;; -10D9;GEORGIAN LETTER KAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KAN;;;; -10DA;GEORGIAN LETTER LAS;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER LAS;;;; -10DB;GEORGIAN LETTER MAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER MAN;;;; -10DC;GEORGIAN LETTER NAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER NAR;;;; -10DD;GEORGIAN LETTER ON;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ON;;;; -10DE;GEORGIAN LETTER PAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PAR;;;; -10DF;GEORGIAN LETTER ZHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER ZHAR;;;; -10E0;GEORGIAN LETTER RAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER RAE;;;; -10E1;GEORGIAN LETTER SAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SAN;;;; -10E2;GEORGIAN LETTER TAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER TAR;;;; -10E3;GEORGIAN LETTER UN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER UN;;;; -10E4;GEORGIAN LETTER PHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER PHAR;;;; -10E5;GEORGIAN LETTER KHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER KHAR;;;; -10E6;GEORGIAN LETTER GHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER GHAN;;;; -10E7;GEORGIAN LETTER QAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER QAR;;;; -10E8;GEORGIAN LETTER SHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER SHIN;;;; -10E9;GEORGIAN LETTER CHIN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHIN;;;; -10EA;GEORGIAN LETTER CAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CAN;;;; -10EB;GEORGIAN LETTER JIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JIL;;;; -10EC;GEORGIAN LETTER CIL;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CIL;;;; -10ED;GEORGIAN LETTER CHAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER CHAR;;;; -10EE;GEORGIAN LETTER XAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER XAN;;;; -10EF;GEORGIAN LETTER JHAN;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER JHAN;;;; -10F0;GEORGIAN LETTER HAE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAE;;;; -10F1;GEORGIAN LETTER HE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HE;;;; -10F2;GEORGIAN LETTER HIE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HIE;;;; -10F3;GEORGIAN LETTER WE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER WE;;;; -10F4;GEORGIAN LETTER HAR;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HAR;;;; -10F5;GEORGIAN LETTER HOE;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER HOE;;;; -10F6;GEORGIAN LETTER FI;Lo;0;L;;;;;N;GEORGIAN SMALL LETTER FI;;;; -10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;; -10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;; -10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;; -10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;; -10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L; 10DC;;;;N;;;;; -10FD;GEORGIAN LETTER AEN;Lo;0;L;;;;;N;;;;; -10FE;GEORGIAN LETTER HARD SIGN;Lo;0;L;;;;;N;;;;; -10FF;GEORGIAN LETTER LABIAL SIGN;Lo;0;L;;;;;N;;;;; -1100;HANGUL CHOSEONG KIYEOK;Lo;0;L;;;;;N;;;;; -1101;HANGUL CHOSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -1102;HANGUL CHOSEONG NIEUN;Lo;0;L;;;;;N;;;;; -1103;HANGUL CHOSEONG TIKEUT;Lo;0;L;;;;;N;;;;; -1104;HANGUL CHOSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; -1105;HANGUL CHOSEONG RIEUL;Lo;0;L;;;;;N;;;;; -1106;HANGUL CHOSEONG MIEUM;Lo;0;L;;;;;N;;;;; -1107;HANGUL CHOSEONG PIEUP;Lo;0;L;;;;;N;;;;; -1108;HANGUL CHOSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; -1109;HANGUL CHOSEONG SIOS;Lo;0;L;;;;;N;;;;; -110A;HANGUL CHOSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; -110B;HANGUL CHOSEONG IEUNG;Lo;0;L;;;;;N;;;;; -110C;HANGUL CHOSEONG CIEUC;Lo;0;L;;;;;N;;;;; -110D;HANGUL CHOSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; -110E;HANGUL CHOSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; -110F;HANGUL CHOSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; -1110;HANGUL CHOSEONG THIEUTH;Lo;0;L;;;;;N;;;;; -1111;HANGUL CHOSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; -1112;HANGUL CHOSEONG HIEUH;Lo;0;L;;;;;N;;;;; -1113;HANGUL CHOSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; -1114;HANGUL CHOSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; -1115;HANGUL CHOSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; -1116;HANGUL CHOSEONG NIEUN-PIEUP;Lo;0;L;;;;;N;;;;; -1117;HANGUL CHOSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; -1118;HANGUL CHOSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; -1119;HANGUL CHOSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; -111A;HANGUL CHOSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; -111B;HANGUL CHOSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; -111C;HANGUL CHOSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; -111D;HANGUL CHOSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; -111E;HANGUL CHOSEONG PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; -111F;HANGUL CHOSEONG PIEUP-NIEUN;Lo;0;L;;;;;N;;;;; -1120;HANGUL CHOSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -1121;HANGUL CHOSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -1122;HANGUL CHOSEONG PIEUP-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -1123;HANGUL CHOSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -1124;HANGUL CHOSEONG PIEUP-SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -1125;HANGUL CHOSEONG PIEUP-SSANGSIOS;Lo;0;L;;;;;N;;;;; -1126;HANGUL CHOSEONG PIEUP-SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -1127;HANGUL CHOSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; -1128;HANGUL CHOSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; -1129;HANGUL CHOSEONG PIEUP-THIEUTH;Lo;0;L;;;;;N;;;;; -112A;HANGUL CHOSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -112B;HANGUL CHOSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP;Lo;0;L;;;;;N;;;;; -112D;HANGUL CHOSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -112E;HANGUL CHOSEONG SIOS-NIEUN;Lo;0;L;;;;;N;;;;; -112F;HANGUL CHOSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -1130;HANGUL CHOSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; -1131;HANGUL CHOSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; -1132;HANGUL CHOSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -1133;HANGUL CHOSEONG SIOS-PIEUP-KIYEOK;Lo;0;L;;;;;N;;;;; -1134;HANGUL CHOSEONG SIOS-SSANGSIOS;Lo;0;L;;;;;N;;;;; -1135;HANGUL CHOSEONG SIOS-IEUNG;Lo;0;L;;;;;N;;;;; -1136;HANGUL CHOSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -1137;HANGUL CHOSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; -1138;HANGUL CHOSEONG SIOS-KHIEUKH;Lo;0;L;;;;;N;;;;; -1139;HANGUL CHOSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -113A;HANGUL CHOSEONG SIOS-PHIEUPH;Lo;0;L;;;;;N;;;;; -113B;HANGUL CHOSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; -113C;HANGUL CHOSEONG CHITUEUMSIOS;Lo;0;L;;;;;N;;;;; -113D;HANGUL CHOSEONG CHITUEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; -113E;HANGUL CHOSEONG CEONGCHIEUMSIOS;Lo;0;L;;;;;N;;;;; -113F;HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS;Lo;0;L;;;;;N;;;;; -1140;HANGUL CHOSEONG PANSIOS;Lo;0;L;;;;;N;;;;; -1141;HANGUL CHOSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; -1142;HANGUL CHOSEONG IEUNG-TIKEUT;Lo;0;L;;;;;N;;;;; -1143;HANGUL CHOSEONG IEUNG-MIEUM;Lo;0;L;;;;;N;;;;; -1144;HANGUL CHOSEONG IEUNG-PIEUP;Lo;0;L;;;;;N;;;;; -1145;HANGUL CHOSEONG IEUNG-SIOS;Lo;0;L;;;;;N;;;;; -1146;HANGUL CHOSEONG IEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; -1147;HANGUL CHOSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; -1148;HANGUL CHOSEONG IEUNG-CIEUC;Lo;0;L;;;;;N;;;;; -1149;HANGUL CHOSEONG IEUNG-CHIEUCH;Lo;0;L;;;;;N;;;;; -114A;HANGUL CHOSEONG IEUNG-THIEUTH;Lo;0;L;;;;;N;;;;; -114B;HANGUL CHOSEONG IEUNG-PHIEUPH;Lo;0;L;;;;;N;;;;; -114C;HANGUL CHOSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; -114D;HANGUL CHOSEONG CIEUC-IEUNG;Lo;0;L;;;;;N;;;;; -114E;HANGUL CHOSEONG CHITUEUMCIEUC;Lo;0;L;;;;;N;;;;; -114F;HANGUL CHOSEONG CHITUEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; -1150;HANGUL CHOSEONG CEONGCHIEUMCIEUC;Lo;0;L;;;;;N;;;;; -1151;HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC;Lo;0;L;;;;;N;;;;; -1152;HANGUL CHOSEONG CHIEUCH-KHIEUKH;Lo;0;L;;;;;N;;;;; -1153;HANGUL CHOSEONG CHIEUCH-HIEUH;Lo;0;L;;;;;N;;;;; -1154;HANGUL CHOSEONG CHITUEUMCHIEUCH;Lo;0;L;;;;;N;;;;; -1155;HANGUL CHOSEONG CEONGCHIEUMCHIEUCH;Lo;0;L;;;;;N;;;;; -1156;HANGUL CHOSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; -1157;HANGUL CHOSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; -1158;HANGUL CHOSEONG SSANGHIEUH;Lo;0;L;;;;;N;;;;; -1159;HANGUL CHOSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; -115A;HANGUL CHOSEONG KIYEOK-TIKEUT;Lo;0;L;;;;;N;;;;; -115B;HANGUL CHOSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; -115C;HANGUL CHOSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; -115D;HANGUL CHOSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; -115E;HANGUL CHOSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; -115F;HANGUL CHOSEONG FILLER;Lo;0;L;;;;;N;;;;; -1160;HANGUL JUNGSEONG FILLER;Lo;0;L;;;;;N;;;;; -1161;HANGUL JUNGSEONG A;Lo;0;L;;;;;N;;;;; -1162;HANGUL JUNGSEONG AE;Lo;0;L;;;;;N;;;;; -1163;HANGUL JUNGSEONG YA;Lo;0;L;;;;;N;;;;; -1164;HANGUL JUNGSEONG YAE;Lo;0;L;;;;;N;;;;; -1165;HANGUL JUNGSEONG EO;Lo;0;L;;;;;N;;;;; -1166;HANGUL JUNGSEONG E;Lo;0;L;;;;;N;;;;; -1167;HANGUL JUNGSEONG YEO;Lo;0;L;;;;;N;;;;; -1168;HANGUL JUNGSEONG YE;Lo;0;L;;;;;N;;;;; -1169;HANGUL JUNGSEONG O;Lo;0;L;;;;;N;;;;; -116A;HANGUL JUNGSEONG WA;Lo;0;L;;;;;N;;;;; -116B;HANGUL JUNGSEONG WAE;Lo;0;L;;;;;N;;;;; -116C;HANGUL JUNGSEONG OE;Lo;0;L;;;;;N;;;;; -116D;HANGUL JUNGSEONG YO;Lo;0;L;;;;;N;;;;; -116E;HANGUL JUNGSEONG U;Lo;0;L;;;;;N;;;;; -116F;HANGUL JUNGSEONG WEO;Lo;0;L;;;;;N;;;;; -1170;HANGUL JUNGSEONG WE;Lo;0;L;;;;;N;;;;; -1171;HANGUL JUNGSEONG WI;Lo;0;L;;;;;N;;;;; -1172;HANGUL JUNGSEONG YU;Lo;0;L;;;;;N;;;;; -1173;HANGUL JUNGSEONG EU;Lo;0;L;;;;;N;;;;; -1174;HANGUL JUNGSEONG YI;Lo;0;L;;;;;N;;;;; -1175;HANGUL JUNGSEONG I;Lo;0;L;;;;;N;;;;; -1176;HANGUL JUNGSEONG A-O;Lo;0;L;;;;;N;;;;; -1177;HANGUL JUNGSEONG A-U;Lo;0;L;;;;;N;;;;; -1178;HANGUL JUNGSEONG YA-O;Lo;0;L;;;;;N;;;;; -1179;HANGUL JUNGSEONG YA-YO;Lo;0;L;;;;;N;;;;; -117A;HANGUL JUNGSEONG EO-O;Lo;0;L;;;;;N;;;;; -117B;HANGUL JUNGSEONG EO-U;Lo;0;L;;;;;N;;;;; -117C;HANGUL JUNGSEONG EO-EU;Lo;0;L;;;;;N;;;;; -117D;HANGUL JUNGSEONG YEO-O;Lo;0;L;;;;;N;;;;; -117E;HANGUL JUNGSEONG YEO-U;Lo;0;L;;;;;N;;;;; -117F;HANGUL JUNGSEONG O-EO;Lo;0;L;;;;;N;;;;; -1180;HANGUL JUNGSEONG O-E;Lo;0;L;;;;;N;;;;; -1181;HANGUL JUNGSEONG O-YE;Lo;0;L;;;;;N;;;;; -1182;HANGUL JUNGSEONG O-O;Lo;0;L;;;;;N;;;;; -1183;HANGUL JUNGSEONG O-U;Lo;0;L;;;;;N;;;;; -1184;HANGUL JUNGSEONG YO-YA;Lo;0;L;;;;;N;;;;; -1185;HANGUL JUNGSEONG YO-YAE;Lo;0;L;;;;;N;;;;; -1186;HANGUL JUNGSEONG YO-YEO;Lo;0;L;;;;;N;;;;; -1187;HANGUL JUNGSEONG YO-O;Lo;0;L;;;;;N;;;;; -1188;HANGUL JUNGSEONG YO-I;Lo;0;L;;;;;N;;;;; -1189;HANGUL JUNGSEONG U-A;Lo;0;L;;;;;N;;;;; -118A;HANGUL JUNGSEONG U-AE;Lo;0;L;;;;;N;;;;; -118B;HANGUL JUNGSEONG U-EO-EU;Lo;0;L;;;;;N;;;;; -118C;HANGUL JUNGSEONG U-YE;Lo;0;L;;;;;N;;;;; -118D;HANGUL JUNGSEONG U-U;Lo;0;L;;;;;N;;;;; -118E;HANGUL JUNGSEONG YU-A;Lo;0;L;;;;;N;;;;; -118F;HANGUL JUNGSEONG YU-EO;Lo;0;L;;;;;N;;;;; -1190;HANGUL JUNGSEONG YU-E;Lo;0;L;;;;;N;;;;; -1191;HANGUL JUNGSEONG YU-YEO;Lo;0;L;;;;;N;;;;; -1192;HANGUL JUNGSEONG YU-YE;Lo;0;L;;;;;N;;;;; -1193;HANGUL JUNGSEONG YU-U;Lo;0;L;;;;;N;;;;; -1194;HANGUL JUNGSEONG YU-I;Lo;0;L;;;;;N;;;;; -1195;HANGUL JUNGSEONG EU-U;Lo;0;L;;;;;N;;;;; -1196;HANGUL JUNGSEONG EU-EU;Lo;0;L;;;;;N;;;;; -1197;HANGUL JUNGSEONG YI-U;Lo;0;L;;;;;N;;;;; -1198;HANGUL JUNGSEONG I-A;Lo;0;L;;;;;N;;;;; -1199;HANGUL JUNGSEONG I-YA;Lo;0;L;;;;;N;;;;; -119A;HANGUL JUNGSEONG I-O;Lo;0;L;;;;;N;;;;; -119B;HANGUL JUNGSEONG I-U;Lo;0;L;;;;;N;;;;; -119C;HANGUL JUNGSEONG I-EU;Lo;0;L;;;;;N;;;;; -119D;HANGUL JUNGSEONG I-ARAEA;Lo;0;L;;;;;N;;;;; -119E;HANGUL JUNGSEONG ARAEA;Lo;0;L;;;;;N;;;;; -119F;HANGUL JUNGSEONG ARAEA-EO;Lo;0;L;;;;;N;;;;; -11A0;HANGUL JUNGSEONG ARAEA-U;Lo;0;L;;;;;N;;;;; -11A1;HANGUL JUNGSEONG ARAEA-I;Lo;0;L;;;;;N;;;;; -11A2;HANGUL JUNGSEONG SSANGARAEA;Lo;0;L;;;;;N;;;;; -11A3;HANGUL JUNGSEONG A-EU;Lo;0;L;;;;;N;;;;; -11A4;HANGUL JUNGSEONG YA-U;Lo;0;L;;;;;N;;;;; -11A5;HANGUL JUNGSEONG YEO-YA;Lo;0;L;;;;;N;;;;; -11A6;HANGUL JUNGSEONG O-YA;Lo;0;L;;;;;N;;;;; -11A7;HANGUL JUNGSEONG O-YAE;Lo;0;L;;;;;N;;;;; -11A8;HANGUL JONGSEONG KIYEOK;Lo;0;L;;;;;N;;;;; -11A9;HANGUL JONGSEONG SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -11AA;HANGUL JONGSEONG KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; -11AB;HANGUL JONGSEONG NIEUN;Lo;0;L;;;;;N;;;;; -11AC;HANGUL JONGSEONG NIEUN-CIEUC;Lo;0;L;;;;;N;;;;; -11AD;HANGUL JONGSEONG NIEUN-HIEUH;Lo;0;L;;;;;N;;;;; -11AE;HANGUL JONGSEONG TIKEUT;Lo;0;L;;;;;N;;;;; -11AF;HANGUL JONGSEONG RIEUL;Lo;0;L;;;;;N;;;;; -11B0;HANGUL JONGSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; -11B1;HANGUL JONGSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; -11B2;HANGUL JONGSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; -11B3;HANGUL JONGSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; -11B4;HANGUL JONGSEONG RIEUL-THIEUTH;Lo;0;L;;;;;N;;;;; -11B5;HANGUL JONGSEONG RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; -11B6;HANGUL JONGSEONG RIEUL-HIEUH;Lo;0;L;;;;;N;;;;; -11B7;HANGUL JONGSEONG MIEUM;Lo;0;L;;;;;N;;;;; -11B8;HANGUL JONGSEONG PIEUP;Lo;0;L;;;;;N;;;;; -11B9;HANGUL JONGSEONG PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -11BA;HANGUL JONGSEONG SIOS;Lo;0;L;;;;;N;;;;; -11BB;HANGUL JONGSEONG SSANGSIOS;Lo;0;L;;;;;N;;;;; -11BC;HANGUL JONGSEONG IEUNG;Lo;0;L;;;;;N;;;;; -11BD;HANGUL JONGSEONG CIEUC;Lo;0;L;;;;;N;;;;; -11BE;HANGUL JONGSEONG CHIEUCH;Lo;0;L;;;;;N;;;;; -11BF;HANGUL JONGSEONG KHIEUKH;Lo;0;L;;;;;N;;;;; -11C0;HANGUL JONGSEONG THIEUTH;Lo;0;L;;;;;N;;;;; -11C1;HANGUL JONGSEONG PHIEUPH;Lo;0;L;;;;;N;;;;; -11C2;HANGUL JONGSEONG HIEUH;Lo;0;L;;;;;N;;;;; -11C3;HANGUL JONGSEONG KIYEOK-RIEUL;Lo;0;L;;;;;N;;;;; -11C4;HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -11C5;HANGUL JONGSEONG NIEUN-KIYEOK;Lo;0;L;;;;;N;;;;; -11C6;HANGUL JONGSEONG NIEUN-TIKEUT;Lo;0;L;;;;;N;;;;; -11C7;HANGUL JONGSEONG NIEUN-SIOS;Lo;0;L;;;;;N;;;;; -11C8;HANGUL JONGSEONG NIEUN-PANSIOS;Lo;0;L;;;;;N;;;;; -11C9;HANGUL JONGSEONG NIEUN-THIEUTH;Lo;0;L;;;;;N;;;;; -11CA;HANGUL JONGSEONG TIKEUT-KIYEOK;Lo;0;L;;;;;N;;;;; -11CB;HANGUL JONGSEONG TIKEUT-RIEUL;Lo;0;L;;;;;N;;;;; -11CC;HANGUL JONGSEONG RIEUL-KIYEOK-SIOS;Lo;0;L;;;;;N;;;;; -11CD;HANGUL JONGSEONG RIEUL-NIEUN;Lo;0;L;;;;;N;;;;; -11CE;HANGUL JONGSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; -11CF;HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH;Lo;0;L;;;;;N;;;;; -11D0;HANGUL JONGSEONG SSANGRIEUL;Lo;0;L;;;;;N;;;;; -11D1;HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -11D2;HANGUL JONGSEONG RIEUL-MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -11D3;HANGUL JONGSEONG RIEUL-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -11D4;HANGUL JONGSEONG RIEUL-PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -11D5;HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -11D6;HANGUL JONGSEONG RIEUL-SSANGSIOS;Lo;0;L;;;;;N;;;;; -11D7;HANGUL JONGSEONG RIEUL-PANSIOS;Lo;0;L;;;;;N;;;;; -11D8;HANGUL JONGSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -11D9;HANGUL JONGSEONG RIEUL-YEORINHIEUH;Lo;0;L;;;;;N;;;;; -11DA;HANGUL JONGSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -11DB;HANGUL JONGSEONG MIEUM-RIEUL;Lo;0;L;;;;;N;;;;; -11DC;HANGUL JONGSEONG MIEUM-PIEUP;Lo;0;L;;;;;N;;;;; -11DD;HANGUL JONGSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -11DE;HANGUL JONGSEONG MIEUM-SSANGSIOS;Lo;0;L;;;;;N;;;;; -11DF;HANGUL JONGSEONG MIEUM-PANSIOS;Lo;0;L;;;;;N;;;;; -11E0;HANGUL JONGSEONG MIEUM-CHIEUCH;Lo;0;L;;;;;N;;;;; -11E1;HANGUL JONGSEONG MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; -11E2;HANGUL JONGSEONG KAPYEOUNMIEUM;Lo;0;L;;;;;N;;;;; -11E3;HANGUL JONGSEONG PIEUP-RIEUL;Lo;0;L;;;;;N;;;;; -11E4;HANGUL JONGSEONG PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -11E5;HANGUL JONGSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -11E6;HANGUL JONGSEONG KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -11E7;HANGUL JONGSEONG SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -11E8;HANGUL JONGSEONG SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -11E9;HANGUL JONGSEONG SIOS-RIEUL;Lo;0;L;;;;;N;;;;; -11EA;HANGUL JONGSEONG SIOS-PIEUP;Lo;0;L;;;;;N;;;;; -11EB;HANGUL JONGSEONG PANSIOS;Lo;0;L;;;;;N;;;;; -11EC;HANGUL JONGSEONG IEUNG-KIYEOK;Lo;0;L;;;;;N;;;;; -11ED;HANGUL JONGSEONG IEUNG-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -11EE;HANGUL JONGSEONG SSANGIEUNG;Lo;0;L;;;;;N;;;;; -11EF;HANGUL JONGSEONG IEUNG-KHIEUKH;Lo;0;L;;;;;N;;;;; -11F0;HANGUL JONGSEONG YESIEUNG;Lo;0;L;;;;;N;;;;; -11F1;HANGUL JONGSEONG YESIEUNG-SIOS;Lo;0;L;;;;;N;;;;; -11F2;HANGUL JONGSEONG YESIEUNG-PANSIOS;Lo;0;L;;;;;N;;;;; -11F3;HANGUL JONGSEONG PHIEUPH-PIEUP;Lo;0;L;;;;;N;;;;; -11F4;HANGUL JONGSEONG KAPYEOUNPHIEUPH;Lo;0;L;;;;;N;;;;; -11F5;HANGUL JONGSEONG HIEUH-NIEUN;Lo;0;L;;;;;N;;;;; -11F6;HANGUL JONGSEONG HIEUH-RIEUL;Lo;0;L;;;;;N;;;;; -11F7;HANGUL JONGSEONG HIEUH-MIEUM;Lo;0;L;;;;;N;;;;; -11F8;HANGUL JONGSEONG HIEUH-PIEUP;Lo;0;L;;;;;N;;;;; -11F9;HANGUL JONGSEONG YEORINHIEUH;Lo;0;L;;;;;N;;;;; -11FA;HANGUL JONGSEONG KIYEOK-NIEUN;Lo;0;L;;;;;N;;;;; -11FB;HANGUL JONGSEONG KIYEOK-PIEUP;Lo;0;L;;;;;N;;;;; -11FC;HANGUL JONGSEONG KIYEOK-CHIEUCH;Lo;0;L;;;;;N;;;;; -11FD;HANGUL JONGSEONG KIYEOK-KHIEUKH;Lo;0;L;;;;;N;;;;; -11FE;HANGUL JONGSEONG KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; -11FF;HANGUL JONGSEONG SSANGNIEUN;Lo;0;L;;;;;N;;;;; -1200;ETHIOPIC SYLLABLE HA;Lo;0;L;;;;;N;;;;; -1201;ETHIOPIC SYLLABLE HU;Lo;0;L;;;;;N;;;;; -1202;ETHIOPIC SYLLABLE HI;Lo;0;L;;;;;N;;;;; -1203;ETHIOPIC SYLLABLE HAA;Lo;0;L;;;;;N;;;;; -1204;ETHIOPIC SYLLABLE HEE;Lo;0;L;;;;;N;;;;; -1205;ETHIOPIC SYLLABLE HE;Lo;0;L;;;;;N;;;;; -1206;ETHIOPIC SYLLABLE HO;Lo;0;L;;;;;N;;;;; -1207;ETHIOPIC SYLLABLE HOA;Lo;0;L;;;;;N;;;;; -1208;ETHIOPIC SYLLABLE LA;Lo;0;L;;;;;N;;;;; -1209;ETHIOPIC SYLLABLE LU;Lo;0;L;;;;;N;;;;; -120A;ETHIOPIC SYLLABLE LI;Lo;0;L;;;;;N;;;;; -120B;ETHIOPIC SYLLABLE LAA;Lo;0;L;;;;;N;;;;; -120C;ETHIOPIC SYLLABLE LEE;Lo;0;L;;;;;N;;;;; -120D;ETHIOPIC SYLLABLE LE;Lo;0;L;;;;;N;;;;; -120E;ETHIOPIC SYLLABLE LO;Lo;0;L;;;;;N;;;;; -120F;ETHIOPIC SYLLABLE LWA;Lo;0;L;;;;;N;;;;; -1210;ETHIOPIC SYLLABLE HHA;Lo;0;L;;;;;N;;;;; -1211;ETHIOPIC SYLLABLE HHU;Lo;0;L;;;;;N;;;;; -1212;ETHIOPIC SYLLABLE HHI;Lo;0;L;;;;;N;;;;; -1213;ETHIOPIC SYLLABLE HHAA;Lo;0;L;;;;;N;;;;; -1214;ETHIOPIC SYLLABLE HHEE;Lo;0;L;;;;;N;;;;; -1215;ETHIOPIC SYLLABLE HHE;Lo;0;L;;;;;N;;;;; -1216;ETHIOPIC SYLLABLE HHO;Lo;0;L;;;;;N;;;;; -1217;ETHIOPIC SYLLABLE HHWA;Lo;0;L;;;;;N;;;;; -1218;ETHIOPIC SYLLABLE MA;Lo;0;L;;;;;N;;;;; -1219;ETHIOPIC SYLLABLE MU;Lo;0;L;;;;;N;;;;; -121A;ETHIOPIC SYLLABLE MI;Lo;0;L;;;;;N;;;;; -121B;ETHIOPIC SYLLABLE MAA;Lo;0;L;;;;;N;;;;; -121C;ETHIOPIC SYLLABLE MEE;Lo;0;L;;;;;N;;;;; -121D;ETHIOPIC SYLLABLE ME;Lo;0;L;;;;;N;;;;; -121E;ETHIOPIC SYLLABLE MO;Lo;0;L;;;;;N;;;;; -121F;ETHIOPIC SYLLABLE MWA;Lo;0;L;;;;;N;;;;; -1220;ETHIOPIC SYLLABLE SZA;Lo;0;L;;;;;N;;;;; -1221;ETHIOPIC SYLLABLE SZU;Lo;0;L;;;;;N;;;;; -1222;ETHIOPIC SYLLABLE SZI;Lo;0;L;;;;;N;;;;; -1223;ETHIOPIC SYLLABLE SZAA;Lo;0;L;;;;;N;;;;; -1224;ETHIOPIC SYLLABLE SZEE;Lo;0;L;;;;;N;;;;; -1225;ETHIOPIC SYLLABLE SZE;Lo;0;L;;;;;N;;;;; -1226;ETHIOPIC SYLLABLE SZO;Lo;0;L;;;;;N;;;;; -1227;ETHIOPIC SYLLABLE SZWA;Lo;0;L;;;;;N;;;;; -1228;ETHIOPIC SYLLABLE RA;Lo;0;L;;;;;N;;;;; -1229;ETHIOPIC SYLLABLE RU;Lo;0;L;;;;;N;;;;; -122A;ETHIOPIC SYLLABLE RI;Lo;0;L;;;;;N;;;;; -122B;ETHIOPIC SYLLABLE RAA;Lo;0;L;;;;;N;;;;; -122C;ETHIOPIC SYLLABLE REE;Lo;0;L;;;;;N;;;;; -122D;ETHIOPIC SYLLABLE RE;Lo;0;L;;;;;N;;;;; -122E;ETHIOPIC SYLLABLE RO;Lo;0;L;;;;;N;;;;; -122F;ETHIOPIC SYLLABLE RWA;Lo;0;L;;;;;N;;;;; -1230;ETHIOPIC SYLLABLE SA;Lo;0;L;;;;;N;;;;; -1231;ETHIOPIC SYLLABLE SU;Lo;0;L;;;;;N;;;;; -1232;ETHIOPIC SYLLABLE SI;Lo;0;L;;;;;N;;;;; -1233;ETHIOPIC SYLLABLE SAA;Lo;0;L;;;;;N;;;;; -1234;ETHIOPIC SYLLABLE SEE;Lo;0;L;;;;;N;;;;; -1235;ETHIOPIC SYLLABLE SE;Lo;0;L;;;;;N;;;;; -1236;ETHIOPIC SYLLABLE SO;Lo;0;L;;;;;N;;;;; -1237;ETHIOPIC SYLLABLE SWA;Lo;0;L;;;;;N;;;;; -1238;ETHIOPIC SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -1239;ETHIOPIC SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -123A;ETHIOPIC SYLLABLE SHI;Lo;0;L;;;;;N;;;;; -123B;ETHIOPIC SYLLABLE SHAA;Lo;0;L;;;;;N;;;;; -123C;ETHIOPIC SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; -123D;ETHIOPIC SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -123E;ETHIOPIC SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -123F;ETHIOPIC SYLLABLE SHWA;Lo;0;L;;;;;N;;;;; -1240;ETHIOPIC SYLLABLE QA;Lo;0;L;;;;;N;;;;; -1241;ETHIOPIC SYLLABLE QU;Lo;0;L;;;;;N;;;;; -1242;ETHIOPIC SYLLABLE QI;Lo;0;L;;;;;N;;;;; -1243;ETHIOPIC SYLLABLE QAA;Lo;0;L;;;;;N;;;;; -1244;ETHIOPIC SYLLABLE QEE;Lo;0;L;;;;;N;;;;; -1245;ETHIOPIC SYLLABLE QE;Lo;0;L;;;;;N;;;;; -1246;ETHIOPIC SYLLABLE QO;Lo;0;L;;;;;N;;;;; -1247;ETHIOPIC SYLLABLE QOA;Lo;0;L;;;;;N;;;;; -1248;ETHIOPIC SYLLABLE QWA;Lo;0;L;;;;;N;;;;; -124A;ETHIOPIC SYLLABLE QWI;Lo;0;L;;;;;N;;;;; -124B;ETHIOPIC SYLLABLE QWAA;Lo;0;L;;;;;N;;;;; -124C;ETHIOPIC SYLLABLE QWEE;Lo;0;L;;;;;N;;;;; -124D;ETHIOPIC SYLLABLE QWE;Lo;0;L;;;;;N;;;;; -1250;ETHIOPIC SYLLABLE QHA;Lo;0;L;;;;;N;;;;; -1251;ETHIOPIC SYLLABLE QHU;Lo;0;L;;;;;N;;;;; -1252;ETHIOPIC SYLLABLE QHI;Lo;0;L;;;;;N;;;;; -1253;ETHIOPIC SYLLABLE QHAA;Lo;0;L;;;;;N;;;;; -1254;ETHIOPIC SYLLABLE QHEE;Lo;0;L;;;;;N;;;;; -1255;ETHIOPIC SYLLABLE QHE;Lo;0;L;;;;;N;;;;; -1256;ETHIOPIC SYLLABLE QHO;Lo;0;L;;;;;N;;;;; -1258;ETHIOPIC SYLLABLE QHWA;Lo;0;L;;;;;N;;;;; -125A;ETHIOPIC SYLLABLE QHWI;Lo;0;L;;;;;N;;;;; -125B;ETHIOPIC SYLLABLE QHWAA;Lo;0;L;;;;;N;;;;; -125C;ETHIOPIC SYLLABLE QHWEE;Lo;0;L;;;;;N;;;;; -125D;ETHIOPIC SYLLABLE QHWE;Lo;0;L;;;;;N;;;;; -1260;ETHIOPIC SYLLABLE BA;Lo;0;L;;;;;N;;;;; -1261;ETHIOPIC SYLLABLE BU;Lo;0;L;;;;;N;;;;; -1262;ETHIOPIC SYLLABLE BI;Lo;0;L;;;;;N;;;;; -1263;ETHIOPIC SYLLABLE BAA;Lo;0;L;;;;;N;;;;; -1264;ETHIOPIC SYLLABLE BEE;Lo;0;L;;;;;N;;;;; -1265;ETHIOPIC SYLLABLE BE;Lo;0;L;;;;;N;;;;; -1266;ETHIOPIC SYLLABLE BO;Lo;0;L;;;;;N;;;;; -1267;ETHIOPIC SYLLABLE BWA;Lo;0;L;;;;;N;;;;; -1268;ETHIOPIC SYLLABLE VA;Lo;0;L;;;;;N;;;;; -1269;ETHIOPIC SYLLABLE VU;Lo;0;L;;;;;N;;;;; -126A;ETHIOPIC SYLLABLE VI;Lo;0;L;;;;;N;;;;; -126B;ETHIOPIC SYLLABLE VAA;Lo;0;L;;;;;N;;;;; -126C;ETHIOPIC SYLLABLE VEE;Lo;0;L;;;;;N;;;;; -126D;ETHIOPIC SYLLABLE VE;Lo;0;L;;;;;N;;;;; -126E;ETHIOPIC SYLLABLE VO;Lo;0;L;;;;;N;;;;; -126F;ETHIOPIC SYLLABLE VWA;Lo;0;L;;;;;N;;;;; -1270;ETHIOPIC SYLLABLE TA;Lo;0;L;;;;;N;;;;; -1271;ETHIOPIC SYLLABLE TU;Lo;0;L;;;;;N;;;;; -1272;ETHIOPIC SYLLABLE TI;Lo;0;L;;;;;N;;;;; -1273;ETHIOPIC SYLLABLE TAA;Lo;0;L;;;;;N;;;;; -1274;ETHIOPIC SYLLABLE TEE;Lo;0;L;;;;;N;;;;; -1275;ETHIOPIC SYLLABLE TE;Lo;0;L;;;;;N;;;;; -1276;ETHIOPIC SYLLABLE TO;Lo;0;L;;;;;N;;;;; -1277;ETHIOPIC SYLLABLE TWA;Lo;0;L;;;;;N;;;;; -1278;ETHIOPIC SYLLABLE CA;Lo;0;L;;;;;N;;;;; -1279;ETHIOPIC SYLLABLE CU;Lo;0;L;;;;;N;;;;; -127A;ETHIOPIC SYLLABLE CI;Lo;0;L;;;;;N;;;;; -127B;ETHIOPIC SYLLABLE CAA;Lo;0;L;;;;;N;;;;; -127C;ETHIOPIC SYLLABLE CEE;Lo;0;L;;;;;N;;;;; -127D;ETHIOPIC SYLLABLE CE;Lo;0;L;;;;;N;;;;; -127E;ETHIOPIC SYLLABLE CO;Lo;0;L;;;;;N;;;;; -127F;ETHIOPIC SYLLABLE CWA;Lo;0;L;;;;;N;;;;; -1280;ETHIOPIC SYLLABLE XA;Lo;0;L;;;;;N;;;;; -1281;ETHIOPIC SYLLABLE XU;Lo;0;L;;;;;N;;;;; -1282;ETHIOPIC SYLLABLE XI;Lo;0;L;;;;;N;;;;; -1283;ETHIOPIC SYLLABLE XAA;Lo;0;L;;;;;N;;;;; -1284;ETHIOPIC SYLLABLE XEE;Lo;0;L;;;;;N;;;;; -1285;ETHIOPIC SYLLABLE XE;Lo;0;L;;;;;N;;;;; -1286;ETHIOPIC SYLLABLE XO;Lo;0;L;;;;;N;;;;; -1287;ETHIOPIC SYLLABLE XOA;Lo;0;L;;;;;N;;;;; -1288;ETHIOPIC SYLLABLE XWA;Lo;0;L;;;;;N;;;;; -128A;ETHIOPIC SYLLABLE XWI;Lo;0;L;;;;;N;;;;; -128B;ETHIOPIC SYLLABLE XWAA;Lo;0;L;;;;;N;;;;; -128C;ETHIOPIC SYLLABLE XWEE;Lo;0;L;;;;;N;;;;; -128D;ETHIOPIC SYLLABLE XWE;Lo;0;L;;;;;N;;;;; -1290;ETHIOPIC SYLLABLE NA;Lo;0;L;;;;;N;;;;; -1291;ETHIOPIC SYLLABLE NU;Lo;0;L;;;;;N;;;;; -1292;ETHIOPIC SYLLABLE NI;Lo;0;L;;;;;N;;;;; -1293;ETHIOPIC SYLLABLE NAA;Lo;0;L;;;;;N;;;;; -1294;ETHIOPIC SYLLABLE NEE;Lo;0;L;;;;;N;;;;; -1295;ETHIOPIC SYLLABLE NE;Lo;0;L;;;;;N;;;;; -1296;ETHIOPIC SYLLABLE NO;Lo;0;L;;;;;N;;;;; -1297;ETHIOPIC SYLLABLE NWA;Lo;0;L;;;;;N;;;;; -1298;ETHIOPIC SYLLABLE NYA;Lo;0;L;;;;;N;;;;; -1299;ETHIOPIC SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -129A;ETHIOPIC SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -129B;ETHIOPIC SYLLABLE NYAA;Lo;0;L;;;;;N;;;;; -129C;ETHIOPIC SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; -129D;ETHIOPIC SYLLABLE NYE;Lo;0;L;;;;;N;;;;; -129E;ETHIOPIC SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -129F;ETHIOPIC SYLLABLE NYWA;Lo;0;L;;;;;N;;;;; -12A0;ETHIOPIC SYLLABLE GLOTTAL A;Lo;0;L;;;;;N;;;;; -12A1;ETHIOPIC SYLLABLE GLOTTAL U;Lo;0;L;;;;;N;;;;; -12A2;ETHIOPIC SYLLABLE GLOTTAL I;Lo;0;L;;;;;N;;;;; -12A3;ETHIOPIC SYLLABLE GLOTTAL AA;Lo;0;L;;;;;N;;;;; -12A4;ETHIOPIC SYLLABLE GLOTTAL EE;Lo;0;L;;;;;N;;;;; -12A5;ETHIOPIC SYLLABLE GLOTTAL E;Lo;0;L;;;;;N;;;;; -12A6;ETHIOPIC SYLLABLE GLOTTAL O;Lo;0;L;;;;;N;;;;; -12A7;ETHIOPIC SYLLABLE GLOTTAL WA;Lo;0;L;;;;;N;;;;; -12A8;ETHIOPIC SYLLABLE KA;Lo;0;L;;;;;N;;;;; -12A9;ETHIOPIC SYLLABLE KU;Lo;0;L;;;;;N;;;;; -12AA;ETHIOPIC SYLLABLE KI;Lo;0;L;;;;;N;;;;; -12AB;ETHIOPIC SYLLABLE KAA;Lo;0;L;;;;;N;;;;; -12AC;ETHIOPIC SYLLABLE KEE;Lo;0;L;;;;;N;;;;; -12AD;ETHIOPIC SYLLABLE KE;Lo;0;L;;;;;N;;;;; -12AE;ETHIOPIC SYLLABLE KO;Lo;0;L;;;;;N;;;;; -12AF;ETHIOPIC SYLLABLE KOA;Lo;0;L;;;;;N;;;;; -12B0;ETHIOPIC SYLLABLE KWA;Lo;0;L;;;;;N;;;;; -12B2;ETHIOPIC SYLLABLE KWI;Lo;0;L;;;;;N;;;;; -12B3;ETHIOPIC SYLLABLE KWAA;Lo;0;L;;;;;N;;;;; -12B4;ETHIOPIC SYLLABLE KWEE;Lo;0;L;;;;;N;;;;; -12B5;ETHIOPIC SYLLABLE KWE;Lo;0;L;;;;;N;;;;; -12B8;ETHIOPIC SYLLABLE KXA;Lo;0;L;;;;;N;;;;; -12B9;ETHIOPIC SYLLABLE KXU;Lo;0;L;;;;;N;;;;; -12BA;ETHIOPIC SYLLABLE KXI;Lo;0;L;;;;;N;;;;; -12BB;ETHIOPIC SYLLABLE KXAA;Lo;0;L;;;;;N;;;;; -12BC;ETHIOPIC SYLLABLE KXEE;Lo;0;L;;;;;N;;;;; -12BD;ETHIOPIC SYLLABLE KXE;Lo;0;L;;;;;N;;;;; -12BE;ETHIOPIC SYLLABLE KXO;Lo;0;L;;;;;N;;;;; -12C0;ETHIOPIC SYLLABLE KXWA;Lo;0;L;;;;;N;;;;; -12C2;ETHIOPIC SYLLABLE KXWI;Lo;0;L;;;;;N;;;;; -12C3;ETHIOPIC SYLLABLE KXWAA;Lo;0;L;;;;;N;;;;; -12C4;ETHIOPIC SYLLABLE KXWEE;Lo;0;L;;;;;N;;;;; -12C5;ETHIOPIC SYLLABLE KXWE;Lo;0;L;;;;;N;;;;; -12C8;ETHIOPIC SYLLABLE WA;Lo;0;L;;;;;N;;;;; -12C9;ETHIOPIC SYLLABLE WU;Lo;0;L;;;;;N;;;;; -12CA;ETHIOPIC SYLLABLE WI;Lo;0;L;;;;;N;;;;; -12CB;ETHIOPIC SYLLABLE WAA;Lo;0;L;;;;;N;;;;; -12CC;ETHIOPIC SYLLABLE WEE;Lo;0;L;;;;;N;;;;; -12CD;ETHIOPIC SYLLABLE WE;Lo;0;L;;;;;N;;;;; -12CE;ETHIOPIC SYLLABLE WO;Lo;0;L;;;;;N;;;;; -12CF;ETHIOPIC SYLLABLE WOA;Lo;0;L;;;;;N;;;;; -12D0;ETHIOPIC SYLLABLE PHARYNGEAL A;Lo;0;L;;;;;N;;;;; -12D1;ETHIOPIC SYLLABLE PHARYNGEAL U;Lo;0;L;;;;;N;;;;; -12D2;ETHIOPIC SYLLABLE PHARYNGEAL I;Lo;0;L;;;;;N;;;;; -12D3;ETHIOPIC SYLLABLE PHARYNGEAL AA;Lo;0;L;;;;;N;;;;; -12D4;ETHIOPIC SYLLABLE PHARYNGEAL EE;Lo;0;L;;;;;N;;;;; -12D5;ETHIOPIC SYLLABLE PHARYNGEAL E;Lo;0;L;;;;;N;;;;; -12D6;ETHIOPIC SYLLABLE PHARYNGEAL O;Lo;0;L;;;;;N;;;;; -12D8;ETHIOPIC SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -12D9;ETHIOPIC SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -12DA;ETHIOPIC SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -12DB;ETHIOPIC SYLLABLE ZAA;Lo;0;L;;;;;N;;;;; -12DC;ETHIOPIC SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; -12DD;ETHIOPIC SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -12DE;ETHIOPIC SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -12DF;ETHIOPIC SYLLABLE ZWA;Lo;0;L;;;;;N;;;;; -12E0;ETHIOPIC SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -12E1;ETHIOPIC SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -12E2;ETHIOPIC SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; -12E3;ETHIOPIC SYLLABLE ZHAA;Lo;0;L;;;;;N;;;;; -12E4;ETHIOPIC SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; -12E5;ETHIOPIC SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -12E6;ETHIOPIC SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -12E7;ETHIOPIC SYLLABLE ZHWA;Lo;0;L;;;;;N;;;;; -12E8;ETHIOPIC SYLLABLE YA;Lo;0;L;;;;;N;;;;; -12E9;ETHIOPIC SYLLABLE YU;Lo;0;L;;;;;N;;;;; -12EA;ETHIOPIC SYLLABLE YI;Lo;0;L;;;;;N;;;;; -12EB;ETHIOPIC SYLLABLE YAA;Lo;0;L;;;;;N;;;;; -12EC;ETHIOPIC SYLLABLE YEE;Lo;0;L;;;;;N;;;;; -12ED;ETHIOPIC SYLLABLE YE;Lo;0;L;;;;;N;;;;; -12EE;ETHIOPIC SYLLABLE YO;Lo;0;L;;;;;N;;;;; -12EF;ETHIOPIC SYLLABLE YOA;Lo;0;L;;;;;N;;;;; -12F0;ETHIOPIC SYLLABLE DA;Lo;0;L;;;;;N;;;;; -12F1;ETHIOPIC SYLLABLE DU;Lo;0;L;;;;;N;;;;; -12F2;ETHIOPIC SYLLABLE DI;Lo;0;L;;;;;N;;;;; -12F3;ETHIOPIC SYLLABLE DAA;Lo;0;L;;;;;N;;;;; -12F4;ETHIOPIC SYLLABLE DEE;Lo;0;L;;;;;N;;;;; -12F5;ETHIOPIC SYLLABLE DE;Lo;0;L;;;;;N;;;;; -12F6;ETHIOPIC SYLLABLE DO;Lo;0;L;;;;;N;;;;; -12F7;ETHIOPIC SYLLABLE DWA;Lo;0;L;;;;;N;;;;; -12F8;ETHIOPIC SYLLABLE DDA;Lo;0;L;;;;;N;;;;; -12F9;ETHIOPIC SYLLABLE DDU;Lo;0;L;;;;;N;;;;; -12FA;ETHIOPIC SYLLABLE DDI;Lo;0;L;;;;;N;;;;; -12FB;ETHIOPIC SYLLABLE DDAA;Lo;0;L;;;;;N;;;;; -12FC;ETHIOPIC SYLLABLE DDEE;Lo;0;L;;;;;N;;;;; -12FD;ETHIOPIC SYLLABLE DDE;Lo;0;L;;;;;N;;;;; -12FE;ETHIOPIC SYLLABLE DDO;Lo;0;L;;;;;N;;;;; -12FF;ETHIOPIC SYLLABLE DDWA;Lo;0;L;;;;;N;;;;; -1300;ETHIOPIC SYLLABLE JA;Lo;0;L;;;;;N;;;;; -1301;ETHIOPIC SYLLABLE JU;Lo;0;L;;;;;N;;;;; -1302;ETHIOPIC SYLLABLE JI;Lo;0;L;;;;;N;;;;; -1303;ETHIOPIC SYLLABLE JAA;Lo;0;L;;;;;N;;;;; -1304;ETHIOPIC SYLLABLE JEE;Lo;0;L;;;;;N;;;;; -1305;ETHIOPIC SYLLABLE JE;Lo;0;L;;;;;N;;;;; -1306;ETHIOPIC SYLLABLE JO;Lo;0;L;;;;;N;;;;; -1307;ETHIOPIC SYLLABLE JWA;Lo;0;L;;;;;N;;;;; -1308;ETHIOPIC SYLLABLE GA;Lo;0;L;;;;;N;;;;; -1309;ETHIOPIC SYLLABLE GU;Lo;0;L;;;;;N;;;;; -130A;ETHIOPIC SYLLABLE GI;Lo;0;L;;;;;N;;;;; -130B;ETHIOPIC SYLLABLE GAA;Lo;0;L;;;;;N;;;;; -130C;ETHIOPIC SYLLABLE GEE;Lo;0;L;;;;;N;;;;; -130D;ETHIOPIC SYLLABLE GE;Lo;0;L;;;;;N;;;;; -130E;ETHIOPIC SYLLABLE GO;Lo;0;L;;;;;N;;;;; -130F;ETHIOPIC SYLLABLE GOA;Lo;0;L;;;;;N;;;;; -1310;ETHIOPIC SYLLABLE GWA;Lo;0;L;;;;;N;;;;; -1312;ETHIOPIC SYLLABLE GWI;Lo;0;L;;;;;N;;;;; -1313;ETHIOPIC SYLLABLE GWAA;Lo;0;L;;;;;N;;;;; -1314;ETHIOPIC SYLLABLE GWEE;Lo;0;L;;;;;N;;;;; -1315;ETHIOPIC SYLLABLE GWE;Lo;0;L;;;;;N;;;;; -1318;ETHIOPIC SYLLABLE GGA;Lo;0;L;;;;;N;;;;; -1319;ETHIOPIC SYLLABLE GGU;Lo;0;L;;;;;N;;;;; -131A;ETHIOPIC SYLLABLE GGI;Lo;0;L;;;;;N;;;;; -131B;ETHIOPIC SYLLABLE GGAA;Lo;0;L;;;;;N;;;;; -131C;ETHIOPIC SYLLABLE GGEE;Lo;0;L;;;;;N;;;;; -131D;ETHIOPIC SYLLABLE GGE;Lo;0;L;;;;;N;;;;; -131E;ETHIOPIC SYLLABLE GGO;Lo;0;L;;;;;N;;;;; -131F;ETHIOPIC SYLLABLE GGWAA;Lo;0;L;;;;;N;;;;; -1320;ETHIOPIC SYLLABLE THA;Lo;0;L;;;;;N;;;;; -1321;ETHIOPIC SYLLABLE THU;Lo;0;L;;;;;N;;;;; -1322;ETHIOPIC SYLLABLE THI;Lo;0;L;;;;;N;;;;; -1323;ETHIOPIC SYLLABLE THAA;Lo;0;L;;;;;N;;;;; -1324;ETHIOPIC SYLLABLE THEE;Lo;0;L;;;;;N;;;;; -1325;ETHIOPIC SYLLABLE THE;Lo;0;L;;;;;N;;;;; -1326;ETHIOPIC SYLLABLE THO;Lo;0;L;;;;;N;;;;; -1327;ETHIOPIC SYLLABLE THWA;Lo;0;L;;;;;N;;;;; -1328;ETHIOPIC SYLLABLE CHA;Lo;0;L;;;;;N;;;;; -1329;ETHIOPIC SYLLABLE CHU;Lo;0;L;;;;;N;;;;; -132A;ETHIOPIC SYLLABLE CHI;Lo;0;L;;;;;N;;;;; -132B;ETHIOPIC SYLLABLE CHAA;Lo;0;L;;;;;N;;;;; -132C;ETHIOPIC SYLLABLE CHEE;Lo;0;L;;;;;N;;;;; -132D;ETHIOPIC SYLLABLE CHE;Lo;0;L;;;;;N;;;;; -132E;ETHIOPIC SYLLABLE CHO;Lo;0;L;;;;;N;;;;; -132F;ETHIOPIC SYLLABLE CHWA;Lo;0;L;;;;;N;;;;; -1330;ETHIOPIC SYLLABLE PHA;Lo;0;L;;;;;N;;;;; -1331;ETHIOPIC SYLLABLE PHU;Lo;0;L;;;;;N;;;;; -1332;ETHIOPIC SYLLABLE PHI;Lo;0;L;;;;;N;;;;; -1333;ETHIOPIC SYLLABLE PHAA;Lo;0;L;;;;;N;;;;; -1334;ETHIOPIC SYLLABLE PHEE;Lo;0;L;;;;;N;;;;; -1335;ETHIOPIC SYLLABLE PHE;Lo;0;L;;;;;N;;;;; -1336;ETHIOPIC SYLLABLE PHO;Lo;0;L;;;;;N;;;;; -1337;ETHIOPIC SYLLABLE PHWA;Lo;0;L;;;;;N;;;;; -1338;ETHIOPIC SYLLABLE TSA;Lo;0;L;;;;;N;;;;; -1339;ETHIOPIC SYLLABLE TSU;Lo;0;L;;;;;N;;;;; -133A;ETHIOPIC SYLLABLE TSI;Lo;0;L;;;;;N;;;;; -133B;ETHIOPIC SYLLABLE TSAA;Lo;0;L;;;;;N;;;;; -133C;ETHIOPIC SYLLABLE TSEE;Lo;0;L;;;;;N;;;;; -133D;ETHIOPIC SYLLABLE TSE;Lo;0;L;;;;;N;;;;; -133E;ETHIOPIC SYLLABLE TSO;Lo;0;L;;;;;N;;;;; -133F;ETHIOPIC SYLLABLE TSWA;Lo;0;L;;;;;N;;;;; -1340;ETHIOPIC SYLLABLE TZA;Lo;0;L;;;;;N;;;;; -1341;ETHIOPIC SYLLABLE TZU;Lo;0;L;;;;;N;;;;; -1342;ETHIOPIC SYLLABLE TZI;Lo;0;L;;;;;N;;;;; -1343;ETHIOPIC SYLLABLE TZAA;Lo;0;L;;;;;N;;;;; -1344;ETHIOPIC SYLLABLE TZEE;Lo;0;L;;;;;N;;;;; -1345;ETHIOPIC SYLLABLE TZE;Lo;0;L;;;;;N;;;;; -1346;ETHIOPIC SYLLABLE TZO;Lo;0;L;;;;;N;;;;; -1347;ETHIOPIC SYLLABLE TZOA;Lo;0;L;;;;;N;;;;; -1348;ETHIOPIC SYLLABLE FA;Lo;0;L;;;;;N;;;;; -1349;ETHIOPIC SYLLABLE FU;Lo;0;L;;;;;N;;;;; -134A;ETHIOPIC SYLLABLE FI;Lo;0;L;;;;;N;;;;; -134B;ETHIOPIC SYLLABLE FAA;Lo;0;L;;;;;N;;;;; -134C;ETHIOPIC SYLLABLE FEE;Lo;0;L;;;;;N;;;;; -134D;ETHIOPIC SYLLABLE FE;Lo;0;L;;;;;N;;;;; -134E;ETHIOPIC SYLLABLE FO;Lo;0;L;;;;;N;;;;; -134F;ETHIOPIC SYLLABLE FWA;Lo;0;L;;;;;N;;;;; -1350;ETHIOPIC SYLLABLE PA;Lo;0;L;;;;;N;;;;; -1351;ETHIOPIC SYLLABLE PU;Lo;0;L;;;;;N;;;;; -1352;ETHIOPIC SYLLABLE PI;Lo;0;L;;;;;N;;;;; -1353;ETHIOPIC SYLLABLE PAA;Lo;0;L;;;;;N;;;;; -1354;ETHIOPIC SYLLABLE PEE;Lo;0;L;;;;;N;;;;; -1355;ETHIOPIC SYLLABLE PE;Lo;0;L;;;;;N;;;;; -1356;ETHIOPIC SYLLABLE PO;Lo;0;L;;;;;N;;;;; -1357;ETHIOPIC SYLLABLE PWA;Lo;0;L;;;;;N;;;;; -1358;ETHIOPIC SYLLABLE RYA;Lo;0;L;;;;;N;;;;; -1359;ETHIOPIC SYLLABLE MYA;Lo;0;L;;;;;N;;;;; -135A;ETHIOPIC SYLLABLE FYA;Lo;0;L;;;;;N;;;;; -135D;ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; -135E;ETHIOPIC COMBINING VOWEL LENGTH MARK;Mn;230;NSM;;;;;N;;;;; -135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;; -1360;ETHIOPIC SECTION MARK;Po;0;L;;;;;N;;;;; -1361;ETHIOPIC WORDSPACE;Po;0;L;;;;;N;;;;; -1362;ETHIOPIC FULL STOP;Po;0;L;;;;;N;;;;; -1363;ETHIOPIC COMMA;Po;0;L;;;;;N;;;;; -1364;ETHIOPIC SEMICOLON;Po;0;L;;;;;N;;;;; -1365;ETHIOPIC COLON;Po;0;L;;;;;N;;;;; -1366;ETHIOPIC PREFACE COLON;Po;0;L;;;;;N;;;;; -1367;ETHIOPIC QUESTION MARK;Po;0;L;;;;;N;;;;; -1368;ETHIOPIC PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;; -1369;ETHIOPIC DIGIT ONE;No;0;L;;;1;1;N;;;;; -136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;; -136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;; -136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;; -136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;; -136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;; -136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;; -1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;; -1371;ETHIOPIC DIGIT NINE;No;0;L;;;9;9;N;;;;; -1372;ETHIOPIC NUMBER TEN;No;0;L;;;;10;N;;;;; -1373;ETHIOPIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; -1374;ETHIOPIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; -1375;ETHIOPIC NUMBER FORTY;No;0;L;;;;40;N;;;;; -1376;ETHIOPIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; -1377;ETHIOPIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; -1378;ETHIOPIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -1379;ETHIOPIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -137A;ETHIOPIC NUMBER NINETY;No;0;L;;;;90;N;;;;; -137B;ETHIOPIC NUMBER HUNDRED;No;0;L;;;;100;N;;;;; -137C;ETHIOPIC NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; -1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;; -1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;; -1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;; -1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;; -1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;; -1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;; -1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;; -1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;; -1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;; -1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;; -138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;; -138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;; -138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;; -138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;; -138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;; -138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;; -1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;; -1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;; -1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;; -1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;; -1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;; -1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;; -1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;; -1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;; -1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;; -1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;N;;;;; -13A0;CHEROKEE LETTER A;Lu;0;L;;;;;N;;;;AB70; -13A1;CHEROKEE LETTER E;Lu;0;L;;;;;N;;;;AB71; -13A2;CHEROKEE LETTER I;Lu;0;L;;;;;N;;;;AB72; -13A3;CHEROKEE LETTER O;Lu;0;L;;;;;N;;;;AB73; -13A4;CHEROKEE LETTER U;Lu;0;L;;;;;N;;;;AB74; -13A5;CHEROKEE LETTER V;Lu;0;L;;;;;N;;;;AB75; -13A6;CHEROKEE LETTER GA;Lu;0;L;;;;;N;;;;AB76; -13A7;CHEROKEE LETTER KA;Lu;0;L;;;;;N;;;;AB77; -13A8;CHEROKEE LETTER GE;Lu;0;L;;;;;N;;;;AB78; -13A9;CHEROKEE LETTER GI;Lu;0;L;;;;;N;;;;AB79; -13AA;CHEROKEE LETTER GO;Lu;0;L;;;;;N;;;;AB7A; -13AB;CHEROKEE LETTER GU;Lu;0;L;;;;;N;;;;AB7B; -13AC;CHEROKEE LETTER GV;Lu;0;L;;;;;N;;;;AB7C; -13AD;CHEROKEE LETTER HA;Lu;0;L;;;;;N;;;;AB7D; -13AE;CHEROKEE LETTER HE;Lu;0;L;;;;;N;;;;AB7E; -13AF;CHEROKEE LETTER HI;Lu;0;L;;;;;N;;;;AB7F; -13B0;CHEROKEE LETTER HO;Lu;0;L;;;;;N;;;;AB80; -13B1;CHEROKEE LETTER HU;Lu;0;L;;;;;N;;;;AB81; -13B2;CHEROKEE LETTER HV;Lu;0;L;;;;;N;;;;AB82; -13B3;CHEROKEE LETTER LA;Lu;0;L;;;;;N;;;;AB83; -13B4;CHEROKEE LETTER LE;Lu;0;L;;;;;N;;;;AB84; -13B5;CHEROKEE LETTER LI;Lu;0;L;;;;;N;;;;AB85; -13B6;CHEROKEE LETTER LO;Lu;0;L;;;;;N;;;;AB86; -13B7;CHEROKEE LETTER LU;Lu;0;L;;;;;N;;;;AB87; -13B8;CHEROKEE LETTER LV;Lu;0;L;;;;;N;;;;AB88; -13B9;CHEROKEE LETTER MA;Lu;0;L;;;;;N;;;;AB89; -13BA;CHEROKEE LETTER ME;Lu;0;L;;;;;N;;;;AB8A; -13BB;CHEROKEE LETTER MI;Lu;0;L;;;;;N;;;;AB8B; -13BC;CHEROKEE LETTER MO;Lu;0;L;;;;;N;;;;AB8C; -13BD;CHEROKEE LETTER MU;Lu;0;L;;;;;N;;;;AB8D; -13BE;CHEROKEE LETTER NA;Lu;0;L;;;;;N;;;;AB8E; -13BF;CHEROKEE LETTER HNA;Lu;0;L;;;;;N;;;;AB8F; -13C0;CHEROKEE LETTER NAH;Lu;0;L;;;;;N;;;;AB90; -13C1;CHEROKEE LETTER NE;Lu;0;L;;;;;N;;;;AB91; -13C2;CHEROKEE LETTER NI;Lu;0;L;;;;;N;;;;AB92; -13C3;CHEROKEE LETTER NO;Lu;0;L;;;;;N;;;;AB93; -13C4;CHEROKEE LETTER NU;Lu;0;L;;;;;N;;;;AB94; -13C5;CHEROKEE LETTER NV;Lu;0;L;;;;;N;;;;AB95; -13C6;CHEROKEE LETTER QUA;Lu;0;L;;;;;N;;;;AB96; -13C7;CHEROKEE LETTER QUE;Lu;0;L;;;;;N;;;;AB97; -13C8;CHEROKEE LETTER QUI;Lu;0;L;;;;;N;;;;AB98; -13C9;CHEROKEE LETTER QUO;Lu;0;L;;;;;N;;;;AB99; -13CA;CHEROKEE LETTER QUU;Lu;0;L;;;;;N;;;;AB9A; -13CB;CHEROKEE LETTER QUV;Lu;0;L;;;;;N;;;;AB9B; -13CC;CHEROKEE LETTER SA;Lu;0;L;;;;;N;;;;AB9C; -13CD;CHEROKEE LETTER S;Lu;0;L;;;;;N;;;;AB9D; -13CE;CHEROKEE LETTER SE;Lu;0;L;;;;;N;;;;AB9E; -13CF;CHEROKEE LETTER SI;Lu;0;L;;;;;N;;;;AB9F; -13D0;CHEROKEE LETTER SO;Lu;0;L;;;;;N;;;;ABA0; -13D1;CHEROKEE LETTER SU;Lu;0;L;;;;;N;;;;ABA1; -13D2;CHEROKEE LETTER SV;Lu;0;L;;;;;N;;;;ABA2; -13D3;CHEROKEE LETTER DA;Lu;0;L;;;;;N;;;;ABA3; -13D4;CHEROKEE LETTER TA;Lu;0;L;;;;;N;;;;ABA4; -13D5;CHEROKEE LETTER DE;Lu;0;L;;;;;N;;;;ABA5; -13D6;CHEROKEE LETTER TE;Lu;0;L;;;;;N;;;;ABA6; -13D7;CHEROKEE LETTER DI;Lu;0;L;;;;;N;;;;ABA7; -13D8;CHEROKEE LETTER TI;Lu;0;L;;;;;N;;;;ABA8; -13D9;CHEROKEE LETTER DO;Lu;0;L;;;;;N;;;;ABA9; -13DA;CHEROKEE LETTER DU;Lu;0;L;;;;;N;;;;ABAA; -13DB;CHEROKEE LETTER DV;Lu;0;L;;;;;N;;;;ABAB; -13DC;CHEROKEE LETTER DLA;Lu;0;L;;;;;N;;;;ABAC; -13DD;CHEROKEE LETTER TLA;Lu;0;L;;;;;N;;;;ABAD; -13DE;CHEROKEE LETTER TLE;Lu;0;L;;;;;N;;;;ABAE; -13DF;CHEROKEE LETTER TLI;Lu;0;L;;;;;N;;;;ABAF; -13E0;CHEROKEE LETTER TLO;Lu;0;L;;;;;N;;;;ABB0; -13E1;CHEROKEE LETTER TLU;Lu;0;L;;;;;N;;;;ABB1; -13E2;CHEROKEE LETTER TLV;Lu;0;L;;;;;N;;;;ABB2; -13E3;CHEROKEE LETTER TSA;Lu;0;L;;;;;N;;;;ABB3; -13E4;CHEROKEE LETTER TSE;Lu;0;L;;;;;N;;;;ABB4; -13E5;CHEROKEE LETTER TSI;Lu;0;L;;;;;N;;;;ABB5; -13E6;CHEROKEE LETTER TSO;Lu;0;L;;;;;N;;;;ABB6; -13E7;CHEROKEE LETTER TSU;Lu;0;L;;;;;N;;;;ABB7; -13E8;CHEROKEE LETTER TSV;Lu;0;L;;;;;N;;;;ABB8; -13E9;CHEROKEE LETTER WA;Lu;0;L;;;;;N;;;;ABB9; -13EA;CHEROKEE LETTER WE;Lu;0;L;;;;;N;;;;ABBA; -13EB;CHEROKEE LETTER WI;Lu;0;L;;;;;N;;;;ABBB; -13EC;CHEROKEE LETTER WO;Lu;0;L;;;;;N;;;;ABBC; -13ED;CHEROKEE LETTER WU;Lu;0;L;;;;;N;;;;ABBD; -13EE;CHEROKEE LETTER WV;Lu;0;L;;;;;N;;;;ABBE; -13EF;CHEROKEE LETTER YA;Lu;0;L;;;;;N;;;;ABBF; -13F0;CHEROKEE LETTER YE;Lu;0;L;;;;;N;;;;13F8; -13F1;CHEROKEE LETTER YI;Lu;0;L;;;;;N;;;;13F9; -13F2;CHEROKEE LETTER YO;Lu;0;L;;;;;N;;;;13FA; -13F3;CHEROKEE LETTER YU;Lu;0;L;;;;;N;;;;13FB; -13F4;CHEROKEE LETTER YV;Lu;0;L;;;;;N;;;;13FC; -13F5;CHEROKEE LETTER MV;Lu;0;L;;;;;N;;;;13FD; -13F8;CHEROKEE SMALL LETTER YE;Ll;0;L;;;;;N;;;13F0;;13F0 -13F9;CHEROKEE SMALL LETTER YI;Ll;0;L;;;;;N;;;13F1;;13F1 -13FA;CHEROKEE SMALL LETTER YO;Ll;0;L;;;;;N;;;13F2;;13F2 -13FB;CHEROKEE SMALL LETTER YU;Ll;0;L;;;;;N;;;13F3;;13F3 -13FC;CHEROKEE SMALL LETTER YV;Ll;0;L;;;;;N;;;13F4;;13F4 -13FD;CHEROKEE SMALL LETTER MV;Ll;0;L;;;;;N;;;13F5;;13F5 -1400;CANADIAN SYLLABICS HYPHEN;Pd;0;ON;;;;;N;;;;; -1401;CANADIAN SYLLABICS E;Lo;0;L;;;;;N;;;;; -1402;CANADIAN SYLLABICS AAI;Lo;0;L;;;;;N;;;;; -1403;CANADIAN SYLLABICS I;Lo;0;L;;;;;N;;;;; -1404;CANADIAN SYLLABICS II;Lo;0;L;;;;;N;;;;; -1405;CANADIAN SYLLABICS O;Lo;0;L;;;;;N;;;;; -1406;CANADIAN SYLLABICS OO;Lo;0;L;;;;;N;;;;; -1407;CANADIAN SYLLABICS Y-CREE OO;Lo;0;L;;;;;N;;;;; -1408;CANADIAN SYLLABICS CARRIER EE;Lo;0;L;;;;;N;;;;; -1409;CANADIAN SYLLABICS CARRIER I;Lo;0;L;;;;;N;;;;; -140A;CANADIAN SYLLABICS A;Lo;0;L;;;;;N;;;;; -140B;CANADIAN SYLLABICS AA;Lo;0;L;;;;;N;;;;; -140C;CANADIAN SYLLABICS WE;Lo;0;L;;;;;N;;;;; -140D;CANADIAN SYLLABICS WEST-CREE WE;Lo;0;L;;;;;N;;;;; -140E;CANADIAN SYLLABICS WI;Lo;0;L;;;;;N;;;;; -140F;CANADIAN SYLLABICS WEST-CREE WI;Lo;0;L;;;;;N;;;;; -1410;CANADIAN SYLLABICS WII;Lo;0;L;;;;;N;;;;; -1411;CANADIAN SYLLABICS WEST-CREE WII;Lo;0;L;;;;;N;;;;; -1412;CANADIAN SYLLABICS WO;Lo;0;L;;;;;N;;;;; -1413;CANADIAN SYLLABICS WEST-CREE WO;Lo;0;L;;;;;N;;;;; -1414;CANADIAN SYLLABICS WOO;Lo;0;L;;;;;N;;;;; -1415;CANADIAN SYLLABICS WEST-CREE WOO;Lo;0;L;;;;;N;;;;; -1416;CANADIAN SYLLABICS NASKAPI WOO;Lo;0;L;;;;;N;;;;; -1417;CANADIAN SYLLABICS WA;Lo;0;L;;;;;N;;;;; -1418;CANADIAN SYLLABICS WEST-CREE WA;Lo;0;L;;;;;N;;;;; -1419;CANADIAN SYLLABICS WAA;Lo;0;L;;;;;N;;;;; -141A;CANADIAN SYLLABICS WEST-CREE WAA;Lo;0;L;;;;;N;;;;; -141B;CANADIAN SYLLABICS NASKAPI WAA;Lo;0;L;;;;;N;;;;; -141C;CANADIAN SYLLABICS AI;Lo;0;L;;;;;N;;;;; -141D;CANADIAN SYLLABICS Y-CREE W;Lo;0;L;;;;;N;;;;; -141E;CANADIAN SYLLABICS GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -141F;CANADIAN SYLLABICS FINAL ACUTE;Lo;0;L;;;;;N;;;;; -1420;CANADIAN SYLLABICS FINAL GRAVE;Lo;0;L;;;;;N;;;;; -1421;CANADIAN SYLLABICS FINAL BOTTOM HALF RING;Lo;0;L;;;;;N;;;;; -1422;CANADIAN SYLLABICS FINAL TOP HALF RING;Lo;0;L;;;;;N;;;;; -1423;CANADIAN SYLLABICS FINAL RIGHT HALF RING;Lo;0;L;;;;;N;;;;; -1424;CANADIAN SYLLABICS FINAL RING;Lo;0;L;;;;;N;;;;; -1425;CANADIAN SYLLABICS FINAL DOUBLE ACUTE;Lo;0;L;;;;;N;;;;; -1426;CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES;Lo;0;L;;;;;N;;;;; -1427;CANADIAN SYLLABICS FINAL MIDDLE DOT;Lo;0;L;;;;;N;;;;; -1428;CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE;Lo;0;L;;;;;N;;;;; -1429;CANADIAN SYLLABICS FINAL PLUS;Lo;0;L;;;;;N;;;;; -142A;CANADIAN SYLLABICS FINAL DOWN TACK;Lo;0;L;;;;;N;;;;; -142B;CANADIAN SYLLABICS EN;Lo;0;L;;;;;N;;;;; -142C;CANADIAN SYLLABICS IN;Lo;0;L;;;;;N;;;;; -142D;CANADIAN SYLLABICS ON;Lo;0;L;;;;;N;;;;; -142E;CANADIAN SYLLABICS AN;Lo;0;L;;;;;N;;;;; -142F;CANADIAN SYLLABICS PE;Lo;0;L;;;;;N;;;;; -1430;CANADIAN SYLLABICS PAAI;Lo;0;L;;;;;N;;;;; -1431;CANADIAN SYLLABICS PI;Lo;0;L;;;;;N;;;;; -1432;CANADIAN SYLLABICS PII;Lo;0;L;;;;;N;;;;; -1433;CANADIAN SYLLABICS PO;Lo;0;L;;;;;N;;;;; -1434;CANADIAN SYLLABICS POO;Lo;0;L;;;;;N;;;;; -1435;CANADIAN SYLLABICS Y-CREE POO;Lo;0;L;;;;;N;;;;; -1436;CANADIAN SYLLABICS CARRIER HEE;Lo;0;L;;;;;N;;;;; -1437;CANADIAN SYLLABICS CARRIER HI;Lo;0;L;;;;;N;;;;; -1438;CANADIAN SYLLABICS PA;Lo;0;L;;;;;N;;;;; -1439;CANADIAN SYLLABICS PAA;Lo;0;L;;;;;N;;;;; -143A;CANADIAN SYLLABICS PWE;Lo;0;L;;;;;N;;;;; -143B;CANADIAN SYLLABICS WEST-CREE PWE;Lo;0;L;;;;;N;;;;; -143C;CANADIAN SYLLABICS PWI;Lo;0;L;;;;;N;;;;; -143D;CANADIAN SYLLABICS WEST-CREE PWI;Lo;0;L;;;;;N;;;;; -143E;CANADIAN SYLLABICS PWII;Lo;0;L;;;;;N;;;;; -143F;CANADIAN SYLLABICS WEST-CREE PWII;Lo;0;L;;;;;N;;;;; -1440;CANADIAN SYLLABICS PWO;Lo;0;L;;;;;N;;;;; -1441;CANADIAN SYLLABICS WEST-CREE PWO;Lo;0;L;;;;;N;;;;; -1442;CANADIAN SYLLABICS PWOO;Lo;0;L;;;;;N;;;;; -1443;CANADIAN SYLLABICS WEST-CREE PWOO;Lo;0;L;;;;;N;;;;; -1444;CANADIAN SYLLABICS PWA;Lo;0;L;;;;;N;;;;; -1445;CANADIAN SYLLABICS WEST-CREE PWA;Lo;0;L;;;;;N;;;;; -1446;CANADIAN SYLLABICS PWAA;Lo;0;L;;;;;N;;;;; -1447;CANADIAN SYLLABICS WEST-CREE PWAA;Lo;0;L;;;;;N;;;;; -1448;CANADIAN SYLLABICS Y-CREE PWAA;Lo;0;L;;;;;N;;;;; -1449;CANADIAN SYLLABICS P;Lo;0;L;;;;;N;;;;; -144A;CANADIAN SYLLABICS WEST-CREE P;Lo;0;L;;;;;N;;;;; -144B;CANADIAN SYLLABICS CARRIER H;Lo;0;L;;;;;N;;;;; -144C;CANADIAN SYLLABICS TE;Lo;0;L;;;;;N;;;;; -144D;CANADIAN SYLLABICS TAAI;Lo;0;L;;;;;N;;;;; -144E;CANADIAN SYLLABICS TI;Lo;0;L;;;;;N;;;;; -144F;CANADIAN SYLLABICS TII;Lo;0;L;;;;;N;;;;; -1450;CANADIAN SYLLABICS TO;Lo;0;L;;;;;N;;;;; -1451;CANADIAN SYLLABICS TOO;Lo;0;L;;;;;N;;;;; -1452;CANADIAN SYLLABICS Y-CREE TOO;Lo;0;L;;;;;N;;;;; -1453;CANADIAN SYLLABICS CARRIER DEE;Lo;0;L;;;;;N;;;;; -1454;CANADIAN SYLLABICS CARRIER DI;Lo;0;L;;;;;N;;;;; -1455;CANADIAN SYLLABICS TA;Lo;0;L;;;;;N;;;;; -1456;CANADIAN SYLLABICS TAA;Lo;0;L;;;;;N;;;;; -1457;CANADIAN SYLLABICS TWE;Lo;0;L;;;;;N;;;;; -1458;CANADIAN SYLLABICS WEST-CREE TWE;Lo;0;L;;;;;N;;;;; -1459;CANADIAN SYLLABICS TWI;Lo;0;L;;;;;N;;;;; -145A;CANADIAN SYLLABICS WEST-CREE TWI;Lo;0;L;;;;;N;;;;; -145B;CANADIAN SYLLABICS TWII;Lo;0;L;;;;;N;;;;; -145C;CANADIAN SYLLABICS WEST-CREE TWII;Lo;0;L;;;;;N;;;;; -145D;CANADIAN SYLLABICS TWO;Lo;0;L;;;;;N;;;;; -145E;CANADIAN SYLLABICS WEST-CREE TWO;Lo;0;L;;;;;N;;;;; -145F;CANADIAN SYLLABICS TWOO;Lo;0;L;;;;;N;;;;; -1460;CANADIAN SYLLABICS WEST-CREE TWOO;Lo;0;L;;;;;N;;;;; -1461;CANADIAN SYLLABICS TWA;Lo;0;L;;;;;N;;;;; -1462;CANADIAN SYLLABICS WEST-CREE TWA;Lo;0;L;;;;;N;;;;; -1463;CANADIAN SYLLABICS TWAA;Lo;0;L;;;;;N;;;;; -1464;CANADIAN SYLLABICS WEST-CREE TWAA;Lo;0;L;;;;;N;;;;; -1465;CANADIAN SYLLABICS NASKAPI TWAA;Lo;0;L;;;;;N;;;;; -1466;CANADIAN SYLLABICS T;Lo;0;L;;;;;N;;;;; -1467;CANADIAN SYLLABICS TTE;Lo;0;L;;;;;N;;;;; -1468;CANADIAN SYLLABICS TTI;Lo;0;L;;;;;N;;;;; -1469;CANADIAN SYLLABICS TTO;Lo;0;L;;;;;N;;;;; -146A;CANADIAN SYLLABICS TTA;Lo;0;L;;;;;N;;;;; -146B;CANADIAN SYLLABICS KE;Lo;0;L;;;;;N;;;;; -146C;CANADIAN SYLLABICS KAAI;Lo;0;L;;;;;N;;;;; -146D;CANADIAN SYLLABICS KI;Lo;0;L;;;;;N;;;;; -146E;CANADIAN SYLLABICS KII;Lo;0;L;;;;;N;;;;; -146F;CANADIAN SYLLABICS KO;Lo;0;L;;;;;N;;;;; -1470;CANADIAN SYLLABICS KOO;Lo;0;L;;;;;N;;;;; -1471;CANADIAN SYLLABICS Y-CREE KOO;Lo;0;L;;;;;N;;;;; -1472;CANADIAN SYLLABICS KA;Lo;0;L;;;;;N;;;;; -1473;CANADIAN SYLLABICS KAA;Lo;0;L;;;;;N;;;;; -1474;CANADIAN SYLLABICS KWE;Lo;0;L;;;;;N;;;;; -1475;CANADIAN SYLLABICS WEST-CREE KWE;Lo;0;L;;;;;N;;;;; -1476;CANADIAN SYLLABICS KWI;Lo;0;L;;;;;N;;;;; -1477;CANADIAN SYLLABICS WEST-CREE KWI;Lo;0;L;;;;;N;;;;; -1478;CANADIAN SYLLABICS KWII;Lo;0;L;;;;;N;;;;; -1479;CANADIAN SYLLABICS WEST-CREE KWII;Lo;0;L;;;;;N;;;;; -147A;CANADIAN SYLLABICS KWO;Lo;0;L;;;;;N;;;;; -147B;CANADIAN SYLLABICS WEST-CREE KWO;Lo;0;L;;;;;N;;;;; -147C;CANADIAN SYLLABICS KWOO;Lo;0;L;;;;;N;;;;; -147D;CANADIAN SYLLABICS WEST-CREE KWOO;Lo;0;L;;;;;N;;;;; -147E;CANADIAN SYLLABICS KWA;Lo;0;L;;;;;N;;;;; -147F;CANADIAN SYLLABICS WEST-CREE KWA;Lo;0;L;;;;;N;;;;; -1480;CANADIAN SYLLABICS KWAA;Lo;0;L;;;;;N;;;;; -1481;CANADIAN SYLLABICS WEST-CREE KWAA;Lo;0;L;;;;;N;;;;; -1482;CANADIAN SYLLABICS NASKAPI KWAA;Lo;0;L;;;;;N;;;;; -1483;CANADIAN SYLLABICS K;Lo;0;L;;;;;N;;;;; -1484;CANADIAN SYLLABICS KW;Lo;0;L;;;;;N;;;;; -1485;CANADIAN SYLLABICS SOUTH-SLAVEY KEH;Lo;0;L;;;;;N;;;;; -1486;CANADIAN SYLLABICS SOUTH-SLAVEY KIH;Lo;0;L;;;;;N;;;;; -1487;CANADIAN SYLLABICS SOUTH-SLAVEY KOH;Lo;0;L;;;;;N;;;;; -1488;CANADIAN SYLLABICS SOUTH-SLAVEY KAH;Lo;0;L;;;;;N;;;;; -1489;CANADIAN SYLLABICS CE;Lo;0;L;;;;;N;;;;; -148A;CANADIAN SYLLABICS CAAI;Lo;0;L;;;;;N;;;;; -148B;CANADIAN SYLLABICS CI;Lo;0;L;;;;;N;;;;; -148C;CANADIAN SYLLABICS CII;Lo;0;L;;;;;N;;;;; -148D;CANADIAN SYLLABICS CO;Lo;0;L;;;;;N;;;;; -148E;CANADIAN SYLLABICS COO;Lo;0;L;;;;;N;;;;; -148F;CANADIAN SYLLABICS Y-CREE COO;Lo;0;L;;;;;N;;;;; -1490;CANADIAN SYLLABICS CA;Lo;0;L;;;;;N;;;;; -1491;CANADIAN SYLLABICS CAA;Lo;0;L;;;;;N;;;;; -1492;CANADIAN SYLLABICS CWE;Lo;0;L;;;;;N;;;;; -1493;CANADIAN SYLLABICS WEST-CREE CWE;Lo;0;L;;;;;N;;;;; -1494;CANADIAN SYLLABICS CWI;Lo;0;L;;;;;N;;;;; -1495;CANADIAN SYLLABICS WEST-CREE CWI;Lo;0;L;;;;;N;;;;; -1496;CANADIAN SYLLABICS CWII;Lo;0;L;;;;;N;;;;; -1497;CANADIAN SYLLABICS WEST-CREE CWII;Lo;0;L;;;;;N;;;;; -1498;CANADIAN SYLLABICS CWO;Lo;0;L;;;;;N;;;;; -1499;CANADIAN SYLLABICS WEST-CREE CWO;Lo;0;L;;;;;N;;;;; -149A;CANADIAN SYLLABICS CWOO;Lo;0;L;;;;;N;;;;; -149B;CANADIAN SYLLABICS WEST-CREE CWOO;Lo;0;L;;;;;N;;;;; -149C;CANADIAN SYLLABICS CWA;Lo;0;L;;;;;N;;;;; -149D;CANADIAN SYLLABICS WEST-CREE CWA;Lo;0;L;;;;;N;;;;; -149E;CANADIAN SYLLABICS CWAA;Lo;0;L;;;;;N;;;;; -149F;CANADIAN SYLLABICS WEST-CREE CWAA;Lo;0;L;;;;;N;;;;; -14A0;CANADIAN SYLLABICS NASKAPI CWAA;Lo;0;L;;;;;N;;;;; -14A1;CANADIAN SYLLABICS C;Lo;0;L;;;;;N;;;;; -14A2;CANADIAN SYLLABICS SAYISI TH;Lo;0;L;;;;;N;;;;; -14A3;CANADIAN SYLLABICS ME;Lo;0;L;;;;;N;;;;; -14A4;CANADIAN SYLLABICS MAAI;Lo;0;L;;;;;N;;;;; -14A5;CANADIAN SYLLABICS MI;Lo;0;L;;;;;N;;;;; -14A6;CANADIAN SYLLABICS MII;Lo;0;L;;;;;N;;;;; -14A7;CANADIAN SYLLABICS MO;Lo;0;L;;;;;N;;;;; -14A8;CANADIAN SYLLABICS MOO;Lo;0;L;;;;;N;;;;; -14A9;CANADIAN SYLLABICS Y-CREE MOO;Lo;0;L;;;;;N;;;;; -14AA;CANADIAN SYLLABICS MA;Lo;0;L;;;;;N;;;;; -14AB;CANADIAN SYLLABICS MAA;Lo;0;L;;;;;N;;;;; -14AC;CANADIAN SYLLABICS MWE;Lo;0;L;;;;;N;;;;; -14AD;CANADIAN SYLLABICS WEST-CREE MWE;Lo;0;L;;;;;N;;;;; -14AE;CANADIAN SYLLABICS MWI;Lo;0;L;;;;;N;;;;; -14AF;CANADIAN SYLLABICS WEST-CREE MWI;Lo;0;L;;;;;N;;;;; -14B0;CANADIAN SYLLABICS MWII;Lo;0;L;;;;;N;;;;; -14B1;CANADIAN SYLLABICS WEST-CREE MWII;Lo;0;L;;;;;N;;;;; -14B2;CANADIAN SYLLABICS MWO;Lo;0;L;;;;;N;;;;; -14B3;CANADIAN SYLLABICS WEST-CREE MWO;Lo;0;L;;;;;N;;;;; -14B4;CANADIAN SYLLABICS MWOO;Lo;0;L;;;;;N;;;;; -14B5;CANADIAN SYLLABICS WEST-CREE MWOO;Lo;0;L;;;;;N;;;;; -14B6;CANADIAN SYLLABICS MWA;Lo;0;L;;;;;N;;;;; -14B7;CANADIAN SYLLABICS WEST-CREE MWA;Lo;0;L;;;;;N;;;;; -14B8;CANADIAN SYLLABICS MWAA;Lo;0;L;;;;;N;;;;; -14B9;CANADIAN SYLLABICS WEST-CREE MWAA;Lo;0;L;;;;;N;;;;; -14BA;CANADIAN SYLLABICS NASKAPI MWAA;Lo;0;L;;;;;N;;;;; -14BB;CANADIAN SYLLABICS M;Lo;0;L;;;;;N;;;;; -14BC;CANADIAN SYLLABICS WEST-CREE M;Lo;0;L;;;;;N;;;;; -14BD;CANADIAN SYLLABICS MH;Lo;0;L;;;;;N;;;;; -14BE;CANADIAN SYLLABICS ATHAPASCAN M;Lo;0;L;;;;;N;;;;; -14BF;CANADIAN SYLLABICS SAYISI M;Lo;0;L;;;;;N;;;;; -14C0;CANADIAN SYLLABICS NE;Lo;0;L;;;;;N;;;;; -14C1;CANADIAN SYLLABICS NAAI;Lo;0;L;;;;;N;;;;; -14C2;CANADIAN SYLLABICS NI;Lo;0;L;;;;;N;;;;; -14C3;CANADIAN SYLLABICS NII;Lo;0;L;;;;;N;;;;; -14C4;CANADIAN SYLLABICS NO;Lo;0;L;;;;;N;;;;; -14C5;CANADIAN SYLLABICS NOO;Lo;0;L;;;;;N;;;;; -14C6;CANADIAN SYLLABICS Y-CREE NOO;Lo;0;L;;;;;N;;;;; -14C7;CANADIAN SYLLABICS NA;Lo;0;L;;;;;N;;;;; -14C8;CANADIAN SYLLABICS NAA;Lo;0;L;;;;;N;;;;; -14C9;CANADIAN SYLLABICS NWE;Lo;0;L;;;;;N;;;;; -14CA;CANADIAN SYLLABICS WEST-CREE NWE;Lo;0;L;;;;;N;;;;; -14CB;CANADIAN SYLLABICS NWA;Lo;0;L;;;;;N;;;;; -14CC;CANADIAN SYLLABICS WEST-CREE NWA;Lo;0;L;;;;;N;;;;; -14CD;CANADIAN SYLLABICS NWAA;Lo;0;L;;;;;N;;;;; -14CE;CANADIAN SYLLABICS WEST-CREE NWAA;Lo;0;L;;;;;N;;;;; -14CF;CANADIAN SYLLABICS NASKAPI NWAA;Lo;0;L;;;;;N;;;;; -14D0;CANADIAN SYLLABICS N;Lo;0;L;;;;;N;;;;; -14D1;CANADIAN SYLLABICS CARRIER NG;Lo;0;L;;;;;N;;;;; -14D2;CANADIAN SYLLABICS NH;Lo;0;L;;;;;N;;;;; -14D3;CANADIAN SYLLABICS LE;Lo;0;L;;;;;N;;;;; -14D4;CANADIAN SYLLABICS LAAI;Lo;0;L;;;;;N;;;;; -14D5;CANADIAN SYLLABICS LI;Lo;0;L;;;;;N;;;;; -14D6;CANADIAN SYLLABICS LII;Lo;0;L;;;;;N;;;;; -14D7;CANADIAN SYLLABICS LO;Lo;0;L;;;;;N;;;;; -14D8;CANADIAN SYLLABICS LOO;Lo;0;L;;;;;N;;;;; -14D9;CANADIAN SYLLABICS Y-CREE LOO;Lo;0;L;;;;;N;;;;; -14DA;CANADIAN SYLLABICS LA;Lo;0;L;;;;;N;;;;; -14DB;CANADIAN SYLLABICS LAA;Lo;0;L;;;;;N;;;;; -14DC;CANADIAN SYLLABICS LWE;Lo;0;L;;;;;N;;;;; -14DD;CANADIAN SYLLABICS WEST-CREE LWE;Lo;0;L;;;;;N;;;;; -14DE;CANADIAN SYLLABICS LWI;Lo;0;L;;;;;N;;;;; -14DF;CANADIAN SYLLABICS WEST-CREE LWI;Lo;0;L;;;;;N;;;;; -14E0;CANADIAN SYLLABICS LWII;Lo;0;L;;;;;N;;;;; -14E1;CANADIAN SYLLABICS WEST-CREE LWII;Lo;0;L;;;;;N;;;;; -14E2;CANADIAN SYLLABICS LWO;Lo;0;L;;;;;N;;;;; -14E3;CANADIAN SYLLABICS WEST-CREE LWO;Lo;0;L;;;;;N;;;;; -14E4;CANADIAN SYLLABICS LWOO;Lo;0;L;;;;;N;;;;; -14E5;CANADIAN SYLLABICS WEST-CREE LWOO;Lo;0;L;;;;;N;;;;; -14E6;CANADIAN SYLLABICS LWA;Lo;0;L;;;;;N;;;;; -14E7;CANADIAN SYLLABICS WEST-CREE LWA;Lo;0;L;;;;;N;;;;; -14E8;CANADIAN SYLLABICS LWAA;Lo;0;L;;;;;N;;;;; -14E9;CANADIAN SYLLABICS WEST-CREE LWAA;Lo;0;L;;;;;N;;;;; -14EA;CANADIAN SYLLABICS L;Lo;0;L;;;;;N;;;;; -14EB;CANADIAN SYLLABICS WEST-CREE L;Lo;0;L;;;;;N;;;;; -14EC;CANADIAN SYLLABICS MEDIAL L;Lo;0;L;;;;;N;;;;; -14ED;CANADIAN SYLLABICS SE;Lo;0;L;;;;;N;;;;; -14EE;CANADIAN SYLLABICS SAAI;Lo;0;L;;;;;N;;;;; -14EF;CANADIAN SYLLABICS SI;Lo;0;L;;;;;N;;;;; -14F0;CANADIAN SYLLABICS SII;Lo;0;L;;;;;N;;;;; -14F1;CANADIAN SYLLABICS SO;Lo;0;L;;;;;N;;;;; -14F2;CANADIAN SYLLABICS SOO;Lo;0;L;;;;;N;;;;; -14F3;CANADIAN SYLLABICS Y-CREE SOO;Lo;0;L;;;;;N;;;;; -14F4;CANADIAN SYLLABICS SA;Lo;0;L;;;;;N;;;;; -14F5;CANADIAN SYLLABICS SAA;Lo;0;L;;;;;N;;;;; -14F6;CANADIAN SYLLABICS SWE;Lo;0;L;;;;;N;;;;; -14F7;CANADIAN SYLLABICS WEST-CREE SWE;Lo;0;L;;;;;N;;;;; -14F8;CANADIAN SYLLABICS SWI;Lo;0;L;;;;;N;;;;; -14F9;CANADIAN SYLLABICS WEST-CREE SWI;Lo;0;L;;;;;N;;;;; -14FA;CANADIAN SYLLABICS SWII;Lo;0;L;;;;;N;;;;; -14FB;CANADIAN SYLLABICS WEST-CREE SWII;Lo;0;L;;;;;N;;;;; -14FC;CANADIAN SYLLABICS SWO;Lo;0;L;;;;;N;;;;; -14FD;CANADIAN SYLLABICS WEST-CREE SWO;Lo;0;L;;;;;N;;;;; -14FE;CANADIAN SYLLABICS SWOO;Lo;0;L;;;;;N;;;;; -14FF;CANADIAN SYLLABICS WEST-CREE SWOO;Lo;0;L;;;;;N;;;;; -1500;CANADIAN SYLLABICS SWA;Lo;0;L;;;;;N;;;;; -1501;CANADIAN SYLLABICS WEST-CREE SWA;Lo;0;L;;;;;N;;;;; -1502;CANADIAN SYLLABICS SWAA;Lo;0;L;;;;;N;;;;; -1503;CANADIAN SYLLABICS WEST-CREE SWAA;Lo;0;L;;;;;N;;;;; -1504;CANADIAN SYLLABICS NASKAPI SWAA;Lo;0;L;;;;;N;;;;; -1505;CANADIAN SYLLABICS S;Lo;0;L;;;;;N;;;;; -1506;CANADIAN SYLLABICS ATHAPASCAN S;Lo;0;L;;;;;N;;;;; -1507;CANADIAN SYLLABICS SW;Lo;0;L;;;;;N;;;;; -1508;CANADIAN SYLLABICS BLACKFOOT S;Lo;0;L;;;;;N;;;;; -1509;CANADIAN SYLLABICS MOOSE-CREE SK;Lo;0;L;;;;;N;;;;; -150A;CANADIAN SYLLABICS NASKAPI SKW;Lo;0;L;;;;;N;;;;; -150B;CANADIAN SYLLABICS NASKAPI S-W;Lo;0;L;;;;;N;;;;; -150C;CANADIAN SYLLABICS NASKAPI SPWA;Lo;0;L;;;;;N;;;;; -150D;CANADIAN SYLLABICS NASKAPI STWA;Lo;0;L;;;;;N;;;;; -150E;CANADIAN SYLLABICS NASKAPI SKWA;Lo;0;L;;;;;N;;;;; -150F;CANADIAN SYLLABICS NASKAPI SCWA;Lo;0;L;;;;;N;;;;; -1510;CANADIAN SYLLABICS SHE;Lo;0;L;;;;;N;;;;; -1511;CANADIAN SYLLABICS SHI;Lo;0;L;;;;;N;;;;; -1512;CANADIAN SYLLABICS SHII;Lo;0;L;;;;;N;;;;; -1513;CANADIAN SYLLABICS SHO;Lo;0;L;;;;;N;;;;; -1514;CANADIAN SYLLABICS SHOO;Lo;0;L;;;;;N;;;;; -1515;CANADIAN SYLLABICS SHA;Lo;0;L;;;;;N;;;;; -1516;CANADIAN SYLLABICS SHAA;Lo;0;L;;;;;N;;;;; -1517;CANADIAN SYLLABICS SHWE;Lo;0;L;;;;;N;;;;; -1518;CANADIAN SYLLABICS WEST-CREE SHWE;Lo;0;L;;;;;N;;;;; -1519;CANADIAN SYLLABICS SHWI;Lo;0;L;;;;;N;;;;; -151A;CANADIAN SYLLABICS WEST-CREE SHWI;Lo;0;L;;;;;N;;;;; -151B;CANADIAN SYLLABICS SHWII;Lo;0;L;;;;;N;;;;; -151C;CANADIAN SYLLABICS WEST-CREE SHWII;Lo;0;L;;;;;N;;;;; -151D;CANADIAN SYLLABICS SHWO;Lo;0;L;;;;;N;;;;; -151E;CANADIAN SYLLABICS WEST-CREE SHWO;Lo;0;L;;;;;N;;;;; -151F;CANADIAN SYLLABICS SHWOO;Lo;0;L;;;;;N;;;;; -1520;CANADIAN SYLLABICS WEST-CREE SHWOO;Lo;0;L;;;;;N;;;;; -1521;CANADIAN SYLLABICS SHWA;Lo;0;L;;;;;N;;;;; -1522;CANADIAN SYLLABICS WEST-CREE SHWA;Lo;0;L;;;;;N;;;;; -1523;CANADIAN SYLLABICS SHWAA;Lo;0;L;;;;;N;;;;; -1524;CANADIAN SYLLABICS WEST-CREE SHWAA;Lo;0;L;;;;;N;;;;; -1525;CANADIAN SYLLABICS SH;Lo;0;L;;;;;N;;;;; -1526;CANADIAN SYLLABICS YE;Lo;0;L;;;;;N;;;;; -1527;CANADIAN SYLLABICS YAAI;Lo;0;L;;;;;N;;;;; -1528;CANADIAN SYLLABICS YI;Lo;0;L;;;;;N;;;;; -1529;CANADIAN SYLLABICS YII;Lo;0;L;;;;;N;;;;; -152A;CANADIAN SYLLABICS YO;Lo;0;L;;;;;N;;;;; -152B;CANADIAN SYLLABICS YOO;Lo;0;L;;;;;N;;;;; -152C;CANADIAN SYLLABICS Y-CREE YOO;Lo;0;L;;;;;N;;;;; -152D;CANADIAN SYLLABICS YA;Lo;0;L;;;;;N;;;;; -152E;CANADIAN SYLLABICS YAA;Lo;0;L;;;;;N;;;;; -152F;CANADIAN SYLLABICS YWE;Lo;0;L;;;;;N;;;;; -1530;CANADIAN SYLLABICS WEST-CREE YWE;Lo;0;L;;;;;N;;;;; -1531;CANADIAN SYLLABICS YWI;Lo;0;L;;;;;N;;;;; -1532;CANADIAN SYLLABICS WEST-CREE YWI;Lo;0;L;;;;;N;;;;; -1533;CANADIAN SYLLABICS YWII;Lo;0;L;;;;;N;;;;; -1534;CANADIAN SYLLABICS WEST-CREE YWII;Lo;0;L;;;;;N;;;;; -1535;CANADIAN SYLLABICS YWO;Lo;0;L;;;;;N;;;;; -1536;CANADIAN SYLLABICS WEST-CREE YWO;Lo;0;L;;;;;N;;;;; -1537;CANADIAN SYLLABICS YWOO;Lo;0;L;;;;;N;;;;; -1538;CANADIAN SYLLABICS WEST-CREE YWOO;Lo;0;L;;;;;N;;;;; -1539;CANADIAN SYLLABICS YWA;Lo;0;L;;;;;N;;;;; -153A;CANADIAN SYLLABICS WEST-CREE YWA;Lo;0;L;;;;;N;;;;; -153B;CANADIAN SYLLABICS YWAA;Lo;0;L;;;;;N;;;;; -153C;CANADIAN SYLLABICS WEST-CREE YWAA;Lo;0;L;;;;;N;;;;; -153D;CANADIAN SYLLABICS NASKAPI YWAA;Lo;0;L;;;;;N;;;;; -153E;CANADIAN SYLLABICS Y;Lo;0;L;;;;;N;;;;; -153F;CANADIAN SYLLABICS BIBLE-CREE Y;Lo;0;L;;;;;N;;;;; -1540;CANADIAN SYLLABICS WEST-CREE Y;Lo;0;L;;;;;N;;;;; -1541;CANADIAN SYLLABICS SAYISI YI;Lo;0;L;;;;;N;;;;; -1542;CANADIAN SYLLABICS RE;Lo;0;L;;;;;N;;;;; -1543;CANADIAN SYLLABICS R-CREE RE;Lo;0;L;;;;;N;;;;; -1544;CANADIAN SYLLABICS WEST-CREE LE;Lo;0;L;;;;;N;;;;; -1545;CANADIAN SYLLABICS RAAI;Lo;0;L;;;;;N;;;;; -1546;CANADIAN SYLLABICS RI;Lo;0;L;;;;;N;;;;; -1547;CANADIAN SYLLABICS RII;Lo;0;L;;;;;N;;;;; -1548;CANADIAN SYLLABICS RO;Lo;0;L;;;;;N;;;;; -1549;CANADIAN SYLLABICS ROO;Lo;0;L;;;;;N;;;;; -154A;CANADIAN SYLLABICS WEST-CREE LO;Lo;0;L;;;;;N;;;;; -154B;CANADIAN SYLLABICS RA;Lo;0;L;;;;;N;;;;; -154C;CANADIAN SYLLABICS RAA;Lo;0;L;;;;;N;;;;; -154D;CANADIAN SYLLABICS WEST-CREE LA;Lo;0;L;;;;;N;;;;; -154E;CANADIAN SYLLABICS RWAA;Lo;0;L;;;;;N;;;;; -154F;CANADIAN SYLLABICS WEST-CREE RWAA;Lo;0;L;;;;;N;;;;; -1550;CANADIAN SYLLABICS R;Lo;0;L;;;;;N;;;;; -1551;CANADIAN SYLLABICS WEST-CREE R;Lo;0;L;;;;;N;;;;; -1552;CANADIAN SYLLABICS MEDIAL R;Lo;0;L;;;;;N;;;;; -1553;CANADIAN SYLLABICS FE;Lo;0;L;;;;;N;;;;; -1554;CANADIAN SYLLABICS FAAI;Lo;0;L;;;;;N;;;;; -1555;CANADIAN SYLLABICS FI;Lo;0;L;;;;;N;;;;; -1556;CANADIAN SYLLABICS FII;Lo;0;L;;;;;N;;;;; -1557;CANADIAN SYLLABICS FO;Lo;0;L;;;;;N;;;;; -1558;CANADIAN SYLLABICS FOO;Lo;0;L;;;;;N;;;;; -1559;CANADIAN SYLLABICS FA;Lo;0;L;;;;;N;;;;; -155A;CANADIAN SYLLABICS FAA;Lo;0;L;;;;;N;;;;; -155B;CANADIAN SYLLABICS FWAA;Lo;0;L;;;;;N;;;;; -155C;CANADIAN SYLLABICS WEST-CREE FWAA;Lo;0;L;;;;;N;;;;; -155D;CANADIAN SYLLABICS F;Lo;0;L;;;;;N;;;;; -155E;CANADIAN SYLLABICS THE;Lo;0;L;;;;;N;;;;; -155F;CANADIAN SYLLABICS N-CREE THE;Lo;0;L;;;;;N;;;;; -1560;CANADIAN SYLLABICS THI;Lo;0;L;;;;;N;;;;; -1561;CANADIAN SYLLABICS N-CREE THI;Lo;0;L;;;;;N;;;;; -1562;CANADIAN SYLLABICS THII;Lo;0;L;;;;;N;;;;; -1563;CANADIAN SYLLABICS N-CREE THII;Lo;0;L;;;;;N;;;;; -1564;CANADIAN SYLLABICS THO;Lo;0;L;;;;;N;;;;; -1565;CANADIAN SYLLABICS THOO;Lo;0;L;;;;;N;;;;; -1566;CANADIAN SYLLABICS THA;Lo;0;L;;;;;N;;;;; -1567;CANADIAN SYLLABICS THAA;Lo;0;L;;;;;N;;;;; -1568;CANADIAN SYLLABICS THWAA;Lo;0;L;;;;;N;;;;; -1569;CANADIAN SYLLABICS WEST-CREE THWAA;Lo;0;L;;;;;N;;;;; -156A;CANADIAN SYLLABICS TH;Lo;0;L;;;;;N;;;;; -156B;CANADIAN SYLLABICS TTHE;Lo;0;L;;;;;N;;;;; -156C;CANADIAN SYLLABICS TTHI;Lo;0;L;;;;;N;;;;; -156D;CANADIAN SYLLABICS TTHO;Lo;0;L;;;;;N;;;;; -156E;CANADIAN SYLLABICS TTHA;Lo;0;L;;;;;N;;;;; -156F;CANADIAN SYLLABICS TTH;Lo;0;L;;;;;N;;;;; -1570;CANADIAN SYLLABICS TYE;Lo;0;L;;;;;N;;;;; -1571;CANADIAN SYLLABICS TYI;Lo;0;L;;;;;N;;;;; -1572;CANADIAN SYLLABICS TYO;Lo;0;L;;;;;N;;;;; -1573;CANADIAN SYLLABICS TYA;Lo;0;L;;;;;N;;;;; -1574;CANADIAN SYLLABICS NUNAVIK HE;Lo;0;L;;;;;N;;;;; -1575;CANADIAN SYLLABICS NUNAVIK HI;Lo;0;L;;;;;N;;;;; -1576;CANADIAN SYLLABICS NUNAVIK HII;Lo;0;L;;;;;N;;;;; -1577;CANADIAN SYLLABICS NUNAVIK HO;Lo;0;L;;;;;N;;;;; -1578;CANADIAN SYLLABICS NUNAVIK HOO;Lo;0;L;;;;;N;;;;; -1579;CANADIAN SYLLABICS NUNAVIK HA;Lo;0;L;;;;;N;;;;; -157A;CANADIAN SYLLABICS NUNAVIK HAA;Lo;0;L;;;;;N;;;;; -157B;CANADIAN SYLLABICS NUNAVIK H;Lo;0;L;;;;;N;;;;; -157C;CANADIAN SYLLABICS NUNAVUT H;Lo;0;L;;;;;N;;;;; -157D;CANADIAN SYLLABICS HK;Lo;0;L;;;;;N;;;;; -157E;CANADIAN SYLLABICS QAAI;Lo;0;L;;;;;N;;;;; -157F;CANADIAN SYLLABICS QI;Lo;0;L;;;;;N;;;;; -1580;CANADIAN SYLLABICS QII;Lo;0;L;;;;;N;;;;; -1581;CANADIAN SYLLABICS QO;Lo;0;L;;;;;N;;;;; -1582;CANADIAN SYLLABICS QOO;Lo;0;L;;;;;N;;;;; -1583;CANADIAN SYLLABICS QA;Lo;0;L;;;;;N;;;;; -1584;CANADIAN SYLLABICS QAA;Lo;0;L;;;;;N;;;;; -1585;CANADIAN SYLLABICS Q;Lo;0;L;;;;;N;;;;; -1586;CANADIAN SYLLABICS TLHE;Lo;0;L;;;;;N;;;;; -1587;CANADIAN SYLLABICS TLHI;Lo;0;L;;;;;N;;;;; -1588;CANADIAN SYLLABICS TLHO;Lo;0;L;;;;;N;;;;; -1589;CANADIAN SYLLABICS TLHA;Lo;0;L;;;;;N;;;;; -158A;CANADIAN SYLLABICS WEST-CREE RE;Lo;0;L;;;;;N;;;;; -158B;CANADIAN SYLLABICS WEST-CREE RI;Lo;0;L;;;;;N;;;;; -158C;CANADIAN SYLLABICS WEST-CREE RO;Lo;0;L;;;;;N;;;;; -158D;CANADIAN SYLLABICS WEST-CREE RA;Lo;0;L;;;;;N;;;;; -158E;CANADIAN SYLLABICS NGAAI;Lo;0;L;;;;;N;;;;; -158F;CANADIAN SYLLABICS NGI;Lo;0;L;;;;;N;;;;; -1590;CANADIAN SYLLABICS NGII;Lo;0;L;;;;;N;;;;; -1591;CANADIAN SYLLABICS NGO;Lo;0;L;;;;;N;;;;; -1592;CANADIAN SYLLABICS NGOO;Lo;0;L;;;;;N;;;;; -1593;CANADIAN SYLLABICS NGA;Lo;0;L;;;;;N;;;;; -1594;CANADIAN SYLLABICS NGAA;Lo;0;L;;;;;N;;;;; -1595;CANADIAN SYLLABICS NG;Lo;0;L;;;;;N;;;;; -1596;CANADIAN SYLLABICS NNG;Lo;0;L;;;;;N;;;;; -1597;CANADIAN SYLLABICS SAYISI SHE;Lo;0;L;;;;;N;;;;; -1598;CANADIAN SYLLABICS SAYISI SHI;Lo;0;L;;;;;N;;;;; -1599;CANADIAN SYLLABICS SAYISI SHO;Lo;0;L;;;;;N;;;;; -159A;CANADIAN SYLLABICS SAYISI SHA;Lo;0;L;;;;;N;;;;; -159B;CANADIAN SYLLABICS WOODS-CREE THE;Lo;0;L;;;;;N;;;;; -159C;CANADIAN SYLLABICS WOODS-CREE THI;Lo;0;L;;;;;N;;;;; -159D;CANADIAN SYLLABICS WOODS-CREE THO;Lo;0;L;;;;;N;;;;; -159E;CANADIAN SYLLABICS WOODS-CREE THA;Lo;0;L;;;;;N;;;;; -159F;CANADIAN SYLLABICS WOODS-CREE TH;Lo;0;L;;;;;N;;;;; -15A0;CANADIAN SYLLABICS LHI;Lo;0;L;;;;;N;;;;; -15A1;CANADIAN SYLLABICS LHII;Lo;0;L;;;;;N;;;;; -15A2;CANADIAN SYLLABICS LHO;Lo;0;L;;;;;N;;;;; -15A3;CANADIAN SYLLABICS LHOO;Lo;0;L;;;;;N;;;;; -15A4;CANADIAN SYLLABICS LHA;Lo;0;L;;;;;N;;;;; -15A5;CANADIAN SYLLABICS LHAA;Lo;0;L;;;;;N;;;;; -15A6;CANADIAN SYLLABICS LH;Lo;0;L;;;;;N;;;;; -15A7;CANADIAN SYLLABICS TH-CREE THE;Lo;0;L;;;;;N;;;;; -15A8;CANADIAN SYLLABICS TH-CREE THI;Lo;0;L;;;;;N;;;;; -15A9;CANADIAN SYLLABICS TH-CREE THII;Lo;0;L;;;;;N;;;;; -15AA;CANADIAN SYLLABICS TH-CREE THO;Lo;0;L;;;;;N;;;;; -15AB;CANADIAN SYLLABICS TH-CREE THOO;Lo;0;L;;;;;N;;;;; -15AC;CANADIAN SYLLABICS TH-CREE THA;Lo;0;L;;;;;N;;;;; -15AD;CANADIAN SYLLABICS TH-CREE THAA;Lo;0;L;;;;;N;;;;; -15AE;CANADIAN SYLLABICS TH-CREE TH;Lo;0;L;;;;;N;;;;; -15AF;CANADIAN SYLLABICS AIVILIK B;Lo;0;L;;;;;N;;;;; -15B0;CANADIAN SYLLABICS BLACKFOOT E;Lo;0;L;;;;;N;;;;; -15B1;CANADIAN SYLLABICS BLACKFOOT I;Lo;0;L;;;;;N;;;;; -15B2;CANADIAN SYLLABICS BLACKFOOT O;Lo;0;L;;;;;N;;;;; -15B3;CANADIAN SYLLABICS BLACKFOOT A;Lo;0;L;;;;;N;;;;; -15B4;CANADIAN SYLLABICS BLACKFOOT WE;Lo;0;L;;;;;N;;;;; -15B5;CANADIAN SYLLABICS BLACKFOOT WI;Lo;0;L;;;;;N;;;;; -15B6;CANADIAN SYLLABICS BLACKFOOT WO;Lo;0;L;;;;;N;;;;; -15B7;CANADIAN SYLLABICS BLACKFOOT WA;Lo;0;L;;;;;N;;;;; -15B8;CANADIAN SYLLABICS BLACKFOOT NE;Lo;0;L;;;;;N;;;;; -15B9;CANADIAN SYLLABICS BLACKFOOT NI;Lo;0;L;;;;;N;;;;; -15BA;CANADIAN SYLLABICS BLACKFOOT NO;Lo;0;L;;;;;N;;;;; -15BB;CANADIAN SYLLABICS BLACKFOOT NA;Lo;0;L;;;;;N;;;;; -15BC;CANADIAN SYLLABICS BLACKFOOT KE;Lo;0;L;;;;;N;;;;; -15BD;CANADIAN SYLLABICS BLACKFOOT KI;Lo;0;L;;;;;N;;;;; -15BE;CANADIAN SYLLABICS BLACKFOOT KO;Lo;0;L;;;;;N;;;;; -15BF;CANADIAN SYLLABICS BLACKFOOT KA;Lo;0;L;;;;;N;;;;; -15C0;CANADIAN SYLLABICS SAYISI HE;Lo;0;L;;;;;N;;;;; -15C1;CANADIAN SYLLABICS SAYISI HI;Lo;0;L;;;;;N;;;;; -15C2;CANADIAN SYLLABICS SAYISI HO;Lo;0;L;;;;;N;;;;; -15C3;CANADIAN SYLLABICS SAYISI HA;Lo;0;L;;;;;N;;;;; -15C4;CANADIAN SYLLABICS CARRIER GHU;Lo;0;L;;;;;N;;;;; -15C5;CANADIAN SYLLABICS CARRIER GHO;Lo;0;L;;;;;N;;;;; -15C6;CANADIAN SYLLABICS CARRIER GHE;Lo;0;L;;;;;N;;;;; -15C7;CANADIAN SYLLABICS CARRIER GHEE;Lo;0;L;;;;;N;;;;; -15C8;CANADIAN SYLLABICS CARRIER GHI;Lo;0;L;;;;;N;;;;; -15C9;CANADIAN SYLLABICS CARRIER GHA;Lo;0;L;;;;;N;;;;; -15CA;CANADIAN SYLLABICS CARRIER RU;Lo;0;L;;;;;N;;;;; -15CB;CANADIAN SYLLABICS CARRIER RO;Lo;0;L;;;;;N;;;;; -15CC;CANADIAN SYLLABICS CARRIER RE;Lo;0;L;;;;;N;;;;; -15CD;CANADIAN SYLLABICS CARRIER REE;Lo;0;L;;;;;N;;;;; -15CE;CANADIAN SYLLABICS CARRIER RI;Lo;0;L;;;;;N;;;;; -15CF;CANADIAN SYLLABICS CARRIER RA;Lo;0;L;;;;;N;;;;; -15D0;CANADIAN SYLLABICS CARRIER WU;Lo;0;L;;;;;N;;;;; -15D1;CANADIAN SYLLABICS CARRIER WO;Lo;0;L;;;;;N;;;;; -15D2;CANADIAN SYLLABICS CARRIER WE;Lo;0;L;;;;;N;;;;; -15D3;CANADIAN SYLLABICS CARRIER WEE;Lo;0;L;;;;;N;;;;; -15D4;CANADIAN SYLLABICS CARRIER WI;Lo;0;L;;;;;N;;;;; -15D5;CANADIAN SYLLABICS CARRIER WA;Lo;0;L;;;;;N;;;;; -15D6;CANADIAN SYLLABICS CARRIER HWU;Lo;0;L;;;;;N;;;;; -15D7;CANADIAN SYLLABICS CARRIER HWO;Lo;0;L;;;;;N;;;;; -15D8;CANADIAN SYLLABICS CARRIER HWE;Lo;0;L;;;;;N;;;;; -15D9;CANADIAN SYLLABICS CARRIER HWEE;Lo;0;L;;;;;N;;;;; -15DA;CANADIAN SYLLABICS CARRIER HWI;Lo;0;L;;;;;N;;;;; -15DB;CANADIAN SYLLABICS CARRIER HWA;Lo;0;L;;;;;N;;;;; -15DC;CANADIAN SYLLABICS CARRIER THU;Lo;0;L;;;;;N;;;;; -15DD;CANADIAN SYLLABICS CARRIER THO;Lo;0;L;;;;;N;;;;; -15DE;CANADIAN SYLLABICS CARRIER THE;Lo;0;L;;;;;N;;;;; -15DF;CANADIAN SYLLABICS CARRIER THEE;Lo;0;L;;;;;N;;;;; -15E0;CANADIAN SYLLABICS CARRIER THI;Lo;0;L;;;;;N;;;;; -15E1;CANADIAN SYLLABICS CARRIER THA;Lo;0;L;;;;;N;;;;; -15E2;CANADIAN SYLLABICS CARRIER TTU;Lo;0;L;;;;;N;;;;; -15E3;CANADIAN SYLLABICS CARRIER TTO;Lo;0;L;;;;;N;;;;; -15E4;CANADIAN SYLLABICS CARRIER TTE;Lo;0;L;;;;;N;;;;; -15E5;CANADIAN SYLLABICS CARRIER TTEE;Lo;0;L;;;;;N;;;;; -15E6;CANADIAN SYLLABICS CARRIER TTI;Lo;0;L;;;;;N;;;;; -15E7;CANADIAN SYLLABICS CARRIER TTA;Lo;0;L;;;;;N;;;;; -15E8;CANADIAN SYLLABICS CARRIER PU;Lo;0;L;;;;;N;;;;; -15E9;CANADIAN SYLLABICS CARRIER PO;Lo;0;L;;;;;N;;;;; -15EA;CANADIAN SYLLABICS CARRIER PE;Lo;0;L;;;;;N;;;;; -15EB;CANADIAN SYLLABICS CARRIER PEE;Lo;0;L;;;;;N;;;;; -15EC;CANADIAN SYLLABICS CARRIER PI;Lo;0;L;;;;;N;;;;; -15ED;CANADIAN SYLLABICS CARRIER PA;Lo;0;L;;;;;N;;;;; -15EE;CANADIAN SYLLABICS CARRIER P;Lo;0;L;;;;;N;;;;; -15EF;CANADIAN SYLLABICS CARRIER GU;Lo;0;L;;;;;N;;;;; -15F0;CANADIAN SYLLABICS CARRIER GO;Lo;0;L;;;;;N;;;;; -15F1;CANADIAN SYLLABICS CARRIER GE;Lo;0;L;;;;;N;;;;; -15F2;CANADIAN SYLLABICS CARRIER GEE;Lo;0;L;;;;;N;;;;; -15F3;CANADIAN SYLLABICS CARRIER GI;Lo;0;L;;;;;N;;;;; -15F4;CANADIAN SYLLABICS CARRIER GA;Lo;0;L;;;;;N;;;;; -15F5;CANADIAN SYLLABICS CARRIER KHU;Lo;0;L;;;;;N;;;;; -15F6;CANADIAN SYLLABICS CARRIER KHO;Lo;0;L;;;;;N;;;;; -15F7;CANADIAN SYLLABICS CARRIER KHE;Lo;0;L;;;;;N;;;;; -15F8;CANADIAN SYLLABICS CARRIER KHEE;Lo;0;L;;;;;N;;;;; -15F9;CANADIAN SYLLABICS CARRIER KHI;Lo;0;L;;;;;N;;;;; -15FA;CANADIAN SYLLABICS CARRIER KHA;Lo;0;L;;;;;N;;;;; -15FB;CANADIAN SYLLABICS CARRIER KKU;Lo;0;L;;;;;N;;;;; -15FC;CANADIAN SYLLABICS CARRIER KKO;Lo;0;L;;;;;N;;;;; -15FD;CANADIAN SYLLABICS CARRIER KKE;Lo;0;L;;;;;N;;;;; -15FE;CANADIAN SYLLABICS CARRIER KKEE;Lo;0;L;;;;;N;;;;; -15FF;CANADIAN SYLLABICS CARRIER KKI;Lo;0;L;;;;;N;;;;; -1600;CANADIAN SYLLABICS CARRIER KKA;Lo;0;L;;;;;N;;;;; -1601;CANADIAN SYLLABICS CARRIER KK;Lo;0;L;;;;;N;;;;; -1602;CANADIAN SYLLABICS CARRIER NU;Lo;0;L;;;;;N;;;;; -1603;CANADIAN SYLLABICS CARRIER NO;Lo;0;L;;;;;N;;;;; -1604;CANADIAN SYLLABICS CARRIER NE;Lo;0;L;;;;;N;;;;; -1605;CANADIAN SYLLABICS CARRIER NEE;Lo;0;L;;;;;N;;;;; -1606;CANADIAN SYLLABICS CARRIER NI;Lo;0;L;;;;;N;;;;; -1607;CANADIAN SYLLABICS CARRIER NA;Lo;0;L;;;;;N;;;;; -1608;CANADIAN SYLLABICS CARRIER MU;Lo;0;L;;;;;N;;;;; -1609;CANADIAN SYLLABICS CARRIER MO;Lo;0;L;;;;;N;;;;; -160A;CANADIAN SYLLABICS CARRIER ME;Lo;0;L;;;;;N;;;;; -160B;CANADIAN SYLLABICS CARRIER MEE;Lo;0;L;;;;;N;;;;; -160C;CANADIAN SYLLABICS CARRIER MI;Lo;0;L;;;;;N;;;;; -160D;CANADIAN SYLLABICS CARRIER MA;Lo;0;L;;;;;N;;;;; -160E;CANADIAN SYLLABICS CARRIER YU;Lo;0;L;;;;;N;;;;; -160F;CANADIAN SYLLABICS CARRIER YO;Lo;0;L;;;;;N;;;;; -1610;CANADIAN SYLLABICS CARRIER YE;Lo;0;L;;;;;N;;;;; -1611;CANADIAN SYLLABICS CARRIER YEE;Lo;0;L;;;;;N;;;;; -1612;CANADIAN SYLLABICS CARRIER YI;Lo;0;L;;;;;N;;;;; -1613;CANADIAN SYLLABICS CARRIER YA;Lo;0;L;;;;;N;;;;; -1614;CANADIAN SYLLABICS CARRIER JU;Lo;0;L;;;;;N;;;;; -1615;CANADIAN SYLLABICS SAYISI JU;Lo;0;L;;;;;N;;;;; -1616;CANADIAN SYLLABICS CARRIER JO;Lo;0;L;;;;;N;;;;; -1617;CANADIAN SYLLABICS CARRIER JE;Lo;0;L;;;;;N;;;;; -1618;CANADIAN SYLLABICS CARRIER JEE;Lo;0;L;;;;;N;;;;; -1619;CANADIAN SYLLABICS CARRIER JI;Lo;0;L;;;;;N;;;;; -161A;CANADIAN SYLLABICS SAYISI JI;Lo;0;L;;;;;N;;;;; -161B;CANADIAN SYLLABICS CARRIER JA;Lo;0;L;;;;;N;;;;; -161C;CANADIAN SYLLABICS CARRIER JJU;Lo;0;L;;;;;N;;;;; -161D;CANADIAN SYLLABICS CARRIER JJO;Lo;0;L;;;;;N;;;;; -161E;CANADIAN SYLLABICS CARRIER JJE;Lo;0;L;;;;;N;;;;; -161F;CANADIAN SYLLABICS CARRIER JJEE;Lo;0;L;;;;;N;;;;; -1620;CANADIAN SYLLABICS CARRIER JJI;Lo;0;L;;;;;N;;;;; -1621;CANADIAN SYLLABICS CARRIER JJA;Lo;0;L;;;;;N;;;;; -1622;CANADIAN SYLLABICS CARRIER LU;Lo;0;L;;;;;N;;;;; -1623;CANADIAN SYLLABICS CARRIER LO;Lo;0;L;;;;;N;;;;; -1624;CANADIAN SYLLABICS CARRIER LE;Lo;0;L;;;;;N;;;;; -1625;CANADIAN SYLLABICS CARRIER LEE;Lo;0;L;;;;;N;;;;; -1626;CANADIAN SYLLABICS CARRIER LI;Lo;0;L;;;;;N;;;;; -1627;CANADIAN SYLLABICS CARRIER LA;Lo;0;L;;;;;N;;;;; -1628;CANADIAN SYLLABICS CARRIER DLU;Lo;0;L;;;;;N;;;;; -1629;CANADIAN SYLLABICS CARRIER DLO;Lo;0;L;;;;;N;;;;; -162A;CANADIAN SYLLABICS CARRIER DLE;Lo;0;L;;;;;N;;;;; -162B;CANADIAN SYLLABICS CARRIER DLEE;Lo;0;L;;;;;N;;;;; -162C;CANADIAN SYLLABICS CARRIER DLI;Lo;0;L;;;;;N;;;;; -162D;CANADIAN SYLLABICS CARRIER DLA;Lo;0;L;;;;;N;;;;; -162E;CANADIAN SYLLABICS CARRIER LHU;Lo;0;L;;;;;N;;;;; -162F;CANADIAN SYLLABICS CARRIER LHO;Lo;0;L;;;;;N;;;;; -1630;CANADIAN SYLLABICS CARRIER LHE;Lo;0;L;;;;;N;;;;; -1631;CANADIAN SYLLABICS CARRIER LHEE;Lo;0;L;;;;;N;;;;; -1632;CANADIAN SYLLABICS CARRIER LHI;Lo;0;L;;;;;N;;;;; -1633;CANADIAN SYLLABICS CARRIER LHA;Lo;0;L;;;;;N;;;;; -1634;CANADIAN SYLLABICS CARRIER TLHU;Lo;0;L;;;;;N;;;;; -1635;CANADIAN SYLLABICS CARRIER TLHO;Lo;0;L;;;;;N;;;;; -1636;CANADIAN SYLLABICS CARRIER TLHE;Lo;0;L;;;;;N;;;;; -1637;CANADIAN SYLLABICS CARRIER TLHEE;Lo;0;L;;;;;N;;;;; -1638;CANADIAN SYLLABICS CARRIER TLHI;Lo;0;L;;;;;N;;;;; -1639;CANADIAN SYLLABICS CARRIER TLHA;Lo;0;L;;;;;N;;;;; -163A;CANADIAN SYLLABICS CARRIER TLU;Lo;0;L;;;;;N;;;;; -163B;CANADIAN SYLLABICS CARRIER TLO;Lo;0;L;;;;;N;;;;; -163C;CANADIAN SYLLABICS CARRIER TLE;Lo;0;L;;;;;N;;;;; -163D;CANADIAN SYLLABICS CARRIER TLEE;Lo;0;L;;;;;N;;;;; -163E;CANADIAN SYLLABICS CARRIER TLI;Lo;0;L;;;;;N;;;;; -163F;CANADIAN SYLLABICS CARRIER TLA;Lo;0;L;;;;;N;;;;; -1640;CANADIAN SYLLABICS CARRIER ZU;Lo;0;L;;;;;N;;;;; -1641;CANADIAN SYLLABICS CARRIER ZO;Lo;0;L;;;;;N;;;;; -1642;CANADIAN SYLLABICS CARRIER ZE;Lo;0;L;;;;;N;;;;; -1643;CANADIAN SYLLABICS CARRIER ZEE;Lo;0;L;;;;;N;;;;; -1644;CANADIAN SYLLABICS CARRIER ZI;Lo;0;L;;;;;N;;;;; -1645;CANADIAN SYLLABICS CARRIER ZA;Lo;0;L;;;;;N;;;;; -1646;CANADIAN SYLLABICS CARRIER Z;Lo;0;L;;;;;N;;;;; -1647;CANADIAN SYLLABICS CARRIER INITIAL Z;Lo;0;L;;;;;N;;;;; -1648;CANADIAN SYLLABICS CARRIER DZU;Lo;0;L;;;;;N;;;;; -1649;CANADIAN SYLLABICS CARRIER DZO;Lo;0;L;;;;;N;;;;; -164A;CANADIAN SYLLABICS CARRIER DZE;Lo;0;L;;;;;N;;;;; -164B;CANADIAN SYLLABICS CARRIER DZEE;Lo;0;L;;;;;N;;;;; -164C;CANADIAN SYLLABICS CARRIER DZI;Lo;0;L;;;;;N;;;;; -164D;CANADIAN SYLLABICS CARRIER DZA;Lo;0;L;;;;;N;;;;; -164E;CANADIAN SYLLABICS CARRIER SU;Lo;0;L;;;;;N;;;;; -164F;CANADIAN SYLLABICS CARRIER SO;Lo;0;L;;;;;N;;;;; -1650;CANADIAN SYLLABICS CARRIER SE;Lo;0;L;;;;;N;;;;; -1651;CANADIAN SYLLABICS CARRIER SEE;Lo;0;L;;;;;N;;;;; -1652;CANADIAN SYLLABICS CARRIER SI;Lo;0;L;;;;;N;;;;; -1653;CANADIAN SYLLABICS CARRIER SA;Lo;0;L;;;;;N;;;;; -1654;CANADIAN SYLLABICS CARRIER SHU;Lo;0;L;;;;;N;;;;; -1655;CANADIAN SYLLABICS CARRIER SHO;Lo;0;L;;;;;N;;;;; -1656;CANADIAN SYLLABICS CARRIER SHE;Lo;0;L;;;;;N;;;;; -1657;CANADIAN SYLLABICS CARRIER SHEE;Lo;0;L;;;;;N;;;;; -1658;CANADIAN SYLLABICS CARRIER SHI;Lo;0;L;;;;;N;;;;; -1659;CANADIAN SYLLABICS CARRIER SHA;Lo;0;L;;;;;N;;;;; -165A;CANADIAN SYLLABICS CARRIER SH;Lo;0;L;;;;;N;;;;; -165B;CANADIAN SYLLABICS CARRIER TSU;Lo;0;L;;;;;N;;;;; -165C;CANADIAN SYLLABICS CARRIER TSO;Lo;0;L;;;;;N;;;;; -165D;CANADIAN SYLLABICS CARRIER TSE;Lo;0;L;;;;;N;;;;; -165E;CANADIAN SYLLABICS CARRIER TSEE;Lo;0;L;;;;;N;;;;; -165F;CANADIAN SYLLABICS CARRIER TSI;Lo;0;L;;;;;N;;;;; -1660;CANADIAN SYLLABICS CARRIER TSA;Lo;0;L;;;;;N;;;;; -1661;CANADIAN SYLLABICS CARRIER CHU;Lo;0;L;;;;;N;;;;; -1662;CANADIAN SYLLABICS CARRIER CHO;Lo;0;L;;;;;N;;;;; -1663;CANADIAN SYLLABICS CARRIER CHE;Lo;0;L;;;;;N;;;;; -1664;CANADIAN SYLLABICS CARRIER CHEE;Lo;0;L;;;;;N;;;;; -1665;CANADIAN SYLLABICS CARRIER CHI;Lo;0;L;;;;;N;;;;; -1666;CANADIAN SYLLABICS CARRIER CHA;Lo;0;L;;;;;N;;;;; -1667;CANADIAN SYLLABICS CARRIER TTSU;Lo;0;L;;;;;N;;;;; -1668;CANADIAN SYLLABICS CARRIER TTSO;Lo;0;L;;;;;N;;;;; -1669;CANADIAN SYLLABICS CARRIER TTSE;Lo;0;L;;;;;N;;;;; -166A;CANADIAN SYLLABICS CARRIER TTSEE;Lo;0;L;;;;;N;;;;; -166B;CANADIAN SYLLABICS CARRIER TTSI;Lo;0;L;;;;;N;;;;; -166C;CANADIAN SYLLABICS CARRIER TTSA;Lo;0;L;;;;;N;;;;; -166D;CANADIAN SYLLABICS CHI SIGN;Po;0;L;;;;;N;;;;; -166E;CANADIAN SYLLABICS FULL STOP;Po;0;L;;;;;N;;;;; -166F;CANADIAN SYLLABICS QAI;Lo;0;L;;;;;N;;;;; -1670;CANADIAN SYLLABICS NGAI;Lo;0;L;;;;;N;;;;; -1671;CANADIAN SYLLABICS NNGI;Lo;0;L;;;;;N;;;;; -1672;CANADIAN SYLLABICS NNGII;Lo;0;L;;;;;N;;;;; -1673;CANADIAN SYLLABICS NNGO;Lo;0;L;;;;;N;;;;; -1674;CANADIAN SYLLABICS NNGOO;Lo;0;L;;;;;N;;;;; -1675;CANADIAN SYLLABICS NNGA;Lo;0;L;;;;;N;;;;; -1676;CANADIAN SYLLABICS NNGAA;Lo;0;L;;;;;N;;;;; -1677;CANADIAN SYLLABICS WOODS-CREE THWEE;Lo;0;L;;;;;N;;;;; -1678;CANADIAN SYLLABICS WOODS-CREE THWI;Lo;0;L;;;;;N;;;;; -1679;CANADIAN SYLLABICS WOODS-CREE THWII;Lo;0;L;;;;;N;;;;; -167A;CANADIAN SYLLABICS WOODS-CREE THWO;Lo;0;L;;;;;N;;;;; -167B;CANADIAN SYLLABICS WOODS-CREE THWOO;Lo;0;L;;;;;N;;;;; -167C;CANADIAN SYLLABICS WOODS-CREE THWA;Lo;0;L;;;;;N;;;;; -167D;CANADIAN SYLLABICS WOODS-CREE THWAA;Lo;0;L;;;;;N;;;;; -167E;CANADIAN SYLLABICS WOODS-CREE FINAL TH;Lo;0;L;;;;;N;;;;; -167F;CANADIAN SYLLABICS BLACKFOOT W;Lo;0;L;;;;;N;;;;; -1680;OGHAM SPACE MARK;Zs;0;WS;;;;;N;;;;; -1681;OGHAM LETTER BEITH;Lo;0;L;;;;;N;;;;; -1682;OGHAM LETTER LUIS;Lo;0;L;;;;;N;;;;; -1683;OGHAM LETTER FEARN;Lo;0;L;;;;;N;;;;; -1684;OGHAM LETTER SAIL;Lo;0;L;;;;;N;;;;; -1685;OGHAM LETTER NION;Lo;0;L;;;;;N;;;;; -1686;OGHAM LETTER UATH;Lo;0;L;;;;;N;;;;; -1687;OGHAM LETTER DAIR;Lo;0;L;;;;;N;;;;; -1688;OGHAM LETTER TINNE;Lo;0;L;;;;;N;;;;; -1689;OGHAM LETTER COLL;Lo;0;L;;;;;N;;;;; -168A;OGHAM LETTER CEIRT;Lo;0;L;;;;;N;;;;; -168B;OGHAM LETTER MUIN;Lo;0;L;;;;;N;;;;; -168C;OGHAM LETTER GORT;Lo;0;L;;;;;N;;;;; -168D;OGHAM LETTER NGEADAL;Lo;0;L;;;;;N;;;;; -168E;OGHAM LETTER STRAIF;Lo;0;L;;;;;N;;;;; -168F;OGHAM LETTER RUIS;Lo;0;L;;;;;N;;;;; -1690;OGHAM LETTER AILM;Lo;0;L;;;;;N;;;;; -1691;OGHAM LETTER ONN;Lo;0;L;;;;;N;;;;; -1692;OGHAM LETTER UR;Lo;0;L;;;;;N;;;;; -1693;OGHAM LETTER EADHADH;Lo;0;L;;;;;N;;;;; -1694;OGHAM LETTER IODHADH;Lo;0;L;;;;;N;;;;; -1695;OGHAM LETTER EABHADH;Lo;0;L;;;;;N;;;;; -1696;OGHAM LETTER OR;Lo;0;L;;;;;N;;;;; -1697;OGHAM LETTER UILLEANN;Lo;0;L;;;;;N;;;;; -1698;OGHAM LETTER IFIN;Lo;0;L;;;;;N;;;;; -1699;OGHAM LETTER EAMHANCHOLL;Lo;0;L;;;;;N;;;;; -169A;OGHAM LETTER PEITH;Lo;0;L;;;;;N;;;;; -169B;OGHAM FEATHER MARK;Ps;0;ON;;;;;Y;;;;; -169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;; -16A0;RUNIC LETTER FEHU FEOH FE F;Lo;0;L;;;;;N;;;;; -16A1;RUNIC LETTER V;Lo;0;L;;;;;N;;;;; -16A2;RUNIC LETTER URUZ UR U;Lo;0;L;;;;;N;;;;; -16A3;RUNIC LETTER YR;Lo;0;L;;;;;N;;;;; -16A4;RUNIC LETTER Y;Lo;0;L;;;;;N;;;;; -16A5;RUNIC LETTER W;Lo;0;L;;;;;N;;;;; -16A6;RUNIC LETTER THURISAZ THURS THORN;Lo;0;L;;;;;N;;;;; -16A7;RUNIC LETTER ETH;Lo;0;L;;;;;N;;;;; -16A8;RUNIC LETTER ANSUZ A;Lo;0;L;;;;;N;;;;; -16A9;RUNIC LETTER OS O;Lo;0;L;;;;;N;;;;; -16AA;RUNIC LETTER AC A;Lo;0;L;;;;;N;;;;; -16AB;RUNIC LETTER AESC;Lo;0;L;;;;;N;;;;; -16AC;RUNIC LETTER LONG-BRANCH-OSS O;Lo;0;L;;;;;N;;;;; -16AD;RUNIC LETTER SHORT-TWIG-OSS O;Lo;0;L;;;;;N;;;;; -16AE;RUNIC LETTER O;Lo;0;L;;;;;N;;;;; -16AF;RUNIC LETTER OE;Lo;0;L;;;;;N;;;;; -16B0;RUNIC LETTER ON;Lo;0;L;;;;;N;;;;; -16B1;RUNIC LETTER RAIDO RAD REID R;Lo;0;L;;;;;N;;;;; -16B2;RUNIC LETTER KAUNA;Lo;0;L;;;;;N;;;;; -16B3;RUNIC LETTER CEN;Lo;0;L;;;;;N;;;;; -16B4;RUNIC LETTER KAUN K;Lo;0;L;;;;;N;;;;; -16B5;RUNIC LETTER G;Lo;0;L;;;;;N;;;;; -16B6;RUNIC LETTER ENG;Lo;0;L;;;;;N;;;;; -16B7;RUNIC LETTER GEBO GYFU G;Lo;0;L;;;;;N;;;;; -16B8;RUNIC LETTER GAR;Lo;0;L;;;;;N;;;;; -16B9;RUNIC LETTER WUNJO WYNN W;Lo;0;L;;;;;N;;;;; -16BA;RUNIC LETTER HAGLAZ H;Lo;0;L;;;;;N;;;;; -16BB;RUNIC LETTER HAEGL H;Lo;0;L;;;;;N;;;;; -16BC;RUNIC LETTER LONG-BRANCH-HAGALL H;Lo;0;L;;;;;N;;;;; -16BD;RUNIC LETTER SHORT-TWIG-HAGALL H;Lo;0;L;;;;;N;;;;; -16BE;RUNIC LETTER NAUDIZ NYD NAUD N;Lo;0;L;;;;;N;;;;; -16BF;RUNIC LETTER SHORT-TWIG-NAUD N;Lo;0;L;;;;;N;;;;; -16C0;RUNIC LETTER DOTTED-N;Lo;0;L;;;;;N;;;;; -16C1;RUNIC LETTER ISAZ IS ISS I;Lo;0;L;;;;;N;;;;; -16C2;RUNIC LETTER E;Lo;0;L;;;;;N;;;;; -16C3;RUNIC LETTER JERAN J;Lo;0;L;;;;;N;;;;; -16C4;RUNIC LETTER GER;Lo;0;L;;;;;N;;;;; -16C5;RUNIC LETTER LONG-BRANCH-AR AE;Lo;0;L;;;;;N;;;;; -16C6;RUNIC LETTER SHORT-TWIG-AR A;Lo;0;L;;;;;N;;;;; -16C7;RUNIC LETTER IWAZ EOH;Lo;0;L;;;;;N;;;;; -16C8;RUNIC LETTER PERTHO PEORTH P;Lo;0;L;;;;;N;;;;; -16C9;RUNIC LETTER ALGIZ EOLHX;Lo;0;L;;;;;N;;;;; -16CA;RUNIC LETTER SOWILO S;Lo;0;L;;;;;N;;;;; -16CB;RUNIC LETTER SIGEL LONG-BRANCH-SOL S;Lo;0;L;;;;;N;;;;; -16CC;RUNIC LETTER SHORT-TWIG-SOL S;Lo;0;L;;;;;N;;;;; -16CD;RUNIC LETTER C;Lo;0;L;;;;;N;;;;; -16CE;RUNIC LETTER Z;Lo;0;L;;;;;N;;;;; -16CF;RUNIC LETTER TIWAZ TIR TYR T;Lo;0;L;;;;;N;;;;; -16D0;RUNIC LETTER SHORT-TWIG-TYR T;Lo;0;L;;;;;N;;;;; -16D1;RUNIC LETTER D;Lo;0;L;;;;;N;;;;; -16D2;RUNIC LETTER BERKANAN BEORC BJARKAN B;Lo;0;L;;;;;N;;;;; -16D3;RUNIC LETTER SHORT-TWIG-BJARKAN B;Lo;0;L;;;;;N;;;;; -16D4;RUNIC LETTER DOTTED-P;Lo;0;L;;;;;N;;;;; -16D5;RUNIC LETTER OPEN-P;Lo;0;L;;;;;N;;;;; -16D6;RUNIC LETTER EHWAZ EH E;Lo;0;L;;;;;N;;;;; -16D7;RUNIC LETTER MANNAZ MAN M;Lo;0;L;;;;;N;;;;; -16D8;RUNIC LETTER LONG-BRANCH-MADR M;Lo;0;L;;;;;N;;;;; -16D9;RUNIC LETTER SHORT-TWIG-MADR M;Lo;0;L;;;;;N;;;;; -16DA;RUNIC LETTER LAUKAZ LAGU LOGR L;Lo;0;L;;;;;N;;;;; -16DB;RUNIC LETTER DOTTED-L;Lo;0;L;;;;;N;;;;; -16DC;RUNIC LETTER INGWAZ;Lo;0;L;;;;;N;;;;; -16DD;RUNIC LETTER ING;Lo;0;L;;;;;N;;;;; -16DE;RUNIC LETTER DAGAZ DAEG D;Lo;0;L;;;;;N;;;;; -16DF;RUNIC LETTER OTHALAN ETHEL O;Lo;0;L;;;;;N;;;;; -16E0;RUNIC LETTER EAR;Lo;0;L;;;;;N;;;;; -16E1;RUNIC LETTER IOR;Lo;0;L;;;;;N;;;;; -16E2;RUNIC LETTER CWEORTH;Lo;0;L;;;;;N;;;;; -16E3;RUNIC LETTER CALC;Lo;0;L;;;;;N;;;;; -16E4;RUNIC LETTER CEALC;Lo;0;L;;;;;N;;;;; -16E5;RUNIC LETTER STAN;Lo;0;L;;;;;N;;;;; -16E6;RUNIC LETTER LONG-BRANCH-YR;Lo;0;L;;;;;N;;;;; -16E7;RUNIC LETTER SHORT-TWIG-YR;Lo;0;L;;;;;N;;;;; -16E8;RUNIC LETTER ICELANDIC-YR;Lo;0;L;;;;;N;;;;; -16E9;RUNIC LETTER Q;Lo;0;L;;;;;N;;;;; -16EA;RUNIC LETTER X;Lo;0;L;;;;;N;;;;; -16EB;RUNIC SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; -16EC;RUNIC MULTIPLE PUNCTUATION;Po;0;L;;;;;N;;;;; -16ED;RUNIC CROSS PUNCTUATION;Po;0;L;;;;;N;;;;; -16EE;RUNIC ARLAUG SYMBOL;Nl;0;L;;;;17;N;;;;; -16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;;;; -16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;;;; -16F1;RUNIC LETTER K;Lo;0;L;;;;;N;;;;; -16F2;RUNIC LETTER SH;Lo;0;L;;;;;N;;;;; -16F3;RUNIC LETTER OO;Lo;0;L;;;;;N;;;;; -16F4;RUNIC LETTER FRANKS CASKET OS;Lo;0;L;;;;;N;;;;; -16F5;RUNIC LETTER FRANKS CASKET IS;Lo;0;L;;;;;N;;;;; -16F6;RUNIC LETTER FRANKS CASKET EH;Lo;0;L;;;;;N;;;;; -16F7;RUNIC LETTER FRANKS CASKET AC;Lo;0;L;;;;;N;;;;; -16F8;RUNIC LETTER FRANKS CASKET AESC;Lo;0;L;;;;;N;;;;; -1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;; -1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;; -1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;; -1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;; -1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;; -1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;; -1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;; -1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;; -1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;; -1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;; -170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;; -170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;; -170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;; -170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;; -170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;; -1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;; -1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;; -1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;; -1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;; -1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;; -1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;; -1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;; -1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;; -1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;; -1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;; -1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;; -1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;; -172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;; -172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;; -172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;; -172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;; -172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;; -172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;; -1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;; -1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;; -1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;; -1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;; -1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;; -1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;; -1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;; -1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;; -1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;; -1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;; -1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;; -1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;; -1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;; -1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;; -1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;; -174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;; -174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;; -174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;; -174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;; -174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;; -174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;; -1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;; -1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;; -1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;; -1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;; -1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;; -1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;; -1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;; -1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;; -1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;; -1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;; -1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;; -1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;; -176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;; -176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;; -176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;; -176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;; -176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;; -1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;; -1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1780;KHMER LETTER KA;Lo;0;L;;;;;N;;;;; -1781;KHMER LETTER KHA;Lo;0;L;;;;;N;;;;; -1782;KHMER LETTER KO;Lo;0;L;;;;;N;;;;; -1783;KHMER LETTER KHO;Lo;0;L;;;;;N;;;;; -1784;KHMER LETTER NGO;Lo;0;L;;;;;N;;;;; -1785;KHMER LETTER CA;Lo;0;L;;;;;N;;;;; -1786;KHMER LETTER CHA;Lo;0;L;;;;;N;;;;; -1787;KHMER LETTER CO;Lo;0;L;;;;;N;;;;; -1788;KHMER LETTER CHO;Lo;0;L;;;;;N;;;;; -1789;KHMER LETTER NYO;Lo;0;L;;;;;N;;;;; -178A;KHMER LETTER DA;Lo;0;L;;;;;N;;;;; -178B;KHMER LETTER TTHA;Lo;0;L;;;;;N;;;;; -178C;KHMER LETTER DO;Lo;0;L;;;;;N;;;;; -178D;KHMER LETTER TTHO;Lo;0;L;;;;;N;;;;; -178E;KHMER LETTER NNO;Lo;0;L;;;;;N;;;;; -178F;KHMER LETTER TA;Lo;0;L;;;;;N;;;;; -1790;KHMER LETTER THA;Lo;0;L;;;;;N;;;;; -1791;KHMER LETTER TO;Lo;0;L;;;;;N;;;;; -1792;KHMER LETTER THO;Lo;0;L;;;;;N;;;;; -1793;KHMER LETTER NO;Lo;0;L;;;;;N;;;;; -1794;KHMER LETTER BA;Lo;0;L;;;;;N;;;;; -1795;KHMER LETTER PHA;Lo;0;L;;;;;N;;;;; -1796;KHMER LETTER PO;Lo;0;L;;;;;N;;;;; -1797;KHMER LETTER PHO;Lo;0;L;;;;;N;;;;; -1798;KHMER LETTER MO;Lo;0;L;;;;;N;;;;; -1799;KHMER LETTER YO;Lo;0;L;;;;;N;;;;; -179A;KHMER LETTER RO;Lo;0;L;;;;;N;;;;; -179B;KHMER LETTER LO;Lo;0;L;;;;;N;;;;; -179C;KHMER LETTER VO;Lo;0;L;;;;;N;;;;; -179D;KHMER LETTER SHA;Lo;0;L;;;;;N;;;;; -179E;KHMER LETTER SSO;Lo;0;L;;;;;N;;;;; -179F;KHMER LETTER SA;Lo;0;L;;;;;N;;;;; -17A0;KHMER LETTER HA;Lo;0;L;;;;;N;;;;; -17A1;KHMER LETTER LA;Lo;0;L;;;;;N;;;;; -17A2;KHMER LETTER QA;Lo;0;L;;;;;N;;;;; -17A3;KHMER INDEPENDENT VOWEL QAQ;Lo;0;L;;;;;N;;;;; -17A4;KHMER INDEPENDENT VOWEL QAA;Lo;0;L;;;;;N;;;;; -17A5;KHMER INDEPENDENT VOWEL QI;Lo;0;L;;;;;N;;;;; -17A6;KHMER INDEPENDENT VOWEL QII;Lo;0;L;;;;;N;;;;; -17A7;KHMER INDEPENDENT VOWEL QU;Lo;0;L;;;;;N;;;;; -17A8;KHMER INDEPENDENT VOWEL QUK;Lo;0;L;;;;;N;;;;; -17A9;KHMER INDEPENDENT VOWEL QUU;Lo;0;L;;;;;N;;;;; -17AA;KHMER INDEPENDENT VOWEL QUUV;Lo;0;L;;;;;N;;;;; -17AB;KHMER INDEPENDENT VOWEL RY;Lo;0;L;;;;;N;;;;; -17AC;KHMER INDEPENDENT VOWEL RYY;Lo;0;L;;;;;N;;;;; -17AD;KHMER INDEPENDENT VOWEL LY;Lo;0;L;;;;;N;;;;; -17AE;KHMER INDEPENDENT VOWEL LYY;Lo;0;L;;;;;N;;;;; -17AF;KHMER INDEPENDENT VOWEL QE;Lo;0;L;;;;;N;;;;; -17B0;KHMER INDEPENDENT VOWEL QAI;Lo;0;L;;;;;N;;;;; -17B1;KHMER INDEPENDENT VOWEL QOO TYPE ONE;Lo;0;L;;;;;N;;;;; -17B2;KHMER INDEPENDENT VOWEL QOO TYPE TWO;Lo;0;L;;;;;N;;;;; -17B3;KHMER INDEPENDENT VOWEL QAU;Lo;0;L;;;;;N;;;;; -17B4;KHMER VOWEL INHERENT AQ;Mn;0;NSM;;;;;N;;;;; -17B5;KHMER VOWEL INHERENT AA;Mn;0;NSM;;;;;N;;;;; -17B6;KHMER VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -17B7;KHMER VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -17B8;KHMER VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -17B9;KHMER VOWEL SIGN Y;Mn;0;NSM;;;;;N;;;;; -17BA;KHMER VOWEL SIGN YY;Mn;0;NSM;;;;;N;;;;; -17BB;KHMER VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -17BC;KHMER VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -17BD;KHMER VOWEL SIGN UA;Mn;0;NSM;;;;;N;;;;; -17BE;KHMER VOWEL SIGN OE;Mc;0;L;;;;;N;;;;; -17BF;KHMER VOWEL SIGN YA;Mc;0;L;;;;;N;;;;; -17C0;KHMER VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; -17C1;KHMER VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -17C2;KHMER VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -17C3;KHMER VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -17C4;KHMER VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -17C5;KHMER VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -17C6;KHMER SIGN NIKAHIT;Mn;0;NSM;;;;;N;;;;; -17C7;KHMER SIGN REAHMUK;Mc;0;L;;;;;N;;;;; -17C8;KHMER SIGN YUUKALEAPINTU;Mc;0;L;;;;;N;;;;; -17C9;KHMER SIGN MUUSIKATOAN;Mn;0;NSM;;;;;N;;;;; -17CA;KHMER SIGN TRIISAP;Mn;0;NSM;;;;;N;;;;; -17CB;KHMER SIGN BANTOC;Mn;0;NSM;;;;;N;;;;; -17CC;KHMER SIGN ROBAT;Mn;0;NSM;;;;;N;;;;; -17CD;KHMER SIGN TOANDAKHIAT;Mn;0;NSM;;;;;N;;;;; -17CE;KHMER SIGN KAKABAT;Mn;0;NSM;;;;;N;;;;; -17CF;KHMER SIGN AHSDA;Mn;0;NSM;;;;;N;;;;; -17D0;KHMER SIGN SAMYOK SANNYA;Mn;0;NSM;;;;;N;;;;; -17D1;KHMER SIGN VIRIAM;Mn;0;NSM;;;;;N;;;;; -17D2;KHMER SIGN COENG;Mn;9;NSM;;;;;N;;;;; -17D3;KHMER SIGN BATHAMASAT;Mn;0;NSM;;;;;N;;;;; -17D4;KHMER SIGN KHAN;Po;0;L;;;;;N;;;;; -17D5;KHMER SIGN BARIYOOSAN;Po;0;L;;;;;N;;;;; -17D6;KHMER SIGN CAMNUC PII KUUH;Po;0;L;;;;;N;;;;; -17D7;KHMER SIGN LEK TOO;Lm;0;L;;;;;N;;;;; -17D8;KHMER SIGN BEYYAL;Po;0;L;;;;;N;;;;; -17D9;KHMER SIGN PHNAEK MUAN;Po;0;L;;;;;N;;;;; -17DA;KHMER SIGN KOOMUUT;Po;0;L;;;;;N;;;;; -17DB;KHMER CURRENCY SYMBOL RIEL;Sc;0;ET;;;;;N;;;;; -17DC;KHMER SIGN AVAKRAHASANYA;Lo;0;L;;;;;N;;;;; -17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;N;;;;; -17E0;KHMER DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -17E1;KHMER DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -17E2;KHMER DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -17E3;KHMER DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -17E4;KHMER DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -17E5;KHMER DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -17E6;KHMER DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -17E7;KHMER DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -17E8;KHMER DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -17E9;KHMER DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;; -17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;; -17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;; -17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;; -17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;; -17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;; -17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;; -17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;; -17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;; -17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;9;N;;;;; -1800;MONGOLIAN BIRGA;Po;0;ON;;;;;N;;;;; -1801;MONGOLIAN ELLIPSIS;Po;0;ON;;;;;N;;;;; -1802;MONGOLIAN COMMA;Po;0;ON;;;;;N;;;;; -1803;MONGOLIAN FULL STOP;Po;0;ON;;;;;N;;;;; -1804;MONGOLIAN COLON;Po;0;ON;;;;;N;;;;; -1805;MONGOLIAN FOUR DOTS;Po;0;ON;;;;;N;;;;; -1806;MONGOLIAN TODO SOFT HYPHEN;Pd;0;ON;;;;;N;;;;; -1807;MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER;Po;0;ON;;;;;N;;;;; -1808;MONGOLIAN MANCHU COMMA;Po;0;ON;;;;;N;;;;; -1809;MONGOLIAN MANCHU FULL STOP;Po;0;ON;;;;;N;;;;; -180A;MONGOLIAN NIRUGU;Po;0;ON;;;;;N;;;;; -180B;MONGOLIAN FREE VARIATION SELECTOR ONE;Mn;0;NSM;;;;;N;;;;; -180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;; -180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;; -180E;MONGOLIAN VOWEL SEPARATOR;Cf;0;BN;;;;;N;;;;; -1810;MONGOLIAN DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1811;MONGOLIAN DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1812;MONGOLIAN DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1813;MONGOLIAN DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1814;MONGOLIAN DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1815;MONGOLIAN DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1816;MONGOLIAN DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1817;MONGOLIAN DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1818;MONGOLIAN DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1819;MONGOLIAN DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1820;MONGOLIAN LETTER A;Lo;0;L;;;;;N;;;;; -1821;MONGOLIAN LETTER E;Lo;0;L;;;;;N;;;;; -1822;MONGOLIAN LETTER I;Lo;0;L;;;;;N;;;;; -1823;MONGOLIAN LETTER O;Lo;0;L;;;;;N;;;;; -1824;MONGOLIAN LETTER U;Lo;0;L;;;;;N;;;;; -1825;MONGOLIAN LETTER OE;Lo;0;L;;;;;N;;;;; -1826;MONGOLIAN LETTER UE;Lo;0;L;;;;;N;;;;; -1827;MONGOLIAN LETTER EE;Lo;0;L;;;;;N;;;;; -1828;MONGOLIAN LETTER NA;Lo;0;L;;;;;N;;;;; -1829;MONGOLIAN LETTER ANG;Lo;0;L;;;;;N;;;;; -182A;MONGOLIAN LETTER BA;Lo;0;L;;;;;N;;;;; -182B;MONGOLIAN LETTER PA;Lo;0;L;;;;;N;;;;; -182C;MONGOLIAN LETTER QA;Lo;0;L;;;;;N;;;;; -182D;MONGOLIAN LETTER GA;Lo;0;L;;;;;N;;;;; -182E;MONGOLIAN LETTER MA;Lo;0;L;;;;;N;;;;; -182F;MONGOLIAN LETTER LA;Lo;0;L;;;;;N;;;;; -1830;MONGOLIAN LETTER SA;Lo;0;L;;;;;N;;;;; -1831;MONGOLIAN LETTER SHA;Lo;0;L;;;;;N;;;;; -1832;MONGOLIAN LETTER TA;Lo;0;L;;;;;N;;;;; -1833;MONGOLIAN LETTER DA;Lo;0;L;;;;;N;;;;; -1834;MONGOLIAN LETTER CHA;Lo;0;L;;;;;N;;;;; -1835;MONGOLIAN LETTER JA;Lo;0;L;;;;;N;;;;; -1836;MONGOLIAN LETTER YA;Lo;0;L;;;;;N;;;;; -1837;MONGOLIAN LETTER RA;Lo;0;L;;;;;N;;;;; -1838;MONGOLIAN LETTER WA;Lo;0;L;;;;;N;;;;; -1839;MONGOLIAN LETTER FA;Lo;0;L;;;;;N;;;;; -183A;MONGOLIAN LETTER KA;Lo;0;L;;;;;N;;;;; -183B;MONGOLIAN LETTER KHA;Lo;0;L;;;;;N;;;;; -183C;MONGOLIAN LETTER TSA;Lo;0;L;;;;;N;;;;; -183D;MONGOLIAN LETTER ZA;Lo;0;L;;;;;N;;;;; -183E;MONGOLIAN LETTER HAA;Lo;0;L;;;;;N;;;;; -183F;MONGOLIAN LETTER ZRA;Lo;0;L;;;;;N;;;;; -1840;MONGOLIAN LETTER LHA;Lo;0;L;;;;;N;;;;; -1841;MONGOLIAN LETTER ZHI;Lo;0;L;;;;;N;;;;; -1842;MONGOLIAN LETTER CHI;Lo;0;L;;;;;N;;;;; -1843;MONGOLIAN LETTER TODO LONG VOWEL SIGN;Lm;0;L;;;;;N;;;;; -1844;MONGOLIAN LETTER TODO E;Lo;0;L;;;;;N;;;;; -1845;MONGOLIAN LETTER TODO I;Lo;0;L;;;;;N;;;;; -1846;MONGOLIAN LETTER TODO O;Lo;0;L;;;;;N;;;;; -1847;MONGOLIAN LETTER TODO U;Lo;0;L;;;;;N;;;;; -1848;MONGOLIAN LETTER TODO OE;Lo;0;L;;;;;N;;;;; -1849;MONGOLIAN LETTER TODO UE;Lo;0;L;;;;;N;;;;; -184A;MONGOLIAN LETTER TODO ANG;Lo;0;L;;;;;N;;;;; -184B;MONGOLIAN LETTER TODO BA;Lo;0;L;;;;;N;;;;; -184C;MONGOLIAN LETTER TODO PA;Lo;0;L;;;;;N;;;;; -184D;MONGOLIAN LETTER TODO QA;Lo;0;L;;;;;N;;;;; -184E;MONGOLIAN LETTER TODO GA;Lo;0;L;;;;;N;;;;; -184F;MONGOLIAN LETTER TODO MA;Lo;0;L;;;;;N;;;;; -1850;MONGOLIAN LETTER TODO TA;Lo;0;L;;;;;N;;;;; -1851;MONGOLIAN LETTER TODO DA;Lo;0;L;;;;;N;;;;; -1852;MONGOLIAN LETTER TODO CHA;Lo;0;L;;;;;N;;;;; -1853;MONGOLIAN LETTER TODO JA;Lo;0;L;;;;;N;;;;; -1854;MONGOLIAN LETTER TODO TSA;Lo;0;L;;;;;N;;;;; -1855;MONGOLIAN LETTER TODO YA;Lo;0;L;;;;;N;;;;; -1856;MONGOLIAN LETTER TODO WA;Lo;0;L;;;;;N;;;;; -1857;MONGOLIAN LETTER TODO KA;Lo;0;L;;;;;N;;;;; -1858;MONGOLIAN LETTER TODO GAA;Lo;0;L;;;;;N;;;;; -1859;MONGOLIAN LETTER TODO HAA;Lo;0;L;;;;;N;;;;; -185A;MONGOLIAN LETTER TODO JIA;Lo;0;L;;;;;N;;;;; -185B;MONGOLIAN LETTER TODO NIA;Lo;0;L;;;;;N;;;;; -185C;MONGOLIAN LETTER TODO DZA;Lo;0;L;;;;;N;;;;; -185D;MONGOLIAN LETTER SIBE E;Lo;0;L;;;;;N;;;;; -185E;MONGOLIAN LETTER SIBE I;Lo;0;L;;;;;N;;;;; -185F;MONGOLIAN LETTER SIBE IY;Lo;0;L;;;;;N;;;;; -1860;MONGOLIAN LETTER SIBE UE;Lo;0;L;;;;;N;;;;; -1861;MONGOLIAN LETTER SIBE U;Lo;0;L;;;;;N;;;;; -1862;MONGOLIAN LETTER SIBE ANG;Lo;0;L;;;;;N;;;;; -1863;MONGOLIAN LETTER SIBE KA;Lo;0;L;;;;;N;;;;; -1864;MONGOLIAN LETTER SIBE GA;Lo;0;L;;;;;N;;;;; -1865;MONGOLIAN LETTER SIBE HA;Lo;0;L;;;;;N;;;;; -1866;MONGOLIAN LETTER SIBE PA;Lo;0;L;;;;;N;;;;; -1867;MONGOLIAN LETTER SIBE SHA;Lo;0;L;;;;;N;;;;; -1868;MONGOLIAN LETTER SIBE TA;Lo;0;L;;;;;N;;;;; -1869;MONGOLIAN LETTER SIBE DA;Lo;0;L;;;;;N;;;;; -186A;MONGOLIAN LETTER SIBE JA;Lo;0;L;;;;;N;;;;; -186B;MONGOLIAN LETTER SIBE FA;Lo;0;L;;;;;N;;;;; -186C;MONGOLIAN LETTER SIBE GAA;Lo;0;L;;;;;N;;;;; -186D;MONGOLIAN LETTER SIBE HAA;Lo;0;L;;;;;N;;;;; -186E;MONGOLIAN LETTER SIBE TSA;Lo;0;L;;;;;N;;;;; -186F;MONGOLIAN LETTER SIBE ZA;Lo;0;L;;;;;N;;;;; -1870;MONGOLIAN LETTER SIBE RAA;Lo;0;L;;;;;N;;;;; -1871;MONGOLIAN LETTER SIBE CHA;Lo;0;L;;;;;N;;;;; -1872;MONGOLIAN LETTER SIBE ZHA;Lo;0;L;;;;;N;;;;; -1873;MONGOLIAN LETTER MANCHU I;Lo;0;L;;;;;N;;;;; -1874;MONGOLIAN LETTER MANCHU KA;Lo;0;L;;;;;N;;;;; -1875;MONGOLIAN LETTER MANCHU RA;Lo;0;L;;;;;N;;;;; -1876;MONGOLIAN LETTER MANCHU FA;Lo;0;L;;;;;N;;;;; -1877;MONGOLIAN LETTER MANCHU ZHA;Lo;0;L;;;;;N;;;;; -1880;MONGOLIAN LETTER ALI GALI ANUSVARA ONE;Lo;0;L;;;;;N;;;;; -1881;MONGOLIAN LETTER ALI GALI VISARGA ONE;Lo;0;L;;;;;N;;;;; -1882;MONGOLIAN LETTER ALI GALI DAMARU;Lo;0;L;;;;;N;;;;; -1883;MONGOLIAN LETTER ALI GALI UBADAMA;Lo;0;L;;;;;N;;;;; -1884;MONGOLIAN LETTER ALI GALI INVERTED UBADAMA;Lo;0;L;;;;;N;;;;; -1885;MONGOLIAN LETTER ALI GALI BALUDA;Lo;0;L;;;;;N;;;;; -1886;MONGOLIAN LETTER ALI GALI THREE BALUDA;Lo;0;L;;;;;N;;;;; -1887;MONGOLIAN LETTER ALI GALI A;Lo;0;L;;;;;N;;;;; -1888;MONGOLIAN LETTER ALI GALI I;Lo;0;L;;;;;N;;;;; -1889;MONGOLIAN LETTER ALI GALI KA;Lo;0;L;;;;;N;;;;; -188A;MONGOLIAN LETTER ALI GALI NGA;Lo;0;L;;;;;N;;;;; -188B;MONGOLIAN LETTER ALI GALI CA;Lo;0;L;;;;;N;;;;; -188C;MONGOLIAN LETTER ALI GALI TTA;Lo;0;L;;;;;N;;;;; -188D;MONGOLIAN LETTER ALI GALI TTHA;Lo;0;L;;;;;N;;;;; -188E;MONGOLIAN LETTER ALI GALI DDA;Lo;0;L;;;;;N;;;;; -188F;MONGOLIAN LETTER ALI GALI NNA;Lo;0;L;;;;;N;;;;; -1890;MONGOLIAN LETTER ALI GALI TA;Lo;0;L;;;;;N;;;;; -1891;MONGOLIAN LETTER ALI GALI DA;Lo;0;L;;;;;N;;;;; -1892;MONGOLIAN LETTER ALI GALI PA;Lo;0;L;;;;;N;;;;; -1893;MONGOLIAN LETTER ALI GALI PHA;Lo;0;L;;;;;N;;;;; -1894;MONGOLIAN LETTER ALI GALI SSA;Lo;0;L;;;;;N;;;;; -1895;MONGOLIAN LETTER ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -1896;MONGOLIAN LETTER ALI GALI ZA;Lo;0;L;;;;;N;;;;; -1897;MONGOLIAN LETTER ALI GALI AH;Lo;0;L;;;;;N;;;;; -1898;MONGOLIAN LETTER TODO ALI GALI TA;Lo;0;L;;;;;N;;;;; -1899;MONGOLIAN LETTER TODO ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -189A;MONGOLIAN LETTER MANCHU ALI GALI GHA;Lo;0;L;;;;;N;;;;; -189B;MONGOLIAN LETTER MANCHU ALI GALI NGA;Lo;0;L;;;;;N;;;;; -189C;MONGOLIAN LETTER MANCHU ALI GALI CA;Lo;0;L;;;;;N;;;;; -189D;MONGOLIAN LETTER MANCHU ALI GALI JHA;Lo;0;L;;;;;N;;;;; -189E;MONGOLIAN LETTER MANCHU ALI GALI TTA;Lo;0;L;;;;;N;;;;; -189F;MONGOLIAN LETTER MANCHU ALI GALI DDHA;Lo;0;L;;;;;N;;;;; -18A0;MONGOLIAN LETTER MANCHU ALI GALI TA;Lo;0;L;;;;;N;;;;; -18A1;MONGOLIAN LETTER MANCHU ALI GALI DHA;Lo;0;L;;;;;N;;;;; -18A2;MONGOLIAN LETTER MANCHU ALI GALI SSA;Lo;0;L;;;;;N;;;;; -18A3;MONGOLIAN LETTER MANCHU ALI GALI CYA;Lo;0;L;;;;;N;;;;; -18A4;MONGOLIAN LETTER MANCHU ALI GALI ZHA;Lo;0;L;;;;;N;;;;; -18A5;MONGOLIAN LETTER MANCHU ALI GALI ZA;Lo;0;L;;;;;N;;;;; -18A6;MONGOLIAN LETTER ALI GALI HALF U;Lo;0;L;;;;;N;;;;; -18A7;MONGOLIAN LETTER ALI GALI HALF YA;Lo;0;L;;;;;N;;;;; -18A8;MONGOLIAN LETTER MANCHU ALI GALI BHA;Lo;0;L;;;;;N;;;;; -18A9;MONGOLIAN LETTER ALI GALI DAGALGA;Mn;228;NSM;;;;;N;;;;; -18AA;MONGOLIAN LETTER MANCHU ALI GALI LHA;Lo;0;L;;;;;N;;;;; -18B0;CANADIAN SYLLABICS OY;Lo;0;L;;;;;N;;;;; -18B1;CANADIAN SYLLABICS AY;Lo;0;L;;;;;N;;;;; -18B2;CANADIAN SYLLABICS AAY;Lo;0;L;;;;;N;;;;; -18B3;CANADIAN SYLLABICS WAY;Lo;0;L;;;;;N;;;;; -18B4;CANADIAN SYLLABICS POY;Lo;0;L;;;;;N;;;;; -18B5;CANADIAN SYLLABICS PAY;Lo;0;L;;;;;N;;;;; -18B6;CANADIAN SYLLABICS PWOY;Lo;0;L;;;;;N;;;;; -18B7;CANADIAN SYLLABICS TAY;Lo;0;L;;;;;N;;;;; -18B8;CANADIAN SYLLABICS KAY;Lo;0;L;;;;;N;;;;; -18B9;CANADIAN SYLLABICS KWAY;Lo;0;L;;;;;N;;;;; -18BA;CANADIAN SYLLABICS MAY;Lo;0;L;;;;;N;;;;; -18BB;CANADIAN SYLLABICS NOY;Lo;0;L;;;;;N;;;;; -18BC;CANADIAN SYLLABICS NAY;Lo;0;L;;;;;N;;;;; -18BD;CANADIAN SYLLABICS LAY;Lo;0;L;;;;;N;;;;; -18BE;CANADIAN SYLLABICS SOY;Lo;0;L;;;;;N;;;;; -18BF;CANADIAN SYLLABICS SAY;Lo;0;L;;;;;N;;;;; -18C0;CANADIAN SYLLABICS SHOY;Lo;0;L;;;;;N;;;;; -18C1;CANADIAN SYLLABICS SHAY;Lo;0;L;;;;;N;;;;; -18C2;CANADIAN SYLLABICS SHWOY;Lo;0;L;;;;;N;;;;; -18C3;CANADIAN SYLLABICS YOY;Lo;0;L;;;;;N;;;;; -18C4;CANADIAN SYLLABICS YAY;Lo;0;L;;;;;N;;;;; -18C5;CANADIAN SYLLABICS RAY;Lo;0;L;;;;;N;;;;; -18C6;CANADIAN SYLLABICS NWI;Lo;0;L;;;;;N;;;;; -18C7;CANADIAN SYLLABICS OJIBWAY NWI;Lo;0;L;;;;;N;;;;; -18C8;CANADIAN SYLLABICS NWII;Lo;0;L;;;;;N;;;;; -18C9;CANADIAN SYLLABICS OJIBWAY NWII;Lo;0;L;;;;;N;;;;; -18CA;CANADIAN SYLLABICS NWO;Lo;0;L;;;;;N;;;;; -18CB;CANADIAN SYLLABICS OJIBWAY NWO;Lo;0;L;;;;;N;;;;; -18CC;CANADIAN SYLLABICS NWOO;Lo;0;L;;;;;N;;;;; -18CD;CANADIAN SYLLABICS OJIBWAY NWOO;Lo;0;L;;;;;N;;;;; -18CE;CANADIAN SYLLABICS RWEE;Lo;0;L;;;;;N;;;;; -18CF;CANADIAN SYLLABICS RWI;Lo;0;L;;;;;N;;;;; -18D0;CANADIAN SYLLABICS RWII;Lo;0;L;;;;;N;;;;; -18D1;CANADIAN SYLLABICS RWO;Lo;0;L;;;;;N;;;;; -18D2;CANADIAN SYLLABICS RWOO;Lo;0;L;;;;;N;;;;; -18D3;CANADIAN SYLLABICS RWA;Lo;0;L;;;;;N;;;;; -18D4;CANADIAN SYLLABICS OJIBWAY P;Lo;0;L;;;;;N;;;;; -18D5;CANADIAN SYLLABICS OJIBWAY T;Lo;0;L;;;;;N;;;;; -18D6;CANADIAN SYLLABICS OJIBWAY K;Lo;0;L;;;;;N;;;;; -18D7;CANADIAN SYLLABICS OJIBWAY C;Lo;0;L;;;;;N;;;;; -18D8;CANADIAN SYLLABICS OJIBWAY M;Lo;0;L;;;;;N;;;;; -18D9;CANADIAN SYLLABICS OJIBWAY N;Lo;0;L;;;;;N;;;;; -18DA;CANADIAN SYLLABICS OJIBWAY S;Lo;0;L;;;;;N;;;;; -18DB;CANADIAN SYLLABICS OJIBWAY SH;Lo;0;L;;;;;N;;;;; -18DC;CANADIAN SYLLABICS EASTERN W;Lo;0;L;;;;;N;;;;; -18DD;CANADIAN SYLLABICS WESTERN W;Lo;0;L;;;;;N;;;;; -18DE;CANADIAN SYLLABICS FINAL SMALL RING;Lo;0;L;;;;;N;;;;; -18DF;CANADIAN SYLLABICS FINAL RAISED DOT;Lo;0;L;;;;;N;;;;; -18E0;CANADIAN SYLLABICS R-CREE RWE;Lo;0;L;;;;;N;;;;; -18E1;CANADIAN SYLLABICS WEST-CREE LOO;Lo;0;L;;;;;N;;;;; -18E2;CANADIAN SYLLABICS WEST-CREE LAA;Lo;0;L;;;;;N;;;;; -18E3;CANADIAN SYLLABICS THWE;Lo;0;L;;;;;N;;;;; -18E4;CANADIAN SYLLABICS THWA;Lo;0;L;;;;;N;;;;; -18E5;CANADIAN SYLLABICS TTHWE;Lo;0;L;;;;;N;;;;; -18E6;CANADIAN SYLLABICS TTHOO;Lo;0;L;;;;;N;;;;; -18E7;CANADIAN SYLLABICS TTHAA;Lo;0;L;;;;;N;;;;; -18E8;CANADIAN SYLLABICS TLHWE;Lo;0;L;;;;;N;;;;; -18E9;CANADIAN SYLLABICS TLHOO;Lo;0;L;;;;;N;;;;; -18EA;CANADIAN SYLLABICS SAYISI SHWE;Lo;0;L;;;;;N;;;;; -18EB;CANADIAN SYLLABICS SAYISI SHOO;Lo;0;L;;;;;N;;;;; -18EC;CANADIAN SYLLABICS SAYISI HOO;Lo;0;L;;;;;N;;;;; -18ED;CANADIAN SYLLABICS CARRIER GWU;Lo;0;L;;;;;N;;;;; -18EE;CANADIAN SYLLABICS CARRIER DENE GEE;Lo;0;L;;;;;N;;;;; -18EF;CANADIAN SYLLABICS CARRIER GAA;Lo;0;L;;;;;N;;;;; -18F0;CANADIAN SYLLABICS CARRIER GWA;Lo;0;L;;;;;N;;;;; -18F1;CANADIAN SYLLABICS SAYISI JUU;Lo;0;L;;;;;N;;;;; -18F2;CANADIAN SYLLABICS CARRIER JWA;Lo;0;L;;;;;N;;;;; -18F3;CANADIAN SYLLABICS BEAVER DENE L;Lo;0;L;;;;;N;;;;; -18F4;CANADIAN SYLLABICS BEAVER DENE R;Lo;0;L;;;;;N;;;;; -18F5;CANADIAN SYLLABICS CARRIER DENTAL S;Lo;0;L;;;;;N;;;;; -1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;; -1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;; -1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;; -1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;; -1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;; -1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;; -1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;; -1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;; -1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;; -1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;; -190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;; -190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;; -190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;; -190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;; -190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;; -190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;; -1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;; -1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;; -1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;; -1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;; -1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;; -1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;; -1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;; -1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;; -1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;; -1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;; -191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;; -191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;; -191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;; -191D;LIMBU LETTER GYAN;Lo;0;L;;;;;N;;;;; -191E;LIMBU LETTER TRA;Lo;0;L;;;;;N;;;;; -1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; -1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -1929;LIMBU SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; -192A;LIMBU SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; -192B;LIMBU SUBJOINED LETTER WA;Mc;0;L;;;;;N;;;;; -1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;; -1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;; -1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;; -1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;; -1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;; -1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;; -1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;; -1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;; -1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;; -193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;; -193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;; -1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;; -1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;; -1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;; -1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;; -1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;; -1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;; -1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;; -1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;; -1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;; -1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;; -1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;; -1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;; -1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;; -195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;; -195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;; -195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;; -195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;; -195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;; -195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;; -1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;; -1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;; -1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;; -1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;; -1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;; -1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;; -1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;; -1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;; -1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;; -1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;; -196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;; -196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;; -196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;; -196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;; -1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;; -1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;; -1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;; -1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;; -1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;; -1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;; -1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;; -1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;; -1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;; -1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;; -1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;; -1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;; -1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;; -1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;; -1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;; -198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;; -198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;; -198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;; -198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;; -198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;; -198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;; -1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;; -1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;; -1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;; -1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;; -1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;; -1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; -1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;; -1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;; -1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;; -1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;; -199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;; -199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;; -199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;; -199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;; -199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;; -199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;; -19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;; -19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;; -19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;; -19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;; -19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;; -19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;; -19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;; -19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;; -19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;; -19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;; -19AA;NEW TAI LUE LETTER HIGH SUA;Lo;0;L;;;;;N;;;;; -19AB;NEW TAI LUE LETTER LOW SUA;Lo;0;L;;;;;N;;;;; -19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Lo;0;L;;;;;N;;;;; -19B1;NEW TAI LUE VOWEL SIGN AA;Lo;0;L;;;;;N;;;;; -19B2;NEW TAI LUE VOWEL SIGN II;Lo;0;L;;;;;N;;;;; -19B3;NEW TAI LUE VOWEL SIGN U;Lo;0;L;;;;;N;;;;; -19B4;NEW TAI LUE VOWEL SIGN UU;Lo;0;L;;;;;N;;;;; -19B5;NEW TAI LUE VOWEL SIGN E;Lo;0;L;;;;;N;;;;; -19B6;NEW TAI LUE VOWEL SIGN AE;Lo;0;L;;;;;N;;;;; -19B7;NEW TAI LUE VOWEL SIGN O;Lo;0;L;;;;;N;;;;; -19B8;NEW TAI LUE VOWEL SIGN OA;Lo;0;L;;;;;N;;;;; -19B9;NEW TAI LUE VOWEL SIGN UE;Lo;0;L;;;;;N;;;;; -19BA;NEW TAI LUE VOWEL SIGN AY;Lo;0;L;;;;;N;;;;; -19BB;NEW TAI LUE VOWEL SIGN AAY;Lo;0;L;;;;;N;;;;; -19BC;NEW TAI LUE VOWEL SIGN UY;Lo;0;L;;;;;N;;;;; -19BD;NEW TAI LUE VOWEL SIGN OY;Lo;0;L;;;;;N;;;;; -19BE;NEW TAI LUE VOWEL SIGN OAY;Lo;0;L;;;;;N;;;;; -19BF;NEW TAI LUE VOWEL SIGN UEY;Lo;0;L;;;;;N;;;;; -19C0;NEW TAI LUE VOWEL SIGN IY;Lo;0;L;;;;;N;;;;; -19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;; -19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;; -19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;; -19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;; -19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;; -19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;; -19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;; -19C8;NEW TAI LUE TONE MARK-1;Lo;0;L;;;;;N;;;;; -19C9;NEW TAI LUE TONE MARK-2;Lo;0;L;;;;;N;;;;; -19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -19DA;NEW TAI LUE THAM DIGIT ONE;No;0;L;;;1;1;N;;;;; -19DE;NEW TAI LUE SIGN LAE;So;0;ON;;;;;N;;;;; -19DF;NEW TAI LUE SIGN LAEV;So;0;ON;;;;;N;;;;; -19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;; -19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;; -19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;; -19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;; -19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;; -19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;; -19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;; -19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;; -19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;; -19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;; -19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;; -19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;; -19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;; -19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;; -19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;; -19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;; -19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;; -19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;; -19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;; -19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;; -19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;; -19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;; -19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;; -19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;; -19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;; -19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;; -19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;; -19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;; -19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;; -19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;; -19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;; -19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;; -1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;; -1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;; -1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;; -1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;; -1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;; -1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;; -1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;; -1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;; -1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;; -1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;; -1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;; -1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;; -1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;; -1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;; -1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;; -1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;; -1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;; -1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;; -1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;; -1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;; -1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;; -1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;; -1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;; -1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;; -1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;; -1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1A1B;BUGINESE VOWEL SIGN AE;Mn;0;NSM;;;;;N;;;;; -1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;; -1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;; -1A20;TAI THAM LETTER HIGH KA;Lo;0;L;;;;;N;;;;; -1A21;TAI THAM LETTER HIGH KHA;Lo;0;L;;;;;N;;;;; -1A22;TAI THAM LETTER HIGH KXA;Lo;0;L;;;;;N;;;;; -1A23;TAI THAM LETTER LOW KA;Lo;0;L;;;;;N;;;;; -1A24;TAI THAM LETTER LOW KXA;Lo;0;L;;;;;N;;;;; -1A25;TAI THAM LETTER LOW KHA;Lo;0;L;;;;;N;;;;; -1A26;TAI THAM LETTER NGA;Lo;0;L;;;;;N;;;;; -1A27;TAI THAM LETTER HIGH CA;Lo;0;L;;;;;N;;;;; -1A28;TAI THAM LETTER HIGH CHA;Lo;0;L;;;;;N;;;;; -1A29;TAI THAM LETTER LOW CA;Lo;0;L;;;;;N;;;;; -1A2A;TAI THAM LETTER LOW SA;Lo;0;L;;;;;N;;;;; -1A2B;TAI THAM LETTER LOW CHA;Lo;0;L;;;;;N;;;;; -1A2C;TAI THAM LETTER NYA;Lo;0;L;;;;;N;;;;; -1A2D;TAI THAM LETTER RATA;Lo;0;L;;;;;N;;;;; -1A2E;TAI THAM LETTER HIGH RATHA;Lo;0;L;;;;;N;;;;; -1A2F;TAI THAM LETTER DA;Lo;0;L;;;;;N;;;;; -1A30;TAI THAM LETTER LOW RATHA;Lo;0;L;;;;;N;;;;; -1A31;TAI THAM LETTER RANA;Lo;0;L;;;;;N;;;;; -1A32;TAI THAM LETTER HIGH TA;Lo;0;L;;;;;N;;;;; -1A33;TAI THAM LETTER HIGH THA;Lo;0;L;;;;;N;;;;; -1A34;TAI THAM LETTER LOW TA;Lo;0;L;;;;;N;;;;; -1A35;TAI THAM LETTER LOW THA;Lo;0;L;;;;;N;;;;; -1A36;TAI THAM LETTER NA;Lo;0;L;;;;;N;;;;; -1A37;TAI THAM LETTER BA;Lo;0;L;;;;;N;;;;; -1A38;TAI THAM LETTER HIGH PA;Lo;0;L;;;;;N;;;;; -1A39;TAI THAM LETTER HIGH PHA;Lo;0;L;;;;;N;;;;; -1A3A;TAI THAM LETTER HIGH FA;Lo;0;L;;;;;N;;;;; -1A3B;TAI THAM LETTER LOW PA;Lo;0;L;;;;;N;;;;; -1A3C;TAI THAM LETTER LOW FA;Lo;0;L;;;;;N;;;;; -1A3D;TAI THAM LETTER LOW PHA;Lo;0;L;;;;;N;;;;; -1A3E;TAI THAM LETTER MA;Lo;0;L;;;;;N;;;;; -1A3F;TAI THAM LETTER LOW YA;Lo;0;L;;;;;N;;;;; -1A40;TAI THAM LETTER HIGH YA;Lo;0;L;;;;;N;;;;; -1A41;TAI THAM LETTER RA;Lo;0;L;;;;;N;;;;; -1A42;TAI THAM LETTER RUE;Lo;0;L;;;;;N;;;;; -1A43;TAI THAM LETTER LA;Lo;0;L;;;;;N;;;;; -1A44;TAI THAM LETTER LUE;Lo;0;L;;;;;N;;;;; -1A45;TAI THAM LETTER WA;Lo;0;L;;;;;N;;;;; -1A46;TAI THAM LETTER HIGH SHA;Lo;0;L;;;;;N;;;;; -1A47;TAI THAM LETTER HIGH SSA;Lo;0;L;;;;;N;;;;; -1A48;TAI THAM LETTER HIGH SA;Lo;0;L;;;;;N;;;;; -1A49;TAI THAM LETTER HIGH HA;Lo;0;L;;;;;N;;;;; -1A4A;TAI THAM LETTER LLA;Lo;0;L;;;;;N;;;;; -1A4B;TAI THAM LETTER A;Lo;0;L;;;;;N;;;;; -1A4C;TAI THAM LETTER LOW HA;Lo;0;L;;;;;N;;;;; -1A4D;TAI THAM LETTER I;Lo;0;L;;;;;N;;;;; -1A4E;TAI THAM LETTER II;Lo;0;L;;;;;N;;;;; -1A4F;TAI THAM LETTER U;Lo;0;L;;;;;N;;;;; -1A50;TAI THAM LETTER UU;Lo;0;L;;;;;N;;;;; -1A51;TAI THAM LETTER EE;Lo;0;L;;;;;N;;;;; -1A52;TAI THAM LETTER OO;Lo;0;L;;;;;N;;;;; -1A53;TAI THAM LETTER LAE;Lo;0;L;;;;;N;;;;; -1A54;TAI THAM LETTER GREAT SA;Lo;0;L;;;;;N;;;;; -1A55;TAI THAM CONSONANT SIGN MEDIAL RA;Mc;0;L;;;;;N;;;;; -1A56;TAI THAM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; -1A57;TAI THAM CONSONANT SIGN LA TANG LAI;Mc;0;L;;;;;N;;;;; -1A58;TAI THAM SIGN MAI KANG LAI;Mn;0;NSM;;;;;N;;;;; -1A59;TAI THAM CONSONANT SIGN FINAL NGA;Mn;0;NSM;;;;;N;;;;; -1A5A;TAI THAM CONSONANT SIGN LOW PA;Mn;0;NSM;;;;;N;;;;; -1A5B;TAI THAM CONSONANT SIGN HIGH RATHA OR LOW PA;Mn;0;NSM;;;;;N;;;;; -1A5C;TAI THAM CONSONANT SIGN MA;Mn;0;NSM;;;;;N;;;;; -1A5D;TAI THAM CONSONANT SIGN BA;Mn;0;NSM;;;;;N;;;;; -1A5E;TAI THAM CONSONANT SIGN SA;Mn;0;NSM;;;;;N;;;;; -1A60;TAI THAM SIGN SAKOT;Mn;9;NSM;;;;;N;;;;; -1A61;TAI THAM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -1A62;TAI THAM VOWEL SIGN MAI SAT;Mn;0;NSM;;;;;N;;;;; -1A63;TAI THAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1A64;TAI THAM VOWEL SIGN TALL AA;Mc;0;L;;;;;N;;;;; -1A65;TAI THAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1A66;TAI THAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -1A67;TAI THAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; -1A68;TAI THAM VOWEL SIGN UUE;Mn;0;NSM;;;;;N;;;;; -1A69;TAI THAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1A6A;TAI THAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1A6B;TAI THAM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -1A6C;TAI THAM VOWEL SIGN OA BELOW;Mn;0;NSM;;;;;N;;;;; -1A6D;TAI THAM VOWEL SIGN OY;Mc;0;L;;;;;N;;;;; -1A6E;TAI THAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1A6F;TAI THAM VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -1A70;TAI THAM VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -1A71;TAI THAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -1A72;TAI THAM VOWEL SIGN THAM AI;Mc;0;L;;;;;N;;;;; -1A73;TAI THAM VOWEL SIGN OA ABOVE;Mn;0;NSM;;;;;N;;;;; -1A74;TAI THAM SIGN MAI KANG;Mn;0;NSM;;;;;N;;;;; -1A75;TAI THAM SIGN TONE-1;Mn;230;NSM;;;;;N;;;;; -1A76;TAI THAM SIGN TONE-2;Mn;230;NSM;;;;;N;;;;; -1A77;TAI THAM SIGN KHUEN TONE-3;Mn;230;NSM;;;;;N;;;;; -1A78;TAI THAM SIGN KHUEN TONE-4;Mn;230;NSM;;;;;N;;;;; -1A79;TAI THAM SIGN KHUEN TONE-5;Mn;230;NSM;;;;;N;;;;; -1A7A;TAI THAM SIGN RA HAAM;Mn;230;NSM;;;;;N;;;;; -1A7B;TAI THAM SIGN MAI SAM;Mn;230;NSM;;;;;N;;;;; -1A7C;TAI THAM SIGN KHUEN-LUE KARAN;Mn;230;NSM;;;;;N;;;;; -1A7F;TAI THAM COMBINING CRYPTOGRAMMIC DOT;Mn;220;NSM;;;;;N;;;;; -1A80;TAI THAM HORA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1A81;TAI THAM HORA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1A82;TAI THAM HORA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1A83;TAI THAM HORA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1A84;TAI THAM HORA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1A85;TAI THAM HORA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1A86;TAI THAM HORA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1A87;TAI THAM HORA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1A88;TAI THAM HORA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1A89;TAI THAM HORA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1A90;TAI THAM THAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1A91;TAI THAM THAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1A92;TAI THAM THAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1A93;TAI THAM THAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1A94;TAI THAM THAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1A95;TAI THAM THAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1A96;TAI THAM THAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1A97;TAI THAM THAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1A98;TAI THAM THAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1A99;TAI THAM THAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1AA0;TAI THAM SIGN WIANG;Po;0;L;;;;;N;;;;; -1AA1;TAI THAM SIGN WIANGWAAK;Po;0;L;;;;;N;;;;; -1AA2;TAI THAM SIGN SAWAN;Po;0;L;;;;;N;;;;; -1AA3;TAI THAM SIGN KEOW;Po;0;L;;;;;N;;;;; -1AA4;TAI THAM SIGN HOY;Po;0;L;;;;;N;;;;; -1AA5;TAI THAM SIGN DOKMAI;Po;0;L;;;;;N;;;;; -1AA6;TAI THAM SIGN REVERSED ROTATED RANA;Po;0;L;;;;;N;;;;; -1AA7;TAI THAM SIGN MAI YAMOK;Lm;0;L;;;;;N;;;;; -1AA8;TAI THAM SIGN KAAN;Po;0;L;;;;;N;;;;; -1AA9;TAI THAM SIGN KAANKUU;Po;0;L;;;;;N;;;;; -1AAA;TAI THAM SIGN SATKAAN;Po;0;L;;;;;N;;;;; -1AAB;TAI THAM SIGN SATKAANKUU;Po;0;L;;;;;N;;;;; -1AAC;TAI THAM SIGN HANG;Po;0;L;;;;;N;;;;; -1AAD;TAI THAM SIGN CAANG;Po;0;L;;;;;N;;;;; -1AB0;COMBINING DOUBLED CIRCUMFLEX ACCENT;Mn;230;NSM;;;;;N;;;;; -1AB1;COMBINING DIAERESIS-RING;Mn;230;NSM;;;;;N;;;;; -1AB2;COMBINING INFINITY;Mn;230;NSM;;;;;N;;;;; -1AB3;COMBINING DOWNWARDS ARROW;Mn;230;NSM;;;;;N;;;;; -1AB4;COMBINING TRIPLE DOT;Mn;230;NSM;;;;;N;;;;; -1AB5;COMBINING X-X BELOW;Mn;220;NSM;;;;;N;;;;; -1AB6;COMBINING WIGGLY LINE BELOW;Mn;220;NSM;;;;;N;;;;; -1AB7;COMBINING OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; -1AB8;COMBINING DOUBLE OPEN MARK BELOW;Mn;220;NSM;;;;;N;;;;; -1AB9;COMBINING LIGHT CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; -1ABA;COMBINING STRONG CENTRALIZATION STROKE BELOW;Mn;220;NSM;;;;;N;;;;; -1ABB;COMBINING PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; -1ABC;COMBINING DOUBLE PARENTHESES ABOVE;Mn;230;NSM;;;;;N;;;;; -1ABD;COMBINING PARENTHESES BELOW;Mn;220;NSM;;;;;N;;;;; -1ABE;COMBINING PARENTHESES OVERLAY;Me;0;NSM;;;;;N;;;;; -1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;;;; -1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;;;; -1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;;;; -1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;;;; -1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;;;; -1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;;;; -1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;;;; -1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;;;; -1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;;;; -1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;;;; -1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;;;; -1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;;;; -1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;;;; -1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;;;; -1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;;;; -1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;;;; -1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;;;; -1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;;;; -1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;;;; -1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;; -1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;;;; -1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;; -1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;;;; -1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;; -1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;; -1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;;;; -1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;; -1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;;;; -1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;; -1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;;;; -1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; -1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;;;; -1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;;;; -1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;;;; -1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;; -1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;;;; -1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;; -1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;;;; -1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;; -1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;; -1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;;;; -1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;; -1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;;;; -1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;; -1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;; -1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;; -1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;; -1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;; -1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;;;; -1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;;;; -1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;; -1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;; -1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;;;; -1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;;;; -1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;;;; -1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;;;; -1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; -1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;;;; -1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;;;; -1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;;;; -1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;;;; -1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;;;; -1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; -1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;;;; -1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;;;; -1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;;;; -1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; -1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;;;; -1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;;;; -1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;; -1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;; -1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;; -1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;; -1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;; -1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;; -1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;; -1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1B5A;BALINESE PANTI;Po;0;L;;;;;N;;;;; -1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;;;; -1B5C;BALINESE WINDU;Po;0;L;;;;;N;;;;; -1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;;;; -1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;;;; -1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;;;; -1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;;;; -1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;; -1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;; -1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;; -1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;; -1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;; -1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;; -1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;; -1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;; -1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;; -1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;; -1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;; -1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;; -1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;; -1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;; -1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;; -1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; -1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;; -1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;; -1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;; -1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;; -1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;; -1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;; -1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;; -1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;; -1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;; -1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;; -1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;; -1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;; -1B80;SUNDANESE SIGN PANYECEK;Mn;0;NSM;;;;;N;;;;; -1B81;SUNDANESE SIGN PANGLAYAR;Mn;0;NSM;;;;;N;;;;; -1B82;SUNDANESE SIGN PANGWISAD;Mc;0;L;;;;;N;;;;; -1B83;SUNDANESE LETTER A;Lo;0;L;;;;;N;;;;; -1B84;SUNDANESE LETTER I;Lo;0;L;;;;;N;;;;; -1B85;SUNDANESE LETTER U;Lo;0;L;;;;;N;;;;; -1B86;SUNDANESE LETTER AE;Lo;0;L;;;;;N;;;;; -1B87;SUNDANESE LETTER O;Lo;0;L;;;;;N;;;;; -1B88;SUNDANESE LETTER E;Lo;0;L;;;;;N;;;;; -1B89;SUNDANESE LETTER EU;Lo;0;L;;;;;N;;;;; -1B8A;SUNDANESE LETTER KA;Lo;0;L;;;;;N;;;;; -1B8B;SUNDANESE LETTER QA;Lo;0;L;;;;;N;;;;; -1B8C;SUNDANESE LETTER GA;Lo;0;L;;;;;N;;;;; -1B8D;SUNDANESE LETTER NGA;Lo;0;L;;;;;N;;;;; -1B8E;SUNDANESE LETTER CA;Lo;0;L;;;;;N;;;;; -1B8F;SUNDANESE LETTER JA;Lo;0;L;;;;;N;;;;; -1B90;SUNDANESE LETTER ZA;Lo;0;L;;;;;N;;;;; -1B91;SUNDANESE LETTER NYA;Lo;0;L;;;;;N;;;;; -1B92;SUNDANESE LETTER TA;Lo;0;L;;;;;N;;;;; -1B93;SUNDANESE LETTER DA;Lo;0;L;;;;;N;;;;; -1B94;SUNDANESE LETTER NA;Lo;0;L;;;;;N;;;;; -1B95;SUNDANESE LETTER PA;Lo;0;L;;;;;N;;;;; -1B96;SUNDANESE LETTER FA;Lo;0;L;;;;;N;;;;; -1B97;SUNDANESE LETTER VA;Lo;0;L;;;;;N;;;;; -1B98;SUNDANESE LETTER BA;Lo;0;L;;;;;N;;;;; -1B99;SUNDANESE LETTER MA;Lo;0;L;;;;;N;;;;; -1B9A;SUNDANESE LETTER YA;Lo;0;L;;;;;N;;;;; -1B9B;SUNDANESE LETTER RA;Lo;0;L;;;;;N;;;;; -1B9C;SUNDANESE LETTER LA;Lo;0;L;;;;;N;;;;; -1B9D;SUNDANESE LETTER WA;Lo;0;L;;;;;N;;;;; -1B9E;SUNDANESE LETTER SA;Lo;0;L;;;;;N;;;;; -1B9F;SUNDANESE LETTER XA;Lo;0;L;;;;;N;;;;; -1BA0;SUNDANESE LETTER HA;Lo;0;L;;;;;N;;;;; -1BA1;SUNDANESE CONSONANT SIGN PAMINGKAL;Mc;0;L;;;;;N;;;;; -1BA2;SUNDANESE CONSONANT SIGN PANYAKRA;Mn;0;NSM;;;;;N;;;;; -1BA3;SUNDANESE CONSONANT SIGN PANYIKU;Mn;0;NSM;;;;;N;;;;; -1BA4;SUNDANESE VOWEL SIGN PANGHULU;Mn;0;NSM;;;;;N;;;;; -1BA5;SUNDANESE VOWEL SIGN PANYUKU;Mn;0;NSM;;;;;N;;;;; -1BA6;SUNDANESE VOWEL SIGN PANAELAENG;Mc;0;L;;;;;N;;;;; -1BA7;SUNDANESE VOWEL SIGN PANOLONG;Mc;0;L;;;;;N;;;;; -1BA8;SUNDANESE VOWEL SIGN PAMEPET;Mn;0;NSM;;;;;N;;;;; -1BA9;SUNDANESE VOWEL SIGN PANEULEUNG;Mn;0;NSM;;;;;N;;;;; -1BAA;SUNDANESE SIGN PAMAAEH;Mc;9;L;;;;;N;;;;; -1BAB;SUNDANESE SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -1BAC;SUNDANESE CONSONANT SIGN PASANGAN MA;Mn;0;NSM;;;;;N;;;;; -1BAD;SUNDANESE CONSONANT SIGN PASANGAN WA;Mn;0;NSM;;;;;N;;;;; -1BAE;SUNDANESE LETTER KHA;Lo;0;L;;;;;N;;;;; -1BAF;SUNDANESE LETTER SYA;Lo;0;L;;;;;N;;;;; -1BB0;SUNDANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1BB1;SUNDANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1BB2;SUNDANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1BB3;SUNDANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1BB4;SUNDANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1BB5;SUNDANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1BB6;SUNDANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1BB7;SUNDANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1BB8;SUNDANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1BB9;SUNDANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1BBA;SUNDANESE AVAGRAHA;Lo;0;L;;;;;N;;;;; -1BBB;SUNDANESE LETTER REU;Lo;0;L;;;;;N;;;;; -1BBC;SUNDANESE LETTER LEU;Lo;0;L;;;;;N;;;;; -1BBD;SUNDANESE LETTER BHA;Lo;0;L;;;;;N;;;;; -1BBE;SUNDANESE LETTER FINAL K;Lo;0;L;;;;;N;;;;; -1BBF;SUNDANESE LETTER FINAL M;Lo;0;L;;;;;N;;;;; -1BC0;BATAK LETTER A;Lo;0;L;;;;;N;;;;; -1BC1;BATAK LETTER SIMALUNGUN A;Lo;0;L;;;;;N;;;;; -1BC2;BATAK LETTER HA;Lo;0;L;;;;;N;;;;; -1BC3;BATAK LETTER SIMALUNGUN HA;Lo;0;L;;;;;N;;;;; -1BC4;BATAK LETTER MANDAILING HA;Lo;0;L;;;;;N;;;;; -1BC5;BATAK LETTER BA;Lo;0;L;;;;;N;;;;; -1BC6;BATAK LETTER KARO BA;Lo;0;L;;;;;N;;;;; -1BC7;BATAK LETTER PA;Lo;0;L;;;;;N;;;;; -1BC8;BATAK LETTER SIMALUNGUN PA;Lo;0;L;;;;;N;;;;; -1BC9;BATAK LETTER NA;Lo;0;L;;;;;N;;;;; -1BCA;BATAK LETTER MANDAILING NA;Lo;0;L;;;;;N;;;;; -1BCB;BATAK LETTER WA;Lo;0;L;;;;;N;;;;; -1BCC;BATAK LETTER SIMALUNGUN WA;Lo;0;L;;;;;N;;;;; -1BCD;BATAK LETTER PAKPAK WA;Lo;0;L;;;;;N;;;;; -1BCE;BATAK LETTER GA;Lo;0;L;;;;;N;;;;; -1BCF;BATAK LETTER SIMALUNGUN GA;Lo;0;L;;;;;N;;;;; -1BD0;BATAK LETTER JA;Lo;0;L;;;;;N;;;;; -1BD1;BATAK LETTER DA;Lo;0;L;;;;;N;;;;; -1BD2;BATAK LETTER RA;Lo;0;L;;;;;N;;;;; -1BD3;BATAK LETTER SIMALUNGUN RA;Lo;0;L;;;;;N;;;;; -1BD4;BATAK LETTER MA;Lo;0;L;;;;;N;;;;; -1BD5;BATAK LETTER SIMALUNGUN MA;Lo;0;L;;;;;N;;;;; -1BD6;BATAK LETTER SOUTHERN TA;Lo;0;L;;;;;N;;;;; -1BD7;BATAK LETTER NORTHERN TA;Lo;0;L;;;;;N;;;;; -1BD8;BATAK LETTER SA;Lo;0;L;;;;;N;;;;; -1BD9;BATAK LETTER SIMALUNGUN SA;Lo;0;L;;;;;N;;;;; -1BDA;BATAK LETTER MANDAILING SA;Lo;0;L;;;;;N;;;;; -1BDB;BATAK LETTER YA;Lo;0;L;;;;;N;;;;; -1BDC;BATAK LETTER SIMALUNGUN YA;Lo;0;L;;;;;N;;;;; -1BDD;BATAK LETTER NGA;Lo;0;L;;;;;N;;;;; -1BDE;BATAK LETTER LA;Lo;0;L;;;;;N;;;;; -1BDF;BATAK LETTER SIMALUNGUN LA;Lo;0;L;;;;;N;;;;; -1BE0;BATAK LETTER NYA;Lo;0;L;;;;;N;;;;; -1BE1;BATAK LETTER CA;Lo;0;L;;;;;N;;;;; -1BE2;BATAK LETTER NDA;Lo;0;L;;;;;N;;;;; -1BE3;BATAK LETTER MBA;Lo;0;L;;;;;N;;;;; -1BE4;BATAK LETTER I;Lo;0;L;;;;;N;;;;; -1BE5;BATAK LETTER U;Lo;0;L;;;;;N;;;;; -1BE6;BATAK SIGN TOMPI;Mn;7;NSM;;;;;N;;;;; -1BE7;BATAK VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1BE8;BATAK VOWEL SIGN PAKPAK E;Mn;0;NSM;;;;;N;;;;; -1BE9;BATAK VOWEL SIGN EE;Mn;0;NSM;;;;;N;;;;; -1BEA;BATAK VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -1BEB;BATAK VOWEL SIGN KARO I;Mc;0;L;;;;;N;;;;; -1BEC;BATAK VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1BED;BATAK VOWEL SIGN KARO O;Mn;0;NSM;;;;;N;;;;; -1BEE;BATAK VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -1BEF;BATAK VOWEL SIGN U FOR SIMALUNGUN SA;Mn;0;NSM;;;;;N;;;;; -1BF0;BATAK CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; -1BF1;BATAK CONSONANT SIGN H;Mn;0;NSM;;;;;N;;;;; -1BF2;BATAK PANGOLAT;Mc;9;L;;;;;N;;;;; -1BF3;BATAK PANONGONAN;Mc;9;L;;;;;N;;;;; -1BFC;BATAK SYMBOL BINDU NA METEK;Po;0;L;;;;;N;;;;; -1BFD;BATAK SYMBOL BINDU PINARBORAS;Po;0;L;;;;;N;;;;; -1BFE;BATAK SYMBOL BINDU JUDUL;Po;0;L;;;;;N;;;;; -1BFF;BATAK SYMBOL BINDU PANGOLAT;Po;0;L;;;;;N;;;;; -1C00;LEPCHA LETTER KA;Lo;0;L;;;;;N;;;;; -1C01;LEPCHA LETTER KLA;Lo;0;L;;;;;N;;;;; -1C02;LEPCHA LETTER KHA;Lo;0;L;;;;;N;;;;; -1C03;LEPCHA LETTER GA;Lo;0;L;;;;;N;;;;; -1C04;LEPCHA LETTER GLA;Lo;0;L;;;;;N;;;;; -1C05;LEPCHA LETTER NGA;Lo;0;L;;;;;N;;;;; -1C06;LEPCHA LETTER CA;Lo;0;L;;;;;N;;;;; -1C07;LEPCHA LETTER CHA;Lo;0;L;;;;;N;;;;; -1C08;LEPCHA LETTER JA;Lo;0;L;;;;;N;;;;; -1C09;LEPCHA LETTER NYA;Lo;0;L;;;;;N;;;;; -1C0A;LEPCHA LETTER TA;Lo;0;L;;;;;N;;;;; -1C0B;LEPCHA LETTER THA;Lo;0;L;;;;;N;;;;; -1C0C;LEPCHA LETTER DA;Lo;0;L;;;;;N;;;;; -1C0D;LEPCHA LETTER NA;Lo;0;L;;;;;N;;;;; -1C0E;LEPCHA LETTER PA;Lo;0;L;;;;;N;;;;; -1C0F;LEPCHA LETTER PLA;Lo;0;L;;;;;N;;;;; -1C10;LEPCHA LETTER PHA;Lo;0;L;;;;;N;;;;; -1C11;LEPCHA LETTER FA;Lo;0;L;;;;;N;;;;; -1C12;LEPCHA LETTER FLA;Lo;0;L;;;;;N;;;;; -1C13;LEPCHA LETTER BA;Lo;0;L;;;;;N;;;;; -1C14;LEPCHA LETTER BLA;Lo;0;L;;;;;N;;;;; -1C15;LEPCHA LETTER MA;Lo;0;L;;;;;N;;;;; -1C16;LEPCHA LETTER MLA;Lo;0;L;;;;;N;;;;; -1C17;LEPCHA LETTER TSA;Lo;0;L;;;;;N;;;;; -1C18;LEPCHA LETTER TSHA;Lo;0;L;;;;;N;;;;; -1C19;LEPCHA LETTER DZA;Lo;0;L;;;;;N;;;;; -1C1A;LEPCHA LETTER YA;Lo;0;L;;;;;N;;;;; -1C1B;LEPCHA LETTER RA;Lo;0;L;;;;;N;;;;; -1C1C;LEPCHA LETTER LA;Lo;0;L;;;;;N;;;;; -1C1D;LEPCHA LETTER HA;Lo;0;L;;;;;N;;;;; -1C1E;LEPCHA LETTER HLA;Lo;0;L;;;;;N;;;;; -1C1F;LEPCHA LETTER VA;Lo;0;L;;;;;N;;;;; -1C20;LEPCHA LETTER SA;Lo;0;L;;;;;N;;;;; -1C21;LEPCHA LETTER SHA;Lo;0;L;;;;;N;;;;; -1C22;LEPCHA LETTER WA;Lo;0;L;;;;;N;;;;; -1C23;LEPCHA LETTER A;Lo;0;L;;;;;N;;;;; -1C24;LEPCHA SUBJOINED LETTER YA;Mc;0;L;;;;;N;;;;; -1C25;LEPCHA SUBJOINED LETTER RA;Mc;0;L;;;;;N;;;;; -1C26;LEPCHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1C27;LEPCHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -1C28;LEPCHA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1C29;LEPCHA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -1C2A;LEPCHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -1C2B;LEPCHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -1C2C;LEPCHA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -1C2D;LEPCHA CONSONANT SIGN K;Mn;0;NSM;;;;;N;;;;; -1C2E;LEPCHA CONSONANT SIGN M;Mn;0;NSM;;;;;N;;;;; -1C2F;LEPCHA CONSONANT SIGN L;Mn;0;NSM;;;;;N;;;;; -1C30;LEPCHA CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; -1C31;LEPCHA CONSONANT SIGN P;Mn;0;NSM;;;;;N;;;;; -1C32;LEPCHA CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; -1C33;LEPCHA CONSONANT SIGN T;Mn;0;NSM;;;;;N;;;;; -1C34;LEPCHA CONSONANT SIGN NYIN-DO;Mc;0;L;;;;;N;;;;; -1C35;LEPCHA CONSONANT SIGN KANG;Mc;0;L;;;;;N;;;;; -1C36;LEPCHA SIGN RAN;Mn;0;NSM;;;;;N;;;;; -1C37;LEPCHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -1C3B;LEPCHA PUNCTUATION TA-ROL;Po;0;L;;;;;N;;;;; -1C3C;LEPCHA PUNCTUATION NYET THYOOM TA-ROL;Po;0;L;;;;;N;;;;; -1C3D;LEPCHA PUNCTUATION CER-WA;Po;0;L;;;;;N;;;;; -1C3E;LEPCHA PUNCTUATION TSHOOK CER-WA;Po;0;L;;;;;N;;;;; -1C3F;LEPCHA PUNCTUATION TSHOOK;Po;0;L;;;;;N;;;;; -1C40;LEPCHA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1C41;LEPCHA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1C42;LEPCHA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1C43;LEPCHA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1C44;LEPCHA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1C45;LEPCHA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1C46;LEPCHA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1C47;LEPCHA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1C48;LEPCHA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1C49;LEPCHA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1C4D;LEPCHA LETTER TTA;Lo;0;L;;;;;N;;;;; -1C4E;LEPCHA LETTER TTHA;Lo;0;L;;;;;N;;;;; -1C4F;LEPCHA LETTER DDA;Lo;0;L;;;;;N;;;;; -1C50;OL CHIKI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -1C51;OL CHIKI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -1C52;OL CHIKI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -1C53;OL CHIKI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1C54;OL CHIKI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1C55;OL CHIKI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1C56;OL CHIKI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1C57;OL CHIKI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1C58;OL CHIKI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1C59;OL CHIKI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1C5A;OL CHIKI LETTER LA;Lo;0;L;;;;;N;;;;; -1C5B;OL CHIKI LETTER AT;Lo;0;L;;;;;N;;;;; -1C5C;OL CHIKI LETTER AG;Lo;0;L;;;;;N;;;;; -1C5D;OL CHIKI LETTER ANG;Lo;0;L;;;;;N;;;;; -1C5E;OL CHIKI LETTER AL;Lo;0;L;;;;;N;;;;; -1C5F;OL CHIKI LETTER LAA;Lo;0;L;;;;;N;;;;; -1C60;OL CHIKI LETTER AAK;Lo;0;L;;;;;N;;;;; -1C61;OL CHIKI LETTER AAJ;Lo;0;L;;;;;N;;;;; -1C62;OL CHIKI LETTER AAM;Lo;0;L;;;;;N;;;;; -1C63;OL CHIKI LETTER AAW;Lo;0;L;;;;;N;;;;; -1C64;OL CHIKI LETTER LI;Lo;0;L;;;;;N;;;;; -1C65;OL CHIKI LETTER IS;Lo;0;L;;;;;N;;;;; -1C66;OL CHIKI LETTER IH;Lo;0;L;;;;;N;;;;; -1C67;OL CHIKI LETTER INY;Lo;0;L;;;;;N;;;;; -1C68;OL CHIKI LETTER IR;Lo;0;L;;;;;N;;;;; -1C69;OL CHIKI LETTER LU;Lo;0;L;;;;;N;;;;; -1C6A;OL CHIKI LETTER UC;Lo;0;L;;;;;N;;;;; -1C6B;OL CHIKI LETTER UD;Lo;0;L;;;;;N;;;;; -1C6C;OL CHIKI LETTER UNN;Lo;0;L;;;;;N;;;;; -1C6D;OL CHIKI LETTER UY;Lo;0;L;;;;;N;;;;; -1C6E;OL CHIKI LETTER LE;Lo;0;L;;;;;N;;;;; -1C6F;OL CHIKI LETTER EP;Lo;0;L;;;;;N;;;;; -1C70;OL CHIKI LETTER EDD;Lo;0;L;;;;;N;;;;; -1C71;OL CHIKI LETTER EN;Lo;0;L;;;;;N;;;;; -1C72;OL CHIKI LETTER ERR;Lo;0;L;;;;;N;;;;; -1C73;OL CHIKI LETTER LO;Lo;0;L;;;;;N;;;;; -1C74;OL CHIKI LETTER OTT;Lo;0;L;;;;;N;;;;; -1C75;OL CHIKI LETTER OB;Lo;0;L;;;;;N;;;;; -1C76;OL CHIKI LETTER OV;Lo;0;L;;;;;N;;;;; -1C77;OL CHIKI LETTER OH;Lo;0;L;;;;;N;;;;; -1C78;OL CHIKI MU TTUDDAG;Lm;0;L;;;;;N;;;;; -1C79;OL CHIKI GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; -1C7A;OL CHIKI MU-GAAHLAA TTUDDAAG;Lm;0;L;;;;;N;;;;; -1C7B;OL CHIKI RELAA;Lm;0;L;;;;;N;;;;; -1C7C;OL CHIKI PHAARKAA;Lm;0;L;;;;;N;;;;; -1C7D;OL CHIKI AHAD;Lm;0;L;;;;;N;;;;; -1C7E;OL CHIKI PUNCTUATION MUCAAD;Po;0;L;;;;;N;;;;; -1C7F;OL CHIKI PUNCTUATION DOUBLE MUCAAD;Po;0;L;;;;;N;;;;; -1CC0;SUNDANESE PUNCTUATION BINDU SURYA;Po;0;L;;;;;N;;;;; -1CC1;SUNDANESE PUNCTUATION BINDU PANGLONG;Po;0;L;;;;;N;;;;; -1CC2;SUNDANESE PUNCTUATION BINDU PURNAMA;Po;0;L;;;;;N;;;;; -1CC3;SUNDANESE PUNCTUATION BINDU CAKRA;Po;0;L;;;;;N;;;;; -1CC4;SUNDANESE PUNCTUATION BINDU LEU SATANGA;Po;0;L;;;;;N;;;;; -1CC5;SUNDANESE PUNCTUATION BINDU KA SATANGA;Po;0;L;;;;;N;;;;; -1CC6;SUNDANESE PUNCTUATION BINDU DA SATANGA;Po;0;L;;;;;N;;;;; -1CC7;SUNDANESE PUNCTUATION BINDU BA SATANGA;Po;0;L;;;;;N;;;;; -1CD0;VEDIC TONE KARSHANA;Mn;230;NSM;;;;;N;;;;; -1CD1;VEDIC TONE SHARA;Mn;230;NSM;;;;;N;;;;; -1CD2;VEDIC TONE PRENKHA;Mn;230;NSM;;;;;N;;;;; -1CD3;VEDIC SIGN NIHSHVASA;Po;0;L;;;;;N;;;;; -1CD4;VEDIC SIGN YAJURVEDIC MIDLINE SVARITA;Mn;1;NSM;;;;;N;;;;; -1CD5;VEDIC TONE YAJURVEDIC AGGRAVATED INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; -1CD6;VEDIC TONE YAJURVEDIC INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; -1CD7;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA;Mn;220;NSM;;;;;N;;;;; -1CD8;VEDIC TONE CANDRA BELOW;Mn;220;NSM;;;;;N;;;;; -1CD9;VEDIC TONE YAJURVEDIC KATHAKA INDEPENDENT SVARITA SCHROEDER;Mn;220;NSM;;;;;N;;;;; -1CDA;VEDIC TONE DOUBLE SVARITA;Mn;230;NSM;;;;;N;;;;; -1CDB;VEDIC TONE TRIPLE SVARITA;Mn;230;NSM;;;;;N;;;;; -1CDC;VEDIC TONE KATHAKA ANUDATTA;Mn;220;NSM;;;;;N;;;;; -1CDD;VEDIC TONE DOT BELOW;Mn;220;NSM;;;;;N;;;;; -1CDE;VEDIC TONE TWO DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -1CDF;VEDIC TONE THREE DOTS BELOW;Mn;220;NSM;;;;;N;;;;; -1CE0;VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA;Mn;230;NSM;;;;;N;;;;; -1CE1;VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA;Mc;0;L;;;;;N;;;;; -1CE2;VEDIC SIGN VISARGA SVARITA;Mn;1;NSM;;;;;N;;;;; -1CE3;VEDIC SIGN VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; -1CE4;VEDIC SIGN REVERSED VISARGA UDATTA;Mn;1;NSM;;;;;N;;;;; -1CE5;VEDIC SIGN VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; -1CE6;VEDIC SIGN REVERSED VISARGA ANUDATTA;Mn;1;NSM;;;;;N;;;;; -1CE7;VEDIC SIGN VISARGA UDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; -1CE8;VEDIC SIGN VISARGA ANUDATTA WITH TAIL;Mn;1;NSM;;;;;N;;;;; -1CE9;VEDIC SIGN ANUSVARA ANTARGOMUKHA;Lo;0;L;;;;;N;;;;; -1CEA;VEDIC SIGN ANUSVARA BAHIRGOMUKHA;Lo;0;L;;;;;N;;;;; -1CEB;VEDIC SIGN ANUSVARA VAMAGOMUKHA;Lo;0;L;;;;;N;;;;; -1CEC;VEDIC SIGN ANUSVARA VAMAGOMUKHA WITH TAIL;Lo;0;L;;;;;N;;;;; -1CED;VEDIC SIGN TIRYAK;Mn;220;NSM;;;;;N;;;;; -1CEE;VEDIC SIGN HEXIFORM LONG ANUSVARA;Lo;0;L;;;;;N;;;;; -1CEF;VEDIC SIGN LONG ANUSVARA;Lo;0;L;;;;;N;;;;; -1CF0;VEDIC SIGN RTHANG LONG ANUSVARA;Lo;0;L;;;;;N;;;;; -1CF1;VEDIC SIGN ANUSVARA UBHAYATO MUKHA;Lo;0;L;;;;;N;;;;; -1CF2;VEDIC SIGN ARDHAVISARGA;Mc;0;L;;;;;N;;;;; -1CF3;VEDIC SIGN ROTATED ARDHAVISARGA;Mc;0;L;;;;;N;;;;; -1CF4;VEDIC TONE CANDRA ABOVE;Mn;230;NSM;;;;;N;;;;; -1CF5;VEDIC SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -1CF6;VEDIC SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -1CF8;VEDIC TONE RING ABOVE;Mn;230;NSM;;;;;N;;;;; -1CF9;VEDIC TONE DOUBLE RING ABOVE;Mn;230;NSM;;;;;N;;;;; -1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;; -1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;; -1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;; -1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;; -1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;; -1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;; -1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;; -1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;; -1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;; -1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;; -1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;; -1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;; -1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;; -1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;; -1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;; -1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;; -1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;; -1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;; -1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;; -1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;; -1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;; -1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;; -1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;; -1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;; -1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;; -1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;; -1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;; -1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;; -1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;; -1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;; -1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;; -1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;; -1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;; -1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;; -1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;; -1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;; -1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;; -1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;; -1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;; -1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;; -1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;; -1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;; -1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;; -1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;; -1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L; 0041;;;;N;;;;; -1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L; 00C6;;;;N;;;;; -1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L; 0042;;;;N;;;;; -1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;; -1D30;MODIFIER LETTER CAPITAL D;Lm;0;L; 0044;;;;N;;;;; -1D31;MODIFIER LETTER CAPITAL E;Lm;0;L; 0045;;;;N;;;;; -1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L; 018E;;;;N;;;;; -1D33;MODIFIER LETTER CAPITAL G;Lm;0;L; 0047;;;;N;;;;; -1D34;MODIFIER LETTER CAPITAL H;Lm;0;L; 0048;;;;N;;;;; -1D35;MODIFIER LETTER CAPITAL I;Lm;0;L; 0049;;;;N;;;;; -1D36;MODIFIER LETTER CAPITAL J;Lm;0;L; 004A;;;;N;;;;; -1D37;MODIFIER LETTER CAPITAL K;Lm;0;L; 004B;;;;N;;;;; -1D38;MODIFIER LETTER CAPITAL L;Lm;0;L; 004C;;;;N;;;;; -1D39;MODIFIER LETTER CAPITAL M;Lm;0;L; 004D;;;;N;;;;; -1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L; 004E;;;;N;;;;; -1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;; -1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L; 004F;;;;N;;;;; -1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L; 0222;;;;N;;;;; -1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L; 0050;;;;N;;;;; -1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L; 0052;;;;N;;;;; -1D40;MODIFIER LETTER CAPITAL T;Lm;0;L; 0054;;;;N;;;;; -1D41;MODIFIER LETTER CAPITAL U;Lm;0;L; 0055;;;;N;;;;; -1D42;MODIFIER LETTER CAPITAL W;Lm;0;L; 0057;;;;N;;;;; -1D43;MODIFIER LETTER SMALL A;Lm;0;L; 0061;;;;N;;;;; -1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L; 0250;;;;N;;;;; -1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L; 0251;;;;N;;;;; -1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L; 1D02;;;;N;;;;; -1D47;MODIFIER LETTER SMALL B;Lm;0;L; 0062;;;;N;;;;; -1D48;MODIFIER LETTER SMALL D;Lm;0;L; 0064;;;;N;;;;; -1D49;MODIFIER LETTER SMALL E;Lm;0;L; 0065;;;;N;;;;; -1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L; 0259;;;;N;;;;; -1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L; 025B;;;;N;;;;; -1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L; 025C;;;;N;;;;; -1D4D;MODIFIER LETTER SMALL G;Lm;0;L; 0067;;;;N;;;;; -1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;; -1D4F;MODIFIER LETTER SMALL K;Lm;0;L; 006B;;;;N;;;;; -1D50;MODIFIER LETTER SMALL M;Lm;0;L; 006D;;;;N;;;;; -1D51;MODIFIER LETTER SMALL ENG;Lm;0;L; 014B;;;;N;;;;; -1D52;MODIFIER LETTER SMALL O;Lm;0;L; 006F;;;;N;;;;; -1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L; 0254;;;;N;;;;; -1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L; 1D16;;;;N;;;;; -1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L; 1D17;;;;N;;;;; -1D56;MODIFIER LETTER SMALL P;Lm;0;L; 0070;;;;N;;;;; -1D57;MODIFIER LETTER SMALL T;Lm;0;L; 0074;;;;N;;;;; -1D58;MODIFIER LETTER SMALL U;Lm;0;L; 0075;;;;N;;;;; -1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L; 1D1D;;;;N;;;;; -1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L; 026F;;;;N;;;;; -1D5B;MODIFIER LETTER SMALL V;Lm;0;L; 0076;;;;N;;;;; -1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L; 1D25;;;;N;;;;; -1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L; 03B2;;;;N;;;;; -1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L; 03B3;;;;N;;;;; -1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L; 03B4;;;;N;;;;; -1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L; 03C6;;;;N;;;;; -1D61;MODIFIER LETTER SMALL CHI;Lm;0;L; 03C7;;;;N;;;;; -1D62;LATIN SUBSCRIPT SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; -1D63;LATIN SUBSCRIPT SMALL LETTER R;Lm;0;L; 0072;;;;N;;;;; -1D64;LATIN SUBSCRIPT SMALL LETTER U;Lm;0;L; 0075;;;;N;;;;; -1D65;LATIN SUBSCRIPT SMALL LETTER V;Lm;0;L; 0076;;;;N;;;;; -1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Lm;0;L; 03B2;;;;N;;;;; -1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Lm;0;L; 03B3;;;;N;;;;; -1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Lm;0;L; 03C1;;;;N;;;;; -1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Lm;0;L; 03C6;;;;N;;;;; -1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Lm;0;L; 03C7;;;;N;;;;; -1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;; -1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;; -1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L; 043D;;;;N;;;;; -1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;A77D;;A77D -1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;; -1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;; -1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;; -1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63 -1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;; -1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;; -1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;; -1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;; -1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L; 0252;;;;N;;;;; -1D9C;MODIFIER LETTER SMALL C;Lm;0;L; 0063;;;;N;;;;; -1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L; 0255;;;;N;;;;; -1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L; 00F0;;;;N;;;;; -1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L; 025C;;;;N;;;;; -1DA0;MODIFIER LETTER SMALL F;Lm;0;L; 0066;;;;N;;;;; -1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L; 025F;;;;N;;;;; -1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L; 0261;;;;N;;;;; -1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L; 0265;;;;N;;;;; -1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L; 0268;;;;N;;;;; -1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L; 0269;;;;N;;;;; -1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L; 026A;;;;N;;;;; -1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L; 1D7B;;;;N;;;;; -1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L; 029D;;;;N;;;;; -1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L; 026D;;;;N;;;;; -1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L; 1D85;;;;N;;;;; -1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L; 029F;;;;N;;;;; -1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L; 0271;;;;N;;;;; -1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L; 0270;;;;N;;;;; -1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L; 0272;;;;N;;;;; -1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L; 0273;;;;N;;;;; -1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L; 0274;;;;N;;;;; -1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L; 0275;;;;N;;;;; -1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L; 0278;;;;N;;;;; -1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L; 0282;;;;N;;;;; -1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L; 0283;;;;N;;;;; -1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L; 01AB;;;;N;;;;; -1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L; 0289;;;;N;;;;; -1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L; 028A;;;;N;;;;; -1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L; 1D1C;;;;N;;;;; -1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L; 028B;;;;N;;;;; -1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L; 028C;;;;N;;;;; -1DBB;MODIFIER LETTER SMALL Z;Lm;0;L; 007A;;;;N;;;;; -1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L; 0290;;;;N;;;;; -1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L; 0291;;;;N;;;;; -1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L; 0292;;;;N;;;;; -1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L; 03B8;;;;N;;;;; -1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;; -1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;; -1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;; -1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;; -1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;; -1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;; -1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;; -1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;; -1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;; -1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;; -1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;; -1DCB;COMBINING BREVE-MACRON;Mn;230;NSM;;;;;N;;;;; -1DCC;COMBINING MACRON-BREVE;Mn;230;NSM;;;;;N;;;;; -1DCD;COMBINING DOUBLE CIRCUMFLEX ABOVE;Mn;234;NSM;;;;;N;;;;; -1DCE;COMBINING OGONEK ABOVE;Mn;214;NSM;;;;;N;;;;; -1DCF;COMBINING ZIGZAG BELOW;Mn;220;NSM;;;;;N;;;;; -1DD0;COMBINING IS BELOW;Mn;202;NSM;;;;;N;;;;; -1DD1;COMBINING UR ABOVE;Mn;230;NSM;;;;;N;;;;; -1DD2;COMBINING US ABOVE;Mn;230;NSM;;;;;N;;;;; -1DD3;COMBINING LATIN SMALL LETTER FLATTENED OPEN A ABOVE;Mn;230;NSM;;;;;N;;;;; -1DD4;COMBINING LATIN SMALL LETTER AE;Mn;230;NSM;;;;;N;;;;; -1DD5;COMBINING LATIN SMALL LETTER AO;Mn;230;NSM;;;;;N;;;;; -1DD6;COMBINING LATIN SMALL LETTER AV;Mn;230;NSM;;;;;N;;;;; -1DD7;COMBINING LATIN SMALL LETTER C CEDILLA;Mn;230;NSM;;;;;N;;;;; -1DD8;COMBINING LATIN SMALL LETTER INSULAR D;Mn;230;NSM;;;;;N;;;;; -1DD9;COMBINING LATIN SMALL LETTER ETH;Mn;230;NSM;;;;;N;;;;; -1DDA;COMBINING LATIN SMALL LETTER G;Mn;230;NSM;;;;;N;;;;; -1DDB;COMBINING LATIN LETTER SMALL CAPITAL G;Mn;230;NSM;;;;;N;;;;; -1DDC;COMBINING LATIN SMALL LETTER K;Mn;230;NSM;;;;;N;;;;; -1DDD;COMBINING LATIN SMALL LETTER L;Mn;230;NSM;;;;;N;;;;; -1DDE;COMBINING LATIN LETTER SMALL CAPITAL L;Mn;230;NSM;;;;;N;;;;; -1DDF;COMBINING LATIN LETTER SMALL CAPITAL M;Mn;230;NSM;;;;;N;;;;; -1DE0;COMBINING LATIN SMALL LETTER N;Mn;230;NSM;;;;;N;;;;; -1DE1;COMBINING LATIN LETTER SMALL CAPITAL N;Mn;230;NSM;;;;;N;;;;; -1DE2;COMBINING LATIN LETTER SMALL CAPITAL R;Mn;230;NSM;;;;;N;;;;; -1DE3;COMBINING LATIN SMALL LETTER R ROTUNDA;Mn;230;NSM;;;;;N;;;;; -1DE4;COMBINING LATIN SMALL LETTER S;Mn;230;NSM;;;;;N;;;;; -1DE5;COMBINING LATIN SMALL LETTER LONG S;Mn;230;NSM;;;;;N;;;;; -1DE6;COMBINING LATIN SMALL LETTER Z;Mn;230;NSM;;;;;N;;;;; -1DE7;COMBINING LATIN SMALL LETTER ALPHA;Mn;230;NSM;;;;;N;;;;; -1DE8;COMBINING LATIN SMALL LETTER B;Mn;230;NSM;;;;;N;;;;; -1DE9;COMBINING LATIN SMALL LETTER BETA;Mn;230;NSM;;;;;N;;;;; -1DEA;COMBINING LATIN SMALL LETTER SCHWA;Mn;230;NSM;;;;;N;;;;; -1DEB;COMBINING LATIN SMALL LETTER F;Mn;230;NSM;;;;;N;;;;; -1DEC;COMBINING LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Mn;230;NSM;;;;;N;;;;; -1DED;COMBINING LATIN SMALL LETTER O WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; -1DEE;COMBINING LATIN SMALL LETTER P;Mn;230;NSM;;;;;N;;;;; -1DEF;COMBINING LATIN SMALL LETTER ESH;Mn;230;NSM;;;;;N;;;;; -1DF0;COMBINING LATIN SMALL LETTER U WITH LIGHT CENTRALIZATION STROKE;Mn;230;NSM;;;;;N;;;;; -1DF1;COMBINING LATIN SMALL LETTER W;Mn;230;NSM;;;;;N;;;;; -1DF2;COMBINING LATIN SMALL LETTER A WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; -1DF3;COMBINING LATIN SMALL LETTER O WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; -1DF4;COMBINING LATIN SMALL LETTER U WITH DIAERESIS;Mn;230;NSM;;;;;N;;;;; -1DF5;COMBINING UP TACK ABOVE;Mn;230;NSM;;;;;N;;;;; -1DFC;COMBINING DOUBLE INVERTED BREVE BELOW;Mn;233;NSM;;;;;N;;;;; -1DFD;COMBINING ALMOST EQUAL TO BELOW;Mn;220;NSM;;;;;N;;;;; -1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;; -1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;; -1E00;LATIN CAPITAL LETTER A WITH RING BELOW;Lu;0;L;0041 0325;;;;N;;;;1E01; -1E01;LATIN SMALL LETTER A WITH RING BELOW;Ll;0;L;0061 0325;;;;N;;;1E00;;1E00 -1E02;LATIN CAPITAL LETTER B WITH DOT ABOVE;Lu;0;L;0042 0307;;;;N;;;;1E03; -1E03;LATIN SMALL LETTER B WITH DOT ABOVE;Ll;0;L;0062 0307;;;;N;;;1E02;;1E02 -1E04;LATIN CAPITAL LETTER B WITH DOT BELOW;Lu;0;L;0042 0323;;;;N;;;;1E05; -1E05;LATIN SMALL LETTER B WITH DOT BELOW;Ll;0;L;0062 0323;;;;N;;;1E04;;1E04 -1E06;LATIN CAPITAL LETTER B WITH LINE BELOW;Lu;0;L;0042 0331;;;;N;;;;1E07; -1E07;LATIN SMALL LETTER B WITH LINE BELOW;Ll;0;L;0062 0331;;;;N;;;1E06;;1E06 -1E08;LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE;Lu;0;L;00C7 0301;;;;N;;;;1E09; -1E09;LATIN SMALL LETTER C WITH CEDILLA AND ACUTE;Ll;0;L;00E7 0301;;;;N;;;1E08;;1E08 -1E0A;LATIN CAPITAL LETTER D WITH DOT ABOVE;Lu;0;L;0044 0307;;;;N;;;;1E0B; -1E0B;LATIN SMALL LETTER D WITH DOT ABOVE;Ll;0;L;0064 0307;;;;N;;;1E0A;;1E0A -1E0C;LATIN CAPITAL LETTER D WITH DOT BELOW;Lu;0;L;0044 0323;;;;N;;;;1E0D; -1E0D;LATIN SMALL LETTER D WITH DOT BELOW;Ll;0;L;0064 0323;;;;N;;;1E0C;;1E0C -1E0E;LATIN CAPITAL LETTER D WITH LINE BELOW;Lu;0;L;0044 0331;;;;N;;;;1E0F; -1E0F;LATIN SMALL LETTER D WITH LINE BELOW;Ll;0;L;0064 0331;;;;N;;;1E0E;;1E0E -1E10;LATIN CAPITAL LETTER D WITH CEDILLA;Lu;0;L;0044 0327;;;;N;;;;1E11; -1E11;LATIN SMALL LETTER D WITH CEDILLA;Ll;0;L;0064 0327;;;;N;;;1E10;;1E10 -1E12;LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW;Lu;0;L;0044 032D;;;;N;;;;1E13; -1E13;LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW;Ll;0;L;0064 032D;;;;N;;;1E12;;1E12 -1E14;LATIN CAPITAL LETTER E WITH MACRON AND GRAVE;Lu;0;L;0112 0300;;;;N;;;;1E15; -1E15;LATIN SMALL LETTER E WITH MACRON AND GRAVE;Ll;0;L;0113 0300;;;;N;;;1E14;;1E14 -1E16;LATIN CAPITAL LETTER E WITH MACRON AND ACUTE;Lu;0;L;0112 0301;;;;N;;;;1E17; -1E17;LATIN SMALL LETTER E WITH MACRON AND ACUTE;Ll;0;L;0113 0301;;;;N;;;1E16;;1E16 -1E18;LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW;Lu;0;L;0045 032D;;;;N;;;;1E19; -1E19;LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW;Ll;0;L;0065 032D;;;;N;;;1E18;;1E18 -1E1A;LATIN CAPITAL LETTER E WITH TILDE BELOW;Lu;0;L;0045 0330;;;;N;;;;1E1B; -1E1B;LATIN SMALL LETTER E WITH TILDE BELOW;Ll;0;L;0065 0330;;;;N;;;1E1A;;1E1A -1E1C;LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE;Lu;0;L;0228 0306;;;;N;;;;1E1D; -1E1D;LATIN SMALL LETTER E WITH CEDILLA AND BREVE;Ll;0;L;0229 0306;;;;N;;;1E1C;;1E1C -1E1E;LATIN CAPITAL LETTER F WITH DOT ABOVE;Lu;0;L;0046 0307;;;;N;;;;1E1F; -1E1F;LATIN SMALL LETTER F WITH DOT ABOVE;Ll;0;L;0066 0307;;;;N;;;1E1E;;1E1E -1E20;LATIN CAPITAL LETTER G WITH MACRON;Lu;0;L;0047 0304;;;;N;;;;1E21; -1E21;LATIN SMALL LETTER G WITH MACRON;Ll;0;L;0067 0304;;;;N;;;1E20;;1E20 -1E22;LATIN CAPITAL LETTER H WITH DOT ABOVE;Lu;0;L;0048 0307;;;;N;;;;1E23; -1E23;LATIN SMALL LETTER H WITH DOT ABOVE;Ll;0;L;0068 0307;;;;N;;;1E22;;1E22 -1E24;LATIN CAPITAL LETTER H WITH DOT BELOW;Lu;0;L;0048 0323;;;;N;;;;1E25; -1E25;LATIN SMALL LETTER H WITH DOT BELOW;Ll;0;L;0068 0323;;;;N;;;1E24;;1E24 -1E26;LATIN CAPITAL LETTER H WITH DIAERESIS;Lu;0;L;0048 0308;;;;N;;;;1E27; -1E27;LATIN SMALL LETTER H WITH DIAERESIS;Ll;0;L;0068 0308;;;;N;;;1E26;;1E26 -1E28;LATIN CAPITAL LETTER H WITH CEDILLA;Lu;0;L;0048 0327;;;;N;;;;1E29; -1E29;LATIN SMALL LETTER H WITH CEDILLA;Ll;0;L;0068 0327;;;;N;;;1E28;;1E28 -1E2A;LATIN CAPITAL LETTER H WITH BREVE BELOW;Lu;0;L;0048 032E;;;;N;;;;1E2B; -1E2B;LATIN SMALL LETTER H WITH BREVE BELOW;Ll;0;L;0068 032E;;;;N;;;1E2A;;1E2A -1E2C;LATIN CAPITAL LETTER I WITH TILDE BELOW;Lu;0;L;0049 0330;;;;N;;;;1E2D; -1E2D;LATIN SMALL LETTER I WITH TILDE BELOW;Ll;0;L;0069 0330;;;;N;;;1E2C;;1E2C -1E2E;LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE;Lu;0;L;00CF 0301;;;;N;;;;1E2F; -1E2F;LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE;Ll;0;L;00EF 0301;;;;N;;;1E2E;;1E2E -1E30;LATIN CAPITAL LETTER K WITH ACUTE;Lu;0;L;004B 0301;;;;N;;;;1E31; -1E31;LATIN SMALL LETTER K WITH ACUTE;Ll;0;L;006B 0301;;;;N;;;1E30;;1E30 -1E32;LATIN CAPITAL LETTER K WITH DOT BELOW;Lu;0;L;004B 0323;;;;N;;;;1E33; -1E33;LATIN SMALL LETTER K WITH DOT BELOW;Ll;0;L;006B 0323;;;;N;;;1E32;;1E32 -1E34;LATIN CAPITAL LETTER K WITH LINE BELOW;Lu;0;L;004B 0331;;;;N;;;;1E35; -1E35;LATIN SMALL LETTER K WITH LINE BELOW;Ll;0;L;006B 0331;;;;N;;;1E34;;1E34 -1E36;LATIN CAPITAL LETTER L WITH DOT BELOW;Lu;0;L;004C 0323;;;;N;;;;1E37; -1E37;LATIN SMALL LETTER L WITH DOT BELOW;Ll;0;L;006C 0323;;;;N;;;1E36;;1E36 -1E38;LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON;Lu;0;L;1E36 0304;;;;N;;;;1E39; -1E39;LATIN SMALL LETTER L WITH DOT BELOW AND MACRON;Ll;0;L;1E37 0304;;;;N;;;1E38;;1E38 -1E3A;LATIN CAPITAL LETTER L WITH LINE BELOW;Lu;0;L;004C 0331;;;;N;;;;1E3B; -1E3B;LATIN SMALL LETTER L WITH LINE BELOW;Ll;0;L;006C 0331;;;;N;;;1E3A;;1E3A -1E3C;LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW;Lu;0;L;004C 032D;;;;N;;;;1E3D; -1E3D;LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW;Ll;0;L;006C 032D;;;;N;;;1E3C;;1E3C -1E3E;LATIN CAPITAL LETTER M WITH ACUTE;Lu;0;L;004D 0301;;;;N;;;;1E3F; -1E3F;LATIN SMALL LETTER M WITH ACUTE;Ll;0;L;006D 0301;;;;N;;;1E3E;;1E3E -1E40;LATIN CAPITAL LETTER M WITH DOT ABOVE;Lu;0;L;004D 0307;;;;N;;;;1E41; -1E41;LATIN SMALL LETTER M WITH DOT ABOVE;Ll;0;L;006D 0307;;;;N;;;1E40;;1E40 -1E42;LATIN CAPITAL LETTER M WITH DOT BELOW;Lu;0;L;004D 0323;;;;N;;;;1E43; -1E43;LATIN SMALL LETTER M WITH DOT BELOW;Ll;0;L;006D 0323;;;;N;;;1E42;;1E42 -1E44;LATIN CAPITAL LETTER N WITH DOT ABOVE;Lu;0;L;004E 0307;;;;N;;;;1E45; -1E45;LATIN SMALL LETTER N WITH DOT ABOVE;Ll;0;L;006E 0307;;;;N;;;1E44;;1E44 -1E46;LATIN CAPITAL LETTER N WITH DOT BELOW;Lu;0;L;004E 0323;;;;N;;;;1E47; -1E47;LATIN SMALL LETTER N WITH DOT BELOW;Ll;0;L;006E 0323;;;;N;;;1E46;;1E46 -1E48;LATIN CAPITAL LETTER N WITH LINE BELOW;Lu;0;L;004E 0331;;;;N;;;;1E49; -1E49;LATIN SMALL LETTER N WITH LINE BELOW;Ll;0;L;006E 0331;;;;N;;;1E48;;1E48 -1E4A;LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW;Lu;0;L;004E 032D;;;;N;;;;1E4B; -1E4B;LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW;Ll;0;L;006E 032D;;;;N;;;1E4A;;1E4A -1E4C;LATIN CAPITAL LETTER O WITH TILDE AND ACUTE;Lu;0;L;00D5 0301;;;;N;;;;1E4D; -1E4D;LATIN SMALL LETTER O WITH TILDE AND ACUTE;Ll;0;L;00F5 0301;;;;N;;;1E4C;;1E4C -1E4E;LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS;Lu;0;L;00D5 0308;;;;N;;;;1E4F; -1E4F;LATIN SMALL LETTER O WITH TILDE AND DIAERESIS;Ll;0;L;00F5 0308;;;;N;;;1E4E;;1E4E -1E50;LATIN CAPITAL LETTER O WITH MACRON AND GRAVE;Lu;0;L;014C 0300;;;;N;;;;1E51; -1E51;LATIN SMALL LETTER O WITH MACRON AND GRAVE;Ll;0;L;014D 0300;;;;N;;;1E50;;1E50 -1E52;LATIN CAPITAL LETTER O WITH MACRON AND ACUTE;Lu;0;L;014C 0301;;;;N;;;;1E53; -1E53;LATIN SMALL LETTER O WITH MACRON AND ACUTE;Ll;0;L;014D 0301;;;;N;;;1E52;;1E52 -1E54;LATIN CAPITAL LETTER P WITH ACUTE;Lu;0;L;0050 0301;;;;N;;;;1E55; -1E55;LATIN SMALL LETTER P WITH ACUTE;Ll;0;L;0070 0301;;;;N;;;1E54;;1E54 -1E56;LATIN CAPITAL LETTER P WITH DOT ABOVE;Lu;0;L;0050 0307;;;;N;;;;1E57; -1E57;LATIN SMALL LETTER P WITH DOT ABOVE;Ll;0;L;0070 0307;;;;N;;;1E56;;1E56 -1E58;LATIN CAPITAL LETTER R WITH DOT ABOVE;Lu;0;L;0052 0307;;;;N;;;;1E59; -1E59;LATIN SMALL LETTER R WITH DOT ABOVE;Ll;0;L;0072 0307;;;;N;;;1E58;;1E58 -1E5A;LATIN CAPITAL LETTER R WITH DOT BELOW;Lu;0;L;0052 0323;;;;N;;;;1E5B; -1E5B;LATIN SMALL LETTER R WITH DOT BELOW;Ll;0;L;0072 0323;;;;N;;;1E5A;;1E5A -1E5C;LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON;Lu;0;L;1E5A 0304;;;;N;;;;1E5D; -1E5D;LATIN SMALL LETTER R WITH DOT BELOW AND MACRON;Ll;0;L;1E5B 0304;;;;N;;;1E5C;;1E5C -1E5E;LATIN CAPITAL LETTER R WITH LINE BELOW;Lu;0;L;0052 0331;;;;N;;;;1E5F; -1E5F;LATIN SMALL LETTER R WITH LINE BELOW;Ll;0;L;0072 0331;;;;N;;;1E5E;;1E5E -1E60;LATIN CAPITAL LETTER S WITH DOT ABOVE;Lu;0;L;0053 0307;;;;N;;;;1E61; -1E61;LATIN SMALL LETTER S WITH DOT ABOVE;Ll;0;L;0073 0307;;;;N;;;1E60;;1E60 -1E62;LATIN CAPITAL LETTER S WITH DOT BELOW;Lu;0;L;0053 0323;;;;N;;;;1E63; -1E63;LATIN SMALL LETTER S WITH DOT BELOW;Ll;0;L;0073 0323;;;;N;;;1E62;;1E62 -1E64;LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE;Lu;0;L;015A 0307;;;;N;;;;1E65; -1E65;LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE;Ll;0;L;015B 0307;;;;N;;;1E64;;1E64 -1E66;LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE;Lu;0;L;0160 0307;;;;N;;;;1E67; -1E67;LATIN SMALL LETTER S WITH CARON AND DOT ABOVE;Ll;0;L;0161 0307;;;;N;;;1E66;;1E66 -1E68;LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE;Lu;0;L;1E62 0307;;;;N;;;;1E69; -1E69;LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE;Ll;0;L;1E63 0307;;;;N;;;1E68;;1E68 -1E6A;LATIN CAPITAL LETTER T WITH DOT ABOVE;Lu;0;L;0054 0307;;;;N;;;;1E6B; -1E6B;LATIN SMALL LETTER T WITH DOT ABOVE;Ll;0;L;0074 0307;;;;N;;;1E6A;;1E6A -1E6C;LATIN CAPITAL LETTER T WITH DOT BELOW;Lu;0;L;0054 0323;;;;N;;;;1E6D; -1E6D;LATIN SMALL LETTER T WITH DOT BELOW;Ll;0;L;0074 0323;;;;N;;;1E6C;;1E6C -1E6E;LATIN CAPITAL LETTER T WITH LINE BELOW;Lu;0;L;0054 0331;;;;N;;;;1E6F; -1E6F;LATIN SMALL LETTER T WITH LINE BELOW;Ll;0;L;0074 0331;;;;N;;;1E6E;;1E6E -1E70;LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW;Lu;0;L;0054 032D;;;;N;;;;1E71; -1E71;LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW;Ll;0;L;0074 032D;;;;N;;;1E70;;1E70 -1E72;LATIN CAPITAL LETTER U WITH DIAERESIS BELOW;Lu;0;L;0055 0324;;;;N;;;;1E73; -1E73;LATIN SMALL LETTER U WITH DIAERESIS BELOW;Ll;0;L;0075 0324;;;;N;;;1E72;;1E72 -1E74;LATIN CAPITAL LETTER U WITH TILDE BELOW;Lu;0;L;0055 0330;;;;N;;;;1E75; -1E75;LATIN SMALL LETTER U WITH TILDE BELOW;Ll;0;L;0075 0330;;;;N;;;1E74;;1E74 -1E76;LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW;Lu;0;L;0055 032D;;;;N;;;;1E77; -1E77;LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW;Ll;0;L;0075 032D;;;;N;;;1E76;;1E76 -1E78;LATIN CAPITAL LETTER U WITH TILDE AND ACUTE;Lu;0;L;0168 0301;;;;N;;;;1E79; -1E79;LATIN SMALL LETTER U WITH TILDE AND ACUTE;Ll;0;L;0169 0301;;;;N;;;1E78;;1E78 -1E7A;LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS;Lu;0;L;016A 0308;;;;N;;;;1E7B; -1E7B;LATIN SMALL LETTER U WITH MACRON AND DIAERESIS;Ll;0;L;016B 0308;;;;N;;;1E7A;;1E7A -1E7C;LATIN CAPITAL LETTER V WITH TILDE;Lu;0;L;0056 0303;;;;N;;;;1E7D; -1E7D;LATIN SMALL LETTER V WITH TILDE;Ll;0;L;0076 0303;;;;N;;;1E7C;;1E7C -1E7E;LATIN CAPITAL LETTER V WITH DOT BELOW;Lu;0;L;0056 0323;;;;N;;;;1E7F; -1E7F;LATIN SMALL LETTER V WITH DOT BELOW;Ll;0;L;0076 0323;;;;N;;;1E7E;;1E7E -1E80;LATIN CAPITAL LETTER W WITH GRAVE;Lu;0;L;0057 0300;;;;N;;;;1E81; -1E81;LATIN SMALL LETTER W WITH GRAVE;Ll;0;L;0077 0300;;;;N;;;1E80;;1E80 -1E82;LATIN CAPITAL LETTER W WITH ACUTE;Lu;0;L;0057 0301;;;;N;;;;1E83; -1E83;LATIN SMALL LETTER W WITH ACUTE;Ll;0;L;0077 0301;;;;N;;;1E82;;1E82 -1E84;LATIN CAPITAL LETTER W WITH DIAERESIS;Lu;0;L;0057 0308;;;;N;;;;1E85; -1E85;LATIN SMALL LETTER W WITH DIAERESIS;Ll;0;L;0077 0308;;;;N;;;1E84;;1E84 -1E86;LATIN CAPITAL LETTER W WITH DOT ABOVE;Lu;0;L;0057 0307;;;;N;;;;1E87; -1E87;LATIN SMALL LETTER W WITH DOT ABOVE;Ll;0;L;0077 0307;;;;N;;;1E86;;1E86 -1E88;LATIN CAPITAL LETTER W WITH DOT BELOW;Lu;0;L;0057 0323;;;;N;;;;1E89; -1E89;LATIN SMALL LETTER W WITH DOT BELOW;Ll;0;L;0077 0323;;;;N;;;1E88;;1E88 -1E8A;LATIN CAPITAL LETTER X WITH DOT ABOVE;Lu;0;L;0058 0307;;;;N;;;;1E8B; -1E8B;LATIN SMALL LETTER X WITH DOT ABOVE;Ll;0;L;0078 0307;;;;N;;;1E8A;;1E8A -1E8C;LATIN CAPITAL LETTER X WITH DIAERESIS;Lu;0;L;0058 0308;;;;N;;;;1E8D; -1E8D;LATIN SMALL LETTER X WITH DIAERESIS;Ll;0;L;0078 0308;;;;N;;;1E8C;;1E8C -1E8E;LATIN CAPITAL LETTER Y WITH DOT ABOVE;Lu;0;L;0059 0307;;;;N;;;;1E8F; -1E8F;LATIN SMALL LETTER Y WITH DOT ABOVE;Ll;0;L;0079 0307;;;;N;;;1E8E;;1E8E -1E90;LATIN CAPITAL LETTER Z WITH CIRCUMFLEX;Lu;0;L;005A 0302;;;;N;;;;1E91; -1E91;LATIN SMALL LETTER Z WITH CIRCUMFLEX;Ll;0;L;007A 0302;;;;N;;;1E90;;1E90 -1E92;LATIN CAPITAL LETTER Z WITH DOT BELOW;Lu;0;L;005A 0323;;;;N;;;;1E93; -1E93;LATIN SMALL LETTER Z WITH DOT BELOW;Ll;0;L;007A 0323;;;;N;;;1E92;;1E92 -1E94;LATIN CAPITAL LETTER Z WITH LINE BELOW;Lu;0;L;005A 0331;;;;N;;;;1E95; -1E95;LATIN SMALL LETTER Z WITH LINE BELOW;Ll;0;L;007A 0331;;;;N;;;1E94;;1E94 -1E96;LATIN SMALL LETTER H WITH LINE BELOW;Ll;0;L;0068 0331;;;;N;;;;; -1E97;LATIN SMALL LETTER T WITH DIAERESIS;Ll;0;L;0074 0308;;;;N;;;;; -1E98;LATIN SMALL LETTER W WITH RING ABOVE;Ll;0;L;0077 030A;;;;N;;;;; -1E99;LATIN SMALL LETTER Y WITH RING ABOVE;Ll;0;L;0079 030A;;;;N;;;;; -1E9A;LATIN SMALL LETTER A WITH RIGHT HALF RING;Ll;0;L; 0061 02BE;;;;N;;;;; -1E9B;LATIN SMALL LETTER LONG S WITH DOT ABOVE;Ll;0;L;017F 0307;;;;N;;;1E60;;1E60 -1E9C;LATIN SMALL LETTER LONG S WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;;; -1E9D;LATIN SMALL LETTER LONG S WITH HIGH STROKE;Ll;0;L;;;;;N;;;;; -1E9E;LATIN CAPITAL LETTER SHARP S;Lu;0;L;;;;;N;;;;00DF; -1E9F;LATIN SMALL LETTER DELTA;Ll;0;L;;;;;N;;;;; -1EA0;LATIN CAPITAL LETTER A WITH DOT BELOW;Lu;0;L;0041 0323;;;;N;;;;1EA1; -1EA1;LATIN SMALL LETTER A WITH DOT BELOW;Ll;0;L;0061 0323;;;;N;;;1EA0;;1EA0 -1EA2;LATIN CAPITAL LETTER A WITH HOOK ABOVE;Lu;0;L;0041 0309;;;;N;;;;1EA3; -1EA3;LATIN SMALL LETTER A WITH HOOK ABOVE;Ll;0;L;0061 0309;;;;N;;;1EA2;;1EA2 -1EA4;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00C2 0301;;;;N;;;;1EA5; -1EA5;LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00E2 0301;;;;N;;;1EA4;;1EA4 -1EA6;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00C2 0300;;;;N;;;;1EA7; -1EA7;LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00E2 0300;;;;N;;;1EA6;;1EA6 -1EA8;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00C2 0309;;;;N;;;;1EA9; -1EA9;LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00E2 0309;;;;N;;;1EA8;;1EA8 -1EAA;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE;Lu;0;L;00C2 0303;;;;N;;;;1EAB; -1EAB;LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE;Ll;0;L;00E2 0303;;;;N;;;1EAA;;1EAA -1EAC;LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EA0 0302;;;;N;;;;1EAD; -1EAD;LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EA1 0302;;;;N;;;1EAC;;1EAC -1EAE;LATIN CAPITAL LETTER A WITH BREVE AND ACUTE;Lu;0;L;0102 0301;;;;N;;;;1EAF; -1EAF;LATIN SMALL LETTER A WITH BREVE AND ACUTE;Ll;0;L;0103 0301;;;;N;;;1EAE;;1EAE -1EB0;LATIN CAPITAL LETTER A WITH BREVE AND GRAVE;Lu;0;L;0102 0300;;;;N;;;;1EB1; -1EB1;LATIN SMALL LETTER A WITH BREVE AND GRAVE;Ll;0;L;0103 0300;;;;N;;;1EB0;;1EB0 -1EB2;LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE;Lu;0;L;0102 0309;;;;N;;;;1EB3; -1EB3;LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE;Ll;0;L;0103 0309;;;;N;;;1EB2;;1EB2 -1EB4;LATIN CAPITAL LETTER A WITH BREVE AND TILDE;Lu;0;L;0102 0303;;;;N;;;;1EB5; -1EB5;LATIN SMALL LETTER A WITH BREVE AND TILDE;Ll;0;L;0103 0303;;;;N;;;1EB4;;1EB4 -1EB6;LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW;Lu;0;L;1EA0 0306;;;;N;;;;1EB7; -1EB7;LATIN SMALL LETTER A WITH BREVE AND DOT BELOW;Ll;0;L;1EA1 0306;;;;N;;;1EB6;;1EB6 -1EB8;LATIN CAPITAL LETTER E WITH DOT BELOW;Lu;0;L;0045 0323;;;;N;;;;1EB9; -1EB9;LATIN SMALL LETTER E WITH DOT BELOW;Ll;0;L;0065 0323;;;;N;;;1EB8;;1EB8 -1EBA;LATIN CAPITAL LETTER E WITH HOOK ABOVE;Lu;0;L;0045 0309;;;;N;;;;1EBB; -1EBB;LATIN SMALL LETTER E WITH HOOK ABOVE;Ll;0;L;0065 0309;;;;N;;;1EBA;;1EBA -1EBC;LATIN CAPITAL LETTER E WITH TILDE;Lu;0;L;0045 0303;;;;N;;;;1EBD; -1EBD;LATIN SMALL LETTER E WITH TILDE;Ll;0;L;0065 0303;;;;N;;;1EBC;;1EBC -1EBE;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00CA 0301;;;;N;;;;1EBF; -1EBF;LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00EA 0301;;;;N;;;1EBE;;1EBE -1EC0;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00CA 0300;;;;N;;;;1EC1; -1EC1;LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00EA 0300;;;;N;;;1EC0;;1EC0 -1EC2;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00CA 0309;;;;N;;;;1EC3; -1EC3;LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00EA 0309;;;;N;;;1EC2;;1EC2 -1EC4;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE;Lu;0;L;00CA 0303;;;;N;;;;1EC5; -1EC5;LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE;Ll;0;L;00EA 0303;;;;N;;;1EC4;;1EC4 -1EC6;LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1EB8 0302;;;;N;;;;1EC7; -1EC7;LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1EB9 0302;;;;N;;;1EC6;;1EC6 -1EC8;LATIN CAPITAL LETTER I WITH HOOK ABOVE;Lu;0;L;0049 0309;;;;N;;;;1EC9; -1EC9;LATIN SMALL LETTER I WITH HOOK ABOVE;Ll;0;L;0069 0309;;;;N;;;1EC8;;1EC8 -1ECA;LATIN CAPITAL LETTER I WITH DOT BELOW;Lu;0;L;0049 0323;;;;N;;;;1ECB; -1ECB;LATIN SMALL LETTER I WITH DOT BELOW;Ll;0;L;0069 0323;;;;N;;;1ECA;;1ECA -1ECC;LATIN CAPITAL LETTER O WITH DOT BELOW;Lu;0;L;004F 0323;;;;N;;;;1ECD; -1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC -1ECE;LATIN CAPITAL LETTER O WITH HOOK ABOVE;Lu;0;L;004F 0309;;;;N;;;;1ECF; -1ECF;LATIN SMALL LETTER O WITH HOOK ABOVE;Ll;0;L;006F 0309;;;;N;;;1ECE;;1ECE -1ED0;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE;Lu;0;L;00D4 0301;;;;N;;;;1ED1; -1ED1;LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE;Ll;0;L;00F4 0301;;;;N;;;1ED0;;1ED0 -1ED2;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE;Lu;0;L;00D4 0300;;;;N;;;;1ED3; -1ED3;LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE;Ll;0;L;00F4 0300;;;;N;;;1ED2;;1ED2 -1ED4;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Lu;0;L;00D4 0309;;;;N;;;;1ED5; -1ED5;LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE;Ll;0;L;00F4 0309;;;;N;;;1ED4;;1ED4 -1ED6;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE;Lu;0;L;00D4 0303;;;;N;;;;1ED7; -1ED7;LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE;Ll;0;L;00F4 0303;;;;N;;;1ED6;;1ED6 -1ED8;LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Lu;0;L;1ECC 0302;;;;N;;;;1ED9; -1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 -1EDA;LATIN CAPITAL LETTER O WITH HORN AND ACUTE;Lu;0;L;01A0 0301;;;;N;;;;1EDB; -1EDB;LATIN SMALL LETTER O WITH HORN AND ACUTE;Ll;0;L;01A1 0301;;;;N;;;1EDA;;1EDA -1EDC;LATIN CAPITAL LETTER O WITH HORN AND GRAVE;Lu;0;L;01A0 0300;;;;N;;;;1EDD; -1EDD;LATIN SMALL LETTER O WITH HORN AND GRAVE;Ll;0;L;01A1 0300;;;;N;;;1EDC;;1EDC -1EDE;LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE;Lu;0;L;01A0 0309;;;;N;;;;1EDF; -1EDF;LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE;Ll;0;L;01A1 0309;;;;N;;;1EDE;;1EDE -1EE0;LATIN CAPITAL LETTER O WITH HORN AND TILDE;Lu;0;L;01A0 0303;;;;N;;;;1EE1; -1EE1;LATIN SMALL LETTER O WITH HORN AND TILDE;Ll;0;L;01A1 0303;;;;N;;;1EE0;;1EE0 -1EE2;LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW;Lu;0;L;01A0 0323;;;;N;;;;1EE3; -1EE3;LATIN SMALL LETTER O WITH HORN AND DOT BELOW;Ll;0;L;01A1 0323;;;;N;;;1EE2;;1EE2 -1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW;Lu;0;L;0055 0323;;;;N;;;;1EE5; -1EE5;LATIN SMALL LETTER U WITH DOT BELOW;Ll;0;L;0075 0323;;;;N;;;1EE4;;1EE4 -1EE6;LATIN CAPITAL LETTER U WITH HOOK ABOVE;Lu;0;L;0055 0309;;;;N;;;;1EE7; -1EE7;LATIN SMALL LETTER U WITH HOOK ABOVE;Ll;0;L;0075 0309;;;;N;;;1EE6;;1EE6 -1EE8;LATIN CAPITAL LETTER U WITH HORN AND ACUTE;Lu;0;L;01AF 0301;;;;N;;;;1EE9; -1EE9;LATIN SMALL LETTER U WITH HORN AND ACUTE;Ll;0;L;01B0 0301;;;;N;;;1EE8;;1EE8 -1EEA;LATIN CAPITAL LETTER U WITH HORN AND GRAVE;Lu;0;L;01AF 0300;;;;N;;;;1EEB; -1EEB;LATIN SMALL LETTER U WITH HORN AND GRAVE;Ll;0;L;01B0 0300;;;;N;;;1EEA;;1EEA -1EEC;LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE;Lu;0;L;01AF 0309;;;;N;;;;1EED; -1EED;LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE;Ll;0;L;01B0 0309;;;;N;;;1EEC;;1EEC -1EEE;LATIN CAPITAL LETTER U WITH HORN AND TILDE;Lu;0;L;01AF 0303;;;;N;;;;1EEF; -1EEF;LATIN SMALL LETTER U WITH HORN AND TILDE;Ll;0;L;01B0 0303;;;;N;;;1EEE;;1EEE -1EF0;LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW;Lu;0;L;01AF 0323;;;;N;;;;1EF1; -1EF1;LATIN SMALL LETTER U WITH HORN AND DOT BELOW;Ll;0;L;01B0 0323;;;;N;;;1EF0;;1EF0 -1EF2;LATIN CAPITAL LETTER Y WITH GRAVE;Lu;0;L;0059 0300;;;;N;;;;1EF3; -1EF3;LATIN SMALL LETTER Y WITH GRAVE;Ll;0;L;0079 0300;;;;N;;;1EF2;;1EF2 -1EF4;LATIN CAPITAL LETTER Y WITH DOT BELOW;Lu;0;L;0059 0323;;;;N;;;;1EF5; -1EF5;LATIN SMALL LETTER Y WITH DOT BELOW;Ll;0;L;0079 0323;;;;N;;;1EF4;;1EF4 -1EF6;LATIN CAPITAL LETTER Y WITH HOOK ABOVE;Lu;0;L;0059 0309;;;;N;;;;1EF7; -1EF7;LATIN SMALL LETTER Y WITH HOOK ABOVE;Ll;0;L;0079 0309;;;;N;;;1EF6;;1EF6 -1EF8;LATIN CAPITAL LETTER Y WITH TILDE;Lu;0;L;0059 0303;;;;N;;;;1EF9; -1EF9;LATIN SMALL LETTER Y WITH TILDE;Ll;0;L;0079 0303;;;;N;;;1EF8;;1EF8 -1EFA;LATIN CAPITAL LETTER MIDDLE-WELSH LL;Lu;0;L;;;;;N;;;;1EFB; -1EFB;LATIN SMALL LETTER MIDDLE-WELSH LL;Ll;0;L;;;;;N;;;1EFA;;1EFA -1EFC;LATIN CAPITAL LETTER MIDDLE-WELSH V;Lu;0;L;;;;;N;;;;1EFD; -1EFD;LATIN SMALL LETTER MIDDLE-WELSH V;Ll;0;L;;;;;N;;;1EFC;;1EFC -1EFE;LATIN CAPITAL LETTER Y WITH LOOP;Lu;0;L;;;;;N;;;;1EFF; -1EFF;LATIN SMALL LETTER Y WITH LOOP;Ll;0;L;;;;;N;;;1EFE;;1EFE -1F00;GREEK SMALL LETTER ALPHA WITH PSILI;Ll;0;L;03B1 0313;;;;N;;;1F08;;1F08 -1F01;GREEK SMALL LETTER ALPHA WITH DASIA;Ll;0;L;03B1 0314;;;;N;;;1F09;;1F09 -1F02;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA;Ll;0;L;1F00 0300;;;;N;;;1F0A;;1F0A -1F03;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA;Ll;0;L;1F01 0300;;;;N;;;1F0B;;1F0B -1F04;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA;Ll;0;L;1F00 0301;;;;N;;;1F0C;;1F0C -1F05;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA;Ll;0;L;1F01 0301;;;;N;;;1F0D;;1F0D -1F06;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI;Ll;0;L;1F00 0342;;;;N;;;1F0E;;1F0E -1F07;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI;Ll;0;L;1F01 0342;;;;N;;;1F0F;;1F0F -1F08;GREEK CAPITAL LETTER ALPHA WITH PSILI;Lu;0;L;0391 0313;;;;N;;;;1F00; -1F09;GREEK CAPITAL LETTER ALPHA WITH DASIA;Lu;0;L;0391 0314;;;;N;;;;1F01; -1F0A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA;Lu;0;L;1F08 0300;;;;N;;;;1F02; -1F0B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA;Lu;0;L;1F09 0300;;;;N;;;;1F03; -1F0C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA;Lu;0;L;1F08 0301;;;;N;;;;1F04; -1F0D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA;Lu;0;L;1F09 0301;;;;N;;;;1F05; -1F0E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI;Lu;0;L;1F08 0342;;;;N;;;;1F06; -1F0F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI;Lu;0;L;1F09 0342;;;;N;;;;1F07; -1F10;GREEK SMALL LETTER EPSILON WITH PSILI;Ll;0;L;03B5 0313;;;;N;;;1F18;;1F18 -1F11;GREEK SMALL LETTER EPSILON WITH DASIA;Ll;0;L;03B5 0314;;;;N;;;1F19;;1F19 -1F12;GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA;Ll;0;L;1F10 0300;;;;N;;;1F1A;;1F1A -1F13;GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA;Ll;0;L;1F11 0300;;;;N;;;1F1B;;1F1B -1F14;GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA;Ll;0;L;1F10 0301;;;;N;;;1F1C;;1F1C -1F15;GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA;Ll;0;L;1F11 0301;;;;N;;;1F1D;;1F1D -1F18;GREEK CAPITAL LETTER EPSILON WITH PSILI;Lu;0;L;0395 0313;;;;N;;;;1F10; -1F19;GREEK CAPITAL LETTER EPSILON WITH DASIA;Lu;0;L;0395 0314;;;;N;;;;1F11; -1F1A;GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA;Lu;0;L;1F18 0300;;;;N;;;;1F12; -1F1B;GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA;Lu;0;L;1F19 0300;;;;N;;;;1F13; -1F1C;GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA;Lu;0;L;1F18 0301;;;;N;;;;1F14; -1F1D;GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA;Lu;0;L;1F19 0301;;;;N;;;;1F15; -1F20;GREEK SMALL LETTER ETA WITH PSILI;Ll;0;L;03B7 0313;;;;N;;;1F28;;1F28 -1F21;GREEK SMALL LETTER ETA WITH DASIA;Ll;0;L;03B7 0314;;;;N;;;1F29;;1F29 -1F22;GREEK SMALL LETTER ETA WITH PSILI AND VARIA;Ll;0;L;1F20 0300;;;;N;;;1F2A;;1F2A -1F23;GREEK SMALL LETTER ETA WITH DASIA AND VARIA;Ll;0;L;1F21 0300;;;;N;;;1F2B;;1F2B -1F24;GREEK SMALL LETTER ETA WITH PSILI AND OXIA;Ll;0;L;1F20 0301;;;;N;;;1F2C;;1F2C -1F25;GREEK SMALL LETTER ETA WITH DASIA AND OXIA;Ll;0;L;1F21 0301;;;;N;;;1F2D;;1F2D -1F26;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI;Ll;0;L;1F20 0342;;;;N;;;1F2E;;1F2E -1F27;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI;Ll;0;L;1F21 0342;;;;N;;;1F2F;;1F2F -1F28;GREEK CAPITAL LETTER ETA WITH PSILI;Lu;0;L;0397 0313;;;;N;;;;1F20; -1F29;GREEK CAPITAL LETTER ETA WITH DASIA;Lu;0;L;0397 0314;;;;N;;;;1F21; -1F2A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA;Lu;0;L;1F28 0300;;;;N;;;;1F22; -1F2B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA;Lu;0;L;1F29 0300;;;;N;;;;1F23; -1F2C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA;Lu;0;L;1F28 0301;;;;N;;;;1F24; -1F2D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA;Lu;0;L;1F29 0301;;;;N;;;;1F25; -1F2E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI;Lu;0;L;1F28 0342;;;;N;;;;1F26; -1F2F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI;Lu;0;L;1F29 0342;;;;N;;;;1F27; -1F30;GREEK SMALL LETTER IOTA WITH PSILI;Ll;0;L;03B9 0313;;;;N;;;1F38;;1F38 -1F31;GREEK SMALL LETTER IOTA WITH DASIA;Ll;0;L;03B9 0314;;;;N;;;1F39;;1F39 -1F32;GREEK SMALL LETTER IOTA WITH PSILI AND VARIA;Ll;0;L;1F30 0300;;;;N;;;1F3A;;1F3A -1F33;GREEK SMALL LETTER IOTA WITH DASIA AND VARIA;Ll;0;L;1F31 0300;;;;N;;;1F3B;;1F3B -1F34;GREEK SMALL LETTER IOTA WITH PSILI AND OXIA;Ll;0;L;1F30 0301;;;;N;;;1F3C;;1F3C -1F35;GREEK SMALL LETTER IOTA WITH DASIA AND OXIA;Ll;0;L;1F31 0301;;;;N;;;1F3D;;1F3D -1F36;GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI;Ll;0;L;1F30 0342;;;;N;;;1F3E;;1F3E -1F37;GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI;Ll;0;L;1F31 0342;;;;N;;;1F3F;;1F3F -1F38;GREEK CAPITAL LETTER IOTA WITH PSILI;Lu;0;L;0399 0313;;;;N;;;;1F30; -1F39;GREEK CAPITAL LETTER IOTA WITH DASIA;Lu;0;L;0399 0314;;;;N;;;;1F31; -1F3A;GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA;Lu;0;L;1F38 0300;;;;N;;;;1F32; -1F3B;GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA;Lu;0;L;1F39 0300;;;;N;;;;1F33; -1F3C;GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA;Lu;0;L;1F38 0301;;;;N;;;;1F34; -1F3D;GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA;Lu;0;L;1F39 0301;;;;N;;;;1F35; -1F3E;GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI;Lu;0;L;1F38 0342;;;;N;;;;1F36; -1F3F;GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI;Lu;0;L;1F39 0342;;;;N;;;;1F37; -1F40;GREEK SMALL LETTER OMICRON WITH PSILI;Ll;0;L;03BF 0313;;;;N;;;1F48;;1F48 -1F41;GREEK SMALL LETTER OMICRON WITH DASIA;Ll;0;L;03BF 0314;;;;N;;;1F49;;1F49 -1F42;GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA;Ll;0;L;1F40 0300;;;;N;;;1F4A;;1F4A -1F43;GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA;Ll;0;L;1F41 0300;;;;N;;;1F4B;;1F4B -1F44;GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA;Ll;0;L;1F40 0301;;;;N;;;1F4C;;1F4C -1F45;GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA;Ll;0;L;1F41 0301;;;;N;;;1F4D;;1F4D -1F48;GREEK CAPITAL LETTER OMICRON WITH PSILI;Lu;0;L;039F 0313;;;;N;;;;1F40; -1F49;GREEK CAPITAL LETTER OMICRON WITH DASIA;Lu;0;L;039F 0314;;;;N;;;;1F41; -1F4A;GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA;Lu;0;L;1F48 0300;;;;N;;;;1F42; -1F4B;GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA;Lu;0;L;1F49 0300;;;;N;;;;1F43; -1F4C;GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA;Lu;0;L;1F48 0301;;;;N;;;;1F44; -1F4D;GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA;Lu;0;L;1F49 0301;;;;N;;;;1F45; -1F50;GREEK SMALL LETTER UPSILON WITH PSILI;Ll;0;L;03C5 0313;;;;N;;;;; -1F51;GREEK SMALL LETTER UPSILON WITH DASIA;Ll;0;L;03C5 0314;;;;N;;;1F59;;1F59 -1F52;GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA;Ll;0;L;1F50 0300;;;;N;;;;; -1F53;GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA;Ll;0;L;1F51 0300;;;;N;;;1F5B;;1F5B -1F54;GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA;Ll;0;L;1F50 0301;;;;N;;;;; -1F55;GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA;Ll;0;L;1F51 0301;;;;N;;;1F5D;;1F5D -1F56;GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI;Ll;0;L;1F50 0342;;;;N;;;;; -1F57;GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI;Ll;0;L;1F51 0342;;;;N;;;1F5F;;1F5F -1F59;GREEK CAPITAL LETTER UPSILON WITH DASIA;Lu;0;L;03A5 0314;;;;N;;;;1F51; -1F5B;GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA;Lu;0;L;1F59 0300;;;;N;;;;1F53; -1F5D;GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA;Lu;0;L;1F59 0301;;;;N;;;;1F55; -1F5F;GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI;Lu;0;L;1F59 0342;;;;N;;;;1F57; -1F60;GREEK SMALL LETTER OMEGA WITH PSILI;Ll;0;L;03C9 0313;;;;N;;;1F68;;1F68 -1F61;GREEK SMALL LETTER OMEGA WITH DASIA;Ll;0;L;03C9 0314;;;;N;;;1F69;;1F69 -1F62;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA;Ll;0;L;1F60 0300;;;;N;;;1F6A;;1F6A -1F63;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA;Ll;0;L;1F61 0300;;;;N;;;1F6B;;1F6B -1F64;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA;Ll;0;L;1F60 0301;;;;N;;;1F6C;;1F6C -1F65;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA;Ll;0;L;1F61 0301;;;;N;;;1F6D;;1F6D -1F66;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI;Ll;0;L;1F60 0342;;;;N;;;1F6E;;1F6E -1F67;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI;Ll;0;L;1F61 0342;;;;N;;;1F6F;;1F6F -1F68;GREEK CAPITAL LETTER OMEGA WITH PSILI;Lu;0;L;03A9 0313;;;;N;;;;1F60; -1F69;GREEK CAPITAL LETTER OMEGA WITH DASIA;Lu;0;L;03A9 0314;;;;N;;;;1F61; -1F6A;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA;Lu;0;L;1F68 0300;;;;N;;;;1F62; -1F6B;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA;Lu;0;L;1F69 0300;;;;N;;;;1F63; -1F6C;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA;Lu;0;L;1F68 0301;;;;N;;;;1F64; -1F6D;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA;Lu;0;L;1F69 0301;;;;N;;;;1F65; -1F6E;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI;Lu;0;L;1F68 0342;;;;N;;;;1F66; -1F6F;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI;Lu;0;L;1F69 0342;;;;N;;;;1F67; -1F70;GREEK SMALL LETTER ALPHA WITH VARIA;Ll;0;L;03B1 0300;;;;N;;;1FBA;;1FBA -1F71;GREEK SMALL LETTER ALPHA WITH OXIA;Ll;0;L;03AC;;;;N;;;1FBB;;1FBB -1F72;GREEK SMALL LETTER EPSILON WITH VARIA;Ll;0;L;03B5 0300;;;;N;;;1FC8;;1FC8 -1F73;GREEK SMALL LETTER EPSILON WITH OXIA;Ll;0;L;03AD;;;;N;;;1FC9;;1FC9 -1F74;GREEK SMALL LETTER ETA WITH VARIA;Ll;0;L;03B7 0300;;;;N;;;1FCA;;1FCA -1F75;GREEK SMALL LETTER ETA WITH OXIA;Ll;0;L;03AE;;;;N;;;1FCB;;1FCB -1F76;GREEK SMALL LETTER IOTA WITH VARIA;Ll;0;L;03B9 0300;;;;N;;;1FDA;;1FDA -1F77;GREEK SMALL LETTER IOTA WITH OXIA;Ll;0;L;03AF;;;;N;;;1FDB;;1FDB -1F78;GREEK SMALL LETTER OMICRON WITH VARIA;Ll;0;L;03BF 0300;;;;N;;;1FF8;;1FF8 -1F79;GREEK SMALL LETTER OMICRON WITH OXIA;Ll;0;L;03CC;;;;N;;;1FF9;;1FF9 -1F7A;GREEK SMALL LETTER UPSILON WITH VARIA;Ll;0;L;03C5 0300;;;;N;;;1FEA;;1FEA -1F7B;GREEK SMALL LETTER UPSILON WITH OXIA;Ll;0;L;03CD;;;;N;;;1FEB;;1FEB -1F7C;GREEK SMALL LETTER OMEGA WITH VARIA;Ll;0;L;03C9 0300;;;;N;;;1FFA;;1FFA -1F7D;GREEK SMALL LETTER OMEGA WITH OXIA;Ll;0;L;03CE;;;;N;;;1FFB;;1FFB -1F80;GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F00 0345;;;;N;;;1F88;;1F88 -1F81;GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F01 0345;;;;N;;;1F89;;1F89 -1F82;GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F02 0345;;;;N;;;1F8A;;1F8A -1F83;GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F03 0345;;;;N;;;1F8B;;1F8B -1F84;GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F04 0345;;;;N;;;1F8C;;1F8C -1F85;GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F05 0345;;;;N;;;1F8D;;1F8D -1F86;GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F06 0345;;;;N;;;1F8E;;1F8E -1F87;GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F07 0345;;;;N;;;1F8F;;1F8F -1F88;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F08 0345;;;;N;;;;1F80; -1F89;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F09 0345;;;;N;;;;1F81; -1F8A;GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0A 0345;;;;N;;;;1F82; -1F8B;GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F0B 0345;;;;N;;;;1F83; -1F8C;GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0C 0345;;;;N;;;;1F84; -1F8D;GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F0D 0345;;;;N;;;;1F85; -1F8E;GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0E 0345;;;;N;;;;1F86; -1F8F;GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F0F 0345;;;;N;;;;1F87; -1F90;GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F20 0345;;;;N;;;1F98;;1F98 -1F91;GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F21 0345;;;;N;;;1F99;;1F99 -1F92;GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F22 0345;;;;N;;;1F9A;;1F9A -1F93;GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F23 0345;;;;N;;;1F9B;;1F9B -1F94;GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F24 0345;;;;N;;;1F9C;;1F9C -1F95;GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F25 0345;;;;N;;;1F9D;;1F9D -1F96;GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F26 0345;;;;N;;;1F9E;;1F9E -1F97;GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F27 0345;;;;N;;;1F9F;;1F9F -1F98;GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F28 0345;;;;N;;;;1F90; -1F99;GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F29 0345;;;;N;;;;1F91; -1F9A;GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2A 0345;;;;N;;;;1F92; -1F9B;GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F2B 0345;;;;N;;;;1F93; -1F9C;GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2C 0345;;;;N;;;;1F94; -1F9D;GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F2D 0345;;;;N;;;;1F95; -1F9E;GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2E 0345;;;;N;;;;1F96; -1F9F;GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F2F 0345;;;;N;;;;1F97; -1FA0;GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI;Ll;0;L;1F60 0345;;;;N;;;1FA8;;1FA8 -1FA1;GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI;Ll;0;L;1F61 0345;;;;N;;;1FA9;;1FA9 -1FA2;GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F62 0345;;;;N;;;1FAA;;1FAA -1FA3;GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI;Ll;0;L;1F63 0345;;;;N;;;1FAB;;1FAB -1FA4;GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F64 0345;;;;N;;;1FAC;;1FAC -1FA5;GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI;Ll;0;L;1F65 0345;;;;N;;;1FAD;;1FAD -1FA6;GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F66 0345;;;;N;;;1FAE;;1FAE -1FA7;GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1F67 0345;;;;N;;;1FAF;;1FAF -1FA8;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI;Lt;0;L;1F68 0345;;;;N;;;;1FA0; -1FA9;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI;Lt;0;L;1F69 0345;;;;N;;;;1FA1; -1FAA;GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6A 0345;;;;N;;;;1FA2; -1FAB;GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI;Lt;0;L;1F6B 0345;;;;N;;;;1FA3; -1FAC;GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6C 0345;;;;N;;;;1FA4; -1FAD;GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI;Lt;0;L;1F6D 0345;;;;N;;;;1FA5; -1FAE;GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6E 0345;;;;N;;;;1FA6; -1FAF;GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI;Lt;0;L;1F6F 0345;;;;N;;;;1FA7; -1FB0;GREEK SMALL LETTER ALPHA WITH VRACHY;Ll;0;L;03B1 0306;;;;N;;;1FB8;;1FB8 -1FB1;GREEK SMALL LETTER ALPHA WITH MACRON;Ll;0;L;03B1 0304;;;;N;;;1FB9;;1FB9 -1FB2;GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F70 0345;;;;N;;;;; -1FB3;GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI;Ll;0;L;03B1 0345;;;;N;;;1FBC;;1FBC -1FB4;GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AC 0345;;;;N;;;;; -1FB6;GREEK SMALL LETTER ALPHA WITH PERISPOMENI;Ll;0;L;03B1 0342;;;;N;;;;; -1FB7;GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FB6 0345;;;;N;;;;; -1FB8;GREEK CAPITAL LETTER ALPHA WITH VRACHY;Lu;0;L;0391 0306;;;;N;;;;1FB0; -1FB9;GREEK CAPITAL LETTER ALPHA WITH MACRON;Lu;0;L;0391 0304;;;;N;;;;1FB1; -1FBA;GREEK CAPITAL LETTER ALPHA WITH VARIA;Lu;0;L;0391 0300;;;;N;;;;1F70; -1FBB;GREEK CAPITAL LETTER ALPHA WITH OXIA;Lu;0;L;0386;;;;N;;;;1F71; -1FBC;GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI;Lt;0;L;0391 0345;;;;N;;;;1FB3; -1FBD;GREEK KORONIS;Sk;0;ON; 0020 0313;;;;N;;;;; -1FBE;GREEK PROSGEGRAMMENI;Ll;0;L;03B9;;;;N;;;0399;;0399 -1FBF;GREEK PSILI;Sk;0;ON; 0020 0313;;;;N;;;;; -1FC0;GREEK PERISPOMENI;Sk;0;ON; 0020 0342;;;;N;;;;; -1FC1;GREEK DIALYTIKA AND PERISPOMENI;Sk;0;ON;00A8 0342;;;;N;;;;; -1FC2;GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F74 0345;;;;N;;;;; -1FC3;GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI;Ll;0;L;03B7 0345;;;;N;;;1FCC;;1FCC -1FC4;GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03AE 0345;;;;N;;;;; -1FC6;GREEK SMALL LETTER ETA WITH PERISPOMENI;Ll;0;L;03B7 0342;;;;N;;;;; -1FC7;GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FC6 0345;;;;N;;;;; -1FC8;GREEK CAPITAL LETTER EPSILON WITH VARIA;Lu;0;L;0395 0300;;;;N;;;;1F72; -1FC9;GREEK CAPITAL LETTER EPSILON WITH OXIA;Lu;0;L;0388;;;;N;;;;1F73; -1FCA;GREEK CAPITAL LETTER ETA WITH VARIA;Lu;0;L;0397 0300;;;;N;;;;1F74; -1FCB;GREEK CAPITAL LETTER ETA WITH OXIA;Lu;0;L;0389;;;;N;;;;1F75; -1FCC;GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI;Lt;0;L;0397 0345;;;;N;;;;1FC3; -1FCD;GREEK PSILI AND VARIA;Sk;0;ON;1FBF 0300;;;;N;;;;; -1FCE;GREEK PSILI AND OXIA;Sk;0;ON;1FBF 0301;;;;N;;;;; -1FCF;GREEK PSILI AND PERISPOMENI;Sk;0;ON;1FBF 0342;;;;N;;;;; -1FD0;GREEK SMALL LETTER IOTA WITH VRACHY;Ll;0;L;03B9 0306;;;;N;;;1FD8;;1FD8 -1FD1;GREEK SMALL LETTER IOTA WITH MACRON;Ll;0;L;03B9 0304;;;;N;;;1FD9;;1FD9 -1FD2;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA;Ll;0;L;03CA 0300;;;;N;;;;; -1FD3;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA;Ll;0;L;0390;;;;N;;;;; -1FD6;GREEK SMALL LETTER IOTA WITH PERISPOMENI;Ll;0;L;03B9 0342;;;;N;;;;; -1FD7;GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CA 0342;;;;N;;;;; -1FD8;GREEK CAPITAL LETTER IOTA WITH VRACHY;Lu;0;L;0399 0306;;;;N;;;;1FD0; -1FD9;GREEK CAPITAL LETTER IOTA WITH MACRON;Lu;0;L;0399 0304;;;;N;;;;1FD1; -1FDA;GREEK CAPITAL LETTER IOTA WITH VARIA;Lu;0;L;0399 0300;;;;N;;;;1F76; -1FDB;GREEK CAPITAL LETTER IOTA WITH OXIA;Lu;0;L;038A;;;;N;;;;1F77; -1FDD;GREEK DASIA AND VARIA;Sk;0;ON;1FFE 0300;;;;N;;;;; -1FDE;GREEK DASIA AND OXIA;Sk;0;ON;1FFE 0301;;;;N;;;;; -1FDF;GREEK DASIA AND PERISPOMENI;Sk;0;ON;1FFE 0342;;;;N;;;;; -1FE0;GREEK SMALL LETTER UPSILON WITH VRACHY;Ll;0;L;03C5 0306;;;;N;;;1FE8;;1FE8 -1FE1;GREEK SMALL LETTER UPSILON WITH MACRON;Ll;0;L;03C5 0304;;;;N;;;1FE9;;1FE9 -1FE2;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA;Ll;0;L;03CB 0300;;;;N;;;;; -1FE3;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA;Ll;0;L;03B0;;;;N;;;;; -1FE4;GREEK SMALL LETTER RHO WITH PSILI;Ll;0;L;03C1 0313;;;;N;;;;; -1FE5;GREEK SMALL LETTER RHO WITH DASIA;Ll;0;L;03C1 0314;;;;N;;;1FEC;;1FEC -1FE6;GREEK SMALL LETTER UPSILON WITH PERISPOMENI;Ll;0;L;03C5 0342;;;;N;;;;; -1FE7;GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI;Ll;0;L;03CB 0342;;;;N;;;;; -1FE8;GREEK CAPITAL LETTER UPSILON WITH VRACHY;Lu;0;L;03A5 0306;;;;N;;;;1FE0; -1FE9;GREEK CAPITAL LETTER UPSILON WITH MACRON;Lu;0;L;03A5 0304;;;;N;;;;1FE1; -1FEA;GREEK CAPITAL LETTER UPSILON WITH VARIA;Lu;0;L;03A5 0300;;;;N;;;;1F7A; -1FEB;GREEK CAPITAL LETTER UPSILON WITH OXIA;Lu;0;L;038E;;;;N;;;;1F7B; -1FEC;GREEK CAPITAL LETTER RHO WITH DASIA;Lu;0;L;03A1 0314;;;;N;;;;1FE5; -1FED;GREEK DIALYTIKA AND VARIA;Sk;0;ON;00A8 0300;;;;N;;;;; -1FEE;GREEK DIALYTIKA AND OXIA;Sk;0;ON;0385;;;;N;;;;; -1FEF;GREEK VARIA;Sk;0;ON;0060;;;;N;;;;; -1FF2;GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI;Ll;0;L;1F7C 0345;;;;N;;;;; -1FF3;GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI;Ll;0;L;03C9 0345;;;;N;;;1FFC;;1FFC -1FF4;GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI;Ll;0;L;03CE 0345;;;;N;;;;; -1FF6;GREEK SMALL LETTER OMEGA WITH PERISPOMENI;Ll;0;L;03C9 0342;;;;N;;;;; -1FF7;GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI;Ll;0;L;1FF6 0345;;;;N;;;;; -1FF8;GREEK CAPITAL LETTER OMICRON WITH VARIA;Lu;0;L;039F 0300;;;;N;;;;1F78; -1FF9;GREEK CAPITAL LETTER OMICRON WITH OXIA;Lu;0;L;038C;;;;N;;;;1F79; -1FFA;GREEK CAPITAL LETTER OMEGA WITH VARIA;Lu;0;L;03A9 0300;;;;N;;;;1F7C; -1FFB;GREEK CAPITAL LETTER OMEGA WITH OXIA;Lu;0;L;038F;;;;N;;;;1F7D; -1FFC;GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI;Lt;0;L;03A9 0345;;;;N;;;;1FF3; -1FFD;GREEK OXIA;Sk;0;ON;00B4;;;;N;;;;; -1FFE;GREEK DASIA;Sk;0;ON; 0020 0314;;;;N;;;;; -2000;EN QUAD;Zs;0;WS;2002;;;;N;;;;; -2001;EM QUAD;Zs;0;WS;2003;;;;N;;;;; -2002;EN SPACE;Zs;0;WS; 0020;;;;N;;;;; -2003;EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2004;THREE-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2005;FOUR-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2006;SIX-PER-EM SPACE;Zs;0;WS; 0020;;;;N;;;;; -2007;FIGURE SPACE;Zs;0;WS; 0020;;;;N;;;;; -2008;PUNCTUATION SPACE;Zs;0;WS; 0020;;;;N;;;;; -2009;THIN SPACE;Zs;0;WS; 0020;;;;N;;;;; -200A;HAIR SPACE;Zs;0;WS; 0020;;;;N;;;;; -200B;ZERO WIDTH SPACE;Cf;0;BN;;;;;N;;;;; -200C;ZERO WIDTH NON-JOINER;Cf;0;BN;;;;;N;;;;; -200D;ZERO WIDTH JOINER;Cf;0;BN;;;;;N;;;;; -200E;LEFT-TO-RIGHT MARK;Cf;0;L;;;;;N;;;;; -200F;RIGHT-TO-LEFT MARK;Cf;0;R;;;;;N;;;;; -2010;HYPHEN;Pd;0;ON;;;;;N;;;;; -2011;NON-BREAKING HYPHEN;Pd;0;ON; 2010;;;;N;;;;; -2012;FIGURE DASH;Pd;0;ON;;;;;N;;;;; -2013;EN DASH;Pd;0;ON;;;;;N;;;;; -2014;EM DASH;Pd;0;ON;;;;;N;;;;; -2015;HORIZONTAL BAR;Pd;0;ON;;;;;N;QUOTATION DASH;;;; -2016;DOUBLE VERTICAL LINE;Po;0;ON;;;;;N;DOUBLE VERTICAL BAR;;;; -2017;DOUBLE LOW LINE;Po;0;ON; 0020 0333;;;;N;SPACING DOUBLE UNDERSCORE;;;; -2018;LEFT SINGLE QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE TURNED COMMA QUOTATION MARK;;;; -2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;N;SINGLE COMMA QUOTATION MARK;;;; -201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW SINGLE COMMA QUOTATION MARK;;;; -201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;SINGLE REVERSED COMMA QUOTATION MARK;;;; -201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE TURNED COMMA QUOTATION MARK;;;; -201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;N;DOUBLE COMMA QUOTATION MARK;;;; -201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;N;LOW DOUBLE COMMA QUOTATION MARK;;;; -201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;N;DOUBLE REVERSED COMMA QUOTATION MARK;;;; -2020;DAGGER;Po;0;ON;;;;;N;;;;; -2021;DOUBLE DAGGER;Po;0;ON;;;;;N;;;;; -2022;BULLET;Po;0;ON;;;;;N;;;;; -2023;TRIANGULAR BULLET;Po;0;ON;;;;;N;;;;; -2024;ONE DOT LEADER;Po;0;ON; 002E;;;;N;;;;; -2025;TWO DOT LEADER;Po;0;ON; 002E 002E;;;;N;;;;; -2026;HORIZONTAL ELLIPSIS;Po;0;ON; 002E 002E 002E;;;;N;;;;; -2027;HYPHENATION POINT;Po;0;ON;;;;;N;;;;; -2028;LINE SEPARATOR;Zl;0;WS;;;;;N;;;;; -2029;PARAGRAPH SEPARATOR;Zp;0;B;;;;;N;;;;; -202A;LEFT-TO-RIGHT EMBEDDING;Cf;0;LRE;;;;;N;;;;; -202B;RIGHT-TO-LEFT EMBEDDING;Cf;0;RLE;;;;;N;;;;; -202C;POP DIRECTIONAL FORMATTING;Cf;0;PDF;;;;;N;;;;; -202D;LEFT-TO-RIGHT OVERRIDE;Cf;0;LRO;;;;;N;;;;; -202E;RIGHT-TO-LEFT OVERRIDE;Cf;0;RLO;;;;;N;;;;; -202F;NARROW NO-BREAK SPACE;Zs;0;CS; 0020;;;;N;;;;; -2030;PER MILLE SIGN;Po;0;ET;;;;;N;;;;; -2031;PER TEN THOUSAND SIGN;Po;0;ET;;;;;N;;;;; -2032;PRIME;Po;0;ET;;;;;N;;;;; -2033;DOUBLE PRIME;Po;0;ET; 2032 2032;;;;N;;;;; -2034;TRIPLE PRIME;Po;0;ET; 2032 2032 2032;;;;N;;;;; -2035;REVERSED PRIME;Po;0;ON;;;;;N;;;;; -2036;REVERSED DOUBLE PRIME;Po;0;ON; 2035 2035;;;;N;;;;; -2037;REVERSED TRIPLE PRIME;Po;0;ON; 2035 2035 2035;;;;N;;;;; -2038;CARET;Po;0;ON;;;;;N;;;;; -2039;SINGLE LEFT-POINTING ANGLE QUOTATION MARK;Pi;0;ON;;;;;Y;LEFT POINTING SINGLE GUILLEMET;;;; -203A;SINGLE RIGHT-POINTING ANGLE QUOTATION MARK;Pf;0;ON;;;;;Y;RIGHT POINTING SINGLE GUILLEMET;;;; -203B;REFERENCE MARK;Po;0;ON;;;;;N;;;;; -203C;DOUBLE EXCLAMATION MARK;Po;0;ON; 0021 0021;;;;N;;;;; -203D;INTERROBANG;Po;0;ON;;;;;N;;;;; -203E;OVERLINE;Po;0;ON; 0020 0305;;;;N;SPACING OVERSCORE;;;; -203F;UNDERTIE;Pc;0;ON;;;;;N;;;;; -2040;CHARACTER TIE;Pc;0;ON;;;;;N;;;;; -2041;CARET INSERTION POINT;Po;0;ON;;;;;N;;;;; -2042;ASTERISM;Po;0;ON;;;;;N;;;;; -2043;HYPHEN BULLET;Po;0;ON;;;;;N;;;;; -2044;FRACTION SLASH;Sm;0;CS;;;;;N;;;;; -2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;; -2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;; -2047;DOUBLE QUESTION MARK;Po;0;ON; 003F 003F;;;;N;;;;; -2048;QUESTION EXCLAMATION MARK;Po;0;ON; 003F 0021;;;;N;;;;; -2049;EXCLAMATION QUESTION MARK;Po;0;ON; 0021 003F;;;;N;;;;; -204A;TIRONIAN SIGN ET;Po;0;ON;;;;;N;;;;; -204B;REVERSED PILCROW SIGN;Po;0;ON;;;;;N;;;;; -204C;BLACK LEFTWARDS BULLET;Po;0;ON;;;;;N;;;;; -204D;BLACK RIGHTWARDS BULLET;Po;0;ON;;;;;N;;;;; -204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;; -204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;; -2050;CLOSE UP;Po;0;ON;;;;;N;;;;; -2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;; -2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;; -2053;SWUNG DASH;Po;0;ON;;;;;N;;;;; -2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;; -2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;; -2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2057;QUADRUPLE PRIME;Po;0;ON; 2032 2032 2032 2032;;;;N;;;;; -2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;; -205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;; -205D;TRICOLON;Po;0;ON;;;;;N;;;;; -205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;; -205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS; 0020;;;;N;;;;; -2060;WORD JOINER;Cf;0;BN;;;;;N;;;;; -2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;; -2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;; -2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;N;;;;; -2064;INVISIBLE PLUS;Cf;0;BN;;;;;N;;;;; -2066;LEFT-TO-RIGHT ISOLATE;Cf;0;LRI;;;;;N;;;;; -2067;RIGHT-TO-LEFT ISOLATE;Cf;0;RLI;;;;;N;;;;; -2068;FIRST STRONG ISOLATE;Cf;0;FSI;;;;;N;;;;; -2069;POP DIRECTIONAL ISOLATE;Cf;0;PDI;;;;;N;;;;; -206A;INHIBIT SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; -206B;ACTIVATE SYMMETRIC SWAPPING;Cf;0;BN;;;;;N;;;;; -206C;INHIBIT ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; -206D;ACTIVATE ARABIC FORM SHAPING;Cf;0;BN;;;;;N;;;;; -206E;NATIONAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; -206F;NOMINAL DIGIT SHAPES;Cf;0;BN;;;;;N;;;;; -2070;SUPERSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUPERSCRIPT DIGIT ZERO;;;; -2071;SUPERSCRIPT LATIN SMALL LETTER I;Lm;0;L; 0069;;;;N;;;;; -2074;SUPERSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;; -2075;SUPERSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;; -2076;SUPERSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;; -2077;SUPERSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;; -2078;SUPERSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;; -2079;SUPERSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;; -207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -207B;SUPERSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUPERSCRIPT HYPHEN-MINUS;;;; -207C;SUPERSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -207D;SUPERSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUPERSCRIPT OPENING PARENTHESIS;;;; -207E;SUPERSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUPERSCRIPT CLOSING PARENTHESIS;;;; -207F;SUPERSCRIPT LATIN SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; -2080;SUBSCRIPT ZERO;No;0;EN; 0030;;0;0;N;SUBSCRIPT DIGIT ZERO;;;; -2081;SUBSCRIPT ONE;No;0;EN; 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;; -2082;SUBSCRIPT TWO;No;0;EN; 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;; -2083;SUBSCRIPT THREE;No;0;EN; 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;; -2084;SUBSCRIPT FOUR;No;0;EN; 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;; -2085;SUBSCRIPT FIVE;No;0;EN; 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;; -2086;SUBSCRIPT SIX;No;0;EN; 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;; -2087;SUBSCRIPT SEVEN;No;0;EN; 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;; -2088;SUBSCRIPT EIGHT;No;0;EN; 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;; -2089;SUBSCRIPT NINE;No;0;EN; 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;; -208A;SUBSCRIPT PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -208B;SUBSCRIPT MINUS;Sm;0;ES; 2212;;;;N;SUBSCRIPT HYPHEN-MINUS;;;; -208C;SUBSCRIPT EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -208D;SUBSCRIPT LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SUBSCRIPT OPENING PARENTHESIS;;;; -208E;SUBSCRIPT RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SUBSCRIPT CLOSING PARENTHESIS;;;; -2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L; 0061;;;;N;;;;; -2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L; 0065;;;;N;;;;; -2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L; 006F;;;;N;;;;; -2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L; 0078;;;;N;;;;; -2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L; 0259;;;;N;;;;; -2095;LATIN SUBSCRIPT SMALL LETTER H;Lm;0;L; 0068;;;;N;;;;; -2096;LATIN SUBSCRIPT SMALL LETTER K;Lm;0;L; 006B;;;;N;;;;; -2097;LATIN SUBSCRIPT SMALL LETTER L;Lm;0;L; 006C;;;;N;;;;; -2098;LATIN SUBSCRIPT SMALL LETTER M;Lm;0;L; 006D;;;;N;;;;; -2099;LATIN SUBSCRIPT SMALL LETTER N;Lm;0;L; 006E;;;;N;;;;; -209A;LATIN SUBSCRIPT SMALL LETTER P;Lm;0;L; 0070;;;;N;;;;; -209B;LATIN SUBSCRIPT SMALL LETTER S;Lm;0;L; 0073;;;;N;;;;; -209C;LATIN SUBSCRIPT SMALL LETTER T;Lm;0;L; 0074;;;;N;;;;; -20A0;EURO-CURRENCY SIGN;Sc;0;ET;;;;;N;;;;; -20A1;COLON SIGN;Sc;0;ET;;;;;N;;;;; -20A2;CRUZEIRO SIGN;Sc;0;ET;;;;;N;;;;; -20A3;FRENCH FRANC SIGN;Sc;0;ET;;;;;N;;;;; -20A4;LIRA SIGN;Sc;0;ET;;;;;N;;;;; -20A5;MILL SIGN;Sc;0;ET;;;;;N;;;;; -20A6;NAIRA SIGN;Sc;0;ET;;;;;N;;;;; -20A7;PESETA SIGN;Sc;0;ET;;;;;N;;;;; -20A8;RUPEE SIGN;Sc;0;ET; 0052 0073;;;;N;;;;; -20A9;WON SIGN;Sc;0;ET;;;;;N;;;;; -20AA;NEW SHEQEL SIGN;Sc;0;ET;;;;;N;;;;; -20AB;DONG SIGN;Sc;0;ET;;;;;N;;;;; -20AC;EURO SIGN;Sc;0;ET;;;;;N;;;;; -20AD;KIP SIGN;Sc;0;ET;;;;;N;;;;; -20AE;TUGRIK SIGN;Sc;0;ET;;;;;N;;;;; -20AF;DRACHMA SIGN;Sc;0;ET;;;;;N;;;;; -20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;; -20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;; -20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;; -20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;; -20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;; -20B5;CEDI SIGN;Sc;0;ET;;;;;N;;;;; -20B6;LIVRE TOURNOIS SIGN;Sc;0;ET;;;;;N;;;;; -20B7;SPESMILO SIGN;Sc;0;ET;;;;;N;;;;; -20B8;TENGE SIGN;Sc;0;ET;;;;;N;;;;; -20B9;INDIAN RUPEE SIGN;Sc;0;ET;;;;;N;;;;; -20BA;TURKISH LIRA SIGN;Sc;0;ET;;;;;N;;;;; -20BB;NORDIC MARK SIGN;Sc;0;ET;;;;;N;;;;; -20BC;MANAT SIGN;Sc;0;ET;;;;;N;;;;; -20BD;RUBLE SIGN;Sc;0;ET;;;;;N;;;;; -20BE;LARI SIGN;Sc;0;ET;;;;;N;;;;; -20D0;COMBINING LEFT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT HARPOON ABOVE;;;; -20D1;COMBINING RIGHT HARPOON ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT HARPOON ABOVE;;;; -20D2;COMBINING LONG VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING LONG VERTICAL BAR OVERLAY;;;; -20D3;COMBINING SHORT VERTICAL LINE OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING SHORT VERTICAL BAR OVERLAY;;;; -20D4;COMBINING ANTICLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING ANTICLOCKWISE ARROW ABOVE;;;; -20D5;COMBINING CLOCKWISE ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING CLOCKWISE ARROW ABOVE;;;; -20D6;COMBINING LEFT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT ARROW ABOVE;;;; -20D7;COMBINING RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING RIGHT ARROW ABOVE;;;; -20D8;COMBINING RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING RING OVERLAY;;;; -20D9;COMBINING CLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING CLOCKWISE RING OVERLAY;;;; -20DA;COMBINING ANTICLOCKWISE RING OVERLAY;Mn;1;NSM;;;;;N;NON-SPACING ANTICLOCKWISE RING OVERLAY;;;; -20DB;COMBINING THREE DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING THREE DOTS ABOVE;;;; -20DC;COMBINING FOUR DOTS ABOVE;Mn;230;NSM;;;;;N;NON-SPACING FOUR DOTS ABOVE;;;; -20DD;COMBINING ENCLOSING CIRCLE;Me;0;NSM;;;;;N;ENCLOSING CIRCLE;;;; -20DE;COMBINING ENCLOSING SQUARE;Me;0;NSM;;;;;N;ENCLOSING SQUARE;;;; -20DF;COMBINING ENCLOSING DIAMOND;Me;0;NSM;;;;;N;ENCLOSING DIAMOND;;;; -20E0;COMBINING ENCLOSING CIRCLE BACKSLASH;Me;0;NSM;;;;;N;ENCLOSING CIRCLE SLASH;;;; -20E1;COMBINING LEFT RIGHT ARROW ABOVE;Mn;230;NSM;;;;;N;NON-SPACING LEFT RIGHT ARROW ABOVE;;;; -20E2;COMBINING ENCLOSING SCREEN;Me;0;NSM;;;;;N;;;;; -20E3;COMBINING ENCLOSING KEYCAP;Me;0;NSM;;;;;N;;;;; -20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;; -20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; -20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;; -20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;; -20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;; -20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;; -20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;; -20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;; -20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; -20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;; -20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -20EF;COMBINING RIGHT ARROW BELOW;Mn;220;NSM;;;;;N;;;;; -20F0;COMBINING ASTERISK ABOVE;Mn;230;NSM;;;;;N;;;;; -2100;ACCOUNT OF;So;0;ON; 0061 002F 0063;;;;N;;;;; -2101;ADDRESSED TO THE SUBJECT;So;0;ON; 0061 002F 0073;;;;N;;;;; -2102;DOUBLE-STRUCK CAPITAL C;Lu;0;L; 0043;;;;N;DOUBLE-STRUCK C;;;; -2103;DEGREE CELSIUS;So;0;ON; 00B0 0043;;;;N;DEGREES CENTIGRADE;;;; -2104;CENTRE LINE SYMBOL;So;0;ON;;;;;N;C L SYMBOL;;;; -2105;CARE OF;So;0;ON; 0063 002F 006F;;;;N;;;;; -2106;CADA UNA;So;0;ON; 0063 002F 0075;;;;N;;;;; -2107;EULER CONSTANT;Lu;0;L; 0190;;;;N;EULERS;;;; -2108;SCRUPLE;So;0;ON;;;;;N;;;;; -2109;DEGREE FAHRENHEIT;So;0;ON; 00B0 0046;;;;N;DEGREES FAHRENHEIT;;;; -210A;SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; -210B;SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;SCRIPT H;;;; -210C;BLACK-LETTER CAPITAL H;Lu;0;L; 0048;;;;N;BLACK-LETTER H;;;; -210D;DOUBLE-STRUCK CAPITAL H;Lu;0;L; 0048;;;;N;DOUBLE-STRUCK H;;;; -210E;PLANCK CONSTANT;Ll;0;L; 0068;;;;N;;;;; -210F;PLANCK CONSTANT OVER TWO PI;Ll;0;L; 0127;;;;N;PLANCK CONSTANT OVER 2 PI;;;; -2110;SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;SCRIPT I;;;; -2111;BLACK-LETTER CAPITAL I;Lu;0;L; 0049;;;;N;BLACK-LETTER I;;;; -2112;SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;SCRIPT L;;;; -2113;SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -2114;L B BAR SYMBOL;So;0;ON;;;;;N;;;;; -2115;DOUBLE-STRUCK CAPITAL N;Lu;0;L; 004E;;;;N;DOUBLE-STRUCK N;;;; -2116;NUMERO SIGN;So;0;ON; 004E 006F;;;;N;NUMERO;;;; -2117;SOUND RECORDING COPYRIGHT;So;0;ON;;;;;N;;;;; -2118;SCRIPT CAPITAL P;Sm;0;ON;;;;;N;SCRIPT P;;;; -2119;DOUBLE-STRUCK CAPITAL P;Lu;0;L; 0050;;;;N;DOUBLE-STRUCK P;;;; -211A;DOUBLE-STRUCK CAPITAL Q;Lu;0;L; 0051;;;;N;DOUBLE-STRUCK Q;;;; -211B;SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;SCRIPT R;;;; -211C;BLACK-LETTER CAPITAL R;Lu;0;L; 0052;;;;N;BLACK-LETTER R;;;; -211D;DOUBLE-STRUCK CAPITAL R;Lu;0;L; 0052;;;;N;DOUBLE-STRUCK R;;;; -211E;PRESCRIPTION TAKE;So;0;ON;;;;;N;;;;; -211F;RESPONSE;So;0;ON;;;;;N;;;;; -2120;SERVICE MARK;So;0;ON; 0053 004D;;;;N;;;;; -2121;TELEPHONE SIGN;So;0;ON; 0054 0045 004C;;;;N;T E L SYMBOL;;;; -2122;TRADE MARK SIGN;So;0;ON; 0054 004D;;;;N;TRADEMARK;;;; -2123;VERSICLE;So;0;ON;;;;;N;;;;; -2124;DOUBLE-STRUCK CAPITAL Z;Lu;0;L; 005A;;;;N;DOUBLE-STRUCK Z;;;; -2125;OUNCE SIGN;So;0;ON;;;;;N;OUNCE;;;; -2126;OHM SIGN;Lu;0;L;03A9;;;;N;OHM;;;03C9; -2127;INVERTED OHM SIGN;So;0;ON;;;;;N;MHO;;;; -2128;BLACK-LETTER CAPITAL Z;Lu;0;L; 005A;;;;N;BLACK-LETTER Z;;;; -2129;TURNED GREEK SMALL LETTER IOTA;So;0;ON;;;;;N;;;;; -212A;KELVIN SIGN;Lu;0;L;004B;;;;N;DEGREES KELVIN;;;006B; -212B;ANGSTROM SIGN;Lu;0;L;00C5;;;;N;ANGSTROM UNIT;;;00E5; -212C;SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;SCRIPT B;;;; -212D;BLACK-LETTER CAPITAL C;Lu;0;L; 0043;;;;N;BLACK-LETTER C;;;; -212E;ESTIMATED SYMBOL;So;0;ET;;;;;N;;;;; -212F;SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; -2130;SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;SCRIPT E;;;; -2131;SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;SCRIPT F;;;; -2132;TURNED CAPITAL F;Lu;0;L;;;;;N;TURNED F;;;214E; -2133;SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;SCRIPT M;;;; -2134;SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; -2135;ALEF SYMBOL;Lo;0;L; 05D0;;;;N;FIRST TRANSFINITE CARDINAL;;;; -2136;BET SYMBOL;Lo;0;L; 05D1;;;;N;SECOND TRANSFINITE CARDINAL;;;; -2137;GIMEL SYMBOL;Lo;0;L; 05D2;;;;N;THIRD TRANSFINITE CARDINAL;;;; -2138;DALET SYMBOL;Lo;0;L; 05D3;;;;N;FOURTH TRANSFINITE CARDINAL;;;; -2139;INFORMATION SOURCE;Ll;0;L; 0069;;;;N;;;;; -213A;ROTATED CAPITAL Q;So;0;ON;;;;;N;;;;; -213B;FACSIMILE SIGN;So;0;ON; 0046 0041 0058;;;;N;;;;; -213C;DOUBLE-STRUCK SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON; 2211;;;;Y;;;;; -2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;; -2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; -2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;; -2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;; -2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -214A;PROPERTY LINE;So;0;ON;;;;;N;;;;; -214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;; -214C;PER SIGN;So;0;ON;;;;;N;;;;; -214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;; -214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132 -214F;SYMBOL FOR SAMARITAN SOURCE;So;0;L;;;;;N;;;;; -2150;VULGAR FRACTION ONE SEVENTH;No;0;ON; 0031 2044 0037;;;1/7;N;;;;; -2151;VULGAR FRACTION ONE NINTH;No;0;ON; 0031 2044 0039;;;1/9;N;;;;; -2152;VULGAR FRACTION ONE TENTH;No;0;ON; 0031 2044 0031 0030;;;1/10;N;;;;; -2153;VULGAR FRACTION ONE THIRD;No;0;ON; 0031 2044 0033;;;1/3;N;FRACTION ONE THIRD;;;; -2154;VULGAR FRACTION TWO THIRDS;No;0;ON; 0032 2044 0033;;;2/3;N;FRACTION TWO THIRDS;;;; -2155;VULGAR FRACTION ONE FIFTH;No;0;ON; 0031 2044 0035;;;1/5;N;FRACTION ONE FIFTH;;;; -2156;VULGAR FRACTION TWO FIFTHS;No;0;ON; 0032 2044 0035;;;2/5;N;FRACTION TWO FIFTHS;;;; -2157;VULGAR FRACTION THREE FIFTHS;No;0;ON; 0033 2044 0035;;;3/5;N;FRACTION THREE FIFTHS;;;; -2158;VULGAR FRACTION FOUR FIFTHS;No;0;ON; 0034 2044 0035;;;4/5;N;FRACTION FOUR FIFTHS;;;; -2159;VULGAR FRACTION ONE SIXTH;No;0;ON; 0031 2044 0036;;;1/6;N;FRACTION ONE SIXTH;;;; -215A;VULGAR FRACTION FIVE SIXTHS;No;0;ON; 0035 2044 0036;;;5/6;N;FRACTION FIVE SIXTHS;;;; -215B;VULGAR FRACTION ONE EIGHTH;No;0;ON; 0031 2044 0038;;;1/8;N;FRACTION ONE EIGHTH;;;; -215C;VULGAR FRACTION THREE EIGHTHS;No;0;ON; 0033 2044 0038;;;3/8;N;FRACTION THREE EIGHTHS;;;; -215D;VULGAR FRACTION FIVE EIGHTHS;No;0;ON; 0035 2044 0038;;;5/8;N;FRACTION FIVE EIGHTHS;;;; -215E;VULGAR FRACTION SEVEN EIGHTHS;No;0;ON; 0037 2044 0038;;;7/8;N;FRACTION SEVEN EIGHTHS;;;; -215F;FRACTION NUMERATOR ONE;No;0;ON; 0031 2044;;;1;N;;;;; -2160;ROMAN NUMERAL ONE;Nl;0;L; 0049;;;1;N;;;;2170; -2161;ROMAN NUMERAL TWO;Nl;0;L; 0049 0049;;;2;N;;;;2171; -2162;ROMAN NUMERAL THREE;Nl;0;L; 0049 0049 0049;;;3;N;;;;2172; -2163;ROMAN NUMERAL FOUR;Nl;0;L; 0049 0056;;;4;N;;;;2173; -2164;ROMAN NUMERAL FIVE;Nl;0;L; 0056;;;5;N;;;;2174; -2165;ROMAN NUMERAL SIX;Nl;0;L; 0056 0049;;;6;N;;;;2175; -2166;ROMAN NUMERAL SEVEN;Nl;0;L; 0056 0049 0049;;;7;N;;;;2176; -2167;ROMAN NUMERAL EIGHT;Nl;0;L; 0056 0049 0049 0049;;;8;N;;;;2177; -2168;ROMAN NUMERAL NINE;Nl;0;L; 0049 0058;;;9;N;;;;2178; -2169;ROMAN NUMERAL TEN;Nl;0;L; 0058;;;10;N;;;;2179; -216A;ROMAN NUMERAL ELEVEN;Nl;0;L; 0058 0049;;;11;N;;;;217A; -216B;ROMAN NUMERAL TWELVE;Nl;0;L; 0058 0049 0049;;;12;N;;;;217B; -216C;ROMAN NUMERAL FIFTY;Nl;0;L; 004C;;;50;N;;;;217C; -216D;ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0043;;;100;N;;;;217D; -216E;ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0044;;;500;N;;;;217E; -216F;ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 004D;;;1000;N;;;;217F; -2170;SMALL ROMAN NUMERAL ONE;Nl;0;L; 0069;;;1;N;;;2160;;2160 -2171;SMALL ROMAN NUMERAL TWO;Nl;0;L; 0069 0069;;;2;N;;;2161;;2161 -2172;SMALL ROMAN NUMERAL THREE;Nl;0;L; 0069 0069 0069;;;3;N;;;2162;;2162 -2173;SMALL ROMAN NUMERAL FOUR;Nl;0;L; 0069 0076;;;4;N;;;2163;;2163 -2174;SMALL ROMAN NUMERAL FIVE;Nl;0;L; 0076;;;5;N;;;2164;;2164 -2175;SMALL ROMAN NUMERAL SIX;Nl;0;L; 0076 0069;;;6;N;;;2165;;2165 -2176;SMALL ROMAN NUMERAL SEVEN;Nl;0;L; 0076 0069 0069;;;7;N;;;2166;;2166 -2177;SMALL ROMAN NUMERAL EIGHT;Nl;0;L; 0076 0069 0069 0069;;;8;N;;;2167;;2167 -2178;SMALL ROMAN NUMERAL NINE;Nl;0;L; 0069 0078;;;9;N;;;2168;;2168 -2179;SMALL ROMAN NUMERAL TEN;Nl;0;L; 0078;;;10;N;;;2169;;2169 -217A;SMALL ROMAN NUMERAL ELEVEN;Nl;0;L; 0078 0069;;;11;N;;;216A;;216A -217B;SMALL ROMAN NUMERAL TWELVE;Nl;0;L; 0078 0069 0069;;;12;N;;;216B;;216B -217C;SMALL ROMAN NUMERAL FIFTY;Nl;0;L; 006C;;;50;N;;;216C;;216C -217D;SMALL ROMAN NUMERAL ONE HUNDRED;Nl;0;L; 0063;;;100;N;;;216D;;216D -217E;SMALL ROMAN NUMERAL FIVE HUNDRED;Nl;0;L; 0064;;;500;N;;;216E;;216E -217F;SMALL ROMAN NUMERAL ONE THOUSAND;Nl;0;L; 006D;;;1000;N;;;216F;;216F -2180;ROMAN NUMERAL ONE THOUSAND C D;Nl;0;L;;;;1000;N;;;;; -2181;ROMAN NUMERAL FIVE THOUSAND;Nl;0;L;;;;5000;N;;;;; -2182;ROMAN NUMERAL TEN THOUSAND;Nl;0;L;;;;10000;N;;;;; -2183;ROMAN NUMERAL REVERSED ONE HUNDRED;Lu;0;L;;;;;N;;;;2184; -2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183 -2185;ROMAN NUMERAL SIX LATE FORM;Nl;0;L;;;;6;N;;;;; -2186;ROMAN NUMERAL FIFTY EARLY FORM;Nl;0;L;;;;50;N;;;;; -2187;ROMAN NUMERAL FIFTY THOUSAND;Nl;0;L;;;;50000;N;;;;; -2188;ROMAN NUMERAL ONE HUNDRED THOUSAND;Nl;0;L;;;;100000;N;;;;; -2189;VULGAR FRACTION ZERO THIRDS;No;0;ON; 0030 2044 0033;;;0;N;;;;; -218A;TURNED DIGIT TWO;So;0;ON;;;;;N;;;;; -218B;TURNED DIGIT THREE;So;0;ON;;;;;N;;;;; -2190;LEFTWARDS ARROW;Sm;0;ON;;;;;N;LEFT ARROW;;;; -2191;UPWARDS ARROW;Sm;0;ON;;;;;N;UP ARROW;;;; -2192;RIGHTWARDS ARROW;Sm;0;ON;;;;;N;RIGHT ARROW;;;; -2193;DOWNWARDS ARROW;Sm;0;ON;;;;;N;DOWN ARROW;;;; -2194;LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; -2195;UP DOWN ARROW;So;0;ON;;;;;N;;;;; -2196;NORTH WEST ARROW;So;0;ON;;;;;N;UPPER LEFT ARROW;;;; -2197;NORTH EAST ARROW;So;0;ON;;;;;N;UPPER RIGHT ARROW;;;; -2198;SOUTH EAST ARROW;So;0;ON;;;;;N;LOWER RIGHT ARROW;;;; -2199;SOUTH WEST ARROW;So;0;ON;;;;;N;LOWER LEFT ARROW;;;; -219A;LEFTWARDS ARROW WITH STROKE;Sm;0;ON;2190 0338;;;;N;LEFT ARROW WITH STROKE;;;; -219B;RIGHTWARDS ARROW WITH STROKE;Sm;0;ON;2192 0338;;;;N;RIGHT ARROW WITH STROKE;;;; -219C;LEFTWARDS WAVE ARROW;So;0;ON;;;;;N;LEFT WAVE ARROW;;;; -219D;RIGHTWARDS WAVE ARROW;So;0;ON;;;;;N;RIGHT WAVE ARROW;;;; -219E;LEFTWARDS TWO HEADED ARROW;So;0;ON;;;;;N;LEFT TWO HEADED ARROW;;;; -219F;UPWARDS TWO HEADED ARROW;So;0;ON;;;;;N;UP TWO HEADED ARROW;;;; -21A0;RIGHTWARDS TWO HEADED ARROW;Sm;0;ON;;;;;N;RIGHT TWO HEADED ARROW;;;; -21A1;DOWNWARDS TWO HEADED ARROW;So;0;ON;;;;;N;DOWN TWO HEADED ARROW;;;; -21A2;LEFTWARDS ARROW WITH TAIL;So;0;ON;;;;;N;LEFT ARROW WITH TAIL;;;; -21A3;RIGHTWARDS ARROW WITH TAIL;Sm;0;ON;;;;;N;RIGHT ARROW WITH TAIL;;;; -21A4;LEFTWARDS ARROW FROM BAR;So;0;ON;;;;;N;LEFT ARROW FROM BAR;;;; -21A5;UPWARDS ARROW FROM BAR;So;0;ON;;;;;N;UP ARROW FROM BAR;;;; -21A6;RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;RIGHT ARROW FROM BAR;;;; -21A7;DOWNWARDS ARROW FROM BAR;So;0;ON;;;;;N;DOWN ARROW FROM BAR;;;; -21A8;UP DOWN ARROW WITH BASE;So;0;ON;;;;;N;;;;; -21A9;LEFTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;LEFT ARROW WITH HOOK;;;; -21AA;RIGHTWARDS ARROW WITH HOOK;So;0;ON;;;;;N;RIGHT ARROW WITH HOOK;;;; -21AB;LEFTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;LEFT ARROW WITH LOOP;;;; -21AC;RIGHTWARDS ARROW WITH LOOP;So;0;ON;;;;;N;RIGHT ARROW WITH LOOP;;;; -21AD;LEFT RIGHT WAVE ARROW;So;0;ON;;;;;N;;;;; -21AE;LEFT RIGHT ARROW WITH STROKE;Sm;0;ON;2194 0338;;;;N;;;;; -21AF;DOWNWARDS ZIGZAG ARROW;So;0;ON;;;;;N;DOWN ZIGZAG ARROW;;;; -21B0;UPWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP LEFT;;;; -21B1;UPWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;UP ARROW WITH TIP RIGHT;;;; -21B2;DOWNWARDS ARROW WITH TIP LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP LEFT;;;; -21B3;DOWNWARDS ARROW WITH TIP RIGHTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH TIP RIGHT;;;; -21B4;RIGHTWARDS ARROW WITH CORNER DOWNWARDS;So;0;ON;;;;;N;RIGHT ARROW WITH CORNER DOWN;;;; -21B5;DOWNWARDS ARROW WITH CORNER LEFTWARDS;So;0;ON;;;;;N;DOWN ARROW WITH CORNER LEFT;;;; -21B6;ANTICLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; -21B7;CLOCKWISE TOP SEMICIRCLE ARROW;So;0;ON;;;;;N;;;;; -21B8;NORTH WEST ARROW TO LONG BAR;So;0;ON;;;;;N;UPPER LEFT ARROW TO LONG BAR;;;; -21B9;LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR OVER RIGHT ARROW TO BAR;;;; -21BA;ANTICLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -21BB;CLOCKWISE OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -21BC;LEFTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB UP;;;; -21BD;LEFTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;LEFT HARPOON WITH BARB DOWN;;;; -21BE;UPWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB RIGHT;;;; -21BF;UPWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;UP HARPOON WITH BARB LEFT;;;; -21C0;RIGHTWARDS HARPOON WITH BARB UPWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB UP;;;; -21C1;RIGHTWARDS HARPOON WITH BARB DOWNWARDS;So;0;ON;;;;;N;RIGHT HARPOON WITH BARB DOWN;;;; -21C2;DOWNWARDS HARPOON WITH BARB RIGHTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB RIGHT;;;; -21C3;DOWNWARDS HARPOON WITH BARB LEFTWARDS;So;0;ON;;;;;N;DOWN HARPOON WITH BARB LEFT;;;; -21C4;RIGHTWARDS ARROW OVER LEFTWARDS ARROW;So;0;ON;;;;;N;RIGHT ARROW OVER LEFT ARROW;;;; -21C5;UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW;So;0;ON;;;;;N;UP ARROW LEFT OF DOWN ARROW;;;; -21C6;LEFTWARDS ARROW OVER RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT ARROW OVER RIGHT ARROW;;;; -21C7;LEFTWARDS PAIRED ARROWS;So;0;ON;;;;;N;LEFT PAIRED ARROWS;;;; -21C8;UPWARDS PAIRED ARROWS;So;0;ON;;;;;N;UP PAIRED ARROWS;;;; -21C9;RIGHTWARDS PAIRED ARROWS;So;0;ON;;;;;N;RIGHT PAIRED ARROWS;;;; -21CA;DOWNWARDS PAIRED ARROWS;So;0;ON;;;;;N;DOWN PAIRED ARROWS;;;; -21CB;LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON;So;0;ON;;;;;N;LEFT HARPOON OVER RIGHT HARPOON;;;; -21CC;RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON;So;0;ON;;;;;N;RIGHT HARPOON OVER LEFT HARPOON;;;; -21CD;LEFTWARDS DOUBLE ARROW WITH STROKE;So;0;ON;21D0 0338;;;;N;LEFT DOUBLE ARROW WITH STROKE;;;; -21CE;LEFT RIGHT DOUBLE ARROW WITH STROKE;Sm;0;ON;21D4 0338;;;;N;;;;; -21CF;RIGHTWARDS DOUBLE ARROW WITH STROKE;Sm;0;ON;21D2 0338;;;;N;RIGHT DOUBLE ARROW WITH STROKE;;;; -21D0;LEFTWARDS DOUBLE ARROW;So;0;ON;;;;;N;LEFT DOUBLE ARROW;;;; -21D1;UPWARDS DOUBLE ARROW;So;0;ON;;;;;N;UP DOUBLE ARROW;;;; -21D2;RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;RIGHT DOUBLE ARROW;;;; -21D3;DOWNWARDS DOUBLE ARROW;So;0;ON;;;;;N;DOWN DOUBLE ARROW;;;; -21D4;LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -21D5;UP DOWN DOUBLE ARROW;So;0;ON;;;;;N;;;;; -21D6;NORTH WEST DOUBLE ARROW;So;0;ON;;;;;N;UPPER LEFT DOUBLE ARROW;;;; -21D7;NORTH EAST DOUBLE ARROW;So;0;ON;;;;;N;UPPER RIGHT DOUBLE ARROW;;;; -21D8;SOUTH EAST DOUBLE ARROW;So;0;ON;;;;;N;LOWER RIGHT DOUBLE ARROW;;;; -21D9;SOUTH WEST DOUBLE ARROW;So;0;ON;;;;;N;LOWER LEFT DOUBLE ARROW;;;; -21DA;LEFTWARDS TRIPLE ARROW;So;0;ON;;;;;N;LEFT TRIPLE ARROW;;;; -21DB;RIGHTWARDS TRIPLE ARROW;So;0;ON;;;;;N;RIGHT TRIPLE ARROW;;;; -21DC;LEFTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;LEFT SQUIGGLE ARROW;;;; -21DD;RIGHTWARDS SQUIGGLE ARROW;So;0;ON;;;;;N;RIGHT SQUIGGLE ARROW;;;; -21DE;UPWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;UP ARROW WITH DOUBLE STROKE;;;; -21DF;DOWNWARDS ARROW WITH DOUBLE STROKE;So;0;ON;;;;;N;DOWN ARROW WITH DOUBLE STROKE;;;; -21E0;LEFTWARDS DASHED ARROW;So;0;ON;;;;;N;LEFT DASHED ARROW;;;; -21E1;UPWARDS DASHED ARROW;So;0;ON;;;;;N;UP DASHED ARROW;;;; -21E2;RIGHTWARDS DASHED ARROW;So;0;ON;;;;;N;RIGHT DASHED ARROW;;;; -21E3;DOWNWARDS DASHED ARROW;So;0;ON;;;;;N;DOWN DASHED ARROW;;;; -21E4;LEFTWARDS ARROW TO BAR;So;0;ON;;;;;N;LEFT ARROW TO BAR;;;; -21E5;RIGHTWARDS ARROW TO BAR;So;0;ON;;;;;N;RIGHT ARROW TO BAR;;;; -21E6;LEFTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE LEFT ARROW;;;; -21E7;UPWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE UP ARROW;;;; -21E8;RIGHTWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE RIGHT ARROW;;;; -21E9;DOWNWARDS WHITE ARROW;So;0;ON;;;;;N;WHITE DOWN ARROW;;;; -21EA;UPWARDS WHITE ARROW FROM BAR;So;0;ON;;;;;N;WHITE UP ARROW FROM BAR;;;; -21EB;UPWARDS WHITE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; -21EC;UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; -21ED;UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -21EE;UPWARDS WHITE DOUBLE ARROW;So;0;ON;;;;;N;;;;; -21EF;UPWARDS WHITE DOUBLE ARROW ON PEDESTAL;So;0;ON;;;;;N;;;;; -21F0;RIGHTWARDS WHITE ARROW FROM WALL;So;0;ON;;;;;N;;;;; -21F1;NORTH WEST ARROW TO CORNER;So;0;ON;;;;;N;;;;; -21F2;SOUTH EAST ARROW TO CORNER;So;0;ON;;;;;N;;;;; -21F3;UP DOWN WHITE ARROW;So;0;ON;;;;;N;;;;; -21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;; -21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; -21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; -21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; -21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;; -2200;FOR ALL;Sm;0;ON;;;;;N;;;;; -2201;COMPLEMENT;Sm;0;ON;;;;;Y;;;;; -2202;PARTIAL DIFFERENTIAL;Sm;0;ON;;;;;Y;;;;; -2203;THERE EXISTS;Sm;0;ON;;;;;Y;;;;; -2204;THERE DOES NOT EXIST;Sm;0;ON;2203 0338;;;;Y;;;;; -2205;EMPTY SET;Sm;0;ON;;;;;N;;;;; -2206;INCREMENT;Sm;0;ON;;;;;N;;;;; -2207;NABLA;Sm;0;ON;;;;;N;;;;; -2208;ELEMENT OF;Sm;0;ON;;;;;Y;;;;; -2209;NOT AN ELEMENT OF;Sm;0;ON;2208 0338;;;;Y;;;;; -220A;SMALL ELEMENT OF;Sm;0;ON;;;;;Y;;;;; -220B;CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; -220C;DOES NOT CONTAIN AS MEMBER;Sm;0;ON;220B 0338;;;;Y;;;;; -220D;SMALL CONTAINS AS MEMBER;Sm;0;ON;;;;;Y;;;;; -220E;END OF PROOF;Sm;0;ON;;;;;N;;;;; -220F;N-ARY PRODUCT;Sm;0;ON;;;;;N;;;;; -2210;N-ARY COPRODUCT;Sm;0;ON;;;;;N;;;;; -2211;N-ARY SUMMATION;Sm;0;ON;;;;;Y;;;;; -2212;MINUS SIGN;Sm;0;ES;;;;;N;;;;; -2213;MINUS-OR-PLUS SIGN;Sm;0;ET;;;;;N;;;;; -2214;DOT PLUS;Sm;0;ON;;;;;N;;;;; -2215;DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; -2216;SET MINUS;Sm;0;ON;;;;;Y;;;;; -2217;ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; -2218;RING OPERATOR;Sm;0;ON;;;;;N;;;;; -2219;BULLET OPERATOR;Sm;0;ON;;;;;N;;;;; -221A;SQUARE ROOT;Sm;0;ON;;;;;Y;;;;; -221B;CUBE ROOT;Sm;0;ON;;;;;Y;;;;; -221C;FOURTH ROOT;Sm;0;ON;;;;;Y;;;;; -221D;PROPORTIONAL TO;Sm;0;ON;;;;;Y;;;;; -221E;INFINITY;Sm;0;ON;;;;;N;;;;; -221F;RIGHT ANGLE;Sm;0;ON;;;;;Y;;;;; -2220;ANGLE;Sm;0;ON;;;;;Y;;;;; -2221;MEASURED ANGLE;Sm;0;ON;;;;;Y;;;;; -2222;SPHERICAL ANGLE;Sm;0;ON;;;;;Y;;;;; -2223;DIVIDES;Sm;0;ON;;;;;N;;;;; -2224;DOES NOT DIVIDE;Sm;0;ON;2223 0338;;;;Y;;;;; -2225;PARALLEL TO;Sm;0;ON;;;;;N;;;;; -2226;NOT PARALLEL TO;Sm;0;ON;2225 0338;;;;Y;;;;; -2227;LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2228;LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2229;INTERSECTION;Sm;0;ON;;;;;N;;;;; -222A;UNION;Sm;0;ON;;;;;N;;;;; -222B;INTEGRAL;Sm;0;ON;;;;;Y;;;;; -222C;DOUBLE INTEGRAL;Sm;0;ON; 222B 222B;;;;Y;;;;; -222D;TRIPLE INTEGRAL;Sm;0;ON; 222B 222B 222B;;;;Y;;;;; -222E;CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -222F;SURFACE INTEGRAL;Sm;0;ON; 222E 222E;;;;Y;;;;; -2230;VOLUME INTEGRAL;Sm;0;ON; 222E 222E 222E;;;;Y;;;;; -2231;CLOCKWISE INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2232;CLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2233;ANTICLOCKWISE CONTOUR INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2234;THEREFORE;Sm;0;ON;;;;;N;;;;; -2235;BECAUSE;Sm;0;ON;;;;;N;;;;; -2236;RATIO;Sm;0;ON;;;;;N;;;;; -2237;PROPORTION;Sm;0;ON;;;;;N;;;;; -2238;DOT MINUS;Sm;0;ON;;;;;N;;;;; -2239;EXCESS;Sm;0;ON;;;;;Y;;;;; -223A;GEOMETRIC PROPORTION;Sm;0;ON;;;;;N;;;;; -223B;HOMOTHETIC;Sm;0;ON;;;;;Y;;;;; -223C;TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -223D;REVERSED TILDE;Sm;0;ON;;;;;Y;;;;; -223E;INVERTED LAZY S;Sm;0;ON;;;;;Y;;;;; -223F;SINE WAVE;Sm;0;ON;;;;;Y;;;;; -2240;WREATH PRODUCT;Sm;0;ON;;;;;Y;;;;; -2241;NOT TILDE;Sm;0;ON;223C 0338;;;;Y;;;;; -2242;MINUS TILDE;Sm;0;ON;;;;;Y;;;;; -2243;ASYMPTOTICALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2244;NOT ASYMPTOTICALLY EQUAL TO;Sm;0;ON;2243 0338;;;;Y;;;;; -2245;APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2246;APPROXIMATELY BUT NOT ACTUALLY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2247;NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO;Sm;0;ON;2245 0338;;;;Y;;;;; -2248;ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2249;NOT ALMOST EQUAL TO;Sm;0;ON;2248 0338;;;;Y;;;;; -224A;ALMOST EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -224B;TRIPLE TILDE;Sm;0;ON;;;;;Y;;;;; -224C;ALL EQUAL TO;Sm;0;ON;;;;;Y;;;;; -224D;EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -224E;GEOMETRICALLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -224F;DIFFERENCE BETWEEN;Sm;0;ON;;;;;N;;;;; -2250;APPROACHES THE LIMIT;Sm;0;ON;;;;;N;;;;; -2251;GEOMETRICALLY EQUAL TO;Sm;0;ON;;;;;N;;;;; -2252;APPROXIMATELY EQUAL TO OR THE IMAGE OF;Sm;0;ON;;;;;Y;;;;; -2253;IMAGE OF OR APPROXIMATELY EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2254;COLON EQUALS;Sm;0;ON;;;;;Y;COLON EQUAL;;;; -2255;EQUALS COLON;Sm;0;ON;;;;;Y;EQUAL COLON;;;; -2256;RING IN EQUAL TO;Sm;0;ON;;;;;N;;;;; -2257;RING EQUAL TO;Sm;0;ON;;;;;N;;;;; -2258;CORRESPONDS TO;Sm;0;ON;;;;;N;;;;; -2259;ESTIMATES;Sm;0;ON;;;;;N;;;;; -225A;EQUIANGULAR TO;Sm;0;ON;;;;;N;;;;; -225B;STAR EQUALS;Sm;0;ON;;;;;N;;;;; -225C;DELTA EQUAL TO;Sm;0;ON;;;;;N;;;;; -225D;EQUAL TO BY DEFINITION;Sm;0;ON;;;;;N;;;;; -225E;MEASURED BY;Sm;0;ON;;;;;N;;;;; -225F;QUESTIONED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2260;NOT EQUAL TO;Sm;0;ON;003D 0338;;;;Y;;;;; -2261;IDENTICAL TO;Sm;0;ON;;;;;N;;;;; -2262;NOT IDENTICAL TO;Sm;0;ON;2261 0338;;;;Y;;;;; -2263;STRICTLY EQUIVALENT TO;Sm;0;ON;;;;;N;;;;; -2264;LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUAL TO;;;; -2265;GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUAL TO;;;; -2266;LESS-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN OVER EQUAL TO;;;; -2267;GREATER-THAN OVER EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN OVER EQUAL TO;;;; -2268;LESS-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUAL TO;;;; -2269;GREATER-THAN BUT NOT EQUAL TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUAL TO;;;; -226A;MUCH LESS-THAN;Sm;0;ON;;;;;Y;MUCH LESS THAN;;;; -226B;MUCH GREATER-THAN;Sm;0;ON;;;;;Y;MUCH GREATER THAN;;;; -226C;BETWEEN;Sm;0;ON;;;;;N;;;;; -226D;NOT EQUIVALENT TO;Sm;0;ON;224D 0338;;;;N;;;;; -226E;NOT LESS-THAN;Sm;0;ON;003C 0338;;;;Y;NOT LESS THAN;;;; -226F;NOT GREATER-THAN;Sm;0;ON;003E 0338;;;;Y;NOT GREATER THAN;;;; -2270;NEITHER LESS-THAN NOR EQUAL TO;Sm;0;ON;2264 0338;;;;Y;NEITHER LESS THAN NOR EQUAL TO;;;; -2271;NEITHER GREATER-THAN NOR EQUAL TO;Sm;0;ON;2265 0338;;;;Y;NEITHER GREATER THAN NOR EQUAL TO;;;; -2272;LESS-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN OR EQUIVALENT TO;;;; -2273;GREATER-THAN OR EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN OR EQUIVALENT TO;;;; -2274;NEITHER LESS-THAN NOR EQUIVALENT TO;Sm;0;ON;2272 0338;;;;Y;NEITHER LESS THAN NOR EQUIVALENT TO;;;; -2275;NEITHER GREATER-THAN NOR EQUIVALENT TO;Sm;0;ON;2273 0338;;;;Y;NEITHER GREATER THAN NOR EQUIVALENT TO;;;; -2276;LESS-THAN OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN OR GREATER THAN;;;; -2277;GREATER-THAN OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN OR LESS THAN;;;; -2278;NEITHER LESS-THAN NOR GREATER-THAN;Sm;0;ON;2276 0338;;;;Y;NEITHER LESS THAN NOR GREATER THAN;;;; -2279;NEITHER GREATER-THAN NOR LESS-THAN;Sm;0;ON;2277 0338;;;;Y;NEITHER GREATER THAN NOR LESS THAN;;;; -227A;PRECEDES;Sm;0;ON;;;;;Y;;;;; -227B;SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -227C;PRECEDES OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -227D;SUCCEEDS OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -227E;PRECEDES OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -227F;SUCCEEDS OR EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -2280;DOES NOT PRECEDE;Sm;0;ON;227A 0338;;;;Y;;;;; -2281;DOES NOT SUCCEED;Sm;0;ON;227B 0338;;;;Y;;;;; -2282;SUBSET OF;Sm;0;ON;;;;;Y;;;;; -2283;SUPERSET OF;Sm;0;ON;;;;;Y;;;;; -2284;NOT A SUBSET OF;Sm;0;ON;2282 0338;;;;Y;;;;; -2285;NOT A SUPERSET OF;Sm;0;ON;2283 0338;;;;Y;;;;; -2286;SUBSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2287;SUPERSET OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2288;NEITHER A SUBSET OF NOR EQUAL TO;Sm;0;ON;2286 0338;;;;Y;;;;; -2289;NEITHER A SUPERSET OF NOR EQUAL TO;Sm;0;ON;2287 0338;;;;Y;;;;; -228A;SUBSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUBSET OF OR NOT EQUAL TO;;;; -228B;SUPERSET OF WITH NOT EQUAL TO;Sm;0;ON;;;;;Y;SUPERSET OF OR NOT EQUAL TO;;;; -228C;MULTISET;Sm;0;ON;;;;;Y;;;;; -228D;MULTISET MULTIPLICATION;Sm;0;ON;;;;;N;;;;; -228E;MULTISET UNION;Sm;0;ON;;;;;N;;;;; -228F;SQUARE IMAGE OF;Sm;0;ON;;;;;Y;;;;; -2290;SQUARE ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; -2291;SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2292;SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2293;SQUARE CAP;Sm;0;ON;;;;;N;;;;; -2294;SQUARE CUP;Sm;0;ON;;;;;N;;;;; -2295;CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -2296;CIRCLED MINUS;Sm;0;ON;;;;;N;;;;; -2297;CIRCLED TIMES;Sm;0;ON;;;;;N;;;;; -2298;CIRCLED DIVISION SLASH;Sm;0;ON;;;;;Y;;;;; -2299;CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -229A;CIRCLED RING OPERATOR;Sm;0;ON;;;;;N;;;;; -229B;CIRCLED ASTERISK OPERATOR;Sm;0;ON;;;;;N;;;;; -229C;CIRCLED EQUALS;Sm;0;ON;;;;;N;;;;; -229D;CIRCLED DASH;Sm;0;ON;;;;;N;;;;; -229E;SQUARED PLUS;Sm;0;ON;;;;;N;;;;; -229F;SQUARED MINUS;Sm;0;ON;;;;;N;;;;; -22A0;SQUARED TIMES;Sm;0;ON;;;;;N;;;;; -22A1;SQUARED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -22A2;RIGHT TACK;Sm;0;ON;;;;;Y;;;;; -22A3;LEFT TACK;Sm;0;ON;;;;;Y;;;;; -22A4;DOWN TACK;Sm;0;ON;;;;;N;;;;; -22A5;UP TACK;Sm;0;ON;;;;;N;;;;; -22A6;ASSERTION;Sm;0;ON;;;;;Y;;;;; -22A7;MODELS;Sm;0;ON;;;;;Y;;;;; -22A8;TRUE;Sm;0;ON;;;;;Y;;;;; -22A9;FORCES;Sm;0;ON;;;;;Y;;;;; -22AA;TRIPLE VERTICAL BAR RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -22AB;DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -22AC;DOES NOT PROVE;Sm;0;ON;22A2 0338;;;;Y;;;;; -22AD;NOT TRUE;Sm;0;ON;22A8 0338;;;;Y;;;;; -22AE;DOES NOT FORCE;Sm;0;ON;22A9 0338;;;;Y;;;;; -22AF;NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE;Sm;0;ON;22AB 0338;;;;Y;;;;; -22B0;PRECEDES UNDER RELATION;Sm;0;ON;;;;;Y;;;;; -22B1;SUCCEEDS UNDER RELATION;Sm;0;ON;;;;;Y;;;;; -22B2;NORMAL SUBGROUP OF;Sm;0;ON;;;;;Y;;;;; -22B3;CONTAINS AS NORMAL SUBGROUP;Sm;0;ON;;;;;Y;;;;; -22B4;NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22B5;CONTAINS AS NORMAL SUBGROUP OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22B6;ORIGINAL OF;Sm;0;ON;;;;;Y;;;;; -22B7;IMAGE OF;Sm;0;ON;;;;;Y;;;;; -22B8;MULTIMAP;Sm;0;ON;;;;;Y;;;;; -22B9;HERMITIAN CONJUGATE MATRIX;Sm;0;ON;;;;;N;;;;; -22BA;INTERCALATE;Sm;0;ON;;;;;N;;;;; -22BB;XOR;Sm;0;ON;;;;;N;;;;; -22BC;NAND;Sm;0;ON;;;;;N;;;;; -22BD;NOR;Sm;0;ON;;;;;N;;;;; -22BE;RIGHT ANGLE WITH ARC;Sm;0;ON;;;;;Y;;;;; -22BF;RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -22C0;N-ARY LOGICAL AND;Sm;0;ON;;;;;N;;;;; -22C1;N-ARY LOGICAL OR;Sm;0;ON;;;;;N;;;;; -22C2;N-ARY INTERSECTION;Sm;0;ON;;;;;N;;;;; -22C3;N-ARY UNION;Sm;0;ON;;;;;N;;;;; -22C4;DIAMOND OPERATOR;Sm;0;ON;;;;;N;;;;; -22C5;DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -22C6;STAR OPERATOR;Sm;0;ON;;;;;N;;;;; -22C7;DIVISION TIMES;Sm;0;ON;;;;;N;;;;; -22C8;BOWTIE;Sm;0;ON;;;;;N;;;;; -22C9;LEFT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CA;RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CB;LEFT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CC;RIGHT SEMIDIRECT PRODUCT;Sm;0;ON;;;;;Y;;;;; -22CD;REVERSED TILDE EQUALS;Sm;0;ON;;;;;Y;;;;; -22CE;CURLY LOGICAL OR;Sm;0;ON;;;;;N;;;;; -22CF;CURLY LOGICAL AND;Sm;0;ON;;;;;N;;;;; -22D0;DOUBLE SUBSET;Sm;0;ON;;;;;Y;;;;; -22D1;DOUBLE SUPERSET;Sm;0;ON;;;;;Y;;;;; -22D2;DOUBLE INTERSECTION;Sm;0;ON;;;;;N;;;;; -22D3;DOUBLE UNION;Sm;0;ON;;;;;N;;;;; -22D4;PITCHFORK;Sm;0;ON;;;;;N;;;;; -22D5;EQUAL AND PARALLEL TO;Sm;0;ON;;;;;N;;;;; -22D6;LESS-THAN WITH DOT;Sm;0;ON;;;;;Y;LESS THAN WITH DOT;;;; -22D7;GREATER-THAN WITH DOT;Sm;0;ON;;;;;Y;GREATER THAN WITH DOT;;;; -22D8;VERY MUCH LESS-THAN;Sm;0;ON;;;;;Y;VERY MUCH LESS THAN;;;; -22D9;VERY MUCH GREATER-THAN;Sm;0;ON;;;;;Y;VERY MUCH GREATER THAN;;;; -22DA;LESS-THAN EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;LESS THAN EQUAL TO OR GREATER THAN;;;; -22DB;GREATER-THAN EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;GREATER THAN EQUAL TO OR LESS THAN;;;; -22DC;EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR LESS THAN;;;; -22DD;EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;EQUAL TO OR GREATER THAN;;;; -22DE;EQUAL TO OR PRECEDES;Sm;0;ON;;;;;Y;;;;; -22DF;EQUAL TO OR SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -22E0;DOES NOT PRECEDE OR EQUAL;Sm;0;ON;227C 0338;;;;Y;;;;; -22E1;DOES NOT SUCCEED OR EQUAL;Sm;0;ON;227D 0338;;;;Y;;;;; -22E2;NOT SQUARE IMAGE OF OR EQUAL TO;Sm;0;ON;2291 0338;;;;Y;;;;; -22E3;NOT SQUARE ORIGINAL OF OR EQUAL TO;Sm;0;ON;2292 0338;;;;Y;;;;; -22E4;SQUARE IMAGE OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22E5;SQUARE ORIGINAL OF OR NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -22E6;LESS-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;LESS THAN BUT NOT EQUIVALENT TO;;;; -22E7;GREATER-THAN BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;GREATER THAN BUT NOT EQUIVALENT TO;;;; -22E8;PRECEDES BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -22E9;SUCCEEDS BUT NOT EQUIVALENT TO;Sm;0;ON;;;;;Y;;;;; -22EA;NOT NORMAL SUBGROUP OF;Sm;0;ON;22B2 0338;;;;Y;;;;; -22EB;DOES NOT CONTAIN AS NORMAL SUBGROUP;Sm;0;ON;22B3 0338;;;;Y;;;;; -22EC;NOT NORMAL SUBGROUP OF OR EQUAL TO;Sm;0;ON;22B4 0338;;;;Y;;;;; -22ED;DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL;Sm;0;ON;22B5 0338;;;;Y;;;;; -22EE;VERTICAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; -22EF;MIDLINE HORIZONTAL ELLIPSIS;Sm;0;ON;;;;;N;;;;; -22F0;UP RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; -22F1;DOWN RIGHT DIAGONAL ELLIPSIS;Sm;0;ON;;;;;Y;;;;; -22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;; -22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -22FF;Z NOTATION BAG MEMBERSHIP;Sm;0;ON;;;;;Y;;;;; -2300;DIAMETER SIGN;So;0;ON;;;;;N;;;;; -2301;ELECTRIC ARROW;So;0;ON;;;;;N;;;;; -2302;HOUSE;So;0;ON;;;;;N;;;;; -2303;UP ARROWHEAD;So;0;ON;;;;;N;;;;; -2304;DOWN ARROWHEAD;So;0;ON;;;;;N;;;;; -2305;PROJECTIVE;So;0;ON;;;;;N;;;;; -2306;PERSPECTIVE;So;0;ON;;;;;N;;;;; -2307;WAVY LINE;So;0;ON;;;;;N;;;;; -2308;LEFT CEILING;Ps;0;ON;;;;;Y;;;;; -2309;RIGHT CEILING;Pe;0;ON;;;;;Y;;;;; -230A;LEFT FLOOR;Ps;0;ON;;;;;Y;;;;; -230B;RIGHT FLOOR;Pe;0;ON;;;;;Y;;;;; -230C;BOTTOM RIGHT CROP;So;0;ON;;;;;N;;;;; -230D;BOTTOM LEFT CROP;So;0;ON;;;;;N;;;;; -230E;TOP RIGHT CROP;So;0;ON;;;;;N;;;;; -230F;TOP LEFT CROP;So;0;ON;;;;;N;;;;; -2310;REVERSED NOT SIGN;So;0;ON;;;;;N;;;;; -2311;SQUARE LOZENGE;So;0;ON;;;;;N;;;;; -2312;ARC;So;0;ON;;;;;N;;;;; -2313;SEGMENT;So;0;ON;;;;;N;;;;; -2314;SECTOR;So;0;ON;;;;;N;;;;; -2315;TELEPHONE RECORDER;So;0;ON;;;;;N;;;;; -2316;POSITION INDICATOR;So;0;ON;;;;;N;;;;; -2317;VIEWDATA SQUARE;So;0;ON;;;;;N;;;;; -2318;PLACE OF INTEREST SIGN;So;0;ON;;;;;N;COMMAND KEY;;;; -2319;TURNED NOT SIGN;So;0;ON;;;;;N;;;;; -231A;WATCH;So;0;ON;;;;;N;;;;; -231B;HOURGLASS;So;0;ON;;;;;N;;;;; -231C;TOP LEFT CORNER;So;0;ON;;;;;N;;;;; -231D;TOP RIGHT CORNER;So;0;ON;;;;;N;;;;; -231E;BOTTOM LEFT CORNER;So;0;ON;;;;;N;;;;; -231F;BOTTOM RIGHT CORNER;So;0;ON;;;;;N;;;;; -2320;TOP HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2321;BOTTOM HALF INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2322;FROWN;So;0;ON;;;;;N;;;;; -2323;SMILE;So;0;ON;;;;;N;;;;; -2324;UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS;So;0;ON;;;;;N;ENTER KEY;;;; -2325;OPTION KEY;So;0;ON;;;;;N;;;;; -2326;ERASE TO THE RIGHT;So;0;ON;;;;;N;DELETE TO THE RIGHT KEY;;;; -2327;X IN A RECTANGLE BOX;So;0;ON;;;;;N;CLEAR KEY;;;; -2328;KEYBOARD;So;0;ON;;;;;N;;;;; -2329;LEFT-POINTING ANGLE BRACKET;Ps;0;ON;3008;;;;Y;BRA;;;; -232A;RIGHT-POINTING ANGLE BRACKET;Pe;0;ON;3009;;;;Y;KET;;;; -232B;ERASE TO THE LEFT;So;0;ON;;;;;N;DELETE TO THE LEFT KEY;;;; -232C;BENZENE RING;So;0;ON;;;;;N;;;;; -232D;CYLINDRICITY;So;0;ON;;;;;N;;;;; -232E;ALL AROUND-PROFILE;So;0;ON;;;;;N;;;;; -232F;SYMMETRY;So;0;ON;;;;;N;;;;; -2330;TOTAL RUNOUT;So;0;ON;;;;;N;;;;; -2331;DIMENSION ORIGIN;So;0;ON;;;;;N;;;;; -2332;CONICAL TAPER;So;0;ON;;;;;N;;;;; -2333;SLOPE;So;0;ON;;;;;N;;;;; -2334;COUNTERBORE;So;0;ON;;;;;N;;;;; -2335;COUNTERSINK;So;0;ON;;;;;N;;;;; -2336;APL FUNCTIONAL SYMBOL I-BEAM;So;0;L;;;;;N;;;;; -2337;APL FUNCTIONAL SYMBOL SQUISH QUAD;So;0;L;;;;;N;;;;; -2338;APL FUNCTIONAL SYMBOL QUAD EQUAL;So;0;L;;;;;N;;;;; -2339;APL FUNCTIONAL SYMBOL QUAD DIVIDE;So;0;L;;;;;N;;;;; -233A;APL FUNCTIONAL SYMBOL QUAD DIAMOND;So;0;L;;;;;N;;;;; -233B;APL FUNCTIONAL SYMBOL QUAD JOT;So;0;L;;;;;N;;;;; -233C;APL FUNCTIONAL SYMBOL QUAD CIRCLE;So;0;L;;;;;N;;;;; -233D;APL FUNCTIONAL SYMBOL CIRCLE STILE;So;0;L;;;;;N;;;;; -233E;APL FUNCTIONAL SYMBOL CIRCLE JOT;So;0;L;;;;;N;;;;; -233F;APL FUNCTIONAL SYMBOL SLASH BAR;So;0;L;;;;;N;;;;; -2340;APL FUNCTIONAL SYMBOL BACKSLASH BAR;So;0;L;;;;;N;;;;; -2341;APL FUNCTIONAL SYMBOL QUAD SLASH;So;0;L;;;;;N;;;;; -2342;APL FUNCTIONAL SYMBOL QUAD BACKSLASH;So;0;L;;;;;N;;;;; -2343;APL FUNCTIONAL SYMBOL QUAD LESS-THAN;So;0;L;;;;;N;;;;; -2344;APL FUNCTIONAL SYMBOL QUAD GREATER-THAN;So;0;L;;;;;N;;;;; -2345;APL FUNCTIONAL SYMBOL LEFTWARDS VANE;So;0;L;;;;;N;;;;; -2346;APL FUNCTIONAL SYMBOL RIGHTWARDS VANE;So;0;L;;;;;N;;;;; -2347;APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW;So;0;L;;;;;N;;;;; -2348;APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW;So;0;L;;;;;N;;;;; -2349;APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH;So;0;L;;;;;N;;;;; -234A;APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR;So;0;L;;;;;N;;;;; -234B;APL FUNCTIONAL SYMBOL DELTA STILE;So;0;L;;;;;N;;;;; -234C;APL FUNCTIONAL SYMBOL QUAD DOWN CARET;So;0;L;;;;;N;;;;; -234D;APL FUNCTIONAL SYMBOL QUAD DELTA;So;0;L;;;;;N;;;;; -234E;APL FUNCTIONAL SYMBOL DOWN TACK JOT;So;0;L;;;;;N;;;;; -234F;APL FUNCTIONAL SYMBOL UPWARDS VANE;So;0;L;;;;;N;;;;; -2350;APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW;So;0;L;;;;;N;;;;; -2351;APL FUNCTIONAL SYMBOL UP TACK OVERBAR;So;0;L;;;;;N;;;;; -2352;APL FUNCTIONAL SYMBOL DEL STILE;So;0;L;;;;;N;;;;; -2353;APL FUNCTIONAL SYMBOL QUAD UP CARET;So;0;L;;;;;N;;;;; -2354;APL FUNCTIONAL SYMBOL QUAD DEL;So;0;L;;;;;N;;;;; -2355;APL FUNCTIONAL SYMBOL UP TACK JOT;So;0;L;;;;;N;;;;; -2356;APL FUNCTIONAL SYMBOL DOWNWARDS VANE;So;0;L;;;;;N;;;;; -2357;APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW;So;0;L;;;;;N;;;;; -2358;APL FUNCTIONAL SYMBOL QUOTE UNDERBAR;So;0;L;;;;;N;;;;; -2359;APL FUNCTIONAL SYMBOL DELTA UNDERBAR;So;0;L;;;;;N;;;;; -235A;APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR;So;0;L;;;;;N;;;;; -235B;APL FUNCTIONAL SYMBOL JOT UNDERBAR;So;0;L;;;;;N;;;;; -235C;APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR;So;0;L;;;;;N;;;;; -235D;APL FUNCTIONAL SYMBOL UP SHOE JOT;So;0;L;;;;;N;;;;; -235E;APL FUNCTIONAL SYMBOL QUOTE QUAD;So;0;L;;;;;N;;;;; -235F;APL FUNCTIONAL SYMBOL CIRCLE STAR;So;0;L;;;;;N;;;;; -2360;APL FUNCTIONAL SYMBOL QUAD COLON;So;0;L;;;;;N;;;;; -2361;APL FUNCTIONAL SYMBOL UP TACK DIAERESIS;So;0;L;;;;;N;;;;; -2362;APL FUNCTIONAL SYMBOL DEL DIAERESIS;So;0;L;;;;;N;;;;; -2363;APL FUNCTIONAL SYMBOL STAR DIAERESIS;So;0;L;;;;;N;;;;; -2364;APL FUNCTIONAL SYMBOL JOT DIAERESIS;So;0;L;;;;;N;;;;; -2365;APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS;So;0;L;;;;;N;;;;; -2366;APL FUNCTIONAL SYMBOL DOWN SHOE STILE;So;0;L;;;;;N;;;;; -2367;APL FUNCTIONAL SYMBOL LEFT SHOE STILE;So;0;L;;;;;N;;;;; -2368;APL FUNCTIONAL SYMBOL TILDE DIAERESIS;So;0;L;;;;;N;;;;; -2369;APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS;So;0;L;;;;;N;;;;; -236A;APL FUNCTIONAL SYMBOL COMMA BAR;So;0;L;;;;;N;;;;; -236B;APL FUNCTIONAL SYMBOL DEL TILDE;So;0;L;;;;;N;;;;; -236C;APL FUNCTIONAL SYMBOL ZILDE;So;0;L;;;;;N;;;;; -236D;APL FUNCTIONAL SYMBOL STILE TILDE;So;0;L;;;;;N;;;;; -236E;APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR;So;0;L;;;;;N;;;;; -236F;APL FUNCTIONAL SYMBOL QUAD NOT EQUAL;So;0;L;;;;;N;;;;; -2370;APL FUNCTIONAL SYMBOL QUAD QUESTION;So;0;L;;;;;N;;;;; -2371;APL FUNCTIONAL SYMBOL DOWN CARET TILDE;So;0;L;;;;;N;;;;; -2372;APL FUNCTIONAL SYMBOL UP CARET TILDE;So;0;L;;;;;N;;;;; -2373;APL FUNCTIONAL SYMBOL IOTA;So;0;L;;;;;N;;;;; -2374;APL FUNCTIONAL SYMBOL RHO;So;0;L;;;;;N;;;;; -2375;APL FUNCTIONAL SYMBOL OMEGA;So;0;L;;;;;N;;;;; -2376;APL FUNCTIONAL SYMBOL ALPHA UNDERBAR;So;0;L;;;;;N;;;;; -2377;APL FUNCTIONAL SYMBOL EPSILON UNDERBAR;So;0;L;;;;;N;;;;; -2378;APL FUNCTIONAL SYMBOL IOTA UNDERBAR;So;0;L;;;;;N;;;;; -2379;APL FUNCTIONAL SYMBOL OMEGA UNDERBAR;So;0;L;;;;;N;;;;; -237A;APL FUNCTIONAL SYMBOL ALPHA;So;0;L;;;;;N;;;;; -237B;NOT CHECK MARK;So;0;ON;;;;;N;;;;; -237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;0;ON;;;;;N;;;;; -237D;SHOULDERED OPEN BOX;So;0;ON;;;;;N;;;;; -237E;BELL SYMBOL;So;0;ON;;;;;N;;;;; -237F;VERTICAL LINE WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; -2380;INSERTION SYMBOL;So;0;ON;;;;;N;;;;; -2381;CONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; -2382;DISCONTINUOUS UNDERLINE SYMBOL;So;0;ON;;;;;N;;;;; -2383;EMPHASIS SYMBOL;So;0;ON;;;;;N;;;;; -2384;COMPOSITION SYMBOL;So;0;ON;;;;;N;;;;; -2385;WHITE SQUARE WITH CENTRE VERTICAL LINE;So;0;ON;;;;;N;;;;; -2386;ENTER SYMBOL;So;0;ON;;;;;N;;;;; -2387;ALTERNATIVE KEY SYMBOL;So;0;ON;;;;;N;;;;; -2388;HELM SYMBOL;So;0;ON;;;;;N;;;;; -2389;CIRCLED HORIZONTAL BAR WITH NOTCH;So;0;ON;;;;;N;;;;; -238A;CIRCLED TRIANGLE DOWN;So;0;ON;;;;;N;;;;; -238B;BROKEN CIRCLE WITH NORTHWEST ARROW;So;0;ON;;;;;N;;;;; -238C;UNDO SYMBOL;So;0;ON;;;;;N;;;;; -238D;MONOSTABLE SYMBOL;So;0;ON;;;;;N;;;;; -238E;HYSTERESIS SYMBOL;So;0;ON;;;;;N;;;;; -238F;OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL;So;0;ON;;;;;N;;;;; -2390;OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL;So;0;ON;;;;;N;;;;; -2391;PASSIVE-PULL-DOWN-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; -2392;PASSIVE-PULL-UP-OUTPUT SYMBOL;So;0;ON;;;;;N;;;;; -2393;DIRECT CURRENT SYMBOL FORM TWO;So;0;ON;;;;;N;;;;; -2394;SOFTWARE-FUNCTION SYMBOL;So;0;ON;;;;;N;;;;; -2395;APL FUNCTIONAL SYMBOL QUAD;So;0;L;;;;;N;;;;; -2396;DECIMAL SEPARATOR KEY SYMBOL;So;0;ON;;;;;N;;;;; -2397;PREVIOUS PAGE;So;0;ON;;;;;N;;;;; -2398;NEXT PAGE;So;0;ON;;;;;N;;;;; -2399;PRINT SCREEN SYMBOL;So;0;ON;;;;;N;;;;; -239A;CLEAR SCREEN SYMBOL;So;0;ON;;;;;N;;;;; -239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; -239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; -239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; -239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;; -239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;; -23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;; -23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; -23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; -23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; -23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;; -23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; -23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;; -23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; -23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; -23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; -23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;; -23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;; -23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;; -23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;; -23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;; -23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;; -23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; -23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;; -23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;; -23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;; -23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; -23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;; -23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;; -23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;; -23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; -23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;; -23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;; -23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;; -23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;; -23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;; -23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;; -23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;; -23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;; -23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; -23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;; -23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; -23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; -23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;; -23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;; -23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; -23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;; -23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;; -23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;; -23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;; -23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;; -23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;; -23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;; -23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;; -23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;; -23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;; -23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;; -23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;; -23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;; -23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;; -23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;; -23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;; -23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;; -23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;; -23DA;EARTH GROUND;So;0;ON;;;;;N;;;;; -23DB;FUSE;So;0;ON;;;;;N;;;;; -23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;;;; -23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;;;; -23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;;;; -23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;;;; -23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; -23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;;;; -23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;; -23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;; -23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;; -23E5;FLATNESS;So;0;ON;;;;;N;;;;; -23E6;AC CURRENT;So;0;ON;;;;;N;;;;; -23E7;ELECTRICAL INTERSECTION;So;0;ON;;;;;N;;;;; -23E8;DECIMAL EXPONENT SYMBOL;So;0;ON;;;;;N;;;;; -23E9;BLACK RIGHT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23EA;BLACK LEFT-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23EB;BLACK UP-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23EC;BLACK DOWN-POINTING DOUBLE TRIANGLE;So;0;ON;;;;;N;;;;; -23ED;BLACK RIGHT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -23EE;BLACK LEFT-POINTING DOUBLE TRIANGLE WITH VERTICAL BAR;So;0;ON;;;;;N;;;;; -23EF;BLACK RIGHT-POINTING TRIANGLE WITH DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; -23F0;ALARM CLOCK;So;0;ON;;;;;N;;;;; -23F1;STOPWATCH;So;0;ON;;;;;N;;;;; -23F2;TIMER CLOCK;So;0;ON;;;;;N;;;;; -23F3;HOURGLASS WITH FLOWING SAND;So;0;ON;;;;;N;;;;; -23F4;BLACK MEDIUM LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F5;BLACK MEDIUM RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F6;BLACK MEDIUM UP-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F7;BLACK MEDIUM DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -23F8;DOUBLE VERTICAL BAR;So;0;ON;;;;;N;;;;; -23F9;BLACK SQUARE FOR STOP;So;0;ON;;;;;N;;;;; -23FA;BLACK CIRCLE FOR RECORD;So;0;ON;;;;;N;;;;; -2400;SYMBOL FOR NULL;So;0;ON;;;;;N;GRAPHIC FOR NULL;;;; -2401;SYMBOL FOR START OF HEADING;So;0;ON;;;;;N;GRAPHIC FOR START OF HEADING;;;; -2402;SYMBOL FOR START OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR START OF TEXT;;;; -2403;SYMBOL FOR END OF TEXT;So;0;ON;;;;;N;GRAPHIC FOR END OF TEXT;;;; -2404;SYMBOL FOR END OF TRANSMISSION;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION;;;; -2405;SYMBOL FOR ENQUIRY;So;0;ON;;;;;N;GRAPHIC FOR ENQUIRY;;;; -2406;SYMBOL FOR ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR ACKNOWLEDGE;;;; -2407;SYMBOL FOR BELL;So;0;ON;;;;;N;GRAPHIC FOR BELL;;;; -2408;SYMBOL FOR BACKSPACE;So;0;ON;;;;;N;GRAPHIC FOR BACKSPACE;;;; -2409;SYMBOL FOR HORIZONTAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR HORIZONTAL TABULATION;;;; -240A;SYMBOL FOR LINE FEED;So;0;ON;;;;;N;GRAPHIC FOR LINE FEED;;;; -240B;SYMBOL FOR VERTICAL TABULATION;So;0;ON;;;;;N;GRAPHIC FOR VERTICAL TABULATION;;;; -240C;SYMBOL FOR FORM FEED;So;0;ON;;;;;N;GRAPHIC FOR FORM FEED;;;; -240D;SYMBOL FOR CARRIAGE RETURN;So;0;ON;;;;;N;GRAPHIC FOR CARRIAGE RETURN;;;; -240E;SYMBOL FOR SHIFT OUT;So;0;ON;;;;;N;GRAPHIC FOR SHIFT OUT;;;; -240F;SYMBOL FOR SHIFT IN;So;0;ON;;;;;N;GRAPHIC FOR SHIFT IN;;;; -2410;SYMBOL FOR DATA LINK ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR DATA LINK ESCAPE;;;; -2411;SYMBOL FOR DEVICE CONTROL ONE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL ONE;;;; -2412;SYMBOL FOR DEVICE CONTROL TWO;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL TWO;;;; -2413;SYMBOL FOR DEVICE CONTROL THREE;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL THREE;;;; -2414;SYMBOL FOR DEVICE CONTROL FOUR;So;0;ON;;;;;N;GRAPHIC FOR DEVICE CONTROL FOUR;;;; -2415;SYMBOL FOR NEGATIVE ACKNOWLEDGE;So;0;ON;;;;;N;GRAPHIC FOR NEGATIVE ACKNOWLEDGE;;;; -2416;SYMBOL FOR SYNCHRONOUS IDLE;So;0;ON;;;;;N;GRAPHIC FOR SYNCHRONOUS IDLE;;;; -2417;SYMBOL FOR END OF TRANSMISSION BLOCK;So;0;ON;;;;;N;GRAPHIC FOR END OF TRANSMISSION BLOCK;;;; -2418;SYMBOL FOR CANCEL;So;0;ON;;;;;N;GRAPHIC FOR CANCEL;;;; -2419;SYMBOL FOR END OF MEDIUM;So;0;ON;;;;;N;GRAPHIC FOR END OF MEDIUM;;;; -241A;SYMBOL FOR SUBSTITUTE;So;0;ON;;;;;N;GRAPHIC FOR SUBSTITUTE;;;; -241B;SYMBOL FOR ESCAPE;So;0;ON;;;;;N;GRAPHIC FOR ESCAPE;;;; -241C;SYMBOL FOR FILE SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR FILE SEPARATOR;;;; -241D;SYMBOL FOR GROUP SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR GROUP SEPARATOR;;;; -241E;SYMBOL FOR RECORD SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR RECORD SEPARATOR;;;; -241F;SYMBOL FOR UNIT SEPARATOR;So;0;ON;;;;;N;GRAPHIC FOR UNIT SEPARATOR;;;; -2420;SYMBOL FOR SPACE;So;0;ON;;;;;N;GRAPHIC FOR SPACE;;;; -2421;SYMBOL FOR DELETE;So;0;ON;;;;;N;GRAPHIC FOR DELETE;;;; -2422;BLANK SYMBOL;So;0;ON;;;;;N;BLANK;;;; -2423;OPEN BOX;So;0;ON;;;;;N;;;;; -2424;SYMBOL FOR NEWLINE;So;0;ON;;;;;N;GRAPHIC FOR NEWLINE;;;; -2425;SYMBOL FOR DELETE FORM TWO;So;0;ON;;;;;N;;;;; -2426;SYMBOL FOR SUBSTITUTE FORM TWO;So;0;ON;;;;;N;;;;; -2440;OCR HOOK;So;0;ON;;;;;N;;;;; -2441;OCR CHAIR;So;0;ON;;;;;N;;;;; -2442;OCR FORK;So;0;ON;;;;;N;;;;; -2443;OCR INVERTED FORK;So;0;ON;;;;;N;;;;; -2444;OCR BELT BUCKLE;So;0;ON;;;;;N;;;;; -2445;OCR BOW TIE;So;0;ON;;;;;N;;;;; -2446;OCR BRANCH BANK IDENTIFICATION;So;0;ON;;;;;N;;;;; -2447;OCR AMOUNT OF CHECK;So;0;ON;;;;;N;;;;; -2448;OCR DASH;So;0;ON;;;;;N;;;;; -2449;OCR CUSTOMER ACCOUNT NUMBER;So;0;ON;;;;;N;;;;; -244A;OCR DOUBLE BACKSLASH;So;0;ON;;;;;N;;;;; -2460;CIRCLED DIGIT ONE;No;0;ON; 0031;;1;1;N;;;;; -2461;CIRCLED DIGIT TWO;No;0;ON; 0032;;2;2;N;;;;; -2462;CIRCLED DIGIT THREE;No;0;ON; 0033;;3;3;N;;;;; -2463;CIRCLED DIGIT FOUR;No;0;ON; 0034;;4;4;N;;;;; -2464;CIRCLED DIGIT FIVE;No;0;ON; 0035;;5;5;N;;;;; -2465;CIRCLED DIGIT SIX;No;0;ON; 0036;;6;6;N;;;;; -2466;CIRCLED DIGIT SEVEN;No;0;ON; 0037;;7;7;N;;;;; -2467;CIRCLED DIGIT EIGHT;No;0;ON; 0038;;8;8;N;;;;; -2468;CIRCLED DIGIT NINE;No;0;ON; 0039;;9;9;N;;;;; -2469;CIRCLED NUMBER TEN;No;0;ON; 0031 0030;;;10;N;;;;; -246A;CIRCLED NUMBER ELEVEN;No;0;ON; 0031 0031;;;11;N;;;;; -246B;CIRCLED NUMBER TWELVE;No;0;ON; 0031 0032;;;12;N;;;;; -246C;CIRCLED NUMBER THIRTEEN;No;0;ON; 0031 0033;;;13;N;;;;; -246D;CIRCLED NUMBER FOURTEEN;No;0;ON; 0031 0034;;;14;N;;;;; -246E;CIRCLED NUMBER FIFTEEN;No;0;ON; 0031 0035;;;15;N;;;;; -246F;CIRCLED NUMBER SIXTEEN;No;0;ON; 0031 0036;;;16;N;;;;; -2470;CIRCLED NUMBER SEVENTEEN;No;0;ON; 0031 0037;;;17;N;;;;; -2471;CIRCLED NUMBER EIGHTEEN;No;0;ON; 0031 0038;;;18;N;;;;; -2472;CIRCLED NUMBER NINETEEN;No;0;ON; 0031 0039;;;19;N;;;;; -2473;CIRCLED NUMBER TWENTY;No;0;ON; 0032 0030;;;20;N;;;;; -2474;PARENTHESIZED DIGIT ONE;No;0;ON; 0028 0031 0029;;1;1;N;;;;; -2475;PARENTHESIZED DIGIT TWO;No;0;ON; 0028 0032 0029;;2;2;N;;;;; -2476;PARENTHESIZED DIGIT THREE;No;0;ON; 0028 0033 0029;;3;3;N;;;;; -2477;PARENTHESIZED DIGIT FOUR;No;0;ON; 0028 0034 0029;;4;4;N;;;;; -2478;PARENTHESIZED DIGIT FIVE;No;0;ON; 0028 0035 0029;;5;5;N;;;;; -2479;PARENTHESIZED DIGIT SIX;No;0;ON; 0028 0036 0029;;6;6;N;;;;; -247A;PARENTHESIZED DIGIT SEVEN;No;0;ON; 0028 0037 0029;;7;7;N;;;;; -247B;PARENTHESIZED DIGIT EIGHT;No;0;ON; 0028 0038 0029;;8;8;N;;;;; -247C;PARENTHESIZED DIGIT NINE;No;0;ON; 0028 0039 0029;;9;9;N;;;;; -247D;PARENTHESIZED NUMBER TEN;No;0;ON; 0028 0031 0030 0029;;;10;N;;;;; -247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON; 0028 0031 0031 0029;;;11;N;;;;; -247F;PARENTHESIZED NUMBER TWELVE;No;0;ON; 0028 0031 0032 0029;;;12;N;;;;; -2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON; 0028 0031 0033 0029;;;13;N;;;;; -2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON; 0028 0031 0034 0029;;;14;N;;;;; -2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON; 0028 0031 0035 0029;;;15;N;;;;; -2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON; 0028 0031 0036 0029;;;16;N;;;;; -2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON; 0028 0031 0037 0029;;;17;N;;;;; -2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON; 0028 0031 0038 0029;;;18;N;;;;; -2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON; 0028 0031 0039 0029;;;19;N;;;;; -2487;PARENTHESIZED NUMBER TWENTY;No;0;ON; 0028 0032 0030 0029;;;20;N;;;;; -2488;DIGIT ONE FULL STOP;No;0;EN; 0031 002E;;1;1;N;DIGIT ONE PERIOD;;;; -2489;DIGIT TWO FULL STOP;No;0;EN; 0032 002E;;2;2;N;DIGIT TWO PERIOD;;;; -248A;DIGIT THREE FULL STOP;No;0;EN; 0033 002E;;3;3;N;DIGIT THREE PERIOD;;;; -248B;DIGIT FOUR FULL STOP;No;0;EN; 0034 002E;;4;4;N;DIGIT FOUR PERIOD;;;; -248C;DIGIT FIVE FULL STOP;No;0;EN; 0035 002E;;5;5;N;DIGIT FIVE PERIOD;;;; -248D;DIGIT SIX FULL STOP;No;0;EN; 0036 002E;;6;6;N;DIGIT SIX PERIOD;;;; -248E;DIGIT SEVEN FULL STOP;No;0;EN; 0037 002E;;7;7;N;DIGIT SEVEN PERIOD;;;; -248F;DIGIT EIGHT FULL STOP;No;0;EN; 0038 002E;;8;8;N;DIGIT EIGHT PERIOD;;;; -2490;DIGIT NINE FULL STOP;No;0;EN; 0039 002E;;9;9;N;DIGIT NINE PERIOD;;;; -2491;NUMBER TEN FULL STOP;No;0;EN; 0031 0030 002E;;;10;N;NUMBER TEN PERIOD;;;; -2492;NUMBER ELEVEN FULL STOP;No;0;EN; 0031 0031 002E;;;11;N;NUMBER ELEVEN PERIOD;;;; -2493;NUMBER TWELVE FULL STOP;No;0;EN; 0031 0032 002E;;;12;N;NUMBER TWELVE PERIOD;;;; -2494;NUMBER THIRTEEN FULL STOP;No;0;EN; 0031 0033 002E;;;13;N;NUMBER THIRTEEN PERIOD;;;; -2495;NUMBER FOURTEEN FULL STOP;No;0;EN; 0031 0034 002E;;;14;N;NUMBER FOURTEEN PERIOD;;;; -2496;NUMBER FIFTEEN FULL STOP;No;0;EN; 0031 0035 002E;;;15;N;NUMBER FIFTEEN PERIOD;;;; -2497;NUMBER SIXTEEN FULL STOP;No;0;EN; 0031 0036 002E;;;16;N;NUMBER SIXTEEN PERIOD;;;; -2498;NUMBER SEVENTEEN FULL STOP;No;0;EN; 0031 0037 002E;;;17;N;NUMBER SEVENTEEN PERIOD;;;; -2499;NUMBER EIGHTEEN FULL STOP;No;0;EN; 0031 0038 002E;;;18;N;NUMBER EIGHTEEN PERIOD;;;; -249A;NUMBER NINETEEN FULL STOP;No;0;EN; 0031 0039 002E;;;19;N;NUMBER NINETEEN PERIOD;;;; -249B;NUMBER TWENTY FULL STOP;No;0;EN; 0032 0030 002E;;;20;N;NUMBER TWENTY PERIOD;;;; -249C;PARENTHESIZED LATIN SMALL LETTER A;So;0;L; 0028 0061 0029;;;;N;;;;; -249D;PARENTHESIZED LATIN SMALL LETTER B;So;0;L; 0028 0062 0029;;;;N;;;;; -249E;PARENTHESIZED LATIN SMALL LETTER C;So;0;L; 0028 0063 0029;;;;N;;;;; -249F;PARENTHESIZED LATIN SMALL LETTER D;So;0;L; 0028 0064 0029;;;;N;;;;; -24A0;PARENTHESIZED LATIN SMALL LETTER E;So;0;L; 0028 0065 0029;;;;N;;;;; -24A1;PARENTHESIZED LATIN SMALL LETTER F;So;0;L; 0028 0066 0029;;;;N;;;;; -24A2;PARENTHESIZED LATIN SMALL LETTER G;So;0;L; 0028 0067 0029;;;;N;;;;; -24A3;PARENTHESIZED LATIN SMALL LETTER H;So;0;L; 0028 0068 0029;;;;N;;;;; -24A4;PARENTHESIZED LATIN SMALL LETTER I;So;0;L; 0028 0069 0029;;;;N;;;;; -24A5;PARENTHESIZED LATIN SMALL LETTER J;So;0;L; 0028 006A 0029;;;;N;;;;; -24A6;PARENTHESIZED LATIN SMALL LETTER K;So;0;L; 0028 006B 0029;;;;N;;;;; -24A7;PARENTHESIZED LATIN SMALL LETTER L;So;0;L; 0028 006C 0029;;;;N;;;;; -24A8;PARENTHESIZED LATIN SMALL LETTER M;So;0;L; 0028 006D 0029;;;;N;;;;; -24A9;PARENTHESIZED LATIN SMALL LETTER N;So;0;L; 0028 006E 0029;;;;N;;;;; -24AA;PARENTHESIZED LATIN SMALL LETTER O;So;0;L; 0028 006F 0029;;;;N;;;;; -24AB;PARENTHESIZED LATIN SMALL LETTER P;So;0;L; 0028 0070 0029;;;;N;;;;; -24AC;PARENTHESIZED LATIN SMALL LETTER Q;So;0;L; 0028 0071 0029;;;;N;;;;; -24AD;PARENTHESIZED LATIN SMALL LETTER R;So;0;L; 0028 0072 0029;;;;N;;;;; -24AE;PARENTHESIZED LATIN SMALL LETTER S;So;0;L; 0028 0073 0029;;;;N;;;;; -24AF;PARENTHESIZED LATIN SMALL LETTER T;So;0;L; 0028 0074 0029;;;;N;;;;; -24B0;PARENTHESIZED LATIN SMALL LETTER U;So;0;L; 0028 0075 0029;;;;N;;;;; -24B1;PARENTHESIZED LATIN SMALL LETTER V;So;0;L; 0028 0076 0029;;;;N;;;;; -24B2;PARENTHESIZED LATIN SMALL LETTER W;So;0;L; 0028 0077 0029;;;;N;;;;; -24B3;PARENTHESIZED LATIN SMALL LETTER X;So;0;L; 0028 0078 0029;;;;N;;;;; -24B4;PARENTHESIZED LATIN SMALL LETTER Y;So;0;L; 0028 0079 0029;;;;N;;;;; -24B5;PARENTHESIZED LATIN SMALL LETTER Z;So;0;L; 0028 007A 0029;;;;N;;;;; -24B6;CIRCLED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;24D0; -24B7;CIRCLED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;24D1; -24B8;CIRCLED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;24D2; -24B9;CIRCLED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;24D3; -24BA;CIRCLED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;24D4; -24BB;CIRCLED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;24D5; -24BC;CIRCLED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;24D6; -24BD;CIRCLED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;24D7; -24BE;CIRCLED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;24D8; -24BF;CIRCLED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;24D9; -24C0;CIRCLED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;24DA; -24C1;CIRCLED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;24DB; -24C2;CIRCLED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;24DC; -24C3;CIRCLED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;24DD; -24C4;CIRCLED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;24DE; -24C5;CIRCLED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;24DF; -24C6;CIRCLED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;24E0; -24C7;CIRCLED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;24E1; -24C8;CIRCLED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;24E2; -24C9;CIRCLED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;24E3; -24CA;CIRCLED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;24E4; -24CB;CIRCLED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;24E5; -24CC;CIRCLED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;24E6; -24CD;CIRCLED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;24E7; -24CE;CIRCLED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;24E8; -24CF;CIRCLED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;24E9; -24D0;CIRCLED LATIN SMALL LETTER A;So;0;L; 0061;;;;N;;;24B6;;24B6 -24D1;CIRCLED LATIN SMALL LETTER B;So;0;L; 0062;;;;N;;;24B7;;24B7 -24D2;CIRCLED LATIN SMALL LETTER C;So;0;L; 0063;;;;N;;;24B8;;24B8 -24D3;CIRCLED LATIN SMALL LETTER D;So;0;L; 0064;;;;N;;;24B9;;24B9 -24D4;CIRCLED LATIN SMALL LETTER E;So;0;L; 0065;;;;N;;;24BA;;24BA -24D5;CIRCLED LATIN SMALL LETTER F;So;0;L; 0066;;;;N;;;24BB;;24BB -24D6;CIRCLED LATIN SMALL LETTER G;So;0;L; 0067;;;;N;;;24BC;;24BC -24D7;CIRCLED LATIN SMALL LETTER H;So;0;L; 0068;;;;N;;;24BD;;24BD -24D8;CIRCLED LATIN SMALL LETTER I;So;0;L; 0069;;;;N;;;24BE;;24BE -24D9;CIRCLED LATIN SMALL LETTER J;So;0;L; 006A;;;;N;;;24BF;;24BF -24DA;CIRCLED LATIN SMALL LETTER K;So;0;L; 006B;;;;N;;;24C0;;24C0 -24DB;CIRCLED LATIN SMALL LETTER L;So;0;L; 006C;;;;N;;;24C1;;24C1 -24DC;CIRCLED LATIN SMALL LETTER M;So;0;L; 006D;;;;N;;;24C2;;24C2 -24DD;CIRCLED LATIN SMALL LETTER N;So;0;L; 006E;;;;N;;;24C3;;24C3 -24DE;CIRCLED LATIN SMALL LETTER O;So;0;L; 006F;;;;N;;;24C4;;24C4 -24DF;CIRCLED LATIN SMALL LETTER P;So;0;L; 0070;;;;N;;;24C5;;24C5 -24E0;CIRCLED LATIN SMALL LETTER Q;So;0;L; 0071;;;;N;;;24C6;;24C6 -24E1;CIRCLED LATIN SMALL LETTER R;So;0;L; 0072;;;;N;;;24C7;;24C7 -24E2;CIRCLED LATIN SMALL LETTER S;So;0;L; 0073;;;;N;;;24C8;;24C8 -24E3;CIRCLED LATIN SMALL LETTER T;So;0;L; 0074;;;;N;;;24C9;;24C9 -24E4;CIRCLED LATIN SMALL LETTER U;So;0;L; 0075;;;;N;;;24CA;;24CA -24E5;CIRCLED LATIN SMALL LETTER V;So;0;L; 0076;;;;N;;;24CB;;24CB -24E6;CIRCLED LATIN SMALL LETTER W;So;0;L; 0077;;;;N;;;24CC;;24CC -24E7;CIRCLED LATIN SMALL LETTER X;So;0;L; 0078;;;;N;;;24CD;;24CD -24E8;CIRCLED LATIN SMALL LETTER Y;So;0;L; 0079;;;;N;;;24CE;;24CE -24E9;CIRCLED LATIN SMALL LETTER Z;So;0;L; 007A;;;;N;;;24CF;;24CF -24EA;CIRCLED DIGIT ZERO;No;0;ON; 0030;;0;0;N;;;;; -24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;; -24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;; -24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;; -24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;; -24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;; -24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;; -24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;; -24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;; -24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;; -24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;; -24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;; -24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;; -24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;; -24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;; -24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;; -24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;; -24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;; -24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;; -24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;; -24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;; -24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;0;0;N;;;;; -2500;BOX DRAWINGS LIGHT HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT HORIZONTAL;;;; -2501;BOX DRAWINGS HEAVY HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY HORIZONTAL;;;; -2502;BOX DRAWINGS LIGHT VERTICAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL;;;; -2503;BOX DRAWINGS HEAVY VERTICAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL;;;; -2504;BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH HORIZONTAL;;;; -2505;BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH HORIZONTAL;;;; -2506;BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT TRIPLE DASH VERTICAL;;;; -2507;BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY TRIPLE DASH VERTICAL;;;; -2508;BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH HORIZONTAL;;;; -2509;BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH HORIZONTAL;;;; -250A;BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT QUADRUPLE DASH VERTICAL;;;; -250B;BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY QUADRUPLE DASH VERTICAL;;;; -250C;BOX DRAWINGS LIGHT DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND RIGHT;;;; -250D;BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT HEAVY;;;; -250E;BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT LIGHT;;;; -250F;BOX DRAWINGS HEAVY DOWN AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND RIGHT;;;; -2510;BOX DRAWINGS LIGHT DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT DOWN AND LEFT;;;; -2511;BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT HEAVY;;;; -2512;BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT LIGHT;;;; -2513;BOX DRAWINGS HEAVY DOWN AND LEFT;So;0;ON;;;;;N;FORMS HEAVY DOWN AND LEFT;;;; -2514;BOX DRAWINGS LIGHT UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT UP AND RIGHT;;;; -2515;BOX DRAWINGS UP LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT HEAVY;;;; -2516;BOX DRAWINGS UP HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT LIGHT;;;; -2517;BOX DRAWINGS HEAVY UP AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY UP AND RIGHT;;;; -2518;BOX DRAWINGS LIGHT UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT UP AND LEFT;;;; -2519;BOX DRAWINGS UP LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT HEAVY;;;; -251A;BOX DRAWINGS UP HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT LIGHT;;;; -251B;BOX DRAWINGS HEAVY UP AND LEFT;So;0;ON;;;;;N;FORMS HEAVY UP AND LEFT;;;; -251C;BOX DRAWINGS LIGHT VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND RIGHT;;;; -251D;BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND RIGHT HEAVY;;;; -251E;BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND RIGHT DOWN LIGHT;;;; -251F;BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND RIGHT UP LIGHT;;;; -2520;BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND RIGHT LIGHT;;;; -2521;BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND RIGHT UP HEAVY;;;; -2522;BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND RIGHT DOWN HEAVY;;;; -2523;BOX DRAWINGS HEAVY VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND RIGHT;;;; -2524;BOX DRAWINGS LIGHT VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND LEFT;;;; -2525;BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND LEFT HEAVY;;;; -2526;BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND LEFT DOWN LIGHT;;;; -2527;BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND LEFT UP LIGHT;;;; -2528;BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND LEFT LIGHT;;;; -2529;BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND LEFT UP HEAVY;;;; -252A;BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND LEFT DOWN HEAVY;;;; -252B;BOX DRAWINGS HEAVY VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND LEFT;;;; -252C;BOX DRAWINGS LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOWN AND HORIZONTAL;;;; -252D;BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT DOWN LIGHT;;;; -252E;BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT DOWN LIGHT;;;; -252F;BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND HORIZONTAL HEAVY;;;; -2530;BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND HORIZONTAL LIGHT;;;; -2531;BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT DOWN HEAVY;;;; -2532;BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT DOWN HEAVY;;;; -2533;BOX DRAWINGS HEAVY DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOWN AND HORIZONTAL;;;; -2534;BOX DRAWINGS LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT UP AND HORIZONTAL;;;; -2535;BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT UP LIGHT;;;; -2536;BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT UP LIGHT;;;; -2537;BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND HORIZONTAL HEAVY;;;; -2538;BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND HORIZONTAL LIGHT;;;; -2539;BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT UP HEAVY;;;; -253A;BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT UP HEAVY;;;; -253B;BOX DRAWINGS HEAVY UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY UP AND HORIZONTAL;;;; -253C;BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT VERTICAL AND HORIZONTAL;;;; -253D;BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS LEFT HEAVY AND RIGHT VERTICAL LIGHT;;;; -253E;BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT;So;0;ON;;;;;N;FORMS RIGHT HEAVY AND LEFT VERTICAL LIGHT;;;; -253F;BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS VERTICAL LIGHT AND HORIZONTAL HEAVY;;;; -2540;BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS UP HEAVY AND DOWN HORIZONTAL LIGHT;;;; -2541;BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS DOWN HEAVY AND UP HORIZONTAL LIGHT;;;; -2542;BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT;So;0;ON;;;;;N;FORMS VERTICAL HEAVY AND HORIZONTAL LIGHT;;;; -2543;BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT;So;0;ON;;;;;N;FORMS LEFT UP HEAVY AND RIGHT DOWN LIGHT;;;; -2544;BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT;So;0;ON;;;;;N;FORMS RIGHT UP HEAVY AND LEFT DOWN LIGHT;;;; -2545;BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT;So;0;ON;;;;;N;FORMS LEFT DOWN HEAVY AND RIGHT UP LIGHT;;;; -2546;BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT;So;0;ON;;;;;N;FORMS RIGHT DOWN HEAVY AND LEFT UP LIGHT;;;; -2547;BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS DOWN LIGHT AND UP HORIZONTAL HEAVY;;;; -2548;BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY;So;0;ON;;;;;N;FORMS UP LIGHT AND DOWN HORIZONTAL HEAVY;;;; -2549;BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS RIGHT LIGHT AND LEFT VERTICAL HEAVY;;;; -254A;BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY;So;0;ON;;;;;N;FORMS LEFT LIGHT AND RIGHT VERTICAL HEAVY;;;; -254B;BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY VERTICAL AND HORIZONTAL;;;; -254C;BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH HORIZONTAL;;;; -254D;BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH HORIZONTAL;;;; -254E;BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS LIGHT DOUBLE DASH VERTICAL;;;; -254F;BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL;So;0;ON;;;;;N;FORMS HEAVY DOUBLE DASH VERTICAL;;;; -2550;BOX DRAWINGS DOUBLE HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE HORIZONTAL;;;; -2551;BOX DRAWINGS DOUBLE VERTICAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL;;;; -2552;BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND RIGHT DOUBLE;;;; -2553;BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND RIGHT SINGLE;;;; -2554;BOX DRAWINGS DOUBLE DOWN AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND RIGHT;;;; -2555;BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND LEFT DOUBLE;;;; -2556;BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND LEFT SINGLE;;;; -2557;BOX DRAWINGS DOUBLE DOWN AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND LEFT;;;; -2558;BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND RIGHT DOUBLE;;;; -2559;BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND RIGHT SINGLE;;;; -255A;BOX DRAWINGS DOUBLE UP AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE UP AND RIGHT;;;; -255B;BOX DRAWINGS UP SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND LEFT DOUBLE;;;; -255C;BOX DRAWINGS UP DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND LEFT SINGLE;;;; -255D;BOX DRAWINGS DOUBLE UP AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE UP AND LEFT;;;; -255E;BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND RIGHT DOUBLE;;;; -255F;BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND RIGHT SINGLE;;;; -2560;BOX DRAWINGS DOUBLE VERTICAL AND RIGHT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND RIGHT;;;; -2561;BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND LEFT DOUBLE;;;; -2562;BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND LEFT SINGLE;;;; -2563;BOX DRAWINGS DOUBLE VERTICAL AND LEFT;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND LEFT;;;; -2564;BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS DOWN SINGLE AND HORIZONTAL DOUBLE;;;; -2565;BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS DOWN DOUBLE AND HORIZONTAL SINGLE;;;; -2566;BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE DOWN AND HORIZONTAL;;;; -2567;BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS UP SINGLE AND HORIZONTAL DOUBLE;;;; -2568;BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS UP DOUBLE AND HORIZONTAL SINGLE;;;; -2569;BOX DRAWINGS DOUBLE UP AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE UP AND HORIZONTAL;;;; -256A;BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE;So;0;ON;;;;;N;FORMS VERTICAL SINGLE AND HORIZONTAL DOUBLE;;;; -256B;BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE;So;0;ON;;;;;N;FORMS VERTICAL DOUBLE AND HORIZONTAL SINGLE;;;; -256C;BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL;So;0;ON;;;;;N;FORMS DOUBLE VERTICAL AND HORIZONTAL;;;; -256D;BOX DRAWINGS LIGHT ARC DOWN AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND RIGHT;;;; -256E;BOX DRAWINGS LIGHT ARC DOWN AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC DOWN AND LEFT;;;; -256F;BOX DRAWINGS LIGHT ARC UP AND LEFT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND LEFT;;;; -2570;BOX DRAWINGS LIGHT ARC UP AND RIGHT;So;0;ON;;;;;N;FORMS LIGHT ARC UP AND RIGHT;;;; -2571;BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT;;;; -2572;BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT;;;; -2573;BOX DRAWINGS LIGHT DIAGONAL CROSS;So;0;ON;;;;;N;FORMS LIGHT DIAGONAL CROSS;;;; -2574;BOX DRAWINGS LIGHT LEFT;So;0;ON;;;;;N;FORMS LIGHT LEFT;;;; -2575;BOX DRAWINGS LIGHT UP;So;0;ON;;;;;N;FORMS LIGHT UP;;;; -2576;BOX DRAWINGS LIGHT RIGHT;So;0;ON;;;;;N;FORMS LIGHT RIGHT;;;; -2577;BOX DRAWINGS LIGHT DOWN;So;0;ON;;;;;N;FORMS LIGHT DOWN;;;; -2578;BOX DRAWINGS HEAVY LEFT;So;0;ON;;;;;N;FORMS HEAVY LEFT;;;; -2579;BOX DRAWINGS HEAVY UP;So;0;ON;;;;;N;FORMS HEAVY UP;;;; -257A;BOX DRAWINGS HEAVY RIGHT;So;0;ON;;;;;N;FORMS HEAVY RIGHT;;;; -257B;BOX DRAWINGS HEAVY DOWN;So;0;ON;;;;;N;FORMS HEAVY DOWN;;;; -257C;BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT;So;0;ON;;;;;N;FORMS LIGHT LEFT AND HEAVY RIGHT;;;; -257D;BOX DRAWINGS LIGHT UP AND HEAVY DOWN;So;0;ON;;;;;N;FORMS LIGHT UP AND HEAVY DOWN;;;; -257E;BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT;So;0;ON;;;;;N;FORMS HEAVY LEFT AND LIGHT RIGHT;;;; -257F;BOX DRAWINGS HEAVY UP AND LIGHT DOWN;So;0;ON;;;;;N;FORMS HEAVY UP AND LIGHT DOWN;;;; -2580;UPPER HALF BLOCK;So;0;ON;;;;;N;;;;; -2581;LOWER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2582;LOWER ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; -2583;LOWER THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2584;LOWER HALF BLOCK;So;0;ON;;;;;N;;;;; -2585;LOWER FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2586;LOWER THREE QUARTERS BLOCK;So;0;ON;;;;;N;LOWER THREE QUARTER BLOCK;;;; -2587;LOWER SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -2588;FULL BLOCK;So;0;ON;;;;;N;;;;; -2589;LEFT SEVEN EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258A;LEFT THREE QUARTERS BLOCK;So;0;ON;;;;;N;LEFT THREE QUARTER BLOCK;;;; -258B;LEFT FIVE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258C;LEFT HALF BLOCK;So;0;ON;;;;;N;;;;; -258D;LEFT THREE EIGHTHS BLOCK;So;0;ON;;;;;N;;;;; -258E;LEFT ONE QUARTER BLOCK;So;0;ON;;;;;N;;;;; -258F;LEFT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2590;RIGHT HALF BLOCK;So;0;ON;;;;;N;;;;; -2591;LIGHT SHADE;So;0;ON;;;;;N;;;;; -2592;MEDIUM SHADE;So;0;ON;;;;;N;;;;; -2593;DARK SHADE;So;0;ON;;;;;N;;;;; -2594;UPPER ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2595;RIGHT ONE EIGHTH BLOCK;So;0;ON;;;;;N;;;;; -2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;; -2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;; -2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;; -2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; -259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;; -259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;; -259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;; -25A0;BLACK SQUARE;So;0;ON;;;;;N;;;;; -25A1;WHITE SQUARE;So;0;ON;;;;;N;;;;; -25A2;WHITE SQUARE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; -25A3;WHITE SQUARE CONTAINING BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; -25A4;SQUARE WITH HORIZONTAL FILL;So;0;ON;;;;;N;;;;; -25A5;SQUARE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; -25A6;SQUARE WITH ORTHOGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; -25A7;SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL;So;0;ON;;;;;N;;;;; -25A8;SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL;So;0;ON;;;;;N;;;;; -25A9;SQUARE WITH DIAGONAL CROSSHATCH FILL;So;0;ON;;;;;N;;;;; -25AA;BLACK SMALL SQUARE;So;0;ON;;;;;N;;;;; -25AB;WHITE SMALL SQUARE;So;0;ON;;;;;N;;;;; -25AC;BLACK RECTANGLE;So;0;ON;;;;;N;;;;; -25AD;WHITE RECTANGLE;So;0;ON;;;;;N;;;;; -25AE;BLACK VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; -25AF;WHITE VERTICAL RECTANGLE;So;0;ON;;;;;N;;;;; -25B0;BLACK PARALLELOGRAM;So;0;ON;;;;;N;;;;; -25B1;WHITE PARALLELOGRAM;So;0;ON;;;;;N;;;;; -25B2;BLACK UP-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING TRIANGLE;;;; -25B3;WHITE UP-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE;;;; -25B4;BLACK UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK UP POINTING SMALL TRIANGLE;;;; -25B5;WHITE UP-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE UP POINTING SMALL TRIANGLE;;;; -25B6;BLACK RIGHT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING TRIANGLE;;;; -25B7;WHITE RIGHT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE RIGHT POINTING TRIANGLE;;;; -25B8;BLACK RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK RIGHT POINTING SMALL TRIANGLE;;;; -25B9;WHITE RIGHT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE RIGHT POINTING SMALL TRIANGLE;;;; -25BA;BLACK RIGHT-POINTING POINTER;So;0;ON;;;;;N;BLACK RIGHT POINTING POINTER;;;; -25BB;WHITE RIGHT-POINTING POINTER;So;0;ON;;;;;N;WHITE RIGHT POINTING POINTER;;;; -25BC;BLACK DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING TRIANGLE;;;; -25BD;WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING TRIANGLE;;;; -25BE;BLACK DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK DOWN POINTING SMALL TRIANGLE;;;; -25BF;WHITE DOWN-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE DOWN POINTING SMALL TRIANGLE;;;; -25C0;BLACK LEFT-POINTING TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING TRIANGLE;;;; -25C1;WHITE LEFT-POINTING TRIANGLE;Sm;0;ON;;;;;N;WHITE LEFT POINTING TRIANGLE;;;; -25C2;BLACK LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;BLACK LEFT POINTING SMALL TRIANGLE;;;; -25C3;WHITE LEFT-POINTING SMALL TRIANGLE;So;0;ON;;;;;N;WHITE LEFT POINTING SMALL TRIANGLE;;;; -25C4;BLACK LEFT-POINTING POINTER;So;0;ON;;;;;N;BLACK LEFT POINTING POINTER;;;; -25C5;WHITE LEFT-POINTING POINTER;So;0;ON;;;;;N;WHITE LEFT POINTING POINTER;;;; -25C6;BLACK DIAMOND;So;0;ON;;;;;N;;;;; -25C7;WHITE DIAMOND;So;0;ON;;;;;N;;;;; -25C8;WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; -25C9;FISHEYE;So;0;ON;;;;;N;;;;; -25CA;LOZENGE;So;0;ON;;;;;N;;;;; -25CB;WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25CC;DOTTED CIRCLE;So;0;ON;;;;;N;;;;; -25CD;CIRCLE WITH VERTICAL FILL;So;0;ON;;;;;N;;;;; -25CE;BULLSEYE;So;0;ON;;;;;N;;;;; -25CF;BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D0;CIRCLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -25D1;CIRCLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -25D2;CIRCLE WITH LOWER HALF BLACK;So;0;ON;;;;;N;;;;; -25D3;CIRCLE WITH UPPER HALF BLACK;So;0;ON;;;;;N;;;;; -25D4;CIRCLE WITH UPPER RIGHT QUADRANT BLACK;So;0;ON;;;;;N;;;;; -25D5;CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK;So;0;ON;;;;;N;;;;; -25D6;LEFT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D7;RIGHT HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -25D8;INVERSE BULLET;So;0;ON;;;;;N;;;;; -25D9;INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DA;UPPER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DB;LOWER HALF INVERSE WHITE CIRCLE;So;0;ON;;;;;N;;;;; -25DC;UPPER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DD;UPPER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DE;LOWER RIGHT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25DF;LOWER LEFT QUADRANT CIRCULAR ARC;So;0;ON;;;;;N;;;;; -25E0;UPPER HALF CIRCLE;So;0;ON;;;;;N;;;;; -25E1;LOWER HALF CIRCLE;So;0;ON;;;;;N;;;;; -25E2;BLACK LOWER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -25E3;BLACK LOWER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; -25E4;BLACK UPPER LEFT TRIANGLE;So;0;ON;;;;;N;;;;; -25E5;BLACK UPPER RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -25E6;WHITE BULLET;So;0;ON;;;;;N;;;;; -25E7;SQUARE WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -25E8;SQUARE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -25E9;SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -25EA;SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -25EB;WHITE SQUARE WITH VERTICAL BISECTING LINE;So;0;ON;;;;;N;;;;; -25EC;WHITE UP-POINTING TRIANGLE WITH DOT;So;0;ON;;;;;N;WHITE UP POINTING TRIANGLE WITH DOT;;;; -25ED;UP-POINTING TRIANGLE WITH LEFT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH LEFT HALF BLACK;;;; -25EE;UP-POINTING TRIANGLE WITH RIGHT HALF BLACK;So;0;ON;;;;;N;UP POINTING TRIANGLE WITH RIGHT HALF BLACK;;;; -25EF;LARGE CIRCLE;So;0;ON;;;;;N;;;;; -25F0;WHITE SQUARE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F1;WHITE SQUARE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F2;WHITE SQUARE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F3;WHITE SQUARE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F4;WHITE CIRCLE WITH UPPER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F5;WHITE CIRCLE WITH LOWER LEFT QUADRANT;So;0;ON;;;;;N;;;;; -25F6;WHITE CIRCLE WITH LOWER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F7;WHITE CIRCLE WITH UPPER RIGHT QUADRANT;So;0;ON;;;;;N;;;;; -25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; -25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; -25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;; -25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; -25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;; -25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; -25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;; -25FF;LOWER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;; -2600;BLACK SUN WITH RAYS;So;0;ON;;;;;N;;;;; -2601;CLOUD;So;0;ON;;;;;N;;;;; -2602;UMBRELLA;So;0;ON;;;;;N;;;;; -2603;SNOWMAN;So;0;ON;;;;;N;;;;; -2604;COMET;So;0;ON;;;;;N;;;;; -2605;BLACK STAR;So;0;ON;;;;;N;;;;; -2606;WHITE STAR;So;0;ON;;;;;N;;;;; -2607;LIGHTNING;So;0;ON;;;;;N;;;;; -2608;THUNDERSTORM;So;0;ON;;;;;N;;;;; -2609;SUN;So;0;ON;;;;;N;;;;; -260A;ASCENDING NODE;So;0;ON;;;;;N;;;;; -260B;DESCENDING NODE;So;0;ON;;;;;N;;;;; -260C;CONJUNCTION;So;0;ON;;;;;N;;;;; -260D;OPPOSITION;So;0;ON;;;;;N;;;;; -260E;BLACK TELEPHONE;So;0;ON;;;;;N;;;;; -260F;WHITE TELEPHONE;So;0;ON;;;;;N;;;;; -2610;BALLOT BOX;So;0;ON;;;;;N;;;;; -2611;BALLOT BOX WITH CHECK;So;0;ON;;;;;N;;;;; -2612;BALLOT BOX WITH X;So;0;ON;;;;;N;;;;; -2613;SALTIRE;So;0;ON;;;;;N;;;;; -2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;; -2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;; -2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; -2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; -2618;SHAMROCK;So;0;ON;;;;;N;;;;; -2619;REVERSED ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; -261A;BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -261B;BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -261C;WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -261D;WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; -261E;WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -261F;WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -2620;SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; -2621;CAUTION SIGN;So;0;ON;;;;;N;;;;; -2622;RADIOACTIVE SIGN;So;0;ON;;;;;N;;;;; -2623;BIOHAZARD SIGN;So;0;ON;;;;;N;;;;; -2624;CADUCEUS;So;0;ON;;;;;N;;;;; -2625;ANKH;So;0;ON;;;;;N;;;;; -2626;ORTHODOX CROSS;So;0;ON;;;;;N;;;;; -2627;CHI RHO;So;0;ON;;;;;N;;;;; -2628;CROSS OF LORRAINE;So;0;ON;;;;;N;;;;; -2629;CROSS OF JERUSALEM;So;0;ON;;;;;N;;;;; -262A;STAR AND CRESCENT;So;0;ON;;;;;N;;;;; -262B;FARSI SYMBOL;So;0;ON;;;;;N;SYMBOL OF IRAN;;;; -262C;ADI SHAKTI;So;0;ON;;;;;N;;;;; -262D;HAMMER AND SICKLE;So;0;ON;;;;;N;;;;; -262E;PEACE SYMBOL;So;0;ON;;;;;N;;;;; -262F;YIN YANG;So;0;ON;;;;;N;;;;; -2630;TRIGRAM FOR HEAVEN;So;0;ON;;;;;N;;;;; -2631;TRIGRAM FOR LAKE;So;0;ON;;;;;N;;;;; -2632;TRIGRAM FOR FIRE;So;0;ON;;;;;N;;;;; -2633;TRIGRAM FOR THUNDER;So;0;ON;;;;;N;;;;; -2634;TRIGRAM FOR WIND;So;0;ON;;;;;N;;;;; -2635;TRIGRAM FOR WATER;So;0;ON;;;;;N;;;;; -2636;TRIGRAM FOR MOUNTAIN;So;0;ON;;;;;N;;;;; -2637;TRIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -2638;WHEEL OF DHARMA;So;0;ON;;;;;N;;;;; -2639;WHITE FROWNING FACE;So;0;ON;;;;;N;;;;; -263A;WHITE SMILING FACE;So;0;ON;;;;;N;;;;; -263B;BLACK SMILING FACE;So;0;ON;;;;;N;;;;; -263C;WHITE SUN WITH RAYS;So;0;ON;;;;;N;;;;; -263D;FIRST QUARTER MOON;So;0;ON;;;;;N;;;;; -263E;LAST QUARTER MOON;So;0;ON;;;;;N;;;;; -263F;MERCURY;So;0;ON;;;;;N;;;;; -2640;FEMALE SIGN;So;0;ON;;;;;N;;;;; -2641;EARTH;So;0;ON;;;;;N;;;;; -2642;MALE SIGN;So;0;ON;;;;;N;;;;; -2643;JUPITER;So;0;ON;;;;;N;;;;; -2644;SATURN;So;0;ON;;;;;N;;;;; -2645;URANUS;So;0;ON;;;;;N;;;;; -2646;NEPTUNE;So;0;ON;;;;;N;;;;; -2647;PLUTO;So;0;ON;;;;;N;;;;; -2648;ARIES;So;0;ON;;;;;N;;;;; -2649;TAURUS;So;0;ON;;;;;N;;;;; -264A;GEMINI;So;0;ON;;;;;N;;;;; -264B;CANCER;So;0;ON;;;;;N;;;;; -264C;LEO;So;0;ON;;;;;N;;;;; -264D;VIRGO;So;0;ON;;;;;N;;;;; -264E;LIBRA;So;0;ON;;;;;N;;;;; -264F;SCORPIUS;So;0;ON;;;;;N;;;;; -2650;SAGITTARIUS;So;0;ON;;;;;N;;;;; -2651;CAPRICORN;So;0;ON;;;;;N;;;;; -2652;AQUARIUS;So;0;ON;;;;;N;;;;; -2653;PISCES;So;0;ON;;;;;N;;;;; -2654;WHITE CHESS KING;So;0;ON;;;;;N;;;;; -2655;WHITE CHESS QUEEN;So;0;ON;;;;;N;;;;; -2656;WHITE CHESS ROOK;So;0;ON;;;;;N;;;;; -2657;WHITE CHESS BISHOP;So;0;ON;;;;;N;;;;; -2658;WHITE CHESS KNIGHT;So;0;ON;;;;;N;;;;; -2659;WHITE CHESS PAWN;So;0;ON;;;;;N;;;;; -265A;BLACK CHESS KING;So;0;ON;;;;;N;;;;; -265B;BLACK CHESS QUEEN;So;0;ON;;;;;N;;;;; -265C;BLACK CHESS ROOK;So;0;ON;;;;;N;;;;; -265D;BLACK CHESS BISHOP;So;0;ON;;;;;N;;;;; -265E;BLACK CHESS KNIGHT;So;0;ON;;;;;N;;;;; -265F;BLACK CHESS PAWN;So;0;ON;;;;;N;;;;; -2660;BLACK SPADE SUIT;So;0;ON;;;;;N;;;;; -2661;WHITE HEART SUIT;So;0;ON;;;;;N;;;;; -2662;WHITE DIAMOND SUIT;So;0;ON;;;;;N;;;;; -2663;BLACK CLUB SUIT;So;0;ON;;;;;N;;;;; -2664;WHITE SPADE SUIT;So;0;ON;;;;;N;;;;; -2665;BLACK HEART SUIT;So;0;ON;;;;;N;;;;; -2666;BLACK DIAMOND SUIT;So;0;ON;;;;;N;;;;; -2667;WHITE CLUB SUIT;So;0;ON;;;;;N;;;;; -2668;HOT SPRINGS;So;0;ON;;;;;N;;;;; -2669;QUARTER NOTE;So;0;ON;;;;;N;;;;; -266A;EIGHTH NOTE;So;0;ON;;;;;N;;;;; -266B;BEAMED EIGHTH NOTES;So;0;ON;;;;;N;BARRED EIGHTH NOTES;;;; -266C;BEAMED SIXTEENTH NOTES;So;0;ON;;;;;N;BARRED SIXTEENTH NOTES;;;; -266D;MUSIC FLAT SIGN;So;0;ON;;;;;N;FLAT;;;; -266E;MUSIC NATURAL SIGN;So;0;ON;;;;;N;NATURAL;;;; -266F;MUSIC SHARP SIGN;Sm;0;ON;;;;;N;SHARP;;;; -2670;WEST SYRIAC CROSS;So;0;ON;;;;;N;;;;; -2671;EAST SYRIAC CROSS;So;0;ON;;;;;N;;;;; -2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; -2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;;;; -2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;;;; -2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;;;; -2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;;;; -2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;;;; -2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;;;; -2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;;;; -267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;; -267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;; -267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; -267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;; -267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;; -267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;; -2680;DIE FACE-1;So;0;ON;;;;;N;;;;; -2681;DIE FACE-2;So;0;ON;;;;;N;;;;; -2682;DIE FACE-3;So;0;ON;;;;;N;;;;; -2683;DIE FACE-4;So;0;ON;;;;;N;;;;; -2684;DIE FACE-5;So;0;ON;;;;;N;;;;; -2685;DIE FACE-6;So;0;ON;;;;;N;;;;; -2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;; -2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;; -2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;; -2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;; -268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;; -268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;; -268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;; -268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;; -268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;; -268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;; -2690;WHITE FLAG;So;0;ON;;;;;N;;;;; -2691;BLACK FLAG;So;0;ON;;;;;N;;;;; -2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;; -2693;ANCHOR;So;0;ON;;;;;N;;;;; -2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;; -2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;; -2696;SCALES;So;0;ON;;;;;N;;;;; -2697;ALEMBIC;So;0;ON;;;;;N;;;;; -2698;FLOWER;So;0;ON;;;;;N;;;;; -2699;GEAR;So;0;ON;;;;;N;;;;; -269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;; -269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;; -269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;; -269D;OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; -269E;THREE LINES CONVERGING RIGHT;So;0;ON;;;;;N;;;;; -269F;THREE LINES CONVERGING LEFT;So;0;ON;;;;;N;;;;; -26A0;WARNING SIGN;So;0;ON;;;;;N;;;;; -26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;; -26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;; -26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;; -26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;; -26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; -26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; -26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;; -26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; -26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;; -26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;; -26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;; -26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;; -26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;; -26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;; -26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;; -26B0;COFFIN;So;0;ON;;;;;N;;;;; -26B1;FUNERAL URN;So;0;ON;;;;;N;;;;; -26B2;NEUTER;So;0;ON;;;;;N;;;;; -26B3;CERES;So;0;ON;;;;;N;;;;; -26B4;PALLAS;So;0;ON;;;;;N;;;;; -26B5;JUNO;So;0;ON;;;;;N;;;;; -26B6;VESTA;So;0;ON;;;;;N;;;;; -26B7;CHIRON;So;0;ON;;;;;N;;;;; -26B8;BLACK MOON LILITH;So;0;ON;;;;;N;;;;; -26B9;SEXTILE;So;0;ON;;;;;N;;;;; -26BA;SEMISEXTILE;So;0;ON;;;;;N;;;;; -26BB;QUINCUNX;So;0;ON;;;;;N;;;;; -26BC;SESQUIQUADRATE;So;0;ON;;;;;N;;;;; -26BD;SOCCER BALL;So;0;ON;;;;;N;;;;; -26BE;BASEBALL;So;0;ON;;;;;N;;;;; -26BF;SQUARED KEY;So;0;ON;;;;;N;;;;; -26C0;WHITE DRAUGHTS MAN;So;0;ON;;;;;N;;;;; -26C1;WHITE DRAUGHTS KING;So;0;ON;;;;;N;;;;; -26C2;BLACK DRAUGHTS MAN;So;0;ON;;;;;N;;;;; -26C3;BLACK DRAUGHTS KING;So;0;ON;;;;;N;;;;; -26C4;SNOWMAN WITHOUT SNOW;So;0;ON;;;;;N;;;;; -26C5;SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; -26C6;RAIN;So;0;ON;;;;;N;;;;; -26C7;BLACK SNOWMAN;So;0;ON;;;;;N;;;;; -26C8;THUNDER CLOUD AND RAIN;So;0;ON;;;;;N;;;;; -26C9;TURNED WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;; -26CA;TURNED BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;; -26CB;WHITE DIAMOND IN SQUARE;So;0;ON;;;;;N;;;;; -26CC;CROSSING LANES;So;0;ON;;;;;N;;;;; -26CD;DISABLED CAR;So;0;ON;;;;;N;;;;; -26CE;OPHIUCHUS;So;0;ON;;;;;N;;;;; -26CF;PICK;So;0;ON;;;;;N;;;;; -26D0;CAR SLIDING;So;0;ON;;;;;N;;;;; -26D1;HELMET WITH WHITE CROSS;So;0;ON;;;;;N;;;;; -26D2;CIRCLED CROSSING LANES;So;0;ON;;;;;N;;;;; -26D3;CHAINS;So;0;ON;;;;;N;;;;; -26D4;NO ENTRY;So;0;ON;;;;;N;;;;; -26D5;ALTERNATE ONE-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; -26D6;BLACK TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; -26D7;WHITE TWO-WAY LEFT WAY TRAFFIC;So;0;ON;;;;;N;;;;; -26D8;BLACK LEFT LANE MERGE;So;0;ON;;;;;N;;;;; -26D9;WHITE LEFT LANE MERGE;So;0;ON;;;;;N;;;;; -26DA;DRIVE SLOW SIGN;So;0;ON;;;;;N;;;;; -26DB;HEAVY WHITE DOWN-POINTING TRIANGLE;So;0;ON;;;;;N;;;;; -26DC;LEFT CLOSED ENTRY;So;0;ON;;;;;N;;;;; -26DD;SQUARED SALTIRE;So;0;ON;;;;;N;;;;; -26DE;FALLING DIAGONAL IN WHITE CIRCLE IN BLACK SQUARE;So;0;ON;;;;;N;;;;; -26DF;BLACK TRUCK;So;0;ON;;;;;N;;;;; -26E0;RESTRICTED LEFT ENTRY-1;So;0;ON;;;;;N;;;;; -26E1;RESTRICTED LEFT ENTRY-2;So;0;ON;;;;;N;;;;; -26E2;ASTRONOMICAL SYMBOL FOR URANUS;So;0;ON;;;;;N;;;;; -26E3;HEAVY CIRCLE WITH STROKE AND TWO DOTS ABOVE;So;0;ON;;;;;N;;;;; -26E4;PENTAGRAM;So;0;ON;;;;;N;;;;; -26E5;RIGHT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; -26E6;LEFT-HANDED INTERLACED PENTAGRAM;So;0;ON;;;;;N;;;;; -26E7;INVERTED PENTAGRAM;So;0;ON;;;;;N;;;;; -26E8;BLACK CROSS ON SHIELD;So;0;ON;;;;;N;;;;; -26E9;SHINTO SHRINE;So;0;ON;;;;;N;;;;; -26EA;CHURCH;So;0;ON;;;;;N;;;;; -26EB;CASTLE;So;0;ON;;;;;N;;;;; -26EC;HISTORIC SITE;So;0;ON;;;;;N;;;;; -26ED;GEAR WITHOUT HUB;So;0;ON;;;;;N;;;;; -26EE;GEAR WITH HANDLES;So;0;ON;;;;;N;;;;; -26EF;MAP SYMBOL FOR LIGHTHOUSE;So;0;ON;;;;;N;;;;; -26F0;MOUNTAIN;So;0;ON;;;;;N;;;;; -26F1;UMBRELLA ON GROUND;So;0;ON;;;;;N;;;;; -26F2;FOUNTAIN;So;0;ON;;;;;N;;;;; -26F3;FLAG IN HOLE;So;0;ON;;;;;N;;;;; -26F4;FERRY;So;0;ON;;;;;N;;;;; -26F5;SAILBOAT;So;0;ON;;;;;N;;;;; -26F6;SQUARE FOUR CORNERS;So;0;ON;;;;;N;;;;; -26F7;SKIER;So;0;ON;;;;;N;;;;; -26F8;ICE SKATE;So;0;ON;;;;;N;;;;; -26F9;PERSON WITH BALL;So;0;ON;;;;;N;;;;; -26FA;TENT;So;0;ON;;;;;N;;;;; -26FB;JAPANESE BANK SYMBOL;So;0;ON;;;;;N;;;;; -26FC;HEADSTONE GRAVEYARD SYMBOL;So;0;ON;;;;;N;;;;; -26FD;FUEL PUMP;So;0;ON;;;;;N;;;;; -26FE;CUP ON BLACK SQUARE;So;0;ON;;;;;N;;;;; -26FF;WHITE FLAG WITH HORIZONTAL MIDDLE BLACK STRIPE;So;0;ON;;;;;N;;;;; -2700;BLACK SAFETY SCISSORS;So;0;ON;;;;;N;;;;; -2701;UPPER BLADE SCISSORS;So;0;ON;;;;;N;;;;; -2702;BLACK SCISSORS;So;0;ON;;;;;N;;;;; -2703;LOWER BLADE SCISSORS;So;0;ON;;;;;N;;;;; -2704;WHITE SCISSORS;So;0;ON;;;;;N;;;;; -2705;WHITE HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; -2706;TELEPHONE LOCATION SIGN;So;0;ON;;;;;N;;;;; -2707;TAPE DRIVE;So;0;ON;;;;;N;;;;; -2708;AIRPLANE;So;0;ON;;;;;N;;;;; -2709;ENVELOPE;So;0;ON;;;;;N;;;;; -270A;RAISED FIST;So;0;ON;;;;;N;;;;; -270B;RAISED HAND;So;0;ON;;;;;N;;;;; -270C;VICTORY HAND;So;0;ON;;;;;N;;;;; -270D;WRITING HAND;So;0;ON;;;;;N;;;;; -270E;LOWER RIGHT PENCIL;So;0;ON;;;;;N;;;;; -270F;PENCIL;So;0;ON;;;;;N;;;;; -2710;UPPER RIGHT PENCIL;So;0;ON;;;;;N;;;;; -2711;WHITE NIB;So;0;ON;;;;;N;;;;; -2712;BLACK NIB;So;0;ON;;;;;N;;;;; -2713;CHECK MARK;So;0;ON;;;;;N;;;;; -2714;HEAVY CHECK MARK;So;0;ON;;;;;N;;;;; -2715;MULTIPLICATION X;So;0;ON;;;;;N;;;;; -2716;HEAVY MULTIPLICATION X;So;0;ON;;;;;N;;;;; -2717;BALLOT X;So;0;ON;;;;;N;;;;; -2718;HEAVY BALLOT X;So;0;ON;;;;;N;;;;; -2719;OUTLINED GREEK CROSS;So;0;ON;;;;;N;;;;; -271A;HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -271B;OPEN CENTRE CROSS;So;0;ON;;;;;N;OPEN CENTER CROSS;;;; -271C;HEAVY OPEN CENTRE CROSS;So;0;ON;;;;;N;HEAVY OPEN CENTER CROSS;;;; -271D;LATIN CROSS;So;0;ON;;;;;N;;;;; -271E;SHADOWED WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; -271F;OUTLINED LATIN CROSS;So;0;ON;;;;;N;;;;; -2720;MALTESE CROSS;So;0;ON;;;;;N;;;;; -2721;STAR OF DAVID;So;0;ON;;;;;N;;;;; -2722;FOUR TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2723;FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2724;HEAVY FOUR BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2725;FOUR CLUB-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2726;BLACK FOUR POINTED STAR;So;0;ON;;;;;N;;;;; -2727;WHITE FOUR POINTED STAR;So;0;ON;;;;;N;;;;; -2728;SPARKLES;So;0;ON;;;;;N;;;;; -2729;STRESS OUTLINED WHITE STAR;So;0;ON;;;;;N;;;;; -272A;CIRCLED WHITE STAR;So;0;ON;;;;;N;;;;; -272B;OPEN CENTRE BLACK STAR;So;0;ON;;;;;N;OPEN CENTER BLACK STAR;;;; -272C;BLACK CENTRE WHITE STAR;So;0;ON;;;;;N;BLACK CENTER WHITE STAR;;;; -272D;OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; -272E;HEAVY OUTLINED BLACK STAR;So;0;ON;;;;;N;;;;; -272F;PINWHEEL STAR;So;0;ON;;;;;N;;;;; -2730;SHADOWED WHITE STAR;So;0;ON;;;;;N;;;;; -2731;HEAVY ASTERISK;So;0;ON;;;;;N;;;;; -2732;OPEN CENTRE ASTERISK;So;0;ON;;;;;N;OPEN CENTER ASTERISK;;;; -2733;EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -2734;EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -2735;EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -2736;SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -2737;EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; -2738;HEAVY EIGHT POINTED RECTILINEAR BLACK STAR;So;0;ON;;;;;N;;;;; -2739;TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -273A;SIXTEEN POINTED ASTERISK;So;0;ON;;;;;N;;;;; -273B;TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -273C;OPEN CENTRE TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;OPEN CENTER TEARDROP-SPOKED ASTERISK;;;; -273D;HEAVY TEARDROP-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -273E;SIX PETALLED BLACK AND WHITE FLORETTE;So;0;ON;;;;;N;;;;; -273F;BLACK FLORETTE;So;0;ON;;;;;N;;;;; -2740;WHITE FLORETTE;So;0;ON;;;;;N;;;;; -2741;EIGHT PETALLED OUTLINED BLACK FLORETTE;So;0;ON;;;;;N;;;;; -2742;CIRCLED OPEN CENTRE EIGHT POINTED STAR;So;0;ON;;;;;N;CIRCLED OPEN CENTER EIGHT POINTED STAR;;;; -2743;HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK;So;0;ON;;;;;N;;;;; -2744;SNOWFLAKE;So;0;ON;;;;;N;;;;; -2745;TIGHT TRIFOLIATE SNOWFLAKE;So;0;ON;;;;;N;;;;; -2746;HEAVY CHEVRON SNOWFLAKE;So;0;ON;;;;;N;;;;; -2747;SPARKLE;So;0;ON;;;;;N;;;;; -2748;HEAVY SPARKLE;So;0;ON;;;;;N;;;;; -2749;BALLOON-SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -274A;EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; -274B;HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK;So;0;ON;;;;;N;;;;; -274C;CROSS MARK;So;0;ON;;;;;N;;;;; -274D;SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -274E;NEGATIVE SQUARED CROSS MARK;So;0;ON;;;;;N;;;;; -274F;LOWER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2750;UPPER RIGHT DROP-SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2751;LOWER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2752;UPPER RIGHT SHADOWED WHITE SQUARE;So;0;ON;;;;;N;;;;; -2753;BLACK QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2754;WHITE QUESTION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2755;WHITE EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2756;BLACK DIAMOND MINUS WHITE X;So;0;ON;;;;;N;;;;; -2757;HEAVY EXCLAMATION MARK SYMBOL;So;0;ON;;;;;N;;;;; -2758;LIGHT VERTICAL BAR;So;0;ON;;;;;N;;;;; -2759;MEDIUM VERTICAL BAR;So;0;ON;;;;;N;;;;; -275A;HEAVY VERTICAL BAR;So;0;ON;;;;;N;;;;; -275B;HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275C;HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275D;HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275E;HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -275F;HEAVY LOW SINGLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2760;HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2761;CURVED STEM PARAGRAPH SIGN ORNAMENT;So;0;ON;;;;;N;;;;; -2762;HEAVY EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2763;HEAVY HEART EXCLAMATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -2764;HEAVY BLACK HEART;So;0;ON;;;;;N;;;;; -2765;ROTATED HEAVY BLACK HEART BULLET;So;0;ON;;;;;N;;;;; -2766;FLORAL HEART;So;0;ON;;;;;N;;;;; -2767;ROTATED FLORAL HEART BULLET;So;0;ON;;;;;N;;;;; -2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; -276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;; -276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;; -276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;; -276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;; -2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;; -2776;DINGBAT NEGATIVE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED DIGIT ONE;;;; -2777;DINGBAT NEGATIVE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED DIGIT TWO;;;; -2778;DINGBAT NEGATIVE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED DIGIT THREE;;;; -2779;DINGBAT NEGATIVE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED DIGIT FOUR;;;; -277A;DINGBAT NEGATIVE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED DIGIT FIVE;;;; -277B;DINGBAT NEGATIVE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED DIGIT SIX;;;; -277C;DINGBAT NEGATIVE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED DIGIT SEVEN;;;; -277D;DINGBAT NEGATIVE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED DIGIT EIGHT;;;; -277E;DINGBAT NEGATIVE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED DIGIT NINE;;;; -277F;DINGBAT NEGATIVE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED NUMBER TEN;;;; -2780;DINGBAT CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;CIRCLED SANS-SERIF DIGIT ONE;;;; -2781;DINGBAT CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;CIRCLED SANS-SERIF DIGIT TWO;;;; -2782;DINGBAT CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;CIRCLED SANS-SERIF DIGIT THREE;;;; -2783;DINGBAT CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;CIRCLED SANS-SERIF DIGIT FOUR;;;; -2784;DINGBAT CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;CIRCLED SANS-SERIF DIGIT FIVE;;;; -2785;DINGBAT CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;CIRCLED SANS-SERIF DIGIT SIX;;;; -2786;DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;CIRCLED SANS-SERIF DIGIT SEVEN;;;; -2787;DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;CIRCLED SANS-SERIF DIGIT EIGHT;;;; -2788;DINGBAT CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;CIRCLED SANS-SERIF DIGIT NINE;;;; -2789;DINGBAT CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;CIRCLED SANS-SERIF NUMBER TEN;;;; -278A;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE;No;0;ON;;;1;1;N;INVERSE CIRCLED SANS-SERIF DIGIT ONE;;;; -278B;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO;No;0;ON;;;2;2;N;INVERSE CIRCLED SANS-SERIF DIGIT TWO;;;; -278C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE;No;0;ON;;;3;3;N;INVERSE CIRCLED SANS-SERIF DIGIT THREE;;;; -278D;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR;No;0;ON;;;4;4;N;INVERSE CIRCLED SANS-SERIF DIGIT FOUR;;;; -278E;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE;No;0;ON;;;5;5;N;INVERSE CIRCLED SANS-SERIF DIGIT FIVE;;;; -278F;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX;No;0;ON;;;6;6;N;INVERSE CIRCLED SANS-SERIF DIGIT SIX;;;; -2790;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN;No;0;ON;;;7;7;N;INVERSE CIRCLED SANS-SERIF DIGIT SEVEN;;;; -2791;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT;No;0;ON;;;8;8;N;INVERSE CIRCLED SANS-SERIF DIGIT EIGHT;;;; -2792;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE;No;0;ON;;;9;9;N;INVERSE CIRCLED SANS-SERIF DIGIT NINE;;;; -2793;DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN;No;0;ON;;;;10;N;INVERSE CIRCLED SANS-SERIF NUMBER TEN;;;; -2794;HEAVY WIDE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WIDE-HEADED RIGHT ARROW;;;; -2795;HEAVY PLUS SIGN;So;0;ON;;;;;N;;;;; -2796;HEAVY MINUS SIGN;So;0;ON;;;;;N;;;;; -2797;HEAVY DIVISION SIGN;So;0;ON;;;;;N;;;;; -2798;HEAVY SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT ARROW;;;; -2799;HEAVY RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY RIGHT ARROW;;;; -279A;HEAVY NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT ARROW;;;; -279B;DRAFTING POINT RIGHTWARDS ARROW;So;0;ON;;;;;N;DRAFTING POINT RIGHT ARROW;;;; -279C;HEAVY ROUND-TIPPED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY ROUND-TIPPED RIGHT ARROW;;;; -279D;TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;TRIANGLE-HEADED RIGHT ARROW;;;; -279E;HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TRIANGLE-HEADED RIGHT ARROW;;;; -279F;DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;DASHED TRIANGLE-HEADED RIGHT ARROW;;;; -27A0;HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY DASHED TRIANGLE-HEADED RIGHT ARROW;;;; -27A1;BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK RIGHT ARROW;;;; -27A2;THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D TOP-LIGHTED RIGHT ARROWHEAD;;;; -27A3;THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;THREE-D BOTTOM-LIGHTED RIGHT ARROWHEAD;;;; -27A4;BLACK RIGHTWARDS ARROWHEAD;So;0;ON;;;;;N;BLACK RIGHT ARROWHEAD;;;; -27A5;HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED DOWN AND RIGHT ARROW;;;; -27A6;HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK CURVED UP AND RIGHT ARROW;;;; -27A7;SQUAT BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;SQUAT BLACK RIGHT ARROW;;;; -27A8;HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY CONCAVE-POINTED BLACK RIGHT ARROW;;;; -27A9;RIGHT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;RIGHT-SHADED WHITE RIGHT ARROW;;;; -27AA;LEFT-SHADED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;LEFT-SHADED WHITE RIGHT ARROW;;;; -27AB;BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;BACK-TILTED SHADOWED WHITE RIGHT ARROW;;;; -27AC;FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;FRONT-TILTED SHADOWED WHITE RIGHT ARROW;;;; -27AD;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27AE;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27AF;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27B0;CURLY LOOP;So;0;ON;;;;;N;;;;; -27B1;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHT ARROW;;;; -27B2;CIRCLED HEAVY WHITE RIGHTWARDS ARROW;So;0;ON;;;;;N;CIRCLED HEAVY WHITE RIGHT ARROW;;;; -27B3;WHITE-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;WHITE-FEATHERED RIGHT ARROW;;;; -27B4;BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED LOWER RIGHT ARROW;;;; -27B5;BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;BLACK-FEATHERED RIGHT ARROW;;;; -27B6;BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;BLACK-FEATHERED UPPER RIGHT ARROW;;;; -27B7;HEAVY BLACK-FEATHERED SOUTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED LOWER RIGHT ARROW;;;; -27B8;HEAVY BLACK-FEATHERED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED RIGHT ARROW;;;; -27B9;HEAVY BLACK-FEATHERED NORTH EAST ARROW;So;0;ON;;;;;N;HEAVY BLACK-FEATHERED UPPER RIGHT ARROW;;;; -27BA;TEARDROP-BARBED RIGHTWARDS ARROW;So;0;ON;;;;;N;TEARDROP-BARBED RIGHT ARROW;;;; -27BB;HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY TEARDROP-SHANKED RIGHT ARROW;;;; -27BC;WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;WEDGE-TAILED RIGHT ARROW;;;; -27BD;HEAVY WEDGE-TAILED RIGHTWARDS ARROW;So;0;ON;;;;;N;HEAVY WEDGE-TAILED RIGHT ARROW;;;; -27BE;OPEN-OUTLINED RIGHTWARDS ARROW;So;0;ON;;;;;N;OPEN-OUTLINED RIGHT ARROW;;;; -27BF;DOUBLE CURLY LOOP;So;0;ON;;;;;N;;;;; -27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;; -27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;; -27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;; -27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;; -27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;; -27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;; -27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;; -27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;; -27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;Y;;;;; -27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;Y;;;;; -27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -27CB;MATHEMATICAL RISING DIAGONAL;Sm;0;ON;;;;;Y;;;;; -27CC;LONG DIVISION;Sm;0;ON;;;;;Y;;;;; -27CD;MATHEMATICAL FALLING DIAGONAL;Sm;0;ON;;;;;Y;;;;; -27CE;SQUARED LOGICAL AND;Sm;0;ON;;;;;N;;;;; -27CF;SQUARED LOGICAL OR;Sm;0;ON;;;;;N;;;;; -27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;; -27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;; -27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;; -27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; -27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;; -27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; -27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;; -27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;; -27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;; -27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;; -27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;; -27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;; -27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;; -27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;; -27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;; -27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;; -27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;; -27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;; -27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;; -27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;; -27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; -27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; -27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; -27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; -27EC;MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; -27ED;MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; -27EE;MATHEMATICAL LEFT FLATTENED PARENTHESIS;Ps;0;ON;;;;;Y;;;;; -27EF;MATHEMATICAL RIGHT FLATTENED PARENTHESIS;Pe;0;ON;;;;;Y;;;;; -27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; -27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;; -27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;; -27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;; -27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;; -2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;; -2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;; -2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;; -2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;; -2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;; -2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;; -2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;; -2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;; -2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;; -280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;; -280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;; -280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;; -280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;; -280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;; -280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;; -2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;; -2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;; -2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;; -2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;; -2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;; -2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;; -2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;; -2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;; -2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;; -2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;; -281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;; -281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;; -281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;; -281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;; -281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;; -281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;; -2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;; -2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;; -2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;; -2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;; -2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;; -2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;; -2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;; -2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;; -2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;; -2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;; -282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;; -282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;; -282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;; -282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;; -282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;; -282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;; -2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;; -2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;; -2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;; -2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;; -2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;; -2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;; -2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;; -2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;; -2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;; -2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;; -283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;; -283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;; -283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;; -283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;; -283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;; -283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;; -2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;; -2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;; -2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;; -2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;; -2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;; -2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;; -2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;; -2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;; -2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;; -2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;; -284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;; -284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;; -284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;; -284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;; -284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;; -284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;; -2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;; -2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;; -2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;; -2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;; -2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;; -2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;; -2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;; -2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;; -2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;; -2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;; -285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;; -285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;; -285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;; -285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;; -285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;; -285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;; -2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;; -2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;; -2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;; -2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;; -2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;; -2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;; -2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;; -2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;; -2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;; -2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;; -286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;; -286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;; -286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;; -286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;; -286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;; -286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;; -2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;; -2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;; -2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;; -2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;; -2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;; -2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;; -2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;; -2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;; -2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;; -2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;; -287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;; -287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;; -287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;; -287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;; -287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;; -287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;; -2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;; -2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;; -2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;; -2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;; -2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;; -2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;; -2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;; -2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;; -2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;; -2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;; -288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;; -288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;; -288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;; -288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;; -288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;; -288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;; -2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;; -2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;; -2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;; -2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;; -2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;; -2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;; -2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;; -2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;; -2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;; -2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;; -289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;; -289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;; -289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;; -289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;; -289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;; -289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;; -28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;; -28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;; -28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;; -28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;; -28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;; -28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;; -28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;; -28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;; -28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;; -28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;; -28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;; -28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;; -28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;; -28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;; -28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;; -28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;; -28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;; -28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;; -28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;; -28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;; -28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;; -28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;; -28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;; -28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;; -28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;; -28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;; -28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;; -28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;; -28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;; -28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;; -28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;; -28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;; -28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;; -28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;; -28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;; -28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;; -28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;; -28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;; -28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;; -28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;; -28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;; -28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;; -28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;; -28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;; -28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;; -28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;; -28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;; -28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;; -28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;; -28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;; -28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;; -28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;; -28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;; -28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;; -28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;; -28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;; -28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;; -28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;; -28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;; -28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;; -28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;; -28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;; -28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;; -28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;; -28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;; -28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;; -28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;; -28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;; -28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;; -28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;; -28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;; -28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;; -28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;; -28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;; -28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;; -28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;; -28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;; -28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;; -28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;; -28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;; -28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;; -28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;; -28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;; -28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;; -28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;; -28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;; -28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;; -28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;; -28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;; -28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;; -28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;; -28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;; -28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;; -28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;; -28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;; -28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;; -2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; -290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;; -290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; -2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; -2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;; -2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; -2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;; -291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;; -2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;; -292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;; -292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;; -2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;; -2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;; -2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;; -2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;; -2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;; -2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;; -2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;; -293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;; -293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;; -2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;; -2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; -2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;; -2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; -2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; -294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; -294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; -294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; -294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;; -294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;; -2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;; -2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;; -2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; -2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;; -2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; -2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;; -2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; -2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;; -2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; -2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;; -295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; -295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;; -295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; -295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;; -295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; -295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;; -2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; -2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;; -2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; -2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;; -2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;; -296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; -296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; -296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;; -296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;; -296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;; -2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;; -2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;; -2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;; -297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;; -297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;; -297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;; -297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;; -2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;; -2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;; -2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;; -2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;; -2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;; -2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; -2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; -2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;; -2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;; -2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;; -298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;; -298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;; -298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;; -298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;; -298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;; -298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;; -2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;; -2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;; -2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;; -2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; -2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; -2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;; -2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;; -2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;; -2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;; -2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;; -299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;; -299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; -299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;; -299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;; -299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;; -299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;; -29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;; -29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; -29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;; -29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;; -29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;; -29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;; -29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;; -29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;; -29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;; -29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;; -29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;; -29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;; -29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;; -29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;; -29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;; -29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; -29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;; -29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;; -29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;; -29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; -29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;; -29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;; -29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;; -29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;; -29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;; -29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;; -29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; -29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;; -29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; -29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;; -29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;; -29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;; -29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;; -29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;; -29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;; -29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;; -29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;; -29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;; -29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;; -29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; -29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; -29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;; -29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;; -29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;; -29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;; -29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;; -29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;; -29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;; -29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;; -29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; -29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; -29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;; -29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;; -29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;; -29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;; -29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; -29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;; -29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; -29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;; -29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;; -29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;; -29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;; -29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;; -29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;; -29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;; -29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;; -29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; -29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;; -29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;; -29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;; -29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;; -29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;; -29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;; -29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;; -29FE;TINY;Sm;0;ON;;;;;N;;;;; -29FF;MINY;Sm;0;ON;;;;;N;;;;; -2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;; -2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;; -2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; -2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;; -2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;; -2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;; -2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;; -2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;; -2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;; -2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;; -2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;; -2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON; 222B 222B 222B 222B;;;;Y;;;;; -2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;; -2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;; -2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;; -2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;; -2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;; -2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; -2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;; -2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;; -2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;; -2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;; -2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;; -2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;; -2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;; -2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -2A1D;JOIN;Sm;0;ON;;;;;N;;;;; -2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;; -2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;; -2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;; -2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;; -2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;; -2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; -2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;; -2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;; -2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;; -2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; -2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;; -2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; -2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;; -2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;; -2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; -2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;; -2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;; -2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;; -2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;; -2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;; -2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; -2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;; -2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;; -2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;; -2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;; -2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;; -2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;; -2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;; -2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;; -2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;; -2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;; -2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;; -2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;; -2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;; -2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;; -2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;; -2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;; -2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;; -2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; -2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;; -2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; -2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;; -2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; -2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;; -2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;; -2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; -2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;; -2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;; -2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;; -2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;; -2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;; -2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;; -2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;; -2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;; -2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;; -2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2A74;DOUBLE COLON EQUAL;Sm;0;ON; 003A 003A 003D;;;;Y;;;;; -2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D;;;;N;;;;; -2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON; 003D 003D 003D;;;;N;;;;; -2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;; -2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;; -2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; -2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;; -2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; -2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;; -2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;; -2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;; -2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;; -2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; -2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;; -2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; -2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;; -2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;; -2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;; -2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;; -2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;; -2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; -2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;; -2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;; -2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;; -2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;; -2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;; -2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;; -2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;; -2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;; -2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;; -2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;; -2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;; -2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;; -2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; -2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;; -2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;; -2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;; -2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; -2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; -2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;; -2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;; -2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;; -2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;; -2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;; -2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;; -2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;; -2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;;;; -2ADD;NONFORKING;Sm;0;ON;;;;;N;;;;; -2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;; -2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; -2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;; -2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;; -2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;; -2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;; -2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;; -2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;; -2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;; -2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;; -2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;; -2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; -2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;; -2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;; -2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;; -2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; -2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;; -2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;; -2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;; -2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;; -2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;; -2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;; -2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;; -2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;; -2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;; -2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;; -2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;; -2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;; -2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;; -2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;; -2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; -2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;; -2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; -2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; -2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;; -2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;; -2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;; -2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;; -2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;; -2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;; -2B1B;BLACK LARGE SQUARE;So;0;ON;;;;;N;;;;; -2B1C;WHITE LARGE SQUARE;So;0;ON;;;;;N;;;;; -2B1D;BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; -2B1E;WHITE VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; -2B1F;BLACK PENTAGON;So;0;ON;;;;;N;;;;; -2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;; -2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;; -2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;; -2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;; -2B24;BLACK LARGE CIRCLE;So;0;ON;;;;;N;;;;; -2B25;BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; -2B26;WHITE MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; -2B27;BLACK MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; -2B28;WHITE MEDIUM LOZENGE;So;0;ON;;;;;N;;;;; -2B29;BLACK SMALL DIAMOND;So;0;ON;;;;;N;;;;; -2B2A;BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; -2B2B;WHITE SMALL LOZENGE;So;0;ON;;;;;N;;;;; -2B2C;BLACK HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B2D;WHITE HORIZONTAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B2E;BLACK VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B2F;WHITE VERTICAL ELLIPSE;So;0;ON;;;;;N;;;;; -2B30;LEFT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;; -2B31;THREE LEFTWARDS ARROWS;Sm;0;ON;;;;;N;;;;; -2B32;LEFT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;; -2B33;LONG LEFTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;; -2B34;LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B35;LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B36;LEFTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;; -2B37;LEFTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;; -2B38;LEFTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;; -2B39;LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3A;LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3B;LEFTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;; -2B3C;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3D;LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;; -2B3E;LEFTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;; -2B3F;WAVE ARROW POINTING DIRECTLY LEFT;Sm;0;ON;;;;;N;;;;; -2B40;EQUALS SIGN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B41;REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B42;LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2B43;RIGHTWARDS ARROW THROUGH GREATER-THAN;Sm;0;ON;;;;;N;;;;; -2B44;RIGHTWARDS ARROW THROUGH SUPERSET;Sm;0;ON;;;;;N;;;;; -2B45;LEFTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; -2B46;RIGHTWARDS QUADRUPLE ARROW;So;0;ON;;;;;N;;;;; -2B47;REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B48;RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2B49;TILDE OPERATOR ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;; -2B4A;LEFTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;; -2B4B;LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2B4C;RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;; -2B4D;DOWNWARDS TRIANGLE-HEADED ZIGZAG ARROW;So;0;ON;;;;;N;;;;; -2B4E;SHORT SLANTED NORTH ARROW;So;0;ON;;;;;N;;;;; -2B4F;SHORT BACKSLANTED SOUTH ARROW;So;0;ON;;;;;N;;;;; -2B50;WHITE MEDIUM STAR;So;0;ON;;;;;N;;;;; -2B51;BLACK SMALL STAR;So;0;ON;;;;;N;;;;; -2B52;WHITE SMALL STAR;So;0;ON;;;;;N;;;;; -2B53;BLACK RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; -2B54;WHITE RIGHT-POINTING PENTAGON;So;0;ON;;;;;N;;;;; -2B55;HEAVY LARGE CIRCLE;So;0;ON;;;;;N;;;;; -2B56;HEAVY OVAL WITH OVAL INSIDE;So;0;ON;;;;;N;;;;; -2B57;HEAVY CIRCLE WITH CIRCLE INSIDE;So;0;ON;;;;;N;;;;; -2B58;HEAVY CIRCLE;So;0;ON;;;;;N;;;;; -2B59;HEAVY CIRCLED SALTIRE;So;0;ON;;;;;N;;;;; -2B5A;SLANTED NORTH ARROW WITH HOOKED HEAD;So;0;ON;;;;;N;;;;; -2B5B;BACKSLANTED SOUTH ARROW WITH HOOKED TAIL;So;0;ON;;;;;N;;;;; -2B5C;SLANTED NORTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; -2B5D;BACKSLANTED SOUTH ARROW WITH HORIZONTAL TAIL;So;0;ON;;;;;N;;;;; -2B5E;BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; -2B5F;SHORT BENT ARROW POINTING DOWNWARDS THEN NORTH EAST;So;0;ON;;;;;N;;;;; -2B60;LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B61;UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B62;RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B63;DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B64;LEFT RIGHT TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B65;UP DOWN TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B66;NORTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B67;NORTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B68;SOUTH EAST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B69;SOUTH WEST TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B6A;LEFTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6B;UPWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6C;RIGHTWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6D;DOWNWARDS TRIANGLE-HEADED DASHED ARROW;So;0;ON;;;;;N;;;;; -2B6E;CLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -2B6F;ANTICLOCKWISE TRIANGLE-HEADED OPEN CIRCLE ARROW;So;0;ON;;;;;N;;;;; -2B70;LEFTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B71;UPWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B72;RIGHTWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B73;DOWNWARDS TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B76;NORTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B77;NORTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B78;SOUTH EAST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B79;SOUTH WEST TRIANGLE-HEADED ARROW TO BAR;So;0;ON;;;;;N;;;;; -2B7A;LEFTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7B;UPWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7C;RIGHTWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7D;DOWNWARDS TRIANGLE-HEADED ARROW WITH DOUBLE HORIZONTAL STROKE;So;0;ON;;;;;N;;;;; -2B7E;HORIZONTAL TAB KEY;So;0;ON;;;;;N;;;;; -2B7F;VERTICAL TAB KEY;So;0;ON;;;;;N;;;;; -2B80;LEFTWARDS TRIANGLE-HEADED ARROW OVER RIGHTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B81;UPWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF DOWNWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B82;RIGHTWARDS TRIANGLE-HEADED ARROW OVER LEFTWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B83;DOWNWARDS TRIANGLE-HEADED ARROW LEFTWARDS OF UPWARDS TRIANGLE-HEADED ARROW;So;0;ON;;;;;N;;;;; -2B84;LEFTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B85;UPWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B86;RIGHTWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B87;DOWNWARDS TRIANGLE-HEADED PAIRED ARROWS;So;0;ON;;;;;N;;;;; -2B88;LEFTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B89;UPWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B8A;RIGHTWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B8B;DOWNWARDS BLACK CIRCLED WHITE ARROW;So;0;ON;;;;;N;;;;; -2B8C;ANTICLOCKWISE TRIANGLE-HEADED RIGHT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B8D;ANTICLOCKWISE TRIANGLE-HEADED BOTTOM U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B8E;ANTICLOCKWISE TRIANGLE-HEADED LEFT U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B8F;ANTICLOCKWISE TRIANGLE-HEADED TOP U-SHAPED ARROW;So;0;ON;;;;;N;;;;; -2B90;RETURN LEFT;So;0;ON;;;;;N;;;;; -2B91;RETURN RIGHT;So;0;ON;;;;;N;;;;; -2B92;NEWLINE LEFT;So;0;ON;;;;;N;;;;; -2B93;NEWLINE RIGHT;So;0;ON;;;;;N;;;;; -2B94;FOUR CORNER ARROWS CIRCLING ANTICLOCKWISE;So;0;ON;;;;;N;;;;; -2B95;RIGHTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;; -2B98;THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B99;THREE-D RIGHT-LIGHTED UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9A;THREE-D TOP-LIGHTED RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9B;THREE-D LEFT-LIGHTED DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9C;BLACK LEFTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9D;BLACK UPWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9E;BLACK RIGHTWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2B9F;BLACK DOWNWARDS EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -2BA0;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; -2BA1;DOWNWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; -2BA2;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP LEFTWARDS;So;0;ON;;;;;N;;;;; -2BA3;UPWARDS TRIANGLE-HEADED ARROW WITH LONG TIP RIGHTWARDS;So;0;ON;;;;;N;;;;; -2BA4;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; -2BA5;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP UPWARDS;So;0;ON;;;;;N;;;;; -2BA6;LEFTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2BA7;RIGHTWARDS TRIANGLE-HEADED ARROW WITH LONG TIP DOWNWARDS;So;0;ON;;;;;N;;;;; -2BA8;BLACK CURVED DOWNWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BA9;BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAA;BLACK CURVED UPWARDS AND LEFTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAB;BLACK CURVED UPWARDS AND RIGHTWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAC;BLACK CURVED LEFTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAD;BLACK CURVED RIGHTWARDS AND UPWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAE;BLACK CURVED LEFTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; -2BAF;BLACK CURVED RIGHTWARDS AND DOWNWARDS ARROW;So;0;ON;;;;;N;;;;; -2BB0;RIBBON ARROW DOWN LEFT;So;0;ON;;;;;N;;;;; -2BB1;RIBBON ARROW DOWN RIGHT;So;0;ON;;;;;N;;;;; -2BB2;RIBBON ARROW UP LEFT;So;0;ON;;;;;N;;;;; -2BB3;RIBBON ARROW UP RIGHT;So;0;ON;;;;;N;;;;; -2BB4;RIBBON ARROW LEFT UP;So;0;ON;;;;;N;;;;; -2BB5;RIBBON ARROW RIGHT UP;So;0;ON;;;;;N;;;;; -2BB6;RIBBON ARROW LEFT DOWN;So;0;ON;;;;;N;;;;; -2BB7;RIBBON ARROW RIGHT DOWN;So;0;ON;;;;;N;;;;; -2BB8;UPWARDS WHITE ARROW FROM BAR WITH HORIZONTAL BAR;So;0;ON;;;;;N;;;;; -2BB9;UP ARROWHEAD IN A RECTANGLE BOX;So;0;ON;;;;;N;;;;; -2BBD;BALLOT BOX WITH LIGHT X;So;0;ON;;;;;N;;;;; -2BBE;CIRCLED X;So;0;ON;;;;;N;;;;; -2BBF;CIRCLED BOLD X;So;0;ON;;;;;N;;;;; -2BC0;BLACK SQUARE CENTRED;So;0;ON;;;;;N;;;;; -2BC1;BLACK DIAMOND CENTRED;So;0;ON;;;;;N;;;;; -2BC2;TURNED BLACK PENTAGON;So;0;ON;;;;;N;;;;; -2BC3;HORIZONTAL BLACK OCTAGON;So;0;ON;;;;;N;;;;; -2BC4;BLACK OCTAGON;So;0;ON;;;;;N;;;;; -2BC5;BLACK MEDIUM UP-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BC6;BLACK MEDIUM DOWN-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BC7;BLACK MEDIUM LEFT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BC8;BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED;So;0;ON;;;;;N;;;;; -2BCA;TOP HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -2BCB;BOTTOM HALF BLACK CIRCLE;So;0;ON;;;;;N;;;;; -2BCC;LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; -2BCD;ROTATED LIGHT FOUR POINTED BLACK CUSP;So;0;ON;;;;;N;;;;; -2BCE;WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; -2BCF;ROTATED WHITE FOUR POINTED CUSP;So;0;ON;;;;;N;;;;; -2BD0;SQUARE POSITION INDICATOR;So;0;ON;;;;;N;;;;; -2BD1;UNCERTAINTY SIGN;So;0;ON;;;;;N;;;;; -2BEC;LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2BED;UPWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2BEE;RIGHTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2BEF;DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS;So;0;ON;;;;;N;;;;; -2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30; -2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31; -2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32; -2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33; -2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34; -2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35; -2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36; -2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37; -2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38; -2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39; -2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A; -2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B; -2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C; -2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D; -2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E; -2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F; -2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40; -2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41; -2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42; -2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43; -2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44; -2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45; -2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46; -2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47; -2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48; -2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49; -2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A; -2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B; -2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C; -2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D; -2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E; -2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F; -2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50; -2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51; -2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52; -2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53; -2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54; -2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55; -2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56; -2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57; -2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58; -2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59; -2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A; -2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B; -2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C; -2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D; -2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E; -2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00 -2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01 -2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02 -2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03 -2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04 -2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05 -2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06 -2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07 -2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08 -2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09 -2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A -2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B -2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C -2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D -2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E -2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F -2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10 -2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11 -2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12 -2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13 -2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14 -2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15 -2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16 -2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17 -2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18 -2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19 -2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A -2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B -2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C -2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D -2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E -2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F -2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20 -2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21 -2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22 -2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23 -2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24 -2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25 -2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26 -2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27 -2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28 -2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29 -2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A -2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B -2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C -2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D -2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E -2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61; -2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60 -2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B; -2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D; -2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D; -2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A -2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E -2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68; -2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67 -2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A; -2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69 -2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C; -2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B -2C6D;LATIN CAPITAL LETTER ALPHA;Lu;0;L;;;;;N;;;;0251; -2C6E;LATIN CAPITAL LETTER M WITH HOOK;Lu;0;L;;;;;N;;;;0271; -2C6F;LATIN CAPITAL LETTER TURNED A;Lu;0;L;;;;;N;;;;0250; -2C70;LATIN CAPITAL LETTER TURNED ALPHA;Lu;0;L;;;;;N;;;;0252; -2C71;LATIN SMALL LETTER V WITH RIGHT HOOK;Ll;0;L;;;;;N;;;;; -2C72;LATIN CAPITAL LETTER W WITH HOOK;Lu;0;L;;;;;N;;;;2C73; -2C73;LATIN SMALL LETTER W WITH HOOK;Ll;0;L;;;;;N;;;2C72;;2C72 -2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;; -2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76; -2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75 -2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;; -2C78;LATIN SMALL LETTER E WITH NOTCH;Ll;0;L;;;;;N;;;;; -2C79;LATIN SMALL LETTER TURNED R WITH TAIL;Ll;0;L;;;;;N;;;;; -2C7A;LATIN SMALL LETTER O WITH LOW RING INSIDE;Ll;0;L;;;;;N;;;;; -2C7B;LATIN LETTER SMALL CAPITAL TURNED E;Ll;0;L;;;;;N;;;;; -2C7C;LATIN SUBSCRIPT SMALL LETTER J;Lm;0;L; 006A;;;;N;;;;; -2C7D;MODIFIER LETTER CAPITAL V;Lm;0;L; 0056;;;;N;;;;; -2C7E;LATIN CAPITAL LETTER S WITH SWASH TAIL;Lu;0;L;;;;;N;;;;023F; -2C7F;LATIN CAPITAL LETTER Z WITH SWASH TAIL;Lu;0;L;;;;;N;;;;0240; -2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81; -2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80 -2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83; -2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82 -2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85; -2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84 -2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87; -2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86 -2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89; -2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88 -2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B; -2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A -2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D; -2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C -2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F; -2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E -2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91; -2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90 -2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93; -2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92 -2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95; -2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94 -2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97; -2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96 -2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99; -2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98 -2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B; -2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A -2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D; -2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C -2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F; -2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E -2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1; -2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0 -2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3; -2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2 -2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5; -2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4 -2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7; -2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6 -2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9; -2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8 -2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB; -2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA -2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD; -2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC -2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF; -2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE -2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1; -2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0 -2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3; -2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2 -2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5; -2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4 -2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7; -2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6 -2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9; -2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8 -2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB; -2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA -2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD; -2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC -2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF; -2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE -2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1; -2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0 -2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3; -2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2 -2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5; -2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4 -2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7; -2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6 -2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9; -2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8 -2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB; -2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA -2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD; -2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC -2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF; -2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE -2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1; -2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0 -2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3; -2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2 -2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5; -2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4 -2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7; -2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6 -2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9; -2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8 -2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB; -2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA -2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD; -2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC -2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF; -2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE -2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1; -2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0 -2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3; -2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2 -2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;; -2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;; -2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;; -2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;; -2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;; -2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;; -2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;; -2CEB;COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI;Lu;0;L;;;;;N;;;;2CEC; -2CEC;COPTIC SMALL LETTER CRYPTOGRAMMIC SHEI;Ll;0;L;;;;;N;;;2CEB;;2CEB -2CED;COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA;Lu;0;L;;;;;N;;;;2CEE; -2CEE;COPTIC SMALL LETTER CRYPTOGRAMMIC GANGIA;Ll;0;L;;;;;N;;;2CED;;2CED -2CEF;COPTIC COMBINING NI ABOVE;Mn;230;NSM;;;;;N;;;;; -2CF0;COPTIC COMBINING SPIRITUS ASPER;Mn;230;NSM;;;;;N;;;;; -2CF1;COPTIC COMBINING SPIRITUS LENIS;Mn;230;NSM;;;;;N;;;;; -2CF2;COPTIC CAPITAL LETTER BOHAIRIC KHEI;Lu;0;L;;;;;N;;;;2CF3; -2CF3;COPTIC SMALL LETTER BOHAIRIC KHEI;Ll;0;L;;;;;N;;;2CF2;;2CF2 -2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;; -2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; -2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;; -2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;; -2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;; -2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;; -2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;; -2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;;10A0;;10A0 -2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;;10A1;;10A1 -2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;;10A2;;10A2 -2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;;10A3;;10A3 -2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;;10A4;;10A4 -2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;;10A5;;10A5 -2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;;10A6;;10A6 -2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;;10A7;;10A7 -2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;;10A8;;10A8 -2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;;10A9;;10A9 -2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;;10AA;;10AA -2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;;10AB;;10AB -2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;;10AC;;10AC -2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;;10AD;;10AD -2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;;10AE;;10AE -2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;;10AF;;10AF -2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;;10B0;;10B0 -2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;;10B1;;10B1 -2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;;10B2;;10B2 -2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;;10B3;;10B3 -2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;;10B4;;10B4 -2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;;10B5;;10B5 -2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;;10B6;;10B6 -2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;;10B7;;10B7 -2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;;10B8;;10B8 -2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;;10B9;;10B9 -2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;;10BA;;10BA -2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;;10BB;;10BB -2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;;10BC;;10BC -2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;;10BD;;10BD -2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;;10BE;;10BE -2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;;10BF;;10BF -2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;;10C0;;10C0 -2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;;10C1;;10C1 -2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;;10C2;;10C2 -2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;;10C3;;10C3 -2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;;10C4;;10C4 -2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;;10C5;;10C5 -2D27;GEORGIAN SMALL LETTER YN;Ll;0;L;;;;;N;;;10C7;;10C7 -2D2D;GEORGIAN SMALL LETTER AEN;Ll;0;L;;;;;N;;;10CD;;10CD -2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;; -2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;; -2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;; -2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;; -2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;; -2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;; -2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;; -2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;; -2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;; -2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;; -2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;; -2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;; -2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;; -2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;; -2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;; -2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;; -2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;;;; -2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;; -2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;; -2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;; -2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;; -2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;; -2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;; -2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;; -2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;; -2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;; -2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;; -2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;; -2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;; -2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;; -2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;; -2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;; -2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;; -2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;; -2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;; -2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;;;; -2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;; -2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;; -2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;; -2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;; -2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;;;; -2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;; -2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;; -2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;; -2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;; -2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;; -2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;; -2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;; -2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;; -2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;; -2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;; -2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;; -2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;;;; -2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;; -2D66;TIFINAGH LETTER YE;Lo;0;L;;;;;N;;;;; -2D67;TIFINAGH LETTER YO;Lo;0;L;;;;;N;;;;; -2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L; 2D61;;;;N;;;;; -2D70;TIFINAGH SEPARATOR MARK;Po;0;L;;;;;N;;;;; -2D7F;TIFINAGH CONSONANT JOINER;Mn;9;NSM;;;;;N;;;;; -2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;; -2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;; -2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;; -2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;; -2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;; -2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;; -2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;; -2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;; -2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;; -2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;; -2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;; -2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;; -2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;; -2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;; -2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;; -2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;; -2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;; -2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;; -2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;; -2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;; -2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;; -2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;; -2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;; -2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;; -2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;; -2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;; -2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;; -2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;; -2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;; -2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;; -2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;; -2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;; -2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;; -2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;; -2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;; -2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;; -2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;; -2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; -2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; -2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; -2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;; -2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;; -2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; -2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; -2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;; -2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;; -2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;; -2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;; -2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;; -2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;; -2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;; -2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;; -2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;; -2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;; -2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;; -2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;; -2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;; -2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;; -2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;; -2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;; -2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;; -2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;; -2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;; -2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;; -2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;; -2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;; -2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;; -2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;; -2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;; -2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;; -2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;; -2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;; -2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;; -2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;; -2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;; -2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;; -2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;; -2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;; -2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;; -2DE0;COMBINING CYRILLIC LETTER BE;Mn;230;NSM;;;;;N;;;;; -2DE1;COMBINING CYRILLIC LETTER VE;Mn;230;NSM;;;;;N;;;;; -2DE2;COMBINING CYRILLIC LETTER GHE;Mn;230;NSM;;;;;N;;;;; -2DE3;COMBINING CYRILLIC LETTER DE;Mn;230;NSM;;;;;N;;;;; -2DE4;COMBINING CYRILLIC LETTER ZHE;Mn;230;NSM;;;;;N;;;;; -2DE5;COMBINING CYRILLIC LETTER ZE;Mn;230;NSM;;;;;N;;;;; -2DE6;COMBINING CYRILLIC LETTER KA;Mn;230;NSM;;;;;N;;;;; -2DE7;COMBINING CYRILLIC LETTER EL;Mn;230;NSM;;;;;N;;;;; -2DE8;COMBINING CYRILLIC LETTER EM;Mn;230;NSM;;;;;N;;;;; -2DE9;COMBINING CYRILLIC LETTER EN;Mn;230;NSM;;;;;N;;;;; -2DEA;COMBINING CYRILLIC LETTER O;Mn;230;NSM;;;;;N;;;;; -2DEB;COMBINING CYRILLIC LETTER PE;Mn;230;NSM;;;;;N;;;;; -2DEC;COMBINING CYRILLIC LETTER ER;Mn;230;NSM;;;;;N;;;;; -2DED;COMBINING CYRILLIC LETTER ES;Mn;230;NSM;;;;;N;;;;; -2DEE;COMBINING CYRILLIC LETTER TE;Mn;230;NSM;;;;;N;;;;; -2DEF;COMBINING CYRILLIC LETTER HA;Mn;230;NSM;;;;;N;;;;; -2DF0;COMBINING CYRILLIC LETTER TSE;Mn;230;NSM;;;;;N;;;;; -2DF1;COMBINING CYRILLIC LETTER CHE;Mn;230;NSM;;;;;N;;;;; -2DF2;COMBINING CYRILLIC LETTER SHA;Mn;230;NSM;;;;;N;;;;; -2DF3;COMBINING CYRILLIC LETTER SHCHA;Mn;230;NSM;;;;;N;;;;; -2DF4;COMBINING CYRILLIC LETTER FITA;Mn;230;NSM;;;;;N;;;;; -2DF5;COMBINING CYRILLIC LETTER ES-TE;Mn;230;NSM;;;;;N;;;;; -2DF6;COMBINING CYRILLIC LETTER A;Mn;230;NSM;;;;;N;;;;; -2DF7;COMBINING CYRILLIC LETTER IE;Mn;230;NSM;;;;;N;;;;; -2DF8;COMBINING CYRILLIC LETTER DJERV;Mn;230;NSM;;;;;N;;;;; -2DF9;COMBINING CYRILLIC LETTER MONOGRAPH UK;Mn;230;NSM;;;;;N;;;;; -2DFA;COMBINING CYRILLIC LETTER YAT;Mn;230;NSM;;;;;N;;;;; -2DFB;COMBINING CYRILLIC LETTER YU;Mn;230;NSM;;;;;N;;;;; -2DFC;COMBINING CYRILLIC LETTER IOTIFIED A;Mn;230;NSM;;;;;N;;;;; -2DFD;COMBINING CYRILLIC LETTER LITTLE YUS;Mn;230;NSM;;;;;N;;;;; -2DFE;COMBINING CYRILLIC LETTER BIG YUS;Mn;230;NSM;;;;;N;;;;; -2DFF;COMBINING CYRILLIC LETTER IOTIFIED BIG YUS;Mn;230;NSM;;;;;N;;;;; -2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; -2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;; -2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; -2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;; -2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;; -2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;; -2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;; -2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;; -2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;; -2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;; -2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; -2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;; -2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;; -2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;; -2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;; -2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;; -2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;; -2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;; -2E18;INVERTED INTERROBANG;Po;0;ON;;;;;N;;;;; -2E19;PALM BRANCH;Po;0;ON;;;;;N;;;;; -2E1A;HYPHEN WITH DIAERESIS;Pd;0;ON;;;;;N;;;;; -2E1B;TILDE WITH RING ABOVE;Po;0;ON;;;;;N;;;;; -2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;; -2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;; -2E1E;TILDE WITH DOT ABOVE;Po;0;ON;;;;;N;;;;; -2E1F;TILDE WITH DOT BELOW;Po;0;ON;;;;;N;;;;; -2E20;LEFT VERTICAL BAR WITH QUILL;Pi;0;ON;;;;;Y;;;;; -2E21;RIGHT VERTICAL BAR WITH QUILL;Pf;0;ON;;;;;Y;;;;; -2E22;TOP LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; -2E23;TOP RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; -2E24;BOTTOM LEFT HALF BRACKET;Ps;0;ON;;;;;Y;;;;; -2E25;BOTTOM RIGHT HALF BRACKET;Pe;0;ON;;;;;Y;;;;; -2E26;LEFT SIDEWAYS U BRACKET;Ps;0;ON;;;;;Y;;;;; -2E27;RIGHT SIDEWAYS U BRACKET;Pe;0;ON;;;;;Y;;;;; -2E28;LEFT DOUBLE PARENTHESIS;Ps;0;ON;;;;;Y;;;;; -2E29;RIGHT DOUBLE PARENTHESIS;Pe;0;ON;;;;;Y;;;;; -2E2A;TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2E2B;ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; -2E2C;SQUARED FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -2E2D;FIVE DOT MARK;Po;0;ON;;;;;N;;;;; -2E2E;REVERSED QUESTION MARK;Po;0;ON;;;;;N;;;;; -2E2F;VERTICAL TILDE;Lm;0;ON;;;;;N;;;;; -2E30;RING POINT;Po;0;ON;;;;;N;;;;; -2E31;WORD SEPARATOR MIDDLE DOT;Po;0;ON;;;;;N;;;;; -2E32;TURNED COMMA;Po;0;ON;;;;;N;;;;; -2E33;RAISED DOT;Po;0;ON;;;;;N;;;;; -2E34;RAISED COMMA;Po;0;ON;;;;;N;;;;; -2E35;TURNED SEMICOLON;Po;0;ON;;;;;N;;;;; -2E36;DAGGER WITH LEFT GUARD;Po;0;ON;;;;;N;;;;; -2E37;DAGGER WITH RIGHT GUARD;Po;0;ON;;;;;N;;;;; -2E38;TURNED DAGGER;Po;0;ON;;;;;N;;;;; -2E39;TOP HALF SECTION SIGN;Po;0;ON;;;;;N;;;;; -2E3A;TWO-EM DASH;Pd;0;ON;;;;;N;;;;; -2E3B;THREE-EM DASH;Pd;0;ON;;;;;N;;;;; -2E3C;STENOGRAPHIC FULL STOP;Po;0;ON;;;;;N;;;;; -2E3D;VERTICAL SIX DOTS;Po;0;ON;;;;;N;;;;; -2E3E;WIGGLY VERTICAL LINE;Po;0;ON;;;;;N;;;;; -2E3F;CAPITULUM;Po;0;ON;;;;;N;;;;; -2E40;DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; -2E41;REVERSED COMMA;Po;0;ON;;;;;N;;;;; -2E42;DOUBLE LOW-REVERSED-9 QUOTATION MARK;Ps;0;ON;;;;;N;;;;; -2E80;CJK RADICAL REPEAT;So;0;ON;;;;;N;;;;; -2E81;CJK RADICAL CLIFF;So;0;ON;;;;;N;;;;; -2E82;CJK RADICAL SECOND ONE;So;0;ON;;;;;N;;;;; -2E83;CJK RADICAL SECOND TWO;So;0;ON;;;;;N;;;;; -2E84;CJK RADICAL SECOND THREE;So;0;ON;;;;;N;;;;; -2E85;CJK RADICAL PERSON;So;0;ON;;;;;N;;;;; -2E86;CJK RADICAL BOX;So;0;ON;;;;;N;;;;; -2E87;CJK RADICAL TABLE;So;0;ON;;;;;N;;;;; -2E88;CJK RADICAL KNIFE ONE;So;0;ON;;;;;N;;;;; -2E89;CJK RADICAL KNIFE TWO;So;0;ON;;;;;N;;;;; -2E8A;CJK RADICAL DIVINATION;So;0;ON;;;;;N;;;;; -2E8B;CJK RADICAL SEAL;So;0;ON;;;;;N;;;;; -2E8C;CJK RADICAL SMALL ONE;So;0;ON;;;;;N;;;;; -2E8D;CJK RADICAL SMALL TWO;So;0;ON;;;;;N;;;;; -2E8E;CJK RADICAL LAME ONE;So;0;ON;;;;;N;;;;; -2E8F;CJK RADICAL LAME TWO;So;0;ON;;;;;N;;;;; -2E90;CJK RADICAL LAME THREE;So;0;ON;;;;;N;;;;; -2E91;CJK RADICAL LAME FOUR;So;0;ON;;;;;N;;;;; -2E92;CJK RADICAL SNAKE;So;0;ON;;;;;N;;;;; -2E93;CJK RADICAL THREAD;So;0;ON;;;;;N;;;;; -2E94;CJK RADICAL SNOUT ONE;So;0;ON;;;;;N;;;;; -2E95;CJK RADICAL SNOUT TWO;So;0;ON;;;;;N;;;;; -2E96;CJK RADICAL HEART ONE;So;0;ON;;;;;N;;;;; -2E97;CJK RADICAL HEART TWO;So;0;ON;;;;;N;;;;; -2E98;CJK RADICAL HAND;So;0;ON;;;;;N;;;;; -2E99;CJK RADICAL RAP;So;0;ON;;;;;N;;;;; -2E9B;CJK RADICAL CHOKE;So;0;ON;;;;;N;;;;; -2E9C;CJK RADICAL SUN;So;0;ON;;;;;N;;;;; -2E9D;CJK RADICAL MOON;So;0;ON;;;;;N;;;;; -2E9E;CJK RADICAL DEATH;So;0;ON;;;;;N;;;;; -2E9F;CJK RADICAL MOTHER;So;0;ON; 6BCD;;;;N;;;;; -2EA0;CJK RADICAL CIVILIAN;So;0;ON;;;;;N;;;;; -2EA1;CJK RADICAL WATER ONE;So;0;ON;;;;;N;;;;; -2EA2;CJK RADICAL WATER TWO;So;0;ON;;;;;N;;;;; -2EA3;CJK RADICAL FIRE;So;0;ON;;;;;N;;;;; -2EA4;CJK RADICAL PAW ONE;So;0;ON;;;;;N;;;;; -2EA5;CJK RADICAL PAW TWO;So;0;ON;;;;;N;;;;; -2EA6;CJK RADICAL SIMPLIFIED HALF TREE TRUNK;So;0;ON;;;;;N;;;;; -2EA7;CJK RADICAL COW;So;0;ON;;;;;N;;;;; -2EA8;CJK RADICAL DOG;So;0;ON;;;;;N;;;;; -2EA9;CJK RADICAL JADE;So;0;ON;;;;;N;;;;; -2EAA;CJK RADICAL BOLT OF CLOTH;So;0;ON;;;;;N;;;;; -2EAB;CJK RADICAL EYE;So;0;ON;;;;;N;;;;; -2EAC;CJK RADICAL SPIRIT ONE;So;0;ON;;;;;N;;;;; -2EAD;CJK RADICAL SPIRIT TWO;So;0;ON;;;;;N;;;;; -2EAE;CJK RADICAL BAMBOO;So;0;ON;;;;;N;;;;; -2EAF;CJK RADICAL SILK;So;0;ON;;;;;N;;;;; -2EB0;CJK RADICAL C-SIMPLIFIED SILK;So;0;ON;;;;;N;;;;; -2EB1;CJK RADICAL NET ONE;So;0;ON;;;;;N;;;;; -2EB2;CJK RADICAL NET TWO;So;0;ON;;;;;N;;;;; -2EB3;CJK RADICAL NET THREE;So;0;ON;;;;;N;;;;; -2EB4;CJK RADICAL NET FOUR;So;0;ON;;;;;N;;;;; -2EB5;CJK RADICAL MESH;So;0;ON;;;;;N;;;;; -2EB6;CJK RADICAL SHEEP;So;0;ON;;;;;N;;;;; -2EB7;CJK RADICAL RAM;So;0;ON;;;;;N;;;;; -2EB8;CJK RADICAL EWE;So;0;ON;;;;;N;;;;; -2EB9;CJK RADICAL OLD;So;0;ON;;;;;N;;;;; -2EBA;CJK RADICAL BRUSH ONE;So;0;ON;;;;;N;;;;; -2EBB;CJK RADICAL BRUSH TWO;So;0;ON;;;;;N;;;;; -2EBC;CJK RADICAL MEAT;So;0;ON;;;;;N;;;;; -2EBD;CJK RADICAL MORTAR;So;0;ON;;;;;N;;;;; -2EBE;CJK RADICAL GRASS ONE;So;0;ON;;;;;N;;;;; -2EBF;CJK RADICAL GRASS TWO;So;0;ON;;;;;N;;;;; -2EC0;CJK RADICAL GRASS THREE;So;0;ON;;;;;N;;;;; -2EC1;CJK RADICAL TIGER;So;0;ON;;;;;N;;;;; -2EC2;CJK RADICAL CLOTHES;So;0;ON;;;;;N;;;;; -2EC3;CJK RADICAL WEST ONE;So;0;ON;;;;;N;;;;; -2EC4;CJK RADICAL WEST TWO;So;0;ON;;;;;N;;;;; -2EC5;CJK RADICAL C-SIMPLIFIED SEE;So;0;ON;;;;;N;;;;; -2EC6;CJK RADICAL SIMPLIFIED HORN;So;0;ON;;;;;N;;;;; -2EC7;CJK RADICAL HORN;So;0;ON;;;;;N;;;;; -2EC8;CJK RADICAL C-SIMPLIFIED SPEECH;So;0;ON;;;;;N;;;;; -2EC9;CJK RADICAL C-SIMPLIFIED SHELL;So;0;ON;;;;;N;;;;; -2ECA;CJK RADICAL FOOT;So;0;ON;;;;;N;;;;; -2ECB;CJK RADICAL C-SIMPLIFIED CART;So;0;ON;;;;;N;;;;; -2ECC;CJK RADICAL SIMPLIFIED WALK;So;0;ON;;;;;N;;;;; -2ECD;CJK RADICAL WALK ONE;So;0;ON;;;;;N;;;;; -2ECE;CJK RADICAL WALK TWO;So;0;ON;;;;;N;;;;; -2ECF;CJK RADICAL CITY;So;0;ON;;;;;N;;;;; -2ED0;CJK RADICAL C-SIMPLIFIED GOLD;So;0;ON;;;;;N;;;;; -2ED1;CJK RADICAL LONG ONE;So;0;ON;;;;;N;;;;; -2ED2;CJK RADICAL LONG TWO;So;0;ON;;;;;N;;;;; -2ED3;CJK RADICAL C-SIMPLIFIED LONG;So;0;ON;;;;;N;;;;; -2ED4;CJK RADICAL C-SIMPLIFIED GATE;So;0;ON;;;;;N;;;;; -2ED5;CJK RADICAL MOUND ONE;So;0;ON;;;;;N;;;;; -2ED6;CJK RADICAL MOUND TWO;So;0;ON;;;;;N;;;;; -2ED7;CJK RADICAL RAIN;So;0;ON;;;;;N;;;;; -2ED8;CJK RADICAL BLUE;So;0;ON;;;;;N;;;;; -2ED9;CJK RADICAL C-SIMPLIFIED TANNED LEATHER;So;0;ON;;;;;N;;;;; -2EDA;CJK RADICAL C-SIMPLIFIED LEAF;So;0;ON;;;;;N;;;;; -2EDB;CJK RADICAL C-SIMPLIFIED WIND;So;0;ON;;;;;N;;;;; -2EDC;CJK RADICAL C-SIMPLIFIED FLY;So;0;ON;;;;;N;;;;; -2EDD;CJK RADICAL EAT ONE;So;0;ON;;;;;N;;;;; -2EDE;CJK RADICAL EAT TWO;So;0;ON;;;;;N;;;;; -2EDF;CJK RADICAL EAT THREE;So;0;ON;;;;;N;;;;; -2EE0;CJK RADICAL C-SIMPLIFIED EAT;So;0;ON;;;;;N;;;;; -2EE1;CJK RADICAL HEAD;So;0;ON;;;;;N;;;;; -2EE2;CJK RADICAL C-SIMPLIFIED HORSE;So;0;ON;;;;;N;;;;; -2EE3;CJK RADICAL BONE;So;0;ON;;;;;N;;;;; -2EE4;CJK RADICAL GHOST;So;0;ON;;;;;N;;;;; -2EE5;CJK RADICAL C-SIMPLIFIED FISH;So;0;ON;;;;;N;;;;; -2EE6;CJK RADICAL C-SIMPLIFIED BIRD;So;0;ON;;;;;N;;;;; -2EE7;CJK RADICAL C-SIMPLIFIED SALT;So;0;ON;;;;;N;;;;; -2EE8;CJK RADICAL SIMPLIFIED WHEAT;So;0;ON;;;;;N;;;;; -2EE9;CJK RADICAL SIMPLIFIED YELLOW;So;0;ON;;;;;N;;;;; -2EEA;CJK RADICAL C-SIMPLIFIED FROG;So;0;ON;;;;;N;;;;; -2EEB;CJK RADICAL J-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; -2EEC;CJK RADICAL C-SIMPLIFIED EVEN;So;0;ON;;;;;N;;;;; -2EED;CJK RADICAL J-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; -2EEE;CJK RADICAL C-SIMPLIFIED TOOTH;So;0;ON;;;;;N;;;;; -2EEF;CJK RADICAL J-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; -2EF0;CJK RADICAL C-SIMPLIFIED DRAGON;So;0;ON;;;;;N;;;;; -2EF1;CJK RADICAL TURTLE;So;0;ON;;;;;N;;;;; -2EF2;CJK RADICAL J-SIMPLIFIED TURTLE;So;0;ON;;;;;N;;;;; -2EF3;CJK RADICAL C-SIMPLIFIED TURTLE;So;0;ON; 9F9F;;;;N;;;;; -2F00;KANGXI RADICAL ONE;So;0;ON; 4E00;;;;N;;;;; -2F01;KANGXI RADICAL LINE;So;0;ON; 4E28;;;;N;;;;; -2F02;KANGXI RADICAL DOT;So;0;ON; 4E36;;;;N;;;;; -2F03;KANGXI RADICAL SLASH;So;0;ON; 4E3F;;;;N;;;;; -2F04;KANGXI RADICAL SECOND;So;0;ON; 4E59;;;;N;;;;; -2F05;KANGXI RADICAL HOOK;So;0;ON; 4E85;;;;N;;;;; -2F06;KANGXI RADICAL TWO;So;0;ON; 4E8C;;;;N;;;;; -2F07;KANGXI RADICAL LID;So;0;ON; 4EA0;;;;N;;;;; -2F08;KANGXI RADICAL MAN;So;0;ON; 4EBA;;;;N;;;;; -2F09;KANGXI RADICAL LEGS;So;0;ON; 513F;;;;N;;;;; -2F0A;KANGXI RADICAL ENTER;So;0;ON; 5165;;;;N;;;;; -2F0B;KANGXI RADICAL EIGHT;So;0;ON; 516B;;;;N;;;;; -2F0C;KANGXI RADICAL DOWN BOX;So;0;ON; 5182;;;;N;;;;; -2F0D;KANGXI RADICAL COVER;So;0;ON; 5196;;;;N;;;;; -2F0E;KANGXI RADICAL ICE;So;0;ON; 51AB;;;;N;;;;; -2F0F;KANGXI RADICAL TABLE;So;0;ON; 51E0;;;;N;;;;; -2F10;KANGXI RADICAL OPEN BOX;So;0;ON; 51F5;;;;N;;;;; -2F11;KANGXI RADICAL KNIFE;So;0;ON; 5200;;;;N;;;;; -2F12;KANGXI RADICAL POWER;So;0;ON; 529B;;;;N;;;;; -2F13;KANGXI RADICAL WRAP;So;0;ON; 52F9;;;;N;;;;; -2F14;KANGXI RADICAL SPOON;So;0;ON; 5315;;;;N;;;;; -2F15;KANGXI RADICAL RIGHT OPEN BOX;So;0;ON; 531A;;;;N;;;;; -2F16;KANGXI RADICAL HIDING ENCLOSURE;So;0;ON; 5338;;;;N;;;;; -2F17;KANGXI RADICAL TEN;So;0;ON; 5341;;;;N;;;;; -2F18;KANGXI RADICAL DIVINATION;So;0;ON; 535C;;;;N;;;;; -2F19;KANGXI RADICAL SEAL;So;0;ON; 5369;;;;N;;;;; -2F1A;KANGXI RADICAL CLIFF;So;0;ON; 5382;;;;N;;;;; -2F1B;KANGXI RADICAL PRIVATE;So;0;ON; 53B6;;;;N;;;;; -2F1C;KANGXI RADICAL AGAIN;So;0;ON; 53C8;;;;N;;;;; -2F1D;KANGXI RADICAL MOUTH;So;0;ON; 53E3;;;;N;;;;; -2F1E;KANGXI RADICAL ENCLOSURE;So;0;ON; 56D7;;;;N;;;;; -2F1F;KANGXI RADICAL EARTH;So;0;ON; 571F;;;;N;;;;; -2F20;KANGXI RADICAL SCHOLAR;So;0;ON; 58EB;;;;N;;;;; -2F21;KANGXI RADICAL GO;So;0;ON; 5902;;;;N;;;;; -2F22;KANGXI RADICAL GO SLOWLY;So;0;ON; 590A;;;;N;;;;; -2F23;KANGXI RADICAL EVENING;So;0;ON; 5915;;;;N;;;;; -2F24;KANGXI RADICAL BIG;So;0;ON; 5927;;;;N;;;;; -2F25;KANGXI RADICAL WOMAN;So;0;ON; 5973;;;;N;;;;; -2F26;KANGXI RADICAL CHILD;So;0;ON; 5B50;;;;N;;;;; -2F27;KANGXI RADICAL ROOF;So;0;ON; 5B80;;;;N;;;;; -2F28;KANGXI RADICAL INCH;So;0;ON; 5BF8;;;;N;;;;; -2F29;KANGXI RADICAL SMALL;So;0;ON; 5C0F;;;;N;;;;; -2F2A;KANGXI RADICAL LAME;So;0;ON; 5C22;;;;N;;;;; -2F2B;KANGXI RADICAL CORPSE;So;0;ON; 5C38;;;;N;;;;; -2F2C;KANGXI RADICAL SPROUT;So;0;ON; 5C6E;;;;N;;;;; -2F2D;KANGXI RADICAL MOUNTAIN;So;0;ON; 5C71;;;;N;;;;; -2F2E;KANGXI RADICAL RIVER;So;0;ON; 5DDB;;;;N;;;;; -2F2F;KANGXI RADICAL WORK;So;0;ON; 5DE5;;;;N;;;;; -2F30;KANGXI RADICAL ONESELF;So;0;ON; 5DF1;;;;N;;;;; -2F31;KANGXI RADICAL TURBAN;So;0;ON; 5DFE;;;;N;;;;; -2F32;KANGXI RADICAL DRY;So;0;ON; 5E72;;;;N;;;;; -2F33;KANGXI RADICAL SHORT THREAD;So;0;ON; 5E7A;;;;N;;;;; -2F34;KANGXI RADICAL DOTTED CLIFF;So;0;ON; 5E7F;;;;N;;;;; -2F35;KANGXI RADICAL LONG STRIDE;So;0;ON; 5EF4;;;;N;;;;; -2F36;KANGXI RADICAL TWO HANDS;So;0;ON; 5EFE;;;;N;;;;; -2F37;KANGXI RADICAL SHOOT;So;0;ON; 5F0B;;;;N;;;;; -2F38;KANGXI RADICAL BOW;So;0;ON; 5F13;;;;N;;;;; -2F39;KANGXI RADICAL SNOUT;So;0;ON; 5F50;;;;N;;;;; -2F3A;KANGXI RADICAL BRISTLE;So;0;ON; 5F61;;;;N;;;;; -2F3B;KANGXI RADICAL STEP;So;0;ON; 5F73;;;;N;;;;; -2F3C;KANGXI RADICAL HEART;So;0;ON; 5FC3;;;;N;;;;; -2F3D;KANGXI RADICAL HALBERD;So;0;ON; 6208;;;;N;;;;; -2F3E;KANGXI RADICAL DOOR;So;0;ON; 6236;;;;N;;;;; -2F3F;KANGXI RADICAL HAND;So;0;ON; 624B;;;;N;;;;; -2F40;KANGXI RADICAL BRANCH;So;0;ON; 652F;;;;N;;;;; -2F41;KANGXI RADICAL RAP;So;0;ON; 6534;;;;N;;;;; -2F42;KANGXI RADICAL SCRIPT;So;0;ON; 6587;;;;N;;;;; -2F43;KANGXI RADICAL DIPPER;So;0;ON; 6597;;;;N;;;;; -2F44;KANGXI RADICAL AXE;So;0;ON; 65A4;;;;N;;;;; -2F45;KANGXI RADICAL SQUARE;So;0;ON; 65B9;;;;N;;;;; -2F46;KANGXI RADICAL NOT;So;0;ON; 65E0;;;;N;;;;; -2F47;KANGXI RADICAL SUN;So;0;ON; 65E5;;;;N;;;;; -2F48;KANGXI RADICAL SAY;So;0;ON; 66F0;;;;N;;;;; -2F49;KANGXI RADICAL MOON;So;0;ON; 6708;;;;N;;;;; -2F4A;KANGXI RADICAL TREE;So;0;ON; 6728;;;;N;;;;; -2F4B;KANGXI RADICAL LACK;So;0;ON; 6B20;;;;N;;;;; -2F4C;KANGXI RADICAL STOP;So;0;ON; 6B62;;;;N;;;;; -2F4D;KANGXI RADICAL DEATH;So;0;ON; 6B79;;;;N;;;;; -2F4E;KANGXI RADICAL WEAPON;So;0;ON; 6BB3;;;;N;;;;; -2F4F;KANGXI RADICAL DO NOT;So;0;ON; 6BCB;;;;N;;;;; -2F50;KANGXI RADICAL COMPARE;So;0;ON; 6BD4;;;;N;;;;; -2F51;KANGXI RADICAL FUR;So;0;ON; 6BDB;;;;N;;;;; -2F52;KANGXI RADICAL CLAN;So;0;ON; 6C0F;;;;N;;;;; -2F53;KANGXI RADICAL STEAM;So;0;ON; 6C14;;;;N;;;;; -2F54;KANGXI RADICAL WATER;So;0;ON; 6C34;;;;N;;;;; -2F55;KANGXI RADICAL FIRE;So;0;ON; 706B;;;;N;;;;; -2F56;KANGXI RADICAL CLAW;So;0;ON; 722A;;;;N;;;;; -2F57;KANGXI RADICAL FATHER;So;0;ON; 7236;;;;N;;;;; -2F58;KANGXI RADICAL DOUBLE X;So;0;ON; 723B;;;;N;;;;; -2F59;KANGXI RADICAL HALF TREE TRUNK;So;0;ON; 723F;;;;N;;;;; -2F5A;KANGXI RADICAL SLICE;So;0;ON; 7247;;;;N;;;;; -2F5B;KANGXI RADICAL FANG;So;0;ON; 7259;;;;N;;;;; -2F5C;KANGXI RADICAL COW;So;0;ON; 725B;;;;N;;;;; -2F5D;KANGXI RADICAL DOG;So;0;ON; 72AC;;;;N;;;;; -2F5E;KANGXI RADICAL PROFOUND;So;0;ON; 7384;;;;N;;;;; -2F5F;KANGXI RADICAL JADE;So;0;ON; 7389;;;;N;;;;; -2F60;KANGXI RADICAL MELON;So;0;ON; 74DC;;;;N;;;;; -2F61;KANGXI RADICAL TILE;So;0;ON; 74E6;;;;N;;;;; -2F62;KANGXI RADICAL SWEET;So;0;ON; 7518;;;;N;;;;; -2F63;KANGXI RADICAL LIFE;So;0;ON; 751F;;;;N;;;;; -2F64;KANGXI RADICAL USE;So;0;ON; 7528;;;;N;;;;; -2F65;KANGXI RADICAL FIELD;So;0;ON; 7530;;;;N;;;;; -2F66;KANGXI RADICAL BOLT OF CLOTH;So;0;ON; 758B;;;;N;;;;; -2F67;KANGXI RADICAL SICKNESS;So;0;ON; 7592;;;;N;;;;; -2F68;KANGXI RADICAL DOTTED TENT;So;0;ON; 7676;;;;N;;;;; -2F69;KANGXI RADICAL WHITE;So;0;ON; 767D;;;;N;;;;; -2F6A;KANGXI RADICAL SKIN;So;0;ON; 76AE;;;;N;;;;; -2F6B;KANGXI RADICAL DISH;So;0;ON; 76BF;;;;N;;;;; -2F6C;KANGXI RADICAL EYE;So;0;ON; 76EE;;;;N;;;;; -2F6D;KANGXI RADICAL SPEAR;So;0;ON; 77DB;;;;N;;;;; -2F6E;KANGXI RADICAL ARROW;So;0;ON; 77E2;;;;N;;;;; -2F6F;KANGXI RADICAL STONE;So;0;ON; 77F3;;;;N;;;;; -2F70;KANGXI RADICAL SPIRIT;So;0;ON; 793A;;;;N;;;;; -2F71;KANGXI RADICAL TRACK;So;0;ON; 79B8;;;;N;;;;; -2F72;KANGXI RADICAL GRAIN;So;0;ON; 79BE;;;;N;;;;; -2F73;KANGXI RADICAL CAVE;So;0;ON; 7A74;;;;N;;;;; -2F74;KANGXI RADICAL STAND;So;0;ON; 7ACB;;;;N;;;;; -2F75;KANGXI RADICAL BAMBOO;So;0;ON; 7AF9;;;;N;;;;; -2F76;KANGXI RADICAL RICE;So;0;ON; 7C73;;;;N;;;;; -2F77;KANGXI RADICAL SILK;So;0;ON; 7CF8;;;;N;;;;; -2F78;KANGXI RADICAL JAR;So;0;ON; 7F36;;;;N;;;;; -2F79;KANGXI RADICAL NET;So;0;ON; 7F51;;;;N;;;;; -2F7A;KANGXI RADICAL SHEEP;So;0;ON; 7F8A;;;;N;;;;; -2F7B;KANGXI RADICAL FEATHER;So;0;ON; 7FBD;;;;N;;;;; -2F7C;KANGXI RADICAL OLD;So;0;ON; 8001;;;;N;;;;; -2F7D;KANGXI RADICAL AND;So;0;ON; 800C;;;;N;;;;; -2F7E;KANGXI RADICAL PLOW;So;0;ON; 8012;;;;N;;;;; -2F7F;KANGXI RADICAL EAR;So;0;ON; 8033;;;;N;;;;; -2F80;KANGXI RADICAL BRUSH;So;0;ON; 807F;;;;N;;;;; -2F81;KANGXI RADICAL MEAT;So;0;ON; 8089;;;;N;;;;; -2F82;KANGXI RADICAL MINISTER;So;0;ON; 81E3;;;;N;;;;; -2F83;KANGXI RADICAL SELF;So;0;ON; 81EA;;;;N;;;;; -2F84;KANGXI RADICAL ARRIVE;So;0;ON; 81F3;;;;N;;;;; -2F85;KANGXI RADICAL MORTAR;So;0;ON; 81FC;;;;N;;;;; -2F86;KANGXI RADICAL TONGUE;So;0;ON; 820C;;;;N;;;;; -2F87;KANGXI RADICAL OPPOSE;So;0;ON; 821B;;;;N;;;;; -2F88;KANGXI RADICAL BOAT;So;0;ON; 821F;;;;N;;;;; -2F89;KANGXI RADICAL STOPPING;So;0;ON; 826E;;;;N;;;;; -2F8A;KANGXI RADICAL COLOR;So;0;ON; 8272;;;;N;;;;; -2F8B;KANGXI RADICAL GRASS;So;0;ON; 8278;;;;N;;;;; -2F8C;KANGXI RADICAL TIGER;So;0;ON; 864D;;;;N;;;;; -2F8D;KANGXI RADICAL INSECT;So;0;ON; 866B;;;;N;;;;; -2F8E;KANGXI RADICAL BLOOD;So;0;ON; 8840;;;;N;;;;; -2F8F;KANGXI RADICAL WALK ENCLOSURE;So;0;ON; 884C;;;;N;;;;; -2F90;KANGXI RADICAL CLOTHES;So;0;ON; 8863;;;;N;;;;; -2F91;KANGXI RADICAL WEST;So;0;ON; 897E;;;;N;;;;; -2F92;KANGXI RADICAL SEE;So;0;ON; 898B;;;;N;;;;; -2F93;KANGXI RADICAL HORN;So;0;ON; 89D2;;;;N;;;;; -2F94;KANGXI RADICAL SPEECH;So;0;ON; 8A00;;;;N;;;;; -2F95;KANGXI RADICAL VALLEY;So;0;ON; 8C37;;;;N;;;;; -2F96;KANGXI RADICAL BEAN;So;0;ON; 8C46;;;;N;;;;; -2F97;KANGXI RADICAL PIG;So;0;ON; 8C55;;;;N;;;;; -2F98;KANGXI RADICAL BADGER;So;0;ON; 8C78;;;;N;;;;; -2F99;KANGXI RADICAL SHELL;So;0;ON; 8C9D;;;;N;;;;; -2F9A;KANGXI RADICAL RED;So;0;ON; 8D64;;;;N;;;;; -2F9B;KANGXI RADICAL RUN;So;0;ON; 8D70;;;;N;;;;; -2F9C;KANGXI RADICAL FOOT;So;0;ON; 8DB3;;;;N;;;;; -2F9D;KANGXI RADICAL BODY;So;0;ON; 8EAB;;;;N;;;;; -2F9E;KANGXI RADICAL CART;So;0;ON; 8ECA;;;;N;;;;; -2F9F;KANGXI RADICAL BITTER;So;0;ON; 8F9B;;;;N;;;;; -2FA0;KANGXI RADICAL MORNING;So;0;ON; 8FB0;;;;N;;;;; -2FA1;KANGXI RADICAL WALK;So;0;ON; 8FB5;;;;N;;;;; -2FA2;KANGXI RADICAL CITY;So;0;ON; 9091;;;;N;;;;; -2FA3;KANGXI RADICAL WINE;So;0;ON; 9149;;;;N;;;;; -2FA4;KANGXI RADICAL DISTINGUISH;So;0;ON; 91C6;;;;N;;;;; -2FA5;KANGXI RADICAL VILLAGE;So;0;ON; 91CC;;;;N;;;;; -2FA6;KANGXI RADICAL GOLD;So;0;ON; 91D1;;;;N;;;;; -2FA7;KANGXI RADICAL LONG;So;0;ON; 9577;;;;N;;;;; -2FA8;KANGXI RADICAL GATE;So;0;ON; 9580;;;;N;;;;; -2FA9;KANGXI RADICAL MOUND;So;0;ON; 961C;;;;N;;;;; -2FAA;KANGXI RADICAL SLAVE;So;0;ON; 96B6;;;;N;;;;; -2FAB;KANGXI RADICAL SHORT TAILED BIRD;So;0;ON; 96B9;;;;N;;;;; -2FAC;KANGXI RADICAL RAIN;So;0;ON; 96E8;;;;N;;;;; -2FAD;KANGXI RADICAL BLUE;So;0;ON; 9751;;;;N;;;;; -2FAE;KANGXI RADICAL WRONG;So;0;ON; 975E;;;;N;;;;; -2FAF;KANGXI RADICAL FACE;So;0;ON; 9762;;;;N;;;;; -2FB0;KANGXI RADICAL LEATHER;So;0;ON; 9769;;;;N;;;;; -2FB1;KANGXI RADICAL TANNED LEATHER;So;0;ON; 97CB;;;;N;;;;; -2FB2;KANGXI RADICAL LEEK;So;0;ON; 97ED;;;;N;;;;; -2FB3;KANGXI RADICAL SOUND;So;0;ON; 97F3;;;;N;;;;; -2FB4;KANGXI RADICAL LEAF;So;0;ON; 9801;;;;N;;;;; -2FB5;KANGXI RADICAL WIND;So;0;ON; 98A8;;;;N;;;;; -2FB6;KANGXI RADICAL FLY;So;0;ON; 98DB;;;;N;;;;; -2FB7;KANGXI RADICAL EAT;So;0;ON; 98DF;;;;N;;;;; -2FB8;KANGXI RADICAL HEAD;So;0;ON; 9996;;;;N;;;;; -2FB9;KANGXI RADICAL FRAGRANT;So;0;ON; 9999;;;;N;;;;; -2FBA;KANGXI RADICAL HORSE;So;0;ON; 99AC;;;;N;;;;; -2FBB;KANGXI RADICAL BONE;So;0;ON; 9AA8;;;;N;;;;; -2FBC;KANGXI RADICAL TALL;So;0;ON; 9AD8;;;;N;;;;; -2FBD;KANGXI RADICAL HAIR;So;0;ON; 9ADF;;;;N;;;;; -2FBE;KANGXI RADICAL FIGHT;So;0;ON; 9B25;;;;N;;;;; -2FBF;KANGXI RADICAL SACRIFICIAL WINE;So;0;ON; 9B2F;;;;N;;;;; -2FC0;KANGXI RADICAL CAULDRON;So;0;ON; 9B32;;;;N;;;;; -2FC1;KANGXI RADICAL GHOST;So;0;ON; 9B3C;;;;N;;;;; -2FC2;KANGXI RADICAL FISH;So;0;ON; 9B5A;;;;N;;;;; -2FC3;KANGXI RADICAL BIRD;So;0;ON; 9CE5;;;;N;;;;; -2FC4;KANGXI RADICAL SALT;So;0;ON; 9E75;;;;N;;;;; -2FC5;KANGXI RADICAL DEER;So;0;ON; 9E7F;;;;N;;;;; -2FC6;KANGXI RADICAL WHEAT;So;0;ON; 9EA5;;;;N;;;;; -2FC7;KANGXI RADICAL HEMP;So;0;ON; 9EBB;;;;N;;;;; -2FC8;KANGXI RADICAL YELLOW;So;0;ON; 9EC3;;;;N;;;;; -2FC9;KANGXI RADICAL MILLET;So;0;ON; 9ECD;;;;N;;;;; -2FCA;KANGXI RADICAL BLACK;So;0;ON; 9ED1;;;;N;;;;; -2FCB;KANGXI RADICAL EMBROIDERY;So;0;ON; 9EF9;;;;N;;;;; -2FCC;KANGXI RADICAL FROG;So;0;ON; 9EFD;;;;N;;;;; -2FCD;KANGXI RADICAL TRIPOD;So;0;ON; 9F0E;;;;N;;;;; -2FCE;KANGXI RADICAL DRUM;So;0;ON; 9F13;;;;N;;;;; -2FCF;KANGXI RADICAL RAT;So;0;ON; 9F20;;;;N;;;;; -2FD0;KANGXI RADICAL NOSE;So;0;ON; 9F3B;;;;N;;;;; -2FD1;KANGXI RADICAL EVEN;So;0;ON; 9F4A;;;;N;;;;; -2FD2;KANGXI RADICAL TOOTH;So;0;ON; 9F52;;;;N;;;;; -2FD3;KANGXI RADICAL DRAGON;So;0;ON; 9F8D;;;;N;;;;; -2FD4;KANGXI RADICAL TURTLE;So;0;ON; 9F9C;;;;N;;;;; -2FD5;KANGXI RADICAL FLUTE;So;0;ON; 9FA0;;;;N;;;;; -2FF0;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT;So;0;ON;;;;;N;;;;; -2FF1;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW;So;0;ON;;;;;N;;;;; -2FF2;IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT;So;0;ON;;;;;N;;;;; -2FF3;IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW;So;0;ON;;;;;N;;;;; -2FF4;IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND;So;0;ON;;;;;N;;;;; -2FF5;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE;So;0;ON;;;;;N;;;;; -2FF6;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW;So;0;ON;;;;;N;;;;; -2FF7;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT;So;0;ON;;;;;N;;;;; -2FF8;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT;So;0;ON;;;;;N;;;;; -2FF9;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT;So;0;ON;;;;;N;;;;; -2FFA;IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT;So;0;ON;;;;;N;;;;; -2FFB;IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID;So;0;ON;;;;;N;;;;; -3000;IDEOGRAPHIC SPACE;Zs;0;WS; 0020;;;;N;;;;; -3001;IDEOGRAPHIC COMMA;Po;0;ON;;;;;N;;;;; -3002;IDEOGRAPHIC FULL STOP;Po;0;ON;;;;;N;IDEOGRAPHIC PERIOD;;;; -3003;DITTO MARK;Po;0;ON;;;;;N;;;;; -3004;JAPANESE INDUSTRIAL STANDARD SYMBOL;So;0;ON;;;;;N;;;;; -3005;IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; -3006;IDEOGRAPHIC CLOSING MARK;Lo;0;L;;;;;N;;;;; -3007;IDEOGRAPHIC NUMBER ZERO;Nl;0;L;;;;0;N;;;;; -3008;LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING ANGLE BRACKET;;;; -3009;RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING ANGLE BRACKET;;;; -300A;LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;OPENING DOUBLE ANGLE BRACKET;;;; -300B;RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;CLOSING DOUBLE ANGLE BRACKET;;;; -300C;LEFT CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING CORNER BRACKET;;;; -300D;RIGHT CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING CORNER BRACKET;;;; -300E;LEFT WHITE CORNER BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE CORNER BRACKET;;;; -300F;RIGHT WHITE CORNER BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE CORNER BRACKET;;;; -3010;LEFT BLACK LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING BLACK LENTICULAR BRACKET;;;; -3011;RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING BLACK LENTICULAR BRACKET;;;; -3012;POSTAL MARK;So;0;ON;;;;;N;;;;; -3013;GETA MARK;So;0;ON;;;;;N;;;;; -3014;LEFT TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING TORTOISE SHELL BRACKET;;;; -3015;RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING TORTOISE SHELL BRACKET;;;; -3016;LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE LENTICULAR BRACKET;;;; -3017;RIGHT WHITE LENTICULAR BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE LENTICULAR BRACKET;;;; -3018;LEFT WHITE TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE TORTOISE SHELL BRACKET;;;; -3019;RIGHT WHITE TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE TORTOISE SHELL BRACKET;;;; -301A;LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;OPENING WHITE SQUARE BRACKET;;;; -301B;RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;CLOSING WHITE SQUARE BRACKET;;;; -301C;WAVE DASH;Pd;0;ON;;;;;N;;;;; -301D;REVERSED DOUBLE PRIME QUOTATION MARK;Ps;0;ON;;;;;N;;;;; -301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; -301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;N;;;;; -3020;POSTAL MARK FACE;So;0;ON;;;;;N;;;;; -3021;HANGZHOU NUMERAL ONE;Nl;0;L;;;;1;N;;;;; -3022;HANGZHOU NUMERAL TWO;Nl;0;L;;;;2;N;;;;; -3023;HANGZHOU NUMERAL THREE;Nl;0;L;;;;3;N;;;;; -3024;HANGZHOU NUMERAL FOUR;Nl;0;L;;;;4;N;;;;; -3025;HANGZHOU NUMERAL FIVE;Nl;0;L;;;;5;N;;;;; -3026;HANGZHOU NUMERAL SIX;Nl;0;L;;;;6;N;;;;; -3027;HANGZHOU NUMERAL SEVEN;Nl;0;L;;;;7;N;;;;; -3028;HANGZHOU NUMERAL EIGHT;Nl;0;L;;;;8;N;;;;; -3029;HANGZHOU NUMERAL NINE;Nl;0;L;;;;9;N;;;;; -302A;IDEOGRAPHIC LEVEL TONE MARK;Mn;218;NSM;;;;;N;;;;; -302B;IDEOGRAPHIC RISING TONE MARK;Mn;228;NSM;;;;;N;;;;; -302C;IDEOGRAPHIC DEPARTING TONE MARK;Mn;232;NSM;;;;;N;;;;; -302D;IDEOGRAPHIC ENTERING TONE MARK;Mn;222;NSM;;;;;N;;;;; -302E;HANGUL SINGLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; -302F;HANGUL DOUBLE DOT TONE MARK;Mc;224;L;;;;;N;;;;; -3030;WAVY DASH;Pd;0;ON;;;;;N;;;;; -3031;VERTICAL KANA REPEAT MARK;Lm;0;L;;;;;N;;;;; -3032;VERTICAL KANA REPEAT WITH VOICED SOUND MARK;Lm;0;L;;;;;N;;;;; -3033;VERTICAL KANA REPEAT MARK UPPER HALF;Lm;0;L;;;;;N;;;;; -3034;VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF;Lm;0;L;;;;;N;;;;; -3035;VERTICAL KANA REPEAT MARK LOWER HALF;Lm;0;L;;;;;N;;;;; -3036;CIRCLED POSTAL MARK;So;0;ON; 3012;;;;N;;;;; -3037;IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL;So;0;ON;;;;;N;;;;; -3038;HANGZHOU NUMERAL TEN;Nl;0;L; 5341;;;10;N;;;;; -3039;HANGZHOU NUMERAL TWENTY;Nl;0;L; 5344;;;20;N;;;;; -303A;HANGZHOU NUMERAL THIRTY;Nl;0;L; 5345;;;30;N;;;;; -303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;; -303C;MASU MARK;Lo;0;L;;;;;N;;;;; -303D;PART ALTERNATION MARK;Po;0;ON;;;;;N;;;;; -303E;IDEOGRAPHIC VARIATION INDICATOR;So;0;ON;;;;;N;;;;; -303F;IDEOGRAPHIC HALF FILL SPACE;So;0;ON;;;;;N;;;;; -3041;HIRAGANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -3042;HIRAGANA LETTER A;Lo;0;L;;;;;N;;;;; -3043;HIRAGANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; -3044;HIRAGANA LETTER I;Lo;0;L;;;;;N;;;;; -3045;HIRAGANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; -3046;HIRAGANA LETTER U;Lo;0;L;;;;;N;;;;; -3047;HIRAGANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; -3048;HIRAGANA LETTER E;Lo;0;L;;;;;N;;;;; -3049;HIRAGANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; -304A;HIRAGANA LETTER O;Lo;0;L;;;;;N;;;;; -304B;HIRAGANA LETTER KA;Lo;0;L;;;;;N;;;;; -304C;HIRAGANA LETTER GA;Lo;0;L;304B 3099;;;;N;;;;; -304D;HIRAGANA LETTER KI;Lo;0;L;;;;;N;;;;; -304E;HIRAGANA LETTER GI;Lo;0;L;304D 3099;;;;N;;;;; -304F;HIRAGANA LETTER KU;Lo;0;L;;;;;N;;;;; -3050;HIRAGANA LETTER GU;Lo;0;L;304F 3099;;;;N;;;;; -3051;HIRAGANA LETTER KE;Lo;0;L;;;;;N;;;;; -3052;HIRAGANA LETTER GE;Lo;0;L;3051 3099;;;;N;;;;; -3053;HIRAGANA LETTER KO;Lo;0;L;;;;;N;;;;; -3054;HIRAGANA LETTER GO;Lo;0;L;3053 3099;;;;N;;;;; -3055;HIRAGANA LETTER SA;Lo;0;L;;;;;N;;;;; -3056;HIRAGANA LETTER ZA;Lo;0;L;3055 3099;;;;N;;;;; -3057;HIRAGANA LETTER SI;Lo;0;L;;;;;N;;;;; -3058;HIRAGANA LETTER ZI;Lo;0;L;3057 3099;;;;N;;;;; -3059;HIRAGANA LETTER SU;Lo;0;L;;;;;N;;;;; -305A;HIRAGANA LETTER ZU;Lo;0;L;3059 3099;;;;N;;;;; -305B;HIRAGANA LETTER SE;Lo;0;L;;;;;N;;;;; -305C;HIRAGANA LETTER ZE;Lo;0;L;305B 3099;;;;N;;;;; -305D;HIRAGANA LETTER SO;Lo;0;L;;;;;N;;;;; -305E;HIRAGANA LETTER ZO;Lo;0;L;305D 3099;;;;N;;;;; -305F;HIRAGANA LETTER TA;Lo;0;L;;;;;N;;;;; -3060;HIRAGANA LETTER DA;Lo;0;L;305F 3099;;;;N;;;;; -3061;HIRAGANA LETTER TI;Lo;0;L;;;;;N;;;;; -3062;HIRAGANA LETTER DI;Lo;0;L;3061 3099;;;;N;;;;; -3063;HIRAGANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; -3064;HIRAGANA LETTER TU;Lo;0;L;;;;;N;;;;; -3065;HIRAGANA LETTER DU;Lo;0;L;3064 3099;;;;N;;;;; -3066;HIRAGANA LETTER TE;Lo;0;L;;;;;N;;;;; -3067;HIRAGANA LETTER DE;Lo;0;L;3066 3099;;;;N;;;;; -3068;HIRAGANA LETTER TO;Lo;0;L;;;;;N;;;;; -3069;HIRAGANA LETTER DO;Lo;0;L;3068 3099;;;;N;;;;; -306A;HIRAGANA LETTER NA;Lo;0;L;;;;;N;;;;; -306B;HIRAGANA LETTER NI;Lo;0;L;;;;;N;;;;; -306C;HIRAGANA LETTER NU;Lo;0;L;;;;;N;;;;; -306D;HIRAGANA LETTER NE;Lo;0;L;;;;;N;;;;; -306E;HIRAGANA LETTER NO;Lo;0;L;;;;;N;;;;; -306F;HIRAGANA LETTER HA;Lo;0;L;;;;;N;;;;; -3070;HIRAGANA LETTER BA;Lo;0;L;306F 3099;;;;N;;;;; -3071;HIRAGANA LETTER PA;Lo;0;L;306F 309A;;;;N;;;;; -3072;HIRAGANA LETTER HI;Lo;0;L;;;;;N;;;;; -3073;HIRAGANA LETTER BI;Lo;0;L;3072 3099;;;;N;;;;; -3074;HIRAGANA LETTER PI;Lo;0;L;3072 309A;;;;N;;;;; -3075;HIRAGANA LETTER HU;Lo;0;L;;;;;N;;;;; -3076;HIRAGANA LETTER BU;Lo;0;L;3075 3099;;;;N;;;;; -3077;HIRAGANA LETTER PU;Lo;0;L;3075 309A;;;;N;;;;; -3078;HIRAGANA LETTER HE;Lo;0;L;;;;;N;;;;; -3079;HIRAGANA LETTER BE;Lo;0;L;3078 3099;;;;N;;;;; -307A;HIRAGANA LETTER PE;Lo;0;L;3078 309A;;;;N;;;;; -307B;HIRAGANA LETTER HO;Lo;0;L;;;;;N;;;;; -307C;HIRAGANA LETTER BO;Lo;0;L;307B 3099;;;;N;;;;; -307D;HIRAGANA LETTER PO;Lo;0;L;307B 309A;;;;N;;;;; -307E;HIRAGANA LETTER MA;Lo;0;L;;;;;N;;;;; -307F;HIRAGANA LETTER MI;Lo;0;L;;;;;N;;;;; -3080;HIRAGANA LETTER MU;Lo;0;L;;;;;N;;;;; -3081;HIRAGANA LETTER ME;Lo;0;L;;;;;N;;;;; -3082;HIRAGANA LETTER MO;Lo;0;L;;;;;N;;;;; -3083;HIRAGANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; -3084;HIRAGANA LETTER YA;Lo;0;L;;;;;N;;;;; -3085;HIRAGANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; -3086;HIRAGANA LETTER YU;Lo;0;L;;;;;N;;;;; -3087;HIRAGANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; -3088;HIRAGANA LETTER YO;Lo;0;L;;;;;N;;;;; -3089;HIRAGANA LETTER RA;Lo;0;L;;;;;N;;;;; -308A;HIRAGANA LETTER RI;Lo;0;L;;;;;N;;;;; -308B;HIRAGANA LETTER RU;Lo;0;L;;;;;N;;;;; -308C;HIRAGANA LETTER RE;Lo;0;L;;;;;N;;;;; -308D;HIRAGANA LETTER RO;Lo;0;L;;;;;N;;;;; -308E;HIRAGANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; -308F;HIRAGANA LETTER WA;Lo;0;L;;;;;N;;;;; -3090;HIRAGANA LETTER WI;Lo;0;L;;;;;N;;;;; -3091;HIRAGANA LETTER WE;Lo;0;L;;;;;N;;;;; -3092;HIRAGANA LETTER WO;Lo;0;L;;;;;N;;;;; -3093;HIRAGANA LETTER N;Lo;0;L;;;;;N;;;;; -3094;HIRAGANA LETTER VU;Lo;0;L;3046 3099;;;;N;;;;; -3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; -3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; -3099;COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA VOICED SOUND MARK;;;; -309A;COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Mn;8;NSM;;;;;N;NON-SPACING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;;;; -309B;KATAKANA-HIRAGANA VOICED SOUND MARK;Sk;0;ON; 0020 3099;;;;N;;;;; -309C;KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK;Sk;0;ON; 0020 309A;;;;N;;;;; -309D;HIRAGANA ITERATION MARK;Lm;0;L;;;;;N;;;;; -309E;HIRAGANA VOICED ITERATION MARK;Lm;0;L;309D 3099;;;;N;;;;; -309F;HIRAGANA DIGRAPH YORI;Lo;0;L; 3088 308A;;;;N;;;;; -30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;N;;;;; -30A1;KATAKANA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -30A2;KATAKANA LETTER A;Lo;0;L;;;;;N;;;;; -30A3;KATAKANA LETTER SMALL I;Lo;0;L;;;;;N;;;;; -30A4;KATAKANA LETTER I;Lo;0;L;;;;;N;;;;; -30A5;KATAKANA LETTER SMALL U;Lo;0;L;;;;;N;;;;; -30A6;KATAKANA LETTER U;Lo;0;L;;;;;N;;;;; -30A7;KATAKANA LETTER SMALL E;Lo;0;L;;;;;N;;;;; -30A8;KATAKANA LETTER E;Lo;0;L;;;;;N;;;;; -30A9;KATAKANA LETTER SMALL O;Lo;0;L;;;;;N;;;;; -30AA;KATAKANA LETTER O;Lo;0;L;;;;;N;;;;; -30AB;KATAKANA LETTER KA;Lo;0;L;;;;;N;;;;; -30AC;KATAKANA LETTER GA;Lo;0;L;30AB 3099;;;;N;;;;; -30AD;KATAKANA LETTER KI;Lo;0;L;;;;;N;;;;; -30AE;KATAKANA LETTER GI;Lo;0;L;30AD 3099;;;;N;;;;; -30AF;KATAKANA LETTER KU;Lo;0;L;;;;;N;;;;; -30B0;KATAKANA LETTER GU;Lo;0;L;30AF 3099;;;;N;;;;; -30B1;KATAKANA LETTER KE;Lo;0;L;;;;;N;;;;; -30B2;KATAKANA LETTER GE;Lo;0;L;30B1 3099;;;;N;;;;; -30B3;KATAKANA LETTER KO;Lo;0;L;;;;;N;;;;; -30B4;KATAKANA LETTER GO;Lo;0;L;30B3 3099;;;;N;;;;; -30B5;KATAKANA LETTER SA;Lo;0;L;;;;;N;;;;; -30B6;KATAKANA LETTER ZA;Lo;0;L;30B5 3099;;;;N;;;;; -30B7;KATAKANA LETTER SI;Lo;0;L;;;;;N;;;;; -30B8;KATAKANA LETTER ZI;Lo;0;L;30B7 3099;;;;N;;;;; -30B9;KATAKANA LETTER SU;Lo;0;L;;;;;N;;;;; -30BA;KATAKANA LETTER ZU;Lo;0;L;30B9 3099;;;;N;;;;; -30BB;KATAKANA LETTER SE;Lo;0;L;;;;;N;;;;; -30BC;KATAKANA LETTER ZE;Lo;0;L;30BB 3099;;;;N;;;;; -30BD;KATAKANA LETTER SO;Lo;0;L;;;;;N;;;;; -30BE;KATAKANA LETTER ZO;Lo;0;L;30BD 3099;;;;N;;;;; -30BF;KATAKANA LETTER TA;Lo;0;L;;;;;N;;;;; -30C0;KATAKANA LETTER DA;Lo;0;L;30BF 3099;;;;N;;;;; -30C1;KATAKANA LETTER TI;Lo;0;L;;;;;N;;;;; -30C2;KATAKANA LETTER DI;Lo;0;L;30C1 3099;;;;N;;;;; -30C3;KATAKANA LETTER SMALL TU;Lo;0;L;;;;;N;;;;; -30C4;KATAKANA LETTER TU;Lo;0;L;;;;;N;;;;; -30C5;KATAKANA LETTER DU;Lo;0;L;30C4 3099;;;;N;;;;; -30C6;KATAKANA LETTER TE;Lo;0;L;;;;;N;;;;; -30C7;KATAKANA LETTER DE;Lo;0;L;30C6 3099;;;;N;;;;; -30C8;KATAKANA LETTER TO;Lo;0;L;;;;;N;;;;; -30C9;KATAKANA LETTER DO;Lo;0;L;30C8 3099;;;;N;;;;; -30CA;KATAKANA LETTER NA;Lo;0;L;;;;;N;;;;; -30CB;KATAKANA LETTER NI;Lo;0;L;;;;;N;;;;; -30CC;KATAKANA LETTER NU;Lo;0;L;;;;;N;;;;; -30CD;KATAKANA LETTER NE;Lo;0;L;;;;;N;;;;; -30CE;KATAKANA LETTER NO;Lo;0;L;;;;;N;;;;; -30CF;KATAKANA LETTER HA;Lo;0;L;;;;;N;;;;; -30D0;KATAKANA LETTER BA;Lo;0;L;30CF 3099;;;;N;;;;; -30D1;KATAKANA LETTER PA;Lo;0;L;30CF 309A;;;;N;;;;; -30D2;KATAKANA LETTER HI;Lo;0;L;;;;;N;;;;; -30D3;KATAKANA LETTER BI;Lo;0;L;30D2 3099;;;;N;;;;; -30D4;KATAKANA LETTER PI;Lo;0;L;30D2 309A;;;;N;;;;; -30D5;KATAKANA LETTER HU;Lo;0;L;;;;;N;;;;; -30D6;KATAKANA LETTER BU;Lo;0;L;30D5 3099;;;;N;;;;; -30D7;KATAKANA LETTER PU;Lo;0;L;30D5 309A;;;;N;;;;; -30D8;KATAKANA LETTER HE;Lo;0;L;;;;;N;;;;; -30D9;KATAKANA LETTER BE;Lo;0;L;30D8 3099;;;;N;;;;; -30DA;KATAKANA LETTER PE;Lo;0;L;30D8 309A;;;;N;;;;; -30DB;KATAKANA LETTER HO;Lo;0;L;;;;;N;;;;; -30DC;KATAKANA LETTER BO;Lo;0;L;30DB 3099;;;;N;;;;; -30DD;KATAKANA LETTER PO;Lo;0;L;30DB 309A;;;;N;;;;; -30DE;KATAKANA LETTER MA;Lo;0;L;;;;;N;;;;; -30DF;KATAKANA LETTER MI;Lo;0;L;;;;;N;;;;; -30E0;KATAKANA LETTER MU;Lo;0;L;;;;;N;;;;; -30E1;KATAKANA LETTER ME;Lo;0;L;;;;;N;;;;; -30E2;KATAKANA LETTER MO;Lo;0;L;;;;;N;;;;; -30E3;KATAKANA LETTER SMALL YA;Lo;0;L;;;;;N;;;;; -30E4;KATAKANA LETTER YA;Lo;0;L;;;;;N;;;;; -30E5;KATAKANA LETTER SMALL YU;Lo;0;L;;;;;N;;;;; -30E6;KATAKANA LETTER YU;Lo;0;L;;;;;N;;;;; -30E7;KATAKANA LETTER SMALL YO;Lo;0;L;;;;;N;;;;; -30E8;KATAKANA LETTER YO;Lo;0;L;;;;;N;;;;; -30E9;KATAKANA LETTER RA;Lo;0;L;;;;;N;;;;; -30EA;KATAKANA LETTER RI;Lo;0;L;;;;;N;;;;; -30EB;KATAKANA LETTER RU;Lo;0;L;;;;;N;;;;; -30EC;KATAKANA LETTER RE;Lo;0;L;;;;;N;;;;; -30ED;KATAKANA LETTER RO;Lo;0;L;;;;;N;;;;; -30EE;KATAKANA LETTER SMALL WA;Lo;0;L;;;;;N;;;;; -30EF;KATAKANA LETTER WA;Lo;0;L;;;;;N;;;;; -30F0;KATAKANA LETTER WI;Lo;0;L;;;;;N;;;;; -30F1;KATAKANA LETTER WE;Lo;0;L;;;;;N;;;;; -30F2;KATAKANA LETTER WO;Lo;0;L;;;;;N;;;;; -30F3;KATAKANA LETTER N;Lo;0;L;;;;;N;;;;; -30F4;KATAKANA LETTER VU;Lo;0;L;30A6 3099;;;;N;;;;; -30F5;KATAKANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;; -30F6;KATAKANA LETTER SMALL KE;Lo;0;L;;;;;N;;;;; -30F7;KATAKANA LETTER VA;Lo;0;L;30EF 3099;;;;N;;;;; -30F8;KATAKANA LETTER VI;Lo;0;L;30F0 3099;;;;N;;;;; -30F9;KATAKANA LETTER VE;Lo;0;L;30F1 3099;;;;N;;;;; -30FA;KATAKANA LETTER VO;Lo;0;L;30F2 3099;;;;N;;;;; -30FB;KATAKANA MIDDLE DOT;Po;0;ON;;;;;N;;;;; -30FC;KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L;;;;;N;;;;; -30FD;KATAKANA ITERATION MARK;Lm;0;L;;;;;N;;;;; -30FE;KATAKANA VOICED ITERATION MARK;Lm;0;L;30FD 3099;;;;N;;;;; -30FF;KATAKANA DIGRAPH KOTO;Lo;0;L; 30B3 30C8;;;;N;;;;; -3105;BOPOMOFO LETTER B;Lo;0;L;;;;;N;;;;; -3106;BOPOMOFO LETTER P;Lo;0;L;;;;;N;;;;; -3107;BOPOMOFO LETTER M;Lo;0;L;;;;;N;;;;; -3108;BOPOMOFO LETTER F;Lo;0;L;;;;;N;;;;; -3109;BOPOMOFO LETTER D;Lo;0;L;;;;;N;;;;; -310A;BOPOMOFO LETTER T;Lo;0;L;;;;;N;;;;; -310B;BOPOMOFO LETTER N;Lo;0;L;;;;;N;;;;; -310C;BOPOMOFO LETTER L;Lo;0;L;;;;;N;;;;; -310D;BOPOMOFO LETTER G;Lo;0;L;;;;;N;;;;; -310E;BOPOMOFO LETTER K;Lo;0;L;;;;;N;;;;; -310F;BOPOMOFO LETTER H;Lo;0;L;;;;;N;;;;; -3110;BOPOMOFO LETTER J;Lo;0;L;;;;;N;;;;; -3111;BOPOMOFO LETTER Q;Lo;0;L;;;;;N;;;;; -3112;BOPOMOFO LETTER X;Lo;0;L;;;;;N;;;;; -3113;BOPOMOFO LETTER ZH;Lo;0;L;;;;;N;;;;; -3114;BOPOMOFO LETTER CH;Lo;0;L;;;;;N;;;;; -3115;BOPOMOFO LETTER SH;Lo;0;L;;;;;N;;;;; -3116;BOPOMOFO LETTER R;Lo;0;L;;;;;N;;;;; -3117;BOPOMOFO LETTER Z;Lo;0;L;;;;;N;;;;; -3118;BOPOMOFO LETTER C;Lo;0;L;;;;;N;;;;; -3119;BOPOMOFO LETTER S;Lo;0;L;;;;;N;;;;; -311A;BOPOMOFO LETTER A;Lo;0;L;;;;;N;;;;; -311B;BOPOMOFO LETTER O;Lo;0;L;;;;;N;;;;; -311C;BOPOMOFO LETTER E;Lo;0;L;;;;;N;;;;; -311D;BOPOMOFO LETTER EH;Lo;0;L;;;;;N;;;;; -311E;BOPOMOFO LETTER AI;Lo;0;L;;;;;N;;;;; -311F;BOPOMOFO LETTER EI;Lo;0;L;;;;;N;;;;; -3120;BOPOMOFO LETTER AU;Lo;0;L;;;;;N;;;;; -3121;BOPOMOFO LETTER OU;Lo;0;L;;;;;N;;;;; -3122;BOPOMOFO LETTER AN;Lo;0;L;;;;;N;;;;; -3123;BOPOMOFO LETTER EN;Lo;0;L;;;;;N;;;;; -3124;BOPOMOFO LETTER ANG;Lo;0;L;;;;;N;;;;; -3125;BOPOMOFO LETTER ENG;Lo;0;L;;;;;N;;;;; -3126;BOPOMOFO LETTER ER;Lo;0;L;;;;;N;;;;; -3127;BOPOMOFO LETTER I;Lo;0;L;;;;;N;;;;; -3128;BOPOMOFO LETTER U;Lo;0;L;;;;;N;;;;; -3129;BOPOMOFO LETTER IU;Lo;0;L;;;;;N;;;;; -312A;BOPOMOFO LETTER V;Lo;0;L;;;;;N;;;;; -312B;BOPOMOFO LETTER NG;Lo;0;L;;;;;N;;;;; -312C;BOPOMOFO LETTER GN;Lo;0;L;;;;;N;;;;; -312D;BOPOMOFO LETTER IH;Lo;0;L;;;;;N;;;;; -3131;HANGUL LETTER KIYEOK;Lo;0;L; 1100;;;;N;HANGUL LETTER GIYEOG;;;; -3132;HANGUL LETTER SSANGKIYEOK;Lo;0;L; 1101;;;;N;HANGUL LETTER SSANG GIYEOG;;;; -3133;HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 11AA;;;;N;HANGUL LETTER GIYEOG SIOS;;;; -3134;HANGUL LETTER NIEUN;Lo;0;L; 1102;;;;N;;;;; -3135;HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 11AC;;;;N;HANGUL LETTER NIEUN JIEUJ;;;; -3136;HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 11AD;;;;N;HANGUL LETTER NIEUN HIEUH;;;; -3137;HANGUL LETTER TIKEUT;Lo;0;L; 1103;;;;N;HANGUL LETTER DIGEUD;;;; -3138;HANGUL LETTER SSANGTIKEUT;Lo;0;L; 1104;;;;N;HANGUL LETTER SSANG DIGEUD;;;; -3139;HANGUL LETTER RIEUL;Lo;0;L; 1105;;;;N;HANGUL LETTER LIEUL;;;; -313A;HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 11B0;;;;N;HANGUL LETTER LIEUL GIYEOG;;;; -313B;HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 11B1;;;;N;HANGUL LETTER LIEUL MIEUM;;;; -313C;HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 11B2;;;;N;HANGUL LETTER LIEUL BIEUB;;;; -313D;HANGUL LETTER RIEUL-SIOS;Lo;0;L; 11B3;;;;N;HANGUL LETTER LIEUL SIOS;;;; -313E;HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 11B4;;;;N;HANGUL LETTER LIEUL TIEUT;;;; -313F;HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 11B5;;;;N;HANGUL LETTER LIEUL PIEUP;;;; -3140;HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 111A;;;;N;HANGUL LETTER LIEUL HIEUH;;;; -3141;HANGUL LETTER MIEUM;Lo;0;L; 1106;;;;N;;;;; -3142;HANGUL LETTER PIEUP;Lo;0;L; 1107;;;;N;HANGUL LETTER BIEUB;;;; -3143;HANGUL LETTER SSANGPIEUP;Lo;0;L; 1108;;;;N;HANGUL LETTER SSANG BIEUB;;;; -3144;HANGUL LETTER PIEUP-SIOS;Lo;0;L; 1121;;;;N;HANGUL LETTER BIEUB SIOS;;;; -3145;HANGUL LETTER SIOS;Lo;0;L; 1109;;;;N;;;;; -3146;HANGUL LETTER SSANGSIOS;Lo;0;L; 110A;;;;N;HANGUL LETTER SSANG SIOS;;;; -3147;HANGUL LETTER IEUNG;Lo;0;L; 110B;;;;N;;;;; -3148;HANGUL LETTER CIEUC;Lo;0;L; 110C;;;;N;HANGUL LETTER JIEUJ;;;; -3149;HANGUL LETTER SSANGCIEUC;Lo;0;L; 110D;;;;N;HANGUL LETTER SSANG JIEUJ;;;; -314A;HANGUL LETTER CHIEUCH;Lo;0;L; 110E;;;;N;HANGUL LETTER CIEUC;;;; -314B;HANGUL LETTER KHIEUKH;Lo;0;L; 110F;;;;N;HANGUL LETTER KIYEOK;;;; -314C;HANGUL LETTER THIEUTH;Lo;0;L; 1110;;;;N;HANGUL LETTER TIEUT;;;; -314D;HANGUL LETTER PHIEUPH;Lo;0;L; 1111;;;;N;HANGUL LETTER PIEUP;;;; -314E;HANGUL LETTER HIEUH;Lo;0;L; 1112;;;;N;;;;; -314F;HANGUL LETTER A;Lo;0;L; 1161;;;;N;;;;; -3150;HANGUL LETTER AE;Lo;0;L; 1162;;;;N;;;;; -3151;HANGUL LETTER YA;Lo;0;L; 1163;;;;N;;;;; -3152;HANGUL LETTER YAE;Lo;0;L; 1164;;;;N;;;;; -3153;HANGUL LETTER EO;Lo;0;L; 1165;;;;N;;;;; -3154;HANGUL LETTER E;Lo;0;L; 1166;;;;N;;;;; -3155;HANGUL LETTER YEO;Lo;0;L; 1167;;;;N;;;;; -3156;HANGUL LETTER YE;Lo;0;L; 1168;;;;N;;;;; -3157;HANGUL LETTER O;Lo;0;L; 1169;;;;N;;;;; -3158;HANGUL LETTER WA;Lo;0;L; 116A;;;;N;;;;; -3159;HANGUL LETTER WAE;Lo;0;L; 116B;;;;N;;;;; -315A;HANGUL LETTER OE;Lo;0;L; 116C;;;;N;;;;; -315B;HANGUL LETTER YO;Lo;0;L; 116D;;;;N;;;;; -315C;HANGUL LETTER U;Lo;0;L; 116E;;;;N;;;;; -315D;HANGUL LETTER WEO;Lo;0;L; 116F;;;;N;;;;; -315E;HANGUL LETTER WE;Lo;0;L; 1170;;;;N;;;;; -315F;HANGUL LETTER WI;Lo;0;L; 1171;;;;N;;;;; -3160;HANGUL LETTER YU;Lo;0;L; 1172;;;;N;;;;; -3161;HANGUL LETTER EU;Lo;0;L; 1173;;;;N;;;;; -3162;HANGUL LETTER YI;Lo;0;L; 1174;;;;N;;;;; -3163;HANGUL LETTER I;Lo;0;L; 1175;;;;N;;;;; -3164;HANGUL FILLER;Lo;0;L; 1160;;;;N;HANGUL CAE OM;;;; -3165;HANGUL LETTER SSANGNIEUN;Lo;0;L; 1114;;;;N;HANGUL LETTER SSANG NIEUN;;;; -3166;HANGUL LETTER NIEUN-TIKEUT;Lo;0;L; 1115;;;;N;HANGUL LETTER NIEUN DIGEUD;;;; -3167;HANGUL LETTER NIEUN-SIOS;Lo;0;L; 11C7;;;;N;HANGUL LETTER NIEUN SIOS;;;; -3168;HANGUL LETTER NIEUN-PANSIOS;Lo;0;L; 11C8;;;;N;HANGUL LETTER NIEUN BAN CHI EUM;;;; -3169;HANGUL LETTER RIEUL-KIYEOK-SIOS;Lo;0;L; 11CC;;;;N;HANGUL LETTER LIEUL GIYEOG SIOS;;;; -316A;HANGUL LETTER RIEUL-TIKEUT;Lo;0;L; 11CE;;;;N;HANGUL LETTER LIEUL DIGEUD;;;; -316B;HANGUL LETTER RIEUL-PIEUP-SIOS;Lo;0;L; 11D3;;;;N;HANGUL LETTER LIEUL BIEUB SIOS;;;; -316C;HANGUL LETTER RIEUL-PANSIOS;Lo;0;L; 11D7;;;;N;HANGUL LETTER LIEUL BAN CHI EUM;;;; -316D;HANGUL LETTER RIEUL-YEORINHIEUH;Lo;0;L; 11D9;;;;N;HANGUL LETTER LIEUL YEOLIN HIEUH;;;; -316E;HANGUL LETTER MIEUM-PIEUP;Lo;0;L; 111C;;;;N;HANGUL LETTER MIEUM BIEUB;;;; -316F;HANGUL LETTER MIEUM-SIOS;Lo;0;L; 11DD;;;;N;HANGUL LETTER MIEUM SIOS;;;; -3170;HANGUL LETTER MIEUM-PANSIOS;Lo;0;L; 11DF;;;;N;HANGUL LETTER BIEUB BAN CHI EUM;;;; -3171;HANGUL LETTER KAPYEOUNMIEUM;Lo;0;L; 111D;;;;N;HANGUL LETTER MIEUM SUN GYEONG EUM;;;; -3172;HANGUL LETTER PIEUP-KIYEOK;Lo;0;L; 111E;;;;N;HANGUL LETTER BIEUB GIYEOG;;;; -3173;HANGUL LETTER PIEUP-TIKEUT;Lo;0;L; 1120;;;;N;HANGUL LETTER BIEUB DIGEUD;;;; -3174;HANGUL LETTER PIEUP-SIOS-KIYEOK;Lo;0;L; 1122;;;;N;HANGUL LETTER BIEUB SIOS GIYEOG;;;; -3175;HANGUL LETTER PIEUP-SIOS-TIKEUT;Lo;0;L; 1123;;;;N;HANGUL LETTER BIEUB SIOS DIGEUD;;;; -3176;HANGUL LETTER PIEUP-CIEUC;Lo;0;L; 1127;;;;N;HANGUL LETTER BIEUB JIEUJ;;;; -3177;HANGUL LETTER PIEUP-THIEUTH;Lo;0;L; 1129;;;;N;HANGUL LETTER BIEUB TIEUT;;;; -3178;HANGUL LETTER KAPYEOUNPIEUP;Lo;0;L; 112B;;;;N;HANGUL LETTER BIEUB SUN GYEONG EUM;;;; -3179;HANGUL LETTER KAPYEOUNSSANGPIEUP;Lo;0;L; 112C;;;;N;HANGUL LETTER SSANG BIEUB SUN GYEONG EUM;;;; -317A;HANGUL LETTER SIOS-KIYEOK;Lo;0;L; 112D;;;;N;HANGUL LETTER SIOS GIYEOG;;;; -317B;HANGUL LETTER SIOS-NIEUN;Lo;0;L; 112E;;;;N;HANGUL LETTER SIOS NIEUN;;;; -317C;HANGUL LETTER SIOS-TIKEUT;Lo;0;L; 112F;;;;N;HANGUL LETTER SIOS DIGEUD;;;; -317D;HANGUL LETTER SIOS-PIEUP;Lo;0;L; 1132;;;;N;HANGUL LETTER SIOS BIEUB;;;; -317E;HANGUL LETTER SIOS-CIEUC;Lo;0;L; 1136;;;;N;HANGUL LETTER SIOS JIEUJ;;;; -317F;HANGUL LETTER PANSIOS;Lo;0;L; 1140;;;;N;HANGUL LETTER BAN CHI EUM;;;; -3180;HANGUL LETTER SSANGIEUNG;Lo;0;L; 1147;;;;N;HANGUL LETTER SSANG IEUNG;;;; -3181;HANGUL LETTER YESIEUNG;Lo;0;L; 114C;;;;N;HANGUL LETTER NGIEUNG;;;; -3182;HANGUL LETTER YESIEUNG-SIOS;Lo;0;L; 11F1;;;;N;HANGUL LETTER NGIEUNG SIOS;;;; -3183;HANGUL LETTER YESIEUNG-PANSIOS;Lo;0;L; 11F2;;;;N;HANGUL LETTER NGIEUNG BAN CHI EUM;;;; -3184;HANGUL LETTER KAPYEOUNPHIEUPH;Lo;0;L; 1157;;;;N;HANGUL LETTER PIEUP SUN GYEONG EUM;;;; -3185;HANGUL LETTER SSANGHIEUH;Lo;0;L; 1158;;;;N;HANGUL LETTER SSANG HIEUH;;;; -3186;HANGUL LETTER YEORINHIEUH;Lo;0;L; 1159;;;;N;HANGUL LETTER YEOLIN HIEUH;;;; -3187;HANGUL LETTER YO-YA;Lo;0;L; 1184;;;;N;HANGUL LETTER YOYA;;;; -3188;HANGUL LETTER YO-YAE;Lo;0;L; 1185;;;;N;HANGUL LETTER YOYAE;;;; -3189;HANGUL LETTER YO-I;Lo;0;L; 1188;;;;N;HANGUL LETTER YOI;;;; -318A;HANGUL LETTER YU-YEO;Lo;0;L; 1191;;;;N;HANGUL LETTER YUYEO;;;; -318B;HANGUL LETTER YU-YE;Lo;0;L; 1192;;;;N;HANGUL LETTER YUYE;;;; -318C;HANGUL LETTER YU-I;Lo;0;L; 1194;;;;N;HANGUL LETTER YUI;;;; -318D;HANGUL LETTER ARAEA;Lo;0;L; 119E;;;;N;HANGUL LETTER ALAE A;;;; -318E;HANGUL LETTER ARAEAE;Lo;0;L; 11A1;;;;N;HANGUL LETTER ALAE AE;;;; -3190;IDEOGRAPHIC ANNOTATION LINKING MARK;So;0;L;;;;;N;KANBUN TATETEN;;;; -3191;IDEOGRAPHIC ANNOTATION REVERSE MARK;So;0;L;;;;;N;KAERITEN RE;;;; -3192;IDEOGRAPHIC ANNOTATION ONE MARK;No;0;L; 4E00;;;1;N;KAERITEN ITI;;;; -3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L; 4E8C;;;2;N;KAERITEN NI;;;; -3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L; 4E09;;;3;N;KAERITEN SAN;;;; -3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L; 56DB;;;4;N;KAERITEN SI;;;; -3196;IDEOGRAPHIC ANNOTATION TOP MARK;So;0;L; 4E0A;;;;N;KAERITEN ZYOU;;;; -3197;IDEOGRAPHIC ANNOTATION MIDDLE MARK;So;0;L; 4E2D;;;;N;KAERITEN TYUU;;;; -3198;IDEOGRAPHIC ANNOTATION BOTTOM MARK;So;0;L; 4E0B;;;;N;KAERITEN GE;;;; -3199;IDEOGRAPHIC ANNOTATION FIRST MARK;So;0;L; 7532;;;;N;KAERITEN KOU;;;; -319A;IDEOGRAPHIC ANNOTATION SECOND MARK;So;0;L; 4E59;;;;N;KAERITEN OTU;;;; -319B;IDEOGRAPHIC ANNOTATION THIRD MARK;So;0;L; 4E19;;;;N;KAERITEN HEI;;;; -319C;IDEOGRAPHIC ANNOTATION FOURTH MARK;So;0;L; 4E01;;;;N;KAERITEN TEI;;;; -319D;IDEOGRAPHIC ANNOTATION HEAVEN MARK;So;0;L; 5929;;;;N;KAERITEN TEN;;;; -319E;IDEOGRAPHIC ANNOTATION EARTH MARK;So;0;L; 5730;;;;N;KAERITEN TI;;;; -319F;IDEOGRAPHIC ANNOTATION MAN MARK;So;0;L; 4EBA;;;;N;KAERITEN ZIN;;;; -31A0;BOPOMOFO LETTER BU;Lo;0;L;;;;;N;;;;; -31A1;BOPOMOFO LETTER ZI;Lo;0;L;;;;;N;;;;; -31A2;BOPOMOFO LETTER JI;Lo;0;L;;;;;N;;;;; -31A3;BOPOMOFO LETTER GU;Lo;0;L;;;;;N;;;;; -31A4;BOPOMOFO LETTER EE;Lo;0;L;;;;;N;;;;; -31A5;BOPOMOFO LETTER ENN;Lo;0;L;;;;;N;;;;; -31A6;BOPOMOFO LETTER OO;Lo;0;L;;;;;N;;;;; -31A7;BOPOMOFO LETTER ONN;Lo;0;L;;;;;N;;;;; -31A8;BOPOMOFO LETTER IR;Lo;0;L;;;;;N;;;;; -31A9;BOPOMOFO LETTER ANN;Lo;0;L;;;;;N;;;;; -31AA;BOPOMOFO LETTER INN;Lo;0;L;;;;;N;;;;; -31AB;BOPOMOFO LETTER UNN;Lo;0;L;;;;;N;;;;; -31AC;BOPOMOFO LETTER IM;Lo;0;L;;;;;N;;;;; -31AD;BOPOMOFO LETTER NGG;Lo;0;L;;;;;N;;;;; -31AE;BOPOMOFO LETTER AINN;Lo;0;L;;;;;N;;;;; -31AF;BOPOMOFO LETTER AUNN;Lo;0;L;;;;;N;;;;; -31B0;BOPOMOFO LETTER AM;Lo;0;L;;;;;N;;;;; -31B1;BOPOMOFO LETTER OM;Lo;0;L;;;;;N;;;;; -31B2;BOPOMOFO LETTER ONG;Lo;0;L;;;;;N;;;;; -31B3;BOPOMOFO LETTER INNN;Lo;0;L;;;;;N;;;;; -31B4;BOPOMOFO FINAL LETTER P;Lo;0;L;;;;;N;;;;; -31B5;BOPOMOFO FINAL LETTER T;Lo;0;L;;;;;N;;;;; -31B6;BOPOMOFO FINAL LETTER K;Lo;0;L;;;;;N;;;;; -31B7;BOPOMOFO FINAL LETTER H;Lo;0;L;;;;;N;;;;; -31B8;BOPOMOFO LETTER GH;Lo;0;L;;;;;N;;;;; -31B9;BOPOMOFO LETTER LH;Lo;0;L;;;;;N;;;;; -31BA;BOPOMOFO LETTER ZY;Lo;0;L;;;;;N;;;;; -31C0;CJK STROKE T;So;0;ON;;;;;N;;;;; -31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;; -31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;; -31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;; -31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;; -31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;; -31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;; -31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;; -31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;; -31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;; -31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;; -31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;; -31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;; -31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;; -31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;; -31CF;CJK STROKE N;So;0;ON;;;;;N;;;;; -31D0;CJK STROKE H;So;0;ON;;;;;N;;;;; -31D1;CJK STROKE S;So;0;ON;;;;;N;;;;; -31D2;CJK STROKE P;So;0;ON;;;;;N;;;;; -31D3;CJK STROKE SP;So;0;ON;;;;;N;;;;; -31D4;CJK STROKE D;So;0;ON;;;;;N;;;;; -31D5;CJK STROKE HZ;So;0;ON;;;;;N;;;;; -31D6;CJK STROKE HG;So;0;ON;;;;;N;;;;; -31D7;CJK STROKE SZ;So;0;ON;;;;;N;;;;; -31D8;CJK STROKE SWZ;So;0;ON;;;;;N;;;;; -31D9;CJK STROKE ST;So;0;ON;;;;;N;;;;; -31DA;CJK STROKE SG;So;0;ON;;;;;N;;;;; -31DB;CJK STROKE PD;So;0;ON;;;;;N;;;;; -31DC;CJK STROKE PZ;So;0;ON;;;;;N;;;;; -31DD;CJK STROKE TN;So;0;ON;;;;;N;;;;; -31DE;CJK STROKE SZZ;So;0;ON;;;;;N;;;;; -31DF;CJK STROKE SWG;So;0;ON;;;;;N;;;;; -31E0;CJK STROKE HXWG;So;0;ON;;;;;N;;;;; -31E1;CJK STROKE HZZZG;So;0;ON;;;;;N;;;;; -31E2;CJK STROKE PG;So;0;ON;;;;;N;;;;; -31E3;CJK STROKE Q;So;0;ON;;;;;N;;;;; -31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;; -31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;; -31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;; -31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;; -31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;; -31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;; -31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;; -31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;; -31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;; -31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;; -31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;; -31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;; -31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;; -31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;; -31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;; -31FF;KATAKANA LETTER SMALL RO;Lo;0;L;;;;;N;;;;; -3200;PARENTHESIZED HANGUL KIYEOK;So;0;L; 0028 1100 0029;;;;N;PARENTHESIZED HANGUL GIYEOG;;;; -3201;PARENTHESIZED HANGUL NIEUN;So;0;L; 0028 1102 0029;;;;N;;;;; -3202;PARENTHESIZED HANGUL TIKEUT;So;0;L; 0028 1103 0029;;;;N;PARENTHESIZED HANGUL DIGEUD;;;; -3203;PARENTHESIZED HANGUL RIEUL;So;0;L; 0028 1105 0029;;;;N;PARENTHESIZED HANGUL LIEUL;;;; -3204;PARENTHESIZED HANGUL MIEUM;So;0;L; 0028 1106 0029;;;;N;;;;; -3205;PARENTHESIZED HANGUL PIEUP;So;0;L; 0028 1107 0029;;;;N;PARENTHESIZED HANGUL BIEUB;;;; -3206;PARENTHESIZED HANGUL SIOS;So;0;L; 0028 1109 0029;;;;N;;;;; -3207;PARENTHESIZED HANGUL IEUNG;So;0;L; 0028 110B 0029;;;;N;;;;; -3208;PARENTHESIZED HANGUL CIEUC;So;0;L; 0028 110C 0029;;;;N;PARENTHESIZED HANGUL JIEUJ;;;; -3209;PARENTHESIZED HANGUL CHIEUCH;So;0;L; 0028 110E 0029;;;;N;PARENTHESIZED HANGUL CIEUC;;;; -320A;PARENTHESIZED HANGUL KHIEUKH;So;0;L; 0028 110F 0029;;;;N;PARENTHESIZED HANGUL KIYEOK;;;; -320B;PARENTHESIZED HANGUL THIEUTH;So;0;L; 0028 1110 0029;;;;N;PARENTHESIZED HANGUL TIEUT;;;; -320C;PARENTHESIZED HANGUL PHIEUPH;So;0;L; 0028 1111 0029;;;;N;PARENTHESIZED HANGUL PIEUP;;;; -320D;PARENTHESIZED HANGUL HIEUH;So;0;L; 0028 1112 0029;;;;N;;;;; -320E;PARENTHESIZED HANGUL KIYEOK A;So;0;L; 0028 1100 1161 0029;;;;N;PARENTHESIZED HANGUL GA;;;; -320F;PARENTHESIZED HANGUL NIEUN A;So;0;L; 0028 1102 1161 0029;;;;N;PARENTHESIZED HANGUL NA;;;; -3210;PARENTHESIZED HANGUL TIKEUT A;So;0;L; 0028 1103 1161 0029;;;;N;PARENTHESIZED HANGUL DA;;;; -3211;PARENTHESIZED HANGUL RIEUL A;So;0;L; 0028 1105 1161 0029;;;;N;PARENTHESIZED HANGUL LA;;;; -3212;PARENTHESIZED HANGUL MIEUM A;So;0;L; 0028 1106 1161 0029;;;;N;PARENTHESIZED HANGUL MA;;;; -3213;PARENTHESIZED HANGUL PIEUP A;So;0;L; 0028 1107 1161 0029;;;;N;PARENTHESIZED HANGUL BA;;;; -3214;PARENTHESIZED HANGUL SIOS A;So;0;L; 0028 1109 1161 0029;;;;N;PARENTHESIZED HANGUL SA;;;; -3215;PARENTHESIZED HANGUL IEUNG A;So;0;L; 0028 110B 1161 0029;;;;N;PARENTHESIZED HANGUL A;;;; -3216;PARENTHESIZED HANGUL CIEUC A;So;0;L; 0028 110C 1161 0029;;;;N;PARENTHESIZED HANGUL JA;;;; -3217;PARENTHESIZED HANGUL CHIEUCH A;So;0;L; 0028 110E 1161 0029;;;;N;PARENTHESIZED HANGUL CA;;;; -3218;PARENTHESIZED HANGUL KHIEUKH A;So;0;L; 0028 110F 1161 0029;;;;N;PARENTHESIZED HANGUL KA;;;; -3219;PARENTHESIZED HANGUL THIEUTH A;So;0;L; 0028 1110 1161 0029;;;;N;PARENTHESIZED HANGUL TA;;;; -321A;PARENTHESIZED HANGUL PHIEUPH A;So;0;L; 0028 1111 1161 0029;;;;N;PARENTHESIZED HANGUL PA;;;; -321B;PARENTHESIZED HANGUL HIEUH A;So;0;L; 0028 1112 1161 0029;;;;N;PARENTHESIZED HANGUL HA;;;; -321C;PARENTHESIZED HANGUL CIEUC U;So;0;L; 0028 110C 116E 0029;;;;N;PARENTHESIZED HANGUL JU;;;; -321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON; 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;; -321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON; 0028 110B 1169 1112 116E 0029;;;;N;;;;; -3220;PARENTHESIZED IDEOGRAPH ONE;No;0;L; 0028 4E00 0029;;;1;N;;;;; -3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L; 0028 4E8C 0029;;;2;N;;;;; -3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L; 0028 4E09 0029;;;3;N;;;;; -3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L; 0028 56DB 0029;;;4;N;;;;; -3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L; 0028 4E94 0029;;;5;N;;;;; -3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L; 0028 516D 0029;;;6;N;;;;; -3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L; 0028 4E03 0029;;;7;N;;;;; -3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L; 0028 516B 0029;;;8;N;;;;; -3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L; 0028 4E5D 0029;;;9;N;;;;; -3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L; 0028 5341 0029;;;10;N;;;;; -322A;PARENTHESIZED IDEOGRAPH MOON;So;0;L; 0028 6708 0029;;;;N;;;;; -322B;PARENTHESIZED IDEOGRAPH FIRE;So;0;L; 0028 706B 0029;;;;N;;;;; -322C;PARENTHESIZED IDEOGRAPH WATER;So;0;L; 0028 6C34 0029;;;;N;;;;; -322D;PARENTHESIZED IDEOGRAPH WOOD;So;0;L; 0028 6728 0029;;;;N;;;;; -322E;PARENTHESIZED IDEOGRAPH METAL;So;0;L; 0028 91D1 0029;;;;N;;;;; -322F;PARENTHESIZED IDEOGRAPH EARTH;So;0;L; 0028 571F 0029;;;;N;;;;; -3230;PARENTHESIZED IDEOGRAPH SUN;So;0;L; 0028 65E5 0029;;;;N;;;;; -3231;PARENTHESIZED IDEOGRAPH STOCK;So;0;L; 0028 682A 0029;;;;N;;;;; -3232;PARENTHESIZED IDEOGRAPH HAVE;So;0;L; 0028 6709 0029;;;;N;;;;; -3233;PARENTHESIZED IDEOGRAPH SOCIETY;So;0;L; 0028 793E 0029;;;;N;;;;; -3234;PARENTHESIZED IDEOGRAPH NAME;So;0;L; 0028 540D 0029;;;;N;;;;; -3235;PARENTHESIZED IDEOGRAPH SPECIAL;So;0;L; 0028 7279 0029;;;;N;;;;; -3236;PARENTHESIZED IDEOGRAPH FINANCIAL;So;0;L; 0028 8CA1 0029;;;;N;;;;; -3237;PARENTHESIZED IDEOGRAPH CONGRATULATION;So;0;L; 0028 795D 0029;;;;N;;;;; -3238;PARENTHESIZED IDEOGRAPH LABOR;So;0;L; 0028 52B4 0029;;;;N;;;;; -3239;PARENTHESIZED IDEOGRAPH REPRESENT;So;0;L; 0028 4EE3 0029;;;;N;;;;; -323A;PARENTHESIZED IDEOGRAPH CALL;So;0;L; 0028 547C 0029;;;;N;;;;; -323B;PARENTHESIZED IDEOGRAPH STUDY;So;0;L; 0028 5B66 0029;;;;N;;;;; -323C;PARENTHESIZED IDEOGRAPH SUPERVISE;So;0;L; 0028 76E3 0029;;;;N;;;;; -323D;PARENTHESIZED IDEOGRAPH ENTERPRISE;So;0;L; 0028 4F01 0029;;;;N;;;;; -323E;PARENTHESIZED IDEOGRAPH RESOURCE;So;0;L; 0028 8CC7 0029;;;;N;;;;; -323F;PARENTHESIZED IDEOGRAPH ALLIANCE;So;0;L; 0028 5354 0029;;;;N;;;;; -3240;PARENTHESIZED IDEOGRAPH FESTIVAL;So;0;L; 0028 796D 0029;;;;N;;;;; -3241;PARENTHESIZED IDEOGRAPH REST;So;0;L; 0028 4F11 0029;;;;N;;;;; -3242;PARENTHESIZED IDEOGRAPH SELF;So;0;L; 0028 81EA 0029;;;;N;;;;; -3243;PARENTHESIZED IDEOGRAPH REACH;So;0;L; 0028 81F3 0029;;;;N;;;;; -3244;CIRCLED IDEOGRAPH QUESTION;So;0;L; 554F;;;;N;;;;; -3245;CIRCLED IDEOGRAPH KINDERGARTEN;So;0;L; 5E7C;;;;N;;;;; -3246;CIRCLED IDEOGRAPH SCHOOL;So;0;L; 6587;;;;N;;;;; -3247;CIRCLED IDEOGRAPH KOTO;So;0;L; 7B8F;;;;N;;;;; -3248;CIRCLED NUMBER TEN ON BLACK SQUARE;No;0;L;;;;10;N;;;;; -3249;CIRCLED NUMBER TWENTY ON BLACK SQUARE;No;0;L;;;;20;N;;;;; -324A;CIRCLED NUMBER THIRTY ON BLACK SQUARE;No;0;L;;;;30;N;;;;; -324B;CIRCLED NUMBER FORTY ON BLACK SQUARE;No;0;L;;;;40;N;;;;; -324C;CIRCLED NUMBER FIFTY ON BLACK SQUARE;No;0;L;;;;50;N;;;;; -324D;CIRCLED NUMBER SIXTY ON BLACK SQUARE;No;0;L;;;;60;N;;;;; -324E;CIRCLED NUMBER SEVENTY ON BLACK SQUARE;No;0;L;;;;70;N;;;;; -324F;CIRCLED NUMBER EIGHTY ON BLACK SQUARE;No;0;L;;;;80;N;;;;; -3250;PARTNERSHIP SIGN;So;0;ON; 0050 0054 0045;;;;N;;;;; -3251;CIRCLED NUMBER TWENTY ONE;No;0;ON; 0032 0031;;;21;N;;;;; -3252;CIRCLED NUMBER TWENTY TWO;No;0;ON; 0032 0032;;;22;N;;;;; -3253;CIRCLED NUMBER TWENTY THREE;No;0;ON; 0032 0033;;;23;N;;;;; -3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON; 0032 0034;;;24;N;;;;; -3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON; 0032 0035;;;25;N;;;;; -3256;CIRCLED NUMBER TWENTY SIX;No;0;ON; 0032 0036;;;26;N;;;;; -3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON; 0032 0037;;;27;N;;;;; -3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON; 0032 0038;;;28;N;;;;; -3259;CIRCLED NUMBER TWENTY NINE;No;0;ON; 0032 0039;;;29;N;;;;; -325A;CIRCLED NUMBER THIRTY;No;0;ON; 0033 0030;;;30;N;;;;; -325B;CIRCLED NUMBER THIRTY ONE;No;0;ON; 0033 0031;;;31;N;;;;; -325C;CIRCLED NUMBER THIRTY TWO;No;0;ON; 0033 0032;;;32;N;;;;; -325D;CIRCLED NUMBER THIRTY THREE;No;0;ON; 0033 0033;;;33;N;;;;; -325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON; 0033 0034;;;34;N;;;;; -325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON; 0033 0035;;;35;N;;;;; -3260;CIRCLED HANGUL KIYEOK;So;0;L; 1100;;;;N;CIRCLED HANGUL GIYEOG;;;; -3261;CIRCLED HANGUL NIEUN;So;0;L; 1102;;;;N;;;;; -3262;CIRCLED HANGUL TIKEUT;So;0;L; 1103;;;;N;CIRCLED HANGUL DIGEUD;;;; -3263;CIRCLED HANGUL RIEUL;So;0;L; 1105;;;;N;CIRCLED HANGUL LIEUL;;;; -3264;CIRCLED HANGUL MIEUM;So;0;L; 1106;;;;N;;;;; -3265;CIRCLED HANGUL PIEUP;So;0;L; 1107;;;;N;CIRCLED HANGUL BIEUB;;;; -3266;CIRCLED HANGUL SIOS;So;0;L; 1109;;;;N;;;;; -3267;CIRCLED HANGUL IEUNG;So;0;L; 110B;;;;N;;;;; -3268;CIRCLED HANGUL CIEUC;So;0;L; 110C;;;;N;CIRCLED HANGUL JIEUJ;;;; -3269;CIRCLED HANGUL CHIEUCH;So;0;L; 110E;;;;N;CIRCLED HANGUL CIEUC;;;; -326A;CIRCLED HANGUL KHIEUKH;So;0;L; 110F;;;;N;CIRCLED HANGUL KIYEOK;;;; -326B;CIRCLED HANGUL THIEUTH;So;0;L; 1110;;;;N;CIRCLED HANGUL TIEUT;;;; -326C;CIRCLED HANGUL PHIEUPH;So;0;L; 1111;;;;N;CIRCLED HANGUL PIEUP;;;; -326D;CIRCLED HANGUL HIEUH;So;0;L; 1112;;;;N;;;;; -326E;CIRCLED HANGUL KIYEOK A;So;0;L; 1100 1161;;;;N;CIRCLED HANGUL GA;;;; -326F;CIRCLED HANGUL NIEUN A;So;0;L; 1102 1161;;;;N;CIRCLED HANGUL NA;;;; -3270;CIRCLED HANGUL TIKEUT A;So;0;L; 1103 1161;;;;N;CIRCLED HANGUL DA;;;; -3271;CIRCLED HANGUL RIEUL A;So;0;L; 1105 1161;;;;N;CIRCLED HANGUL LA;;;; -3272;CIRCLED HANGUL MIEUM A;So;0;L; 1106 1161;;;;N;CIRCLED HANGUL MA;;;; -3273;CIRCLED HANGUL PIEUP A;So;0;L; 1107 1161;;;;N;CIRCLED HANGUL BA;;;; -3274;CIRCLED HANGUL SIOS A;So;0;L; 1109 1161;;;;N;CIRCLED HANGUL SA;;;; -3275;CIRCLED HANGUL IEUNG A;So;0;L; 110B 1161;;;;N;CIRCLED HANGUL A;;;; -3276;CIRCLED HANGUL CIEUC A;So;0;L; 110C 1161;;;;N;CIRCLED HANGUL JA;;;; -3277;CIRCLED HANGUL CHIEUCH A;So;0;L; 110E 1161;;;;N;CIRCLED HANGUL CA;;;; -3278;CIRCLED HANGUL KHIEUKH A;So;0;L; 110F 1161;;;;N;CIRCLED HANGUL KA;;;; -3279;CIRCLED HANGUL THIEUTH A;So;0;L; 1110 1161;;;;N;CIRCLED HANGUL TA;;;; -327A;CIRCLED HANGUL PHIEUPH A;So;0;L; 1111 1161;;;;N;CIRCLED HANGUL PA;;;; -327B;CIRCLED HANGUL HIEUH A;So;0;L; 1112 1161;;;;N;CIRCLED HANGUL HA;;;; -327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON; 110E 1161 11B7 1100 1169;;;;N;;;;; -327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON; 110C 116E 110B 1174;;;;N;;;;; -327E;CIRCLED HANGUL IEUNG U;So;0;ON; 110B 116E;;;;N;;;;; -327F;KOREAN STANDARD SYMBOL;So;0;L;;;;;N;;;;; -3280;CIRCLED IDEOGRAPH ONE;No;0;L; 4E00;;;1;N;;;;; -3281;CIRCLED IDEOGRAPH TWO;No;0;L; 4E8C;;;2;N;;;;; -3282;CIRCLED IDEOGRAPH THREE;No;0;L; 4E09;;;3;N;;;;; -3283;CIRCLED IDEOGRAPH FOUR;No;0;L; 56DB;;;4;N;;;;; -3284;CIRCLED IDEOGRAPH FIVE;No;0;L; 4E94;;;5;N;;;;; -3285;CIRCLED IDEOGRAPH SIX;No;0;L; 516D;;;6;N;;;;; -3286;CIRCLED IDEOGRAPH SEVEN;No;0;L; 4E03;;;7;N;;;;; -3287;CIRCLED IDEOGRAPH EIGHT;No;0;L; 516B;;;8;N;;;;; -3288;CIRCLED IDEOGRAPH NINE;No;0;L; 4E5D;;;9;N;;;;; -3289;CIRCLED IDEOGRAPH TEN;No;0;L; 5341;;;10;N;;;;; -328A;CIRCLED IDEOGRAPH MOON;So;0;L; 6708;;;;N;;;;; -328B;CIRCLED IDEOGRAPH FIRE;So;0;L; 706B;;;;N;;;;; -328C;CIRCLED IDEOGRAPH WATER;So;0;L; 6C34;;;;N;;;;; -328D;CIRCLED IDEOGRAPH WOOD;So;0;L; 6728;;;;N;;;;; -328E;CIRCLED IDEOGRAPH METAL;So;0;L; 91D1;;;;N;;;;; -328F;CIRCLED IDEOGRAPH EARTH;So;0;L; 571F;;;;N;;;;; -3290;CIRCLED IDEOGRAPH SUN;So;0;L; 65E5;;;;N;;;;; -3291;CIRCLED IDEOGRAPH STOCK;So;0;L; 682A;;;;N;;;;; -3292;CIRCLED IDEOGRAPH HAVE;So;0;L; 6709;;;;N;;;;; -3293;CIRCLED IDEOGRAPH SOCIETY;So;0;L; 793E;;;;N;;;;; -3294;CIRCLED IDEOGRAPH NAME;So;0;L; 540D;;;;N;;;;; -3295;CIRCLED IDEOGRAPH SPECIAL;So;0;L; 7279;;;;N;;;;; -3296;CIRCLED IDEOGRAPH FINANCIAL;So;0;L; 8CA1;;;;N;;;;; -3297;CIRCLED IDEOGRAPH CONGRATULATION;So;0;L; 795D;;;;N;;;;; -3298;CIRCLED IDEOGRAPH LABOR;So;0;L; 52B4;;;;N;;;;; -3299;CIRCLED IDEOGRAPH SECRET;So;0;L; 79D8;;;;N;;;;; -329A;CIRCLED IDEOGRAPH MALE;So;0;L; 7537;;;;N;;;;; -329B;CIRCLED IDEOGRAPH FEMALE;So;0;L; 5973;;;;N;;;;; -329C;CIRCLED IDEOGRAPH SUITABLE;So;0;L; 9069;;;;N;;;;; -329D;CIRCLED IDEOGRAPH EXCELLENT;So;0;L; 512A;;;;N;;;;; -329E;CIRCLED IDEOGRAPH PRINT;So;0;L; 5370;;;;N;;;;; -329F;CIRCLED IDEOGRAPH ATTENTION;So;0;L; 6CE8;;;;N;;;;; -32A0;CIRCLED IDEOGRAPH ITEM;So;0;L; 9805;;;;N;;;;; -32A1;CIRCLED IDEOGRAPH REST;So;0;L; 4F11;;;;N;;;;; -32A2;CIRCLED IDEOGRAPH COPY;So;0;L; 5199;;;;N;;;;; -32A3;CIRCLED IDEOGRAPH CORRECT;So;0;L; 6B63;;;;N;;;;; -32A4;CIRCLED IDEOGRAPH HIGH;So;0;L; 4E0A;;;;N;;;;; -32A5;CIRCLED IDEOGRAPH CENTRE;So;0;L; 4E2D;;;;N;CIRCLED IDEOGRAPH CENTER;;;; -32A6;CIRCLED IDEOGRAPH LOW;So;0;L; 4E0B;;;;N;;;;; -32A7;CIRCLED IDEOGRAPH LEFT;So;0;L; 5DE6;;;;N;;;;; -32A8;CIRCLED IDEOGRAPH RIGHT;So;0;L; 53F3;;;;N;;;;; -32A9;CIRCLED IDEOGRAPH MEDICINE;So;0;L; 533B;;;;N;;;;; -32AA;CIRCLED IDEOGRAPH RELIGION;So;0;L; 5B97;;;;N;;;;; -32AB;CIRCLED IDEOGRAPH STUDY;So;0;L; 5B66;;;;N;;;;; -32AC;CIRCLED IDEOGRAPH SUPERVISE;So;0;L; 76E3;;;;N;;;;; -32AD;CIRCLED IDEOGRAPH ENTERPRISE;So;0;L; 4F01;;;;N;;;;; -32AE;CIRCLED IDEOGRAPH RESOURCE;So;0;L; 8CC7;;;;N;;;;; -32AF;CIRCLED IDEOGRAPH ALLIANCE;So;0;L; 5354;;;;N;;;;; -32B0;CIRCLED IDEOGRAPH NIGHT;So;0;L; 591C;;;;N;;;;; -32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON; 0033 0036;;;36;N;;;;; -32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON; 0033 0037;;;37;N;;;;; -32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON; 0033 0038;;;38;N;;;;; -32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON; 0033 0039;;;39;N;;;;; -32B5;CIRCLED NUMBER FORTY;No;0;ON; 0034 0030;;;40;N;;;;; -32B6;CIRCLED NUMBER FORTY ONE;No;0;ON; 0034 0031;;;41;N;;;;; -32B7;CIRCLED NUMBER FORTY TWO;No;0;ON; 0034 0032;;;42;N;;;;; -32B8;CIRCLED NUMBER FORTY THREE;No;0;ON; 0034 0033;;;43;N;;;;; -32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON; 0034 0034;;;44;N;;;;; -32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON; 0034 0035;;;45;N;;;;; -32BB;CIRCLED NUMBER FORTY SIX;No;0;ON; 0034 0036;;;46;N;;;;; -32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON; 0034 0037;;;47;N;;;;; -32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON; 0034 0038;;;48;N;;;;; -32BE;CIRCLED NUMBER FORTY NINE;No;0;ON; 0034 0039;;;49;N;;;;; -32BF;CIRCLED NUMBER FIFTY;No;0;ON; 0035 0030;;;50;N;;;;; -32C0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY;So;0;L; 0031 6708;;;;N;;;;; -32C1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY;So;0;L; 0032 6708;;;;N;;;;; -32C2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH;So;0;L; 0033 6708;;;;N;;;;; -32C3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL;So;0;L; 0034 6708;;;;N;;;;; -32C4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY;So;0;L; 0035 6708;;;;N;;;;; -32C5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE;So;0;L; 0036 6708;;;;N;;;;; -32C6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY;So;0;L; 0037 6708;;;;N;;;;; -32C7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST;So;0;L; 0038 6708;;;;N;;;;; -32C8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER;So;0;L; 0039 6708;;;;N;;;;; -32C9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER;So;0;L; 0031 0030 6708;;;;N;;;;; -32CA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER;So;0;L; 0031 0031 6708;;;;N;;;;; -32CB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER;So;0;L; 0031 0032 6708;;;;N;;;;; -32CC;SQUARE HG;So;0;ON; 0048 0067;;;;N;;;;; -32CD;SQUARE ERG;So;0;ON; 0065 0072 0067;;;;N;;;;; -32CE;SQUARE EV;So;0;ON; 0065 0056;;;;N;;;;; -32CF;LIMITED LIABILITY SIGN;So;0;ON; 004C 0054 0044;;;;N;;;;; -32D0;CIRCLED KATAKANA A;So;0;L; 30A2;;;;N;;;;; -32D1;CIRCLED KATAKANA I;So;0;L; 30A4;;;;N;;;;; -32D2;CIRCLED KATAKANA U;So;0;L; 30A6;;;;N;;;;; -32D3;CIRCLED KATAKANA E;So;0;L; 30A8;;;;N;;;;; -32D4;CIRCLED KATAKANA O;So;0;L; 30AA;;;;N;;;;; -32D5;CIRCLED KATAKANA KA;So;0;L; 30AB;;;;N;;;;; -32D6;CIRCLED KATAKANA KI;So;0;L; 30AD;;;;N;;;;; -32D7;CIRCLED KATAKANA KU;So;0;L; 30AF;;;;N;;;;; -32D8;CIRCLED KATAKANA KE;So;0;L; 30B1;;;;N;;;;; -32D9;CIRCLED KATAKANA KO;So;0;L; 30B3;;;;N;;;;; -32DA;CIRCLED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; -32DB;CIRCLED KATAKANA SI;So;0;L; 30B7;;;;N;;;;; -32DC;CIRCLED KATAKANA SU;So;0;L; 30B9;;;;N;;;;; -32DD;CIRCLED KATAKANA SE;So;0;L; 30BB;;;;N;;;;; -32DE;CIRCLED KATAKANA SO;So;0;L; 30BD;;;;N;;;;; -32DF;CIRCLED KATAKANA TA;So;0;L; 30BF;;;;N;;;;; -32E0;CIRCLED KATAKANA TI;So;0;L; 30C1;;;;N;;;;; -32E1;CIRCLED KATAKANA TU;So;0;L; 30C4;;;;N;;;;; -32E2;CIRCLED KATAKANA TE;So;0;L; 30C6;;;;N;;;;; -32E3;CIRCLED KATAKANA TO;So;0;L; 30C8;;;;N;;;;; -32E4;CIRCLED KATAKANA NA;So;0;L; 30CA;;;;N;;;;; -32E5;CIRCLED KATAKANA NI;So;0;L; 30CB;;;;N;;;;; -32E6;CIRCLED KATAKANA NU;So;0;L; 30CC;;;;N;;;;; -32E7;CIRCLED KATAKANA NE;So;0;L; 30CD;;;;N;;;;; -32E8;CIRCLED KATAKANA NO;So;0;L; 30CE;;;;N;;;;; -32E9;CIRCLED KATAKANA HA;So;0;L; 30CF;;;;N;;;;; -32EA;CIRCLED KATAKANA HI;So;0;L; 30D2;;;;N;;;;; -32EB;CIRCLED KATAKANA HU;So;0;L; 30D5;;;;N;;;;; -32EC;CIRCLED KATAKANA HE;So;0;L; 30D8;;;;N;;;;; -32ED;CIRCLED KATAKANA HO;So;0;L; 30DB;;;;N;;;;; -32EE;CIRCLED KATAKANA MA;So;0;L; 30DE;;;;N;;;;; -32EF;CIRCLED KATAKANA MI;So;0;L; 30DF;;;;N;;;;; -32F0;CIRCLED KATAKANA MU;So;0;L; 30E0;;;;N;;;;; -32F1;CIRCLED KATAKANA ME;So;0;L; 30E1;;;;N;;;;; -32F2;CIRCLED KATAKANA MO;So;0;L; 30E2;;;;N;;;;; -32F3;CIRCLED KATAKANA YA;So;0;L; 30E4;;;;N;;;;; -32F4;CIRCLED KATAKANA YU;So;0;L; 30E6;;;;N;;;;; -32F5;CIRCLED KATAKANA YO;So;0;L; 30E8;;;;N;;;;; -32F6;CIRCLED KATAKANA RA;So;0;L; 30E9;;;;N;;;;; -32F7;CIRCLED KATAKANA RI;So;0;L; 30EA;;;;N;;;;; -32F8;CIRCLED KATAKANA RU;So;0;L; 30EB;;;;N;;;;; -32F9;CIRCLED KATAKANA RE;So;0;L; 30EC;;;;N;;;;; -32FA;CIRCLED KATAKANA RO;So;0;L; 30ED;;;;N;;;;; -32FB;CIRCLED KATAKANA WA;So;0;L; 30EF;;;;N;;;;; -32FC;CIRCLED KATAKANA WI;So;0;L; 30F0;;;;N;;;;; -32FD;CIRCLED KATAKANA WE;So;0;L; 30F1;;;;N;;;;; -32FE;CIRCLED KATAKANA WO;So;0;L; 30F2;;;;N;;;;; -3300;SQUARE APAATO;So;0;L; 30A2 30D1 30FC 30C8;;;;N;SQUARED APAATO;;;; -3301;SQUARE ARUHUA;So;0;L; 30A2 30EB 30D5 30A1;;;;N;SQUARED ARUHUA;;;; -3302;SQUARE ANPEA;So;0;L; 30A2 30F3 30DA 30A2;;;;N;SQUARED ANPEA;;;; -3303;SQUARE AARU;So;0;L; 30A2 30FC 30EB;;;;N;SQUARED AARU;;;; -3304;SQUARE ININGU;So;0;L; 30A4 30CB 30F3 30B0;;;;N;SQUARED ININGU;;;; -3305;SQUARE INTI;So;0;L; 30A4 30F3 30C1;;;;N;SQUARED INTI;;;; -3306;SQUARE UON;So;0;L; 30A6 30A9 30F3;;;;N;SQUARED UON;;;; -3307;SQUARE ESUKUUDO;So;0;L; 30A8 30B9 30AF 30FC 30C9;;;;N;SQUARED ESUKUUDO;;;; -3308;SQUARE EEKAA;So;0;L; 30A8 30FC 30AB 30FC;;;;N;SQUARED EEKAA;;;; -3309;SQUARE ONSU;So;0;L; 30AA 30F3 30B9;;;;N;SQUARED ONSU;;;; -330A;SQUARE OOMU;So;0;L; 30AA 30FC 30E0;;;;N;SQUARED OOMU;;;; -330B;SQUARE KAIRI;So;0;L; 30AB 30A4 30EA;;;;N;SQUARED KAIRI;;;; -330C;SQUARE KARATTO;So;0;L; 30AB 30E9 30C3 30C8;;;;N;SQUARED KARATTO;;;; -330D;SQUARE KARORII;So;0;L; 30AB 30ED 30EA 30FC;;;;N;SQUARED KARORII;;;; -330E;SQUARE GARON;So;0;L; 30AC 30ED 30F3;;;;N;SQUARED GARON;;;; -330F;SQUARE GANMA;So;0;L; 30AC 30F3 30DE;;;;N;SQUARED GANMA;;;; -3310;SQUARE GIGA;So;0;L; 30AE 30AC;;;;N;SQUARED GIGA;;;; -3311;SQUARE GINII;So;0;L; 30AE 30CB 30FC;;;;N;SQUARED GINII;;;; -3312;SQUARE KYURII;So;0;L; 30AD 30E5 30EA 30FC;;;;N;SQUARED KYURII;;;; -3313;SQUARE GIRUDAA;So;0;L; 30AE 30EB 30C0 30FC;;;;N;SQUARED GIRUDAA;;;; -3314;SQUARE KIRO;So;0;L; 30AD 30ED;;;;N;SQUARED KIRO;;;; -3315;SQUARE KIROGURAMU;So;0;L; 30AD 30ED 30B0 30E9 30E0;;;;N;SQUARED KIROGURAMU;;;; -3316;SQUARE KIROMEETORU;So;0;L; 30AD 30ED 30E1 30FC 30C8 30EB;;;;N;SQUARED KIROMEETORU;;;; -3317;SQUARE KIROWATTO;So;0;L; 30AD 30ED 30EF 30C3 30C8;;;;N;SQUARED KIROWATTO;;;; -3318;SQUARE GURAMU;So;0;L; 30B0 30E9 30E0;;;;N;SQUARED GURAMU;;;; -3319;SQUARE GURAMUTON;So;0;L; 30B0 30E9 30E0 30C8 30F3;;;;N;SQUARED GURAMUTON;;;; -331A;SQUARE KURUZEIRO;So;0;L; 30AF 30EB 30BC 30A4 30ED;;;;N;SQUARED KURUZEIRO;;;; -331B;SQUARE KUROONE;So;0;L; 30AF 30ED 30FC 30CD;;;;N;SQUARED KUROONE;;;; -331C;SQUARE KEESU;So;0;L; 30B1 30FC 30B9;;;;N;SQUARED KEESU;;;; -331D;SQUARE KORUNA;So;0;L; 30B3 30EB 30CA;;;;N;SQUARED KORUNA;;;; -331E;SQUARE KOOPO;So;0;L; 30B3 30FC 30DD;;;;N;SQUARED KOOPO;;;; -331F;SQUARE SAIKURU;So;0;L; 30B5 30A4 30AF 30EB;;;;N;SQUARED SAIKURU;;;; -3320;SQUARE SANTIIMU;So;0;L; 30B5 30F3 30C1 30FC 30E0;;;;N;SQUARED SANTIIMU;;;; -3321;SQUARE SIRINGU;So;0;L; 30B7 30EA 30F3 30B0;;;;N;SQUARED SIRINGU;;;; -3322;SQUARE SENTI;So;0;L; 30BB 30F3 30C1;;;;N;SQUARED SENTI;;;; -3323;SQUARE SENTO;So;0;L; 30BB 30F3 30C8;;;;N;SQUARED SENTO;;;; -3324;SQUARE DAASU;So;0;L; 30C0 30FC 30B9;;;;N;SQUARED DAASU;;;; -3325;SQUARE DESI;So;0;L; 30C7 30B7;;;;N;SQUARED DESI;;;; -3326;SQUARE DORU;So;0;L; 30C9 30EB;;;;N;SQUARED DORU;;;; -3327;SQUARE TON;So;0;L; 30C8 30F3;;;;N;SQUARED TON;;;; -3328;SQUARE NANO;So;0;L; 30CA 30CE;;;;N;SQUARED NANO;;;; -3329;SQUARE NOTTO;So;0;L; 30CE 30C3 30C8;;;;N;SQUARED NOTTO;;;; -332A;SQUARE HAITU;So;0;L; 30CF 30A4 30C4;;;;N;SQUARED HAITU;;;; -332B;SQUARE PAASENTO;So;0;L; 30D1 30FC 30BB 30F3 30C8;;;;N;SQUARED PAASENTO;;;; -332C;SQUARE PAATU;So;0;L; 30D1 30FC 30C4;;;;N;SQUARED PAATU;;;; -332D;SQUARE BAARERU;So;0;L; 30D0 30FC 30EC 30EB;;;;N;SQUARED BAARERU;;;; -332E;SQUARE PIASUTORU;So;0;L; 30D4 30A2 30B9 30C8 30EB;;;;N;SQUARED PIASUTORU;;;; -332F;SQUARE PIKURU;So;0;L; 30D4 30AF 30EB;;;;N;SQUARED PIKURU;;;; -3330;SQUARE PIKO;So;0;L; 30D4 30B3;;;;N;SQUARED PIKO;;;; -3331;SQUARE BIRU;So;0;L; 30D3 30EB;;;;N;SQUARED BIRU;;;; -3332;SQUARE HUARADDO;So;0;L; 30D5 30A1 30E9 30C3 30C9;;;;N;SQUARED HUARADDO;;;; -3333;SQUARE HUIITO;So;0;L; 30D5 30A3 30FC 30C8;;;;N;SQUARED HUIITO;;;; -3334;SQUARE BUSSYERU;So;0;L; 30D6 30C3 30B7 30A7 30EB;;;;N;SQUARED BUSSYERU;;;; -3335;SQUARE HURAN;So;0;L; 30D5 30E9 30F3;;;;N;SQUARED HURAN;;;; -3336;SQUARE HEKUTAARU;So;0;L; 30D8 30AF 30BF 30FC 30EB;;;;N;SQUARED HEKUTAARU;;;; -3337;SQUARE PESO;So;0;L; 30DA 30BD;;;;N;SQUARED PESO;;;; -3338;SQUARE PENIHI;So;0;L; 30DA 30CB 30D2;;;;N;SQUARED PENIHI;;;; -3339;SQUARE HERUTU;So;0;L; 30D8 30EB 30C4;;;;N;SQUARED HERUTU;;;; -333A;SQUARE PENSU;So;0;L; 30DA 30F3 30B9;;;;N;SQUARED PENSU;;;; -333B;SQUARE PEEZI;So;0;L; 30DA 30FC 30B8;;;;N;SQUARED PEEZI;;;; -333C;SQUARE BEETA;So;0;L; 30D9 30FC 30BF;;;;N;SQUARED BEETA;;;; -333D;SQUARE POINTO;So;0;L; 30DD 30A4 30F3 30C8;;;;N;SQUARED POINTO;;;; -333E;SQUARE BORUTO;So;0;L; 30DC 30EB 30C8;;;;N;SQUARED BORUTO;;;; -333F;SQUARE HON;So;0;L; 30DB 30F3;;;;N;SQUARED HON;;;; -3340;SQUARE PONDO;So;0;L; 30DD 30F3 30C9;;;;N;SQUARED PONDO;;;; -3341;SQUARE HOORU;So;0;L; 30DB 30FC 30EB;;;;N;SQUARED HOORU;;;; -3342;SQUARE HOON;So;0;L; 30DB 30FC 30F3;;;;N;SQUARED HOON;;;; -3343;SQUARE MAIKURO;So;0;L; 30DE 30A4 30AF 30ED;;;;N;SQUARED MAIKURO;;;; -3344;SQUARE MAIRU;So;0;L; 30DE 30A4 30EB;;;;N;SQUARED MAIRU;;;; -3345;SQUARE MAHHA;So;0;L; 30DE 30C3 30CF;;;;N;SQUARED MAHHA;;;; -3346;SQUARE MARUKU;So;0;L; 30DE 30EB 30AF;;;;N;SQUARED MARUKU;;;; -3347;SQUARE MANSYON;So;0;L; 30DE 30F3 30B7 30E7 30F3;;;;N;SQUARED MANSYON;;;; -3348;SQUARE MIKURON;So;0;L; 30DF 30AF 30ED 30F3;;;;N;SQUARED MIKURON;;;; -3349;SQUARE MIRI;So;0;L; 30DF 30EA;;;;N;SQUARED MIRI;;;; -334A;SQUARE MIRIBAARU;So;0;L; 30DF 30EA 30D0 30FC 30EB;;;;N;SQUARED MIRIBAARU;;;; -334B;SQUARE MEGA;So;0;L; 30E1 30AC;;;;N;SQUARED MEGA;;;; -334C;SQUARE MEGATON;So;0;L; 30E1 30AC 30C8 30F3;;;;N;SQUARED MEGATON;;;; -334D;SQUARE MEETORU;So;0;L; 30E1 30FC 30C8 30EB;;;;N;SQUARED MEETORU;;;; -334E;SQUARE YAADO;So;0;L; 30E4 30FC 30C9;;;;N;SQUARED YAADO;;;; -334F;SQUARE YAARU;So;0;L; 30E4 30FC 30EB;;;;N;SQUARED YAARU;;;; -3350;SQUARE YUAN;So;0;L; 30E6 30A2 30F3;;;;N;SQUARED YUAN;;;; -3351;SQUARE RITTORU;So;0;L; 30EA 30C3 30C8 30EB;;;;N;SQUARED RITTORU;;;; -3352;SQUARE RIRA;So;0;L; 30EA 30E9;;;;N;SQUARED RIRA;;;; -3353;SQUARE RUPII;So;0;L; 30EB 30D4 30FC;;;;N;SQUARED RUPII;;;; -3354;SQUARE RUUBURU;So;0;L; 30EB 30FC 30D6 30EB;;;;N;SQUARED RUUBURU;;;; -3355;SQUARE REMU;So;0;L; 30EC 30E0;;;;N;SQUARED REMU;;;; -3356;SQUARE RENTOGEN;So;0;L; 30EC 30F3 30C8 30B2 30F3;;;;N;SQUARED RENTOGEN;;;; -3357;SQUARE WATTO;So;0;L; 30EF 30C3 30C8;;;;N;SQUARED WATTO;;;; -3358;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO;So;0;L; 0030 70B9;;;;N;;;;; -3359;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE;So;0;L; 0031 70B9;;;;N;;;;; -335A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO;So;0;L; 0032 70B9;;;;N;;;;; -335B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE;So;0;L; 0033 70B9;;;;N;;;;; -335C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR;So;0;L; 0034 70B9;;;;N;;;;; -335D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE;So;0;L; 0035 70B9;;;;N;;;;; -335E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX;So;0;L; 0036 70B9;;;;N;;;;; -335F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN;So;0;L; 0037 70B9;;;;N;;;;; -3360;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT;So;0;L; 0038 70B9;;;;N;;;;; -3361;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE;So;0;L; 0039 70B9;;;;N;;;;; -3362;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN;So;0;L; 0031 0030 70B9;;;;N;;;;; -3363;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN;So;0;L; 0031 0031 70B9;;;;N;;;;; -3364;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE;So;0;L; 0031 0032 70B9;;;;N;;;;; -3365;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN;So;0;L; 0031 0033 70B9;;;;N;;;;; -3366;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN;So;0;L; 0031 0034 70B9;;;;N;;;;; -3367;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN;So;0;L; 0031 0035 70B9;;;;N;;;;; -3368;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN;So;0;L; 0031 0036 70B9;;;;N;;;;; -3369;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN;So;0;L; 0031 0037 70B9;;;;N;;;;; -336A;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN;So;0;L; 0031 0038 70B9;;;;N;;;;; -336B;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN;So;0;L; 0031 0039 70B9;;;;N;;;;; -336C;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY;So;0;L; 0032 0030 70B9;;;;N;;;;; -336D;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE;So;0;L; 0032 0031 70B9;;;;N;;;;; -336E;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO;So;0;L; 0032 0032 70B9;;;;N;;;;; -336F;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE;So;0;L; 0032 0033 70B9;;;;N;;;;; -3370;IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR;So;0;L; 0032 0034 70B9;;;;N;;;;; -3371;SQUARE HPA;So;0;L; 0068 0050 0061;;;;N;;;;; -3372;SQUARE DA;So;0;L; 0064 0061;;;;N;;;;; -3373;SQUARE AU;So;0;L; 0041 0055;;;;N;;;;; -3374;SQUARE BAR;So;0;L; 0062 0061 0072;;;;N;;;;; -3375;SQUARE OV;So;0;L; 006F 0056;;;;N;;;;; -3376;SQUARE PC;So;0;L; 0070 0063;;;;N;;;;; -3377;SQUARE DM;So;0;ON; 0064 006D;;;;N;;;;; -3378;SQUARE DM SQUARED;So;0;ON; 0064 006D 00B2;;;;N;;;;; -3379;SQUARE DM CUBED;So;0;ON; 0064 006D 00B3;;;;N;;;;; -337A;SQUARE IU;So;0;ON; 0049 0055;;;;N;;;;; -337B;SQUARE ERA NAME HEISEI;So;0;L; 5E73 6210;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME HEISEI;;;; -337C;SQUARE ERA NAME SYOUWA;So;0;L; 662D 548C;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME SYOUWA;;;; -337D;SQUARE ERA NAME TAISYOU;So;0;L; 5927 6B63;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME TAISYOU;;;; -337E;SQUARE ERA NAME MEIZI;So;0;L; 660E 6CBB;;;;N;SQUARED TWO IDEOGRAPHS ERA NAME MEIZI;;;; -337F;SQUARE CORPORATION;So;0;L; 682A 5F0F 4F1A 793E;;;;N;SQUARED FOUR IDEOGRAPHS CORPORATION;;;; -3380;SQUARE PA AMPS;So;0;L; 0070 0041;;;;N;SQUARED PA AMPS;;;; -3381;SQUARE NA;So;0;L; 006E 0041;;;;N;SQUARED NA;;;; -3382;SQUARE MU A;So;0;L; 03BC 0041;;;;N;SQUARED MU A;;;; -3383;SQUARE MA;So;0;L; 006D 0041;;;;N;SQUARED MA;;;; -3384;SQUARE KA;So;0;L; 006B 0041;;;;N;SQUARED KA;;;; -3385;SQUARE KB;So;0;L; 004B 0042;;;;N;SQUARED KB;;;; -3386;SQUARE MB;So;0;L; 004D 0042;;;;N;SQUARED MB;;;; -3387;SQUARE GB;So;0;L; 0047 0042;;;;N;SQUARED GB;;;; -3388;SQUARE CAL;So;0;L; 0063 0061 006C;;;;N;SQUARED CAL;;;; -3389;SQUARE KCAL;So;0;L; 006B 0063 0061 006C;;;;N;SQUARED KCAL;;;; -338A;SQUARE PF;So;0;L; 0070 0046;;;;N;SQUARED PF;;;; -338B;SQUARE NF;So;0;L; 006E 0046;;;;N;SQUARED NF;;;; -338C;SQUARE MU F;So;0;L; 03BC 0046;;;;N;SQUARED MU F;;;; -338D;SQUARE MU G;So;0;L; 03BC 0067;;;;N;SQUARED MU G;;;; -338E;SQUARE MG;So;0;L; 006D 0067;;;;N;SQUARED MG;;;; -338F;SQUARE KG;So;0;L; 006B 0067;;;;N;SQUARED KG;;;; -3390;SQUARE HZ;So;0;L; 0048 007A;;;;N;SQUARED HZ;;;; -3391;SQUARE KHZ;So;0;L; 006B 0048 007A;;;;N;SQUARED KHZ;;;; -3392;SQUARE MHZ;So;0;L; 004D 0048 007A;;;;N;SQUARED MHZ;;;; -3393;SQUARE GHZ;So;0;L; 0047 0048 007A;;;;N;SQUARED GHZ;;;; -3394;SQUARE THZ;So;0;L; 0054 0048 007A;;;;N;SQUARED THZ;;;; -3395;SQUARE MU L;So;0;L; 03BC 2113;;;;N;SQUARED MU L;;;; -3396;SQUARE ML;So;0;L; 006D 2113;;;;N;SQUARED ML;;;; -3397;SQUARE DL;So;0;L; 0064 2113;;;;N;SQUARED DL;;;; -3398;SQUARE KL;So;0;L; 006B 2113;;;;N;SQUARED KL;;;; -3399;SQUARE FM;So;0;L; 0066 006D;;;;N;SQUARED FM;;;; -339A;SQUARE NM;So;0;L; 006E 006D;;;;N;SQUARED NM;;;; -339B;SQUARE MU M;So;0;L; 03BC 006D;;;;N;SQUARED MU M;;;; -339C;SQUARE MM;So;0;L; 006D 006D;;;;N;SQUARED MM;;;; -339D;SQUARE CM;So;0;L; 0063 006D;;;;N;SQUARED CM;;;; -339E;SQUARE KM;So;0;L; 006B 006D;;;;N;SQUARED KM;;;; -339F;SQUARE MM SQUARED;So;0;L; 006D 006D 00B2;;;;N;SQUARED MM SQUARED;;;; -33A0;SQUARE CM SQUARED;So;0;L; 0063 006D 00B2;;;;N;SQUARED CM SQUARED;;;; -33A1;SQUARE M SQUARED;So;0;L; 006D 00B2;;;;N;SQUARED M SQUARED;;;; -33A2;SQUARE KM SQUARED;So;0;L; 006B 006D 00B2;;;;N;SQUARED KM SQUARED;;;; -33A3;SQUARE MM CUBED;So;0;L; 006D 006D 00B3;;;;N;SQUARED MM CUBED;;;; -33A4;SQUARE CM CUBED;So;0;L; 0063 006D 00B3;;;;N;SQUARED CM CUBED;;;; -33A5;SQUARE M CUBED;So;0;L; 006D 00B3;;;;N;SQUARED M CUBED;;;; -33A6;SQUARE KM CUBED;So;0;L; 006B 006D 00B3;;;;N;SQUARED KM CUBED;;;; -33A7;SQUARE M OVER S;So;0;L; 006D 2215 0073;;;;N;SQUARED M OVER S;;;; -33A8;SQUARE M OVER S SQUARED;So;0;L; 006D 2215 0073 00B2;;;;N;SQUARED M OVER S SQUARED;;;; -33A9;SQUARE PA;So;0;L; 0050 0061;;;;N;SQUARED PA;;;; -33AA;SQUARE KPA;So;0;L; 006B 0050 0061;;;;N;SQUARED KPA;;;; -33AB;SQUARE MPA;So;0;L; 004D 0050 0061;;;;N;SQUARED MPA;;;; -33AC;SQUARE GPA;So;0;L; 0047 0050 0061;;;;N;SQUARED GPA;;;; -33AD;SQUARE RAD;So;0;L; 0072 0061 0064;;;;N;SQUARED RAD;;;; -33AE;SQUARE RAD OVER S;So;0;L; 0072 0061 0064 2215 0073;;;;N;SQUARED RAD OVER S;;;; -33AF;SQUARE RAD OVER S SQUARED;So;0;L; 0072 0061 0064 2215 0073 00B2;;;;N;SQUARED RAD OVER S SQUARED;;;; -33B0;SQUARE PS;So;0;L; 0070 0073;;;;N;SQUARED PS;;;; -33B1;SQUARE NS;So;0;L; 006E 0073;;;;N;SQUARED NS;;;; -33B2;SQUARE MU S;So;0;L; 03BC 0073;;;;N;SQUARED MU S;;;; -33B3;SQUARE MS;So;0;L; 006D 0073;;;;N;SQUARED MS;;;; -33B4;SQUARE PV;So;0;L; 0070 0056;;;;N;SQUARED PV;;;; -33B5;SQUARE NV;So;0;L; 006E 0056;;;;N;SQUARED NV;;;; -33B6;SQUARE MU V;So;0;L; 03BC 0056;;;;N;SQUARED MU V;;;; -33B7;SQUARE MV;So;0;L; 006D 0056;;;;N;SQUARED MV;;;; -33B8;SQUARE KV;So;0;L; 006B 0056;;;;N;SQUARED KV;;;; -33B9;SQUARE MV MEGA;So;0;L; 004D 0056;;;;N;SQUARED MV MEGA;;;; -33BA;SQUARE PW;So;0;L; 0070 0057;;;;N;SQUARED PW;;;; -33BB;SQUARE NW;So;0;L; 006E 0057;;;;N;SQUARED NW;;;; -33BC;SQUARE MU W;So;0;L; 03BC 0057;;;;N;SQUARED MU W;;;; -33BD;SQUARE MW;So;0;L; 006D 0057;;;;N;SQUARED MW;;;; -33BE;SQUARE KW;So;0;L; 006B 0057;;;;N;SQUARED KW;;;; -33BF;SQUARE MW MEGA;So;0;L; 004D 0057;;;;N;SQUARED MW MEGA;;;; -33C0;SQUARE K OHM;So;0;L; 006B 03A9;;;;N;SQUARED K OHM;;;; -33C1;SQUARE M OHM;So;0;L; 004D 03A9;;;;N;SQUARED M OHM;;;; -33C2;SQUARE AM;So;0;L; 0061 002E 006D 002E;;;;N;SQUARED AM;;;; -33C3;SQUARE BQ;So;0;L; 0042 0071;;;;N;SQUARED BQ;;;; -33C4;SQUARE CC;So;0;L; 0063 0063;;;;N;SQUARED CC;;;; -33C5;SQUARE CD;So;0;L; 0063 0064;;;;N;SQUARED CD;;;; -33C6;SQUARE C OVER KG;So;0;L; 0043 2215 006B 0067;;;;N;SQUARED C OVER KG;;;; -33C7;SQUARE CO;So;0;L; 0043 006F 002E;;;;N;SQUARED CO;;;; -33C8;SQUARE DB;So;0;L; 0064 0042;;;;N;SQUARED DB;;;; -33C9;SQUARE GY;So;0;L; 0047 0079;;;;N;SQUARED GY;;;; -33CA;SQUARE HA;So;0;L; 0068 0061;;;;N;SQUARED HA;;;; -33CB;SQUARE HP;So;0;L; 0048 0050;;;;N;SQUARED HP;;;; -33CC;SQUARE IN;So;0;L; 0069 006E;;;;N;SQUARED IN;;;; -33CD;SQUARE KK;So;0;L; 004B 004B;;;;N;SQUARED KK;;;; -33CE;SQUARE KM CAPITAL;So;0;L; 004B 004D;;;;N;SQUARED KM CAPITAL;;;; -33CF;SQUARE KT;So;0;L; 006B 0074;;;;N;SQUARED KT;;;; -33D0;SQUARE LM;So;0;L; 006C 006D;;;;N;SQUARED LM;;;; -33D1;SQUARE LN;So;0;L; 006C 006E;;;;N;SQUARED LN;;;; -33D2;SQUARE LOG;So;0;L; 006C 006F 0067;;;;N;SQUARED LOG;;;; -33D3;SQUARE LX;So;0;L; 006C 0078;;;;N;SQUARED LX;;;; -33D4;SQUARE MB SMALL;So;0;L; 006D 0062;;;;N;SQUARED MB SMALL;;;; -33D5;SQUARE MIL;So;0;L; 006D 0069 006C;;;;N;SQUARED MIL;;;; -33D6;SQUARE MOL;So;0;L; 006D 006F 006C;;;;N;SQUARED MOL;;;; -33D7;SQUARE PH;So;0;L; 0050 0048;;;;N;SQUARED PH;;;; -33D8;SQUARE PM;So;0;L; 0070 002E 006D 002E;;;;N;SQUARED PM;;;; -33D9;SQUARE PPM;So;0;L; 0050 0050 004D;;;;N;SQUARED PPM;;;; -33DA;SQUARE PR;So;0;L; 0050 0052;;;;N;SQUARED PR;;;; -33DB;SQUARE SR;So;0;L; 0073 0072;;;;N;SQUARED SR;;;; -33DC;SQUARE SV;So;0;L; 0053 0076;;;;N;SQUARED SV;;;; -33DD;SQUARE WB;So;0;L; 0057 0062;;;;N;SQUARED WB;;;; -33DE;SQUARE V OVER M;So;0;ON; 0056 2215 006D;;;;N;;;;; -33DF;SQUARE A OVER M;So;0;ON; 0041 2215 006D;;;;N;;;;; -33E0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE;So;0;L; 0031 65E5;;;;N;;;;; -33E1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO;So;0;L; 0032 65E5;;;;N;;;;; -33E2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE;So;0;L; 0033 65E5;;;;N;;;;; -33E3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR;So;0;L; 0034 65E5;;;;N;;;;; -33E4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE;So;0;L; 0035 65E5;;;;N;;;;; -33E5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX;So;0;L; 0036 65E5;;;;N;;;;; -33E6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN;So;0;L; 0037 65E5;;;;N;;;;; -33E7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT;So;0;L; 0038 65E5;;;;N;;;;; -33E8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE;So;0;L; 0039 65E5;;;;N;;;;; -33E9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN;So;0;L; 0031 0030 65E5;;;;N;;;;; -33EA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN;So;0;L; 0031 0031 65E5;;;;N;;;;; -33EB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE;So;0;L; 0031 0032 65E5;;;;N;;;;; -33EC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN;So;0;L; 0031 0033 65E5;;;;N;;;;; -33ED;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN;So;0;L; 0031 0034 65E5;;;;N;;;;; -33EE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN;So;0;L; 0031 0035 65E5;;;;N;;;;; -33EF;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN;So;0;L; 0031 0036 65E5;;;;N;;;;; -33F0;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN;So;0;L; 0031 0037 65E5;;;;N;;;;; -33F1;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN;So;0;L; 0031 0038 65E5;;;;N;;;;; -33F2;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN;So;0;L; 0031 0039 65E5;;;;N;;;;; -33F3;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY;So;0;L; 0032 0030 65E5;;;;N;;;;; -33F4;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE;So;0;L; 0032 0031 65E5;;;;N;;;;; -33F5;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO;So;0;L; 0032 0032 65E5;;;;N;;;;; -33F6;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE;So;0;L; 0032 0033 65E5;;;;N;;;;; -33F7;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR;So;0;L; 0032 0034 65E5;;;;N;;;;; -33F8;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE;So;0;L; 0032 0035 65E5;;;;N;;;;; -33F9;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX;So;0;L; 0032 0036 65E5;;;;N;;;;; -33FA;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN;So;0;L; 0032 0037 65E5;;;;N;;;;; -33FB;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT;So;0;L; 0032 0038 65E5;;;;N;;;;; -33FC;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE;So;0;L; 0032 0039 65E5;;;;N;;;;; -33FD;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY;So;0;L; 0033 0030 65E5;;;;N;;;;; -33FE;IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE;So;0;L; 0033 0031 65E5;;;;N;;;;; -33FF;SQUARE GAL;So;0;ON; 0067 0061 006C;;;;N;;;;; -3400;;Lo;0;L;;;;;N;;;;; -4DB5;;Lo;0;L;;;;;N;;;;; -4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;; -4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;; -4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;; -4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;; -4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; -4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;; -4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;; -4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;; -4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;; -4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;; -4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;; -4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;; -4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;; -4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;; -4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;; -4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;; -4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; -4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;; -4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;; -4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;; -4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;; -4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;; -4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;; -4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;; -4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;; -4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;; -4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;; -4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;; -4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;; -4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;; -4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;; -4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;; -4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;; -4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;; -4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;; -4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;; -4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;; -4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; -4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;; -4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;; -4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;; -4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; -4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;; -4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;; -4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;; -4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;; -4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;; -4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;; -4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;; -4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;; -4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;; -4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;; -4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;; -4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;; -4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;; -4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;; -4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;; -4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;; -4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;; -4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;; -4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;; -4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;; -4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;; -4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;; -4E00;;Lo;0;L;;;;;N;;;;; -9FD5;;Lo;0;L;;;;;N;;;;; -A000;YI SYLLABLE IT;Lo;0;L;;;;;N;;;;; -A001;YI SYLLABLE IX;Lo;0;L;;;;;N;;;;; -A002;YI SYLLABLE I;Lo;0;L;;;;;N;;;;; -A003;YI SYLLABLE IP;Lo;0;L;;;;;N;;;;; -A004;YI SYLLABLE IET;Lo;0;L;;;;;N;;;;; -A005;YI SYLLABLE IEX;Lo;0;L;;;;;N;;;;; -A006;YI SYLLABLE IE;Lo;0;L;;;;;N;;;;; -A007;YI SYLLABLE IEP;Lo;0;L;;;;;N;;;;; -A008;YI SYLLABLE AT;Lo;0;L;;;;;N;;;;; -A009;YI SYLLABLE AX;Lo;0;L;;;;;N;;;;; -A00A;YI SYLLABLE A;Lo;0;L;;;;;N;;;;; -A00B;YI SYLLABLE AP;Lo;0;L;;;;;N;;;;; -A00C;YI SYLLABLE UOX;Lo;0;L;;;;;N;;;;; -A00D;YI SYLLABLE UO;Lo;0;L;;;;;N;;;;; -A00E;YI SYLLABLE UOP;Lo;0;L;;;;;N;;;;; -A00F;YI SYLLABLE OT;Lo;0;L;;;;;N;;;;; -A010;YI SYLLABLE OX;Lo;0;L;;;;;N;;;;; -A011;YI SYLLABLE O;Lo;0;L;;;;;N;;;;; -A012;YI SYLLABLE OP;Lo;0;L;;;;;N;;;;; -A013;YI SYLLABLE EX;Lo;0;L;;;;;N;;;;; -A014;YI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A015;YI SYLLABLE WU;Lm;0;L;;;;;N;;;;; -A016;YI SYLLABLE BIT;Lo;0;L;;;;;N;;;;; -A017;YI SYLLABLE BIX;Lo;0;L;;;;;N;;;;; -A018;YI SYLLABLE BI;Lo;0;L;;;;;N;;;;; -A019;YI SYLLABLE BIP;Lo;0;L;;;;;N;;;;; -A01A;YI SYLLABLE BIET;Lo;0;L;;;;;N;;;;; -A01B;YI SYLLABLE BIEX;Lo;0;L;;;;;N;;;;; -A01C;YI SYLLABLE BIE;Lo;0;L;;;;;N;;;;; -A01D;YI SYLLABLE BIEP;Lo;0;L;;;;;N;;;;; -A01E;YI SYLLABLE BAT;Lo;0;L;;;;;N;;;;; -A01F;YI SYLLABLE BAX;Lo;0;L;;;;;N;;;;; -A020;YI SYLLABLE BA;Lo;0;L;;;;;N;;;;; -A021;YI SYLLABLE BAP;Lo;0;L;;;;;N;;;;; -A022;YI SYLLABLE BUOX;Lo;0;L;;;;;N;;;;; -A023;YI SYLLABLE BUO;Lo;0;L;;;;;N;;;;; -A024;YI SYLLABLE BUOP;Lo;0;L;;;;;N;;;;; -A025;YI SYLLABLE BOT;Lo;0;L;;;;;N;;;;; -A026;YI SYLLABLE BOX;Lo;0;L;;;;;N;;;;; -A027;YI SYLLABLE BO;Lo;0;L;;;;;N;;;;; -A028;YI SYLLABLE BOP;Lo;0;L;;;;;N;;;;; -A029;YI SYLLABLE BEX;Lo;0;L;;;;;N;;;;; -A02A;YI SYLLABLE BE;Lo;0;L;;;;;N;;;;; -A02B;YI SYLLABLE BEP;Lo;0;L;;;;;N;;;;; -A02C;YI SYLLABLE BUT;Lo;0;L;;;;;N;;;;; -A02D;YI SYLLABLE BUX;Lo;0;L;;;;;N;;;;; -A02E;YI SYLLABLE BU;Lo;0;L;;;;;N;;;;; -A02F;YI SYLLABLE BUP;Lo;0;L;;;;;N;;;;; -A030;YI SYLLABLE BURX;Lo;0;L;;;;;N;;;;; -A031;YI SYLLABLE BUR;Lo;0;L;;;;;N;;;;; -A032;YI SYLLABLE BYT;Lo;0;L;;;;;N;;;;; -A033;YI SYLLABLE BYX;Lo;0;L;;;;;N;;;;; -A034;YI SYLLABLE BY;Lo;0;L;;;;;N;;;;; -A035;YI SYLLABLE BYP;Lo;0;L;;;;;N;;;;; -A036;YI SYLLABLE BYRX;Lo;0;L;;;;;N;;;;; -A037;YI SYLLABLE BYR;Lo;0;L;;;;;N;;;;; -A038;YI SYLLABLE PIT;Lo;0;L;;;;;N;;;;; -A039;YI SYLLABLE PIX;Lo;0;L;;;;;N;;;;; -A03A;YI SYLLABLE PI;Lo;0;L;;;;;N;;;;; -A03B;YI SYLLABLE PIP;Lo;0;L;;;;;N;;;;; -A03C;YI SYLLABLE PIEX;Lo;0;L;;;;;N;;;;; -A03D;YI SYLLABLE PIE;Lo;0;L;;;;;N;;;;; -A03E;YI SYLLABLE PIEP;Lo;0;L;;;;;N;;;;; -A03F;YI SYLLABLE PAT;Lo;0;L;;;;;N;;;;; -A040;YI SYLLABLE PAX;Lo;0;L;;;;;N;;;;; -A041;YI SYLLABLE PA;Lo;0;L;;;;;N;;;;; -A042;YI SYLLABLE PAP;Lo;0;L;;;;;N;;;;; -A043;YI SYLLABLE PUOX;Lo;0;L;;;;;N;;;;; -A044;YI SYLLABLE PUO;Lo;0;L;;;;;N;;;;; -A045;YI SYLLABLE PUOP;Lo;0;L;;;;;N;;;;; -A046;YI SYLLABLE POT;Lo;0;L;;;;;N;;;;; -A047;YI SYLLABLE POX;Lo;0;L;;;;;N;;;;; -A048;YI SYLLABLE PO;Lo;0;L;;;;;N;;;;; -A049;YI SYLLABLE POP;Lo;0;L;;;;;N;;;;; -A04A;YI SYLLABLE PUT;Lo;0;L;;;;;N;;;;; -A04B;YI SYLLABLE PUX;Lo;0;L;;;;;N;;;;; -A04C;YI SYLLABLE PU;Lo;0;L;;;;;N;;;;; -A04D;YI SYLLABLE PUP;Lo;0;L;;;;;N;;;;; -A04E;YI SYLLABLE PURX;Lo;0;L;;;;;N;;;;; -A04F;YI SYLLABLE PUR;Lo;0;L;;;;;N;;;;; -A050;YI SYLLABLE PYT;Lo;0;L;;;;;N;;;;; -A051;YI SYLLABLE PYX;Lo;0;L;;;;;N;;;;; -A052;YI SYLLABLE PY;Lo;0;L;;;;;N;;;;; -A053;YI SYLLABLE PYP;Lo;0;L;;;;;N;;;;; -A054;YI SYLLABLE PYRX;Lo;0;L;;;;;N;;;;; -A055;YI SYLLABLE PYR;Lo;0;L;;;;;N;;;;; -A056;YI SYLLABLE BBIT;Lo;0;L;;;;;N;;;;; -A057;YI SYLLABLE BBIX;Lo;0;L;;;;;N;;;;; -A058;YI SYLLABLE BBI;Lo;0;L;;;;;N;;;;; -A059;YI SYLLABLE BBIP;Lo;0;L;;;;;N;;;;; -A05A;YI SYLLABLE BBIET;Lo;0;L;;;;;N;;;;; -A05B;YI SYLLABLE BBIEX;Lo;0;L;;;;;N;;;;; -A05C;YI SYLLABLE BBIE;Lo;0;L;;;;;N;;;;; -A05D;YI SYLLABLE BBIEP;Lo;0;L;;;;;N;;;;; -A05E;YI SYLLABLE BBAT;Lo;0;L;;;;;N;;;;; -A05F;YI SYLLABLE BBAX;Lo;0;L;;;;;N;;;;; -A060;YI SYLLABLE BBA;Lo;0;L;;;;;N;;;;; -A061;YI SYLLABLE BBAP;Lo;0;L;;;;;N;;;;; -A062;YI SYLLABLE BBUOX;Lo;0;L;;;;;N;;;;; -A063;YI SYLLABLE BBUO;Lo;0;L;;;;;N;;;;; -A064;YI SYLLABLE BBUOP;Lo;0;L;;;;;N;;;;; -A065;YI SYLLABLE BBOT;Lo;0;L;;;;;N;;;;; -A066;YI SYLLABLE BBOX;Lo;0;L;;;;;N;;;;; -A067;YI SYLLABLE BBO;Lo;0;L;;;;;N;;;;; -A068;YI SYLLABLE BBOP;Lo;0;L;;;;;N;;;;; -A069;YI SYLLABLE BBEX;Lo;0;L;;;;;N;;;;; -A06A;YI SYLLABLE BBE;Lo;0;L;;;;;N;;;;; -A06B;YI SYLLABLE BBEP;Lo;0;L;;;;;N;;;;; -A06C;YI SYLLABLE BBUT;Lo;0;L;;;;;N;;;;; -A06D;YI SYLLABLE BBUX;Lo;0;L;;;;;N;;;;; -A06E;YI SYLLABLE BBU;Lo;0;L;;;;;N;;;;; -A06F;YI SYLLABLE BBUP;Lo;0;L;;;;;N;;;;; -A070;YI SYLLABLE BBURX;Lo;0;L;;;;;N;;;;; -A071;YI SYLLABLE BBUR;Lo;0;L;;;;;N;;;;; -A072;YI SYLLABLE BBYT;Lo;0;L;;;;;N;;;;; -A073;YI SYLLABLE BBYX;Lo;0;L;;;;;N;;;;; -A074;YI SYLLABLE BBY;Lo;0;L;;;;;N;;;;; -A075;YI SYLLABLE BBYP;Lo;0;L;;;;;N;;;;; -A076;YI SYLLABLE NBIT;Lo;0;L;;;;;N;;;;; -A077;YI SYLLABLE NBIX;Lo;0;L;;;;;N;;;;; -A078;YI SYLLABLE NBI;Lo;0;L;;;;;N;;;;; -A079;YI SYLLABLE NBIP;Lo;0;L;;;;;N;;;;; -A07A;YI SYLLABLE NBIEX;Lo;0;L;;;;;N;;;;; -A07B;YI SYLLABLE NBIE;Lo;0;L;;;;;N;;;;; -A07C;YI SYLLABLE NBIEP;Lo;0;L;;;;;N;;;;; -A07D;YI SYLLABLE NBAT;Lo;0;L;;;;;N;;;;; -A07E;YI SYLLABLE NBAX;Lo;0;L;;;;;N;;;;; -A07F;YI SYLLABLE NBA;Lo;0;L;;;;;N;;;;; -A080;YI SYLLABLE NBAP;Lo;0;L;;;;;N;;;;; -A081;YI SYLLABLE NBOT;Lo;0;L;;;;;N;;;;; -A082;YI SYLLABLE NBOX;Lo;0;L;;;;;N;;;;; -A083;YI SYLLABLE NBO;Lo;0;L;;;;;N;;;;; -A084;YI SYLLABLE NBOP;Lo;0;L;;;;;N;;;;; -A085;YI SYLLABLE NBUT;Lo;0;L;;;;;N;;;;; -A086;YI SYLLABLE NBUX;Lo;0;L;;;;;N;;;;; -A087;YI SYLLABLE NBU;Lo;0;L;;;;;N;;;;; -A088;YI SYLLABLE NBUP;Lo;0;L;;;;;N;;;;; -A089;YI SYLLABLE NBURX;Lo;0;L;;;;;N;;;;; -A08A;YI SYLLABLE NBUR;Lo;0;L;;;;;N;;;;; -A08B;YI SYLLABLE NBYT;Lo;0;L;;;;;N;;;;; -A08C;YI SYLLABLE NBYX;Lo;0;L;;;;;N;;;;; -A08D;YI SYLLABLE NBY;Lo;0;L;;;;;N;;;;; -A08E;YI SYLLABLE NBYP;Lo;0;L;;;;;N;;;;; -A08F;YI SYLLABLE NBYRX;Lo;0;L;;;;;N;;;;; -A090;YI SYLLABLE NBYR;Lo;0;L;;;;;N;;;;; -A091;YI SYLLABLE HMIT;Lo;0;L;;;;;N;;;;; -A092;YI SYLLABLE HMIX;Lo;0;L;;;;;N;;;;; -A093;YI SYLLABLE HMI;Lo;0;L;;;;;N;;;;; -A094;YI SYLLABLE HMIP;Lo;0;L;;;;;N;;;;; -A095;YI SYLLABLE HMIEX;Lo;0;L;;;;;N;;;;; -A096;YI SYLLABLE HMIE;Lo;0;L;;;;;N;;;;; -A097;YI SYLLABLE HMIEP;Lo;0;L;;;;;N;;;;; -A098;YI SYLLABLE HMAT;Lo;0;L;;;;;N;;;;; -A099;YI SYLLABLE HMAX;Lo;0;L;;;;;N;;;;; -A09A;YI SYLLABLE HMA;Lo;0;L;;;;;N;;;;; -A09B;YI SYLLABLE HMAP;Lo;0;L;;;;;N;;;;; -A09C;YI SYLLABLE HMUOX;Lo;0;L;;;;;N;;;;; -A09D;YI SYLLABLE HMUO;Lo;0;L;;;;;N;;;;; -A09E;YI SYLLABLE HMUOP;Lo;0;L;;;;;N;;;;; -A09F;YI SYLLABLE HMOT;Lo;0;L;;;;;N;;;;; -A0A0;YI SYLLABLE HMOX;Lo;0;L;;;;;N;;;;; -A0A1;YI SYLLABLE HMO;Lo;0;L;;;;;N;;;;; -A0A2;YI SYLLABLE HMOP;Lo;0;L;;;;;N;;;;; -A0A3;YI SYLLABLE HMUT;Lo;0;L;;;;;N;;;;; -A0A4;YI SYLLABLE HMUX;Lo;0;L;;;;;N;;;;; -A0A5;YI SYLLABLE HMU;Lo;0;L;;;;;N;;;;; -A0A6;YI SYLLABLE HMUP;Lo;0;L;;;;;N;;;;; -A0A7;YI SYLLABLE HMURX;Lo;0;L;;;;;N;;;;; -A0A8;YI SYLLABLE HMUR;Lo;0;L;;;;;N;;;;; -A0A9;YI SYLLABLE HMYX;Lo;0;L;;;;;N;;;;; -A0AA;YI SYLLABLE HMY;Lo;0;L;;;;;N;;;;; -A0AB;YI SYLLABLE HMYP;Lo;0;L;;;;;N;;;;; -A0AC;YI SYLLABLE HMYRX;Lo;0;L;;;;;N;;;;; -A0AD;YI SYLLABLE HMYR;Lo;0;L;;;;;N;;;;; -A0AE;YI SYLLABLE MIT;Lo;0;L;;;;;N;;;;; -A0AF;YI SYLLABLE MIX;Lo;0;L;;;;;N;;;;; -A0B0;YI SYLLABLE MI;Lo;0;L;;;;;N;;;;; -A0B1;YI SYLLABLE MIP;Lo;0;L;;;;;N;;;;; -A0B2;YI SYLLABLE MIEX;Lo;0;L;;;;;N;;;;; -A0B3;YI SYLLABLE MIE;Lo;0;L;;;;;N;;;;; -A0B4;YI SYLLABLE MIEP;Lo;0;L;;;;;N;;;;; -A0B5;YI SYLLABLE MAT;Lo;0;L;;;;;N;;;;; -A0B6;YI SYLLABLE MAX;Lo;0;L;;;;;N;;;;; -A0B7;YI SYLLABLE MA;Lo;0;L;;;;;N;;;;; -A0B8;YI SYLLABLE MAP;Lo;0;L;;;;;N;;;;; -A0B9;YI SYLLABLE MUOT;Lo;0;L;;;;;N;;;;; -A0BA;YI SYLLABLE MUOX;Lo;0;L;;;;;N;;;;; -A0BB;YI SYLLABLE MUO;Lo;0;L;;;;;N;;;;; -A0BC;YI SYLLABLE MUOP;Lo;0;L;;;;;N;;;;; -A0BD;YI SYLLABLE MOT;Lo;0;L;;;;;N;;;;; -A0BE;YI SYLLABLE MOX;Lo;0;L;;;;;N;;;;; -A0BF;YI SYLLABLE MO;Lo;0;L;;;;;N;;;;; -A0C0;YI SYLLABLE MOP;Lo;0;L;;;;;N;;;;; -A0C1;YI SYLLABLE MEX;Lo;0;L;;;;;N;;;;; -A0C2;YI SYLLABLE ME;Lo;0;L;;;;;N;;;;; -A0C3;YI SYLLABLE MUT;Lo;0;L;;;;;N;;;;; -A0C4;YI SYLLABLE MUX;Lo;0;L;;;;;N;;;;; -A0C5;YI SYLLABLE MU;Lo;0;L;;;;;N;;;;; -A0C6;YI SYLLABLE MUP;Lo;0;L;;;;;N;;;;; -A0C7;YI SYLLABLE MURX;Lo;0;L;;;;;N;;;;; -A0C8;YI SYLLABLE MUR;Lo;0;L;;;;;N;;;;; -A0C9;YI SYLLABLE MYT;Lo;0;L;;;;;N;;;;; -A0CA;YI SYLLABLE MYX;Lo;0;L;;;;;N;;;;; -A0CB;YI SYLLABLE MY;Lo;0;L;;;;;N;;;;; -A0CC;YI SYLLABLE MYP;Lo;0;L;;;;;N;;;;; -A0CD;YI SYLLABLE FIT;Lo;0;L;;;;;N;;;;; -A0CE;YI SYLLABLE FIX;Lo;0;L;;;;;N;;;;; -A0CF;YI SYLLABLE FI;Lo;0;L;;;;;N;;;;; -A0D0;YI SYLLABLE FIP;Lo;0;L;;;;;N;;;;; -A0D1;YI SYLLABLE FAT;Lo;0;L;;;;;N;;;;; -A0D2;YI SYLLABLE FAX;Lo;0;L;;;;;N;;;;; -A0D3;YI SYLLABLE FA;Lo;0;L;;;;;N;;;;; -A0D4;YI SYLLABLE FAP;Lo;0;L;;;;;N;;;;; -A0D5;YI SYLLABLE FOX;Lo;0;L;;;;;N;;;;; -A0D6;YI SYLLABLE FO;Lo;0;L;;;;;N;;;;; -A0D7;YI SYLLABLE FOP;Lo;0;L;;;;;N;;;;; -A0D8;YI SYLLABLE FUT;Lo;0;L;;;;;N;;;;; -A0D9;YI SYLLABLE FUX;Lo;0;L;;;;;N;;;;; -A0DA;YI SYLLABLE FU;Lo;0;L;;;;;N;;;;; -A0DB;YI SYLLABLE FUP;Lo;0;L;;;;;N;;;;; -A0DC;YI SYLLABLE FURX;Lo;0;L;;;;;N;;;;; -A0DD;YI SYLLABLE FUR;Lo;0;L;;;;;N;;;;; -A0DE;YI SYLLABLE FYT;Lo;0;L;;;;;N;;;;; -A0DF;YI SYLLABLE FYX;Lo;0;L;;;;;N;;;;; -A0E0;YI SYLLABLE FY;Lo;0;L;;;;;N;;;;; -A0E1;YI SYLLABLE FYP;Lo;0;L;;;;;N;;;;; -A0E2;YI SYLLABLE VIT;Lo;0;L;;;;;N;;;;; -A0E3;YI SYLLABLE VIX;Lo;0;L;;;;;N;;;;; -A0E4;YI SYLLABLE VI;Lo;0;L;;;;;N;;;;; -A0E5;YI SYLLABLE VIP;Lo;0;L;;;;;N;;;;; -A0E6;YI SYLLABLE VIET;Lo;0;L;;;;;N;;;;; -A0E7;YI SYLLABLE VIEX;Lo;0;L;;;;;N;;;;; -A0E8;YI SYLLABLE VIE;Lo;0;L;;;;;N;;;;; -A0E9;YI SYLLABLE VIEP;Lo;0;L;;;;;N;;;;; -A0EA;YI SYLLABLE VAT;Lo;0;L;;;;;N;;;;; -A0EB;YI SYLLABLE VAX;Lo;0;L;;;;;N;;;;; -A0EC;YI SYLLABLE VA;Lo;0;L;;;;;N;;;;; -A0ED;YI SYLLABLE VAP;Lo;0;L;;;;;N;;;;; -A0EE;YI SYLLABLE VOT;Lo;0;L;;;;;N;;;;; -A0EF;YI SYLLABLE VOX;Lo;0;L;;;;;N;;;;; -A0F0;YI SYLLABLE VO;Lo;0;L;;;;;N;;;;; -A0F1;YI SYLLABLE VOP;Lo;0;L;;;;;N;;;;; -A0F2;YI SYLLABLE VEX;Lo;0;L;;;;;N;;;;; -A0F3;YI SYLLABLE VEP;Lo;0;L;;;;;N;;;;; -A0F4;YI SYLLABLE VUT;Lo;0;L;;;;;N;;;;; -A0F5;YI SYLLABLE VUX;Lo;0;L;;;;;N;;;;; -A0F6;YI SYLLABLE VU;Lo;0;L;;;;;N;;;;; -A0F7;YI SYLLABLE VUP;Lo;0;L;;;;;N;;;;; -A0F8;YI SYLLABLE VURX;Lo;0;L;;;;;N;;;;; -A0F9;YI SYLLABLE VUR;Lo;0;L;;;;;N;;;;; -A0FA;YI SYLLABLE VYT;Lo;0;L;;;;;N;;;;; -A0FB;YI SYLLABLE VYX;Lo;0;L;;;;;N;;;;; -A0FC;YI SYLLABLE VY;Lo;0;L;;;;;N;;;;; -A0FD;YI SYLLABLE VYP;Lo;0;L;;;;;N;;;;; -A0FE;YI SYLLABLE VYRX;Lo;0;L;;;;;N;;;;; -A0FF;YI SYLLABLE VYR;Lo;0;L;;;;;N;;;;; -A100;YI SYLLABLE DIT;Lo;0;L;;;;;N;;;;; -A101;YI SYLLABLE DIX;Lo;0;L;;;;;N;;;;; -A102;YI SYLLABLE DI;Lo;0;L;;;;;N;;;;; -A103;YI SYLLABLE DIP;Lo;0;L;;;;;N;;;;; -A104;YI SYLLABLE DIEX;Lo;0;L;;;;;N;;;;; -A105;YI SYLLABLE DIE;Lo;0;L;;;;;N;;;;; -A106;YI SYLLABLE DIEP;Lo;0;L;;;;;N;;;;; -A107;YI SYLLABLE DAT;Lo;0;L;;;;;N;;;;; -A108;YI SYLLABLE DAX;Lo;0;L;;;;;N;;;;; -A109;YI SYLLABLE DA;Lo;0;L;;;;;N;;;;; -A10A;YI SYLLABLE DAP;Lo;0;L;;;;;N;;;;; -A10B;YI SYLLABLE DUOX;Lo;0;L;;;;;N;;;;; -A10C;YI SYLLABLE DUO;Lo;0;L;;;;;N;;;;; -A10D;YI SYLLABLE DOT;Lo;0;L;;;;;N;;;;; -A10E;YI SYLLABLE DOX;Lo;0;L;;;;;N;;;;; -A10F;YI SYLLABLE DO;Lo;0;L;;;;;N;;;;; -A110;YI SYLLABLE DOP;Lo;0;L;;;;;N;;;;; -A111;YI SYLLABLE DEX;Lo;0;L;;;;;N;;;;; -A112;YI SYLLABLE DE;Lo;0;L;;;;;N;;;;; -A113;YI SYLLABLE DEP;Lo;0;L;;;;;N;;;;; -A114;YI SYLLABLE DUT;Lo;0;L;;;;;N;;;;; -A115;YI SYLLABLE DUX;Lo;0;L;;;;;N;;;;; -A116;YI SYLLABLE DU;Lo;0;L;;;;;N;;;;; -A117;YI SYLLABLE DUP;Lo;0;L;;;;;N;;;;; -A118;YI SYLLABLE DURX;Lo;0;L;;;;;N;;;;; -A119;YI SYLLABLE DUR;Lo;0;L;;;;;N;;;;; -A11A;YI SYLLABLE TIT;Lo;0;L;;;;;N;;;;; -A11B;YI SYLLABLE TIX;Lo;0;L;;;;;N;;;;; -A11C;YI SYLLABLE TI;Lo;0;L;;;;;N;;;;; -A11D;YI SYLLABLE TIP;Lo;0;L;;;;;N;;;;; -A11E;YI SYLLABLE TIEX;Lo;0;L;;;;;N;;;;; -A11F;YI SYLLABLE TIE;Lo;0;L;;;;;N;;;;; -A120;YI SYLLABLE TIEP;Lo;0;L;;;;;N;;;;; -A121;YI SYLLABLE TAT;Lo;0;L;;;;;N;;;;; -A122;YI SYLLABLE TAX;Lo;0;L;;;;;N;;;;; -A123;YI SYLLABLE TA;Lo;0;L;;;;;N;;;;; -A124;YI SYLLABLE TAP;Lo;0;L;;;;;N;;;;; -A125;YI SYLLABLE TUOT;Lo;0;L;;;;;N;;;;; -A126;YI SYLLABLE TUOX;Lo;0;L;;;;;N;;;;; -A127;YI SYLLABLE TUO;Lo;0;L;;;;;N;;;;; -A128;YI SYLLABLE TUOP;Lo;0;L;;;;;N;;;;; -A129;YI SYLLABLE TOT;Lo;0;L;;;;;N;;;;; -A12A;YI SYLLABLE TOX;Lo;0;L;;;;;N;;;;; -A12B;YI SYLLABLE TO;Lo;0;L;;;;;N;;;;; -A12C;YI SYLLABLE TOP;Lo;0;L;;;;;N;;;;; -A12D;YI SYLLABLE TEX;Lo;0;L;;;;;N;;;;; -A12E;YI SYLLABLE TE;Lo;0;L;;;;;N;;;;; -A12F;YI SYLLABLE TEP;Lo;0;L;;;;;N;;;;; -A130;YI SYLLABLE TUT;Lo;0;L;;;;;N;;;;; -A131;YI SYLLABLE TUX;Lo;0;L;;;;;N;;;;; -A132;YI SYLLABLE TU;Lo;0;L;;;;;N;;;;; -A133;YI SYLLABLE TUP;Lo;0;L;;;;;N;;;;; -A134;YI SYLLABLE TURX;Lo;0;L;;;;;N;;;;; -A135;YI SYLLABLE TUR;Lo;0;L;;;;;N;;;;; -A136;YI SYLLABLE DDIT;Lo;0;L;;;;;N;;;;; -A137;YI SYLLABLE DDIX;Lo;0;L;;;;;N;;;;; -A138;YI SYLLABLE DDI;Lo;0;L;;;;;N;;;;; -A139;YI SYLLABLE DDIP;Lo;0;L;;;;;N;;;;; -A13A;YI SYLLABLE DDIEX;Lo;0;L;;;;;N;;;;; -A13B;YI SYLLABLE DDIE;Lo;0;L;;;;;N;;;;; -A13C;YI SYLLABLE DDIEP;Lo;0;L;;;;;N;;;;; -A13D;YI SYLLABLE DDAT;Lo;0;L;;;;;N;;;;; -A13E;YI SYLLABLE DDAX;Lo;0;L;;;;;N;;;;; -A13F;YI SYLLABLE DDA;Lo;0;L;;;;;N;;;;; -A140;YI SYLLABLE DDAP;Lo;0;L;;;;;N;;;;; -A141;YI SYLLABLE DDUOX;Lo;0;L;;;;;N;;;;; -A142;YI SYLLABLE DDUO;Lo;0;L;;;;;N;;;;; -A143;YI SYLLABLE DDUOP;Lo;0;L;;;;;N;;;;; -A144;YI SYLLABLE DDOT;Lo;0;L;;;;;N;;;;; -A145;YI SYLLABLE DDOX;Lo;0;L;;;;;N;;;;; -A146;YI SYLLABLE DDO;Lo;0;L;;;;;N;;;;; -A147;YI SYLLABLE DDOP;Lo;0;L;;;;;N;;;;; -A148;YI SYLLABLE DDEX;Lo;0;L;;;;;N;;;;; -A149;YI SYLLABLE DDE;Lo;0;L;;;;;N;;;;; -A14A;YI SYLLABLE DDEP;Lo;0;L;;;;;N;;;;; -A14B;YI SYLLABLE DDUT;Lo;0;L;;;;;N;;;;; -A14C;YI SYLLABLE DDUX;Lo;0;L;;;;;N;;;;; -A14D;YI SYLLABLE DDU;Lo;0;L;;;;;N;;;;; -A14E;YI SYLLABLE DDUP;Lo;0;L;;;;;N;;;;; -A14F;YI SYLLABLE DDURX;Lo;0;L;;;;;N;;;;; -A150;YI SYLLABLE DDUR;Lo;0;L;;;;;N;;;;; -A151;YI SYLLABLE NDIT;Lo;0;L;;;;;N;;;;; -A152;YI SYLLABLE NDIX;Lo;0;L;;;;;N;;;;; -A153;YI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; -A154;YI SYLLABLE NDIP;Lo;0;L;;;;;N;;;;; -A155;YI SYLLABLE NDIEX;Lo;0;L;;;;;N;;;;; -A156;YI SYLLABLE NDIE;Lo;0;L;;;;;N;;;;; -A157;YI SYLLABLE NDAT;Lo;0;L;;;;;N;;;;; -A158;YI SYLLABLE NDAX;Lo;0;L;;;;;N;;;;; -A159;YI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; -A15A;YI SYLLABLE NDAP;Lo;0;L;;;;;N;;;;; -A15B;YI SYLLABLE NDOT;Lo;0;L;;;;;N;;;;; -A15C;YI SYLLABLE NDOX;Lo;0;L;;;;;N;;;;; -A15D;YI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; -A15E;YI SYLLABLE NDOP;Lo;0;L;;;;;N;;;;; -A15F;YI SYLLABLE NDEX;Lo;0;L;;;;;N;;;;; -A160;YI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; -A161;YI SYLLABLE NDEP;Lo;0;L;;;;;N;;;;; -A162;YI SYLLABLE NDUT;Lo;0;L;;;;;N;;;;; -A163;YI SYLLABLE NDUX;Lo;0;L;;;;;N;;;;; -A164;YI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; -A165;YI SYLLABLE NDUP;Lo;0;L;;;;;N;;;;; -A166;YI SYLLABLE NDURX;Lo;0;L;;;;;N;;;;; -A167;YI SYLLABLE NDUR;Lo;0;L;;;;;N;;;;; -A168;YI SYLLABLE HNIT;Lo;0;L;;;;;N;;;;; -A169;YI SYLLABLE HNIX;Lo;0;L;;;;;N;;;;; -A16A;YI SYLLABLE HNI;Lo;0;L;;;;;N;;;;; -A16B;YI SYLLABLE HNIP;Lo;0;L;;;;;N;;;;; -A16C;YI SYLLABLE HNIET;Lo;0;L;;;;;N;;;;; -A16D;YI SYLLABLE HNIEX;Lo;0;L;;;;;N;;;;; -A16E;YI SYLLABLE HNIE;Lo;0;L;;;;;N;;;;; -A16F;YI SYLLABLE HNIEP;Lo;0;L;;;;;N;;;;; -A170;YI SYLLABLE HNAT;Lo;0;L;;;;;N;;;;; -A171;YI SYLLABLE HNAX;Lo;0;L;;;;;N;;;;; -A172;YI SYLLABLE HNA;Lo;0;L;;;;;N;;;;; -A173;YI SYLLABLE HNAP;Lo;0;L;;;;;N;;;;; -A174;YI SYLLABLE HNUOX;Lo;0;L;;;;;N;;;;; -A175;YI SYLLABLE HNUO;Lo;0;L;;;;;N;;;;; -A176;YI SYLLABLE HNOT;Lo;0;L;;;;;N;;;;; -A177;YI SYLLABLE HNOX;Lo;0;L;;;;;N;;;;; -A178;YI SYLLABLE HNOP;Lo;0;L;;;;;N;;;;; -A179;YI SYLLABLE HNEX;Lo;0;L;;;;;N;;;;; -A17A;YI SYLLABLE HNE;Lo;0;L;;;;;N;;;;; -A17B;YI SYLLABLE HNEP;Lo;0;L;;;;;N;;;;; -A17C;YI SYLLABLE HNUT;Lo;0;L;;;;;N;;;;; -A17D;YI SYLLABLE NIT;Lo;0;L;;;;;N;;;;; -A17E;YI SYLLABLE NIX;Lo;0;L;;;;;N;;;;; -A17F;YI SYLLABLE NI;Lo;0;L;;;;;N;;;;; -A180;YI SYLLABLE NIP;Lo;0;L;;;;;N;;;;; -A181;YI SYLLABLE NIEX;Lo;0;L;;;;;N;;;;; -A182;YI SYLLABLE NIE;Lo;0;L;;;;;N;;;;; -A183;YI SYLLABLE NIEP;Lo;0;L;;;;;N;;;;; -A184;YI SYLLABLE NAX;Lo;0;L;;;;;N;;;;; -A185;YI SYLLABLE NA;Lo;0;L;;;;;N;;;;; -A186;YI SYLLABLE NAP;Lo;0;L;;;;;N;;;;; -A187;YI SYLLABLE NUOX;Lo;0;L;;;;;N;;;;; -A188;YI SYLLABLE NUO;Lo;0;L;;;;;N;;;;; -A189;YI SYLLABLE NUOP;Lo;0;L;;;;;N;;;;; -A18A;YI SYLLABLE NOT;Lo;0;L;;;;;N;;;;; -A18B;YI SYLLABLE NOX;Lo;0;L;;;;;N;;;;; -A18C;YI SYLLABLE NO;Lo;0;L;;;;;N;;;;; -A18D;YI SYLLABLE NOP;Lo;0;L;;;;;N;;;;; -A18E;YI SYLLABLE NEX;Lo;0;L;;;;;N;;;;; -A18F;YI SYLLABLE NE;Lo;0;L;;;;;N;;;;; -A190;YI SYLLABLE NEP;Lo;0;L;;;;;N;;;;; -A191;YI SYLLABLE NUT;Lo;0;L;;;;;N;;;;; -A192;YI SYLLABLE NUX;Lo;0;L;;;;;N;;;;; -A193;YI SYLLABLE NU;Lo;0;L;;;;;N;;;;; -A194;YI SYLLABLE NUP;Lo;0;L;;;;;N;;;;; -A195;YI SYLLABLE NURX;Lo;0;L;;;;;N;;;;; -A196;YI SYLLABLE NUR;Lo;0;L;;;;;N;;;;; -A197;YI SYLLABLE HLIT;Lo;0;L;;;;;N;;;;; -A198;YI SYLLABLE HLIX;Lo;0;L;;;;;N;;;;; -A199;YI SYLLABLE HLI;Lo;0;L;;;;;N;;;;; -A19A;YI SYLLABLE HLIP;Lo;0;L;;;;;N;;;;; -A19B;YI SYLLABLE HLIEX;Lo;0;L;;;;;N;;;;; -A19C;YI SYLLABLE HLIE;Lo;0;L;;;;;N;;;;; -A19D;YI SYLLABLE HLIEP;Lo;0;L;;;;;N;;;;; -A19E;YI SYLLABLE HLAT;Lo;0;L;;;;;N;;;;; -A19F;YI SYLLABLE HLAX;Lo;0;L;;;;;N;;;;; -A1A0;YI SYLLABLE HLA;Lo;0;L;;;;;N;;;;; -A1A1;YI SYLLABLE HLAP;Lo;0;L;;;;;N;;;;; -A1A2;YI SYLLABLE HLUOX;Lo;0;L;;;;;N;;;;; -A1A3;YI SYLLABLE HLUO;Lo;0;L;;;;;N;;;;; -A1A4;YI SYLLABLE HLUOP;Lo;0;L;;;;;N;;;;; -A1A5;YI SYLLABLE HLOX;Lo;0;L;;;;;N;;;;; -A1A6;YI SYLLABLE HLO;Lo;0;L;;;;;N;;;;; -A1A7;YI SYLLABLE HLOP;Lo;0;L;;;;;N;;;;; -A1A8;YI SYLLABLE HLEX;Lo;0;L;;;;;N;;;;; -A1A9;YI SYLLABLE HLE;Lo;0;L;;;;;N;;;;; -A1AA;YI SYLLABLE HLEP;Lo;0;L;;;;;N;;;;; -A1AB;YI SYLLABLE HLUT;Lo;0;L;;;;;N;;;;; -A1AC;YI SYLLABLE HLUX;Lo;0;L;;;;;N;;;;; -A1AD;YI SYLLABLE HLU;Lo;0;L;;;;;N;;;;; -A1AE;YI SYLLABLE HLUP;Lo;0;L;;;;;N;;;;; -A1AF;YI SYLLABLE HLURX;Lo;0;L;;;;;N;;;;; -A1B0;YI SYLLABLE HLUR;Lo;0;L;;;;;N;;;;; -A1B1;YI SYLLABLE HLYT;Lo;0;L;;;;;N;;;;; -A1B2;YI SYLLABLE HLYX;Lo;0;L;;;;;N;;;;; -A1B3;YI SYLLABLE HLY;Lo;0;L;;;;;N;;;;; -A1B4;YI SYLLABLE HLYP;Lo;0;L;;;;;N;;;;; -A1B5;YI SYLLABLE HLYRX;Lo;0;L;;;;;N;;;;; -A1B6;YI SYLLABLE HLYR;Lo;0;L;;;;;N;;;;; -A1B7;YI SYLLABLE LIT;Lo;0;L;;;;;N;;;;; -A1B8;YI SYLLABLE LIX;Lo;0;L;;;;;N;;;;; -A1B9;YI SYLLABLE LI;Lo;0;L;;;;;N;;;;; -A1BA;YI SYLLABLE LIP;Lo;0;L;;;;;N;;;;; -A1BB;YI SYLLABLE LIET;Lo;0;L;;;;;N;;;;; -A1BC;YI SYLLABLE LIEX;Lo;0;L;;;;;N;;;;; -A1BD;YI SYLLABLE LIE;Lo;0;L;;;;;N;;;;; -A1BE;YI SYLLABLE LIEP;Lo;0;L;;;;;N;;;;; -A1BF;YI SYLLABLE LAT;Lo;0;L;;;;;N;;;;; -A1C0;YI SYLLABLE LAX;Lo;0;L;;;;;N;;;;; -A1C1;YI SYLLABLE LA;Lo;0;L;;;;;N;;;;; -A1C2;YI SYLLABLE LAP;Lo;0;L;;;;;N;;;;; -A1C3;YI SYLLABLE LUOT;Lo;0;L;;;;;N;;;;; -A1C4;YI SYLLABLE LUOX;Lo;0;L;;;;;N;;;;; -A1C5;YI SYLLABLE LUO;Lo;0;L;;;;;N;;;;; -A1C6;YI SYLLABLE LUOP;Lo;0;L;;;;;N;;;;; -A1C7;YI SYLLABLE LOT;Lo;0;L;;;;;N;;;;; -A1C8;YI SYLLABLE LOX;Lo;0;L;;;;;N;;;;; -A1C9;YI SYLLABLE LO;Lo;0;L;;;;;N;;;;; -A1CA;YI SYLLABLE LOP;Lo;0;L;;;;;N;;;;; -A1CB;YI SYLLABLE LEX;Lo;0;L;;;;;N;;;;; -A1CC;YI SYLLABLE LE;Lo;0;L;;;;;N;;;;; -A1CD;YI SYLLABLE LEP;Lo;0;L;;;;;N;;;;; -A1CE;YI SYLLABLE LUT;Lo;0;L;;;;;N;;;;; -A1CF;YI SYLLABLE LUX;Lo;0;L;;;;;N;;;;; -A1D0;YI SYLLABLE LU;Lo;0;L;;;;;N;;;;; -A1D1;YI SYLLABLE LUP;Lo;0;L;;;;;N;;;;; -A1D2;YI SYLLABLE LURX;Lo;0;L;;;;;N;;;;; -A1D3;YI SYLLABLE LUR;Lo;0;L;;;;;N;;;;; -A1D4;YI SYLLABLE LYT;Lo;0;L;;;;;N;;;;; -A1D5;YI SYLLABLE LYX;Lo;0;L;;;;;N;;;;; -A1D6;YI SYLLABLE LY;Lo;0;L;;;;;N;;;;; -A1D7;YI SYLLABLE LYP;Lo;0;L;;;;;N;;;;; -A1D8;YI SYLLABLE LYRX;Lo;0;L;;;;;N;;;;; -A1D9;YI SYLLABLE LYR;Lo;0;L;;;;;N;;;;; -A1DA;YI SYLLABLE GIT;Lo;0;L;;;;;N;;;;; -A1DB;YI SYLLABLE GIX;Lo;0;L;;;;;N;;;;; -A1DC;YI SYLLABLE GI;Lo;0;L;;;;;N;;;;; -A1DD;YI SYLLABLE GIP;Lo;0;L;;;;;N;;;;; -A1DE;YI SYLLABLE GIET;Lo;0;L;;;;;N;;;;; -A1DF;YI SYLLABLE GIEX;Lo;0;L;;;;;N;;;;; -A1E0;YI SYLLABLE GIE;Lo;0;L;;;;;N;;;;; -A1E1;YI SYLLABLE GIEP;Lo;0;L;;;;;N;;;;; -A1E2;YI SYLLABLE GAT;Lo;0;L;;;;;N;;;;; -A1E3;YI SYLLABLE GAX;Lo;0;L;;;;;N;;;;; -A1E4;YI SYLLABLE GA;Lo;0;L;;;;;N;;;;; -A1E5;YI SYLLABLE GAP;Lo;0;L;;;;;N;;;;; -A1E6;YI SYLLABLE GUOT;Lo;0;L;;;;;N;;;;; -A1E7;YI SYLLABLE GUOX;Lo;0;L;;;;;N;;;;; -A1E8;YI SYLLABLE GUO;Lo;0;L;;;;;N;;;;; -A1E9;YI SYLLABLE GUOP;Lo;0;L;;;;;N;;;;; -A1EA;YI SYLLABLE GOT;Lo;0;L;;;;;N;;;;; -A1EB;YI SYLLABLE GOX;Lo;0;L;;;;;N;;;;; -A1EC;YI SYLLABLE GO;Lo;0;L;;;;;N;;;;; -A1ED;YI SYLLABLE GOP;Lo;0;L;;;;;N;;;;; -A1EE;YI SYLLABLE GET;Lo;0;L;;;;;N;;;;; -A1EF;YI SYLLABLE GEX;Lo;0;L;;;;;N;;;;; -A1F0;YI SYLLABLE GE;Lo;0;L;;;;;N;;;;; -A1F1;YI SYLLABLE GEP;Lo;0;L;;;;;N;;;;; -A1F2;YI SYLLABLE GUT;Lo;0;L;;;;;N;;;;; -A1F3;YI SYLLABLE GUX;Lo;0;L;;;;;N;;;;; -A1F4;YI SYLLABLE GU;Lo;0;L;;;;;N;;;;; -A1F5;YI SYLLABLE GUP;Lo;0;L;;;;;N;;;;; -A1F6;YI SYLLABLE GURX;Lo;0;L;;;;;N;;;;; -A1F7;YI SYLLABLE GUR;Lo;0;L;;;;;N;;;;; -A1F8;YI SYLLABLE KIT;Lo;0;L;;;;;N;;;;; -A1F9;YI SYLLABLE KIX;Lo;0;L;;;;;N;;;;; -A1FA;YI SYLLABLE KI;Lo;0;L;;;;;N;;;;; -A1FB;YI SYLLABLE KIP;Lo;0;L;;;;;N;;;;; -A1FC;YI SYLLABLE KIEX;Lo;0;L;;;;;N;;;;; -A1FD;YI SYLLABLE KIE;Lo;0;L;;;;;N;;;;; -A1FE;YI SYLLABLE KIEP;Lo;0;L;;;;;N;;;;; -A1FF;YI SYLLABLE KAT;Lo;0;L;;;;;N;;;;; -A200;YI SYLLABLE KAX;Lo;0;L;;;;;N;;;;; -A201;YI SYLLABLE KA;Lo;0;L;;;;;N;;;;; -A202;YI SYLLABLE KAP;Lo;0;L;;;;;N;;;;; -A203;YI SYLLABLE KUOX;Lo;0;L;;;;;N;;;;; -A204;YI SYLLABLE KUO;Lo;0;L;;;;;N;;;;; -A205;YI SYLLABLE KUOP;Lo;0;L;;;;;N;;;;; -A206;YI SYLLABLE KOT;Lo;0;L;;;;;N;;;;; -A207;YI SYLLABLE KOX;Lo;0;L;;;;;N;;;;; -A208;YI SYLLABLE KO;Lo;0;L;;;;;N;;;;; -A209;YI SYLLABLE KOP;Lo;0;L;;;;;N;;;;; -A20A;YI SYLLABLE KET;Lo;0;L;;;;;N;;;;; -A20B;YI SYLLABLE KEX;Lo;0;L;;;;;N;;;;; -A20C;YI SYLLABLE KE;Lo;0;L;;;;;N;;;;; -A20D;YI SYLLABLE KEP;Lo;0;L;;;;;N;;;;; -A20E;YI SYLLABLE KUT;Lo;0;L;;;;;N;;;;; -A20F;YI SYLLABLE KUX;Lo;0;L;;;;;N;;;;; -A210;YI SYLLABLE KU;Lo;0;L;;;;;N;;;;; -A211;YI SYLLABLE KUP;Lo;0;L;;;;;N;;;;; -A212;YI SYLLABLE KURX;Lo;0;L;;;;;N;;;;; -A213;YI SYLLABLE KUR;Lo;0;L;;;;;N;;;;; -A214;YI SYLLABLE GGIT;Lo;0;L;;;;;N;;;;; -A215;YI SYLLABLE GGIX;Lo;0;L;;;;;N;;;;; -A216;YI SYLLABLE GGI;Lo;0;L;;;;;N;;;;; -A217;YI SYLLABLE GGIEX;Lo;0;L;;;;;N;;;;; -A218;YI SYLLABLE GGIE;Lo;0;L;;;;;N;;;;; -A219;YI SYLLABLE GGIEP;Lo;0;L;;;;;N;;;;; -A21A;YI SYLLABLE GGAT;Lo;0;L;;;;;N;;;;; -A21B;YI SYLLABLE GGAX;Lo;0;L;;;;;N;;;;; -A21C;YI SYLLABLE GGA;Lo;0;L;;;;;N;;;;; -A21D;YI SYLLABLE GGAP;Lo;0;L;;;;;N;;;;; -A21E;YI SYLLABLE GGUOT;Lo;0;L;;;;;N;;;;; -A21F;YI SYLLABLE GGUOX;Lo;0;L;;;;;N;;;;; -A220;YI SYLLABLE GGUO;Lo;0;L;;;;;N;;;;; -A221;YI SYLLABLE GGUOP;Lo;0;L;;;;;N;;;;; -A222;YI SYLLABLE GGOT;Lo;0;L;;;;;N;;;;; -A223;YI SYLLABLE GGOX;Lo;0;L;;;;;N;;;;; -A224;YI SYLLABLE GGO;Lo;0;L;;;;;N;;;;; -A225;YI SYLLABLE GGOP;Lo;0;L;;;;;N;;;;; -A226;YI SYLLABLE GGET;Lo;0;L;;;;;N;;;;; -A227;YI SYLLABLE GGEX;Lo;0;L;;;;;N;;;;; -A228;YI SYLLABLE GGE;Lo;0;L;;;;;N;;;;; -A229;YI SYLLABLE GGEP;Lo;0;L;;;;;N;;;;; -A22A;YI SYLLABLE GGUT;Lo;0;L;;;;;N;;;;; -A22B;YI SYLLABLE GGUX;Lo;0;L;;;;;N;;;;; -A22C;YI SYLLABLE GGU;Lo;0;L;;;;;N;;;;; -A22D;YI SYLLABLE GGUP;Lo;0;L;;;;;N;;;;; -A22E;YI SYLLABLE GGURX;Lo;0;L;;;;;N;;;;; -A22F;YI SYLLABLE GGUR;Lo;0;L;;;;;N;;;;; -A230;YI SYLLABLE MGIEX;Lo;0;L;;;;;N;;;;; -A231;YI SYLLABLE MGIE;Lo;0;L;;;;;N;;;;; -A232;YI SYLLABLE MGAT;Lo;0;L;;;;;N;;;;; -A233;YI SYLLABLE MGAX;Lo;0;L;;;;;N;;;;; -A234;YI SYLLABLE MGA;Lo;0;L;;;;;N;;;;; -A235;YI SYLLABLE MGAP;Lo;0;L;;;;;N;;;;; -A236;YI SYLLABLE MGUOX;Lo;0;L;;;;;N;;;;; -A237;YI SYLLABLE MGUO;Lo;0;L;;;;;N;;;;; -A238;YI SYLLABLE MGUOP;Lo;0;L;;;;;N;;;;; -A239;YI SYLLABLE MGOT;Lo;0;L;;;;;N;;;;; -A23A;YI SYLLABLE MGOX;Lo;0;L;;;;;N;;;;; -A23B;YI SYLLABLE MGO;Lo;0;L;;;;;N;;;;; -A23C;YI SYLLABLE MGOP;Lo;0;L;;;;;N;;;;; -A23D;YI SYLLABLE MGEX;Lo;0;L;;;;;N;;;;; -A23E;YI SYLLABLE MGE;Lo;0;L;;;;;N;;;;; -A23F;YI SYLLABLE MGEP;Lo;0;L;;;;;N;;;;; -A240;YI SYLLABLE MGUT;Lo;0;L;;;;;N;;;;; -A241;YI SYLLABLE MGUX;Lo;0;L;;;;;N;;;;; -A242;YI SYLLABLE MGU;Lo;0;L;;;;;N;;;;; -A243;YI SYLLABLE MGUP;Lo;0;L;;;;;N;;;;; -A244;YI SYLLABLE MGURX;Lo;0;L;;;;;N;;;;; -A245;YI SYLLABLE MGUR;Lo;0;L;;;;;N;;;;; -A246;YI SYLLABLE HXIT;Lo;0;L;;;;;N;;;;; -A247;YI SYLLABLE HXIX;Lo;0;L;;;;;N;;;;; -A248;YI SYLLABLE HXI;Lo;0;L;;;;;N;;;;; -A249;YI SYLLABLE HXIP;Lo;0;L;;;;;N;;;;; -A24A;YI SYLLABLE HXIET;Lo;0;L;;;;;N;;;;; -A24B;YI SYLLABLE HXIEX;Lo;0;L;;;;;N;;;;; -A24C;YI SYLLABLE HXIE;Lo;0;L;;;;;N;;;;; -A24D;YI SYLLABLE HXIEP;Lo;0;L;;;;;N;;;;; -A24E;YI SYLLABLE HXAT;Lo;0;L;;;;;N;;;;; -A24F;YI SYLLABLE HXAX;Lo;0;L;;;;;N;;;;; -A250;YI SYLLABLE HXA;Lo;0;L;;;;;N;;;;; -A251;YI SYLLABLE HXAP;Lo;0;L;;;;;N;;;;; -A252;YI SYLLABLE HXUOT;Lo;0;L;;;;;N;;;;; -A253;YI SYLLABLE HXUOX;Lo;0;L;;;;;N;;;;; -A254;YI SYLLABLE HXUO;Lo;0;L;;;;;N;;;;; -A255;YI SYLLABLE HXUOP;Lo;0;L;;;;;N;;;;; -A256;YI SYLLABLE HXOT;Lo;0;L;;;;;N;;;;; -A257;YI SYLLABLE HXOX;Lo;0;L;;;;;N;;;;; -A258;YI SYLLABLE HXO;Lo;0;L;;;;;N;;;;; -A259;YI SYLLABLE HXOP;Lo;0;L;;;;;N;;;;; -A25A;YI SYLLABLE HXEX;Lo;0;L;;;;;N;;;;; -A25B;YI SYLLABLE HXE;Lo;0;L;;;;;N;;;;; -A25C;YI SYLLABLE HXEP;Lo;0;L;;;;;N;;;;; -A25D;YI SYLLABLE NGIEX;Lo;0;L;;;;;N;;;;; -A25E;YI SYLLABLE NGIE;Lo;0;L;;;;;N;;;;; -A25F;YI SYLLABLE NGIEP;Lo;0;L;;;;;N;;;;; -A260;YI SYLLABLE NGAT;Lo;0;L;;;;;N;;;;; -A261;YI SYLLABLE NGAX;Lo;0;L;;;;;N;;;;; -A262;YI SYLLABLE NGA;Lo;0;L;;;;;N;;;;; -A263;YI SYLLABLE NGAP;Lo;0;L;;;;;N;;;;; -A264;YI SYLLABLE NGUOT;Lo;0;L;;;;;N;;;;; -A265;YI SYLLABLE NGUOX;Lo;0;L;;;;;N;;;;; -A266;YI SYLLABLE NGUO;Lo;0;L;;;;;N;;;;; -A267;YI SYLLABLE NGOT;Lo;0;L;;;;;N;;;;; -A268;YI SYLLABLE NGOX;Lo;0;L;;;;;N;;;;; -A269;YI SYLLABLE NGO;Lo;0;L;;;;;N;;;;; -A26A;YI SYLLABLE NGOP;Lo;0;L;;;;;N;;;;; -A26B;YI SYLLABLE NGEX;Lo;0;L;;;;;N;;;;; -A26C;YI SYLLABLE NGE;Lo;0;L;;;;;N;;;;; -A26D;YI SYLLABLE NGEP;Lo;0;L;;;;;N;;;;; -A26E;YI SYLLABLE HIT;Lo;0;L;;;;;N;;;;; -A26F;YI SYLLABLE HIEX;Lo;0;L;;;;;N;;;;; -A270;YI SYLLABLE HIE;Lo;0;L;;;;;N;;;;; -A271;YI SYLLABLE HAT;Lo;0;L;;;;;N;;;;; -A272;YI SYLLABLE HAX;Lo;0;L;;;;;N;;;;; -A273;YI SYLLABLE HA;Lo;0;L;;;;;N;;;;; -A274;YI SYLLABLE HAP;Lo;0;L;;;;;N;;;;; -A275;YI SYLLABLE HUOT;Lo;0;L;;;;;N;;;;; -A276;YI SYLLABLE HUOX;Lo;0;L;;;;;N;;;;; -A277;YI SYLLABLE HUO;Lo;0;L;;;;;N;;;;; -A278;YI SYLLABLE HUOP;Lo;0;L;;;;;N;;;;; -A279;YI SYLLABLE HOT;Lo;0;L;;;;;N;;;;; -A27A;YI SYLLABLE HOX;Lo;0;L;;;;;N;;;;; -A27B;YI SYLLABLE HO;Lo;0;L;;;;;N;;;;; -A27C;YI SYLLABLE HOP;Lo;0;L;;;;;N;;;;; -A27D;YI SYLLABLE HEX;Lo;0;L;;;;;N;;;;; -A27E;YI SYLLABLE HE;Lo;0;L;;;;;N;;;;; -A27F;YI SYLLABLE HEP;Lo;0;L;;;;;N;;;;; -A280;YI SYLLABLE WAT;Lo;0;L;;;;;N;;;;; -A281;YI SYLLABLE WAX;Lo;0;L;;;;;N;;;;; -A282;YI SYLLABLE WA;Lo;0;L;;;;;N;;;;; -A283;YI SYLLABLE WAP;Lo;0;L;;;;;N;;;;; -A284;YI SYLLABLE WUOX;Lo;0;L;;;;;N;;;;; -A285;YI SYLLABLE WUO;Lo;0;L;;;;;N;;;;; -A286;YI SYLLABLE WUOP;Lo;0;L;;;;;N;;;;; -A287;YI SYLLABLE WOX;Lo;0;L;;;;;N;;;;; -A288;YI SYLLABLE WO;Lo;0;L;;;;;N;;;;; -A289;YI SYLLABLE WOP;Lo;0;L;;;;;N;;;;; -A28A;YI SYLLABLE WEX;Lo;0;L;;;;;N;;;;; -A28B;YI SYLLABLE WE;Lo;0;L;;;;;N;;;;; -A28C;YI SYLLABLE WEP;Lo;0;L;;;;;N;;;;; -A28D;YI SYLLABLE ZIT;Lo;0;L;;;;;N;;;;; -A28E;YI SYLLABLE ZIX;Lo;0;L;;;;;N;;;;; -A28F;YI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -A290;YI SYLLABLE ZIP;Lo;0;L;;;;;N;;;;; -A291;YI SYLLABLE ZIEX;Lo;0;L;;;;;N;;;;; -A292;YI SYLLABLE ZIE;Lo;0;L;;;;;N;;;;; -A293;YI SYLLABLE ZIEP;Lo;0;L;;;;;N;;;;; -A294;YI SYLLABLE ZAT;Lo;0;L;;;;;N;;;;; -A295;YI SYLLABLE ZAX;Lo;0;L;;;;;N;;;;; -A296;YI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -A297;YI SYLLABLE ZAP;Lo;0;L;;;;;N;;;;; -A298;YI SYLLABLE ZUOX;Lo;0;L;;;;;N;;;;; -A299;YI SYLLABLE ZUO;Lo;0;L;;;;;N;;;;; -A29A;YI SYLLABLE ZUOP;Lo;0;L;;;;;N;;;;; -A29B;YI SYLLABLE ZOT;Lo;0;L;;;;;N;;;;; -A29C;YI SYLLABLE ZOX;Lo;0;L;;;;;N;;;;; -A29D;YI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -A29E;YI SYLLABLE ZOP;Lo;0;L;;;;;N;;;;; -A29F;YI SYLLABLE ZEX;Lo;0;L;;;;;N;;;;; -A2A0;YI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -A2A1;YI SYLLABLE ZEP;Lo;0;L;;;;;N;;;;; -A2A2;YI SYLLABLE ZUT;Lo;0;L;;;;;N;;;;; -A2A3;YI SYLLABLE ZUX;Lo;0;L;;;;;N;;;;; -A2A4;YI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -A2A5;YI SYLLABLE ZUP;Lo;0;L;;;;;N;;;;; -A2A6;YI SYLLABLE ZURX;Lo;0;L;;;;;N;;;;; -A2A7;YI SYLLABLE ZUR;Lo;0;L;;;;;N;;;;; -A2A8;YI SYLLABLE ZYT;Lo;0;L;;;;;N;;;;; -A2A9;YI SYLLABLE ZYX;Lo;0;L;;;;;N;;;;; -A2AA;YI SYLLABLE ZY;Lo;0;L;;;;;N;;;;; -A2AB;YI SYLLABLE ZYP;Lo;0;L;;;;;N;;;;; -A2AC;YI SYLLABLE ZYRX;Lo;0;L;;;;;N;;;;; -A2AD;YI SYLLABLE ZYR;Lo;0;L;;;;;N;;;;; -A2AE;YI SYLLABLE CIT;Lo;0;L;;;;;N;;;;; -A2AF;YI SYLLABLE CIX;Lo;0;L;;;;;N;;;;; -A2B0;YI SYLLABLE CI;Lo;0;L;;;;;N;;;;; -A2B1;YI SYLLABLE CIP;Lo;0;L;;;;;N;;;;; -A2B2;YI SYLLABLE CIET;Lo;0;L;;;;;N;;;;; -A2B3;YI SYLLABLE CIEX;Lo;0;L;;;;;N;;;;; -A2B4;YI SYLLABLE CIE;Lo;0;L;;;;;N;;;;; -A2B5;YI SYLLABLE CIEP;Lo;0;L;;;;;N;;;;; -A2B6;YI SYLLABLE CAT;Lo;0;L;;;;;N;;;;; -A2B7;YI SYLLABLE CAX;Lo;0;L;;;;;N;;;;; -A2B8;YI SYLLABLE CA;Lo;0;L;;;;;N;;;;; -A2B9;YI SYLLABLE CAP;Lo;0;L;;;;;N;;;;; -A2BA;YI SYLLABLE CUOX;Lo;0;L;;;;;N;;;;; -A2BB;YI SYLLABLE CUO;Lo;0;L;;;;;N;;;;; -A2BC;YI SYLLABLE CUOP;Lo;0;L;;;;;N;;;;; -A2BD;YI SYLLABLE COT;Lo;0;L;;;;;N;;;;; -A2BE;YI SYLLABLE COX;Lo;0;L;;;;;N;;;;; -A2BF;YI SYLLABLE CO;Lo;0;L;;;;;N;;;;; -A2C0;YI SYLLABLE COP;Lo;0;L;;;;;N;;;;; -A2C1;YI SYLLABLE CEX;Lo;0;L;;;;;N;;;;; -A2C2;YI SYLLABLE CE;Lo;0;L;;;;;N;;;;; -A2C3;YI SYLLABLE CEP;Lo;0;L;;;;;N;;;;; -A2C4;YI SYLLABLE CUT;Lo;0;L;;;;;N;;;;; -A2C5;YI SYLLABLE CUX;Lo;0;L;;;;;N;;;;; -A2C6;YI SYLLABLE CU;Lo;0;L;;;;;N;;;;; -A2C7;YI SYLLABLE CUP;Lo;0;L;;;;;N;;;;; -A2C8;YI SYLLABLE CURX;Lo;0;L;;;;;N;;;;; -A2C9;YI SYLLABLE CUR;Lo;0;L;;;;;N;;;;; -A2CA;YI SYLLABLE CYT;Lo;0;L;;;;;N;;;;; -A2CB;YI SYLLABLE CYX;Lo;0;L;;;;;N;;;;; -A2CC;YI SYLLABLE CY;Lo;0;L;;;;;N;;;;; -A2CD;YI SYLLABLE CYP;Lo;0;L;;;;;N;;;;; -A2CE;YI SYLLABLE CYRX;Lo;0;L;;;;;N;;;;; -A2CF;YI SYLLABLE CYR;Lo;0;L;;;;;N;;;;; -A2D0;YI SYLLABLE ZZIT;Lo;0;L;;;;;N;;;;; -A2D1;YI SYLLABLE ZZIX;Lo;0;L;;;;;N;;;;; -A2D2;YI SYLLABLE ZZI;Lo;0;L;;;;;N;;;;; -A2D3;YI SYLLABLE ZZIP;Lo;0;L;;;;;N;;;;; -A2D4;YI SYLLABLE ZZIET;Lo;0;L;;;;;N;;;;; -A2D5;YI SYLLABLE ZZIEX;Lo;0;L;;;;;N;;;;; -A2D6;YI SYLLABLE ZZIE;Lo;0;L;;;;;N;;;;; -A2D7;YI SYLLABLE ZZIEP;Lo;0;L;;;;;N;;;;; -A2D8;YI SYLLABLE ZZAT;Lo;0;L;;;;;N;;;;; -A2D9;YI SYLLABLE ZZAX;Lo;0;L;;;;;N;;;;; -A2DA;YI SYLLABLE ZZA;Lo;0;L;;;;;N;;;;; -A2DB;YI SYLLABLE ZZAP;Lo;0;L;;;;;N;;;;; -A2DC;YI SYLLABLE ZZOX;Lo;0;L;;;;;N;;;;; -A2DD;YI SYLLABLE ZZO;Lo;0;L;;;;;N;;;;; -A2DE;YI SYLLABLE ZZOP;Lo;0;L;;;;;N;;;;; -A2DF;YI SYLLABLE ZZEX;Lo;0;L;;;;;N;;;;; -A2E0;YI SYLLABLE ZZE;Lo;0;L;;;;;N;;;;; -A2E1;YI SYLLABLE ZZEP;Lo;0;L;;;;;N;;;;; -A2E2;YI SYLLABLE ZZUX;Lo;0;L;;;;;N;;;;; -A2E3;YI SYLLABLE ZZU;Lo;0;L;;;;;N;;;;; -A2E4;YI SYLLABLE ZZUP;Lo;0;L;;;;;N;;;;; -A2E5;YI SYLLABLE ZZURX;Lo;0;L;;;;;N;;;;; -A2E6;YI SYLLABLE ZZUR;Lo;0;L;;;;;N;;;;; -A2E7;YI SYLLABLE ZZYT;Lo;0;L;;;;;N;;;;; -A2E8;YI SYLLABLE ZZYX;Lo;0;L;;;;;N;;;;; -A2E9;YI SYLLABLE ZZY;Lo;0;L;;;;;N;;;;; -A2EA;YI SYLLABLE ZZYP;Lo;0;L;;;;;N;;;;; -A2EB;YI SYLLABLE ZZYRX;Lo;0;L;;;;;N;;;;; -A2EC;YI SYLLABLE ZZYR;Lo;0;L;;;;;N;;;;; -A2ED;YI SYLLABLE NZIT;Lo;0;L;;;;;N;;;;; -A2EE;YI SYLLABLE NZIX;Lo;0;L;;;;;N;;;;; -A2EF;YI SYLLABLE NZI;Lo;0;L;;;;;N;;;;; -A2F0;YI SYLLABLE NZIP;Lo;0;L;;;;;N;;;;; -A2F1;YI SYLLABLE NZIEX;Lo;0;L;;;;;N;;;;; -A2F2;YI SYLLABLE NZIE;Lo;0;L;;;;;N;;;;; -A2F3;YI SYLLABLE NZIEP;Lo;0;L;;;;;N;;;;; -A2F4;YI SYLLABLE NZAT;Lo;0;L;;;;;N;;;;; -A2F5;YI SYLLABLE NZAX;Lo;0;L;;;;;N;;;;; -A2F6;YI SYLLABLE NZA;Lo;0;L;;;;;N;;;;; -A2F7;YI SYLLABLE NZAP;Lo;0;L;;;;;N;;;;; -A2F8;YI SYLLABLE NZUOX;Lo;0;L;;;;;N;;;;; -A2F9;YI SYLLABLE NZUO;Lo;0;L;;;;;N;;;;; -A2FA;YI SYLLABLE NZOX;Lo;0;L;;;;;N;;;;; -A2FB;YI SYLLABLE NZOP;Lo;0;L;;;;;N;;;;; -A2FC;YI SYLLABLE NZEX;Lo;0;L;;;;;N;;;;; -A2FD;YI SYLLABLE NZE;Lo;0;L;;;;;N;;;;; -A2FE;YI SYLLABLE NZUX;Lo;0;L;;;;;N;;;;; -A2FF;YI SYLLABLE NZU;Lo;0;L;;;;;N;;;;; -A300;YI SYLLABLE NZUP;Lo;0;L;;;;;N;;;;; -A301;YI SYLLABLE NZURX;Lo;0;L;;;;;N;;;;; -A302;YI SYLLABLE NZUR;Lo;0;L;;;;;N;;;;; -A303;YI SYLLABLE NZYT;Lo;0;L;;;;;N;;;;; -A304;YI SYLLABLE NZYX;Lo;0;L;;;;;N;;;;; -A305;YI SYLLABLE NZY;Lo;0;L;;;;;N;;;;; -A306;YI SYLLABLE NZYP;Lo;0;L;;;;;N;;;;; -A307;YI SYLLABLE NZYRX;Lo;0;L;;;;;N;;;;; -A308;YI SYLLABLE NZYR;Lo;0;L;;;;;N;;;;; -A309;YI SYLLABLE SIT;Lo;0;L;;;;;N;;;;; -A30A;YI SYLLABLE SIX;Lo;0;L;;;;;N;;;;; -A30B;YI SYLLABLE SI;Lo;0;L;;;;;N;;;;; -A30C;YI SYLLABLE SIP;Lo;0;L;;;;;N;;;;; -A30D;YI SYLLABLE SIEX;Lo;0;L;;;;;N;;;;; -A30E;YI SYLLABLE SIE;Lo;0;L;;;;;N;;;;; -A30F;YI SYLLABLE SIEP;Lo;0;L;;;;;N;;;;; -A310;YI SYLLABLE SAT;Lo;0;L;;;;;N;;;;; -A311;YI SYLLABLE SAX;Lo;0;L;;;;;N;;;;; -A312;YI SYLLABLE SA;Lo;0;L;;;;;N;;;;; -A313;YI SYLLABLE SAP;Lo;0;L;;;;;N;;;;; -A314;YI SYLLABLE SUOX;Lo;0;L;;;;;N;;;;; -A315;YI SYLLABLE SUO;Lo;0;L;;;;;N;;;;; -A316;YI SYLLABLE SUOP;Lo;0;L;;;;;N;;;;; -A317;YI SYLLABLE SOT;Lo;0;L;;;;;N;;;;; -A318;YI SYLLABLE SOX;Lo;0;L;;;;;N;;;;; -A319;YI SYLLABLE SO;Lo;0;L;;;;;N;;;;; -A31A;YI SYLLABLE SOP;Lo;0;L;;;;;N;;;;; -A31B;YI SYLLABLE SEX;Lo;0;L;;;;;N;;;;; -A31C;YI SYLLABLE SE;Lo;0;L;;;;;N;;;;; -A31D;YI SYLLABLE SEP;Lo;0;L;;;;;N;;;;; -A31E;YI SYLLABLE SUT;Lo;0;L;;;;;N;;;;; -A31F;YI SYLLABLE SUX;Lo;0;L;;;;;N;;;;; -A320;YI SYLLABLE SU;Lo;0;L;;;;;N;;;;; -A321;YI SYLLABLE SUP;Lo;0;L;;;;;N;;;;; -A322;YI SYLLABLE SURX;Lo;0;L;;;;;N;;;;; -A323;YI SYLLABLE SUR;Lo;0;L;;;;;N;;;;; -A324;YI SYLLABLE SYT;Lo;0;L;;;;;N;;;;; -A325;YI SYLLABLE SYX;Lo;0;L;;;;;N;;;;; -A326;YI SYLLABLE SY;Lo;0;L;;;;;N;;;;; -A327;YI SYLLABLE SYP;Lo;0;L;;;;;N;;;;; -A328;YI SYLLABLE SYRX;Lo;0;L;;;;;N;;;;; -A329;YI SYLLABLE SYR;Lo;0;L;;;;;N;;;;; -A32A;YI SYLLABLE SSIT;Lo;0;L;;;;;N;;;;; -A32B;YI SYLLABLE SSIX;Lo;0;L;;;;;N;;;;; -A32C;YI SYLLABLE SSI;Lo;0;L;;;;;N;;;;; -A32D;YI SYLLABLE SSIP;Lo;0;L;;;;;N;;;;; -A32E;YI SYLLABLE SSIEX;Lo;0;L;;;;;N;;;;; -A32F;YI SYLLABLE SSIE;Lo;0;L;;;;;N;;;;; -A330;YI SYLLABLE SSIEP;Lo;0;L;;;;;N;;;;; -A331;YI SYLLABLE SSAT;Lo;0;L;;;;;N;;;;; -A332;YI SYLLABLE SSAX;Lo;0;L;;;;;N;;;;; -A333;YI SYLLABLE SSA;Lo;0;L;;;;;N;;;;; -A334;YI SYLLABLE SSAP;Lo;0;L;;;;;N;;;;; -A335;YI SYLLABLE SSOT;Lo;0;L;;;;;N;;;;; -A336;YI SYLLABLE SSOX;Lo;0;L;;;;;N;;;;; -A337;YI SYLLABLE SSO;Lo;0;L;;;;;N;;;;; -A338;YI SYLLABLE SSOP;Lo;0;L;;;;;N;;;;; -A339;YI SYLLABLE SSEX;Lo;0;L;;;;;N;;;;; -A33A;YI SYLLABLE SSE;Lo;0;L;;;;;N;;;;; -A33B;YI SYLLABLE SSEP;Lo;0;L;;;;;N;;;;; -A33C;YI SYLLABLE SSUT;Lo;0;L;;;;;N;;;;; -A33D;YI SYLLABLE SSUX;Lo;0;L;;;;;N;;;;; -A33E;YI SYLLABLE SSU;Lo;0;L;;;;;N;;;;; -A33F;YI SYLLABLE SSUP;Lo;0;L;;;;;N;;;;; -A340;YI SYLLABLE SSYT;Lo;0;L;;;;;N;;;;; -A341;YI SYLLABLE SSYX;Lo;0;L;;;;;N;;;;; -A342;YI SYLLABLE SSY;Lo;0;L;;;;;N;;;;; -A343;YI SYLLABLE SSYP;Lo;0;L;;;;;N;;;;; -A344;YI SYLLABLE SSYRX;Lo;0;L;;;;;N;;;;; -A345;YI SYLLABLE SSYR;Lo;0;L;;;;;N;;;;; -A346;YI SYLLABLE ZHAT;Lo;0;L;;;;;N;;;;; -A347;YI SYLLABLE ZHAX;Lo;0;L;;;;;N;;;;; -A348;YI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -A349;YI SYLLABLE ZHAP;Lo;0;L;;;;;N;;;;; -A34A;YI SYLLABLE ZHUOX;Lo;0;L;;;;;N;;;;; -A34B;YI SYLLABLE ZHUO;Lo;0;L;;;;;N;;;;; -A34C;YI SYLLABLE ZHUOP;Lo;0;L;;;;;N;;;;; -A34D;YI SYLLABLE ZHOT;Lo;0;L;;;;;N;;;;; -A34E;YI SYLLABLE ZHOX;Lo;0;L;;;;;N;;;;; -A34F;YI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -A350;YI SYLLABLE ZHOP;Lo;0;L;;;;;N;;;;; -A351;YI SYLLABLE ZHET;Lo;0;L;;;;;N;;;;; -A352;YI SYLLABLE ZHEX;Lo;0;L;;;;;N;;;;; -A353;YI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -A354;YI SYLLABLE ZHEP;Lo;0;L;;;;;N;;;;; -A355;YI SYLLABLE ZHUT;Lo;0;L;;;;;N;;;;; -A356;YI SYLLABLE ZHUX;Lo;0;L;;;;;N;;;;; -A357;YI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -A358;YI SYLLABLE ZHUP;Lo;0;L;;;;;N;;;;; -A359;YI SYLLABLE ZHURX;Lo;0;L;;;;;N;;;;; -A35A;YI SYLLABLE ZHUR;Lo;0;L;;;;;N;;;;; -A35B;YI SYLLABLE ZHYT;Lo;0;L;;;;;N;;;;; -A35C;YI SYLLABLE ZHYX;Lo;0;L;;;;;N;;;;; -A35D;YI SYLLABLE ZHY;Lo;0;L;;;;;N;;;;; -A35E;YI SYLLABLE ZHYP;Lo;0;L;;;;;N;;;;; -A35F;YI SYLLABLE ZHYRX;Lo;0;L;;;;;N;;;;; -A360;YI SYLLABLE ZHYR;Lo;0;L;;;;;N;;;;; -A361;YI SYLLABLE CHAT;Lo;0;L;;;;;N;;;;; -A362;YI SYLLABLE CHAX;Lo;0;L;;;;;N;;;;; -A363;YI SYLLABLE CHA;Lo;0;L;;;;;N;;;;; -A364;YI SYLLABLE CHAP;Lo;0;L;;;;;N;;;;; -A365;YI SYLLABLE CHUOT;Lo;0;L;;;;;N;;;;; -A366;YI SYLLABLE CHUOX;Lo;0;L;;;;;N;;;;; -A367;YI SYLLABLE CHUO;Lo;0;L;;;;;N;;;;; -A368;YI SYLLABLE CHUOP;Lo;0;L;;;;;N;;;;; -A369;YI SYLLABLE CHOT;Lo;0;L;;;;;N;;;;; -A36A;YI SYLLABLE CHOX;Lo;0;L;;;;;N;;;;; -A36B;YI SYLLABLE CHO;Lo;0;L;;;;;N;;;;; -A36C;YI SYLLABLE CHOP;Lo;0;L;;;;;N;;;;; -A36D;YI SYLLABLE CHET;Lo;0;L;;;;;N;;;;; -A36E;YI SYLLABLE CHEX;Lo;0;L;;;;;N;;;;; -A36F;YI SYLLABLE CHE;Lo;0;L;;;;;N;;;;; -A370;YI SYLLABLE CHEP;Lo;0;L;;;;;N;;;;; -A371;YI SYLLABLE CHUX;Lo;0;L;;;;;N;;;;; -A372;YI SYLLABLE CHU;Lo;0;L;;;;;N;;;;; -A373;YI SYLLABLE CHUP;Lo;0;L;;;;;N;;;;; -A374;YI SYLLABLE CHURX;Lo;0;L;;;;;N;;;;; -A375;YI SYLLABLE CHUR;Lo;0;L;;;;;N;;;;; -A376;YI SYLLABLE CHYT;Lo;0;L;;;;;N;;;;; -A377;YI SYLLABLE CHYX;Lo;0;L;;;;;N;;;;; -A378;YI SYLLABLE CHY;Lo;0;L;;;;;N;;;;; -A379;YI SYLLABLE CHYP;Lo;0;L;;;;;N;;;;; -A37A;YI SYLLABLE CHYRX;Lo;0;L;;;;;N;;;;; -A37B;YI SYLLABLE CHYR;Lo;0;L;;;;;N;;;;; -A37C;YI SYLLABLE RRAX;Lo;0;L;;;;;N;;;;; -A37D;YI SYLLABLE RRA;Lo;0;L;;;;;N;;;;; -A37E;YI SYLLABLE RRUOX;Lo;0;L;;;;;N;;;;; -A37F;YI SYLLABLE RRUO;Lo;0;L;;;;;N;;;;; -A380;YI SYLLABLE RROT;Lo;0;L;;;;;N;;;;; -A381;YI SYLLABLE RROX;Lo;0;L;;;;;N;;;;; -A382;YI SYLLABLE RRO;Lo;0;L;;;;;N;;;;; -A383;YI SYLLABLE RROP;Lo;0;L;;;;;N;;;;; -A384;YI SYLLABLE RRET;Lo;0;L;;;;;N;;;;; -A385;YI SYLLABLE RREX;Lo;0;L;;;;;N;;;;; -A386;YI SYLLABLE RRE;Lo;0;L;;;;;N;;;;; -A387;YI SYLLABLE RREP;Lo;0;L;;;;;N;;;;; -A388;YI SYLLABLE RRUT;Lo;0;L;;;;;N;;;;; -A389;YI SYLLABLE RRUX;Lo;0;L;;;;;N;;;;; -A38A;YI SYLLABLE RRU;Lo;0;L;;;;;N;;;;; -A38B;YI SYLLABLE RRUP;Lo;0;L;;;;;N;;;;; -A38C;YI SYLLABLE RRURX;Lo;0;L;;;;;N;;;;; -A38D;YI SYLLABLE RRUR;Lo;0;L;;;;;N;;;;; -A38E;YI SYLLABLE RRYT;Lo;0;L;;;;;N;;;;; -A38F;YI SYLLABLE RRYX;Lo;0;L;;;;;N;;;;; -A390;YI SYLLABLE RRY;Lo;0;L;;;;;N;;;;; -A391;YI SYLLABLE RRYP;Lo;0;L;;;;;N;;;;; -A392;YI SYLLABLE RRYRX;Lo;0;L;;;;;N;;;;; -A393;YI SYLLABLE RRYR;Lo;0;L;;;;;N;;;;; -A394;YI SYLLABLE NRAT;Lo;0;L;;;;;N;;;;; -A395;YI SYLLABLE NRAX;Lo;0;L;;;;;N;;;;; -A396;YI SYLLABLE NRA;Lo;0;L;;;;;N;;;;; -A397;YI SYLLABLE NRAP;Lo;0;L;;;;;N;;;;; -A398;YI SYLLABLE NROX;Lo;0;L;;;;;N;;;;; -A399;YI SYLLABLE NRO;Lo;0;L;;;;;N;;;;; -A39A;YI SYLLABLE NROP;Lo;0;L;;;;;N;;;;; -A39B;YI SYLLABLE NRET;Lo;0;L;;;;;N;;;;; -A39C;YI SYLLABLE NREX;Lo;0;L;;;;;N;;;;; -A39D;YI SYLLABLE NRE;Lo;0;L;;;;;N;;;;; -A39E;YI SYLLABLE NREP;Lo;0;L;;;;;N;;;;; -A39F;YI SYLLABLE NRUT;Lo;0;L;;;;;N;;;;; -A3A0;YI SYLLABLE NRUX;Lo;0;L;;;;;N;;;;; -A3A1;YI SYLLABLE NRU;Lo;0;L;;;;;N;;;;; -A3A2;YI SYLLABLE NRUP;Lo;0;L;;;;;N;;;;; -A3A3;YI SYLLABLE NRURX;Lo;0;L;;;;;N;;;;; -A3A4;YI SYLLABLE NRUR;Lo;0;L;;;;;N;;;;; -A3A5;YI SYLLABLE NRYT;Lo;0;L;;;;;N;;;;; -A3A6;YI SYLLABLE NRYX;Lo;0;L;;;;;N;;;;; -A3A7;YI SYLLABLE NRY;Lo;0;L;;;;;N;;;;; -A3A8;YI SYLLABLE NRYP;Lo;0;L;;;;;N;;;;; -A3A9;YI SYLLABLE NRYRX;Lo;0;L;;;;;N;;;;; -A3AA;YI SYLLABLE NRYR;Lo;0;L;;;;;N;;;;; -A3AB;YI SYLLABLE SHAT;Lo;0;L;;;;;N;;;;; -A3AC;YI SYLLABLE SHAX;Lo;0;L;;;;;N;;;;; -A3AD;YI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -A3AE;YI SYLLABLE SHAP;Lo;0;L;;;;;N;;;;; -A3AF;YI SYLLABLE SHUOX;Lo;0;L;;;;;N;;;;; -A3B0;YI SYLLABLE SHUO;Lo;0;L;;;;;N;;;;; -A3B1;YI SYLLABLE SHUOP;Lo;0;L;;;;;N;;;;; -A3B2;YI SYLLABLE SHOT;Lo;0;L;;;;;N;;;;; -A3B3;YI SYLLABLE SHOX;Lo;0;L;;;;;N;;;;; -A3B4;YI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -A3B5;YI SYLLABLE SHOP;Lo;0;L;;;;;N;;;;; -A3B6;YI SYLLABLE SHET;Lo;0;L;;;;;N;;;;; -A3B7;YI SYLLABLE SHEX;Lo;0;L;;;;;N;;;;; -A3B8;YI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -A3B9;YI SYLLABLE SHEP;Lo;0;L;;;;;N;;;;; -A3BA;YI SYLLABLE SHUT;Lo;0;L;;;;;N;;;;; -A3BB;YI SYLLABLE SHUX;Lo;0;L;;;;;N;;;;; -A3BC;YI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -A3BD;YI SYLLABLE SHUP;Lo;0;L;;;;;N;;;;; -A3BE;YI SYLLABLE SHURX;Lo;0;L;;;;;N;;;;; -A3BF;YI SYLLABLE SHUR;Lo;0;L;;;;;N;;;;; -A3C0;YI SYLLABLE SHYT;Lo;0;L;;;;;N;;;;; -A3C1;YI SYLLABLE SHYX;Lo;0;L;;;;;N;;;;; -A3C2;YI SYLLABLE SHY;Lo;0;L;;;;;N;;;;; -A3C3;YI SYLLABLE SHYP;Lo;0;L;;;;;N;;;;; -A3C4;YI SYLLABLE SHYRX;Lo;0;L;;;;;N;;;;; -A3C5;YI SYLLABLE SHYR;Lo;0;L;;;;;N;;;;; -A3C6;YI SYLLABLE RAT;Lo;0;L;;;;;N;;;;; -A3C7;YI SYLLABLE RAX;Lo;0;L;;;;;N;;;;; -A3C8;YI SYLLABLE RA;Lo;0;L;;;;;N;;;;; -A3C9;YI SYLLABLE RAP;Lo;0;L;;;;;N;;;;; -A3CA;YI SYLLABLE RUOX;Lo;0;L;;;;;N;;;;; -A3CB;YI SYLLABLE RUO;Lo;0;L;;;;;N;;;;; -A3CC;YI SYLLABLE RUOP;Lo;0;L;;;;;N;;;;; -A3CD;YI SYLLABLE ROT;Lo;0;L;;;;;N;;;;; -A3CE;YI SYLLABLE ROX;Lo;0;L;;;;;N;;;;; -A3CF;YI SYLLABLE RO;Lo;0;L;;;;;N;;;;; -A3D0;YI SYLLABLE ROP;Lo;0;L;;;;;N;;;;; -A3D1;YI SYLLABLE REX;Lo;0;L;;;;;N;;;;; -A3D2;YI SYLLABLE RE;Lo;0;L;;;;;N;;;;; -A3D3;YI SYLLABLE REP;Lo;0;L;;;;;N;;;;; -A3D4;YI SYLLABLE RUT;Lo;0;L;;;;;N;;;;; -A3D5;YI SYLLABLE RUX;Lo;0;L;;;;;N;;;;; -A3D6;YI SYLLABLE RU;Lo;0;L;;;;;N;;;;; -A3D7;YI SYLLABLE RUP;Lo;0;L;;;;;N;;;;; -A3D8;YI SYLLABLE RURX;Lo;0;L;;;;;N;;;;; -A3D9;YI SYLLABLE RUR;Lo;0;L;;;;;N;;;;; -A3DA;YI SYLLABLE RYT;Lo;0;L;;;;;N;;;;; -A3DB;YI SYLLABLE RYX;Lo;0;L;;;;;N;;;;; -A3DC;YI SYLLABLE RY;Lo;0;L;;;;;N;;;;; -A3DD;YI SYLLABLE RYP;Lo;0;L;;;;;N;;;;; -A3DE;YI SYLLABLE RYRX;Lo;0;L;;;;;N;;;;; -A3DF;YI SYLLABLE RYR;Lo;0;L;;;;;N;;;;; -A3E0;YI SYLLABLE JIT;Lo;0;L;;;;;N;;;;; -A3E1;YI SYLLABLE JIX;Lo;0;L;;;;;N;;;;; -A3E2;YI SYLLABLE JI;Lo;0;L;;;;;N;;;;; -A3E3;YI SYLLABLE JIP;Lo;0;L;;;;;N;;;;; -A3E4;YI SYLLABLE JIET;Lo;0;L;;;;;N;;;;; -A3E5;YI SYLLABLE JIEX;Lo;0;L;;;;;N;;;;; -A3E6;YI SYLLABLE JIE;Lo;0;L;;;;;N;;;;; -A3E7;YI SYLLABLE JIEP;Lo;0;L;;;;;N;;;;; -A3E8;YI SYLLABLE JUOT;Lo;0;L;;;;;N;;;;; -A3E9;YI SYLLABLE JUOX;Lo;0;L;;;;;N;;;;; -A3EA;YI SYLLABLE JUO;Lo;0;L;;;;;N;;;;; -A3EB;YI SYLLABLE JUOP;Lo;0;L;;;;;N;;;;; -A3EC;YI SYLLABLE JOT;Lo;0;L;;;;;N;;;;; -A3ED;YI SYLLABLE JOX;Lo;0;L;;;;;N;;;;; -A3EE;YI SYLLABLE JO;Lo;0;L;;;;;N;;;;; -A3EF;YI SYLLABLE JOP;Lo;0;L;;;;;N;;;;; -A3F0;YI SYLLABLE JUT;Lo;0;L;;;;;N;;;;; -A3F1;YI SYLLABLE JUX;Lo;0;L;;;;;N;;;;; -A3F2;YI SYLLABLE JU;Lo;0;L;;;;;N;;;;; -A3F3;YI SYLLABLE JUP;Lo;0;L;;;;;N;;;;; -A3F4;YI SYLLABLE JURX;Lo;0;L;;;;;N;;;;; -A3F5;YI SYLLABLE JUR;Lo;0;L;;;;;N;;;;; -A3F6;YI SYLLABLE JYT;Lo;0;L;;;;;N;;;;; -A3F7;YI SYLLABLE JYX;Lo;0;L;;;;;N;;;;; -A3F8;YI SYLLABLE JY;Lo;0;L;;;;;N;;;;; -A3F9;YI SYLLABLE JYP;Lo;0;L;;;;;N;;;;; -A3FA;YI SYLLABLE JYRX;Lo;0;L;;;;;N;;;;; -A3FB;YI SYLLABLE JYR;Lo;0;L;;;;;N;;;;; -A3FC;YI SYLLABLE QIT;Lo;0;L;;;;;N;;;;; -A3FD;YI SYLLABLE QIX;Lo;0;L;;;;;N;;;;; -A3FE;YI SYLLABLE QI;Lo;0;L;;;;;N;;;;; -A3FF;YI SYLLABLE QIP;Lo;0;L;;;;;N;;;;; -A400;YI SYLLABLE QIET;Lo;0;L;;;;;N;;;;; -A401;YI SYLLABLE QIEX;Lo;0;L;;;;;N;;;;; -A402;YI SYLLABLE QIE;Lo;0;L;;;;;N;;;;; -A403;YI SYLLABLE QIEP;Lo;0;L;;;;;N;;;;; -A404;YI SYLLABLE QUOT;Lo;0;L;;;;;N;;;;; -A405;YI SYLLABLE QUOX;Lo;0;L;;;;;N;;;;; -A406;YI SYLLABLE QUO;Lo;0;L;;;;;N;;;;; -A407;YI SYLLABLE QUOP;Lo;0;L;;;;;N;;;;; -A408;YI SYLLABLE QOT;Lo;0;L;;;;;N;;;;; -A409;YI SYLLABLE QOX;Lo;0;L;;;;;N;;;;; -A40A;YI SYLLABLE QO;Lo;0;L;;;;;N;;;;; -A40B;YI SYLLABLE QOP;Lo;0;L;;;;;N;;;;; -A40C;YI SYLLABLE QUT;Lo;0;L;;;;;N;;;;; -A40D;YI SYLLABLE QUX;Lo;0;L;;;;;N;;;;; -A40E;YI SYLLABLE QU;Lo;0;L;;;;;N;;;;; -A40F;YI SYLLABLE QUP;Lo;0;L;;;;;N;;;;; -A410;YI SYLLABLE QURX;Lo;0;L;;;;;N;;;;; -A411;YI SYLLABLE QUR;Lo;0;L;;;;;N;;;;; -A412;YI SYLLABLE QYT;Lo;0;L;;;;;N;;;;; -A413;YI SYLLABLE QYX;Lo;0;L;;;;;N;;;;; -A414;YI SYLLABLE QY;Lo;0;L;;;;;N;;;;; -A415;YI SYLLABLE QYP;Lo;0;L;;;;;N;;;;; -A416;YI SYLLABLE QYRX;Lo;0;L;;;;;N;;;;; -A417;YI SYLLABLE QYR;Lo;0;L;;;;;N;;;;; -A418;YI SYLLABLE JJIT;Lo;0;L;;;;;N;;;;; -A419;YI SYLLABLE JJIX;Lo;0;L;;;;;N;;;;; -A41A;YI SYLLABLE JJI;Lo;0;L;;;;;N;;;;; -A41B;YI SYLLABLE JJIP;Lo;0;L;;;;;N;;;;; -A41C;YI SYLLABLE JJIET;Lo;0;L;;;;;N;;;;; -A41D;YI SYLLABLE JJIEX;Lo;0;L;;;;;N;;;;; -A41E;YI SYLLABLE JJIE;Lo;0;L;;;;;N;;;;; -A41F;YI SYLLABLE JJIEP;Lo;0;L;;;;;N;;;;; -A420;YI SYLLABLE JJUOX;Lo;0;L;;;;;N;;;;; -A421;YI SYLLABLE JJUO;Lo;0;L;;;;;N;;;;; -A422;YI SYLLABLE JJUOP;Lo;0;L;;;;;N;;;;; -A423;YI SYLLABLE JJOT;Lo;0;L;;;;;N;;;;; -A424;YI SYLLABLE JJOX;Lo;0;L;;;;;N;;;;; -A425;YI SYLLABLE JJO;Lo;0;L;;;;;N;;;;; -A426;YI SYLLABLE JJOP;Lo;0;L;;;;;N;;;;; -A427;YI SYLLABLE JJUT;Lo;0;L;;;;;N;;;;; -A428;YI SYLLABLE JJUX;Lo;0;L;;;;;N;;;;; -A429;YI SYLLABLE JJU;Lo;0;L;;;;;N;;;;; -A42A;YI SYLLABLE JJUP;Lo;0;L;;;;;N;;;;; -A42B;YI SYLLABLE JJURX;Lo;0;L;;;;;N;;;;; -A42C;YI SYLLABLE JJUR;Lo;0;L;;;;;N;;;;; -A42D;YI SYLLABLE JJYT;Lo;0;L;;;;;N;;;;; -A42E;YI SYLLABLE JJYX;Lo;0;L;;;;;N;;;;; -A42F;YI SYLLABLE JJY;Lo;0;L;;;;;N;;;;; -A430;YI SYLLABLE JJYP;Lo;0;L;;;;;N;;;;; -A431;YI SYLLABLE NJIT;Lo;0;L;;;;;N;;;;; -A432;YI SYLLABLE NJIX;Lo;0;L;;;;;N;;;;; -A433;YI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; -A434;YI SYLLABLE NJIP;Lo;0;L;;;;;N;;;;; -A435;YI SYLLABLE NJIET;Lo;0;L;;;;;N;;;;; -A436;YI SYLLABLE NJIEX;Lo;0;L;;;;;N;;;;; -A437;YI SYLLABLE NJIE;Lo;0;L;;;;;N;;;;; -A438;YI SYLLABLE NJIEP;Lo;0;L;;;;;N;;;;; -A439;YI SYLLABLE NJUOX;Lo;0;L;;;;;N;;;;; -A43A;YI SYLLABLE NJUO;Lo;0;L;;;;;N;;;;; -A43B;YI SYLLABLE NJOT;Lo;0;L;;;;;N;;;;; -A43C;YI SYLLABLE NJOX;Lo;0;L;;;;;N;;;;; -A43D;YI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; -A43E;YI SYLLABLE NJOP;Lo;0;L;;;;;N;;;;; -A43F;YI SYLLABLE NJUX;Lo;0;L;;;;;N;;;;; -A440;YI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; -A441;YI SYLLABLE NJUP;Lo;0;L;;;;;N;;;;; -A442;YI SYLLABLE NJURX;Lo;0;L;;;;;N;;;;; -A443;YI SYLLABLE NJUR;Lo;0;L;;;;;N;;;;; -A444;YI SYLLABLE NJYT;Lo;0;L;;;;;N;;;;; -A445;YI SYLLABLE NJYX;Lo;0;L;;;;;N;;;;; -A446;YI SYLLABLE NJY;Lo;0;L;;;;;N;;;;; -A447;YI SYLLABLE NJYP;Lo;0;L;;;;;N;;;;; -A448;YI SYLLABLE NJYRX;Lo;0;L;;;;;N;;;;; -A449;YI SYLLABLE NJYR;Lo;0;L;;;;;N;;;;; -A44A;YI SYLLABLE NYIT;Lo;0;L;;;;;N;;;;; -A44B;YI SYLLABLE NYIX;Lo;0;L;;;;;N;;;;; -A44C;YI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -A44D;YI SYLLABLE NYIP;Lo;0;L;;;;;N;;;;; -A44E;YI SYLLABLE NYIET;Lo;0;L;;;;;N;;;;; -A44F;YI SYLLABLE NYIEX;Lo;0;L;;;;;N;;;;; -A450;YI SYLLABLE NYIE;Lo;0;L;;;;;N;;;;; -A451;YI SYLLABLE NYIEP;Lo;0;L;;;;;N;;;;; -A452;YI SYLLABLE NYUOX;Lo;0;L;;;;;N;;;;; -A453;YI SYLLABLE NYUO;Lo;0;L;;;;;N;;;;; -A454;YI SYLLABLE NYUOP;Lo;0;L;;;;;N;;;;; -A455;YI SYLLABLE NYOT;Lo;0;L;;;;;N;;;;; -A456;YI SYLLABLE NYOX;Lo;0;L;;;;;N;;;;; -A457;YI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -A458;YI SYLLABLE NYOP;Lo;0;L;;;;;N;;;;; -A459;YI SYLLABLE NYUT;Lo;0;L;;;;;N;;;;; -A45A;YI SYLLABLE NYUX;Lo;0;L;;;;;N;;;;; -A45B;YI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -A45C;YI SYLLABLE NYUP;Lo;0;L;;;;;N;;;;; -A45D;YI SYLLABLE XIT;Lo;0;L;;;;;N;;;;; -A45E;YI SYLLABLE XIX;Lo;0;L;;;;;N;;;;; -A45F;YI SYLLABLE XI;Lo;0;L;;;;;N;;;;; -A460;YI SYLLABLE XIP;Lo;0;L;;;;;N;;;;; -A461;YI SYLLABLE XIET;Lo;0;L;;;;;N;;;;; -A462;YI SYLLABLE XIEX;Lo;0;L;;;;;N;;;;; -A463;YI SYLLABLE XIE;Lo;0;L;;;;;N;;;;; -A464;YI SYLLABLE XIEP;Lo;0;L;;;;;N;;;;; -A465;YI SYLLABLE XUOX;Lo;0;L;;;;;N;;;;; -A466;YI SYLLABLE XUO;Lo;0;L;;;;;N;;;;; -A467;YI SYLLABLE XOT;Lo;0;L;;;;;N;;;;; -A468;YI SYLLABLE XOX;Lo;0;L;;;;;N;;;;; -A469;YI SYLLABLE XO;Lo;0;L;;;;;N;;;;; -A46A;YI SYLLABLE XOP;Lo;0;L;;;;;N;;;;; -A46B;YI SYLLABLE XYT;Lo;0;L;;;;;N;;;;; -A46C;YI SYLLABLE XYX;Lo;0;L;;;;;N;;;;; -A46D;YI SYLLABLE XY;Lo;0;L;;;;;N;;;;; -A46E;YI SYLLABLE XYP;Lo;0;L;;;;;N;;;;; -A46F;YI SYLLABLE XYRX;Lo;0;L;;;;;N;;;;; -A470;YI SYLLABLE XYR;Lo;0;L;;;;;N;;;;; -A471;YI SYLLABLE YIT;Lo;0;L;;;;;N;;;;; -A472;YI SYLLABLE YIX;Lo;0;L;;;;;N;;;;; -A473;YI SYLLABLE YI;Lo;0;L;;;;;N;;;;; -A474;YI SYLLABLE YIP;Lo;0;L;;;;;N;;;;; -A475;YI SYLLABLE YIET;Lo;0;L;;;;;N;;;;; -A476;YI SYLLABLE YIEX;Lo;0;L;;;;;N;;;;; -A477;YI SYLLABLE YIE;Lo;0;L;;;;;N;;;;; -A478;YI SYLLABLE YIEP;Lo;0;L;;;;;N;;;;; -A479;YI SYLLABLE YUOT;Lo;0;L;;;;;N;;;;; -A47A;YI SYLLABLE YUOX;Lo;0;L;;;;;N;;;;; -A47B;YI SYLLABLE YUO;Lo;0;L;;;;;N;;;;; -A47C;YI SYLLABLE YUOP;Lo;0;L;;;;;N;;;;; -A47D;YI SYLLABLE YOT;Lo;0;L;;;;;N;;;;; -A47E;YI SYLLABLE YOX;Lo;0;L;;;;;N;;;;; -A47F;YI SYLLABLE YO;Lo;0;L;;;;;N;;;;; -A480;YI SYLLABLE YOP;Lo;0;L;;;;;N;;;;; -A481;YI SYLLABLE YUT;Lo;0;L;;;;;N;;;;; -A482;YI SYLLABLE YUX;Lo;0;L;;;;;N;;;;; -A483;YI SYLLABLE YU;Lo;0;L;;;;;N;;;;; -A484;YI SYLLABLE YUP;Lo;0;L;;;;;N;;;;; -A485;YI SYLLABLE YURX;Lo;0;L;;;;;N;;;;; -A486;YI SYLLABLE YUR;Lo;0;L;;;;;N;;;;; -A487;YI SYLLABLE YYT;Lo;0;L;;;;;N;;;;; -A488;YI SYLLABLE YYX;Lo;0;L;;;;;N;;;;; -A489;YI SYLLABLE YY;Lo;0;L;;;;;N;;;;; -A48A;YI SYLLABLE YYP;Lo;0;L;;;;;N;;;;; -A48B;YI SYLLABLE YYRX;Lo;0;L;;;;;N;;;;; -A48C;YI SYLLABLE YYR;Lo;0;L;;;;;N;;;;; -A490;YI RADICAL QOT;So;0;ON;;;;;N;;;;; -A491;YI RADICAL LI;So;0;ON;;;;;N;;;;; -A492;YI RADICAL KIT;So;0;ON;;;;;N;;;;; -A493;YI RADICAL NYIP;So;0;ON;;;;;N;;;;; -A494;YI RADICAL CYP;So;0;ON;;;;;N;;;;; -A495;YI RADICAL SSI;So;0;ON;;;;;N;;;;; -A496;YI RADICAL GGOP;So;0;ON;;;;;N;;;;; -A497;YI RADICAL GEP;So;0;ON;;;;;N;;;;; -A498;YI RADICAL MI;So;0;ON;;;;;N;;;;; -A499;YI RADICAL HXIT;So;0;ON;;;;;N;;;;; -A49A;YI RADICAL LYR;So;0;ON;;;;;N;;;;; -A49B;YI RADICAL BBUT;So;0;ON;;;;;N;;;;; -A49C;YI RADICAL MOP;So;0;ON;;;;;N;;;;; -A49D;YI RADICAL YO;So;0;ON;;;;;N;;;;; -A49E;YI RADICAL PUT;So;0;ON;;;;;N;;;;; -A49F;YI RADICAL HXUO;So;0;ON;;;;;N;;;;; -A4A0;YI RADICAL TAT;So;0;ON;;;;;N;;;;; -A4A1;YI RADICAL GA;So;0;ON;;;;;N;;;;; -A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;; -A4A3;YI RADICAL CYT;So;0;ON;;;;;N;;;;; -A4A4;YI RADICAL DDUR;So;0;ON;;;;;N;;;;; -A4A5;YI RADICAL BUR;So;0;ON;;;;;N;;;;; -A4A6;YI RADICAL GGUO;So;0;ON;;;;;N;;;;; -A4A7;YI RADICAL NYOP;So;0;ON;;;;;N;;;;; -A4A8;YI RADICAL TU;So;0;ON;;;;;N;;;;; -A4A9;YI RADICAL OP;So;0;ON;;;;;N;;;;; -A4AA;YI RADICAL JJUT;So;0;ON;;;;;N;;;;; -A4AB;YI RADICAL ZOT;So;0;ON;;;;;N;;;;; -A4AC;YI RADICAL PYT;So;0;ON;;;;;N;;;;; -A4AD;YI RADICAL HMO;So;0;ON;;;;;N;;;;; -A4AE;YI RADICAL YIT;So;0;ON;;;;;N;;;;; -A4AF;YI RADICAL VUR;So;0;ON;;;;;N;;;;; -A4B0;YI RADICAL SHY;So;0;ON;;;;;N;;;;; -A4B1;YI RADICAL VEP;So;0;ON;;;;;N;;;;; -A4B2;YI RADICAL ZA;So;0;ON;;;;;N;;;;; -A4B3;YI RADICAL JO;So;0;ON;;;;;N;;;;; -A4B4;YI RADICAL NZUP;So;0;ON;;;;;N;;;;; -A4B5;YI RADICAL JJY;So;0;ON;;;;;N;;;;; -A4B6;YI RADICAL GOT;So;0;ON;;;;;N;;;;; -A4B7;YI RADICAL JJIE;So;0;ON;;;;;N;;;;; -A4B8;YI RADICAL WO;So;0;ON;;;;;N;;;;; -A4B9;YI RADICAL DU;So;0;ON;;;;;N;;;;; -A4BA;YI RADICAL SHUR;So;0;ON;;;;;N;;;;; -A4BB;YI RADICAL LIE;So;0;ON;;;;;N;;;;; -A4BC;YI RADICAL CY;So;0;ON;;;;;N;;;;; -A4BD;YI RADICAL CUOP;So;0;ON;;;;;N;;;;; -A4BE;YI RADICAL CIP;So;0;ON;;;;;N;;;;; -A4BF;YI RADICAL HXOP;So;0;ON;;;;;N;;;;; -A4C0;YI RADICAL SHAT;So;0;ON;;;;;N;;;;; -A4C1;YI RADICAL ZUR;So;0;ON;;;;;N;;;;; -A4C2;YI RADICAL SHOP;So;0;ON;;;;;N;;;;; -A4C3;YI RADICAL CHE;So;0;ON;;;;;N;;;;; -A4C4;YI RADICAL ZZIET;So;0;ON;;;;;N;;;;; -A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;; -A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;; -A4D0;LISU LETTER BA;Lo;0;L;;;;;N;;;;; -A4D1;LISU LETTER PA;Lo;0;L;;;;;N;;;;; -A4D2;LISU LETTER PHA;Lo;0;L;;;;;N;;;;; -A4D3;LISU LETTER DA;Lo;0;L;;;;;N;;;;; -A4D4;LISU LETTER TA;Lo;0;L;;;;;N;;;;; -A4D5;LISU LETTER THA;Lo;0;L;;;;;N;;;;; -A4D6;LISU LETTER GA;Lo;0;L;;;;;N;;;;; -A4D7;LISU LETTER KA;Lo;0;L;;;;;N;;;;; -A4D8;LISU LETTER KHA;Lo;0;L;;;;;N;;;;; -A4D9;LISU LETTER JA;Lo;0;L;;;;;N;;;;; -A4DA;LISU LETTER CA;Lo;0;L;;;;;N;;;;; -A4DB;LISU LETTER CHA;Lo;0;L;;;;;N;;;;; -A4DC;LISU LETTER DZA;Lo;0;L;;;;;N;;;;; -A4DD;LISU LETTER TSA;Lo;0;L;;;;;N;;;;; -A4DE;LISU LETTER TSHA;Lo;0;L;;;;;N;;;;; -A4DF;LISU LETTER MA;Lo;0;L;;;;;N;;;;; -A4E0;LISU LETTER NA;Lo;0;L;;;;;N;;;;; -A4E1;LISU LETTER LA;Lo;0;L;;;;;N;;;;; -A4E2;LISU LETTER SA;Lo;0;L;;;;;N;;;;; -A4E3;LISU LETTER ZHA;Lo;0;L;;;;;N;;;;; -A4E4;LISU LETTER ZA;Lo;0;L;;;;;N;;;;; -A4E5;LISU LETTER NGA;Lo;0;L;;;;;N;;;;; -A4E6;LISU LETTER HA;Lo;0;L;;;;;N;;;;; -A4E7;LISU LETTER XA;Lo;0;L;;;;;N;;;;; -A4E8;LISU LETTER HHA;Lo;0;L;;;;;N;;;;; -A4E9;LISU LETTER FA;Lo;0;L;;;;;N;;;;; -A4EA;LISU LETTER WA;Lo;0;L;;;;;N;;;;; -A4EB;LISU LETTER SHA;Lo;0;L;;;;;N;;;;; -A4EC;LISU LETTER YA;Lo;0;L;;;;;N;;;;; -A4ED;LISU LETTER GHA;Lo;0;L;;;;;N;;;;; -A4EE;LISU LETTER A;Lo;0;L;;;;;N;;;;; -A4EF;LISU LETTER AE;Lo;0;L;;;;;N;;;;; -A4F0;LISU LETTER E;Lo;0;L;;;;;N;;;;; -A4F1;LISU LETTER EU;Lo;0;L;;;;;N;;;;; -A4F2;LISU LETTER I;Lo;0;L;;;;;N;;;;; -A4F3;LISU LETTER O;Lo;0;L;;;;;N;;;;; -A4F4;LISU LETTER U;Lo;0;L;;;;;N;;;;; -A4F5;LISU LETTER UE;Lo;0;L;;;;;N;;;;; -A4F6;LISU LETTER UH;Lo;0;L;;;;;N;;;;; -A4F7;LISU LETTER OE;Lo;0;L;;;;;N;;;;; -A4F8;LISU LETTER TONE MYA TI;Lm;0;L;;;;;N;;;;; -A4F9;LISU LETTER TONE NA PO;Lm;0;L;;;;;N;;;;; -A4FA;LISU LETTER TONE MYA CYA;Lm;0;L;;;;;N;;;;; -A4FB;LISU LETTER TONE MYA BO;Lm;0;L;;;;;N;;;;; -A4FC;LISU LETTER TONE MYA NA;Lm;0;L;;;;;N;;;;; -A4FD;LISU LETTER TONE MYA JEU;Lm;0;L;;;;;N;;;;; -A4FE;LISU PUNCTUATION COMMA;Po;0;L;;;;;N;;;;; -A4FF;LISU PUNCTUATION FULL STOP;Po;0;L;;;;;N;;;;; -A500;VAI SYLLABLE EE;Lo;0;L;;;;;N;;;;; -A501;VAI SYLLABLE EEN;Lo;0;L;;;;;N;;;;; -A502;VAI SYLLABLE HEE;Lo;0;L;;;;;N;;;;; -A503;VAI SYLLABLE WEE;Lo;0;L;;;;;N;;;;; -A504;VAI SYLLABLE WEEN;Lo;0;L;;;;;N;;;;; -A505;VAI SYLLABLE PEE;Lo;0;L;;;;;N;;;;; -A506;VAI SYLLABLE BHEE;Lo;0;L;;;;;N;;;;; -A507;VAI SYLLABLE BEE;Lo;0;L;;;;;N;;;;; -A508;VAI SYLLABLE MBEE;Lo;0;L;;;;;N;;;;; -A509;VAI SYLLABLE KPEE;Lo;0;L;;;;;N;;;;; -A50A;VAI SYLLABLE MGBEE;Lo;0;L;;;;;N;;;;; -A50B;VAI SYLLABLE GBEE;Lo;0;L;;;;;N;;;;; -A50C;VAI SYLLABLE FEE;Lo;0;L;;;;;N;;;;; -A50D;VAI SYLLABLE VEE;Lo;0;L;;;;;N;;;;; -A50E;VAI SYLLABLE TEE;Lo;0;L;;;;;N;;;;; -A50F;VAI SYLLABLE THEE;Lo;0;L;;;;;N;;;;; -A510;VAI SYLLABLE DHEE;Lo;0;L;;;;;N;;;;; -A511;VAI SYLLABLE DHHEE;Lo;0;L;;;;;N;;;;; -A512;VAI SYLLABLE LEE;Lo;0;L;;;;;N;;;;; -A513;VAI SYLLABLE REE;Lo;0;L;;;;;N;;;;; -A514;VAI SYLLABLE DEE;Lo;0;L;;;;;N;;;;; -A515;VAI SYLLABLE NDEE;Lo;0;L;;;;;N;;;;; -A516;VAI SYLLABLE SEE;Lo;0;L;;;;;N;;;;; -A517;VAI SYLLABLE SHEE;Lo;0;L;;;;;N;;;;; -A518;VAI SYLLABLE ZEE;Lo;0;L;;;;;N;;;;; -A519;VAI SYLLABLE ZHEE;Lo;0;L;;;;;N;;;;; -A51A;VAI SYLLABLE CEE;Lo;0;L;;;;;N;;;;; -A51B;VAI SYLLABLE JEE;Lo;0;L;;;;;N;;;;; -A51C;VAI SYLLABLE NJEE;Lo;0;L;;;;;N;;;;; -A51D;VAI SYLLABLE YEE;Lo;0;L;;;;;N;;;;; -A51E;VAI SYLLABLE KEE;Lo;0;L;;;;;N;;;;; -A51F;VAI SYLLABLE NGGEE;Lo;0;L;;;;;N;;;;; -A520;VAI SYLLABLE GEE;Lo;0;L;;;;;N;;;;; -A521;VAI SYLLABLE MEE;Lo;0;L;;;;;N;;;;; -A522;VAI SYLLABLE NEE;Lo;0;L;;;;;N;;;;; -A523;VAI SYLLABLE NYEE;Lo;0;L;;;;;N;;;;; -A524;VAI SYLLABLE I;Lo;0;L;;;;;N;;;;; -A525;VAI SYLLABLE IN;Lo;0;L;;;;;N;;;;; -A526;VAI SYLLABLE HI;Lo;0;L;;;;;N;;;;; -A527;VAI SYLLABLE HIN;Lo;0;L;;;;;N;;;;; -A528;VAI SYLLABLE WI;Lo;0;L;;;;;N;;;;; -A529;VAI SYLLABLE WIN;Lo;0;L;;;;;N;;;;; -A52A;VAI SYLLABLE PI;Lo;0;L;;;;;N;;;;; -A52B;VAI SYLLABLE BHI;Lo;0;L;;;;;N;;;;; -A52C;VAI SYLLABLE BI;Lo;0;L;;;;;N;;;;; -A52D;VAI SYLLABLE MBI;Lo;0;L;;;;;N;;;;; -A52E;VAI SYLLABLE KPI;Lo;0;L;;;;;N;;;;; -A52F;VAI SYLLABLE MGBI;Lo;0;L;;;;;N;;;;; -A530;VAI SYLLABLE GBI;Lo;0;L;;;;;N;;;;; -A531;VAI SYLLABLE FI;Lo;0;L;;;;;N;;;;; -A532;VAI SYLLABLE VI;Lo;0;L;;;;;N;;;;; -A533;VAI SYLLABLE TI;Lo;0;L;;;;;N;;;;; -A534;VAI SYLLABLE THI;Lo;0;L;;;;;N;;;;; -A535;VAI SYLLABLE DHI;Lo;0;L;;;;;N;;;;; -A536;VAI SYLLABLE DHHI;Lo;0;L;;;;;N;;;;; -A537;VAI SYLLABLE LI;Lo;0;L;;;;;N;;;;; -A538;VAI SYLLABLE RI;Lo;0;L;;;;;N;;;;; -A539;VAI SYLLABLE DI;Lo;0;L;;;;;N;;;;; -A53A;VAI SYLLABLE NDI;Lo;0;L;;;;;N;;;;; -A53B;VAI SYLLABLE SI;Lo;0;L;;;;;N;;;;; -A53C;VAI SYLLABLE SHI;Lo;0;L;;;;;N;;;;; -A53D;VAI SYLLABLE ZI;Lo;0;L;;;;;N;;;;; -A53E;VAI SYLLABLE ZHI;Lo;0;L;;;;;N;;;;; -A53F;VAI SYLLABLE CI;Lo;0;L;;;;;N;;;;; -A540;VAI SYLLABLE JI;Lo;0;L;;;;;N;;;;; -A541;VAI SYLLABLE NJI;Lo;0;L;;;;;N;;;;; -A542;VAI SYLLABLE YI;Lo;0;L;;;;;N;;;;; -A543;VAI SYLLABLE KI;Lo;0;L;;;;;N;;;;; -A544;VAI SYLLABLE NGGI;Lo;0;L;;;;;N;;;;; -A545;VAI SYLLABLE GI;Lo;0;L;;;;;N;;;;; -A546;VAI SYLLABLE MI;Lo;0;L;;;;;N;;;;; -A547;VAI SYLLABLE NI;Lo;0;L;;;;;N;;;;; -A548;VAI SYLLABLE NYI;Lo;0;L;;;;;N;;;;; -A549;VAI SYLLABLE A;Lo;0;L;;;;;N;;;;; -A54A;VAI SYLLABLE AN;Lo;0;L;;;;;N;;;;; -A54B;VAI SYLLABLE NGAN;Lo;0;L;;;;;N;;;;; -A54C;VAI SYLLABLE HA;Lo;0;L;;;;;N;;;;; -A54D;VAI SYLLABLE HAN;Lo;0;L;;;;;N;;;;; -A54E;VAI SYLLABLE WA;Lo;0;L;;;;;N;;;;; -A54F;VAI SYLLABLE WAN;Lo;0;L;;;;;N;;;;; -A550;VAI SYLLABLE PA;Lo;0;L;;;;;N;;;;; -A551;VAI SYLLABLE BHA;Lo;0;L;;;;;N;;;;; -A552;VAI SYLLABLE BA;Lo;0;L;;;;;N;;;;; -A553;VAI SYLLABLE MBA;Lo;0;L;;;;;N;;;;; -A554;VAI SYLLABLE KPA;Lo;0;L;;;;;N;;;;; -A555;VAI SYLLABLE KPAN;Lo;0;L;;;;;N;;;;; -A556;VAI SYLLABLE MGBA;Lo;0;L;;;;;N;;;;; -A557;VAI SYLLABLE GBA;Lo;0;L;;;;;N;;;;; -A558;VAI SYLLABLE FA;Lo;0;L;;;;;N;;;;; -A559;VAI SYLLABLE VA;Lo;0;L;;;;;N;;;;; -A55A;VAI SYLLABLE TA;Lo;0;L;;;;;N;;;;; -A55B;VAI SYLLABLE THA;Lo;0;L;;;;;N;;;;; -A55C;VAI SYLLABLE DHA;Lo;0;L;;;;;N;;;;; -A55D;VAI SYLLABLE DHHA;Lo;0;L;;;;;N;;;;; -A55E;VAI SYLLABLE LA;Lo;0;L;;;;;N;;;;; -A55F;VAI SYLLABLE RA;Lo;0;L;;;;;N;;;;; -A560;VAI SYLLABLE DA;Lo;0;L;;;;;N;;;;; -A561;VAI SYLLABLE NDA;Lo;0;L;;;;;N;;;;; -A562;VAI SYLLABLE SA;Lo;0;L;;;;;N;;;;; -A563;VAI SYLLABLE SHA;Lo;0;L;;;;;N;;;;; -A564;VAI SYLLABLE ZA;Lo;0;L;;;;;N;;;;; -A565;VAI SYLLABLE ZHA;Lo;0;L;;;;;N;;;;; -A566;VAI SYLLABLE CA;Lo;0;L;;;;;N;;;;; -A567;VAI SYLLABLE JA;Lo;0;L;;;;;N;;;;; -A568;VAI SYLLABLE NJA;Lo;0;L;;;;;N;;;;; -A569;VAI SYLLABLE YA;Lo;0;L;;;;;N;;;;; -A56A;VAI SYLLABLE KA;Lo;0;L;;;;;N;;;;; -A56B;VAI SYLLABLE KAN;Lo;0;L;;;;;N;;;;; -A56C;VAI SYLLABLE NGGA;Lo;0;L;;;;;N;;;;; -A56D;VAI SYLLABLE GA;Lo;0;L;;;;;N;;;;; -A56E;VAI SYLLABLE MA;Lo;0;L;;;;;N;;;;; -A56F;VAI SYLLABLE NA;Lo;0;L;;;;;N;;;;; -A570;VAI SYLLABLE NYA;Lo;0;L;;;;;N;;;;; -A571;VAI SYLLABLE OO;Lo;0;L;;;;;N;;;;; -A572;VAI SYLLABLE OON;Lo;0;L;;;;;N;;;;; -A573;VAI SYLLABLE HOO;Lo;0;L;;;;;N;;;;; -A574;VAI SYLLABLE WOO;Lo;0;L;;;;;N;;;;; -A575;VAI SYLLABLE WOON;Lo;0;L;;;;;N;;;;; -A576;VAI SYLLABLE POO;Lo;0;L;;;;;N;;;;; -A577;VAI SYLLABLE BHOO;Lo;0;L;;;;;N;;;;; -A578;VAI SYLLABLE BOO;Lo;0;L;;;;;N;;;;; -A579;VAI SYLLABLE MBOO;Lo;0;L;;;;;N;;;;; -A57A;VAI SYLLABLE KPOO;Lo;0;L;;;;;N;;;;; -A57B;VAI SYLLABLE MGBOO;Lo;0;L;;;;;N;;;;; -A57C;VAI SYLLABLE GBOO;Lo;0;L;;;;;N;;;;; -A57D;VAI SYLLABLE FOO;Lo;0;L;;;;;N;;;;; -A57E;VAI SYLLABLE VOO;Lo;0;L;;;;;N;;;;; -A57F;VAI SYLLABLE TOO;Lo;0;L;;;;;N;;;;; -A580;VAI SYLLABLE THOO;Lo;0;L;;;;;N;;;;; -A581;VAI SYLLABLE DHOO;Lo;0;L;;;;;N;;;;; -A582;VAI SYLLABLE DHHOO;Lo;0;L;;;;;N;;;;; -A583;VAI SYLLABLE LOO;Lo;0;L;;;;;N;;;;; -A584;VAI SYLLABLE ROO;Lo;0;L;;;;;N;;;;; -A585;VAI SYLLABLE DOO;Lo;0;L;;;;;N;;;;; -A586;VAI SYLLABLE NDOO;Lo;0;L;;;;;N;;;;; -A587;VAI SYLLABLE SOO;Lo;0;L;;;;;N;;;;; -A588;VAI SYLLABLE SHOO;Lo;0;L;;;;;N;;;;; -A589;VAI SYLLABLE ZOO;Lo;0;L;;;;;N;;;;; -A58A;VAI SYLLABLE ZHOO;Lo;0;L;;;;;N;;;;; -A58B;VAI SYLLABLE COO;Lo;0;L;;;;;N;;;;; -A58C;VAI SYLLABLE JOO;Lo;0;L;;;;;N;;;;; -A58D;VAI SYLLABLE NJOO;Lo;0;L;;;;;N;;;;; -A58E;VAI SYLLABLE YOO;Lo;0;L;;;;;N;;;;; -A58F;VAI SYLLABLE KOO;Lo;0;L;;;;;N;;;;; -A590;VAI SYLLABLE NGGOO;Lo;0;L;;;;;N;;;;; -A591;VAI SYLLABLE GOO;Lo;0;L;;;;;N;;;;; -A592;VAI SYLLABLE MOO;Lo;0;L;;;;;N;;;;; -A593;VAI SYLLABLE NOO;Lo;0;L;;;;;N;;;;; -A594;VAI SYLLABLE NYOO;Lo;0;L;;;;;N;;;;; -A595;VAI SYLLABLE U;Lo;0;L;;;;;N;;;;; -A596;VAI SYLLABLE UN;Lo;0;L;;;;;N;;;;; -A597;VAI SYLLABLE HU;Lo;0;L;;;;;N;;;;; -A598;VAI SYLLABLE HUN;Lo;0;L;;;;;N;;;;; -A599;VAI SYLLABLE WU;Lo;0;L;;;;;N;;;;; -A59A;VAI SYLLABLE WUN;Lo;0;L;;;;;N;;;;; -A59B;VAI SYLLABLE PU;Lo;0;L;;;;;N;;;;; -A59C;VAI SYLLABLE BHU;Lo;0;L;;;;;N;;;;; -A59D;VAI SYLLABLE BU;Lo;0;L;;;;;N;;;;; -A59E;VAI SYLLABLE MBU;Lo;0;L;;;;;N;;;;; -A59F;VAI SYLLABLE KPU;Lo;0;L;;;;;N;;;;; -A5A0;VAI SYLLABLE MGBU;Lo;0;L;;;;;N;;;;; -A5A1;VAI SYLLABLE GBU;Lo;0;L;;;;;N;;;;; -A5A2;VAI SYLLABLE FU;Lo;0;L;;;;;N;;;;; -A5A3;VAI SYLLABLE VU;Lo;0;L;;;;;N;;;;; -A5A4;VAI SYLLABLE TU;Lo;0;L;;;;;N;;;;; -A5A5;VAI SYLLABLE THU;Lo;0;L;;;;;N;;;;; -A5A6;VAI SYLLABLE DHU;Lo;0;L;;;;;N;;;;; -A5A7;VAI SYLLABLE DHHU;Lo;0;L;;;;;N;;;;; -A5A8;VAI SYLLABLE LU;Lo;0;L;;;;;N;;;;; -A5A9;VAI SYLLABLE RU;Lo;0;L;;;;;N;;;;; -A5AA;VAI SYLLABLE DU;Lo;0;L;;;;;N;;;;; -A5AB;VAI SYLLABLE NDU;Lo;0;L;;;;;N;;;;; -A5AC;VAI SYLLABLE SU;Lo;0;L;;;;;N;;;;; -A5AD;VAI SYLLABLE SHU;Lo;0;L;;;;;N;;;;; -A5AE;VAI SYLLABLE ZU;Lo;0;L;;;;;N;;;;; -A5AF;VAI SYLLABLE ZHU;Lo;0;L;;;;;N;;;;; -A5B0;VAI SYLLABLE CU;Lo;0;L;;;;;N;;;;; -A5B1;VAI SYLLABLE JU;Lo;0;L;;;;;N;;;;; -A5B2;VAI SYLLABLE NJU;Lo;0;L;;;;;N;;;;; -A5B3;VAI SYLLABLE YU;Lo;0;L;;;;;N;;;;; -A5B4;VAI SYLLABLE KU;Lo;0;L;;;;;N;;;;; -A5B5;VAI SYLLABLE NGGU;Lo;0;L;;;;;N;;;;; -A5B6;VAI SYLLABLE GU;Lo;0;L;;;;;N;;;;; -A5B7;VAI SYLLABLE MU;Lo;0;L;;;;;N;;;;; -A5B8;VAI SYLLABLE NU;Lo;0;L;;;;;N;;;;; -A5B9;VAI SYLLABLE NYU;Lo;0;L;;;;;N;;;;; -A5BA;VAI SYLLABLE O;Lo;0;L;;;;;N;;;;; -A5BB;VAI SYLLABLE ON;Lo;0;L;;;;;N;;;;; -A5BC;VAI SYLLABLE NGON;Lo;0;L;;;;;N;;;;; -A5BD;VAI SYLLABLE HO;Lo;0;L;;;;;N;;;;; -A5BE;VAI SYLLABLE HON;Lo;0;L;;;;;N;;;;; -A5BF;VAI SYLLABLE WO;Lo;0;L;;;;;N;;;;; -A5C0;VAI SYLLABLE WON;Lo;0;L;;;;;N;;;;; -A5C1;VAI SYLLABLE PO;Lo;0;L;;;;;N;;;;; -A5C2;VAI SYLLABLE BHO;Lo;0;L;;;;;N;;;;; -A5C3;VAI SYLLABLE BO;Lo;0;L;;;;;N;;;;; -A5C4;VAI SYLLABLE MBO;Lo;0;L;;;;;N;;;;; -A5C5;VAI SYLLABLE KPO;Lo;0;L;;;;;N;;;;; -A5C6;VAI SYLLABLE MGBO;Lo;0;L;;;;;N;;;;; -A5C7;VAI SYLLABLE GBO;Lo;0;L;;;;;N;;;;; -A5C8;VAI SYLLABLE GBON;Lo;0;L;;;;;N;;;;; -A5C9;VAI SYLLABLE FO;Lo;0;L;;;;;N;;;;; -A5CA;VAI SYLLABLE VO;Lo;0;L;;;;;N;;;;; -A5CB;VAI SYLLABLE TO;Lo;0;L;;;;;N;;;;; -A5CC;VAI SYLLABLE THO;Lo;0;L;;;;;N;;;;; -A5CD;VAI SYLLABLE DHO;Lo;0;L;;;;;N;;;;; -A5CE;VAI SYLLABLE DHHO;Lo;0;L;;;;;N;;;;; -A5CF;VAI SYLLABLE LO;Lo;0;L;;;;;N;;;;; -A5D0;VAI SYLLABLE RO;Lo;0;L;;;;;N;;;;; -A5D1;VAI SYLLABLE DO;Lo;0;L;;;;;N;;;;; -A5D2;VAI SYLLABLE NDO;Lo;0;L;;;;;N;;;;; -A5D3;VAI SYLLABLE SO;Lo;0;L;;;;;N;;;;; -A5D4;VAI SYLLABLE SHO;Lo;0;L;;;;;N;;;;; -A5D5;VAI SYLLABLE ZO;Lo;0;L;;;;;N;;;;; -A5D6;VAI SYLLABLE ZHO;Lo;0;L;;;;;N;;;;; -A5D7;VAI SYLLABLE CO;Lo;0;L;;;;;N;;;;; -A5D8;VAI SYLLABLE JO;Lo;0;L;;;;;N;;;;; -A5D9;VAI SYLLABLE NJO;Lo;0;L;;;;;N;;;;; -A5DA;VAI SYLLABLE YO;Lo;0;L;;;;;N;;;;; -A5DB;VAI SYLLABLE KO;Lo;0;L;;;;;N;;;;; -A5DC;VAI SYLLABLE NGGO;Lo;0;L;;;;;N;;;;; -A5DD;VAI SYLLABLE GO;Lo;0;L;;;;;N;;;;; -A5DE;VAI SYLLABLE MO;Lo;0;L;;;;;N;;;;; -A5DF;VAI SYLLABLE NO;Lo;0;L;;;;;N;;;;; -A5E0;VAI SYLLABLE NYO;Lo;0;L;;;;;N;;;;; -A5E1;VAI SYLLABLE E;Lo;0;L;;;;;N;;;;; -A5E2;VAI SYLLABLE EN;Lo;0;L;;;;;N;;;;; -A5E3;VAI SYLLABLE NGEN;Lo;0;L;;;;;N;;;;; -A5E4;VAI SYLLABLE HE;Lo;0;L;;;;;N;;;;; -A5E5;VAI SYLLABLE HEN;Lo;0;L;;;;;N;;;;; -A5E6;VAI SYLLABLE WE;Lo;0;L;;;;;N;;;;; -A5E7;VAI SYLLABLE WEN;Lo;0;L;;;;;N;;;;; -A5E8;VAI SYLLABLE PE;Lo;0;L;;;;;N;;;;; -A5E9;VAI SYLLABLE BHE;Lo;0;L;;;;;N;;;;; -A5EA;VAI SYLLABLE BE;Lo;0;L;;;;;N;;;;; -A5EB;VAI SYLLABLE MBE;Lo;0;L;;;;;N;;;;; -A5EC;VAI SYLLABLE KPE;Lo;0;L;;;;;N;;;;; -A5ED;VAI SYLLABLE KPEN;Lo;0;L;;;;;N;;;;; -A5EE;VAI SYLLABLE MGBE;Lo;0;L;;;;;N;;;;; -A5EF;VAI SYLLABLE GBE;Lo;0;L;;;;;N;;;;; -A5F0;VAI SYLLABLE GBEN;Lo;0;L;;;;;N;;;;; -A5F1;VAI SYLLABLE FE;Lo;0;L;;;;;N;;;;; -A5F2;VAI SYLLABLE VE;Lo;0;L;;;;;N;;;;; -A5F3;VAI SYLLABLE TE;Lo;0;L;;;;;N;;;;; -A5F4;VAI SYLLABLE THE;Lo;0;L;;;;;N;;;;; -A5F5;VAI SYLLABLE DHE;Lo;0;L;;;;;N;;;;; -A5F6;VAI SYLLABLE DHHE;Lo;0;L;;;;;N;;;;; -A5F7;VAI SYLLABLE LE;Lo;0;L;;;;;N;;;;; -A5F8;VAI SYLLABLE RE;Lo;0;L;;;;;N;;;;; -A5F9;VAI SYLLABLE DE;Lo;0;L;;;;;N;;;;; -A5FA;VAI SYLLABLE NDE;Lo;0;L;;;;;N;;;;; -A5FB;VAI SYLLABLE SE;Lo;0;L;;;;;N;;;;; -A5FC;VAI SYLLABLE SHE;Lo;0;L;;;;;N;;;;; -A5FD;VAI SYLLABLE ZE;Lo;0;L;;;;;N;;;;; -A5FE;VAI SYLLABLE ZHE;Lo;0;L;;;;;N;;;;; -A5FF;VAI SYLLABLE CE;Lo;0;L;;;;;N;;;;; -A600;VAI SYLLABLE JE;Lo;0;L;;;;;N;;;;; -A601;VAI SYLLABLE NJE;Lo;0;L;;;;;N;;;;; -A602;VAI SYLLABLE YE;Lo;0;L;;;;;N;;;;; -A603;VAI SYLLABLE KE;Lo;0;L;;;;;N;;;;; -A604;VAI SYLLABLE NGGE;Lo;0;L;;;;;N;;;;; -A605;VAI SYLLABLE NGGEN;Lo;0;L;;;;;N;;;;; -A606;VAI SYLLABLE GE;Lo;0;L;;;;;N;;;;; -A607;VAI SYLLABLE GEN;Lo;0;L;;;;;N;;;;; -A608;VAI SYLLABLE ME;Lo;0;L;;;;;N;;;;; -A609;VAI SYLLABLE NE;Lo;0;L;;;;;N;;;;; -A60A;VAI SYLLABLE NYE;Lo;0;L;;;;;N;;;;; -A60B;VAI SYLLABLE NG;Lo;0;L;;;;;N;;;;; -A60C;VAI SYLLABLE LENGTHENER;Lm;0;L;;;;;N;;;;; -A60D;VAI COMMA;Po;0;ON;;;;;N;;;;; -A60E;VAI FULL STOP;Po;0;ON;;;;;N;;;;; -A60F;VAI QUESTION MARK;Po;0;ON;;;;;N;;;;; -A610;VAI SYLLABLE NDOLE FA;Lo;0;L;;;;;N;;;;; -A611;VAI SYLLABLE NDOLE KA;Lo;0;L;;;;;N;;;;; -A612;VAI SYLLABLE NDOLE SOO;Lo;0;L;;;;;N;;;;; -A613;VAI SYMBOL FEENG;Lo;0;L;;;;;N;;;;; -A614;VAI SYMBOL KEENG;Lo;0;L;;;;;N;;;;; -A615;VAI SYMBOL TING;Lo;0;L;;;;;N;;;;; -A616;VAI SYMBOL NII;Lo;0;L;;;;;N;;;;; -A617;VAI SYMBOL BANG;Lo;0;L;;;;;N;;;;; -A618;VAI SYMBOL FAA;Lo;0;L;;;;;N;;;;; -A619;VAI SYMBOL TAA;Lo;0;L;;;;;N;;;;; -A61A;VAI SYMBOL DANG;Lo;0;L;;;;;N;;;;; -A61B;VAI SYMBOL DOONG;Lo;0;L;;;;;N;;;;; -A61C;VAI SYMBOL KUNG;Lo;0;L;;;;;N;;;;; -A61D;VAI SYMBOL TONG;Lo;0;L;;;;;N;;;;; -A61E;VAI SYMBOL DO-O;Lo;0;L;;;;;N;;;;; -A61F;VAI SYMBOL JONG;Lo;0;L;;;;;N;;;;; -A620;VAI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A621;VAI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A622;VAI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A623;VAI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A624;VAI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A625;VAI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A626;VAI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A627;VAI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A628;VAI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A629;VAI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A62A;VAI SYLLABLE NDOLE MA;Lo;0;L;;;;;N;;;;; -A62B;VAI SYLLABLE NDOLE DO;Lo;0;L;;;;;N;;;;; -A640;CYRILLIC CAPITAL LETTER ZEMLYA;Lu;0;L;;;;;N;;;;A641; -A641;CYRILLIC SMALL LETTER ZEMLYA;Ll;0;L;;;;;N;;;A640;;A640 -A642;CYRILLIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;A643; -A643;CYRILLIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;A642;;A642 -A644;CYRILLIC CAPITAL LETTER REVERSED DZE;Lu;0;L;;;;;N;;;;A645; -A645;CYRILLIC SMALL LETTER REVERSED DZE;Ll;0;L;;;;;N;;;A644;;A644 -A646;CYRILLIC CAPITAL LETTER IOTA;Lu;0;L;;;;;N;;;;A647; -A647;CYRILLIC SMALL LETTER IOTA;Ll;0;L;;;;;N;;;A646;;A646 -A648;CYRILLIC CAPITAL LETTER DJERV;Lu;0;L;;;;;N;;;;A649; -A649;CYRILLIC SMALL LETTER DJERV;Ll;0;L;;;;;N;;;A648;;A648 -A64A;CYRILLIC CAPITAL LETTER MONOGRAPH UK;Lu;0;L;;;;;N;;;;A64B; -A64B;CYRILLIC SMALL LETTER MONOGRAPH UK;Ll;0;L;;;;;N;;;A64A;;A64A -A64C;CYRILLIC CAPITAL LETTER BROAD OMEGA;Lu;0;L;;;;;N;;;;A64D; -A64D;CYRILLIC SMALL LETTER BROAD OMEGA;Ll;0;L;;;;;N;;;A64C;;A64C -A64E;CYRILLIC CAPITAL LETTER NEUTRAL YER;Lu;0;L;;;;;N;;;;A64F; -A64F;CYRILLIC SMALL LETTER NEUTRAL YER;Ll;0;L;;;;;N;;;A64E;;A64E -A650;CYRILLIC CAPITAL LETTER YERU WITH BACK YER;Lu;0;L;;;;;N;;;;A651; -A651;CYRILLIC SMALL LETTER YERU WITH BACK YER;Ll;0;L;;;;;N;;;A650;;A650 -A652;CYRILLIC CAPITAL LETTER IOTIFIED YAT;Lu;0;L;;;;;N;;;;A653; -A653;CYRILLIC SMALL LETTER IOTIFIED YAT;Ll;0;L;;;;;N;;;A652;;A652 -A654;CYRILLIC CAPITAL LETTER REVERSED YU;Lu;0;L;;;;;N;;;;A655; -A655;CYRILLIC SMALL LETTER REVERSED YU;Ll;0;L;;;;;N;;;A654;;A654 -A656;CYRILLIC CAPITAL LETTER IOTIFIED A;Lu;0;L;;;;;N;;;;A657; -A657;CYRILLIC SMALL LETTER IOTIFIED A;Ll;0;L;;;;;N;;;A656;;A656 -A658;CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A659; -A659;CYRILLIC SMALL LETTER CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A658;;A658 -A65A;CYRILLIC CAPITAL LETTER BLENDED YUS;Lu;0;L;;;;;N;;;;A65B; -A65B;CYRILLIC SMALL LETTER BLENDED YUS;Ll;0;L;;;;;N;;;A65A;;A65A -A65C;CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS;Lu;0;L;;;;;N;;;;A65D; -A65D;CYRILLIC SMALL LETTER IOTIFIED CLOSED LITTLE YUS;Ll;0;L;;;;;N;;;A65C;;A65C -A65E;CYRILLIC CAPITAL LETTER YN;Lu;0;L;;;;;N;;;;A65F; -A65F;CYRILLIC SMALL LETTER YN;Ll;0;L;;;;;N;;;A65E;;A65E -A660;CYRILLIC CAPITAL LETTER REVERSED TSE;Lu;0;L;;;;;N;;;;A661; -A661;CYRILLIC SMALL LETTER REVERSED TSE;Ll;0;L;;;;;N;;;A660;;A660 -A662;CYRILLIC CAPITAL LETTER SOFT DE;Lu;0;L;;;;;N;;;;A663; -A663;CYRILLIC SMALL LETTER SOFT DE;Ll;0;L;;;;;N;;;A662;;A662 -A664;CYRILLIC CAPITAL LETTER SOFT EL;Lu;0;L;;;;;N;;;;A665; -A665;CYRILLIC SMALL LETTER SOFT EL;Ll;0;L;;;;;N;;;A664;;A664 -A666;CYRILLIC CAPITAL LETTER SOFT EM;Lu;0;L;;;;;N;;;;A667; -A667;CYRILLIC SMALL LETTER SOFT EM;Ll;0;L;;;;;N;;;A666;;A666 -A668;CYRILLIC CAPITAL LETTER MONOCULAR O;Lu;0;L;;;;;N;;;;A669; -A669;CYRILLIC SMALL LETTER MONOCULAR O;Ll;0;L;;;;;N;;;A668;;A668 -A66A;CYRILLIC CAPITAL LETTER BINOCULAR O;Lu;0;L;;;;;N;;;;A66B; -A66B;CYRILLIC SMALL LETTER BINOCULAR O;Ll;0;L;;;;;N;;;A66A;;A66A -A66C;CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O;Lu;0;L;;;;;N;;;;A66D; -A66D;CYRILLIC SMALL LETTER DOUBLE MONOCULAR O;Ll;0;L;;;;;N;;;A66C;;A66C -A66E;CYRILLIC LETTER MULTIOCULAR O;Lo;0;L;;;;;N;;;;; -A66F;COMBINING CYRILLIC VZMET;Mn;230;NSM;;;;;N;;;;; -A670;COMBINING CYRILLIC TEN MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -A671;COMBINING CYRILLIC HUNDRED MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -A672;COMBINING CYRILLIC THOUSAND MILLIONS SIGN;Me;0;NSM;;;;;N;;;;; -A673;SLAVONIC ASTERISK;Po;0;ON;;;;;N;;;;; -A674;COMBINING CYRILLIC LETTER UKRAINIAN IE;Mn;230;NSM;;;;;N;;;;; -A675;COMBINING CYRILLIC LETTER I;Mn;230;NSM;;;;;N;;;;; -A676;COMBINING CYRILLIC LETTER YI;Mn;230;NSM;;;;;N;;;;; -A677;COMBINING CYRILLIC LETTER U;Mn;230;NSM;;;;;N;;;;; -A678;COMBINING CYRILLIC LETTER HARD SIGN;Mn;230;NSM;;;;;N;;;;; -A679;COMBINING CYRILLIC LETTER YERU;Mn;230;NSM;;;;;N;;;;; -A67A;COMBINING CYRILLIC LETTER SOFT SIGN;Mn;230;NSM;;;;;N;;;;; -A67B;COMBINING CYRILLIC LETTER OMEGA;Mn;230;NSM;;;;;N;;;;; -A67C;COMBINING CYRILLIC KAVYKA;Mn;230;NSM;;;;;N;;;;; -A67D;COMBINING CYRILLIC PAYEROK;Mn;230;NSM;;;;;N;;;;; -A67E;CYRILLIC KAVYKA;Po;0;ON;;;;;N;;;;; -A67F;CYRILLIC PAYEROK;Lm;0;ON;;;;;N;;;;; -A680;CYRILLIC CAPITAL LETTER DWE;Lu;0;L;;;;;N;;;;A681; -A681;CYRILLIC SMALL LETTER DWE;Ll;0;L;;;;;N;;;A680;;A680 -A682;CYRILLIC CAPITAL LETTER DZWE;Lu;0;L;;;;;N;;;;A683; -A683;CYRILLIC SMALL LETTER DZWE;Ll;0;L;;;;;N;;;A682;;A682 -A684;CYRILLIC CAPITAL LETTER ZHWE;Lu;0;L;;;;;N;;;;A685; -A685;CYRILLIC SMALL LETTER ZHWE;Ll;0;L;;;;;N;;;A684;;A684 -A686;CYRILLIC CAPITAL LETTER CCHE;Lu;0;L;;;;;N;;;;A687; -A687;CYRILLIC SMALL LETTER CCHE;Ll;0;L;;;;;N;;;A686;;A686 -A688;CYRILLIC CAPITAL LETTER DZZE;Lu;0;L;;;;;N;;;;A689; -A689;CYRILLIC SMALL LETTER DZZE;Ll;0;L;;;;;N;;;A688;;A688 -A68A;CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK;Lu;0;L;;;;;N;;;;A68B; -A68B;CYRILLIC SMALL LETTER TE WITH MIDDLE HOOK;Ll;0;L;;;;;N;;;A68A;;A68A -A68C;CYRILLIC CAPITAL LETTER TWE;Lu;0;L;;;;;N;;;;A68D; -A68D;CYRILLIC SMALL LETTER TWE;Ll;0;L;;;;;N;;;A68C;;A68C -A68E;CYRILLIC CAPITAL LETTER TSWE;Lu;0;L;;;;;N;;;;A68F; -A68F;CYRILLIC SMALL LETTER TSWE;Ll;0;L;;;;;N;;;A68E;;A68E -A690;CYRILLIC CAPITAL LETTER TSSE;Lu;0;L;;;;;N;;;;A691; -A691;CYRILLIC SMALL LETTER TSSE;Ll;0;L;;;;;N;;;A690;;A690 -A692;CYRILLIC CAPITAL LETTER TCHE;Lu;0;L;;;;;N;;;;A693; -A693;CYRILLIC SMALL LETTER TCHE;Ll;0;L;;;;;N;;;A692;;A692 -A694;CYRILLIC CAPITAL LETTER HWE;Lu;0;L;;;;;N;;;;A695; -A695;CYRILLIC SMALL LETTER HWE;Ll;0;L;;;;;N;;;A694;;A694 -A696;CYRILLIC CAPITAL LETTER SHWE;Lu;0;L;;;;;N;;;;A697; -A697;CYRILLIC SMALL LETTER SHWE;Ll;0;L;;;;;N;;;A696;;A696 -A698;CYRILLIC CAPITAL LETTER DOUBLE O;Lu;0;L;;;;;N;;;;A699; -A699;CYRILLIC SMALL LETTER DOUBLE O;Ll;0;L;;;;;N;;;A698;;A698 -A69A;CYRILLIC CAPITAL LETTER CROSSED O;Lu;0;L;;;;;N;;;;A69B; -A69B;CYRILLIC SMALL LETTER CROSSED O;Ll;0;L;;;;;N;;;A69A;;A69A -A69C;MODIFIER LETTER CYRILLIC HARD SIGN;Lm;0;L; 044A;;;;N;;;;; -A69D;MODIFIER LETTER CYRILLIC SOFT SIGN;Lm;0;L; 044C;;;;N;;;;; -A69E;COMBINING CYRILLIC LETTER EF;Mn;230;NSM;;;;;N;;;;; -A69F;COMBINING CYRILLIC LETTER IOTIFIED E;Mn;230;NSM;;;;;N;;;;; -A6A0;BAMUM LETTER A;Lo;0;L;;;;;N;;;;; -A6A1;BAMUM LETTER KA;Lo;0;L;;;;;N;;;;; -A6A2;BAMUM LETTER U;Lo;0;L;;;;;N;;;;; -A6A3;BAMUM LETTER KU;Lo;0;L;;;;;N;;;;; -A6A4;BAMUM LETTER EE;Lo;0;L;;;;;N;;;;; -A6A5;BAMUM LETTER REE;Lo;0;L;;;;;N;;;;; -A6A6;BAMUM LETTER TAE;Lo;0;L;;;;;N;;;;; -A6A7;BAMUM LETTER O;Lo;0;L;;;;;N;;;;; -A6A8;BAMUM LETTER NYI;Lo;0;L;;;;;N;;;;; -A6A9;BAMUM LETTER I;Lo;0;L;;;;;N;;;;; -A6AA;BAMUM LETTER LA;Lo;0;L;;;;;N;;;;; -A6AB;BAMUM LETTER PA;Lo;0;L;;;;;N;;;;; -A6AC;BAMUM LETTER RII;Lo;0;L;;;;;N;;;;; -A6AD;BAMUM LETTER RIEE;Lo;0;L;;;;;N;;;;; -A6AE;BAMUM LETTER LEEEE;Lo;0;L;;;;;N;;;;; -A6AF;BAMUM LETTER MEEEE;Lo;0;L;;;;;N;;;;; -A6B0;BAMUM LETTER TAA;Lo;0;L;;;;;N;;;;; -A6B1;BAMUM LETTER NDAA;Lo;0;L;;;;;N;;;;; -A6B2;BAMUM LETTER NJAEM;Lo;0;L;;;;;N;;;;; -A6B3;BAMUM LETTER M;Lo;0;L;;;;;N;;;;; -A6B4;BAMUM LETTER SUU;Lo;0;L;;;;;N;;;;; -A6B5;BAMUM LETTER MU;Lo;0;L;;;;;N;;;;; -A6B6;BAMUM LETTER SHII;Lo;0;L;;;;;N;;;;; -A6B7;BAMUM LETTER SI;Lo;0;L;;;;;N;;;;; -A6B8;BAMUM LETTER SHEUX;Lo;0;L;;;;;N;;;;; -A6B9;BAMUM LETTER SEUX;Lo;0;L;;;;;N;;;;; -A6BA;BAMUM LETTER KYEE;Lo;0;L;;;;;N;;;;; -A6BB;BAMUM LETTER KET;Lo;0;L;;;;;N;;;;; -A6BC;BAMUM LETTER NUAE;Lo;0;L;;;;;N;;;;; -A6BD;BAMUM LETTER NU;Lo;0;L;;;;;N;;;;; -A6BE;BAMUM LETTER NJUAE;Lo;0;L;;;;;N;;;;; -A6BF;BAMUM LETTER YOQ;Lo;0;L;;;;;N;;;;; -A6C0;BAMUM LETTER SHU;Lo;0;L;;;;;N;;;;; -A6C1;BAMUM LETTER YUQ;Lo;0;L;;;;;N;;;;; -A6C2;BAMUM LETTER YA;Lo;0;L;;;;;N;;;;; -A6C3;BAMUM LETTER NSHA;Lo;0;L;;;;;N;;;;; -A6C4;BAMUM LETTER KEUX;Lo;0;L;;;;;N;;;;; -A6C5;BAMUM LETTER PEUX;Lo;0;L;;;;;N;;;;; -A6C6;BAMUM LETTER NJEE;Lo;0;L;;;;;N;;;;; -A6C7;BAMUM LETTER NTEE;Lo;0;L;;;;;N;;;;; -A6C8;BAMUM LETTER PUE;Lo;0;L;;;;;N;;;;; -A6C9;BAMUM LETTER WUE;Lo;0;L;;;;;N;;;;; -A6CA;BAMUM LETTER PEE;Lo;0;L;;;;;N;;;;; -A6CB;BAMUM LETTER FEE;Lo;0;L;;;;;N;;;;; -A6CC;BAMUM LETTER RU;Lo;0;L;;;;;N;;;;; -A6CD;BAMUM LETTER LU;Lo;0;L;;;;;N;;;;; -A6CE;BAMUM LETTER MI;Lo;0;L;;;;;N;;;;; -A6CF;BAMUM LETTER NI;Lo;0;L;;;;;N;;;;; -A6D0;BAMUM LETTER REUX;Lo;0;L;;;;;N;;;;; -A6D1;BAMUM LETTER RAE;Lo;0;L;;;;;N;;;;; -A6D2;BAMUM LETTER KEN;Lo;0;L;;;;;N;;;;; -A6D3;BAMUM LETTER NGKWAEN;Lo;0;L;;;;;N;;;;; -A6D4;BAMUM LETTER NGGA;Lo;0;L;;;;;N;;;;; -A6D5;BAMUM LETTER NGA;Lo;0;L;;;;;N;;;;; -A6D6;BAMUM LETTER SHO;Lo;0;L;;;;;N;;;;; -A6D7;BAMUM LETTER PUAE;Lo;0;L;;;;;N;;;;; -A6D8;BAMUM LETTER FU;Lo;0;L;;;;;N;;;;; -A6D9;BAMUM LETTER FOM;Lo;0;L;;;;;N;;;;; -A6DA;BAMUM LETTER WA;Lo;0;L;;;;;N;;;;; -A6DB;BAMUM LETTER NA;Lo;0;L;;;;;N;;;;; -A6DC;BAMUM LETTER LI;Lo;0;L;;;;;N;;;;; -A6DD;BAMUM LETTER PI;Lo;0;L;;;;;N;;;;; -A6DE;BAMUM LETTER LOQ;Lo;0;L;;;;;N;;;;; -A6DF;BAMUM LETTER KO;Lo;0;L;;;;;N;;;;; -A6E0;BAMUM LETTER MBEN;Lo;0;L;;;;;N;;;;; -A6E1;BAMUM LETTER REN;Lo;0;L;;;;;N;;;;; -A6E2;BAMUM LETTER MEN;Lo;0;L;;;;;N;;;;; -A6E3;BAMUM LETTER MA;Lo;0;L;;;;;N;;;;; -A6E4;BAMUM LETTER TI;Lo;0;L;;;;;N;;;;; -A6E5;BAMUM LETTER KI;Lo;0;L;;;;;N;;;;; -A6E6;BAMUM LETTER MO;Nl;0;L;;;;1;N;;;;; -A6E7;BAMUM LETTER MBAA;Nl;0;L;;;;2;N;;;;; -A6E8;BAMUM LETTER TET;Nl;0;L;;;;3;N;;;;; -A6E9;BAMUM LETTER KPA;Nl;0;L;;;;4;N;;;;; -A6EA;BAMUM LETTER TEN;Nl;0;L;;;;5;N;;;;; -A6EB;BAMUM LETTER NTUU;Nl;0;L;;;;6;N;;;;; -A6EC;BAMUM LETTER SAMBA;Nl;0;L;;;;7;N;;;;; -A6ED;BAMUM LETTER FAAMAE;Nl;0;L;;;;8;N;;;;; -A6EE;BAMUM LETTER KOVUU;Nl;0;L;;;;9;N;;;;; -A6EF;BAMUM LETTER KOGHOM;Nl;0;L;;;;0;N;;;;; -A6F0;BAMUM COMBINING MARK KOQNDON;Mn;230;NSM;;;;;N;;;;; -A6F1;BAMUM COMBINING MARK TUKWENTIS;Mn;230;NSM;;;;;N;;;;; -A6F2;BAMUM NJAEMLI;Po;0;L;;;;;N;;;;; -A6F3;BAMUM FULL STOP;Po;0;L;;;;;N;;;;; -A6F4;BAMUM COLON;Po;0;L;;;;;N;;;;; -A6F5;BAMUM COMMA;Po;0;L;;;;;N;;;;; -A6F6;BAMUM SEMICOLON;Po;0;L;;;;;N;;;;; -A6F7;BAMUM QUESTION MARK;Po;0;L;;;;;N;;;;; -A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;; -A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;; -A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;; -A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;; -A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;; -A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;; -A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;; -A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;; -A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;; -A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;; -A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;; -A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;; -A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;; -A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;; -A71B;MODIFIER LETTER RAISED UP ARROW;Lm;0;ON;;;;;N;;;;; -A71C;MODIFIER LETTER RAISED DOWN ARROW;Lm;0;ON;;;;;N;;;;; -A71D;MODIFIER LETTER RAISED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; -A71E;MODIFIER LETTER RAISED INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; -A71F;MODIFIER LETTER LOW INVERTED EXCLAMATION MARK;Lm;0;ON;;;;;N;;;;; -A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;; -A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;; -A722;LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF;Lu;0;L;;;;;N;;;;A723; -A723;LATIN SMALL LETTER EGYPTOLOGICAL ALEF;Ll;0;L;;;;;N;;;A722;;A722 -A724;LATIN CAPITAL LETTER EGYPTOLOGICAL AIN;Lu;0;L;;;;;N;;;;A725; -A725;LATIN SMALL LETTER EGYPTOLOGICAL AIN;Ll;0;L;;;;;N;;;A724;;A724 -A726;LATIN CAPITAL LETTER HENG;Lu;0;L;;;;;N;;;;A727; -A727;LATIN SMALL LETTER HENG;Ll;0;L;;;;;N;;;A726;;A726 -A728;LATIN CAPITAL LETTER TZ;Lu;0;L;;;;;N;;;;A729; -A729;LATIN SMALL LETTER TZ;Ll;0;L;;;;;N;;;A728;;A728 -A72A;LATIN CAPITAL LETTER TRESILLO;Lu;0;L;;;;;N;;;;A72B; -A72B;LATIN SMALL LETTER TRESILLO;Ll;0;L;;;;;N;;;A72A;;A72A -A72C;LATIN CAPITAL LETTER CUATRILLO;Lu;0;L;;;;;N;;;;A72D; -A72D;LATIN SMALL LETTER CUATRILLO;Ll;0;L;;;;;N;;;A72C;;A72C -A72E;LATIN CAPITAL LETTER CUATRILLO WITH COMMA;Lu;0;L;;;;;N;;;;A72F; -A72F;LATIN SMALL LETTER CUATRILLO WITH COMMA;Ll;0;L;;;;;N;;;A72E;;A72E -A730;LATIN LETTER SMALL CAPITAL F;Ll;0;L;;;;;N;;;;; -A731;LATIN LETTER SMALL CAPITAL S;Ll;0;L;;;;;N;;;;; -A732;LATIN CAPITAL LETTER AA;Lu;0;L;;;;;N;;;;A733; -A733;LATIN SMALL LETTER AA;Ll;0;L;;;;;N;;;A732;;A732 -A734;LATIN CAPITAL LETTER AO;Lu;0;L;;;;;N;;;;A735; -A735;LATIN SMALL LETTER AO;Ll;0;L;;;;;N;;;A734;;A734 -A736;LATIN CAPITAL LETTER AU;Lu;0;L;;;;;N;;;;A737; -A737;LATIN SMALL LETTER AU;Ll;0;L;;;;;N;;;A736;;A736 -A738;LATIN CAPITAL LETTER AV;Lu;0;L;;;;;N;;;;A739; -A739;LATIN SMALL LETTER AV;Ll;0;L;;;;;N;;;A738;;A738 -A73A;LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR;Lu;0;L;;;;;N;;;;A73B; -A73B;LATIN SMALL LETTER AV WITH HORIZONTAL BAR;Ll;0;L;;;;;N;;;A73A;;A73A -A73C;LATIN CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;A73D; -A73D;LATIN SMALL LETTER AY;Ll;0;L;;;;;N;;;A73C;;A73C -A73E;LATIN CAPITAL LETTER REVERSED C WITH DOT;Lu;0;L;;;;;N;;;;A73F; -A73F;LATIN SMALL LETTER REVERSED C WITH DOT;Ll;0;L;;;;;N;;;A73E;;A73E -A740;LATIN CAPITAL LETTER K WITH STROKE;Lu;0;L;;;;;N;;;;A741; -A741;LATIN SMALL LETTER K WITH STROKE;Ll;0;L;;;;;N;;;A740;;A740 -A742;LATIN CAPITAL LETTER K WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A743; -A743;LATIN SMALL LETTER K WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A742;;A742 -A744;LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A745; -A745;LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE;Ll;0;L;;;;;N;;;A744;;A744 -A746;LATIN CAPITAL LETTER BROKEN L;Lu;0;L;;;;;N;;;;A747; -A747;LATIN SMALL LETTER BROKEN L;Ll;0;L;;;;;N;;;A746;;A746 -A748;LATIN CAPITAL LETTER L WITH HIGH STROKE;Lu;0;L;;;;;N;;;;A749; -A749;LATIN SMALL LETTER L WITH HIGH STROKE;Ll;0;L;;;;;N;;;A748;;A748 -A74A;LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY;Lu;0;L;;;;;N;;;;A74B; -A74B;LATIN SMALL LETTER O WITH LONG STROKE OVERLAY;Ll;0;L;;;;;N;;;A74A;;A74A -A74C;LATIN CAPITAL LETTER O WITH LOOP;Lu;0;L;;;;;N;;;;A74D; -A74D;LATIN SMALL LETTER O WITH LOOP;Ll;0;L;;;;;N;;;A74C;;A74C -A74E;LATIN CAPITAL LETTER OO;Lu;0;L;;;;;N;;;;A74F; -A74F;LATIN SMALL LETTER OO;Ll;0;L;;;;;N;;;A74E;;A74E -A750;LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A751; -A751;LATIN SMALL LETTER P WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A750;;A750 -A752;LATIN CAPITAL LETTER P WITH FLOURISH;Lu;0;L;;;;;N;;;;A753; -A753;LATIN SMALL LETTER P WITH FLOURISH;Ll;0;L;;;;;N;;;A752;;A752 -A754;LATIN CAPITAL LETTER P WITH SQUIRREL TAIL;Lu;0;L;;;;;N;;;;A755; -A755;LATIN SMALL LETTER P WITH SQUIRREL TAIL;Ll;0;L;;;;;N;;;A754;;A754 -A756;LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A757; -A757;LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A756;;A756 -A758;LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A759; -A759;LATIN SMALL LETTER Q WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A758;;A758 -A75A;LATIN CAPITAL LETTER R ROTUNDA;Lu;0;L;;;;;N;;;;A75B; -A75B;LATIN SMALL LETTER R ROTUNDA;Ll;0;L;;;;;N;;;A75A;;A75A -A75C;LATIN CAPITAL LETTER RUM ROTUNDA;Lu;0;L;;;;;N;;;;A75D; -A75D;LATIN SMALL LETTER RUM ROTUNDA;Ll;0;L;;;;;N;;;A75C;;A75C -A75E;LATIN CAPITAL LETTER V WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;A75F; -A75F;LATIN SMALL LETTER V WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;A75E;;A75E -A760;LATIN CAPITAL LETTER VY;Lu;0;L;;;;;N;;;;A761; -A761;LATIN SMALL LETTER VY;Ll;0;L;;;;;N;;;A760;;A760 -A762;LATIN CAPITAL LETTER VISIGOTHIC Z;Lu;0;L;;;;;N;;;;A763; -A763;LATIN SMALL LETTER VISIGOTHIC Z;Ll;0;L;;;;;N;;;A762;;A762 -A764;LATIN CAPITAL LETTER THORN WITH STROKE;Lu;0;L;;;;;N;;;;A765; -A765;LATIN SMALL LETTER THORN WITH STROKE;Ll;0;L;;;;;N;;;A764;;A764 -A766;LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER;Lu;0;L;;;;;N;;;;A767; -A767;LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER;Ll;0;L;;;;;N;;;A766;;A766 -A768;LATIN CAPITAL LETTER VEND;Lu;0;L;;;;;N;;;;A769; -A769;LATIN SMALL LETTER VEND;Ll;0;L;;;;;N;;;A768;;A768 -A76A;LATIN CAPITAL LETTER ET;Lu;0;L;;;;;N;;;;A76B; -A76B;LATIN SMALL LETTER ET;Ll;0;L;;;;;N;;;A76A;;A76A -A76C;LATIN CAPITAL LETTER IS;Lu;0;L;;;;;N;;;;A76D; -A76D;LATIN SMALL LETTER IS;Ll;0;L;;;;;N;;;A76C;;A76C -A76E;LATIN CAPITAL LETTER CON;Lu;0;L;;;;;N;;;;A76F; -A76F;LATIN SMALL LETTER CON;Ll;0;L;;;;;N;;;A76E;;A76E -A770;MODIFIER LETTER US;Lm;0;L; A76F;;;;N;;;;; -A771;LATIN SMALL LETTER DUM;Ll;0;L;;;;;N;;;;; -A772;LATIN SMALL LETTER LUM;Ll;0;L;;;;;N;;;;; -A773;LATIN SMALL LETTER MUM;Ll;0;L;;;;;N;;;;; -A774;LATIN SMALL LETTER NUM;Ll;0;L;;;;;N;;;;; -A775;LATIN SMALL LETTER RUM;Ll;0;L;;;;;N;;;;; -A776;LATIN LETTER SMALL CAPITAL RUM;Ll;0;L;;;;;N;;;;; -A777;LATIN SMALL LETTER TUM;Ll;0;L;;;;;N;;;;; -A778;LATIN SMALL LETTER UM;Ll;0;L;;;;;N;;;;; -A779;LATIN CAPITAL LETTER INSULAR D;Lu;0;L;;;;;N;;;;A77A; -A77A;LATIN SMALL LETTER INSULAR D;Ll;0;L;;;;;N;;;A779;;A779 -A77B;LATIN CAPITAL LETTER INSULAR F;Lu;0;L;;;;;N;;;;A77C; -A77C;LATIN SMALL LETTER INSULAR F;Ll;0;L;;;;;N;;;A77B;;A77B -A77D;LATIN CAPITAL LETTER INSULAR G;Lu;0;L;;;;;N;;;;1D79; -A77E;LATIN CAPITAL LETTER TURNED INSULAR G;Lu;0;L;;;;;N;;;;A77F; -A77F;LATIN SMALL LETTER TURNED INSULAR G;Ll;0;L;;;;;N;;;A77E;;A77E -A780;LATIN CAPITAL LETTER TURNED L;Lu;0;L;;;;;N;;;;A781; -A781;LATIN SMALL LETTER TURNED L;Ll;0;L;;;;;N;;;A780;;A780 -A782;LATIN CAPITAL LETTER INSULAR R;Lu;0;L;;;;;N;;;;A783; -A783;LATIN SMALL LETTER INSULAR R;Ll;0;L;;;;;N;;;A782;;A782 -A784;LATIN CAPITAL LETTER INSULAR S;Lu;0;L;;;;;N;;;;A785; -A785;LATIN SMALL LETTER INSULAR S;Ll;0;L;;;;;N;;;A784;;A784 -A786;LATIN CAPITAL LETTER INSULAR T;Lu;0;L;;;;;N;;;;A787; -A787;LATIN SMALL LETTER INSULAR T;Ll;0;L;;;;;N;;;A786;;A786 -A788;MODIFIER LETTER LOW CIRCUMFLEX ACCENT;Lm;0;ON;;;;;N;;;;; -A789;MODIFIER LETTER COLON;Sk;0;L;;;;;N;;;;; -A78A;MODIFIER LETTER SHORT EQUALS SIGN;Sk;0;L;;;;;N;;;;; -A78B;LATIN CAPITAL LETTER SALTILLO;Lu;0;L;;;;;N;;;;A78C; -A78C;LATIN SMALL LETTER SALTILLO;Ll;0;L;;;;;N;;;A78B;;A78B -A78D;LATIN CAPITAL LETTER TURNED H;Lu;0;L;;;;;N;;;;0265; -A78E;LATIN SMALL LETTER L WITH RETROFLEX HOOK AND BELT;Ll;0;L;;;;;N;;;;; -A78F;LATIN LETTER SINOLOGICAL DOT;Lo;0;L;;;;;N;;;;; -A790;LATIN CAPITAL LETTER N WITH DESCENDER;Lu;0;L;;;;;N;;;;A791; -A791;LATIN SMALL LETTER N WITH DESCENDER;Ll;0;L;;;;;N;;;A790;;A790 -A792;LATIN CAPITAL LETTER C WITH BAR;Lu;0;L;;;;;N;;;;A793; -A793;LATIN SMALL LETTER C WITH BAR;Ll;0;L;;;;;N;;;A792;;A792 -A794;LATIN SMALL LETTER C WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -A795;LATIN SMALL LETTER H WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;; -A796;LATIN CAPITAL LETTER B WITH FLOURISH;Lu;0;L;;;;;N;;;;A797; -A797;LATIN SMALL LETTER B WITH FLOURISH;Ll;0;L;;;;;N;;;A796;;A796 -A798;LATIN CAPITAL LETTER F WITH STROKE;Lu;0;L;;;;;N;;;;A799; -A799;LATIN SMALL LETTER F WITH STROKE;Ll;0;L;;;;;N;;;A798;;A798 -A79A;LATIN CAPITAL LETTER VOLAPUK AE;Lu;0;L;;;;;N;;;;A79B; -A79B;LATIN SMALL LETTER VOLAPUK AE;Ll;0;L;;;;;N;;;A79A;;A79A -A79C;LATIN CAPITAL LETTER VOLAPUK OE;Lu;0;L;;;;;N;;;;A79D; -A79D;LATIN SMALL LETTER VOLAPUK OE;Ll;0;L;;;;;N;;;A79C;;A79C -A79E;LATIN CAPITAL LETTER VOLAPUK UE;Lu;0;L;;;;;N;;;;A79F; -A79F;LATIN SMALL LETTER VOLAPUK UE;Ll;0;L;;;;;N;;;A79E;;A79E -A7A0;LATIN CAPITAL LETTER G WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A1; -A7A1;LATIN SMALL LETTER G WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A0;;A7A0 -A7A2;LATIN CAPITAL LETTER K WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A3; -A7A3;LATIN SMALL LETTER K WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A2;;A7A2 -A7A4;LATIN CAPITAL LETTER N WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A5; -A7A5;LATIN SMALL LETTER N WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A4;;A7A4 -A7A6;LATIN CAPITAL LETTER R WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A7; -A7A7;LATIN SMALL LETTER R WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A6;;A7A6 -A7A8;LATIN CAPITAL LETTER S WITH OBLIQUE STROKE;Lu;0;L;;;;;N;;;;A7A9; -A7A9;LATIN SMALL LETTER S WITH OBLIQUE STROKE;Ll;0;L;;;;;N;;;A7A8;;A7A8 -A7AA;LATIN CAPITAL LETTER H WITH HOOK;Lu;0;L;;;;;N;;;;0266; -A7AB;LATIN CAPITAL LETTER REVERSED OPEN E;Lu;0;L;;;;;N;;;;025C; -A7AC;LATIN CAPITAL LETTER SCRIPT G;Lu;0;L;;;;;N;;;;0261; -A7AD;LATIN CAPITAL LETTER L WITH BELT;Lu;0;L;;;;;N;;;;026C; -A7B0;LATIN CAPITAL LETTER TURNED K;Lu;0;L;;;;;N;;;;029E; -A7B1;LATIN CAPITAL LETTER TURNED T;Lu;0;L;;;;;N;;;;0287; -A7B2;LATIN CAPITAL LETTER J WITH CROSSED-TAIL;Lu;0;L;;;;;N;;;;029D; -A7B3;LATIN CAPITAL LETTER CHI;Lu;0;L;;;;;N;;;;AB53; -A7B4;LATIN CAPITAL LETTER BETA;Lu;0;L;;;;;N;;;;A7B5; -A7B5;LATIN SMALL LETTER BETA;Ll;0;L;;;;;N;;;A7B4;;A7B4 -A7B6;LATIN CAPITAL LETTER OMEGA;Lu;0;L;;;;;N;;;;A7B7; -A7B7;LATIN SMALL LETTER OMEGA;Ll;0;L;;;;;N;;;A7B6;;A7B6 -A7F7;LATIN EPIGRAPHIC LETTER SIDEWAYS I;Lo;0;L;;;;;N;;;;; -A7F8;MODIFIER LETTER CAPITAL H WITH STROKE;Lm;0;L; 0126;;;;N;;;;; -A7F9;MODIFIER LETTER SMALL LIGATURE OE;Lm;0;L; 0153;;;;N;;;;; -A7FA;LATIN LETTER SMALL CAPITAL TURNED M;Ll;0;L;;;;;N;;;;; -A7FB;LATIN EPIGRAPHIC LETTER REVERSED F;Lo;0;L;;;;;N;;;;; -A7FC;LATIN EPIGRAPHIC LETTER REVERSED P;Lo;0;L;;;;;N;;;;; -A7FD;LATIN EPIGRAPHIC LETTER INVERTED M;Lo;0;L;;;;;N;;;;; -A7FE;LATIN EPIGRAPHIC LETTER I LONGA;Lo;0;L;;;;;N;;;;; -A7FF;LATIN EPIGRAPHIC LETTER ARCHAIC M;Lo;0;L;;;;;N;;;;; -A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;; -A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;; -A802;SYLOTI NAGRI SIGN DVISVARA;Mn;0;NSM;;;;;N;;;;; -A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;; -A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;; -A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;; -A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;; -A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;; -A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;; -A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;; -A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;; -A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;; -A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;; -A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;; -A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;; -A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;; -A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;; -A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;; -A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;; -A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;; -A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;; -A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;; -A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;; -A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;; -A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;; -A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;; -A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;; -A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;; -A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;; -A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;; -A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;; -A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;; -A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;; -A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;; -A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;; -A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;; -A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;; -A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;; -A830;NORTH INDIC FRACTION ONE QUARTER;No;0;L;;;;1/4;N;;;;; -A831;NORTH INDIC FRACTION ONE HALF;No;0;L;;;;1/2;N;;;;; -A832;NORTH INDIC FRACTION THREE QUARTERS;No;0;L;;;;3/4;N;;;;; -A833;NORTH INDIC FRACTION ONE SIXTEENTH;No;0;L;;;;1/16;N;;;;; -A834;NORTH INDIC FRACTION ONE EIGHTH;No;0;L;;;;1/8;N;;;;; -A835;NORTH INDIC FRACTION THREE SIXTEENTHS;No;0;L;;;;3/16;N;;;;; -A836;NORTH INDIC QUARTER MARK;So;0;L;;;;;N;;;;; -A837;NORTH INDIC PLACEHOLDER MARK;So;0;L;;;;;N;;;;; -A838;NORTH INDIC RUPEE MARK;Sc;0;ET;;;;;N;;;;; -A839;NORTH INDIC QUANTITY MARK;So;0;ET;;;;;N;;;;; -A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;; -A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;; -A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;; -A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;; -A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;; -A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;; -A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;; -A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;; -A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;; -A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;; -A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;; -A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;; -A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;; -A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;; -A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;; -A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;; -A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;; -A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;; -A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;; -A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;; -A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;; -A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;; -A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;; -A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;; -A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;; -A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;; -A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;; -A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;; -A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;; -A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;; -A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;; -A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;; -A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;; -A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;; -A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;; -A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;; -A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;; -A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;; -A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;; -A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;; -A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;; -A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;; -A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;; -A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;; -A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;; -A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;; -A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;; -A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;; -A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;; -A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;; -A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;; -A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;; -A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;; -A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;; -A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;; -A877;PHAGS-PA MARK DOUBLE SHAD;Po;0;ON;;;;;N;;;;; -A880;SAURASHTRA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -A881;SAURASHTRA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -A882;SAURASHTRA LETTER A;Lo;0;L;;;;;N;;;;; -A883;SAURASHTRA LETTER AA;Lo;0;L;;;;;N;;;;; -A884;SAURASHTRA LETTER I;Lo;0;L;;;;;N;;;;; -A885;SAURASHTRA LETTER II;Lo;0;L;;;;;N;;;;; -A886;SAURASHTRA LETTER U;Lo;0;L;;;;;N;;;;; -A887;SAURASHTRA LETTER UU;Lo;0;L;;;;;N;;;;; -A888;SAURASHTRA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -A889;SAURASHTRA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -A88A;SAURASHTRA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -A88B;SAURASHTRA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -A88C;SAURASHTRA LETTER E;Lo;0;L;;;;;N;;;;; -A88D;SAURASHTRA LETTER EE;Lo;0;L;;;;;N;;;;; -A88E;SAURASHTRA LETTER AI;Lo;0;L;;;;;N;;;;; -A88F;SAURASHTRA LETTER O;Lo;0;L;;;;;N;;;;; -A890;SAURASHTRA LETTER OO;Lo;0;L;;;;;N;;;;; -A891;SAURASHTRA LETTER AU;Lo;0;L;;;;;N;;;;; -A892;SAURASHTRA LETTER KA;Lo;0;L;;;;;N;;;;; -A893;SAURASHTRA LETTER KHA;Lo;0;L;;;;;N;;;;; -A894;SAURASHTRA LETTER GA;Lo;0;L;;;;;N;;;;; -A895;SAURASHTRA LETTER GHA;Lo;0;L;;;;;N;;;;; -A896;SAURASHTRA LETTER NGA;Lo;0;L;;;;;N;;;;; -A897;SAURASHTRA LETTER CA;Lo;0;L;;;;;N;;;;; -A898;SAURASHTRA LETTER CHA;Lo;0;L;;;;;N;;;;; -A899;SAURASHTRA LETTER JA;Lo;0;L;;;;;N;;;;; -A89A;SAURASHTRA LETTER JHA;Lo;0;L;;;;;N;;;;; -A89B;SAURASHTRA LETTER NYA;Lo;0;L;;;;;N;;;;; -A89C;SAURASHTRA LETTER TTA;Lo;0;L;;;;;N;;;;; -A89D;SAURASHTRA LETTER TTHA;Lo;0;L;;;;;N;;;;; -A89E;SAURASHTRA LETTER DDA;Lo;0;L;;;;;N;;;;; -A89F;SAURASHTRA LETTER DDHA;Lo;0;L;;;;;N;;;;; -A8A0;SAURASHTRA LETTER NNA;Lo;0;L;;;;;N;;;;; -A8A1;SAURASHTRA LETTER TA;Lo;0;L;;;;;N;;;;; -A8A2;SAURASHTRA LETTER THA;Lo;0;L;;;;;N;;;;; -A8A3;SAURASHTRA LETTER DA;Lo;0;L;;;;;N;;;;; -A8A4;SAURASHTRA LETTER DHA;Lo;0;L;;;;;N;;;;; -A8A5;SAURASHTRA LETTER NA;Lo;0;L;;;;;N;;;;; -A8A6;SAURASHTRA LETTER PA;Lo;0;L;;;;;N;;;;; -A8A7;SAURASHTRA LETTER PHA;Lo;0;L;;;;;N;;;;; -A8A8;SAURASHTRA LETTER BA;Lo;0;L;;;;;N;;;;; -A8A9;SAURASHTRA LETTER BHA;Lo;0;L;;;;;N;;;;; -A8AA;SAURASHTRA LETTER MA;Lo;0;L;;;;;N;;;;; -A8AB;SAURASHTRA LETTER YA;Lo;0;L;;;;;N;;;;; -A8AC;SAURASHTRA LETTER RA;Lo;0;L;;;;;N;;;;; -A8AD;SAURASHTRA LETTER LA;Lo;0;L;;;;;N;;;;; -A8AE;SAURASHTRA LETTER VA;Lo;0;L;;;;;N;;;;; -A8AF;SAURASHTRA LETTER SHA;Lo;0;L;;;;;N;;;;; -A8B0;SAURASHTRA LETTER SSA;Lo;0;L;;;;;N;;;;; -A8B1;SAURASHTRA LETTER SA;Lo;0;L;;;;;N;;;;; -A8B2;SAURASHTRA LETTER HA;Lo;0;L;;;;;N;;;;; -A8B3;SAURASHTRA LETTER LLA;Lo;0;L;;;;;N;;;;; -A8B4;SAURASHTRA CONSONANT SIGN HAARU;Mc;0;L;;;;;N;;;;; -A8B5;SAURASHTRA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -A8B6;SAURASHTRA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -A8B7;SAURASHTRA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -A8B8;SAURASHTRA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -A8B9;SAURASHTRA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -A8BA;SAURASHTRA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -A8BB;SAURASHTRA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -A8BC;SAURASHTRA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; -A8BD;SAURASHTRA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; -A8BE;SAURASHTRA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -A8BF;SAURASHTRA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -A8C0;SAURASHTRA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -A8C1;SAURASHTRA VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -A8C2;SAURASHTRA VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -A8C3;SAURASHTRA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -A8C4;SAURASHTRA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -A8CE;SAURASHTRA DANDA;Po;0;L;;;;;N;;;;; -A8CF;SAURASHTRA DOUBLE DANDA;Po;0;L;;;;;N;;;;; -A8D0;SAURASHTRA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A8D1;SAURASHTRA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A8D2;SAURASHTRA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A8D3;SAURASHTRA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A8D4;SAURASHTRA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A8D5;SAURASHTRA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A8D6;SAURASHTRA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A8D7;SAURASHTRA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A8D8;SAURASHTRA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A8D9;SAURASHTRA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A8E0;COMBINING DEVANAGARI DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; -A8E1;COMBINING DEVANAGARI DIGIT ONE;Mn;230;NSM;;;;;N;;;;; -A8E2;COMBINING DEVANAGARI DIGIT TWO;Mn;230;NSM;;;;;N;;;;; -A8E3;COMBINING DEVANAGARI DIGIT THREE;Mn;230;NSM;;;;;N;;;;; -A8E4;COMBINING DEVANAGARI DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; -A8E5;COMBINING DEVANAGARI DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; -A8E6;COMBINING DEVANAGARI DIGIT SIX;Mn;230;NSM;;;;;N;;;;; -A8E7;COMBINING DEVANAGARI DIGIT SEVEN;Mn;230;NSM;;;;;N;;;;; -A8E8;COMBINING DEVANAGARI DIGIT EIGHT;Mn;230;NSM;;;;;N;;;;; -A8E9;COMBINING DEVANAGARI DIGIT NINE;Mn;230;NSM;;;;;N;;;;; -A8EA;COMBINING DEVANAGARI LETTER A;Mn;230;NSM;;;;;N;;;;; -A8EB;COMBINING DEVANAGARI LETTER U;Mn;230;NSM;;;;;N;;;;; -A8EC;COMBINING DEVANAGARI LETTER KA;Mn;230;NSM;;;;;N;;;;; -A8ED;COMBINING DEVANAGARI LETTER NA;Mn;230;NSM;;;;;N;;;;; -A8EE;COMBINING DEVANAGARI LETTER PA;Mn;230;NSM;;;;;N;;;;; -A8EF;COMBINING DEVANAGARI LETTER RA;Mn;230;NSM;;;;;N;;;;; -A8F0;COMBINING DEVANAGARI LETTER VI;Mn;230;NSM;;;;;N;;;;; -A8F1;COMBINING DEVANAGARI SIGN AVAGRAHA;Mn;230;NSM;;;;;N;;;;; -A8F2;DEVANAGARI SIGN SPACING CANDRABINDU;Lo;0;L;;;;;N;;;;; -A8F3;DEVANAGARI SIGN CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; -A8F4;DEVANAGARI SIGN DOUBLE CANDRABINDU VIRAMA;Lo;0;L;;;;;N;;;;; -A8F5;DEVANAGARI SIGN CANDRABINDU TWO;Lo;0;L;;;;;N;;;;; -A8F6;DEVANAGARI SIGN CANDRABINDU THREE;Lo;0;L;;;;;N;;;;; -A8F7;DEVANAGARI SIGN CANDRABINDU AVAGRAHA;Lo;0;L;;;;;N;;;;; -A8F8;DEVANAGARI SIGN PUSHPIKA;Po;0;L;;;;;N;;;;; -A8F9;DEVANAGARI GAP FILLER;Po;0;L;;;;;N;;;;; -A8FA;DEVANAGARI CARET;Po;0;L;;;;;N;;;;; -A8FB;DEVANAGARI HEADSTROKE;Lo;0;L;;;;;N;;;;; -A8FC;DEVANAGARI SIGN SIDDHAM;Po;0;L;;;;;N;;;;; -A8FD;DEVANAGARI JAIN OM;Lo;0;L;;;;;N;;;;; -A900;KAYAH LI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A901;KAYAH LI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A902;KAYAH LI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A903;KAYAH LI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A904;KAYAH LI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A905;KAYAH LI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A906;KAYAH LI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A907;KAYAH LI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A908;KAYAH LI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A909;KAYAH LI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A90A;KAYAH LI LETTER KA;Lo;0;L;;;;;N;;;;; -A90B;KAYAH LI LETTER KHA;Lo;0;L;;;;;N;;;;; -A90C;KAYAH LI LETTER GA;Lo;0;L;;;;;N;;;;; -A90D;KAYAH LI LETTER NGA;Lo;0;L;;;;;N;;;;; -A90E;KAYAH LI LETTER SA;Lo;0;L;;;;;N;;;;; -A90F;KAYAH LI LETTER SHA;Lo;0;L;;;;;N;;;;; -A910;KAYAH LI LETTER ZA;Lo;0;L;;;;;N;;;;; -A911;KAYAH LI LETTER NYA;Lo;0;L;;;;;N;;;;; -A912;KAYAH LI LETTER TA;Lo;0;L;;;;;N;;;;; -A913;KAYAH LI LETTER HTA;Lo;0;L;;;;;N;;;;; -A914;KAYAH LI LETTER NA;Lo;0;L;;;;;N;;;;; -A915;KAYAH LI LETTER PA;Lo;0;L;;;;;N;;;;; -A916;KAYAH LI LETTER PHA;Lo;0;L;;;;;N;;;;; -A917;KAYAH LI LETTER MA;Lo;0;L;;;;;N;;;;; -A918;KAYAH LI LETTER DA;Lo;0;L;;;;;N;;;;; -A919;KAYAH LI LETTER BA;Lo;0;L;;;;;N;;;;; -A91A;KAYAH LI LETTER RA;Lo;0;L;;;;;N;;;;; -A91B;KAYAH LI LETTER YA;Lo;0;L;;;;;N;;;;; -A91C;KAYAH LI LETTER LA;Lo;0;L;;;;;N;;;;; -A91D;KAYAH LI LETTER WA;Lo;0;L;;;;;N;;;;; -A91E;KAYAH LI LETTER THA;Lo;0;L;;;;;N;;;;; -A91F;KAYAH LI LETTER HA;Lo;0;L;;;;;N;;;;; -A920;KAYAH LI LETTER VA;Lo;0;L;;;;;N;;;;; -A921;KAYAH LI LETTER CA;Lo;0;L;;;;;N;;;;; -A922;KAYAH LI LETTER A;Lo;0;L;;;;;N;;;;; -A923;KAYAH LI LETTER OE;Lo;0;L;;;;;N;;;;; -A924;KAYAH LI LETTER I;Lo;0;L;;;;;N;;;;; -A925;KAYAH LI LETTER OO;Lo;0;L;;;;;N;;;;; -A926;KAYAH LI VOWEL UE;Mn;0;NSM;;;;;N;;;;; -A927;KAYAH LI VOWEL E;Mn;0;NSM;;;;;N;;;;; -A928;KAYAH LI VOWEL U;Mn;0;NSM;;;;;N;;;;; -A929;KAYAH LI VOWEL EE;Mn;0;NSM;;;;;N;;;;; -A92A;KAYAH LI VOWEL O;Mn;0;NSM;;;;;N;;;;; -A92B;KAYAH LI TONE PLOPHU;Mn;220;NSM;;;;;N;;;;; -A92C;KAYAH LI TONE CALYA;Mn;220;NSM;;;;;N;;;;; -A92D;KAYAH LI TONE CALYA PLOPHU;Mn;220;NSM;;;;;N;;;;; -A92E;KAYAH LI SIGN CWI;Po;0;L;;;;;N;;;;; -A92F;KAYAH LI SIGN SHYA;Po;0;L;;;;;N;;;;; -A930;REJANG LETTER KA;Lo;0;L;;;;;N;;;;; -A931;REJANG LETTER GA;Lo;0;L;;;;;N;;;;; -A932;REJANG LETTER NGA;Lo;0;L;;;;;N;;;;; -A933;REJANG LETTER TA;Lo;0;L;;;;;N;;;;; -A934;REJANG LETTER DA;Lo;0;L;;;;;N;;;;; -A935;REJANG LETTER NA;Lo;0;L;;;;;N;;;;; -A936;REJANG LETTER PA;Lo;0;L;;;;;N;;;;; -A937;REJANG LETTER BA;Lo;0;L;;;;;N;;;;; -A938;REJANG LETTER MA;Lo;0;L;;;;;N;;;;; -A939;REJANG LETTER CA;Lo;0;L;;;;;N;;;;; -A93A;REJANG LETTER JA;Lo;0;L;;;;;N;;;;; -A93B;REJANG LETTER NYA;Lo;0;L;;;;;N;;;;; -A93C;REJANG LETTER SA;Lo;0;L;;;;;N;;;;; -A93D;REJANG LETTER RA;Lo;0;L;;;;;N;;;;; -A93E;REJANG LETTER LA;Lo;0;L;;;;;N;;;;; -A93F;REJANG LETTER YA;Lo;0;L;;;;;N;;;;; -A940;REJANG LETTER WA;Lo;0;L;;;;;N;;;;; -A941;REJANG LETTER HA;Lo;0;L;;;;;N;;;;; -A942;REJANG LETTER MBA;Lo;0;L;;;;;N;;;;; -A943;REJANG LETTER NGGA;Lo;0;L;;;;;N;;;;; -A944;REJANG LETTER NDA;Lo;0;L;;;;;N;;;;; -A945;REJANG LETTER NYJA;Lo;0;L;;;;;N;;;;; -A946;REJANG LETTER A;Lo;0;L;;;;;N;;;;; -A947;REJANG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -A948;REJANG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -A949;REJANG VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -A94A;REJANG VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -A94B;REJANG VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -A94C;REJANG VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -A94D;REJANG VOWEL SIGN EU;Mn;0;NSM;;;;;N;;;;; -A94E;REJANG VOWEL SIGN EA;Mn;0;NSM;;;;;N;;;;; -A94F;REJANG CONSONANT SIGN NG;Mn;0;NSM;;;;;N;;;;; -A950;REJANG CONSONANT SIGN N;Mn;0;NSM;;;;;N;;;;; -A951;REJANG CONSONANT SIGN R;Mn;0;NSM;;;;;N;;;;; -A952;REJANG CONSONANT SIGN H;Mc;0;L;;;;;N;;;;; -A953;REJANG VIRAMA;Mc;9;L;;;;;N;;;;; -A95F;REJANG SECTION MARK;Po;0;L;;;;;N;;;;; -A960;HANGUL CHOSEONG TIKEUT-MIEUM;Lo;0;L;;;;;N;;;;; -A961;HANGUL CHOSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; -A962;HANGUL CHOSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; -A963;HANGUL CHOSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; -A964;HANGUL CHOSEONG RIEUL-KIYEOK;Lo;0;L;;;;;N;;;;; -A965;HANGUL CHOSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -A966;HANGUL CHOSEONG RIEUL-TIKEUT;Lo;0;L;;;;;N;;;;; -A967;HANGUL CHOSEONG RIEUL-SSANGTIKEUT;Lo;0;L;;;;;N;;;;; -A968;HANGUL CHOSEONG RIEUL-MIEUM;Lo;0;L;;;;;N;;;;; -A969;HANGUL CHOSEONG RIEUL-PIEUP;Lo;0;L;;;;;N;;;;; -A96A;HANGUL CHOSEONG RIEUL-SSANGPIEUP;Lo;0;L;;;;;N;;;;; -A96B;HANGUL CHOSEONG RIEUL-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -A96C;HANGUL CHOSEONG RIEUL-SIOS;Lo;0;L;;;;;N;;;;; -A96D;HANGUL CHOSEONG RIEUL-CIEUC;Lo;0;L;;;;;N;;;;; -A96E;HANGUL CHOSEONG RIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -A96F;HANGUL CHOSEONG MIEUM-KIYEOK;Lo;0;L;;;;;N;;;;; -A970;HANGUL CHOSEONG MIEUM-TIKEUT;Lo;0;L;;;;;N;;;;; -A971;HANGUL CHOSEONG MIEUM-SIOS;Lo;0;L;;;;;N;;;;; -A972;HANGUL CHOSEONG PIEUP-SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -A973;HANGUL CHOSEONG PIEUP-KHIEUKH;Lo;0;L;;;;;N;;;;; -A974;HANGUL CHOSEONG PIEUP-HIEUH;Lo;0;L;;;;;N;;;;; -A975;HANGUL CHOSEONG SSANGSIOS-PIEUP;Lo;0;L;;;;;N;;;;; -A976;HANGUL CHOSEONG IEUNG-RIEUL;Lo;0;L;;;;;N;;;;; -A977;HANGUL CHOSEONG IEUNG-HIEUH;Lo;0;L;;;;;N;;;;; -A978;HANGUL CHOSEONG SSANGCIEUC-HIEUH;Lo;0;L;;;;;N;;;;; -A979;HANGUL CHOSEONG SSANGTHIEUTH;Lo;0;L;;;;;N;;;;; -A97A;HANGUL CHOSEONG PHIEUPH-HIEUH;Lo;0;L;;;;;N;;;;; -A97B;HANGUL CHOSEONG HIEUH-SIOS;Lo;0;L;;;;;N;;;;; -A97C;HANGUL CHOSEONG SSANGYEORINHIEUH;Lo;0;L;;;;;N;;;;; -A980;JAVANESE SIGN PANYANGGA;Mn;0;NSM;;;;;N;;;;; -A981;JAVANESE SIGN CECAK;Mn;0;NSM;;;;;N;;;;; -A982;JAVANESE SIGN LAYAR;Mn;0;NSM;;;;;N;;;;; -A983;JAVANESE SIGN WIGNYAN;Mc;0;L;;;;;N;;;;; -A984;JAVANESE LETTER A;Lo;0;L;;;;;N;;;;; -A985;JAVANESE LETTER I KAWI;Lo;0;L;;;;;N;;;;; -A986;JAVANESE LETTER I;Lo;0;L;;;;;N;;;;; -A987;JAVANESE LETTER II;Lo;0;L;;;;;N;;;;; -A988;JAVANESE LETTER U;Lo;0;L;;;;;N;;;;; -A989;JAVANESE LETTER PA CEREK;Lo;0;L;;;;;N;;;;; -A98A;JAVANESE LETTER NGA LELET;Lo;0;L;;;;;N;;;;; -A98B;JAVANESE LETTER NGA LELET RASWADI;Lo;0;L;;;;;N;;;;; -A98C;JAVANESE LETTER E;Lo;0;L;;;;;N;;;;; -A98D;JAVANESE LETTER AI;Lo;0;L;;;;;N;;;;; -A98E;JAVANESE LETTER O;Lo;0;L;;;;;N;;;;; -A98F;JAVANESE LETTER KA;Lo;0;L;;;;;N;;;;; -A990;JAVANESE LETTER KA SASAK;Lo;0;L;;;;;N;;;;; -A991;JAVANESE LETTER KA MURDA;Lo;0;L;;;;;N;;;;; -A992;JAVANESE LETTER GA;Lo;0;L;;;;;N;;;;; -A993;JAVANESE LETTER GA MURDA;Lo;0;L;;;;;N;;;;; -A994;JAVANESE LETTER NGA;Lo;0;L;;;;;N;;;;; -A995;JAVANESE LETTER CA;Lo;0;L;;;;;N;;;;; -A996;JAVANESE LETTER CA MURDA;Lo;0;L;;;;;N;;;;; -A997;JAVANESE LETTER JA;Lo;0;L;;;;;N;;;;; -A998;JAVANESE LETTER NYA MURDA;Lo;0;L;;;;;N;;;;; -A999;JAVANESE LETTER JA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A99A;JAVANESE LETTER NYA;Lo;0;L;;;;;N;;;;; -A99B;JAVANESE LETTER TTA;Lo;0;L;;;;;N;;;;; -A99C;JAVANESE LETTER TTA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A99D;JAVANESE LETTER DDA;Lo;0;L;;;;;N;;;;; -A99E;JAVANESE LETTER DDA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A99F;JAVANESE LETTER NA MURDA;Lo;0;L;;;;;N;;;;; -A9A0;JAVANESE LETTER TA;Lo;0;L;;;;;N;;;;; -A9A1;JAVANESE LETTER TA MURDA;Lo;0;L;;;;;N;;;;; -A9A2;JAVANESE LETTER DA;Lo;0;L;;;;;N;;;;; -A9A3;JAVANESE LETTER DA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A9A4;JAVANESE LETTER NA;Lo;0;L;;;;;N;;;;; -A9A5;JAVANESE LETTER PA;Lo;0;L;;;;;N;;;;; -A9A6;JAVANESE LETTER PA MURDA;Lo;0;L;;;;;N;;;;; -A9A7;JAVANESE LETTER BA;Lo;0;L;;;;;N;;;;; -A9A8;JAVANESE LETTER BA MURDA;Lo;0;L;;;;;N;;;;; -A9A9;JAVANESE LETTER MA;Lo;0;L;;;;;N;;;;; -A9AA;JAVANESE LETTER YA;Lo;0;L;;;;;N;;;;; -A9AB;JAVANESE LETTER RA;Lo;0;L;;;;;N;;;;; -A9AC;JAVANESE LETTER RA AGUNG;Lo;0;L;;;;;N;;;;; -A9AD;JAVANESE LETTER LA;Lo;0;L;;;;;N;;;;; -A9AE;JAVANESE LETTER WA;Lo;0;L;;;;;N;;;;; -A9AF;JAVANESE LETTER SA MURDA;Lo;0;L;;;;;N;;;;; -A9B0;JAVANESE LETTER SA MAHAPRANA;Lo;0;L;;;;;N;;;;; -A9B1;JAVANESE LETTER SA;Lo;0;L;;;;;N;;;;; -A9B2;JAVANESE LETTER HA;Lo;0;L;;;;;N;;;;; -A9B3;JAVANESE SIGN CECAK TELU;Mn;7;NSM;;;;;N;;;;; -A9B4;JAVANESE VOWEL SIGN TARUNG;Mc;0;L;;;;;N;;;;; -A9B5;JAVANESE VOWEL SIGN TOLONG;Mc;0;L;;;;;N;;;;; -A9B6;JAVANESE VOWEL SIGN WULU;Mn;0;NSM;;;;;N;;;;; -A9B7;JAVANESE VOWEL SIGN WULU MELIK;Mn;0;NSM;;;;;N;;;;; -A9B8;JAVANESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;;;; -A9B9;JAVANESE VOWEL SIGN SUKU MENDUT;Mn;0;NSM;;;;;N;;;;; -A9BA;JAVANESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;;;; -A9BB;JAVANESE VOWEL SIGN DIRGA MURE;Mc;0;L;;;;;N;;;;; -A9BC;JAVANESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;;;; -A9BD;JAVANESE CONSONANT SIGN KERET;Mc;0;L;;;;;N;;;;; -A9BE;JAVANESE CONSONANT SIGN PENGKAL;Mc;0;L;;;;;N;;;;; -A9BF;JAVANESE CONSONANT SIGN CAKRA;Mc;0;L;;;;;N;;;;; -A9C0;JAVANESE PANGKON;Mc;9;L;;;;;N;;;;; -A9C1;JAVANESE LEFT RERENGGAN;Po;0;L;;;;;N;;;;; -A9C2;JAVANESE RIGHT RERENGGAN;Po;0;L;;;;;N;;;;; -A9C3;JAVANESE PADA ANDAP;Po;0;L;;;;;N;;;;; -A9C4;JAVANESE PADA MADYA;Po;0;L;;;;;N;;;;; -A9C5;JAVANESE PADA LUHUR;Po;0;L;;;;;N;;;;; -A9C6;JAVANESE PADA WINDU;Po;0;L;;;;;N;;;;; -A9C7;JAVANESE PADA PANGKAT;Po;0;L;;;;;N;;;;; -A9C8;JAVANESE PADA LINGSA;Po;0;L;;;;;N;;;;; -A9C9;JAVANESE PADA LUNGSI;Po;0;L;;;;;N;;;;; -A9CA;JAVANESE PADA ADEG;Po;0;L;;;;;N;;;;; -A9CB;JAVANESE PADA ADEG ADEG;Po;0;L;;;;;N;;;;; -A9CC;JAVANESE PADA PISELEH;Po;0;L;;;;;N;;;;; -A9CD;JAVANESE TURNED PADA PISELEH;Po;0;L;;;;;N;;;;; -A9CF;JAVANESE PANGRANGKEP;Lm;0;L;;;;;N;;;;; -A9D0;JAVANESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A9D1;JAVANESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A9D2;JAVANESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A9D3;JAVANESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A9D4;JAVANESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A9D5;JAVANESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A9D6;JAVANESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A9D7;JAVANESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A9D8;JAVANESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A9D9;JAVANESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A9DE;JAVANESE PADA TIRTA TUMETES;Po;0;L;;;;;N;;;;; -A9DF;JAVANESE PADA ISEN-ISEN;Po;0;L;;;;;N;;;;; -A9E0;MYANMAR LETTER SHAN GHA;Lo;0;L;;;;;N;;;;; -A9E1;MYANMAR LETTER SHAN CHA;Lo;0;L;;;;;N;;;;; -A9E2;MYANMAR LETTER SHAN JHA;Lo;0;L;;;;;N;;;;; -A9E3;MYANMAR LETTER SHAN NNA;Lo;0;L;;;;;N;;;;; -A9E4;MYANMAR LETTER SHAN BHA;Lo;0;L;;;;;N;;;;; -A9E5;MYANMAR SIGN SHAN SAW;Mn;0;NSM;;;;;N;;;;; -A9E6;MYANMAR MODIFIER LETTER SHAN REDUPLICATION;Lm;0;L;;;;;N;;;;; -A9E7;MYANMAR LETTER TAI LAING NYA;Lo;0;L;;;;;N;;;;; -A9E8;MYANMAR LETTER TAI LAING FA;Lo;0;L;;;;;N;;;;; -A9E9;MYANMAR LETTER TAI LAING GA;Lo;0;L;;;;;N;;;;; -A9EA;MYANMAR LETTER TAI LAING GHA;Lo;0;L;;;;;N;;;;; -A9EB;MYANMAR LETTER TAI LAING JA;Lo;0;L;;;;;N;;;;; -A9EC;MYANMAR LETTER TAI LAING JHA;Lo;0;L;;;;;N;;;;; -A9ED;MYANMAR LETTER TAI LAING DDA;Lo;0;L;;;;;N;;;;; -A9EE;MYANMAR LETTER TAI LAING DDHA;Lo;0;L;;;;;N;;;;; -A9EF;MYANMAR LETTER TAI LAING NNA;Lo;0;L;;;;;N;;;;; -A9F0;MYANMAR TAI LAING DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -A9F1;MYANMAR TAI LAING DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -A9F2;MYANMAR TAI LAING DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -A9F3;MYANMAR TAI LAING DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -A9F4;MYANMAR TAI LAING DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -A9F5;MYANMAR TAI LAING DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -A9F6;MYANMAR TAI LAING DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -A9F7;MYANMAR TAI LAING DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -A9F8;MYANMAR TAI LAING DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -A9F9;MYANMAR TAI LAING DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -A9FA;MYANMAR LETTER TAI LAING LLA;Lo;0;L;;;;;N;;;;; -A9FB;MYANMAR LETTER TAI LAING DA;Lo;0;L;;;;;N;;;;; -A9FC;MYANMAR LETTER TAI LAING DHA;Lo;0;L;;;;;N;;;;; -A9FD;MYANMAR LETTER TAI LAING BA;Lo;0;L;;;;;N;;;;; -A9FE;MYANMAR LETTER TAI LAING BHA;Lo;0;L;;;;;N;;;;; -AA00;CHAM LETTER A;Lo;0;L;;;;;N;;;;; -AA01;CHAM LETTER I;Lo;0;L;;;;;N;;;;; -AA02;CHAM LETTER U;Lo;0;L;;;;;N;;;;; -AA03;CHAM LETTER E;Lo;0;L;;;;;N;;;;; -AA04;CHAM LETTER AI;Lo;0;L;;;;;N;;;;; -AA05;CHAM LETTER O;Lo;0;L;;;;;N;;;;; -AA06;CHAM LETTER KA;Lo;0;L;;;;;N;;;;; -AA07;CHAM LETTER KHA;Lo;0;L;;;;;N;;;;; -AA08;CHAM LETTER GA;Lo;0;L;;;;;N;;;;; -AA09;CHAM LETTER GHA;Lo;0;L;;;;;N;;;;; -AA0A;CHAM LETTER NGUE;Lo;0;L;;;;;N;;;;; -AA0B;CHAM LETTER NGA;Lo;0;L;;;;;N;;;;; -AA0C;CHAM LETTER CHA;Lo;0;L;;;;;N;;;;; -AA0D;CHAM LETTER CHHA;Lo;0;L;;;;;N;;;;; -AA0E;CHAM LETTER JA;Lo;0;L;;;;;N;;;;; -AA0F;CHAM LETTER JHA;Lo;0;L;;;;;N;;;;; -AA10;CHAM LETTER NHUE;Lo;0;L;;;;;N;;;;; -AA11;CHAM LETTER NHA;Lo;0;L;;;;;N;;;;; -AA12;CHAM LETTER NHJA;Lo;0;L;;;;;N;;;;; -AA13;CHAM LETTER TA;Lo;0;L;;;;;N;;;;; -AA14;CHAM LETTER THA;Lo;0;L;;;;;N;;;;; -AA15;CHAM LETTER DA;Lo;0;L;;;;;N;;;;; -AA16;CHAM LETTER DHA;Lo;0;L;;;;;N;;;;; -AA17;CHAM LETTER NUE;Lo;0;L;;;;;N;;;;; -AA18;CHAM LETTER NA;Lo;0;L;;;;;N;;;;; -AA19;CHAM LETTER DDA;Lo;0;L;;;;;N;;;;; -AA1A;CHAM LETTER PA;Lo;0;L;;;;;N;;;;; -AA1B;CHAM LETTER PPA;Lo;0;L;;;;;N;;;;; -AA1C;CHAM LETTER PHA;Lo;0;L;;;;;N;;;;; -AA1D;CHAM LETTER BA;Lo;0;L;;;;;N;;;;; -AA1E;CHAM LETTER BHA;Lo;0;L;;;;;N;;;;; -AA1F;CHAM LETTER MUE;Lo;0;L;;;;;N;;;;; -AA20;CHAM LETTER MA;Lo;0;L;;;;;N;;;;; -AA21;CHAM LETTER BBA;Lo;0;L;;;;;N;;;;; -AA22;CHAM LETTER YA;Lo;0;L;;;;;N;;;;; -AA23;CHAM LETTER RA;Lo;0;L;;;;;N;;;;; -AA24;CHAM LETTER LA;Lo;0;L;;;;;N;;;;; -AA25;CHAM LETTER VA;Lo;0;L;;;;;N;;;;; -AA26;CHAM LETTER SSA;Lo;0;L;;;;;N;;;;; -AA27;CHAM LETTER SA;Lo;0;L;;;;;N;;;;; -AA28;CHAM LETTER HA;Lo;0;L;;;;;N;;;;; -AA29;CHAM VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -AA2A;CHAM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -AA2B;CHAM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -AA2C;CHAM VOWEL SIGN EI;Mn;0;NSM;;;;;N;;;;; -AA2D;CHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -AA2E;CHAM VOWEL SIGN OE;Mn;0;NSM;;;;;N;;;;; -AA2F;CHAM VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -AA30;CHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -AA31;CHAM VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -AA32;CHAM VOWEL SIGN UE;Mn;0;NSM;;;;;N;;;;; -AA33;CHAM CONSONANT SIGN YA;Mc;0;L;;;;;N;;;;; -AA34;CHAM CONSONANT SIGN RA;Mc;0;L;;;;;N;;;;; -AA35;CHAM CONSONANT SIGN LA;Mn;0;NSM;;;;;N;;;;; -AA36;CHAM CONSONANT SIGN WA;Mn;0;NSM;;;;;N;;;;; -AA40;CHAM LETTER FINAL K;Lo;0;L;;;;;N;;;;; -AA41;CHAM LETTER FINAL G;Lo;0;L;;;;;N;;;;; -AA42;CHAM LETTER FINAL NG;Lo;0;L;;;;;N;;;;; -AA43;CHAM CONSONANT SIGN FINAL NG;Mn;0;NSM;;;;;N;;;;; -AA44;CHAM LETTER FINAL CH;Lo;0;L;;;;;N;;;;; -AA45;CHAM LETTER FINAL T;Lo;0;L;;;;;N;;;;; -AA46;CHAM LETTER FINAL N;Lo;0;L;;;;;N;;;;; -AA47;CHAM LETTER FINAL P;Lo;0;L;;;;;N;;;;; -AA48;CHAM LETTER FINAL Y;Lo;0;L;;;;;N;;;;; -AA49;CHAM LETTER FINAL R;Lo;0;L;;;;;N;;;;; -AA4A;CHAM LETTER FINAL L;Lo;0;L;;;;;N;;;;; -AA4B;CHAM LETTER FINAL SS;Lo;0;L;;;;;N;;;;; -AA4C;CHAM CONSONANT SIGN FINAL M;Mn;0;NSM;;;;;N;;;;; -AA4D;CHAM CONSONANT SIGN FINAL H;Mc;0;L;;;;;N;;;;; -AA50;CHAM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -AA51;CHAM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -AA52;CHAM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -AA53;CHAM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -AA54;CHAM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -AA55;CHAM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -AA56;CHAM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -AA57;CHAM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -AA58;CHAM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -AA59;CHAM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -AA5C;CHAM PUNCTUATION SPIRAL;Po;0;L;;;;;N;;;;; -AA5D;CHAM PUNCTUATION DANDA;Po;0;L;;;;;N;;;;; -AA5E;CHAM PUNCTUATION DOUBLE DANDA;Po;0;L;;;;;N;;;;; -AA5F;CHAM PUNCTUATION TRIPLE DANDA;Po;0;L;;;;;N;;;;; -AA60;MYANMAR LETTER KHAMTI GA;Lo;0;L;;;;;N;;;;; -AA61;MYANMAR LETTER KHAMTI CA;Lo;0;L;;;;;N;;;;; -AA62;MYANMAR LETTER KHAMTI CHA;Lo;0;L;;;;;N;;;;; -AA63;MYANMAR LETTER KHAMTI JA;Lo;0;L;;;;;N;;;;; -AA64;MYANMAR LETTER KHAMTI JHA;Lo;0;L;;;;;N;;;;; -AA65;MYANMAR LETTER KHAMTI NYA;Lo;0;L;;;;;N;;;;; -AA66;MYANMAR LETTER KHAMTI TTA;Lo;0;L;;;;;N;;;;; -AA67;MYANMAR LETTER KHAMTI TTHA;Lo;0;L;;;;;N;;;;; -AA68;MYANMAR LETTER KHAMTI DDA;Lo;0;L;;;;;N;;;;; -AA69;MYANMAR LETTER KHAMTI DDHA;Lo;0;L;;;;;N;;;;; -AA6A;MYANMAR LETTER KHAMTI DHA;Lo;0;L;;;;;N;;;;; -AA6B;MYANMAR LETTER KHAMTI NA;Lo;0;L;;;;;N;;;;; -AA6C;MYANMAR LETTER KHAMTI SA;Lo;0;L;;;;;N;;;;; -AA6D;MYANMAR LETTER KHAMTI HA;Lo;0;L;;;;;N;;;;; -AA6E;MYANMAR LETTER KHAMTI HHA;Lo;0;L;;;;;N;;;;; -AA6F;MYANMAR LETTER KHAMTI FA;Lo;0;L;;;;;N;;;;; -AA70;MYANMAR MODIFIER LETTER KHAMTI REDUPLICATION;Lm;0;L;;;;;N;;;;; -AA71;MYANMAR LETTER KHAMTI XA;Lo;0;L;;;;;N;;;;; -AA72;MYANMAR LETTER KHAMTI ZA;Lo;0;L;;;;;N;;;;; -AA73;MYANMAR LETTER KHAMTI RA;Lo;0;L;;;;;N;;;;; -AA74;MYANMAR LOGOGRAM KHAMTI OAY;Lo;0;L;;;;;N;;;;; -AA75;MYANMAR LOGOGRAM KHAMTI QN;Lo;0;L;;;;;N;;;;; -AA76;MYANMAR LOGOGRAM KHAMTI HM;Lo;0;L;;;;;N;;;;; -AA77;MYANMAR SYMBOL AITON EXCLAMATION;So;0;L;;;;;N;;;;; -AA78;MYANMAR SYMBOL AITON ONE;So;0;L;;;;;N;;;;; -AA79;MYANMAR SYMBOL AITON TWO;So;0;L;;;;;N;;;;; -AA7A;MYANMAR LETTER AITON RA;Lo;0;L;;;;;N;;;;; -AA7B;MYANMAR SIGN PAO KAREN TONE;Mc;0;L;;;;;N;;;;; -AA7C;MYANMAR SIGN TAI LAING TONE-2;Mn;0;NSM;;;;;N;;;;; -AA7D;MYANMAR SIGN TAI LAING TONE-5;Mc;0;L;;;;;N;;;;; -AA7E;MYANMAR LETTER SHWE PALAUNG CHA;Lo;0;L;;;;;N;;;;; -AA7F;MYANMAR LETTER SHWE PALAUNG SHA;Lo;0;L;;;;;N;;;;; -AA80;TAI VIET LETTER LOW KO;Lo;0;L;;;;;N;;;;; -AA81;TAI VIET LETTER HIGH KO;Lo;0;L;;;;;N;;;;; -AA82;TAI VIET LETTER LOW KHO;Lo;0;L;;;;;N;;;;; -AA83;TAI VIET LETTER HIGH KHO;Lo;0;L;;;;;N;;;;; -AA84;TAI VIET LETTER LOW KHHO;Lo;0;L;;;;;N;;;;; -AA85;TAI VIET LETTER HIGH KHHO;Lo;0;L;;;;;N;;;;; -AA86;TAI VIET LETTER LOW GO;Lo;0;L;;;;;N;;;;; -AA87;TAI VIET LETTER HIGH GO;Lo;0;L;;;;;N;;;;; -AA88;TAI VIET LETTER LOW NGO;Lo;0;L;;;;;N;;;;; -AA89;TAI VIET LETTER HIGH NGO;Lo;0;L;;;;;N;;;;; -AA8A;TAI VIET LETTER LOW CO;Lo;0;L;;;;;N;;;;; -AA8B;TAI VIET LETTER HIGH CO;Lo;0;L;;;;;N;;;;; -AA8C;TAI VIET LETTER LOW CHO;Lo;0;L;;;;;N;;;;; -AA8D;TAI VIET LETTER HIGH CHO;Lo;0;L;;;;;N;;;;; -AA8E;TAI VIET LETTER LOW SO;Lo;0;L;;;;;N;;;;; -AA8F;TAI VIET LETTER HIGH SO;Lo;0;L;;;;;N;;;;; -AA90;TAI VIET LETTER LOW NYO;Lo;0;L;;;;;N;;;;; -AA91;TAI VIET LETTER HIGH NYO;Lo;0;L;;;;;N;;;;; -AA92;TAI VIET LETTER LOW DO;Lo;0;L;;;;;N;;;;; -AA93;TAI VIET LETTER HIGH DO;Lo;0;L;;;;;N;;;;; -AA94;TAI VIET LETTER LOW TO;Lo;0;L;;;;;N;;;;; -AA95;TAI VIET LETTER HIGH TO;Lo;0;L;;;;;N;;;;; -AA96;TAI VIET LETTER LOW THO;Lo;0;L;;;;;N;;;;; -AA97;TAI VIET LETTER HIGH THO;Lo;0;L;;;;;N;;;;; -AA98;TAI VIET LETTER LOW NO;Lo;0;L;;;;;N;;;;; -AA99;TAI VIET LETTER HIGH NO;Lo;0;L;;;;;N;;;;; -AA9A;TAI VIET LETTER LOW BO;Lo;0;L;;;;;N;;;;; -AA9B;TAI VIET LETTER HIGH BO;Lo;0;L;;;;;N;;;;; -AA9C;TAI VIET LETTER LOW PO;Lo;0;L;;;;;N;;;;; -AA9D;TAI VIET LETTER HIGH PO;Lo;0;L;;;;;N;;;;; -AA9E;TAI VIET LETTER LOW PHO;Lo;0;L;;;;;N;;;;; -AA9F;TAI VIET LETTER HIGH PHO;Lo;0;L;;;;;N;;;;; -AAA0;TAI VIET LETTER LOW FO;Lo;0;L;;;;;N;;;;; -AAA1;TAI VIET LETTER HIGH FO;Lo;0;L;;;;;N;;;;; -AAA2;TAI VIET LETTER LOW MO;Lo;0;L;;;;;N;;;;; -AAA3;TAI VIET LETTER HIGH MO;Lo;0;L;;;;;N;;;;; -AAA4;TAI VIET LETTER LOW YO;Lo;0;L;;;;;N;;;;; -AAA5;TAI VIET LETTER HIGH YO;Lo;0;L;;;;;N;;;;; -AAA6;TAI VIET LETTER LOW RO;Lo;0;L;;;;;N;;;;; -AAA7;TAI VIET LETTER HIGH RO;Lo;0;L;;;;;N;;;;; -AAA8;TAI VIET LETTER LOW LO;Lo;0;L;;;;;N;;;;; -AAA9;TAI VIET LETTER HIGH LO;Lo;0;L;;;;;N;;;;; -AAAA;TAI VIET LETTER LOW VO;Lo;0;L;;;;;N;;;;; -AAAB;TAI VIET LETTER HIGH VO;Lo;0;L;;;;;N;;;;; -AAAC;TAI VIET LETTER LOW HO;Lo;0;L;;;;;N;;;;; -AAAD;TAI VIET LETTER HIGH HO;Lo;0;L;;;;;N;;;;; -AAAE;TAI VIET LETTER LOW O;Lo;0;L;;;;;N;;;;; -AAAF;TAI VIET LETTER HIGH O;Lo;0;L;;;;;N;;;;; -AAB0;TAI VIET MAI KANG;Mn;230;NSM;;;;;N;;;;; -AAB1;TAI VIET VOWEL AA;Lo;0;L;;;;;N;;;;; -AAB2;TAI VIET VOWEL I;Mn;230;NSM;;;;;N;;;;; -AAB3;TAI VIET VOWEL UE;Mn;230;NSM;;;;;N;;;;; -AAB4;TAI VIET VOWEL U;Mn;220;NSM;;;;;N;;;;; -AAB5;TAI VIET VOWEL E;Lo;0;L;;;;;N;;;;; -AAB6;TAI VIET VOWEL O;Lo;0;L;;;;;N;;;;; -AAB7;TAI VIET MAI KHIT;Mn;230;NSM;;;;;N;;;;; -AAB8;TAI VIET VOWEL IA;Mn;230;NSM;;;;;N;;;;; -AAB9;TAI VIET VOWEL UEA;Lo;0;L;;;;;N;;;;; -AABA;TAI VIET VOWEL UA;Lo;0;L;;;;;N;;;;; -AABB;TAI VIET VOWEL AUE;Lo;0;L;;;;;N;;;;; -AABC;TAI VIET VOWEL AY;Lo;0;L;;;;;N;;;;; -AABD;TAI VIET VOWEL AN;Lo;0;L;;;;;N;;;;; -AABE;TAI VIET VOWEL AM;Mn;230;NSM;;;;;N;;;;; -AABF;TAI VIET TONE MAI EK;Mn;230;NSM;;;;;N;;;;; -AAC0;TAI VIET TONE MAI NUENG;Lo;0;L;;;;;N;;;;; -AAC1;TAI VIET TONE MAI THO;Mn;230;NSM;;;;;N;;;;; -AAC2;TAI VIET TONE MAI SONG;Lo;0;L;;;;;N;;;;; -AADB;TAI VIET SYMBOL KON;Lo;0;L;;;;;N;;;;; -AADC;TAI VIET SYMBOL NUENG;Lo;0;L;;;;;N;;;;; -AADD;TAI VIET SYMBOL SAM;Lm;0;L;;;;;N;;;;; -AADE;TAI VIET SYMBOL HO HOI;Po;0;L;;;;;N;;;;; -AADF;TAI VIET SYMBOL KOI KOI;Po;0;L;;;;;N;;;;; -AAE0;MEETEI MAYEK LETTER E;Lo;0;L;;;;;N;;;;; -AAE1;MEETEI MAYEK LETTER O;Lo;0;L;;;;;N;;;;; -AAE2;MEETEI MAYEK LETTER CHA;Lo;0;L;;;;;N;;;;; -AAE3;MEETEI MAYEK LETTER NYA;Lo;0;L;;;;;N;;;;; -AAE4;MEETEI MAYEK LETTER TTA;Lo;0;L;;;;;N;;;;; -AAE5;MEETEI MAYEK LETTER TTHA;Lo;0;L;;;;;N;;;;; -AAE6;MEETEI MAYEK LETTER DDA;Lo;0;L;;;;;N;;;;; -AAE7;MEETEI MAYEK LETTER DDHA;Lo;0;L;;;;;N;;;;; -AAE8;MEETEI MAYEK LETTER NNA;Lo;0;L;;;;;N;;;;; -AAE9;MEETEI MAYEK LETTER SHA;Lo;0;L;;;;;N;;;;; -AAEA;MEETEI MAYEK LETTER SSA;Lo;0;L;;;;;N;;;;; -AAEB;MEETEI MAYEK VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -AAEC;MEETEI MAYEK VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -AAED;MEETEI MAYEK VOWEL SIGN AAI;Mn;0;NSM;;;;;N;;;;; -AAEE;MEETEI MAYEK VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -AAEF;MEETEI MAYEK VOWEL SIGN AAU;Mc;0;L;;;;;N;;;;; -AAF0;MEETEI MAYEK CHEIKHAN;Po;0;L;;;;;N;;;;; -AAF1;MEETEI MAYEK AHANG KHUDAM;Po;0;L;;;;;N;;;;; -AAF2;MEETEI MAYEK ANJI;Lo;0;L;;;;;N;;;;; -AAF3;MEETEI MAYEK SYLLABLE REPETITION MARK;Lm;0;L;;;;;N;;;;; -AAF4;MEETEI MAYEK WORD REPETITION MARK;Lm;0;L;;;;;N;;;;; -AAF5;MEETEI MAYEK VOWEL SIGN VISARGA;Mc;0;L;;;;;N;;;;; -AAF6;MEETEI MAYEK VIRAMA;Mn;9;NSM;;;;;N;;;;; -AB01;ETHIOPIC SYLLABLE TTHU;Lo;0;L;;;;;N;;;;; -AB02;ETHIOPIC SYLLABLE TTHI;Lo;0;L;;;;;N;;;;; -AB03;ETHIOPIC SYLLABLE TTHAA;Lo;0;L;;;;;N;;;;; -AB04;ETHIOPIC SYLLABLE TTHEE;Lo;0;L;;;;;N;;;;; -AB05;ETHIOPIC SYLLABLE TTHE;Lo;0;L;;;;;N;;;;; -AB06;ETHIOPIC SYLLABLE TTHO;Lo;0;L;;;;;N;;;;; -AB09;ETHIOPIC SYLLABLE DDHU;Lo;0;L;;;;;N;;;;; -AB0A;ETHIOPIC SYLLABLE DDHI;Lo;0;L;;;;;N;;;;; -AB0B;ETHIOPIC SYLLABLE DDHAA;Lo;0;L;;;;;N;;;;; -AB0C;ETHIOPIC SYLLABLE DDHEE;Lo;0;L;;;;;N;;;;; -AB0D;ETHIOPIC SYLLABLE DDHE;Lo;0;L;;;;;N;;;;; -AB0E;ETHIOPIC SYLLABLE DDHO;Lo;0;L;;;;;N;;;;; -AB11;ETHIOPIC SYLLABLE DZU;Lo;0;L;;;;;N;;;;; -AB12;ETHIOPIC SYLLABLE DZI;Lo;0;L;;;;;N;;;;; -AB13;ETHIOPIC SYLLABLE DZAA;Lo;0;L;;;;;N;;;;; -AB14;ETHIOPIC SYLLABLE DZEE;Lo;0;L;;;;;N;;;;; -AB15;ETHIOPIC SYLLABLE DZE;Lo;0;L;;;;;N;;;;; -AB16;ETHIOPIC SYLLABLE DZO;Lo;0;L;;;;;N;;;;; -AB20;ETHIOPIC SYLLABLE CCHHA;Lo;0;L;;;;;N;;;;; -AB21;ETHIOPIC SYLLABLE CCHHU;Lo;0;L;;;;;N;;;;; -AB22;ETHIOPIC SYLLABLE CCHHI;Lo;0;L;;;;;N;;;;; -AB23;ETHIOPIC SYLLABLE CCHHAA;Lo;0;L;;;;;N;;;;; -AB24;ETHIOPIC SYLLABLE CCHHEE;Lo;0;L;;;;;N;;;;; -AB25;ETHIOPIC SYLLABLE CCHHE;Lo;0;L;;;;;N;;;;; -AB26;ETHIOPIC SYLLABLE CCHHO;Lo;0;L;;;;;N;;;;; -AB28;ETHIOPIC SYLLABLE BBA;Lo;0;L;;;;;N;;;;; -AB29;ETHIOPIC SYLLABLE BBU;Lo;0;L;;;;;N;;;;; -AB2A;ETHIOPIC SYLLABLE BBI;Lo;0;L;;;;;N;;;;; -AB2B;ETHIOPIC SYLLABLE BBAA;Lo;0;L;;;;;N;;;;; -AB2C;ETHIOPIC SYLLABLE BBEE;Lo;0;L;;;;;N;;;;; -AB2D;ETHIOPIC SYLLABLE BBE;Lo;0;L;;;;;N;;;;; -AB2E;ETHIOPIC SYLLABLE BBO;Lo;0;L;;;;;N;;;;; -AB30;LATIN SMALL LETTER BARRED ALPHA;Ll;0;L;;;;;N;;;;; -AB31;LATIN SMALL LETTER A REVERSED-SCHWA;Ll;0;L;;;;;N;;;;; -AB32;LATIN SMALL LETTER BLACKLETTER E;Ll;0;L;;;;;N;;;;; -AB33;LATIN SMALL LETTER BARRED E;Ll;0;L;;;;;N;;;;; -AB34;LATIN SMALL LETTER E WITH FLOURISH;Ll;0;L;;;;;N;;;;; -AB35;LATIN SMALL LETTER LENIS F;Ll;0;L;;;;;N;;;;; -AB36;LATIN SMALL LETTER SCRIPT G WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB37;LATIN SMALL LETTER L WITH INVERTED LAZY S;Ll;0;L;;;;;N;;;;; -AB38;LATIN SMALL LETTER L WITH DOUBLE MIDDLE TILDE;Ll;0;L;;;;;N;;;;; -AB39;LATIN SMALL LETTER L WITH MIDDLE RING;Ll;0;L;;;;;N;;;;; -AB3A;LATIN SMALL LETTER M WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB3B;LATIN SMALL LETTER N WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB3C;LATIN SMALL LETTER ENG WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB3D;LATIN SMALL LETTER BLACKLETTER O;Ll;0;L;;;;;N;;;;; -AB3E;LATIN SMALL LETTER BLACKLETTER O WITH STROKE;Ll;0;L;;;;;N;;;;; -AB3F;LATIN SMALL LETTER OPEN O WITH STROKE;Ll;0;L;;;;;N;;;;; -AB40;LATIN SMALL LETTER INVERTED OE;Ll;0;L;;;;;N;;;;; -AB41;LATIN SMALL LETTER TURNED OE WITH STROKE;Ll;0;L;;;;;N;;;;; -AB42;LATIN SMALL LETTER TURNED OE WITH HORIZONTAL STROKE;Ll;0;L;;;;;N;;;;; -AB43;LATIN SMALL LETTER TURNED O OPEN-O;Ll;0;L;;;;;N;;;;; -AB44;LATIN SMALL LETTER TURNED O OPEN-O WITH STROKE;Ll;0;L;;;;;N;;;;; -AB45;LATIN SMALL LETTER STIRRUP R;Ll;0;L;;;;;N;;;;; -AB46;LATIN LETTER SMALL CAPITAL R WITH RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB47;LATIN SMALL LETTER R WITHOUT HANDLE;Ll;0;L;;;;;N;;;;; -AB48;LATIN SMALL LETTER DOUBLE R;Ll;0;L;;;;;N;;;;; -AB49;LATIN SMALL LETTER R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB4A;LATIN SMALL LETTER DOUBLE R WITH CROSSED-TAIL;Ll;0;L;;;;;N;;;;; -AB4B;LATIN SMALL LETTER SCRIPT R;Ll;0;L;;;;;N;;;;; -AB4C;LATIN SMALL LETTER SCRIPT R WITH RING;Ll;0;L;;;;;N;;;;; -AB4D;LATIN SMALL LETTER BASELINE ESH;Ll;0;L;;;;;N;;;;; -AB4E;LATIN SMALL LETTER U WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB4F;LATIN SMALL LETTER U BAR WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB50;LATIN SMALL LETTER UI;Ll;0;L;;;;;N;;;;; -AB51;LATIN SMALL LETTER TURNED UI;Ll;0;L;;;;;N;;;;; -AB52;LATIN SMALL LETTER U WITH LEFT HOOK;Ll;0;L;;;;;N;;;;; -AB53;LATIN SMALL LETTER CHI;Ll;0;L;;;;;N;;;A7B3;;A7B3 -AB54;LATIN SMALL LETTER CHI WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; -AB55;LATIN SMALL LETTER CHI WITH LOW LEFT SERIF;Ll;0;L;;;;;N;;;;; -AB56;LATIN SMALL LETTER X WITH LOW RIGHT RING;Ll;0;L;;;;;N;;;;; -AB57;LATIN SMALL LETTER X WITH LONG LEFT LEG;Ll;0;L;;;;;N;;;;; -AB58;LATIN SMALL LETTER X WITH LONG LEFT LEG AND LOW RIGHT RING;Ll;0;L;;;;;N;;;;; -AB59;LATIN SMALL LETTER X WITH LONG LEFT LEG WITH SERIF;Ll;0;L;;;;;N;;;;; -AB5A;LATIN SMALL LETTER Y WITH SHORT RIGHT LEG;Ll;0;L;;;;;N;;;;; -AB5B;MODIFIER BREVE WITH INVERTED BREVE;Sk;0;L;;;;;N;;;;; -AB5C;MODIFIER LETTER SMALL HENG;Lm;0;L; A727;;;;N;;;;; -AB5D;MODIFIER LETTER SMALL L WITH INVERTED LAZY S;Lm;0;L; AB37;;;;N;;;;; -AB5E;MODIFIER LETTER SMALL L WITH MIDDLE TILDE;Lm;0;L; 026B;;;;N;;;;; -AB5F;MODIFIER LETTER SMALL U WITH LEFT HOOK;Lm;0;L; AB52;;;;N;;;;; -AB60;LATIN SMALL LETTER SAKHA YAT;Ll;0;L;;;;;N;;;;; -AB61;LATIN SMALL LETTER IOTIFIED E;Ll;0;L;;;;;N;;;;; -AB62;LATIN SMALL LETTER OPEN OE;Ll;0;L;;;;;N;;;;; -AB63;LATIN SMALL LETTER UO;Ll;0;L;;;;;N;;;;; -AB64;LATIN SMALL LETTER INVERTED ALPHA;Ll;0;L;;;;;N;;;;; -AB65;GREEK LETTER SMALL CAPITAL OMEGA;Ll;0;L;;;;;N;;;;; -AB70;CHEROKEE SMALL LETTER A;Ll;0;L;;;;;N;;;13A0;;13A0 -AB71;CHEROKEE SMALL LETTER E;Ll;0;L;;;;;N;;;13A1;;13A1 -AB72;CHEROKEE SMALL LETTER I;Ll;0;L;;;;;N;;;13A2;;13A2 -AB73;CHEROKEE SMALL LETTER O;Ll;0;L;;;;;N;;;13A3;;13A3 -AB74;CHEROKEE SMALL LETTER U;Ll;0;L;;;;;N;;;13A4;;13A4 -AB75;CHEROKEE SMALL LETTER V;Ll;0;L;;;;;N;;;13A5;;13A5 -AB76;CHEROKEE SMALL LETTER GA;Ll;0;L;;;;;N;;;13A6;;13A6 -AB77;CHEROKEE SMALL LETTER KA;Ll;0;L;;;;;N;;;13A7;;13A7 -AB78;CHEROKEE SMALL LETTER GE;Ll;0;L;;;;;N;;;13A8;;13A8 -AB79;CHEROKEE SMALL LETTER GI;Ll;0;L;;;;;N;;;13A9;;13A9 -AB7A;CHEROKEE SMALL LETTER GO;Ll;0;L;;;;;N;;;13AA;;13AA -AB7B;CHEROKEE SMALL LETTER GU;Ll;0;L;;;;;N;;;13AB;;13AB -AB7C;CHEROKEE SMALL LETTER GV;Ll;0;L;;;;;N;;;13AC;;13AC -AB7D;CHEROKEE SMALL LETTER HA;Ll;0;L;;;;;N;;;13AD;;13AD -AB7E;CHEROKEE SMALL LETTER HE;Ll;0;L;;;;;N;;;13AE;;13AE -AB7F;CHEROKEE SMALL LETTER HI;Ll;0;L;;;;;N;;;13AF;;13AF -AB80;CHEROKEE SMALL LETTER HO;Ll;0;L;;;;;N;;;13B0;;13B0 -AB81;CHEROKEE SMALL LETTER HU;Ll;0;L;;;;;N;;;13B1;;13B1 -AB82;CHEROKEE SMALL LETTER HV;Ll;0;L;;;;;N;;;13B2;;13B2 -AB83;CHEROKEE SMALL LETTER LA;Ll;0;L;;;;;N;;;13B3;;13B3 -AB84;CHEROKEE SMALL LETTER LE;Ll;0;L;;;;;N;;;13B4;;13B4 -AB85;CHEROKEE SMALL LETTER LI;Ll;0;L;;;;;N;;;13B5;;13B5 -AB86;CHEROKEE SMALL LETTER LO;Ll;0;L;;;;;N;;;13B6;;13B6 -AB87;CHEROKEE SMALL LETTER LU;Ll;0;L;;;;;N;;;13B7;;13B7 -AB88;CHEROKEE SMALL LETTER LV;Ll;0;L;;;;;N;;;13B8;;13B8 -AB89;CHEROKEE SMALL LETTER MA;Ll;0;L;;;;;N;;;13B9;;13B9 -AB8A;CHEROKEE SMALL LETTER ME;Ll;0;L;;;;;N;;;13BA;;13BA -AB8B;CHEROKEE SMALL LETTER MI;Ll;0;L;;;;;N;;;13BB;;13BB -AB8C;CHEROKEE SMALL LETTER MO;Ll;0;L;;;;;N;;;13BC;;13BC -AB8D;CHEROKEE SMALL LETTER MU;Ll;0;L;;;;;N;;;13BD;;13BD -AB8E;CHEROKEE SMALL LETTER NA;Ll;0;L;;;;;N;;;13BE;;13BE -AB8F;CHEROKEE SMALL LETTER HNA;Ll;0;L;;;;;N;;;13BF;;13BF -AB90;CHEROKEE SMALL LETTER NAH;Ll;0;L;;;;;N;;;13C0;;13C0 -AB91;CHEROKEE SMALL LETTER NE;Ll;0;L;;;;;N;;;13C1;;13C1 -AB92;CHEROKEE SMALL LETTER NI;Ll;0;L;;;;;N;;;13C2;;13C2 -AB93;CHEROKEE SMALL LETTER NO;Ll;0;L;;;;;N;;;13C3;;13C3 -AB94;CHEROKEE SMALL LETTER NU;Ll;0;L;;;;;N;;;13C4;;13C4 -AB95;CHEROKEE SMALL LETTER NV;Ll;0;L;;;;;N;;;13C5;;13C5 -AB96;CHEROKEE SMALL LETTER QUA;Ll;0;L;;;;;N;;;13C6;;13C6 -AB97;CHEROKEE SMALL LETTER QUE;Ll;0;L;;;;;N;;;13C7;;13C7 -AB98;CHEROKEE SMALL LETTER QUI;Ll;0;L;;;;;N;;;13C8;;13C8 -AB99;CHEROKEE SMALL LETTER QUO;Ll;0;L;;;;;N;;;13C9;;13C9 -AB9A;CHEROKEE SMALL LETTER QUU;Ll;0;L;;;;;N;;;13CA;;13CA -AB9B;CHEROKEE SMALL LETTER QUV;Ll;0;L;;;;;N;;;13CB;;13CB -AB9C;CHEROKEE SMALL LETTER SA;Ll;0;L;;;;;N;;;13CC;;13CC -AB9D;CHEROKEE SMALL LETTER S;Ll;0;L;;;;;N;;;13CD;;13CD -AB9E;CHEROKEE SMALL LETTER SE;Ll;0;L;;;;;N;;;13CE;;13CE -AB9F;CHEROKEE SMALL LETTER SI;Ll;0;L;;;;;N;;;13CF;;13CF -ABA0;CHEROKEE SMALL LETTER SO;Ll;0;L;;;;;N;;;13D0;;13D0 -ABA1;CHEROKEE SMALL LETTER SU;Ll;0;L;;;;;N;;;13D1;;13D1 -ABA2;CHEROKEE SMALL LETTER SV;Ll;0;L;;;;;N;;;13D2;;13D2 -ABA3;CHEROKEE SMALL LETTER DA;Ll;0;L;;;;;N;;;13D3;;13D3 -ABA4;CHEROKEE SMALL LETTER TA;Ll;0;L;;;;;N;;;13D4;;13D4 -ABA5;CHEROKEE SMALL LETTER DE;Ll;0;L;;;;;N;;;13D5;;13D5 -ABA6;CHEROKEE SMALL LETTER TE;Ll;0;L;;;;;N;;;13D6;;13D6 -ABA7;CHEROKEE SMALL LETTER DI;Ll;0;L;;;;;N;;;13D7;;13D7 -ABA8;CHEROKEE SMALL LETTER TI;Ll;0;L;;;;;N;;;13D8;;13D8 -ABA9;CHEROKEE SMALL LETTER DO;Ll;0;L;;;;;N;;;13D9;;13D9 -ABAA;CHEROKEE SMALL LETTER DU;Ll;0;L;;;;;N;;;13DA;;13DA -ABAB;CHEROKEE SMALL LETTER DV;Ll;0;L;;;;;N;;;13DB;;13DB -ABAC;CHEROKEE SMALL LETTER DLA;Ll;0;L;;;;;N;;;13DC;;13DC -ABAD;CHEROKEE SMALL LETTER TLA;Ll;0;L;;;;;N;;;13DD;;13DD -ABAE;CHEROKEE SMALL LETTER TLE;Ll;0;L;;;;;N;;;13DE;;13DE -ABAF;CHEROKEE SMALL LETTER TLI;Ll;0;L;;;;;N;;;13DF;;13DF -ABB0;CHEROKEE SMALL LETTER TLO;Ll;0;L;;;;;N;;;13E0;;13E0 -ABB1;CHEROKEE SMALL LETTER TLU;Ll;0;L;;;;;N;;;13E1;;13E1 -ABB2;CHEROKEE SMALL LETTER TLV;Ll;0;L;;;;;N;;;13E2;;13E2 -ABB3;CHEROKEE SMALL LETTER TSA;Ll;0;L;;;;;N;;;13E3;;13E3 -ABB4;CHEROKEE SMALL LETTER TSE;Ll;0;L;;;;;N;;;13E4;;13E4 -ABB5;CHEROKEE SMALL LETTER TSI;Ll;0;L;;;;;N;;;13E5;;13E5 -ABB6;CHEROKEE SMALL LETTER TSO;Ll;0;L;;;;;N;;;13E6;;13E6 -ABB7;CHEROKEE SMALL LETTER TSU;Ll;0;L;;;;;N;;;13E7;;13E7 -ABB8;CHEROKEE SMALL LETTER TSV;Ll;0;L;;;;;N;;;13E8;;13E8 -ABB9;CHEROKEE SMALL LETTER WA;Ll;0;L;;;;;N;;;13E9;;13E9 -ABBA;CHEROKEE SMALL LETTER WE;Ll;0;L;;;;;N;;;13EA;;13EA -ABBB;CHEROKEE SMALL LETTER WI;Ll;0;L;;;;;N;;;13EB;;13EB -ABBC;CHEROKEE SMALL LETTER WO;Ll;0;L;;;;;N;;;13EC;;13EC -ABBD;CHEROKEE SMALL LETTER WU;Ll;0;L;;;;;N;;;13ED;;13ED -ABBE;CHEROKEE SMALL LETTER WV;Ll;0;L;;;;;N;;;13EE;;13EE -ABBF;CHEROKEE SMALL LETTER YA;Ll;0;L;;;;;N;;;13EF;;13EF -ABC0;MEETEI MAYEK LETTER KOK;Lo;0;L;;;;;N;;;;; -ABC1;MEETEI MAYEK LETTER SAM;Lo;0;L;;;;;N;;;;; -ABC2;MEETEI MAYEK LETTER LAI;Lo;0;L;;;;;N;;;;; -ABC3;MEETEI MAYEK LETTER MIT;Lo;0;L;;;;;N;;;;; -ABC4;MEETEI MAYEK LETTER PA;Lo;0;L;;;;;N;;;;; -ABC5;MEETEI MAYEK LETTER NA;Lo;0;L;;;;;N;;;;; -ABC6;MEETEI MAYEK LETTER CHIL;Lo;0;L;;;;;N;;;;; -ABC7;MEETEI MAYEK LETTER TIL;Lo;0;L;;;;;N;;;;; -ABC8;MEETEI MAYEK LETTER KHOU;Lo;0;L;;;;;N;;;;; -ABC9;MEETEI MAYEK LETTER NGOU;Lo;0;L;;;;;N;;;;; -ABCA;MEETEI MAYEK LETTER THOU;Lo;0;L;;;;;N;;;;; -ABCB;MEETEI MAYEK LETTER WAI;Lo;0;L;;;;;N;;;;; -ABCC;MEETEI MAYEK LETTER YANG;Lo;0;L;;;;;N;;;;; -ABCD;MEETEI MAYEK LETTER HUK;Lo;0;L;;;;;N;;;;; -ABCE;MEETEI MAYEK LETTER UN;Lo;0;L;;;;;N;;;;; -ABCF;MEETEI MAYEK LETTER I;Lo;0;L;;;;;N;;;;; -ABD0;MEETEI MAYEK LETTER PHAM;Lo;0;L;;;;;N;;;;; -ABD1;MEETEI MAYEK LETTER ATIYA;Lo;0;L;;;;;N;;;;; -ABD2;MEETEI MAYEK LETTER GOK;Lo;0;L;;;;;N;;;;; -ABD3;MEETEI MAYEK LETTER JHAM;Lo;0;L;;;;;N;;;;; -ABD4;MEETEI MAYEK LETTER RAI;Lo;0;L;;;;;N;;;;; -ABD5;MEETEI MAYEK LETTER BA;Lo;0;L;;;;;N;;;;; -ABD6;MEETEI MAYEK LETTER JIL;Lo;0;L;;;;;N;;;;; -ABD7;MEETEI MAYEK LETTER DIL;Lo;0;L;;;;;N;;;;; -ABD8;MEETEI MAYEK LETTER GHOU;Lo;0;L;;;;;N;;;;; -ABD9;MEETEI MAYEK LETTER DHOU;Lo;0;L;;;;;N;;;;; -ABDA;MEETEI MAYEK LETTER BHAM;Lo;0;L;;;;;N;;;;; -ABDB;MEETEI MAYEK LETTER KOK LONSUM;Lo;0;L;;;;;N;;;;; -ABDC;MEETEI MAYEK LETTER LAI LONSUM;Lo;0;L;;;;;N;;;;; -ABDD;MEETEI MAYEK LETTER MIT LONSUM;Lo;0;L;;;;;N;;;;; -ABDE;MEETEI MAYEK LETTER PA LONSUM;Lo;0;L;;;;;N;;;;; -ABDF;MEETEI MAYEK LETTER NA LONSUM;Lo;0;L;;;;;N;;;;; -ABE0;MEETEI MAYEK LETTER TIL LONSUM;Lo;0;L;;;;;N;;;;; -ABE1;MEETEI MAYEK LETTER NGOU LONSUM;Lo;0;L;;;;;N;;;;; -ABE2;MEETEI MAYEK LETTER I LONSUM;Lo;0;L;;;;;N;;;;; -ABE3;MEETEI MAYEK VOWEL SIGN ONAP;Mc;0;L;;;;;N;;;;; -ABE4;MEETEI MAYEK VOWEL SIGN INAP;Mc;0;L;;;;;N;;;;; -ABE5;MEETEI MAYEK VOWEL SIGN ANAP;Mn;0;NSM;;;;;N;;;;; -ABE6;MEETEI MAYEK VOWEL SIGN YENAP;Mc;0;L;;;;;N;;;;; -ABE7;MEETEI MAYEK VOWEL SIGN SOUNAP;Mc;0;L;;;;;N;;;;; -ABE8;MEETEI MAYEK VOWEL SIGN UNAP;Mn;0;NSM;;;;;N;;;;; -ABE9;MEETEI MAYEK VOWEL SIGN CHEINAP;Mc;0;L;;;;;N;;;;; -ABEA;MEETEI MAYEK VOWEL SIGN NUNG;Mc;0;L;;;;;N;;;;; -ABEB;MEETEI MAYEK CHEIKHEI;Po;0;L;;;;;N;;;;; -ABEC;MEETEI MAYEK LUM IYEK;Mc;0;L;;;;;N;;;;; -ABED;MEETEI MAYEK APUN IYEK;Mn;9;NSM;;;;;N;;;;; -ABF0;MEETEI MAYEK DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -ABF1;MEETEI MAYEK DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -ABF2;MEETEI MAYEK DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -ABF3;MEETEI MAYEK DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -ABF4;MEETEI MAYEK DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -ABF5;MEETEI MAYEK DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -ABF6;MEETEI MAYEK DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -ABF7;MEETEI MAYEK DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -ABF8;MEETEI MAYEK DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -ABF9;MEETEI MAYEK DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -AC00;;Lo;0;L;;;;;N;;;;; -D7A3;;Lo;0;L;;;;;N;;;;; -D7B0;HANGUL JUNGSEONG O-YEO;Lo;0;L;;;;;N;;;;; -D7B1;HANGUL JUNGSEONG O-O-I;Lo;0;L;;;;;N;;;;; -D7B2;HANGUL JUNGSEONG YO-A;Lo;0;L;;;;;N;;;;; -D7B3;HANGUL JUNGSEONG YO-AE;Lo;0;L;;;;;N;;;;; -D7B4;HANGUL JUNGSEONG YO-EO;Lo;0;L;;;;;N;;;;; -D7B5;HANGUL JUNGSEONG U-YEO;Lo;0;L;;;;;N;;;;; -D7B6;HANGUL JUNGSEONG U-I-I;Lo;0;L;;;;;N;;;;; -D7B7;HANGUL JUNGSEONG YU-AE;Lo;0;L;;;;;N;;;;; -D7B8;HANGUL JUNGSEONG YU-O;Lo;0;L;;;;;N;;;;; -D7B9;HANGUL JUNGSEONG EU-A;Lo;0;L;;;;;N;;;;; -D7BA;HANGUL JUNGSEONG EU-EO;Lo;0;L;;;;;N;;;;; -D7BB;HANGUL JUNGSEONG EU-E;Lo;0;L;;;;;N;;;;; -D7BC;HANGUL JUNGSEONG EU-O;Lo;0;L;;;;;N;;;;; -D7BD;HANGUL JUNGSEONG I-YA-O;Lo;0;L;;;;;N;;;;; -D7BE;HANGUL JUNGSEONG I-YAE;Lo;0;L;;;;;N;;;;; -D7BF;HANGUL JUNGSEONG I-YEO;Lo;0;L;;;;;N;;;;; -D7C0;HANGUL JUNGSEONG I-YE;Lo;0;L;;;;;N;;;;; -D7C1;HANGUL JUNGSEONG I-O-I;Lo;0;L;;;;;N;;;;; -D7C2;HANGUL JUNGSEONG I-YO;Lo;0;L;;;;;N;;;;; -D7C3;HANGUL JUNGSEONG I-YU;Lo;0;L;;;;;N;;;;; -D7C4;HANGUL JUNGSEONG I-I;Lo;0;L;;;;;N;;;;; -D7C5;HANGUL JUNGSEONG ARAEA-A;Lo;0;L;;;;;N;;;;; -D7C6;HANGUL JUNGSEONG ARAEA-E;Lo;0;L;;;;;N;;;;; -D7CB;HANGUL JONGSEONG NIEUN-RIEUL;Lo;0;L;;;;;N;;;;; -D7CC;HANGUL JONGSEONG NIEUN-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7CD;HANGUL JONGSEONG SSANGTIKEUT;Lo;0;L;;;;;N;;;;; -D7CE;HANGUL JONGSEONG SSANGTIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; -D7CF;HANGUL JONGSEONG TIKEUT-PIEUP;Lo;0;L;;;;;N;;;;; -D7D0;HANGUL JONGSEONG TIKEUT-SIOS;Lo;0;L;;;;;N;;;;; -D7D1;HANGUL JONGSEONG TIKEUT-SIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -D7D2;HANGUL JONGSEONG TIKEUT-CIEUC;Lo;0;L;;;;;N;;;;; -D7D3;HANGUL JONGSEONG TIKEUT-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7D4;HANGUL JONGSEONG TIKEUT-THIEUTH;Lo;0;L;;;;;N;;;;; -D7D5;HANGUL JONGSEONG RIEUL-SSANGKIYEOK;Lo;0;L;;;;;N;;;;; -D7D6;HANGUL JONGSEONG RIEUL-KIYEOK-HIEUH;Lo;0;L;;;;;N;;;;; -D7D7;HANGUL JONGSEONG SSANGRIEUL-KHIEUKH;Lo;0;L;;;;;N;;;;; -D7D8;HANGUL JONGSEONG RIEUL-MIEUM-HIEUH;Lo;0;L;;;;;N;;;;; -D7D9;HANGUL JONGSEONG RIEUL-PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -D7DA;HANGUL JONGSEONG RIEUL-PIEUP-PHIEUPH;Lo;0;L;;;;;N;;;;; -D7DB;HANGUL JONGSEONG RIEUL-YESIEUNG;Lo;0;L;;;;;N;;;;; -D7DC;HANGUL JONGSEONG RIEUL-YEORINHIEUH-HIEUH;Lo;0;L;;;;;N;;;;; -D7DD;HANGUL JONGSEONG KAPYEOUNRIEUL;Lo;0;L;;;;;N;;;;; -D7DE;HANGUL JONGSEONG MIEUM-NIEUN;Lo;0;L;;;;;N;;;;; -D7DF;HANGUL JONGSEONG MIEUM-SSANGNIEUN;Lo;0;L;;;;;N;;;;; -D7E0;HANGUL JONGSEONG SSANGMIEUM;Lo;0;L;;;;;N;;;;; -D7E1;HANGUL JONGSEONG MIEUM-PIEUP-SIOS;Lo;0;L;;;;;N;;;;; -D7E2;HANGUL JONGSEONG MIEUM-CIEUC;Lo;0;L;;;;;N;;;;; -D7E3;HANGUL JONGSEONG PIEUP-TIKEUT;Lo;0;L;;;;;N;;;;; -D7E4;HANGUL JONGSEONG PIEUP-RIEUL-PHIEUPH;Lo;0;L;;;;;N;;;;; -D7E5;HANGUL JONGSEONG PIEUP-MIEUM;Lo;0;L;;;;;N;;;;; -D7E6;HANGUL JONGSEONG SSANGPIEUP;Lo;0;L;;;;;N;;;;; -D7E7;HANGUL JONGSEONG PIEUP-SIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -D7E8;HANGUL JONGSEONG PIEUP-CIEUC;Lo;0;L;;;;;N;;;;; -D7E9;HANGUL JONGSEONG PIEUP-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7EA;HANGUL JONGSEONG SIOS-MIEUM;Lo;0;L;;;;;N;;;;; -D7EB;HANGUL JONGSEONG SIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -D7EC;HANGUL JONGSEONG SSANGSIOS-KIYEOK;Lo;0;L;;;;;N;;;;; -D7ED;HANGUL JONGSEONG SSANGSIOS-TIKEUT;Lo;0;L;;;;;N;;;;; -D7EE;HANGUL JONGSEONG SIOS-PANSIOS;Lo;0;L;;;;;N;;;;; -D7EF;HANGUL JONGSEONG SIOS-CIEUC;Lo;0;L;;;;;N;;;;; -D7F0;HANGUL JONGSEONG SIOS-CHIEUCH;Lo;0;L;;;;;N;;;;; -D7F1;HANGUL JONGSEONG SIOS-THIEUTH;Lo;0;L;;;;;N;;;;; -D7F2;HANGUL JONGSEONG SIOS-HIEUH;Lo;0;L;;;;;N;;;;; -D7F3;HANGUL JONGSEONG PANSIOS-PIEUP;Lo;0;L;;;;;N;;;;; -D7F4;HANGUL JONGSEONG PANSIOS-KAPYEOUNPIEUP;Lo;0;L;;;;;N;;;;; -D7F5;HANGUL JONGSEONG YESIEUNG-MIEUM;Lo;0;L;;;;;N;;;;; -D7F6;HANGUL JONGSEONG YESIEUNG-HIEUH;Lo;0;L;;;;;N;;;;; -D7F7;HANGUL JONGSEONG CIEUC-PIEUP;Lo;0;L;;;;;N;;;;; -D7F8;HANGUL JONGSEONG CIEUC-SSANGPIEUP;Lo;0;L;;;;;N;;;;; -D7F9;HANGUL JONGSEONG SSANGCIEUC;Lo;0;L;;;;;N;;;;; -D7FA;HANGUL JONGSEONG PHIEUPH-SIOS;Lo;0;L;;;;;N;;;;; -D7FB;HANGUL JONGSEONG PHIEUPH-THIEUTH;Lo;0;L;;;;;N;;;;; -D800;;Cs;0;L;;;;;N;;;;; -DB7F;;Cs;0;L;;;;;N;;;;; -DB80;;Cs;0;L;;;;;N;;;;; -DBFF;;Cs;0;L;;;;;N;;;;; -DC00;;Cs;0;L;;;;;N;;;;; -DFFF;;Cs;0;L;;;;;N;;;;; -E000;;Co;0;L;;;;;N;;;;; -F8FF;;Co;0;L;;;;;N;;;;; -F900;CJK COMPATIBILITY IDEOGRAPH-F900;Lo;0;L;8C48;;;;N;;;;; -F901;CJK COMPATIBILITY IDEOGRAPH-F901;Lo;0;L;66F4;;;;N;;;;; -F902;CJK COMPATIBILITY IDEOGRAPH-F902;Lo;0;L;8ECA;;;;N;;;;; -F903;CJK COMPATIBILITY IDEOGRAPH-F903;Lo;0;L;8CC8;;;;N;;;;; -F904;CJK COMPATIBILITY IDEOGRAPH-F904;Lo;0;L;6ED1;;;;N;;;;; -F905;CJK COMPATIBILITY IDEOGRAPH-F905;Lo;0;L;4E32;;;;N;;;;; -F906;CJK COMPATIBILITY IDEOGRAPH-F906;Lo;0;L;53E5;;;;N;;;;; -F907;CJK COMPATIBILITY IDEOGRAPH-F907;Lo;0;L;9F9C;;;;N;;;;; -F908;CJK COMPATIBILITY IDEOGRAPH-F908;Lo;0;L;9F9C;;;;N;;;;; -F909;CJK COMPATIBILITY IDEOGRAPH-F909;Lo;0;L;5951;;;;N;;;;; -F90A;CJK COMPATIBILITY IDEOGRAPH-F90A;Lo;0;L;91D1;;;;N;;;;; -F90B;CJK COMPATIBILITY IDEOGRAPH-F90B;Lo;0;L;5587;;;;N;;;;; -F90C;CJK COMPATIBILITY IDEOGRAPH-F90C;Lo;0;L;5948;;;;N;;;;; -F90D;CJK COMPATIBILITY IDEOGRAPH-F90D;Lo;0;L;61F6;;;;N;;;;; -F90E;CJK COMPATIBILITY IDEOGRAPH-F90E;Lo;0;L;7669;;;;N;;;;; -F90F;CJK COMPATIBILITY IDEOGRAPH-F90F;Lo;0;L;7F85;;;;N;;;;; -F910;CJK COMPATIBILITY IDEOGRAPH-F910;Lo;0;L;863F;;;;N;;;;; -F911;CJK COMPATIBILITY IDEOGRAPH-F911;Lo;0;L;87BA;;;;N;;;;; -F912;CJK COMPATIBILITY IDEOGRAPH-F912;Lo;0;L;88F8;;;;N;;;;; -F913;CJK COMPATIBILITY IDEOGRAPH-F913;Lo;0;L;908F;;;;N;;;;; -F914;CJK COMPATIBILITY IDEOGRAPH-F914;Lo;0;L;6A02;;;;N;;;;; -F915;CJK COMPATIBILITY IDEOGRAPH-F915;Lo;0;L;6D1B;;;;N;;;;; -F916;CJK COMPATIBILITY IDEOGRAPH-F916;Lo;0;L;70D9;;;;N;;;;; -F917;CJK COMPATIBILITY IDEOGRAPH-F917;Lo;0;L;73DE;;;;N;;;;; -F918;CJK COMPATIBILITY IDEOGRAPH-F918;Lo;0;L;843D;;;;N;;;;; -F919;CJK COMPATIBILITY IDEOGRAPH-F919;Lo;0;L;916A;;;;N;;;;; -F91A;CJK COMPATIBILITY IDEOGRAPH-F91A;Lo;0;L;99F1;;;;N;;;;; -F91B;CJK COMPATIBILITY IDEOGRAPH-F91B;Lo;0;L;4E82;;;;N;;;;; -F91C;CJK COMPATIBILITY IDEOGRAPH-F91C;Lo;0;L;5375;;;;N;;;;; -F91D;CJK COMPATIBILITY IDEOGRAPH-F91D;Lo;0;L;6B04;;;;N;;;;; -F91E;CJK COMPATIBILITY IDEOGRAPH-F91E;Lo;0;L;721B;;;;N;;;;; -F91F;CJK COMPATIBILITY IDEOGRAPH-F91F;Lo;0;L;862D;;;;N;;;;; -F920;CJK COMPATIBILITY IDEOGRAPH-F920;Lo;0;L;9E1E;;;;N;;;;; -F921;CJK COMPATIBILITY IDEOGRAPH-F921;Lo;0;L;5D50;;;;N;;;;; -F922;CJK COMPATIBILITY IDEOGRAPH-F922;Lo;0;L;6FEB;;;;N;;;;; -F923;CJK COMPATIBILITY IDEOGRAPH-F923;Lo;0;L;85CD;;;;N;;;;; -F924;CJK COMPATIBILITY IDEOGRAPH-F924;Lo;0;L;8964;;;;N;;;;; -F925;CJK COMPATIBILITY IDEOGRAPH-F925;Lo;0;L;62C9;;;;N;;;;; -F926;CJK COMPATIBILITY IDEOGRAPH-F926;Lo;0;L;81D8;;;;N;;;;; -F927;CJK COMPATIBILITY IDEOGRAPH-F927;Lo;0;L;881F;;;;N;;;;; -F928;CJK COMPATIBILITY IDEOGRAPH-F928;Lo;0;L;5ECA;;;;N;;;;; -F929;CJK COMPATIBILITY IDEOGRAPH-F929;Lo;0;L;6717;;;;N;;;;; -F92A;CJK COMPATIBILITY IDEOGRAPH-F92A;Lo;0;L;6D6A;;;;N;;;;; -F92B;CJK COMPATIBILITY IDEOGRAPH-F92B;Lo;0;L;72FC;;;;N;;;;; -F92C;CJK COMPATIBILITY IDEOGRAPH-F92C;Lo;0;L;90CE;;;;N;;;;; -F92D;CJK COMPATIBILITY IDEOGRAPH-F92D;Lo;0;L;4F86;;;;N;;;;; -F92E;CJK COMPATIBILITY IDEOGRAPH-F92E;Lo;0;L;51B7;;;;N;;;;; -F92F;CJK COMPATIBILITY IDEOGRAPH-F92F;Lo;0;L;52DE;;;;N;;;;; -F930;CJK COMPATIBILITY IDEOGRAPH-F930;Lo;0;L;64C4;;;;N;;;;; -F931;CJK COMPATIBILITY IDEOGRAPH-F931;Lo;0;L;6AD3;;;;N;;;;; -F932;CJK COMPATIBILITY IDEOGRAPH-F932;Lo;0;L;7210;;;;N;;;;; -F933;CJK COMPATIBILITY IDEOGRAPH-F933;Lo;0;L;76E7;;;;N;;;;; -F934;CJK COMPATIBILITY IDEOGRAPH-F934;Lo;0;L;8001;;;;N;;;;; -F935;CJK COMPATIBILITY IDEOGRAPH-F935;Lo;0;L;8606;;;;N;;;;; -F936;CJK COMPATIBILITY IDEOGRAPH-F936;Lo;0;L;865C;;;;N;;;;; -F937;CJK COMPATIBILITY IDEOGRAPH-F937;Lo;0;L;8DEF;;;;N;;;;; -F938;CJK COMPATIBILITY IDEOGRAPH-F938;Lo;0;L;9732;;;;N;;;;; -F939;CJK COMPATIBILITY IDEOGRAPH-F939;Lo;0;L;9B6F;;;;N;;;;; -F93A;CJK COMPATIBILITY IDEOGRAPH-F93A;Lo;0;L;9DFA;;;;N;;;;; -F93B;CJK COMPATIBILITY IDEOGRAPH-F93B;Lo;0;L;788C;;;;N;;;;; -F93C;CJK COMPATIBILITY IDEOGRAPH-F93C;Lo;0;L;797F;;;;N;;;;; -F93D;CJK COMPATIBILITY IDEOGRAPH-F93D;Lo;0;L;7DA0;;;;N;;;;; -F93E;CJK COMPATIBILITY IDEOGRAPH-F93E;Lo;0;L;83C9;;;;N;;;;; -F93F;CJK COMPATIBILITY IDEOGRAPH-F93F;Lo;0;L;9304;;;;N;;;;; -F940;CJK COMPATIBILITY IDEOGRAPH-F940;Lo;0;L;9E7F;;;;N;;;;; -F941;CJK COMPATIBILITY IDEOGRAPH-F941;Lo;0;L;8AD6;;;;N;;;;; -F942;CJK COMPATIBILITY IDEOGRAPH-F942;Lo;0;L;58DF;;;;N;;;;; -F943;CJK COMPATIBILITY IDEOGRAPH-F943;Lo;0;L;5F04;;;;N;;;;; -F944;CJK COMPATIBILITY IDEOGRAPH-F944;Lo;0;L;7C60;;;;N;;;;; -F945;CJK COMPATIBILITY IDEOGRAPH-F945;Lo;0;L;807E;;;;N;;;;; -F946;CJK COMPATIBILITY IDEOGRAPH-F946;Lo;0;L;7262;;;;N;;;;; -F947;CJK COMPATIBILITY IDEOGRAPH-F947;Lo;0;L;78CA;;;;N;;;;; -F948;CJK COMPATIBILITY IDEOGRAPH-F948;Lo;0;L;8CC2;;;;N;;;;; -F949;CJK COMPATIBILITY IDEOGRAPH-F949;Lo;0;L;96F7;;;;N;;;;; -F94A;CJK COMPATIBILITY IDEOGRAPH-F94A;Lo;0;L;58D8;;;;N;;;;; -F94B;CJK COMPATIBILITY IDEOGRAPH-F94B;Lo;0;L;5C62;;;;N;;;;; -F94C;CJK COMPATIBILITY IDEOGRAPH-F94C;Lo;0;L;6A13;;;;N;;;;; -F94D;CJK COMPATIBILITY IDEOGRAPH-F94D;Lo;0;L;6DDA;;;;N;;;;; -F94E;CJK COMPATIBILITY IDEOGRAPH-F94E;Lo;0;L;6F0F;;;;N;;;;; -F94F;CJK COMPATIBILITY IDEOGRAPH-F94F;Lo;0;L;7D2F;;;;N;;;;; -F950;CJK COMPATIBILITY IDEOGRAPH-F950;Lo;0;L;7E37;;;;N;;;;; -F951;CJK COMPATIBILITY IDEOGRAPH-F951;Lo;0;L;964B;;;;N;;;;; -F952;CJK COMPATIBILITY IDEOGRAPH-F952;Lo;0;L;52D2;;;;N;;;;; -F953;CJK COMPATIBILITY IDEOGRAPH-F953;Lo;0;L;808B;;;;N;;;;; -F954;CJK COMPATIBILITY IDEOGRAPH-F954;Lo;0;L;51DC;;;;N;;;;; -F955;CJK COMPATIBILITY IDEOGRAPH-F955;Lo;0;L;51CC;;;;N;;;;; -F956;CJK COMPATIBILITY IDEOGRAPH-F956;Lo;0;L;7A1C;;;;N;;;;; -F957;CJK COMPATIBILITY IDEOGRAPH-F957;Lo;0;L;7DBE;;;;N;;;;; -F958;CJK COMPATIBILITY IDEOGRAPH-F958;Lo;0;L;83F1;;;;N;;;;; -F959;CJK COMPATIBILITY IDEOGRAPH-F959;Lo;0;L;9675;;;;N;;;;; -F95A;CJK COMPATIBILITY IDEOGRAPH-F95A;Lo;0;L;8B80;;;;N;;;;; -F95B;CJK COMPATIBILITY IDEOGRAPH-F95B;Lo;0;L;62CF;;;;N;;;;; -F95C;CJK COMPATIBILITY IDEOGRAPH-F95C;Lo;0;L;6A02;;;;N;;;;; -F95D;CJK COMPATIBILITY IDEOGRAPH-F95D;Lo;0;L;8AFE;;;;N;;;;; -F95E;CJK COMPATIBILITY IDEOGRAPH-F95E;Lo;0;L;4E39;;;;N;;;;; -F95F;CJK COMPATIBILITY IDEOGRAPH-F95F;Lo;0;L;5BE7;;;;N;;;;; -F960;CJK COMPATIBILITY IDEOGRAPH-F960;Lo;0;L;6012;;;;N;;;;; -F961;CJK COMPATIBILITY IDEOGRAPH-F961;Lo;0;L;7387;;;;N;;;;; -F962;CJK COMPATIBILITY IDEOGRAPH-F962;Lo;0;L;7570;;;;N;;;;; -F963;CJK COMPATIBILITY IDEOGRAPH-F963;Lo;0;L;5317;;;;N;;;;; -F964;CJK COMPATIBILITY IDEOGRAPH-F964;Lo;0;L;78FB;;;;N;;;;; -F965;CJK COMPATIBILITY IDEOGRAPH-F965;Lo;0;L;4FBF;;;;N;;;;; -F966;CJK COMPATIBILITY IDEOGRAPH-F966;Lo;0;L;5FA9;;;;N;;;;; -F967;CJK COMPATIBILITY IDEOGRAPH-F967;Lo;0;L;4E0D;;;;N;;;;; -F968;CJK COMPATIBILITY IDEOGRAPH-F968;Lo;0;L;6CCC;;;;N;;;;; -F969;CJK COMPATIBILITY IDEOGRAPH-F969;Lo;0;L;6578;;;;N;;;;; -F96A;CJK COMPATIBILITY IDEOGRAPH-F96A;Lo;0;L;7D22;;;;N;;;;; -F96B;CJK COMPATIBILITY IDEOGRAPH-F96B;Lo;0;L;53C3;;;3;N;;;;; -F96C;CJK COMPATIBILITY IDEOGRAPH-F96C;Lo;0;L;585E;;;;N;;;;; -F96D;CJK COMPATIBILITY IDEOGRAPH-F96D;Lo;0;L;7701;;;;N;;;;; -F96E;CJK COMPATIBILITY IDEOGRAPH-F96E;Lo;0;L;8449;;;;N;;;;; -F96F;CJK COMPATIBILITY IDEOGRAPH-F96F;Lo;0;L;8AAA;;;;N;;;;; -F970;CJK COMPATIBILITY IDEOGRAPH-F970;Lo;0;L;6BBA;;;;N;;;;; -F971;CJK COMPATIBILITY IDEOGRAPH-F971;Lo;0;L;8FB0;;;;N;;;;; -F972;CJK COMPATIBILITY IDEOGRAPH-F972;Lo;0;L;6C88;;;;N;;;;; -F973;CJK COMPATIBILITY IDEOGRAPH-F973;Lo;0;L;62FE;;;10;N;;;;; -F974;CJK COMPATIBILITY IDEOGRAPH-F974;Lo;0;L;82E5;;;;N;;;;; -F975;CJK COMPATIBILITY IDEOGRAPH-F975;Lo;0;L;63A0;;;;N;;;;; -F976;CJK COMPATIBILITY IDEOGRAPH-F976;Lo;0;L;7565;;;;N;;;;; -F977;CJK COMPATIBILITY IDEOGRAPH-F977;Lo;0;L;4EAE;;;;N;;;;; -F978;CJK COMPATIBILITY IDEOGRAPH-F978;Lo;0;L;5169;;;2;N;;;;; -F979;CJK COMPATIBILITY IDEOGRAPH-F979;Lo;0;L;51C9;;;;N;;;;; -F97A;CJK COMPATIBILITY IDEOGRAPH-F97A;Lo;0;L;6881;;;;N;;;;; -F97B;CJK COMPATIBILITY IDEOGRAPH-F97B;Lo;0;L;7CE7;;;;N;;;;; -F97C;CJK COMPATIBILITY IDEOGRAPH-F97C;Lo;0;L;826F;;;;N;;;;; -F97D;CJK COMPATIBILITY IDEOGRAPH-F97D;Lo;0;L;8AD2;;;;N;;;;; -F97E;CJK COMPATIBILITY IDEOGRAPH-F97E;Lo;0;L;91CF;;;;N;;;;; -F97F;CJK COMPATIBILITY IDEOGRAPH-F97F;Lo;0;L;52F5;;;;N;;;;; -F980;CJK COMPATIBILITY IDEOGRAPH-F980;Lo;0;L;5442;;;;N;;;;; -F981;CJK COMPATIBILITY IDEOGRAPH-F981;Lo;0;L;5973;;;;N;;;;; -F982;CJK COMPATIBILITY IDEOGRAPH-F982;Lo;0;L;5EEC;;;;N;;;;; -F983;CJK COMPATIBILITY IDEOGRAPH-F983;Lo;0;L;65C5;;;;N;;;;; -F984;CJK COMPATIBILITY IDEOGRAPH-F984;Lo;0;L;6FFE;;;;N;;;;; -F985;CJK COMPATIBILITY IDEOGRAPH-F985;Lo;0;L;792A;;;;N;;;;; -F986;CJK COMPATIBILITY IDEOGRAPH-F986;Lo;0;L;95AD;;;;N;;;;; -F987;CJK COMPATIBILITY IDEOGRAPH-F987;Lo;0;L;9A6A;;;;N;;;;; -F988;CJK COMPATIBILITY IDEOGRAPH-F988;Lo;0;L;9E97;;;;N;;;;; -F989;CJK COMPATIBILITY IDEOGRAPH-F989;Lo;0;L;9ECE;;;;N;;;;; -F98A;CJK COMPATIBILITY IDEOGRAPH-F98A;Lo;0;L;529B;;;;N;;;;; -F98B;CJK COMPATIBILITY IDEOGRAPH-F98B;Lo;0;L;66C6;;;;N;;;;; -F98C;CJK COMPATIBILITY IDEOGRAPH-F98C;Lo;0;L;6B77;;;;N;;;;; -F98D;CJK COMPATIBILITY IDEOGRAPH-F98D;Lo;0;L;8F62;;;;N;;;;; -F98E;CJK COMPATIBILITY IDEOGRAPH-F98E;Lo;0;L;5E74;;;;N;;;;; -F98F;CJK COMPATIBILITY IDEOGRAPH-F98F;Lo;0;L;6190;;;;N;;;;; -F990;CJK COMPATIBILITY IDEOGRAPH-F990;Lo;0;L;6200;;;;N;;;;; -F991;CJK COMPATIBILITY IDEOGRAPH-F991;Lo;0;L;649A;;;;N;;;;; -F992;CJK COMPATIBILITY IDEOGRAPH-F992;Lo;0;L;6F23;;;;N;;;;; -F993;CJK COMPATIBILITY IDEOGRAPH-F993;Lo;0;L;7149;;;;N;;;;; -F994;CJK COMPATIBILITY IDEOGRAPH-F994;Lo;0;L;7489;;;;N;;;;; -F995;CJK COMPATIBILITY IDEOGRAPH-F995;Lo;0;L;79CA;;;;N;;;;; -F996;CJK COMPATIBILITY IDEOGRAPH-F996;Lo;0;L;7DF4;;;;N;;;;; -F997;CJK COMPATIBILITY IDEOGRAPH-F997;Lo;0;L;806F;;;;N;;;;; -F998;CJK COMPATIBILITY IDEOGRAPH-F998;Lo;0;L;8F26;;;;N;;;;; -F999;CJK COMPATIBILITY IDEOGRAPH-F999;Lo;0;L;84EE;;;;N;;;;; -F99A;CJK COMPATIBILITY IDEOGRAPH-F99A;Lo;0;L;9023;;;;N;;;;; -F99B;CJK COMPATIBILITY IDEOGRAPH-F99B;Lo;0;L;934A;;;;N;;;;; -F99C;CJK COMPATIBILITY IDEOGRAPH-F99C;Lo;0;L;5217;;;;N;;;;; -F99D;CJK COMPATIBILITY IDEOGRAPH-F99D;Lo;0;L;52A3;;;;N;;;;; -F99E;CJK COMPATIBILITY IDEOGRAPH-F99E;Lo;0;L;54BD;;;;N;;;;; -F99F;CJK COMPATIBILITY IDEOGRAPH-F99F;Lo;0;L;70C8;;;;N;;;;; -F9A0;CJK COMPATIBILITY IDEOGRAPH-F9A0;Lo;0;L;88C2;;;;N;;;;; -F9A1;CJK COMPATIBILITY IDEOGRAPH-F9A1;Lo;0;L;8AAA;;;;N;;;;; -F9A2;CJK COMPATIBILITY IDEOGRAPH-F9A2;Lo;0;L;5EC9;;;;N;;;;; -F9A3;CJK COMPATIBILITY IDEOGRAPH-F9A3;Lo;0;L;5FF5;;;;N;;;;; -F9A4;CJK COMPATIBILITY IDEOGRAPH-F9A4;Lo;0;L;637B;;;;N;;;;; -F9A5;CJK COMPATIBILITY IDEOGRAPH-F9A5;Lo;0;L;6BAE;;;;N;;;;; -F9A6;CJK COMPATIBILITY IDEOGRAPH-F9A6;Lo;0;L;7C3E;;;;N;;;;; -F9A7;CJK COMPATIBILITY IDEOGRAPH-F9A7;Lo;0;L;7375;;;;N;;;;; -F9A8;CJK COMPATIBILITY IDEOGRAPH-F9A8;Lo;0;L;4EE4;;;;N;;;;; -F9A9;CJK COMPATIBILITY IDEOGRAPH-F9A9;Lo;0;L;56F9;;;;N;;;;; -F9AA;CJK COMPATIBILITY IDEOGRAPH-F9AA;Lo;0;L;5BE7;;;;N;;;;; -F9AB;CJK COMPATIBILITY IDEOGRAPH-F9AB;Lo;0;L;5DBA;;;;N;;;;; -F9AC;CJK COMPATIBILITY IDEOGRAPH-F9AC;Lo;0;L;601C;;;;N;;;;; -F9AD;CJK COMPATIBILITY IDEOGRAPH-F9AD;Lo;0;L;73B2;;;;N;;;;; -F9AE;CJK COMPATIBILITY IDEOGRAPH-F9AE;Lo;0;L;7469;;;;N;;;;; -F9AF;CJK COMPATIBILITY IDEOGRAPH-F9AF;Lo;0;L;7F9A;;;;N;;;;; -F9B0;CJK COMPATIBILITY IDEOGRAPH-F9B0;Lo;0;L;8046;;;;N;;;;; -F9B1;CJK COMPATIBILITY IDEOGRAPH-F9B1;Lo;0;L;9234;;;;N;;;;; -F9B2;CJK COMPATIBILITY IDEOGRAPH-F9B2;Lo;0;L;96F6;;;0;N;;;;; -F9B3;CJK COMPATIBILITY IDEOGRAPH-F9B3;Lo;0;L;9748;;;;N;;;;; -F9B4;CJK COMPATIBILITY IDEOGRAPH-F9B4;Lo;0;L;9818;;;;N;;;;; -F9B5;CJK COMPATIBILITY IDEOGRAPH-F9B5;Lo;0;L;4F8B;;;;N;;;;; -F9B6;CJK COMPATIBILITY IDEOGRAPH-F9B6;Lo;0;L;79AE;;;;N;;;;; -F9B7;CJK COMPATIBILITY IDEOGRAPH-F9B7;Lo;0;L;91B4;;;;N;;;;; -F9B8;CJK COMPATIBILITY IDEOGRAPH-F9B8;Lo;0;L;96B8;;;;N;;;;; -F9B9;CJK COMPATIBILITY IDEOGRAPH-F9B9;Lo;0;L;60E1;;;;N;;;;; -F9BA;CJK COMPATIBILITY IDEOGRAPH-F9BA;Lo;0;L;4E86;;;;N;;;;; -F9BB;CJK COMPATIBILITY IDEOGRAPH-F9BB;Lo;0;L;50DA;;;;N;;;;; -F9BC;CJK COMPATIBILITY IDEOGRAPH-F9BC;Lo;0;L;5BEE;;;;N;;;;; -F9BD;CJK COMPATIBILITY IDEOGRAPH-F9BD;Lo;0;L;5C3F;;;;N;;;;; -F9BE;CJK COMPATIBILITY IDEOGRAPH-F9BE;Lo;0;L;6599;;;;N;;;;; -F9BF;CJK COMPATIBILITY IDEOGRAPH-F9BF;Lo;0;L;6A02;;;;N;;;;; -F9C0;CJK COMPATIBILITY IDEOGRAPH-F9C0;Lo;0;L;71CE;;;;N;;;;; -F9C1;CJK COMPATIBILITY IDEOGRAPH-F9C1;Lo;0;L;7642;;;;N;;;;; -F9C2;CJK COMPATIBILITY IDEOGRAPH-F9C2;Lo;0;L;84FC;;;;N;;;;; -F9C3;CJK COMPATIBILITY IDEOGRAPH-F9C3;Lo;0;L;907C;;;;N;;;;; -F9C4;CJK COMPATIBILITY IDEOGRAPH-F9C4;Lo;0;L;9F8D;;;;N;;;;; -F9C5;CJK COMPATIBILITY IDEOGRAPH-F9C5;Lo;0;L;6688;;;;N;;;;; -F9C6;CJK COMPATIBILITY IDEOGRAPH-F9C6;Lo;0;L;962E;;;;N;;;;; -F9C7;CJK COMPATIBILITY IDEOGRAPH-F9C7;Lo;0;L;5289;;;;N;;;;; -F9C8;CJK COMPATIBILITY IDEOGRAPH-F9C8;Lo;0;L;677B;;;;N;;;;; -F9C9;CJK COMPATIBILITY IDEOGRAPH-F9C9;Lo;0;L;67F3;;;;N;;;;; -F9CA;CJK COMPATIBILITY IDEOGRAPH-F9CA;Lo;0;L;6D41;;;;N;;;;; -F9CB;CJK COMPATIBILITY IDEOGRAPH-F9CB;Lo;0;L;6E9C;;;;N;;;;; -F9CC;CJK COMPATIBILITY IDEOGRAPH-F9CC;Lo;0;L;7409;;;;N;;;;; -F9CD;CJK COMPATIBILITY IDEOGRAPH-F9CD;Lo;0;L;7559;;;;N;;;;; -F9CE;CJK COMPATIBILITY IDEOGRAPH-F9CE;Lo;0;L;786B;;;;N;;;;; -F9CF;CJK COMPATIBILITY IDEOGRAPH-F9CF;Lo;0;L;7D10;;;;N;;;;; -F9D0;CJK COMPATIBILITY IDEOGRAPH-F9D0;Lo;0;L;985E;;;;N;;;;; -F9D1;CJK COMPATIBILITY IDEOGRAPH-F9D1;Lo;0;L;516D;;;6;N;;;;; -F9D2;CJK COMPATIBILITY IDEOGRAPH-F9D2;Lo;0;L;622E;;;;N;;;;; -F9D3;CJK COMPATIBILITY IDEOGRAPH-F9D3;Lo;0;L;9678;;;6;N;;;;; -F9D4;CJK COMPATIBILITY IDEOGRAPH-F9D4;Lo;0;L;502B;;;;N;;;;; -F9D5;CJK COMPATIBILITY IDEOGRAPH-F9D5;Lo;0;L;5D19;;;;N;;;;; -F9D6;CJK COMPATIBILITY IDEOGRAPH-F9D6;Lo;0;L;6DEA;;;;N;;;;; -F9D7;CJK COMPATIBILITY IDEOGRAPH-F9D7;Lo;0;L;8F2A;;;;N;;;;; -F9D8;CJK COMPATIBILITY IDEOGRAPH-F9D8;Lo;0;L;5F8B;;;;N;;;;; -F9D9;CJK COMPATIBILITY IDEOGRAPH-F9D9;Lo;0;L;6144;;;;N;;;;; -F9DA;CJK COMPATIBILITY IDEOGRAPH-F9DA;Lo;0;L;6817;;;;N;;;;; -F9DB;CJK COMPATIBILITY IDEOGRAPH-F9DB;Lo;0;L;7387;;;;N;;;;; -F9DC;CJK COMPATIBILITY IDEOGRAPH-F9DC;Lo;0;L;9686;;;;N;;;;; -F9DD;CJK COMPATIBILITY IDEOGRAPH-F9DD;Lo;0;L;5229;;;;N;;;;; -F9DE;CJK COMPATIBILITY IDEOGRAPH-F9DE;Lo;0;L;540F;;;;N;;;;; -F9DF;CJK COMPATIBILITY IDEOGRAPH-F9DF;Lo;0;L;5C65;;;;N;;;;; -F9E0;CJK COMPATIBILITY IDEOGRAPH-F9E0;Lo;0;L;6613;;;;N;;;;; -F9E1;CJK COMPATIBILITY IDEOGRAPH-F9E1;Lo;0;L;674E;;;;N;;;;; -F9E2;CJK COMPATIBILITY IDEOGRAPH-F9E2;Lo;0;L;68A8;;;;N;;;;; -F9E3;CJK COMPATIBILITY IDEOGRAPH-F9E3;Lo;0;L;6CE5;;;;N;;;;; -F9E4;CJK COMPATIBILITY IDEOGRAPH-F9E4;Lo;0;L;7406;;;;N;;;;; -F9E5;CJK COMPATIBILITY IDEOGRAPH-F9E5;Lo;0;L;75E2;;;;N;;;;; -F9E6;CJK COMPATIBILITY IDEOGRAPH-F9E6;Lo;0;L;7F79;;;;N;;;;; -F9E7;CJK COMPATIBILITY IDEOGRAPH-F9E7;Lo;0;L;88CF;;;;N;;;;; -F9E8;CJK COMPATIBILITY IDEOGRAPH-F9E8;Lo;0;L;88E1;;;;N;;;;; -F9E9;CJK COMPATIBILITY IDEOGRAPH-F9E9;Lo;0;L;91CC;;;;N;;;;; -F9EA;CJK COMPATIBILITY IDEOGRAPH-F9EA;Lo;0;L;96E2;;;;N;;;;; -F9EB;CJK COMPATIBILITY IDEOGRAPH-F9EB;Lo;0;L;533F;;;;N;;;;; -F9EC;CJK COMPATIBILITY IDEOGRAPH-F9EC;Lo;0;L;6EBA;;;;N;;;;; -F9ED;CJK COMPATIBILITY IDEOGRAPH-F9ED;Lo;0;L;541D;;;;N;;;;; -F9EE;CJK COMPATIBILITY IDEOGRAPH-F9EE;Lo;0;L;71D0;;;;N;;;;; -F9EF;CJK COMPATIBILITY IDEOGRAPH-F9EF;Lo;0;L;7498;;;;N;;;;; -F9F0;CJK COMPATIBILITY IDEOGRAPH-F9F0;Lo;0;L;85FA;;;;N;;;;; -F9F1;CJK COMPATIBILITY IDEOGRAPH-F9F1;Lo;0;L;96A3;;;;N;;;;; -F9F2;CJK COMPATIBILITY IDEOGRAPH-F9F2;Lo;0;L;9C57;;;;N;;;;; -F9F3;CJK COMPATIBILITY IDEOGRAPH-F9F3;Lo;0;L;9E9F;;;;N;;;;; -F9F4;CJK COMPATIBILITY IDEOGRAPH-F9F4;Lo;0;L;6797;;;;N;;;;; -F9F5;CJK COMPATIBILITY IDEOGRAPH-F9F5;Lo;0;L;6DCB;;;;N;;;;; -F9F6;CJK COMPATIBILITY IDEOGRAPH-F9F6;Lo;0;L;81E8;;;;N;;;;; -F9F7;CJK COMPATIBILITY IDEOGRAPH-F9F7;Lo;0;L;7ACB;;;;N;;;;; -F9F8;CJK COMPATIBILITY IDEOGRAPH-F9F8;Lo;0;L;7B20;;;;N;;;;; -F9F9;CJK COMPATIBILITY IDEOGRAPH-F9F9;Lo;0;L;7C92;;;;N;;;;; -F9FA;CJK COMPATIBILITY IDEOGRAPH-F9FA;Lo;0;L;72C0;;;;N;;;;; -F9FB;CJK COMPATIBILITY IDEOGRAPH-F9FB;Lo;0;L;7099;;;;N;;;;; -F9FC;CJK COMPATIBILITY IDEOGRAPH-F9FC;Lo;0;L;8B58;;;;N;;;;; -F9FD;CJK COMPATIBILITY IDEOGRAPH-F9FD;Lo;0;L;4EC0;;;10;N;;;;; -F9FE;CJK COMPATIBILITY IDEOGRAPH-F9FE;Lo;0;L;8336;;;;N;;;;; -F9FF;CJK COMPATIBILITY IDEOGRAPH-F9FF;Lo;0;L;523A;;;;N;;;;; -FA00;CJK COMPATIBILITY IDEOGRAPH-FA00;Lo;0;L;5207;;;;N;;;;; -FA01;CJK COMPATIBILITY IDEOGRAPH-FA01;Lo;0;L;5EA6;;;;N;;;;; -FA02;CJK COMPATIBILITY IDEOGRAPH-FA02;Lo;0;L;62D3;;;;N;;;;; -FA03;CJK COMPATIBILITY IDEOGRAPH-FA03;Lo;0;L;7CD6;;;;N;;;;; -FA04;CJK COMPATIBILITY IDEOGRAPH-FA04;Lo;0;L;5B85;;;;N;;;;; -FA05;CJK COMPATIBILITY IDEOGRAPH-FA05;Lo;0;L;6D1E;;;;N;;;;; -FA06;CJK COMPATIBILITY IDEOGRAPH-FA06;Lo;0;L;66B4;;;;N;;;;; -FA07;CJK COMPATIBILITY IDEOGRAPH-FA07;Lo;0;L;8F3B;;;;N;;;;; -FA08;CJK COMPATIBILITY IDEOGRAPH-FA08;Lo;0;L;884C;;;;N;;;;; -FA09;CJK COMPATIBILITY IDEOGRAPH-FA09;Lo;0;L;964D;;;;N;;;;; -FA0A;CJK COMPATIBILITY IDEOGRAPH-FA0A;Lo;0;L;898B;;;;N;;;;; -FA0B;CJK COMPATIBILITY IDEOGRAPH-FA0B;Lo;0;L;5ED3;;;;N;;;;; -FA0C;CJK COMPATIBILITY IDEOGRAPH-FA0C;Lo;0;L;5140;;;;N;;;;; -FA0D;CJK COMPATIBILITY IDEOGRAPH-FA0D;Lo;0;L;55C0;;;;N;;;;; -FA0E;CJK COMPATIBILITY IDEOGRAPH-FA0E;Lo;0;L;;;;;N;;;;; -FA0F;CJK COMPATIBILITY IDEOGRAPH-FA0F;Lo;0;L;;;;;N;;;;; -FA10;CJK COMPATIBILITY IDEOGRAPH-FA10;Lo;0;L;585A;;;;N;;;;; -FA11;CJK COMPATIBILITY IDEOGRAPH-FA11;Lo;0;L;;;;;N;;;;; -FA12;CJK COMPATIBILITY IDEOGRAPH-FA12;Lo;0;L;6674;;;;N;;;;; -FA13;CJK COMPATIBILITY IDEOGRAPH-FA13;Lo;0;L;;;;;N;;;;; -FA14;CJK COMPATIBILITY IDEOGRAPH-FA14;Lo;0;L;;;;;N;;;;; -FA15;CJK COMPATIBILITY IDEOGRAPH-FA15;Lo;0;L;51DE;;;;N;;;;; -FA16;CJK COMPATIBILITY IDEOGRAPH-FA16;Lo;0;L;732A;;;;N;;;;; -FA17;CJK COMPATIBILITY IDEOGRAPH-FA17;Lo;0;L;76CA;;;;N;;;;; -FA18;CJK COMPATIBILITY IDEOGRAPH-FA18;Lo;0;L;793C;;;;N;;;;; -FA19;CJK COMPATIBILITY IDEOGRAPH-FA19;Lo;0;L;795E;;;;N;;;;; -FA1A;CJK COMPATIBILITY IDEOGRAPH-FA1A;Lo;0;L;7965;;;;N;;;;; -FA1B;CJK COMPATIBILITY IDEOGRAPH-FA1B;Lo;0;L;798F;;;;N;;;;; -FA1C;CJK COMPATIBILITY IDEOGRAPH-FA1C;Lo;0;L;9756;;;;N;;;;; -FA1D;CJK COMPATIBILITY IDEOGRAPH-FA1D;Lo;0;L;7CBE;;;;N;;;;; -FA1E;CJK COMPATIBILITY IDEOGRAPH-FA1E;Lo;0;L;7FBD;;;;N;;;;; -FA1F;CJK COMPATIBILITY IDEOGRAPH-FA1F;Lo;0;L;;;;;N;;;;; -FA20;CJK COMPATIBILITY IDEOGRAPH-FA20;Lo;0;L;8612;;;;N;;;;; -FA21;CJK COMPATIBILITY IDEOGRAPH-FA21;Lo;0;L;;;;;N;;;;; -FA22;CJK COMPATIBILITY IDEOGRAPH-FA22;Lo;0;L;8AF8;;;;N;;;;; -FA23;CJK COMPATIBILITY IDEOGRAPH-FA23;Lo;0;L;;;;;N;;;;; -FA24;CJK COMPATIBILITY IDEOGRAPH-FA24;Lo;0;L;;;;;N;;;;; -FA25;CJK COMPATIBILITY IDEOGRAPH-FA25;Lo;0;L;9038;;;;N;;;;; -FA26;CJK COMPATIBILITY IDEOGRAPH-FA26;Lo;0;L;90FD;;;;N;;;;; -FA27;CJK COMPATIBILITY IDEOGRAPH-FA27;Lo;0;L;;;;;N;;;;; -FA28;CJK COMPATIBILITY IDEOGRAPH-FA28;Lo;0;L;;;;;N;;;;; -FA29;CJK COMPATIBILITY IDEOGRAPH-FA29;Lo;0;L;;;;;N;;;;; -FA2A;CJK COMPATIBILITY IDEOGRAPH-FA2A;Lo;0;L;98EF;;;;N;;;;; -FA2B;CJK COMPATIBILITY IDEOGRAPH-FA2B;Lo;0;L;98FC;;;;N;;;;; -FA2C;CJK COMPATIBILITY IDEOGRAPH-FA2C;Lo;0;L;9928;;;;N;;;;; -FA2D;CJK COMPATIBILITY IDEOGRAPH-FA2D;Lo;0;L;9DB4;;;;N;;;;; -FA2E;CJK COMPATIBILITY IDEOGRAPH-FA2E;Lo;0;L;90DE;;;;N;;;;; -FA2F;CJK COMPATIBILITY IDEOGRAPH-FA2F;Lo;0;L;96B7;;;;N;;;;; -FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;; -FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;; -FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;; -FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;; -FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;; -FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;; -FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;; -FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;; -FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;; -FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;; -FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;; -FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;; -FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;; -FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;; -FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;; -FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;; -FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;; -FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;; -FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;; -FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;; -FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;; -FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;; -FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;; -FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;; -FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;; -FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;; -FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;; -FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;; -FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;; -FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;; -FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;; -FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;; -FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;; -FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;; -FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;; -FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;; -FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;; -FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;; -FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;; -FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;; -FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;; -FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;; -FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;; -FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;; -FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;; -FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;; -FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;; -FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;; -FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;; -FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;; -FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;; -FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;; -FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;; -FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;; -FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;; -FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;; -FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;; -FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;; -FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;; -FA6B;CJK COMPATIBILITY IDEOGRAPH-FA6B;Lo;0;L;6075;;;;N;;;;; -FA6C;CJK COMPATIBILITY IDEOGRAPH-FA6C;Lo;0;L;242EE;;;;N;;;;; -FA6D;CJK COMPATIBILITY IDEOGRAPH-FA6D;Lo;0;L;8218;;;;N;;;;; -FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;; -FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;; -FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;; -FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;; -FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;; -FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;; -FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;; -FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;; -FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;; -FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;; -FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;; -FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;; -FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;; -FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;; -FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;; -FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;; -FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;; -FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;; -FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;; -FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;; -FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;; -FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;; -FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;; -FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;; -FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;; -FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;; -FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;; -FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;; -FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;; -FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;; -FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;; -FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;; -FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;; -FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;; -FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;; -FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;; -FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;; -FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;; -FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;; -FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;; -FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;; -FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;; -FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;; -FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;; -FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;; -FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;; -FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;; -FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;; -FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;; -FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;; -FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;; -FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;; -FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;; -FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;; -FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;; -FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;; -FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;; -FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;; -FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;; -FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;; -FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;; -FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;; -FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;; -FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;; -FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;; -FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;; -FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;; -FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;; -FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;; -FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;; -FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;; -FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;; -FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;; -FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;; -FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;; -FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;; -FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;; -FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;; -FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;; -FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;; -FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;; -FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;; -FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;; -FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;; -FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;; -FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;; -FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;; -FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;; -FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;; -FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;; -FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;; -FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;; -FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;; -FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;; -FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;; -FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;; -FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;; -FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;; -FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;; -FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;; -FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;; -FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;; -FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;; -FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;; -FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;; -FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;N;;;;; -FB00;LATIN SMALL LIGATURE FF;Ll;0;L; 0066 0066;;;;N;;;;; -FB01;LATIN SMALL LIGATURE FI;Ll;0;L; 0066 0069;;;;N;;;;; -FB02;LATIN SMALL LIGATURE FL;Ll;0;L; 0066 006C;;;;N;;;;; -FB03;LATIN SMALL LIGATURE FFI;Ll;0;L; 0066 0066 0069;;;;N;;;;; -FB04;LATIN SMALL LIGATURE FFL;Ll;0;L; 0066 0066 006C;;;;N;;;;; -FB05;LATIN SMALL LIGATURE LONG S T;Ll;0;L; 017F 0074;;;;N;;;;; -FB06;LATIN SMALL LIGATURE ST;Ll;0;L; 0073 0074;;;;N;;;;; -FB13;ARMENIAN SMALL LIGATURE MEN NOW;Ll;0;L; 0574 0576;;;;N;;;;; -FB14;ARMENIAN SMALL LIGATURE MEN ECH;Ll;0;L; 0574 0565;;;;N;;;;; -FB15;ARMENIAN SMALL LIGATURE MEN INI;Ll;0;L; 0574 056B;;;;N;;;;; -FB16;ARMENIAN SMALL LIGATURE VEW NOW;Ll;0;L; 057E 0576;;;;N;;;;; -FB17;ARMENIAN SMALL LIGATURE MEN XEH;Ll;0;L; 0574 056D;;;;N;;;;; -FB1D;HEBREW LETTER YOD WITH HIRIQ;Lo;0;R;05D9 05B4;;;;N;;;;; -FB1E;HEBREW POINT JUDEO-SPANISH VARIKA;Mn;26;NSM;;;;;N;HEBREW POINT VARIKA;;;; -FB1F;HEBREW LIGATURE YIDDISH YOD YOD PATAH;Lo;0;R;05F2 05B7;;;;N;;;;; -FB20;HEBREW LETTER ALTERNATIVE AYIN;Lo;0;R; 05E2;;;;N;;;;; -FB21;HEBREW LETTER WIDE ALEF;Lo;0;R; 05D0;;;;N;;;;; -FB22;HEBREW LETTER WIDE DALET;Lo;0;R; 05D3;;;;N;;;;; -FB23;HEBREW LETTER WIDE HE;Lo;0;R; 05D4;;;;N;;;;; -FB24;HEBREW LETTER WIDE KAF;Lo;0;R; 05DB;;;;N;;;;; -FB25;HEBREW LETTER WIDE LAMED;Lo;0;R; 05DC;;;;N;;;;; -FB26;HEBREW LETTER WIDE FINAL MEM;Lo;0;R; 05DD;;;;N;;;;; -FB27;HEBREW LETTER WIDE RESH;Lo;0;R; 05E8;;;;N;;;;; -FB28;HEBREW LETTER WIDE TAV;Lo;0;R; 05EA;;;;N;;;;; -FB29;HEBREW LETTER ALTERNATIVE PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -FB2A;HEBREW LETTER SHIN WITH SHIN DOT;Lo;0;R;05E9 05C1;;;;N;;;;; -FB2B;HEBREW LETTER SHIN WITH SIN DOT;Lo;0;R;05E9 05C2;;;;N;;;;; -FB2C;HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT;Lo;0;R;FB49 05C1;;;;N;;;;; -FB2D;HEBREW LETTER SHIN WITH DAGESH AND SIN DOT;Lo;0;R;FB49 05C2;;;;N;;;;; -FB2E;HEBREW LETTER ALEF WITH PATAH;Lo;0;R;05D0 05B7;;;;N;;;;; -FB2F;HEBREW LETTER ALEF WITH QAMATS;Lo;0;R;05D0 05B8;;;;N;;;;; -FB30;HEBREW LETTER ALEF WITH MAPIQ;Lo;0;R;05D0 05BC;;;;N;;;;; -FB31;HEBREW LETTER BET WITH DAGESH;Lo;0;R;05D1 05BC;;;;N;;;;; -FB32;HEBREW LETTER GIMEL WITH DAGESH;Lo;0;R;05D2 05BC;;;;N;;;;; -FB33;HEBREW LETTER DALET WITH DAGESH;Lo;0;R;05D3 05BC;;;;N;;;;; -FB34;HEBREW LETTER HE WITH MAPIQ;Lo;0;R;05D4 05BC;;;;N;;;;; -FB35;HEBREW LETTER VAV WITH DAGESH;Lo;0;R;05D5 05BC;;;;N;;;;; -FB36;HEBREW LETTER ZAYIN WITH DAGESH;Lo;0;R;05D6 05BC;;;;N;;;;; -FB38;HEBREW LETTER TET WITH DAGESH;Lo;0;R;05D8 05BC;;;;N;;;;; -FB39;HEBREW LETTER YOD WITH DAGESH;Lo;0;R;05D9 05BC;;;;N;;;;; -FB3A;HEBREW LETTER FINAL KAF WITH DAGESH;Lo;0;R;05DA 05BC;;;;N;;;;; -FB3B;HEBREW LETTER KAF WITH DAGESH;Lo;0;R;05DB 05BC;;;;N;;;;; -FB3C;HEBREW LETTER LAMED WITH DAGESH;Lo;0;R;05DC 05BC;;;;N;;;;; -FB3E;HEBREW LETTER MEM WITH DAGESH;Lo;0;R;05DE 05BC;;;;N;;;;; -FB40;HEBREW LETTER NUN WITH DAGESH;Lo;0;R;05E0 05BC;;;;N;;;;; -FB41;HEBREW LETTER SAMEKH WITH DAGESH;Lo;0;R;05E1 05BC;;;;N;;;;; -FB43;HEBREW LETTER FINAL PE WITH DAGESH;Lo;0;R;05E3 05BC;;;;N;;;;; -FB44;HEBREW LETTER PE WITH DAGESH;Lo;0;R;05E4 05BC;;;;N;;;;; -FB46;HEBREW LETTER TSADI WITH DAGESH;Lo;0;R;05E6 05BC;;;;N;;;;; -FB47;HEBREW LETTER QOF WITH DAGESH;Lo;0;R;05E7 05BC;;;;N;;;;; -FB48;HEBREW LETTER RESH WITH DAGESH;Lo;0;R;05E8 05BC;;;;N;;;;; -FB49;HEBREW LETTER SHIN WITH DAGESH;Lo;0;R;05E9 05BC;;;;N;;;;; -FB4A;HEBREW LETTER TAV WITH DAGESH;Lo;0;R;05EA 05BC;;;;N;;;;; -FB4B;HEBREW LETTER VAV WITH HOLAM;Lo;0;R;05D5 05B9;;;;N;;;;; -FB4C;HEBREW LETTER BET WITH RAFE;Lo;0;R;05D1 05BF;;;;N;;;;; -FB4D;HEBREW LETTER KAF WITH RAFE;Lo;0;R;05DB 05BF;;;;N;;;;; -FB4E;HEBREW LETTER PE WITH RAFE;Lo;0;R;05E4 05BF;;;;N;;;;; -FB4F;HEBREW LIGATURE ALEF LAMED;Lo;0;R; 05D0 05DC;;;;N;;;;; -FB50;ARABIC LETTER ALEF WASLA ISOLATED FORM;Lo;0;AL; 0671;;;;N;;;;; -FB51;ARABIC LETTER ALEF WASLA FINAL FORM;Lo;0;AL; 0671;;;;N;;;;; -FB52;ARABIC LETTER BEEH ISOLATED FORM;Lo;0;AL; 067B;;;;N;;;;; -FB53;ARABIC LETTER BEEH FINAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB54;ARABIC LETTER BEEH INITIAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB55;ARABIC LETTER BEEH MEDIAL FORM;Lo;0;AL; 067B;;;;N;;;;; -FB56;ARABIC LETTER PEH ISOLATED FORM;Lo;0;AL; 067E;;;;N;;;;; -FB57;ARABIC LETTER PEH FINAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB58;ARABIC LETTER PEH INITIAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB59;ARABIC LETTER PEH MEDIAL FORM;Lo;0;AL; 067E;;;;N;;;;; -FB5A;ARABIC LETTER BEHEH ISOLATED FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5B;ARABIC LETTER BEHEH FINAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5C;ARABIC LETTER BEHEH INITIAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5D;ARABIC LETTER BEHEH MEDIAL FORM;Lo;0;AL; 0680;;;;N;;;;; -FB5E;ARABIC LETTER TTEHEH ISOLATED FORM;Lo;0;AL; 067A;;;;N;;;;; -FB5F;ARABIC LETTER TTEHEH FINAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB60;ARABIC LETTER TTEHEH INITIAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB61;ARABIC LETTER TTEHEH MEDIAL FORM;Lo;0;AL; 067A;;;;N;;;;; -FB62;ARABIC LETTER TEHEH ISOLATED FORM;Lo;0;AL; 067F;;;;N;;;;; -FB63;ARABIC LETTER TEHEH FINAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB64;ARABIC LETTER TEHEH INITIAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB65;ARABIC LETTER TEHEH MEDIAL FORM;Lo;0;AL; 067F;;;;N;;;;; -FB66;ARABIC LETTER TTEH ISOLATED FORM;Lo;0;AL; 0679;;;;N;;;;; -FB67;ARABIC LETTER TTEH FINAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB68;ARABIC LETTER TTEH INITIAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB69;ARABIC LETTER TTEH MEDIAL FORM;Lo;0;AL; 0679;;;;N;;;;; -FB6A;ARABIC LETTER VEH ISOLATED FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6B;ARABIC LETTER VEH FINAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6C;ARABIC LETTER VEH INITIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6D;ARABIC LETTER VEH MEDIAL FORM;Lo;0;AL; 06A4;;;;N;;;;; -FB6E;ARABIC LETTER PEHEH ISOLATED FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB6F;ARABIC LETTER PEHEH FINAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB70;ARABIC LETTER PEHEH INITIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB71;ARABIC LETTER PEHEH MEDIAL FORM;Lo;0;AL; 06A6;;;;N;;;;; -FB72;ARABIC LETTER DYEH ISOLATED FORM;Lo;0;AL; 0684;;;;N;;;;; -FB73;ARABIC LETTER DYEH FINAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB74;ARABIC LETTER DYEH INITIAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB75;ARABIC LETTER DYEH MEDIAL FORM;Lo;0;AL; 0684;;;;N;;;;; -FB76;ARABIC LETTER NYEH ISOLATED FORM;Lo;0;AL; 0683;;;;N;;;;; -FB77;ARABIC LETTER NYEH FINAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB78;ARABIC LETTER NYEH INITIAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB79;ARABIC LETTER NYEH MEDIAL FORM;Lo;0;AL; 0683;;;;N;;;;; -FB7A;ARABIC LETTER TCHEH ISOLATED FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7B;ARABIC LETTER TCHEH FINAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7C;ARABIC LETTER TCHEH INITIAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7D;ARABIC LETTER TCHEH MEDIAL FORM;Lo;0;AL; 0686;;;;N;;;;; -FB7E;ARABIC LETTER TCHEHEH ISOLATED FORM;Lo;0;AL; 0687;;;;N;;;;; -FB7F;ARABIC LETTER TCHEHEH FINAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB80;ARABIC LETTER TCHEHEH INITIAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB81;ARABIC LETTER TCHEHEH MEDIAL FORM;Lo;0;AL; 0687;;;;N;;;;; -FB82;ARABIC LETTER DDAHAL ISOLATED FORM;Lo;0;AL; 068D;;;;N;;;;; -FB83;ARABIC LETTER DDAHAL FINAL FORM;Lo;0;AL; 068D;;;;N;;;;; -FB84;ARABIC LETTER DAHAL ISOLATED FORM;Lo;0;AL; 068C;;;;N;;;;; -FB85;ARABIC LETTER DAHAL FINAL FORM;Lo;0;AL; 068C;;;;N;;;;; -FB86;ARABIC LETTER DUL ISOLATED FORM;Lo;0;AL; 068E;;;;N;;;;; -FB87;ARABIC LETTER DUL FINAL FORM;Lo;0;AL; 068E;;;;N;;;;; -FB88;ARABIC LETTER DDAL ISOLATED FORM;Lo;0;AL; 0688;;;;N;;;;; -FB89;ARABIC LETTER DDAL FINAL FORM;Lo;0;AL; 0688;;;;N;;;;; -FB8A;ARABIC LETTER JEH ISOLATED FORM;Lo;0;AL; 0698;;;;N;;;;; -FB8B;ARABIC LETTER JEH FINAL FORM;Lo;0;AL; 0698;;;;N;;;;; -FB8C;ARABIC LETTER RREH ISOLATED FORM;Lo;0;AL; 0691;;;;N;;;;; -FB8D;ARABIC LETTER RREH FINAL FORM;Lo;0;AL; 0691;;;;N;;;;; -FB8E;ARABIC LETTER KEHEH ISOLATED FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB8F;ARABIC LETTER KEHEH FINAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB90;ARABIC LETTER KEHEH INITIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB91;ARABIC LETTER KEHEH MEDIAL FORM;Lo;0;AL; 06A9;;;;N;;;;; -FB92;ARABIC LETTER GAF ISOLATED FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB93;ARABIC LETTER GAF FINAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB94;ARABIC LETTER GAF INITIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB95;ARABIC LETTER GAF MEDIAL FORM;Lo;0;AL; 06AF;;;;N;;;;; -FB96;ARABIC LETTER GUEH ISOLATED FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB97;ARABIC LETTER GUEH FINAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB98;ARABIC LETTER GUEH INITIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB99;ARABIC LETTER GUEH MEDIAL FORM;Lo;0;AL; 06B3;;;;N;;;;; -FB9A;ARABIC LETTER NGOEH ISOLATED FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9B;ARABIC LETTER NGOEH FINAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9C;ARABIC LETTER NGOEH INITIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9D;ARABIC LETTER NGOEH MEDIAL FORM;Lo;0;AL; 06B1;;;;N;;;;; -FB9E;ARABIC LETTER NOON GHUNNA ISOLATED FORM;Lo;0;AL; 06BA;;;;N;;;;; -FB9F;ARABIC LETTER NOON GHUNNA FINAL FORM;Lo;0;AL; 06BA;;;;N;;;;; -FBA0;ARABIC LETTER RNOON ISOLATED FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA1;ARABIC LETTER RNOON FINAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA2;ARABIC LETTER RNOON INITIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA3;ARABIC LETTER RNOON MEDIAL FORM;Lo;0;AL; 06BB;;;;N;;;;; -FBA4;ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM;Lo;0;AL; 06C0;;;;N;;;;; -FBA5;ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM;Lo;0;AL; 06C0;;;;N;;;;; -FBA6;ARABIC LETTER HEH GOAL ISOLATED FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA7;ARABIC LETTER HEH GOAL FINAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA8;ARABIC LETTER HEH GOAL INITIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBA9;ARABIC LETTER HEH GOAL MEDIAL FORM;Lo;0;AL; 06C1;;;;N;;;;; -FBAA;ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAB;ARABIC LETTER HEH DOACHASHMEE FINAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAC;ARABIC LETTER HEH DOACHASHMEE INITIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAD;ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM;Lo;0;AL; 06BE;;;;N;;;;; -FBAE;ARABIC LETTER YEH BARREE ISOLATED FORM;Lo;0;AL; 06D2;;;;N;;;;; -FBAF;ARABIC LETTER YEH BARREE FINAL FORM;Lo;0;AL; 06D2;;;;N;;;;; -FBB0;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 06D3;;;;N;;;;; -FBB1;ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 06D3;;;;N;;;;; -FBB2;ARABIC SYMBOL DOT ABOVE;Sk;0;AL;;;;;N;;;;; -FBB3;ARABIC SYMBOL DOT BELOW;Sk;0;AL;;;;;N;;;;; -FBB4;ARABIC SYMBOL TWO DOTS ABOVE;Sk;0;AL;;;;;N;;;;; -FBB5;ARABIC SYMBOL TWO DOTS BELOW;Sk;0;AL;;;;;N;;;;; -FBB6;ARABIC SYMBOL THREE DOTS ABOVE;Sk;0;AL;;;;;N;;;;; -FBB7;ARABIC SYMBOL THREE DOTS BELOW;Sk;0;AL;;;;;N;;;;; -FBB8;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS ABOVE;Sk;0;AL;;;;;N;;;;; -FBB9;ARABIC SYMBOL THREE DOTS POINTING DOWNWARDS BELOW;Sk;0;AL;;;;;N;;;;; -FBBA;ARABIC SYMBOL FOUR DOTS ABOVE;Sk;0;AL;;;;;N;;;;; -FBBB;ARABIC SYMBOL FOUR DOTS BELOW;Sk;0;AL;;;;;N;;;;; -FBBC;ARABIC SYMBOL DOUBLE VERTICAL BAR BELOW;Sk;0;AL;;;;;N;;;;; -FBBD;ARABIC SYMBOL TWO DOTS VERTICALLY ABOVE;Sk;0;AL;;;;;N;;;;; -FBBE;ARABIC SYMBOL TWO DOTS VERTICALLY BELOW;Sk;0;AL;;;;;N;;;;; -FBBF;ARABIC SYMBOL RING;Sk;0;AL;;;;;N;;;;; -FBC0;ARABIC SYMBOL SMALL TAH ABOVE;Sk;0;AL;;;;;N;;;;; -FBC1;ARABIC SYMBOL SMALL TAH BELOW;Sk;0;AL;;;;;N;;;;; -FBD3;ARABIC LETTER NG ISOLATED FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD4;ARABIC LETTER NG FINAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD5;ARABIC LETTER NG INITIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD6;ARABIC LETTER NG MEDIAL FORM;Lo;0;AL; 06AD;;;;N;;;;; -FBD7;ARABIC LETTER U ISOLATED FORM;Lo;0;AL; 06C7;;;;N;;;;; -FBD8;ARABIC LETTER U FINAL FORM;Lo;0;AL; 06C7;;;;N;;;;; -FBD9;ARABIC LETTER OE ISOLATED FORM;Lo;0;AL; 06C6;;;;N;;;;; -FBDA;ARABIC LETTER OE FINAL FORM;Lo;0;AL; 06C6;;;;N;;;;; -FBDB;ARABIC LETTER YU ISOLATED FORM;Lo;0;AL; 06C8;;;;N;;;;; -FBDC;ARABIC LETTER YU FINAL FORM;Lo;0;AL; 06C8;;;;N;;;;; -FBDD;ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0677;;;;N;;;;; -FBDE;ARABIC LETTER VE ISOLATED FORM;Lo;0;AL; 06CB;;;;N;;;;; -FBDF;ARABIC LETTER VE FINAL FORM;Lo;0;AL; 06CB;;;;N;;;;; -FBE0;ARABIC LETTER KIRGHIZ OE ISOLATED FORM;Lo;0;AL; 06C5;;;;N;;;;; -FBE1;ARABIC LETTER KIRGHIZ OE FINAL FORM;Lo;0;AL; 06C5;;;;N;;;;; -FBE2;ARABIC LETTER KIRGHIZ YU ISOLATED FORM;Lo;0;AL; 06C9;;;;N;;;;; -FBE3;ARABIC LETTER KIRGHIZ YU FINAL FORM;Lo;0;AL; 06C9;;;;N;;;;; -FBE4;ARABIC LETTER E ISOLATED FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE5;ARABIC LETTER E FINAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE6;ARABIC LETTER E INITIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE7;ARABIC LETTER E MEDIAL FORM;Lo;0;AL; 06D0;;;;N;;;;; -FBE8;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0649;;;;N;;;;; -FBE9;ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM;Lo;0;AL; 0649;;;;N;;;;; -FBEA;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM;Lo;0;AL; 0626 0627;;;;N;;;;; -FBEB;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM;Lo;0;AL; 0626 0627;;;;N;;;;; -FBEC;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; -FBED;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM;Lo;0;AL; 0626 06D5;;;;N;;;;; -FBEE;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM;Lo;0;AL; 0626 0648;;;;N;;;;; -FBEF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM;Lo;0;AL; 0626 0648;;;;N;;;;; -FBF0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; -FBF1;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM;Lo;0;AL; 0626 06C7;;;;N;;;;; -FBF2;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; -FBF3;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM;Lo;0;AL; 0626 06C6;;;;N;;;;; -FBF4;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; -FBF5;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM;Lo;0;AL; 0626 06C8;;;;N;;;;; -FBF6;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF7;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF8;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM;Lo;0;AL; 0626 06D0;;;;N;;;;; -FBF9;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFA;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFB;ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FBFC;ARABIC LETTER FARSI YEH ISOLATED FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFD;ARABIC LETTER FARSI YEH FINAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFE;ARABIC LETTER FARSI YEH INITIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FBFF;ARABIC LETTER FARSI YEH MEDIAL FORM;Lo;0;AL; 06CC;;;;N;;;;; -FC00;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM;Lo;0;AL; 0626 062C;;;;N;;;;; -FC01;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM;Lo;0;AL; 0626 062D;;;;N;;;;; -FC02;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC03;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FC04;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM;Lo;0;AL; 0626 064A;;;;N;;;;; -FC05;ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0628 062C;;;;N;;;;; -FC06;ARABIC LIGATURE BEH WITH HAH ISOLATED FORM;Lo;0;AL; 0628 062D;;;;N;;;;; -FC07;ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0628 062E;;;;N;;;;; -FC08;ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FC09;ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0628 0649;;;;N;;;;; -FC0A;ARABIC LIGATURE BEH WITH YEH ISOLATED FORM;Lo;0;AL; 0628 064A;;;;N;;;;; -FC0B;ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062A 062C;;;;N;;;;; -FC0C;ARABIC LIGATURE TEH WITH HAH ISOLATED FORM;Lo;0;AL; 062A 062D;;;;N;;;;; -FC0D;ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM;Lo;0;AL; 062A 062E;;;;N;;;;; -FC0E;ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FC0F;ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062A 0649;;;;N;;;;; -FC10;ARABIC LIGATURE TEH WITH YEH ISOLATED FORM;Lo;0;AL; 062A 064A;;;;N;;;;; -FC11;ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM;Lo;0;AL; 062B 062C;;;;N;;;;; -FC12;ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FC13;ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062B 0649;;;;N;;;;; -FC14;ARABIC LIGATURE THEH WITH YEH ISOLATED FORM;Lo;0;AL; 062B 064A;;;;N;;;;; -FC15;ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM;Lo;0;AL; 062C 062D;;;;N;;;;; -FC16;ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 062C 0645;;;;N;;;;; -FC17;ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062D 062C;;;;N;;;;; -FC18;ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062D 0645;;;;N;;;;; -FC19;ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM;Lo;0;AL; 062E 062C;;;;N;;;;; -FC1A;ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM;Lo;0;AL; 062E 062D;;;;N;;;;; -FC1B;ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM;Lo;0;AL; 062E 0645;;;;N;;;;; -FC1C;ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FC1D;ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FC1E;ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FC1F;ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FC20;ARABIC LIGATURE SAD WITH HAH ISOLATED FORM;Lo;0;AL; 0635 062D;;;;N;;;;; -FC21;ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0635 0645;;;;N;;;;; -FC22;ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM;Lo;0;AL; 0636 062C;;;;N;;;;; -FC23;ARABIC LIGATURE DAD WITH HAH ISOLATED FORM;Lo;0;AL; 0636 062D;;;;N;;;;; -FC24;ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM;Lo;0;AL; 0636 062E;;;;N;;;;; -FC25;ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM;Lo;0;AL; 0636 0645;;;;N;;;;; -FC26;ARABIC LIGATURE TAH WITH HAH ISOLATED FORM;Lo;0;AL; 0637 062D;;;;N;;;;; -FC27;ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FC28;ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FC29;ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM;Lo;0;AL; 0639 062C;;;;N;;;;; -FC2A;ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM;Lo;0;AL; 0639 0645;;;;N;;;;; -FC2B;ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM;Lo;0;AL; 063A 062C;;;;N;;;;; -FC2C;ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM;Lo;0;AL; 063A 0645;;;;N;;;;; -FC2D;ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0641 062C;;;;N;;;;; -FC2E;ARABIC LIGATURE FEH WITH HAH ISOLATED FORM;Lo;0;AL; 0641 062D;;;;N;;;;; -FC2F;ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM;Lo;0;AL; 0641 062E;;;;N;;;;; -FC30;ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0641 0645;;;;N;;;;; -FC31;ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0641 0649;;;;N;;;;; -FC32;ARABIC LIGATURE FEH WITH YEH ISOLATED FORM;Lo;0;AL; 0641 064A;;;;N;;;;; -FC33;ARABIC LIGATURE QAF WITH HAH ISOLATED FORM;Lo;0;AL; 0642 062D;;;;N;;;;; -FC34;ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0642 0645;;;;N;;;;; -FC35;ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0642 0649;;;;N;;;;; -FC36;ARABIC LIGATURE QAF WITH YEH ISOLATED FORM;Lo;0;AL; 0642 064A;;;;N;;;;; -FC37;ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM;Lo;0;AL; 0643 0627;;;;N;;;;; -FC38;ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM;Lo;0;AL; 0643 062C;;;;N;;;;; -FC39;ARABIC LIGATURE KAF WITH HAH ISOLATED FORM;Lo;0;AL; 0643 062D;;;;N;;;;; -FC3A;ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM;Lo;0;AL; 0643 062E;;;;N;;;;; -FC3B;ARABIC LIGATURE KAF WITH LAM ISOLATED FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FC3C;ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FC3D;ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0643 0649;;;;N;;;;; -FC3E;ARABIC LIGATURE KAF WITH YEH ISOLATED FORM;Lo;0;AL; 0643 064A;;;;N;;;;; -FC3F;ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM;Lo;0;AL; 0644 062C;;;;N;;;;; -FC40;ARABIC LIGATURE LAM WITH HAH ISOLATED FORM;Lo;0;AL; 0644 062D;;;;N;;;;; -FC41;ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM;Lo;0;AL; 0644 062E;;;;N;;;;; -FC42;ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FC43;ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0644 0649;;;;N;;;;; -FC44;ARABIC LIGATURE LAM WITH YEH ISOLATED FORM;Lo;0;AL; 0644 064A;;;;N;;;;; -FC45;ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM;Lo;0;AL; 0645 062C;;;;N;;;;; -FC46;ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM;Lo;0;AL; 0645 062D;;;;N;;;;; -FC47;ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM;Lo;0;AL; 0645 062E;;;;N;;;;; -FC48;ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FC49;ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0645 0649;;;;N;;;;; -FC4A;ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM;Lo;0;AL; 0645 064A;;;;N;;;;; -FC4B;ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM;Lo;0;AL; 0646 062C;;;;N;;;;; -FC4C;ARABIC LIGATURE NOON WITH HAH ISOLATED FORM;Lo;0;AL; 0646 062D;;;;N;;;;; -FC4D;ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM;Lo;0;AL; 0646 062E;;;;N;;;;; -FC4E;ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FC4F;ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0646 0649;;;;N;;;;; -FC50;ARABIC LIGATURE NOON WITH YEH ISOLATED FORM;Lo;0;AL; 0646 064A;;;;N;;;;; -FC51;ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM;Lo;0;AL; 0647 062C;;;;N;;;;; -FC52;ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM;Lo;0;AL; 0647 0645;;;;N;;;;; -FC53;ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0647 0649;;;;N;;;;; -FC54;ARABIC LIGATURE HEH WITH YEH ISOLATED FORM;Lo;0;AL; 0647 064A;;;;N;;;;; -FC55;ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM;Lo;0;AL; 064A 062C;;;;N;;;;; -FC56;ARABIC LIGATURE YEH WITH HAH ISOLATED FORM;Lo;0;AL; 064A 062D;;;;N;;;;; -FC57;ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM;Lo;0;AL; 064A 062E;;;;N;;;;; -FC58;ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FC59;ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 064A 0649;;;;N;;;;; -FC5A;ARABIC LIGATURE YEH WITH YEH ISOLATED FORM;Lo;0;AL; 064A 064A;;;;N;;;;; -FC5B;ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0630 0670;;;;N;;;;; -FC5C;ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0631 0670;;;;N;;;;; -FC5D;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0649 0670;;;;N;;;;; -FC5E;ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C 0651;;;;N;;;;; -FC5F;ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D 0651;;;;N;;;;; -FC60;ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM;Lo;0;AL; 0020 064E 0651;;;;N;;;;; -FC61;ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F 0651;;;;N;;;;; -FC62;ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM;Lo;0;AL; 0020 0650 0651;;;;N;;;;; -FC63;ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM;Lo;0;AL; 0020 0651 0670;;;;N;;;;; -FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0;AL; 0626 0631;;;;N;;;;; -FC65;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM;Lo;0;AL; 0626 0632;;;;N;;;;; -FC66;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC67;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM;Lo;0;AL; 0626 0646;;;;N;;;;; -FC68;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0626 0649;;;;N;;;;; -FC69;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM;Lo;0;AL; 0626 064A;;;;N;;;;; -FC6A;ARABIC LIGATURE BEH WITH REH FINAL FORM;Lo;0;AL; 0628 0631;;;;N;;;;; -FC6B;ARABIC LIGATURE BEH WITH ZAIN FINAL FORM;Lo;0;AL; 0628 0632;;;;N;;;;; -FC6C;ARABIC LIGATURE BEH WITH MEEM FINAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FC6D;ARABIC LIGATURE BEH WITH NOON FINAL FORM;Lo;0;AL; 0628 0646;;;;N;;;;; -FC6E;ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0628 0649;;;;N;;;;; -FC6F;ARABIC LIGATURE BEH WITH YEH FINAL FORM;Lo;0;AL; 0628 064A;;;;N;;;;; -FC70;ARABIC LIGATURE TEH WITH REH FINAL FORM;Lo;0;AL; 062A 0631;;;;N;;;;; -FC71;ARABIC LIGATURE TEH WITH ZAIN FINAL FORM;Lo;0;AL; 062A 0632;;;;N;;;;; -FC72;ARABIC LIGATURE TEH WITH MEEM FINAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FC73;ARABIC LIGATURE TEH WITH NOON FINAL FORM;Lo;0;AL; 062A 0646;;;;N;;;;; -FC74;ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0649;;;;N;;;;; -FC75;ARABIC LIGATURE TEH WITH YEH FINAL FORM;Lo;0;AL; 062A 064A;;;;N;;;;; -FC76;ARABIC LIGATURE THEH WITH REH FINAL FORM;Lo;0;AL; 062B 0631;;;;N;;;;; -FC77;ARABIC LIGATURE THEH WITH ZAIN FINAL FORM;Lo;0;AL; 062B 0632;;;;N;;;;; -FC78;ARABIC LIGATURE THEH WITH MEEM FINAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FC79;ARABIC LIGATURE THEH WITH NOON FINAL FORM;Lo;0;AL; 062B 0646;;;;N;;;;; -FC7A;ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062B 0649;;;;N;;;;; -FC7B;ARABIC LIGATURE THEH WITH YEH FINAL FORM;Lo;0;AL; 062B 064A;;;;N;;;;; -FC7C;ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0641 0649;;;;N;;;;; -FC7D;ARABIC LIGATURE FEH WITH YEH FINAL FORM;Lo;0;AL; 0641 064A;;;;N;;;;; -FC7E;ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0642 0649;;;;N;;;;; -FC7F;ARABIC LIGATURE QAF WITH YEH FINAL FORM;Lo;0;AL; 0642 064A;;;;N;;;;; -FC80;ARABIC LIGATURE KAF WITH ALEF FINAL FORM;Lo;0;AL; 0643 0627;;;;N;;;;; -FC81;ARABIC LIGATURE KAF WITH LAM FINAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FC82;ARABIC LIGATURE KAF WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FC83;ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0643 0649;;;;N;;;;; -FC84;ARABIC LIGATURE KAF WITH YEH FINAL FORM;Lo;0;AL; 0643 064A;;;;N;;;;; -FC85;ARABIC LIGATURE LAM WITH MEEM FINAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FC86;ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 0649;;;;N;;;;; -FC87;ARABIC LIGATURE LAM WITH YEH FINAL FORM;Lo;0;AL; 0644 064A;;;;N;;;;; -FC88;ARABIC LIGATURE MEEM WITH ALEF FINAL FORM;Lo;0;AL; 0645 0627;;;;N;;;;; -FC89;ARABIC LIGATURE MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FC8A;ARABIC LIGATURE NOON WITH REH FINAL FORM;Lo;0;AL; 0646 0631;;;;N;;;;; -FC8B;ARABIC LIGATURE NOON WITH ZAIN FINAL FORM;Lo;0;AL; 0646 0632;;;;N;;;;; -FC8C;ARABIC LIGATURE NOON WITH MEEM FINAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FC8D;ARABIC LIGATURE NOON WITH NOON FINAL FORM;Lo;0;AL; 0646 0646;;;;N;;;;; -FC8E;ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0649;;;;N;;;;; -FC8F;ARABIC LIGATURE NOON WITH YEH FINAL FORM;Lo;0;AL; 0646 064A;;;;N;;;;; -FC90;ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM;Lo;0;AL; 0649 0670;;;;N;;;;; -FC91;ARABIC LIGATURE YEH WITH REH FINAL FORM;Lo;0;AL; 064A 0631;;;;N;;;;; -FC92;ARABIC LIGATURE YEH WITH ZAIN FINAL FORM;Lo;0;AL; 064A 0632;;;;N;;;;; -FC93;ARABIC LIGATURE YEH WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FC94;ARABIC LIGATURE YEH WITH NOON FINAL FORM;Lo;0;AL; 064A 0646;;;;N;;;;; -FC95;ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 064A 0649;;;;N;;;;; -FC96;ARABIC LIGATURE YEH WITH YEH FINAL FORM;Lo;0;AL; 064A 064A;;;;N;;;;; -FC97;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM;Lo;0;AL; 0626 062C;;;;N;;;;; -FC98;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM;Lo;0;AL; 0626 062D;;;;N;;;;; -FC99;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM;Lo;0;AL; 0626 062E;;;;N;;;;; -FC9A;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FC9B;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; -FC9C;ARABIC LIGATURE BEH WITH JEEM INITIAL FORM;Lo;0;AL; 0628 062C;;;;N;;;;; -FC9D;ARABIC LIGATURE BEH WITH HAH INITIAL FORM;Lo;0;AL; 0628 062D;;;;N;;;;; -FC9E;ARABIC LIGATURE BEH WITH KHAH INITIAL FORM;Lo;0;AL; 0628 062E;;;;N;;;;; -FC9F;ARABIC LIGATURE BEH WITH MEEM INITIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FCA0;ARABIC LIGATURE BEH WITH HEH INITIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; -FCA1;ARABIC LIGATURE TEH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062C;;;;N;;;;; -FCA2;ARABIC LIGATURE TEH WITH HAH INITIAL FORM;Lo;0;AL; 062A 062D;;;;N;;;;; -FCA3;ARABIC LIGATURE TEH WITH KHAH INITIAL FORM;Lo;0;AL; 062A 062E;;;;N;;;;; -FCA4;ARABIC LIGATURE TEH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FCA5;ARABIC LIGATURE TEH WITH HEH INITIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; -FCA6;ARABIC LIGATURE THEH WITH MEEM INITIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FCA7;ARABIC LIGATURE JEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 062D;;;;N;;;;; -FCA8;ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062C 0645;;;;N;;;;; -FCA9;ARABIC LIGATURE HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062D 062C;;;;N;;;;; -FCAA;ARABIC LIGATURE HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062D 0645;;;;N;;;;; -FCAB;ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 062E 062C;;;;N;;;;; -FCAC;ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062E 0645;;;;N;;;;; -FCAD;ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FCAE;ARABIC LIGATURE SEEN WITH HAH INITIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FCAF;ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FCB0;ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FCB1;ARABIC LIGATURE SAD WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D;;;;N;;;;; -FCB2;ARABIC LIGATURE SAD WITH KHAH INITIAL FORM;Lo;0;AL; 0635 062E;;;;N;;;;; -FCB3;ARABIC LIGATURE SAD WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645;;;;N;;;;; -FCB4;ARABIC LIGATURE DAD WITH JEEM INITIAL FORM;Lo;0;AL; 0636 062C;;;;N;;;;; -FCB5;ARABIC LIGATURE DAD WITH HAH INITIAL FORM;Lo;0;AL; 0636 062D;;;;N;;;;; -FCB6;ARABIC LIGATURE DAD WITH KHAH INITIAL FORM;Lo;0;AL; 0636 062E;;;;N;;;;; -FCB7;ARABIC LIGATURE DAD WITH MEEM INITIAL FORM;Lo;0;AL; 0636 0645;;;;N;;;;; -FCB8;ARABIC LIGATURE TAH WITH HAH INITIAL FORM;Lo;0;AL; 0637 062D;;;;N;;;;; -FCB9;ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FCBA;ARABIC LIGATURE AIN WITH JEEM INITIAL FORM;Lo;0;AL; 0639 062C;;;;N;;;;; -FCBB;ARABIC LIGATURE AIN WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645;;;;N;;;;; -FCBC;ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM;Lo;0;AL; 063A 062C;;;;N;;;;; -FCBD;ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM;Lo;0;AL; 063A 0645;;;;N;;;;; -FCBE;ARABIC LIGATURE FEH WITH JEEM INITIAL FORM;Lo;0;AL; 0641 062C;;;;N;;;;; -FCBF;ARABIC LIGATURE FEH WITH HAH INITIAL FORM;Lo;0;AL; 0641 062D;;;;N;;;;; -FCC0;ARABIC LIGATURE FEH WITH KHAH INITIAL FORM;Lo;0;AL; 0641 062E;;;;N;;;;; -FCC1;ARABIC LIGATURE FEH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 0645;;;;N;;;;; -FCC2;ARABIC LIGATURE QAF WITH HAH INITIAL FORM;Lo;0;AL; 0642 062D;;;;N;;;;; -FCC3;ARABIC LIGATURE QAF WITH MEEM INITIAL FORM;Lo;0;AL; 0642 0645;;;;N;;;;; -FCC4;ARABIC LIGATURE KAF WITH JEEM INITIAL FORM;Lo;0;AL; 0643 062C;;;;N;;;;; -FCC5;ARABIC LIGATURE KAF WITH HAH INITIAL FORM;Lo;0;AL; 0643 062D;;;;N;;;;; -FCC6;ARABIC LIGATURE KAF WITH KHAH INITIAL FORM;Lo;0;AL; 0643 062E;;;;N;;;;; -FCC7;ARABIC LIGATURE KAF WITH LAM INITIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FCC8;ARABIC LIGATURE KAF WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FCC9;ARABIC LIGATURE LAM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C;;;;N;;;;; -FCCA;ARABIC LIGATURE LAM WITH HAH INITIAL FORM;Lo;0;AL; 0644 062D;;;;N;;;;; -FCCB;ARABIC LIGATURE LAM WITH KHAH INITIAL FORM;Lo;0;AL; 0644 062E;;;;N;;;;; -FCCC;ARABIC LIGATURE LAM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FCCD;ARABIC LIGATURE LAM WITH HEH INITIAL FORM;Lo;0;AL; 0644 0647;;;;N;;;;; -FCCE;ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062C;;;;N;;;;; -FCCF;ARABIC LIGATURE MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062D;;;;N;;;;; -FCD0;ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062E;;;;N;;;;; -FCD1;ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 0645;;;;N;;;;; -FCD2;ARABIC LIGATURE NOON WITH JEEM INITIAL FORM;Lo;0;AL; 0646 062C;;;;N;;;;; -FCD3;ARABIC LIGATURE NOON WITH HAH INITIAL FORM;Lo;0;AL; 0646 062D;;;;N;;;;; -FCD4;ARABIC LIGATURE NOON WITH KHAH INITIAL FORM;Lo;0;AL; 0646 062E;;;;N;;;;; -FCD5;ARABIC LIGATURE NOON WITH MEEM INITIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FCD6;ARABIC LIGATURE NOON WITH HEH INITIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; -FCD7;ARABIC LIGATURE HEH WITH JEEM INITIAL FORM;Lo;0;AL; 0647 062C;;;;N;;;;; -FCD8;ARABIC LIGATURE HEH WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645;;;;N;;;;; -FCD9;ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM;Lo;0;AL; 0647 0670;;;;N;;;;; -FCDA;ARABIC LIGATURE YEH WITH JEEM INITIAL FORM;Lo;0;AL; 064A 062C;;;;N;;;;; -FCDB;ARABIC LIGATURE YEH WITH HAH INITIAL FORM;Lo;0;AL; 064A 062D;;;;N;;;;; -FCDC;ARABIC LIGATURE YEH WITH KHAH INITIAL FORM;Lo;0;AL; 064A 062E;;;;N;;;;; -FCDD;ARABIC LIGATURE YEH WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FCDE;ARABIC LIGATURE YEH WITH HEH INITIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; -FCDF;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM;Lo;0;AL; 0626 0645;;;;N;;;;; -FCE0;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM;Lo;0;AL; 0626 0647;;;;N;;;;; -FCE1;ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM;Lo;0;AL; 0628 0645;;;;N;;;;; -FCE2;ARABIC LIGATURE BEH WITH HEH MEDIAL FORM;Lo;0;AL; 0628 0647;;;;N;;;;; -FCE3;ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062A 0645;;;;N;;;;; -FCE4;ARABIC LIGATURE TEH WITH HEH MEDIAL FORM;Lo;0;AL; 062A 0647;;;;N;;;;; -FCE5;ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM;Lo;0;AL; 062B 0645;;;;N;;;;; -FCE6;ARABIC LIGATURE THEH WITH HEH MEDIAL FORM;Lo;0;AL; 062B 0647;;;;N;;;;; -FCE7;ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0633 0645;;;;N;;;;; -FCE8;ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; -FCE9;ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FCEA;ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; -FCEB;ARABIC LIGATURE KAF WITH LAM MEDIAL FORM;Lo;0;AL; 0643 0644;;;;N;;;;; -FCEC;ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM;Lo;0;AL; 0643 0645;;;;N;;;;; -FCED;ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM;Lo;0;AL; 0644 0645;;;;N;;;;; -FCEE;ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM;Lo;0;AL; 0646 0645;;;;N;;;;; -FCEF;ARABIC LIGATURE NOON WITH HEH MEDIAL FORM;Lo;0;AL; 0646 0647;;;;N;;;;; -FCF0;ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM;Lo;0;AL; 064A 0645;;;;N;;;;; -FCF1;ARABIC LIGATURE YEH WITH HEH MEDIAL FORM;Lo;0;AL; 064A 0647;;;;N;;;;; -FCF2;ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM;Lo;0;AL; 0640 064E 0651;;;;N;;;;; -FCF3;ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F 0651;;;;N;;;;; -FCF4;ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM;Lo;0;AL; 0640 0650 0651;;;;N;;;;; -FCF5;ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0637 0649;;;;N;;;;; -FCF6;ARABIC LIGATURE TAH WITH YEH ISOLATED FORM;Lo;0;AL; 0637 064A;;;;N;;;;; -FCF7;ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0639 0649;;;;N;;;;; -FCF8;ARABIC LIGATURE AIN WITH YEH ISOLATED FORM;Lo;0;AL; 0639 064A;;;;N;;;;; -FCF9;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 063A 0649;;;;N;;;;; -FCFA;ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM;Lo;0;AL; 063A 064A;;;;N;;;;; -FCFB;ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0633 0649;;;;N;;;;; -FCFC;ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0633 064A;;;;N;;;;; -FCFD;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0634 0649;;;;N;;;;; -FCFE;ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM;Lo;0;AL; 0634 064A;;;;N;;;;; -FCFF;ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062D 0649;;;;N;;;;; -FD00;ARABIC LIGATURE HAH WITH YEH ISOLATED FORM;Lo;0;AL; 062D 064A;;;;N;;;;; -FD01;ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062C 0649;;;;N;;;;; -FD02;ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM;Lo;0;AL; 062C 064A;;;;N;;;;; -FD03;ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 062E 0649;;;;N;;;;; -FD04;ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM;Lo;0;AL; 062E 064A;;;;N;;;;; -FD05;ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0635 0649;;;;N;;;;; -FD06;ARABIC LIGATURE SAD WITH YEH ISOLATED FORM;Lo;0;AL; 0635 064A;;;;N;;;;; -FD07;ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0636 0649;;;;N;;;;; -FD08;ARABIC LIGATURE DAD WITH YEH ISOLATED FORM;Lo;0;AL; 0636 064A;;;;N;;;;; -FD09;ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD0A;ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD0B;ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD0C;ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD0D;ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM;Lo;0;AL; 0634 0631;;;;N;;;;; -FD0E;ARABIC LIGATURE SEEN WITH REH ISOLATED FORM;Lo;0;AL; 0633 0631;;;;N;;;;; -FD0F;ARABIC LIGATURE SAD WITH REH ISOLATED FORM;Lo;0;AL; 0635 0631;;;;N;;;;; -FD10;ARABIC LIGATURE DAD WITH REH ISOLATED FORM;Lo;0;AL; 0636 0631;;;;N;;;;; -FD11;ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0637 0649;;;;N;;;;; -FD12;ARABIC LIGATURE TAH WITH YEH FINAL FORM;Lo;0;AL; 0637 064A;;;;N;;;;; -FD13;ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0649;;;;N;;;;; -FD14;ARABIC LIGATURE AIN WITH YEH FINAL FORM;Lo;0;AL; 0639 064A;;;;N;;;;; -FD15;ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0649;;;;N;;;;; -FD16;ARABIC LIGATURE GHAIN WITH YEH FINAL FORM;Lo;0;AL; 063A 064A;;;;N;;;;; -FD17;ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 0649;;;;N;;;;; -FD18;ARABIC LIGATURE SEEN WITH YEH FINAL FORM;Lo;0;AL; 0633 064A;;;;N;;;;; -FD19;ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0634 0649;;;;N;;;;; -FD1A;ARABIC LIGATURE SHEEN WITH YEH FINAL FORM;Lo;0;AL; 0634 064A;;;;N;;;;; -FD1B;ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0649;;;;N;;;;; -FD1C;ARABIC LIGATURE HAH WITH YEH FINAL FORM;Lo;0;AL; 062D 064A;;;;N;;;;; -FD1D;ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0649;;;;N;;;;; -FD1E;ARABIC LIGATURE JEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 064A;;;;N;;;;; -FD1F;ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062E 0649;;;;N;;;;; -FD20;ARABIC LIGATURE KHAH WITH YEH FINAL FORM;Lo;0;AL; 062E 064A;;;;N;;;;; -FD21;ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0635 0649;;;;N;;;;; -FD22;ARABIC LIGATURE SAD WITH YEH FINAL FORM;Lo;0;AL; 0635 064A;;;;N;;;;; -FD23;ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 0649;;;;N;;;;; -FD24;ARABIC LIGATURE DAD WITH YEH FINAL FORM;Lo;0;AL; 0636 064A;;;;N;;;;; -FD25;ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD26;ARABIC LIGATURE SHEEN WITH HAH FINAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD27;ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD28;ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD29;ARABIC LIGATURE SHEEN WITH REH FINAL FORM;Lo;0;AL; 0634 0631;;;;N;;;;; -FD2A;ARABIC LIGATURE SEEN WITH REH FINAL FORM;Lo;0;AL; 0633 0631;;;;N;;;;; -FD2B;ARABIC LIGATURE SAD WITH REH FINAL FORM;Lo;0;AL; 0635 0631;;;;N;;;;; -FD2C;ARABIC LIGATURE DAD WITH REH FINAL FORM;Lo;0;AL; 0636 0631;;;;N;;;;; -FD2D;ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD2E;ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD2F;ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD30;ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645;;;;N;;;;; -FD31;ARABIC LIGATURE SEEN WITH HEH INITIAL FORM;Lo;0;AL; 0633 0647;;;;N;;;;; -FD32;ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM;Lo;0;AL; 0634 0647;;;;N;;;;; -FD33;ARABIC LIGATURE TAH WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FD34;ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0633 062C;;;;N;;;;; -FD35;ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0633 062D;;;;N;;;;; -FD36;ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0633 062E;;;;N;;;;; -FD37;ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM;Lo;0;AL; 0634 062C;;;;N;;;;; -FD38;ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM;Lo;0;AL; 0634 062D;;;;N;;;;; -FD39;ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM;Lo;0;AL; 0634 062E;;;;N;;;;; -FD3A;ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0637 0645;;;;N;;;;; -FD3B;ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM;Lo;0;AL; 0638 0645;;;;N;;;;; -FD3C;ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM;Lo;0;AL; 0627 064B;;;;N;;;;; -FD3D;ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM;Lo;0;AL; 0627 064B;;;;N;;;;; -FD3E;ORNATE LEFT PARENTHESIS;Pe;0;ON;;;;;N;;;;; -FD3F;ORNATE RIGHT PARENTHESIS;Ps;0;ON;;;;;N;;;;; -FD50;ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062C 0645;;;;N;;;;; -FD51;ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; -FD52;ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 062A 062D 062C;;;;N;;;;; -FD53;ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062D 0645;;;;N;;;;; -FD54;ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 062A 062E 0645;;;;N;;;;; -FD55;ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 062A 0645 062C;;;;N;;;;; -FD56;ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062A 0645 062D;;;;N;;;;; -FD57;ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 062A 0645 062E;;;;N;;;;; -FD58;ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; -FD59;ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 062C 0645 062D;;;;N;;;;; -FD5A;ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 0645 064A;;;;N;;;;; -FD5B;ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062D 0645 0649;;;;N;;;;; -FD5C;ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0633 062D 062C;;;;N;;;;; -FD5D;ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 062C 062D;;;;N;;;;; -FD5E;ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062C 0649;;;;N;;;;; -FD5F;ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; -FD60;ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0633 0645 062D;;;;N;;;;; -FD61;ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0633 0645 062C;;;;N;;;;; -FD62;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; -FD63;ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0633 0645 0645;;;;N;;;;; -FD64;ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; -FD65;ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM;Lo;0;AL; 0635 062D 062D;;;;N;;;;; -FD66;ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; -FD67;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; -FD68;ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0634 062D 0645;;;;N;;;;; -FD69;ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0634 062C 064A;;;;N;;;;; -FD6A;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; -FD6B;ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0634 0645 062E;;;;N;;;;; -FD6C;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; -FD6D;ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0634 0645 0645;;;;N;;;;; -FD6E;ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0636 062D 0649;;;;N;;;;; -FD6F;ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; -FD70;ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0636 062E 0645;;;;N;;;;; -FD71;ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; -FD72;ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0637 0645 062D;;;;N;;;;; -FD73;ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0637 0645 0645;;;;N;;;;; -FD74;ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0637 0645 064A;;;;N;;;;; -FD75;ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; -FD76;ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; -FD77;ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 0645 0645;;;;N;;;;; -FD78;ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0639 0645 0649;;;;N;;;;; -FD79;ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 063A 0645 0645;;;;N;;;;; -FD7A;ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 063A 0645 064A;;;;N;;;;; -FD7B;ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 063A 0645 0649;;;;N;;;;; -FD7C;ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; -FD7D;ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0641 062E 0645;;;;N;;;;; -FD7E;ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; -FD7F;ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0642 0645 0645;;;;N;;;;; -FD80;ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; -FD81;ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0644 062D 064A;;;;N;;;;; -FD82;ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0644 062D 0649;;;;N;;;;; -FD83;ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; -FD84;ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM;Lo;0;AL; 0644 062C 062C;;;;N;;;;; -FD85;ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; -FD86;ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062E 0645;;;;N;;;;; -FD87;ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; -FD88;ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0644 0645 062D;;;;N;;;;; -FD89;ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062D 062C;;;;N;;;;; -FD8A;ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062D 0645;;;;N;;;;; -FD8B;ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062D 064A;;;;N;;;;; -FD8C;ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0645 062C 062D;;;;N;;;;; -FD8D;ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062C 0645;;;;N;;;;; -FD8E;ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM;Lo;0;AL; 0645 062E 062C;;;;N;;;;; -FD8F;ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM;Lo;0;AL; 0645 062E 0645;;;;N;;;;; -FD92;ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM;Lo;0;AL; 0645 062C 062E;;;;N;;;;; -FD93;ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM;Lo;0;AL; 0647 0645 062C;;;;N;;;;; -FD94;ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0647 0645 0645;;;;N;;;;; -FD95;ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062D 0645;;;;N;;;;; -FD96;ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062D 0649;;;;N;;;;; -FD97;ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; -FD98;ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0646 062C 0645;;;;N;;;;; -FD99;ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 062C 0649;;;;N;;;;; -FD9A;ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 0645 064A;;;;N;;;;; -FD9B;ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0646 0645 0649;;;;N;;;;; -FD9C;ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; -FD9D;ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 064A 0645 0645;;;;N;;;;; -FD9E;ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062E 064A;;;;N;;;;; -FD9F;ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 062C 064A;;;;N;;;;; -FDA0;ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062C 0649;;;;N;;;;; -FDA1;ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 062A 062E 064A;;;;N;;;;; -FDA2;ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 062E 0649;;;;N;;;;; -FDA3;ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062A 0645 064A;;;;N;;;;; -FDA4;ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062A 0645 0649;;;;N;;;;; -FDA5;ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 062C 0645 064A;;;;N;;;;; -FDA6;ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 062D 0649;;;;N;;;;; -FDA7;ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 062C 0645 0649;;;;N;;;;; -FDA8;ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM;Lo;0;AL; 0633 062E 0649;;;;N;;;;; -FDA9;ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0635 062D 064A;;;;N;;;;; -FDAA;ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0634 062D 064A;;;;N;;;;; -FDAB;ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0636 062D 064A;;;;N;;;;; -FDAC;ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 062C 064A;;;;N;;;;; -FDAD;ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0644 0645 064A;;;;N;;;;; -FDAE;ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 064A 062D 064A;;;;N;;;;; -FDAF;ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 062C 064A;;;;N;;;;; -FDB0;ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 064A 0645 064A;;;;N;;;;; -FDB1;ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 0645 064A;;;;N;;;;; -FDB2;ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0642 0645 064A;;;;N;;;;; -FDB3;ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0646 062D 064A;;;;N;;;;; -FDB4;ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM;Lo;0;AL; 0642 0645 062D;;;;N;;;;; -FDB5;ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062D 0645;;;;N;;;;; -FDB6;ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0639 0645 064A;;;;N;;;;; -FDB7;ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0643 0645 064A;;;;N;;;;; -FDB8;ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; -FDB9;ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0645 062E 064A;;;;N;;;;; -FDBA;ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; -FDBB;ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; -FDBC;ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM;Lo;0;AL; 0644 062C 0645;;;;N;;;;; -FDBD;ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM;Lo;0;AL; 0646 062C 062D;;;;N;;;;; -FDBE;ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 062C 062D 064A;;;;N;;;;; -FDBF;ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 062D 062C 064A;;;;N;;;;; -FDC0;ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0645 062C 064A;;;;N;;;;; -FDC1;ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM;Lo;0;AL; 0641 0645 064A;;;;N;;;;; -FDC2;ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM;Lo;0;AL; 0628 062D 064A;;;;N;;;;; -FDC3;ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0643 0645 0645;;;;N;;;;; -FDC4;ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0639 062C 0645;;;;N;;;;; -FDC5;ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM;Lo;0;AL; 0635 0645 0645;;;;N;;;;; -FDC6;ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM;Lo;0;AL; 0633 062E 064A;;;;N;;;;; -FDC7;ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM;Lo;0;AL; 0646 062C 064A;;;;N;;;;; -FDF0;ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0635 0644 06D2;;;;N;;;;; -FDF1;ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM;Lo;0;AL; 0642 0644 06D2;;;;N;;;;; -FDF2;ARABIC LIGATURE ALLAH ISOLATED FORM;Lo;0;AL; 0627 0644 0644 0647;;;;N;;;;; -FDF3;ARABIC LIGATURE AKBAR ISOLATED FORM;Lo;0;AL; 0627 0643 0628 0631;;;;N;;;;; -FDF4;ARABIC LIGATURE MOHAMMAD ISOLATED FORM;Lo;0;AL; 0645 062D 0645 062F;;;;N;;;;; -FDF5;ARABIC LIGATURE SALAM ISOLATED FORM;Lo;0;AL; 0635 0644 0639 0645;;;;N;;;;; -FDF6;ARABIC LIGATURE RASOUL ISOLATED FORM;Lo;0;AL; 0631 0633 0648 0644;;;;N;;;;; -FDF7;ARABIC LIGATURE ALAYHE ISOLATED FORM;Lo;0;AL; 0639 0644 064A 0647;;;;N;;;;; -FDF8;ARABIC LIGATURE WASALLAM ISOLATED FORM;Lo;0;AL; 0648 0633 0644 0645;;;;N;;;;; -FDF9;ARABIC LIGATURE SALLA ISOLATED FORM;Lo;0;AL; 0635 0644 0649;;;;N;;;;; -FDFA;ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM;Lo;0;AL; 0635 0644 0649 0020 0627 0644 0644 0647 0020 0639 0644 064A 0647 0020 0648 0633 0644 0645;;;;N;ARABIC LETTER SALLALLAHOU ALAYHE WASALLAM;;;; -FDFB;ARABIC LIGATURE JALLAJALALOUHOU;Lo;0;AL; 062C 0644 0020 062C 0644 0627 0644 0647;;;;N;ARABIC LETTER JALLAJALALOUHOU;;;; -FDFC;RIAL SIGN;Sc;0;AL; 0631 06CC 0627 0644;;;;N;;;;; -FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;; -FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;; -FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;; -FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;; -FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;; -FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;; -FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;; -FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;; -FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;; -FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;; -FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;; -FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;; -FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;; -FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;; -FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;; -FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;; -FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;; -FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON; 002C;;;;N;;;;; -FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;;;;; -FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON; 003A;;;;N;;;;; -FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON; 3016;;;;N;;;;; -FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON; 3017;;;;N;;;;; -FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON; 2026;;;;N;;;;; -FE20;COMBINING LIGATURE LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE21;COMBINING LIGATURE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE22;COMBINING DOUBLE TILDE LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE23;COMBINING DOUBLE TILDE RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE24;COMBINING MACRON LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE25;COMBINING MACRON RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE26;COMBINING CONJOINING MACRON;Mn;230;NSM;;;;;N;;;;; -FE27;COMBINING LIGATURE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE28;COMBINING LIGATURE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE29;COMBINING TILDE LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2A;COMBINING TILDE RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2B;COMBINING MACRON LEFT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2C;COMBINING MACRON RIGHT HALF BELOW;Mn;220;NSM;;;;;N;;;;; -FE2D;COMBINING CONJOINING MACRON BELOW;Mn;220;NSM;;;;;N;;;;; -FE2E;COMBINING CYRILLIC TITLO LEFT HALF;Mn;230;NSM;;;;;N;;;;; -FE2F;COMBINING CYRILLIC TITLO RIGHT HALF;Mn;230;NSM;;;;;N;;;;; -FE30;PRESENTATION FORM FOR VERTICAL TWO DOT LEADER;Po;0;ON; 2025;;;;N;GLYPH FOR VERTICAL TWO DOT LEADER;;;; -FE31;PRESENTATION FORM FOR VERTICAL EM DASH;Pd;0;ON; 2014;;;;N;GLYPH FOR VERTICAL EM DASH;;;; -FE32;PRESENTATION FORM FOR VERTICAL EN DASH;Pd;0;ON; 2013;;;;N;GLYPH FOR VERTICAL EN DASH;;;; -FE33;PRESENTATION FORM FOR VERTICAL LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING UNDERSCORE;;;; -FE34;PRESENTATION FORM FOR VERTICAL WAVY LOW LINE;Pc;0;ON; 005F;;;;N;GLYPH FOR VERTICAL SPACING WAVY UNDERSCORE;;;; -FE35;PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;N;GLYPH FOR VERTICAL OPENING PARENTHESIS;;;; -FE36;PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;N;GLYPH FOR VERTICAL CLOSING PARENTHESIS;;;; -FE37;PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;N;GLYPH FOR VERTICAL OPENING CURLY BRACKET;;;; -FE38;PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;N;GLYPH FOR VERTICAL CLOSING CURLY BRACKET;;;; -FE39;PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;N;GLYPH FOR VERTICAL OPENING TORTOISE SHELL BRACKET;;;; -FE3A;PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;N;GLYPH FOR VERTICAL CLOSING TORTOISE SHELL BRACKET;;;; -FE3B;PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET;Ps;0;ON; 3010;;;;N;GLYPH FOR VERTICAL OPENING BLACK LENTICULAR BRACKET;;;; -FE3C;PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET;Pe;0;ON; 3011;;;;N;GLYPH FOR VERTICAL CLOSING BLACK LENTICULAR BRACKET;;;; -FE3D;PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON; 300A;;;;N;GLYPH FOR VERTICAL OPENING DOUBLE ANGLE BRACKET;;;; -FE3E;PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON; 300B;;;;N;GLYPH FOR VERTICAL CLOSING DOUBLE ANGLE BRACKET;;;; -FE3F;PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET;Ps;0;ON; 3008;;;;N;GLYPH FOR VERTICAL OPENING ANGLE BRACKET;;;; -FE40;PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET;Pe;0;ON; 3009;;;;N;GLYPH FOR VERTICAL CLOSING ANGLE BRACKET;;;; -FE41;PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;N;GLYPH FOR VERTICAL OPENING CORNER BRACKET;;;; -FE42;PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;N;GLYPH FOR VERTICAL CLOSING CORNER BRACKET;;;; -FE43;PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET;Ps;0;ON; 300E;;;;N;GLYPH FOR VERTICAL OPENING WHITE CORNER BRACKET;;;; -FE44;PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET;Pe;0;ON; 300F;;;;N;GLYPH FOR VERTICAL CLOSING WHITE CORNER BRACKET;;;; -FE45;SESAME DOT;Po;0;ON;;;;;N;;;;; -FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;; -FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;N;;;;; -FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;N;;;;; -FE49;DASHED OVERLINE;Po;0;ON; 203E;;;;N;SPACING DASHED OVERSCORE;;;; -FE4A;CENTRELINE OVERLINE;Po;0;ON; 203E;;;;N;SPACING CENTERLINE OVERSCORE;;;; -FE4B;WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING WAVY OVERSCORE;;;; -FE4C;DOUBLE WAVY OVERLINE;Po;0;ON; 203E;;;;N;SPACING DOUBLE WAVY OVERSCORE;;;; -FE4D;DASHED LOW LINE;Pc;0;ON; 005F;;;;N;SPACING DASHED UNDERSCORE;;;; -FE4E;CENTRELINE LOW LINE;Pc;0;ON; 005F;;;;N;SPACING CENTERLINE UNDERSCORE;;;; -FE4F;WAVY LOW LINE;Pc;0;ON; 005F;;;;N;SPACING WAVY UNDERSCORE;;;; -FE50;SMALL COMMA;Po;0;CS; 002C;;;;N;;;;; -FE51;SMALL IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FE52;SMALL FULL STOP;Po;0;CS; 002E;;;;N;SMALL PERIOD;;;; -FE54;SMALL SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FE55;SMALL COLON;Po;0;CS; 003A;;;;N;;;;; -FE56;SMALL QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FE57;SMALL EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FE58;SMALL EM DASH;Pd;0;ON; 2014;;;;N;;;;; -FE59;SMALL LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;SMALL OPENING PARENTHESIS;;;; -FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;; -FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;; -FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;; -FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON; 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;; -FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON; 3015;;;;Y;SMALL CLOSING TORTOISE SHELL BRACKET;;;; -FE5F;SMALL NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; -FE60;SMALL AMPERSAND;Po;0;ON; 0026;;;;N;;;;; -FE61;SMALL ASTERISK;Po;0;ON; 002A;;;;N;;;;; -FE62;SMALL PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -FE63;SMALL HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; -FE64;SMALL LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; -FE65;SMALL GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; -FE66;SMALL EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -FE68;SMALL REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;SMALL BACKSLASH;;;; -FE69;SMALL DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; -FE6A;SMALL PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; -FE6B;SMALL COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; -FE70;ARABIC FATHATAN ISOLATED FORM;Lo;0;AL; 0020 064B;;;;N;ARABIC SPACING FATHATAN;;;; -FE71;ARABIC TATWEEL WITH FATHATAN ABOVE;Lo;0;AL; 0640 064B;;;;N;ARABIC FATHATAN ON TATWEEL;;;; -FE72;ARABIC DAMMATAN ISOLATED FORM;Lo;0;AL; 0020 064C;;;;N;ARABIC SPACING DAMMATAN;;;; -FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;; -FE74;ARABIC KASRATAN ISOLATED FORM;Lo;0;AL; 0020 064D;;;;N;ARABIC SPACING KASRATAN;;;; -FE76;ARABIC FATHA ISOLATED FORM;Lo;0;AL; 0020 064E;;;;N;ARABIC SPACING FATHAH;;;; -FE77;ARABIC FATHA MEDIAL FORM;Lo;0;AL; 0640 064E;;;;N;ARABIC FATHAH ON TATWEEL;;;; -FE78;ARABIC DAMMA ISOLATED FORM;Lo;0;AL; 0020 064F;;;;N;ARABIC SPACING DAMMAH;;;; -FE79;ARABIC DAMMA MEDIAL FORM;Lo;0;AL; 0640 064F;;;;N;ARABIC DAMMAH ON TATWEEL;;;; -FE7A;ARABIC KASRA ISOLATED FORM;Lo;0;AL; 0020 0650;;;;N;ARABIC SPACING KASRAH;;;; -FE7B;ARABIC KASRA MEDIAL FORM;Lo;0;AL; 0640 0650;;;;N;ARABIC KASRAH ON TATWEEL;;;; -FE7C;ARABIC SHADDA ISOLATED FORM;Lo;0;AL; 0020 0651;;;;N;ARABIC SPACING SHADDAH;;;; -FE7D;ARABIC SHADDA MEDIAL FORM;Lo;0;AL; 0640 0651;;;;N;ARABIC SHADDAH ON TATWEEL;;;; -FE7E;ARABIC SUKUN ISOLATED FORM;Lo;0;AL; 0020 0652;;;;N;ARABIC SPACING SUKUN;;;; -FE7F;ARABIC SUKUN MEDIAL FORM;Lo;0;AL; 0640 0652;;;;N;ARABIC SUKUN ON TATWEEL;;;; -FE80;ARABIC LETTER HAMZA ISOLATED FORM;Lo;0;AL; 0621;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH;;;; -FE81;ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON ALEF;;;; -FE82;ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON ALEF;;;; -FE83;ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON ALEF;;;; -FE84;ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON ALEF;;;; -FE85;ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON WAW;;;; -FE86;ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0624;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON WAW;;;; -FE87;ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER ALEF;;;; -FE88;ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER ALEF;;;; -FE89;ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON YA;;;; -FE8A;ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON YA;;;; -FE8B;ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR INITIAL ARABIC HAMZAH ON YA;;;; -FE8C;ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM;Lo;0;AL; 0626;;;;N;GLYPH FOR MEDIAL ARABIC HAMZAH ON YA;;;; -FE8D;ARABIC LETTER ALEF ISOLATED FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR ISOLATE ARABIC ALEF;;;; -FE8E;ARABIC LETTER ALEF FINAL FORM;Lo;0;AL; 0627;;;;N;GLYPH FOR FINAL ARABIC ALEF;;;; -FE8F;ARABIC LETTER BEH ISOLATED FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR ISOLATE ARABIC BAA;;;; -FE90;ARABIC LETTER BEH FINAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR FINAL ARABIC BAA;;;; -FE91;ARABIC LETTER BEH INITIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR INITIAL ARABIC BAA;;;; -FE92;ARABIC LETTER BEH MEDIAL FORM;Lo;0;AL; 0628;;;;N;GLYPH FOR MEDIAL ARABIC BAA;;;; -FE93;ARABIC LETTER TEH MARBUTA ISOLATED FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR ISOLATE ARABIC TAA MARBUTAH;;;; -FE94;ARABIC LETTER TEH MARBUTA FINAL FORM;Lo;0;AL; 0629;;;;N;GLYPH FOR FINAL ARABIC TAA MARBUTAH;;;; -FE95;ARABIC LETTER TEH ISOLATED FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR ISOLATE ARABIC TAA;;;; -FE96;ARABIC LETTER TEH FINAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR FINAL ARABIC TAA;;;; -FE97;ARABIC LETTER TEH INITIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR INITIAL ARABIC TAA;;;; -FE98;ARABIC LETTER TEH MEDIAL FORM;Lo;0;AL; 062A;;;;N;GLYPH FOR MEDIAL ARABIC TAA;;;; -FE99;ARABIC LETTER THEH ISOLATED FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR ISOLATE ARABIC THAA;;;; -FE9A;ARABIC LETTER THEH FINAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR FINAL ARABIC THAA;;;; -FE9B;ARABIC LETTER THEH INITIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR INITIAL ARABIC THAA;;;; -FE9C;ARABIC LETTER THEH MEDIAL FORM;Lo;0;AL; 062B;;;;N;GLYPH FOR MEDIAL ARABIC THAA;;;; -FE9D;ARABIC LETTER JEEM ISOLATED FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR ISOLATE ARABIC JEEM;;;; -FE9E;ARABIC LETTER JEEM FINAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR FINAL ARABIC JEEM;;;; -FE9F;ARABIC LETTER JEEM INITIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR INITIAL ARABIC JEEM;;;; -FEA0;ARABIC LETTER JEEM MEDIAL FORM;Lo;0;AL; 062C;;;;N;GLYPH FOR MEDIAL ARABIC JEEM;;;; -FEA1;ARABIC LETTER HAH ISOLATED FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR ISOLATE ARABIC HAA;;;; -FEA2;ARABIC LETTER HAH FINAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR FINAL ARABIC HAA;;;; -FEA3;ARABIC LETTER HAH INITIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR INITIAL ARABIC HAA;;;; -FEA4;ARABIC LETTER HAH MEDIAL FORM;Lo;0;AL; 062D;;;;N;GLYPH FOR MEDIAL ARABIC HAA;;;; -FEA5;ARABIC LETTER KHAH ISOLATED FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR ISOLATE ARABIC KHAA;;;; -FEA6;ARABIC LETTER KHAH FINAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR FINAL ARABIC KHAA;;;; -FEA7;ARABIC LETTER KHAH INITIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR INITIAL ARABIC KHAA;;;; -FEA8;ARABIC LETTER KHAH MEDIAL FORM;Lo;0;AL; 062E;;;;N;GLYPH FOR MEDIAL ARABIC KHAA;;;; -FEA9;ARABIC LETTER DAL ISOLATED FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR ISOLATE ARABIC DAL;;;; -FEAA;ARABIC LETTER DAL FINAL FORM;Lo;0;AL; 062F;;;;N;GLYPH FOR FINAL ARABIC DAL;;;; -FEAB;ARABIC LETTER THAL ISOLATED FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR ISOLATE ARABIC THAL;;;; -FEAC;ARABIC LETTER THAL FINAL FORM;Lo;0;AL; 0630;;;;N;GLYPH FOR FINAL ARABIC THAL;;;; -FEAD;ARABIC LETTER REH ISOLATED FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR ISOLATE ARABIC RA;;;; -FEAE;ARABIC LETTER REH FINAL FORM;Lo;0;AL; 0631;;;;N;GLYPH FOR FINAL ARABIC RA;;;; -FEAF;ARABIC LETTER ZAIN ISOLATED FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR ISOLATE ARABIC ZAIN;;;; -FEB0;ARABIC LETTER ZAIN FINAL FORM;Lo;0;AL; 0632;;;;N;GLYPH FOR FINAL ARABIC ZAIN;;;; -FEB1;ARABIC LETTER SEEN ISOLATED FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR ISOLATE ARABIC SEEN;;;; -FEB2;ARABIC LETTER SEEN FINAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR FINAL ARABIC SEEN;;;; -FEB3;ARABIC LETTER SEEN INITIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR INITIAL ARABIC SEEN;;;; -FEB4;ARABIC LETTER SEEN MEDIAL FORM;Lo;0;AL; 0633;;;;N;GLYPH FOR MEDIAL ARABIC SEEN;;;; -FEB5;ARABIC LETTER SHEEN ISOLATED FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR ISOLATE ARABIC SHEEN;;;; -FEB6;ARABIC LETTER SHEEN FINAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR FINAL ARABIC SHEEN;;;; -FEB7;ARABIC LETTER SHEEN INITIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR INITIAL ARABIC SHEEN;;;; -FEB8;ARABIC LETTER SHEEN MEDIAL FORM;Lo;0;AL; 0634;;;;N;GLYPH FOR MEDIAL ARABIC SHEEN;;;; -FEB9;ARABIC LETTER SAD ISOLATED FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR ISOLATE ARABIC SAD;;;; -FEBA;ARABIC LETTER SAD FINAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR FINAL ARABIC SAD;;;; -FEBB;ARABIC LETTER SAD INITIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR INITIAL ARABIC SAD;;;; -FEBC;ARABIC LETTER SAD MEDIAL FORM;Lo;0;AL; 0635;;;;N;GLYPH FOR MEDIAL ARABIC SAD;;;; -FEBD;ARABIC LETTER DAD ISOLATED FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR ISOLATE ARABIC DAD;;;; -FEBE;ARABIC LETTER DAD FINAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR FINAL ARABIC DAD;;;; -FEBF;ARABIC LETTER DAD INITIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR INITIAL ARABIC DAD;;;; -FEC0;ARABIC LETTER DAD MEDIAL FORM;Lo;0;AL; 0636;;;;N;GLYPH FOR MEDIAL ARABIC DAD;;;; -FEC1;ARABIC LETTER TAH ISOLATED FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR ISOLATE ARABIC TAH;;;; -FEC2;ARABIC LETTER TAH FINAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR FINAL ARABIC TAH;;;; -FEC3;ARABIC LETTER TAH INITIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR INITIAL ARABIC TAH;;;; -FEC4;ARABIC LETTER TAH MEDIAL FORM;Lo;0;AL; 0637;;;;N;GLYPH FOR MEDIAL ARABIC TAH;;;; -FEC5;ARABIC LETTER ZAH ISOLATED FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR ISOLATE ARABIC DHAH;;;; -FEC6;ARABIC LETTER ZAH FINAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR FINAL ARABIC DHAH;;;; -FEC7;ARABIC LETTER ZAH INITIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR INITIAL ARABIC DHAH;;;; -FEC8;ARABIC LETTER ZAH MEDIAL FORM;Lo;0;AL; 0638;;;;N;GLYPH FOR MEDIAL ARABIC DHAH;;;; -FEC9;ARABIC LETTER AIN ISOLATED FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR ISOLATE ARABIC AIN;;;; -FECA;ARABIC LETTER AIN FINAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR FINAL ARABIC AIN;;;; -FECB;ARABIC LETTER AIN INITIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR INITIAL ARABIC AIN;;;; -FECC;ARABIC LETTER AIN MEDIAL FORM;Lo;0;AL; 0639;;;;N;GLYPH FOR MEDIAL ARABIC AIN;;;; -FECD;ARABIC LETTER GHAIN ISOLATED FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR ISOLATE ARABIC GHAIN;;;; -FECE;ARABIC LETTER GHAIN FINAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR FINAL ARABIC GHAIN;;;; -FECF;ARABIC LETTER GHAIN INITIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR INITIAL ARABIC GHAIN;;;; -FED0;ARABIC LETTER GHAIN MEDIAL FORM;Lo;0;AL; 063A;;;;N;GLYPH FOR MEDIAL ARABIC GHAIN;;;; -FED1;ARABIC LETTER FEH ISOLATED FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR ISOLATE ARABIC FA;;;; -FED2;ARABIC LETTER FEH FINAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR FINAL ARABIC FA;;;; -FED3;ARABIC LETTER FEH INITIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR INITIAL ARABIC FA;;;; -FED4;ARABIC LETTER FEH MEDIAL FORM;Lo;0;AL; 0641;;;;N;GLYPH FOR MEDIAL ARABIC FA;;;; -FED5;ARABIC LETTER QAF ISOLATED FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR ISOLATE ARABIC QAF;;;; -FED6;ARABIC LETTER QAF FINAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR FINAL ARABIC QAF;;;; -FED7;ARABIC LETTER QAF INITIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR INITIAL ARABIC QAF;;;; -FED8;ARABIC LETTER QAF MEDIAL FORM;Lo;0;AL; 0642;;;;N;GLYPH FOR MEDIAL ARABIC QAF;;;; -FED9;ARABIC LETTER KAF ISOLATED FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR ISOLATE ARABIC CAF;;;; -FEDA;ARABIC LETTER KAF FINAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR FINAL ARABIC CAF;;;; -FEDB;ARABIC LETTER KAF INITIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR INITIAL ARABIC CAF;;;; -FEDC;ARABIC LETTER KAF MEDIAL FORM;Lo;0;AL; 0643;;;;N;GLYPH FOR MEDIAL ARABIC CAF;;;; -FEDD;ARABIC LETTER LAM ISOLATED FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR ISOLATE ARABIC LAM;;;; -FEDE;ARABIC LETTER LAM FINAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR FINAL ARABIC LAM;;;; -FEDF;ARABIC LETTER LAM INITIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR INITIAL ARABIC LAM;;;; -FEE0;ARABIC LETTER LAM MEDIAL FORM;Lo;0;AL; 0644;;;;N;GLYPH FOR MEDIAL ARABIC LAM;;;; -FEE1;ARABIC LETTER MEEM ISOLATED FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR ISOLATE ARABIC MEEM;;;; -FEE2;ARABIC LETTER MEEM FINAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR FINAL ARABIC MEEM;;;; -FEE3;ARABIC LETTER MEEM INITIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR INITIAL ARABIC MEEM;;;; -FEE4;ARABIC LETTER MEEM MEDIAL FORM;Lo;0;AL; 0645;;;;N;GLYPH FOR MEDIAL ARABIC MEEM;;;; -FEE5;ARABIC LETTER NOON ISOLATED FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR ISOLATE ARABIC NOON;;;; -FEE6;ARABIC LETTER NOON FINAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR FINAL ARABIC NOON;;;; -FEE7;ARABIC LETTER NOON INITIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR INITIAL ARABIC NOON;;;; -FEE8;ARABIC LETTER NOON MEDIAL FORM;Lo;0;AL; 0646;;;;N;GLYPH FOR MEDIAL ARABIC NOON;;;; -FEE9;ARABIC LETTER HEH ISOLATED FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR ISOLATE ARABIC HA;;;; -FEEA;ARABIC LETTER HEH FINAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR FINAL ARABIC HA;;;; -FEEB;ARABIC LETTER HEH INITIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR INITIAL ARABIC HA;;;; -FEEC;ARABIC LETTER HEH MEDIAL FORM;Lo;0;AL; 0647;;;;N;GLYPH FOR MEDIAL ARABIC HA;;;; -FEED;ARABIC LETTER WAW ISOLATED FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR ISOLATE ARABIC WAW;;;; -FEEE;ARABIC LETTER WAW FINAL FORM;Lo;0;AL; 0648;;;;N;GLYPH FOR FINAL ARABIC WAW;;;; -FEEF;ARABIC LETTER ALEF MAKSURA ISOLATED FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR ISOLATE ARABIC ALEF MAQSURAH;;;; -FEF0;ARABIC LETTER ALEF MAKSURA FINAL FORM;Lo;0;AL; 0649;;;;N;GLYPH FOR FINAL ARABIC ALEF MAQSURAH;;;; -FEF1;ARABIC LETTER YEH ISOLATED FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR ISOLATE ARABIC YA;;;; -FEF2;ARABIC LETTER YEH FINAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR FINAL ARABIC YA;;;; -FEF3;ARABIC LETTER YEH INITIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR INITIAL ARABIC YA;;;; -FEF4;ARABIC LETTER YEH MEDIAL FORM;Lo;0;AL; 064A;;;;N;GLYPH FOR MEDIAL ARABIC YA;;;; -FEF5;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR ISOLATE ARABIC MADDAH ON LIGATURE LAM ALEF;;;; -FEF6;ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM;Lo;0;AL; 0644 0622;;;;N;GLYPH FOR FINAL ARABIC MADDAH ON LIGATURE LAM ALEF;;;; -FEF7;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; -FEF8;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM;Lo;0;AL; 0644 0623;;;;N;GLYPH FOR FINAL ARABIC HAMZAH ON LIGATURE LAM ALEF;;;; -FEF9;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR ISOLATE ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; -FEFA;ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM;Lo;0;AL; 0644 0625;;;;N;GLYPH FOR FINAL ARABIC HAMZAH UNDER LIGATURE LAM ALEF;;;; -FEFB;ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR ISOLATE ARABIC LIGATURE LAM ALEF;;;; -FEFC;ARABIC LIGATURE LAM WITH ALEF FINAL FORM;Lo;0;AL; 0644 0627;;;;N;GLYPH FOR FINAL ARABIC LIGATURE LAM ALEF;;;; -FEFF;ZERO WIDTH NO-BREAK SPACE;Cf;0;BN;;;;;N;BYTE ORDER MARK;;;; -FF01;FULLWIDTH EXCLAMATION MARK;Po;0;ON; 0021;;;;N;;;;; -FF02;FULLWIDTH QUOTATION MARK;Po;0;ON; 0022;;;;N;;;;; -FF03;FULLWIDTH NUMBER SIGN;Po;0;ET; 0023;;;;N;;;;; -FF04;FULLWIDTH DOLLAR SIGN;Sc;0;ET; 0024;;;;N;;;;; -FF05;FULLWIDTH PERCENT SIGN;Po;0;ET; 0025;;;;N;;;;; -FF06;FULLWIDTH AMPERSAND;Po;0;ON; 0026;;;;N;;;;; -FF07;FULLWIDTH APOSTROPHE;Po;0;ON; 0027;;;;N;;;;; -FF08;FULLWIDTH LEFT PARENTHESIS;Ps;0;ON; 0028;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;; -FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON; 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;; -FF0A;FULLWIDTH ASTERISK;Po;0;ON; 002A;;;;N;;;;; -FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES; 002B;;;;N;;;;; -FF0C;FULLWIDTH COMMA;Po;0;CS; 002C;;;;N;;;;; -FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES; 002D;;;;N;;;;; -FF0E;FULLWIDTH FULL STOP;Po;0;CS; 002E;;;;N;FULLWIDTH PERIOD;;;; -FF0F;FULLWIDTH SOLIDUS;Po;0;CS; 002F;;;;N;FULLWIDTH SLASH;;;; -FF10;FULLWIDTH DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -FF11;FULLWIDTH DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -FF12;FULLWIDTH DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -FF13;FULLWIDTH DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -FF14;FULLWIDTH DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -FF15;FULLWIDTH DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -FF16;FULLWIDTH DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -FF17;FULLWIDTH DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -FF18;FULLWIDTH DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -FF19;FULLWIDTH DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -FF1A;FULLWIDTH COLON;Po;0;CS; 003A;;;;N;;;;; -FF1B;FULLWIDTH SEMICOLON;Po;0;ON; 003B;;;;N;;;;; -FF1C;FULLWIDTH LESS-THAN SIGN;Sm;0;ON; 003C;;;;Y;;;;; -FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON; 003D;;;;N;;;;; -FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON; 003E;;;;Y;;;;; -FF1F;FULLWIDTH QUESTION MARK;Po;0;ON; 003F;;;;N;;;;; -FF20;FULLWIDTH COMMERCIAL AT;Po;0;ON; 0040;;;;N;;;;; -FF21;FULLWIDTH LATIN CAPITAL LETTER A;Lu;0;L; 0041;;;;N;;;;FF41; -FF22;FULLWIDTH LATIN CAPITAL LETTER B;Lu;0;L; 0042;;;;N;;;;FF42; -FF23;FULLWIDTH LATIN CAPITAL LETTER C;Lu;0;L; 0043;;;;N;;;;FF43; -FF24;FULLWIDTH LATIN CAPITAL LETTER D;Lu;0;L; 0044;;;;N;;;;FF44; -FF25;FULLWIDTH LATIN CAPITAL LETTER E;Lu;0;L; 0045;;;;N;;;;FF45; -FF26;FULLWIDTH LATIN CAPITAL LETTER F;Lu;0;L; 0046;;;;N;;;;FF46; -FF27;FULLWIDTH LATIN CAPITAL LETTER G;Lu;0;L; 0047;;;;N;;;;FF47; -FF28;FULLWIDTH LATIN CAPITAL LETTER H;Lu;0;L; 0048;;;;N;;;;FF48; -FF29;FULLWIDTH LATIN CAPITAL LETTER I;Lu;0;L; 0049;;;;N;;;;FF49; -FF2A;FULLWIDTH LATIN CAPITAL LETTER J;Lu;0;L; 004A;;;;N;;;;FF4A; -FF2B;FULLWIDTH LATIN CAPITAL LETTER K;Lu;0;L; 004B;;;;N;;;;FF4B; -FF2C;FULLWIDTH LATIN CAPITAL LETTER L;Lu;0;L; 004C;;;;N;;;;FF4C; -FF2D;FULLWIDTH LATIN CAPITAL LETTER M;Lu;0;L; 004D;;;;N;;;;FF4D; -FF2E;FULLWIDTH LATIN CAPITAL LETTER N;Lu;0;L; 004E;;;;N;;;;FF4E; -FF2F;FULLWIDTH LATIN CAPITAL LETTER O;Lu;0;L; 004F;;;;N;;;;FF4F; -FF30;FULLWIDTH LATIN CAPITAL LETTER P;Lu;0;L; 0050;;;;N;;;;FF50; -FF31;FULLWIDTH LATIN CAPITAL LETTER Q;Lu;0;L; 0051;;;;N;;;;FF51; -FF32;FULLWIDTH LATIN CAPITAL LETTER R;Lu;0;L; 0052;;;;N;;;;FF52; -FF33;FULLWIDTH LATIN CAPITAL LETTER S;Lu;0;L; 0053;;;;N;;;;FF53; -FF34;FULLWIDTH LATIN CAPITAL LETTER T;Lu;0;L; 0054;;;;N;;;;FF54; -FF35;FULLWIDTH LATIN CAPITAL LETTER U;Lu;0;L; 0055;;;;N;;;;FF55; -FF36;FULLWIDTH LATIN CAPITAL LETTER V;Lu;0;L; 0056;;;;N;;;;FF56; -FF37;FULLWIDTH LATIN CAPITAL LETTER W;Lu;0;L; 0057;;;;N;;;;FF57; -FF38;FULLWIDTH LATIN CAPITAL LETTER X;Lu;0;L; 0058;;;;N;;;;FF58; -FF39;FULLWIDTH LATIN CAPITAL LETTER Y;Lu;0;L; 0059;;;;N;;;;FF59; -FF3A;FULLWIDTH LATIN CAPITAL LETTER Z;Lu;0;L; 005A;;;;N;;;;FF5A; -FF3B;FULLWIDTH LEFT SQUARE BRACKET;Ps;0;ON; 005B;;;;Y;FULLWIDTH OPENING SQUARE BRACKET;;;; -FF3C;FULLWIDTH REVERSE SOLIDUS;Po;0;ON; 005C;;;;N;FULLWIDTH BACKSLASH;;;; -FF3D;FULLWIDTH RIGHT SQUARE BRACKET;Pe;0;ON; 005D;;;;Y;FULLWIDTH CLOSING SQUARE BRACKET;;;; -FF3E;FULLWIDTH CIRCUMFLEX ACCENT;Sk;0;ON; 005E;;;;N;FULLWIDTH SPACING CIRCUMFLEX;;;; -FF3F;FULLWIDTH LOW LINE;Pc;0;ON; 005F;;;;N;FULLWIDTH SPACING UNDERSCORE;;;; -FF40;FULLWIDTH GRAVE ACCENT;Sk;0;ON; 0060;;;;N;FULLWIDTH SPACING GRAVE;;;; -FF41;FULLWIDTH LATIN SMALL LETTER A;Ll;0;L; 0061;;;;N;;;FF21;;FF21 -FF42;FULLWIDTH LATIN SMALL LETTER B;Ll;0;L; 0062;;;;N;;;FF22;;FF22 -FF43;FULLWIDTH LATIN SMALL LETTER C;Ll;0;L; 0063;;;;N;;;FF23;;FF23 -FF44;FULLWIDTH LATIN SMALL LETTER D;Ll;0;L; 0064;;;;N;;;FF24;;FF24 -FF45;FULLWIDTH LATIN SMALL LETTER E;Ll;0;L; 0065;;;;N;;;FF25;;FF25 -FF46;FULLWIDTH LATIN SMALL LETTER F;Ll;0;L; 0066;;;;N;;;FF26;;FF26 -FF47;FULLWIDTH LATIN SMALL LETTER G;Ll;0;L; 0067;;;;N;;;FF27;;FF27 -FF48;FULLWIDTH LATIN SMALL LETTER H;Ll;0;L; 0068;;;;N;;;FF28;;FF28 -FF49;FULLWIDTH LATIN SMALL LETTER I;Ll;0;L; 0069;;;;N;;;FF29;;FF29 -FF4A;FULLWIDTH LATIN SMALL LETTER J;Ll;0;L; 006A;;;;N;;;FF2A;;FF2A -FF4B;FULLWIDTH LATIN SMALL LETTER K;Ll;0;L; 006B;;;;N;;;FF2B;;FF2B -FF4C;FULLWIDTH LATIN SMALL LETTER L;Ll;0;L; 006C;;;;N;;;FF2C;;FF2C -FF4D;FULLWIDTH LATIN SMALL LETTER M;Ll;0;L; 006D;;;;N;;;FF2D;;FF2D -FF4E;FULLWIDTH LATIN SMALL LETTER N;Ll;0;L; 006E;;;;N;;;FF2E;;FF2E -FF4F;FULLWIDTH LATIN SMALL LETTER O;Ll;0;L; 006F;;;;N;;;FF2F;;FF2F -FF50;FULLWIDTH LATIN SMALL LETTER P;Ll;0;L; 0070;;;;N;;;FF30;;FF30 -FF51;FULLWIDTH LATIN SMALL LETTER Q;Ll;0;L; 0071;;;;N;;;FF31;;FF31 -FF52;FULLWIDTH LATIN SMALL LETTER R;Ll;0;L; 0072;;;;N;;;FF32;;FF32 -FF53;FULLWIDTH LATIN SMALL LETTER S;Ll;0;L; 0073;;;;N;;;FF33;;FF33 -FF54;FULLWIDTH LATIN SMALL LETTER T;Ll;0;L; 0074;;;;N;;;FF34;;FF34 -FF55;FULLWIDTH LATIN SMALL LETTER U;Ll;0;L; 0075;;;;N;;;FF35;;FF35 -FF56;FULLWIDTH LATIN SMALL LETTER V;Ll;0;L; 0076;;;;N;;;FF36;;FF36 -FF57;FULLWIDTH LATIN SMALL LETTER W;Ll;0;L; 0077;;;;N;;;FF37;;FF37 -FF58;FULLWIDTH LATIN SMALL LETTER X;Ll;0;L; 0078;;;;N;;;FF38;;FF38 -FF59;FULLWIDTH LATIN SMALL LETTER Y;Ll;0;L; 0079;;;;N;;;FF39;;FF39 -FF5A;FULLWIDTH LATIN SMALL LETTER Z;Ll;0;L; 007A;;;;N;;;FF3A;;FF3A -FF5B;FULLWIDTH LEFT CURLY BRACKET;Ps;0;ON; 007B;;;;Y;FULLWIDTH OPENING CURLY BRACKET;;;; -FF5C;FULLWIDTH VERTICAL LINE;Sm;0;ON; 007C;;;;N;FULLWIDTH VERTICAL BAR;;;; -FF5D;FULLWIDTH RIGHT CURLY BRACKET;Pe;0;ON; 007D;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;; -FF5E;FULLWIDTH TILDE;Sm;0;ON; 007E;;;;N;FULLWIDTH SPACING TILDE;;;; -FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON; 2985;;;;Y;;;;; -FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON; 2986;;;;Y;;;;; -FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON; 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;; -FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON; 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;; -FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON; 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;; -FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON; 3001;;;;N;;;;; -FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;0;ON; 30FB;;;;N;;;;; -FF66;HALFWIDTH KATAKANA LETTER WO;Lo;0;L; 30F2;;;;N;;;;; -FF67;HALFWIDTH KATAKANA LETTER SMALL A;Lo;0;L; 30A1;;;;N;;;;; -FF68;HALFWIDTH KATAKANA LETTER SMALL I;Lo;0;L; 30A3;;;;N;;;;; -FF69;HALFWIDTH KATAKANA LETTER SMALL U;Lo;0;L; 30A5;;;;N;;;;; -FF6A;HALFWIDTH KATAKANA LETTER SMALL E;Lo;0;L; 30A7;;;;N;;;;; -FF6B;HALFWIDTH KATAKANA LETTER SMALL O;Lo;0;L; 30A9;;;;N;;;;; -FF6C;HALFWIDTH KATAKANA LETTER SMALL YA;Lo;0;L; 30E3;;;;N;;;;; -FF6D;HALFWIDTH KATAKANA LETTER SMALL YU;Lo;0;L; 30E5;;;;N;;;;; -FF6E;HALFWIDTH KATAKANA LETTER SMALL YO;Lo;0;L; 30E7;;;;N;;;;; -FF6F;HALFWIDTH KATAKANA LETTER SMALL TU;Lo;0;L; 30C3;;;;N;;;;; -FF70;HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK;Lm;0;L; 30FC;;;;N;;;;; -FF71;HALFWIDTH KATAKANA LETTER A;Lo;0;L; 30A2;;;;N;;;;; -FF72;HALFWIDTH KATAKANA LETTER I;Lo;0;L; 30A4;;;;N;;;;; -FF73;HALFWIDTH KATAKANA LETTER U;Lo;0;L; 30A6;;;;N;;;;; -FF74;HALFWIDTH KATAKANA LETTER E;Lo;0;L; 30A8;;;;N;;;;; -FF75;HALFWIDTH KATAKANA LETTER O;Lo;0;L; 30AA;;;;N;;;;; -FF76;HALFWIDTH KATAKANA LETTER KA;Lo;0;L; 30AB;;;;N;;;;; -FF77;HALFWIDTH KATAKANA LETTER KI;Lo;0;L; 30AD;;;;N;;;;; -FF78;HALFWIDTH KATAKANA LETTER KU;Lo;0;L; 30AF;;;;N;;;;; -FF79;HALFWIDTH KATAKANA LETTER KE;Lo;0;L; 30B1;;;;N;;;;; -FF7A;HALFWIDTH KATAKANA LETTER KO;Lo;0;L; 30B3;;;;N;;;;; -FF7B;HALFWIDTH KATAKANA LETTER SA;Lo;0;L; 30B5;;;;N;;;;; -FF7C;HALFWIDTH KATAKANA LETTER SI;Lo;0;L; 30B7;;;;N;;;;; -FF7D;HALFWIDTH KATAKANA LETTER SU;Lo;0;L; 30B9;;;;N;;;;; -FF7E;HALFWIDTH KATAKANA LETTER SE;Lo;0;L; 30BB;;;;N;;;;; -FF7F;HALFWIDTH KATAKANA LETTER SO;Lo;0;L; 30BD;;;;N;;;;; -FF80;HALFWIDTH KATAKANA LETTER TA;Lo;0;L; 30BF;;;;N;;;;; -FF81;HALFWIDTH KATAKANA LETTER TI;Lo;0;L; 30C1;;;;N;;;;; -FF82;HALFWIDTH KATAKANA LETTER TU;Lo;0;L; 30C4;;;;N;;;;; -FF83;HALFWIDTH KATAKANA LETTER TE;Lo;0;L; 30C6;;;;N;;;;; -FF84;HALFWIDTH KATAKANA LETTER TO;Lo;0;L; 30C8;;;;N;;;;; -FF85;HALFWIDTH KATAKANA LETTER NA;Lo;0;L; 30CA;;;;N;;;;; -FF86;HALFWIDTH KATAKANA LETTER NI;Lo;0;L; 30CB;;;;N;;;;; -FF87;HALFWIDTH KATAKANA LETTER NU;Lo;0;L; 30CC;;;;N;;;;; -FF88;HALFWIDTH KATAKANA LETTER NE;Lo;0;L; 30CD;;;;N;;;;; -FF89;HALFWIDTH KATAKANA LETTER NO;Lo;0;L; 30CE;;;;N;;;;; -FF8A;HALFWIDTH KATAKANA LETTER HA;Lo;0;L; 30CF;;;;N;;;;; -FF8B;HALFWIDTH KATAKANA LETTER HI;Lo;0;L; 30D2;;;;N;;;;; -FF8C;HALFWIDTH KATAKANA LETTER HU;Lo;0;L; 30D5;;;;N;;;;; -FF8D;HALFWIDTH KATAKANA LETTER HE;Lo;0;L; 30D8;;;;N;;;;; -FF8E;HALFWIDTH KATAKANA LETTER HO;Lo;0;L; 30DB;;;;N;;;;; -FF8F;HALFWIDTH KATAKANA LETTER MA;Lo;0;L; 30DE;;;;N;;;;; -FF90;HALFWIDTH KATAKANA LETTER MI;Lo;0;L; 30DF;;;;N;;;;; -FF91;HALFWIDTH KATAKANA LETTER MU;Lo;0;L; 30E0;;;;N;;;;; -FF92;HALFWIDTH KATAKANA LETTER ME;Lo;0;L; 30E1;;;;N;;;;; -FF93;HALFWIDTH KATAKANA LETTER MO;Lo;0;L; 30E2;;;;N;;;;; -FF94;HALFWIDTH KATAKANA LETTER YA;Lo;0;L; 30E4;;;;N;;;;; -FF95;HALFWIDTH KATAKANA LETTER YU;Lo;0;L; 30E6;;;;N;;;;; -FF96;HALFWIDTH KATAKANA LETTER YO;Lo;0;L; 30E8;;;;N;;;;; -FF97;HALFWIDTH KATAKANA LETTER RA;Lo;0;L; 30E9;;;;N;;;;; -FF98;HALFWIDTH KATAKANA LETTER RI;Lo;0;L; 30EA;;;;N;;;;; -FF99;HALFWIDTH KATAKANA LETTER RU;Lo;0;L; 30EB;;;;N;;;;; -FF9A;HALFWIDTH KATAKANA LETTER RE;Lo;0;L; 30EC;;;;N;;;;; -FF9B;HALFWIDTH KATAKANA LETTER RO;Lo;0;L; 30ED;;;;N;;;;; -FF9C;HALFWIDTH KATAKANA LETTER WA;Lo;0;L; 30EF;;;;N;;;;; -FF9D;HALFWIDTH KATAKANA LETTER N;Lo;0;L; 30F3;;;;N;;;;; -FF9E;HALFWIDTH KATAKANA VOICED SOUND MARK;Lm;0;L; 3099;;;;N;;;;; -FF9F;HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK;Lm;0;L; 309A;;;;N;;;;; -FFA0;HALFWIDTH HANGUL FILLER;Lo;0;L; 3164;;;;N;HALFWIDTH HANGUL CAE OM;;;; -FFA1;HALFWIDTH HANGUL LETTER KIYEOK;Lo;0;L; 3131;;;;N;HALFWIDTH HANGUL LETTER GIYEOG;;;; -FFA2;HALFWIDTH HANGUL LETTER SSANGKIYEOK;Lo;0;L; 3132;;;;N;HALFWIDTH HANGUL LETTER SSANG GIYEOG;;;; -FFA3;HALFWIDTH HANGUL LETTER KIYEOK-SIOS;Lo;0;L; 3133;;;;N;HALFWIDTH HANGUL LETTER GIYEOG SIOS;;;; -FFA4;HALFWIDTH HANGUL LETTER NIEUN;Lo;0;L; 3134;;;;N;;;;; -FFA5;HALFWIDTH HANGUL LETTER NIEUN-CIEUC;Lo;0;L; 3135;;;;N;HALFWIDTH HANGUL LETTER NIEUN JIEUJ;;;; -FFA6;HALFWIDTH HANGUL LETTER NIEUN-HIEUH;Lo;0;L; 3136;;;;N;HALFWIDTH HANGUL LETTER NIEUN HIEUH;;;; -FFA7;HALFWIDTH HANGUL LETTER TIKEUT;Lo;0;L; 3137;;;;N;HALFWIDTH HANGUL LETTER DIGEUD;;;; -FFA8;HALFWIDTH HANGUL LETTER SSANGTIKEUT;Lo;0;L; 3138;;;;N;HALFWIDTH HANGUL LETTER SSANG DIGEUD;;;; -FFA9;HALFWIDTH HANGUL LETTER RIEUL;Lo;0;L; 3139;;;;N;HALFWIDTH HANGUL LETTER LIEUL;;;; -FFAA;HALFWIDTH HANGUL LETTER RIEUL-KIYEOK;Lo;0;L; 313A;;;;N;HALFWIDTH HANGUL LETTER LIEUL GIYEOG;;;; -FFAB;HALFWIDTH HANGUL LETTER RIEUL-MIEUM;Lo;0;L; 313B;;;;N;HALFWIDTH HANGUL LETTER LIEUL MIEUM;;;; -FFAC;HALFWIDTH HANGUL LETTER RIEUL-PIEUP;Lo;0;L; 313C;;;;N;HALFWIDTH HANGUL LETTER LIEUL BIEUB;;;; -FFAD;HALFWIDTH HANGUL LETTER RIEUL-SIOS;Lo;0;L; 313D;;;;N;HALFWIDTH HANGUL LETTER LIEUL SIOS;;;; -FFAE;HALFWIDTH HANGUL LETTER RIEUL-THIEUTH;Lo;0;L; 313E;;;;N;HALFWIDTH HANGUL LETTER LIEUL TIEUT;;;; -FFAF;HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH;Lo;0;L; 313F;;;;N;HALFWIDTH HANGUL LETTER LIEUL PIEUP;;;; -FFB0;HALFWIDTH HANGUL LETTER RIEUL-HIEUH;Lo;0;L; 3140;;;;N;HALFWIDTH HANGUL LETTER LIEUL HIEUH;;;; -FFB1;HALFWIDTH HANGUL LETTER MIEUM;Lo;0;L; 3141;;;;N;;;;; -FFB2;HALFWIDTH HANGUL LETTER PIEUP;Lo;0;L; 3142;;;;N;HALFWIDTH HANGUL LETTER BIEUB;;;; -FFB3;HALFWIDTH HANGUL LETTER SSANGPIEUP;Lo;0;L; 3143;;;;N;HALFWIDTH HANGUL LETTER SSANG BIEUB;;;; -FFB4;HALFWIDTH HANGUL LETTER PIEUP-SIOS;Lo;0;L; 3144;;;;N;HALFWIDTH HANGUL LETTER BIEUB SIOS;;;; -FFB5;HALFWIDTH HANGUL LETTER SIOS;Lo;0;L; 3145;;;;N;;;;; -FFB6;HALFWIDTH HANGUL LETTER SSANGSIOS;Lo;0;L; 3146;;;;N;HALFWIDTH HANGUL LETTER SSANG SIOS;;;; -FFB7;HALFWIDTH HANGUL LETTER IEUNG;Lo;0;L; 3147;;;;N;;;;; -FFB8;HALFWIDTH HANGUL LETTER CIEUC;Lo;0;L; 3148;;;;N;HALFWIDTH HANGUL LETTER JIEUJ;;;; -FFB9;HALFWIDTH HANGUL LETTER SSANGCIEUC;Lo;0;L; 3149;;;;N;HALFWIDTH HANGUL LETTER SSANG JIEUJ;;;; -FFBA;HALFWIDTH HANGUL LETTER CHIEUCH;Lo;0;L; 314A;;;;N;HALFWIDTH HANGUL LETTER CIEUC;;;; -FFBB;HALFWIDTH HANGUL LETTER KHIEUKH;Lo;0;L; 314B;;;;N;HALFWIDTH HANGUL LETTER KIYEOK;;;; -FFBC;HALFWIDTH HANGUL LETTER THIEUTH;Lo;0;L; 314C;;;;N;HALFWIDTH HANGUL LETTER TIEUT;;;; -FFBD;HALFWIDTH HANGUL LETTER PHIEUPH;Lo;0;L; 314D;;;;N;HALFWIDTH HANGUL LETTER PIEUP;;;; -FFBE;HALFWIDTH HANGUL LETTER HIEUH;Lo;0;L; 314E;;;;N;;;;; -FFC2;HALFWIDTH HANGUL LETTER A;Lo;0;L; 314F;;;;N;;;;; -FFC3;HALFWIDTH HANGUL LETTER AE;Lo;0;L; 3150;;;;N;;;;; -FFC4;HALFWIDTH HANGUL LETTER YA;Lo;0;L; 3151;;;;N;;;;; -FFC5;HALFWIDTH HANGUL LETTER YAE;Lo;0;L; 3152;;;;N;;;;; -FFC6;HALFWIDTH HANGUL LETTER EO;Lo;0;L; 3153;;;;N;;;;; -FFC7;HALFWIDTH HANGUL LETTER E;Lo;0;L; 3154;;;;N;;;;; -FFCA;HALFWIDTH HANGUL LETTER YEO;Lo;0;L; 3155;;;;N;;;;; -FFCB;HALFWIDTH HANGUL LETTER YE;Lo;0;L; 3156;;;;N;;;;; -FFCC;HALFWIDTH HANGUL LETTER O;Lo;0;L; 3157;;;;N;;;;; -FFCD;HALFWIDTH HANGUL LETTER WA;Lo;0;L; 3158;;;;N;;;;; -FFCE;HALFWIDTH HANGUL LETTER WAE;Lo;0;L; 3159;;;;N;;;;; -FFCF;HALFWIDTH HANGUL LETTER OE;Lo;0;L; 315A;;;;N;;;;; -FFD2;HALFWIDTH HANGUL LETTER YO;Lo;0;L; 315B;;;;N;;;;; -FFD3;HALFWIDTH HANGUL LETTER U;Lo;0;L; 315C;;;;N;;;;; -FFD4;HALFWIDTH HANGUL LETTER WEO;Lo;0;L; 315D;;;;N;;;;; -FFD5;HALFWIDTH HANGUL LETTER WE;Lo;0;L; 315E;;;;N;;;;; -FFD6;HALFWIDTH HANGUL LETTER WI;Lo;0;L; 315F;;;;N;;;;; -FFD7;HALFWIDTH HANGUL LETTER YU;Lo;0;L; 3160;;;;N;;;;; -FFDA;HALFWIDTH HANGUL LETTER EU;Lo;0;L; 3161;;;;N;;;;; -FFDB;HALFWIDTH HANGUL LETTER YI;Lo;0;L; 3162;;;;N;;;;; -FFDC;HALFWIDTH HANGUL LETTER I;Lo;0;L; 3163;;;;N;;;;; -FFE0;FULLWIDTH CENT SIGN;Sc;0;ET; 00A2;;;;N;;;;; -FFE1;FULLWIDTH POUND SIGN;Sc;0;ET; 00A3;;;;N;;;;; -FFE2;FULLWIDTH NOT SIGN;Sm;0;ON; 00AC;;;;N;;;;; -FFE3;FULLWIDTH MACRON;Sk;0;ON; 00AF;;;;N;FULLWIDTH SPACING MACRON;;;; -FFE4;FULLWIDTH BROKEN BAR;So;0;ON; 00A6;;;;N;FULLWIDTH BROKEN VERTICAL BAR;;;; -FFE5;FULLWIDTH YEN SIGN;Sc;0;ET; 00A5;;;;N;;;;; -FFE6;FULLWIDTH WON SIGN;Sc;0;ET; 20A9;;;;N;;;;; -FFE8;HALFWIDTH FORMS LIGHT VERTICAL;So;0;ON; 2502;;;;N;;;;; -FFE9;HALFWIDTH LEFTWARDS ARROW;Sm;0;ON; 2190;;;;N;;;;; -FFEA;HALFWIDTH UPWARDS ARROW;Sm;0;ON; 2191;;;;N;;;;; -FFEB;HALFWIDTH RIGHTWARDS ARROW;Sm;0;ON; 2192;;;;N;;;;; -FFEC;HALFWIDTH DOWNWARDS ARROW;Sm;0;ON; 2193;;;;N;;;;; -FFED;HALFWIDTH BLACK SQUARE;So;0;ON; 25A0;;;;N;;;;; -FFEE;HALFWIDTH WHITE CIRCLE;So;0;ON; 25CB;;;;N;;;;; -FFF9;INTERLINEAR ANNOTATION ANCHOR;Cf;0;ON;;;;;N;;;;; -FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;; -FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;; -FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; -FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;; -10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;; -10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;; -10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;; -10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;; -10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;; -10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;; -10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;; -10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;; -10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;; -10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;; -1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;; -1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;; -1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;; -1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;; -1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;; -10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;; -10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;; -10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;; -10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;; -10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;; -10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;; -10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;; -10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;; -10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;; -10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;; -1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;; -1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;; -1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;; -1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;; -1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;; -1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;; -10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;; -10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;; -10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;; -10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;; -10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;; -10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;; -10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;; -10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;; -10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;; -1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;; -1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;; -1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;; -1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;; -1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;; -1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;; -10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;; -10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;; -10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;; -10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;; -10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;; -10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;; -10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;; -10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;; -10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;; -10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;; -1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;; -1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;; -1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;; -1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;; -10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;; -10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;; -10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;; -10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;; -10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;; -10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;; -10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;; -10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;; -10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;; -10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;; -1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;; -1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;; -1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;; -1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;; -10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;; -10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;; -10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;; -10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;; -10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;; -10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;; -10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;; -10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;; -10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;; -10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;; -1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;; -1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;; -1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;; -1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;; -10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;; -10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;; -10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;; -10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;; -10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;; -10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;; -10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;; -10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;; -10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;; -10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;; -1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;; -1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;; -1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;; -1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;; -1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;; -1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;; -10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;; -10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;; -10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;; -10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;; -10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;; -10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;; -10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;; -10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;; -10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;; -10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;; -1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;; -1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;; -1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;; -1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;; -1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;; -1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;; -100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;; -100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;; -100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;; -100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;; -100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;; -100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;; -100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;; -100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;; -100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;; -100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;; -100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;; -100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;; -100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;; -100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;; -100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;; -100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;; -100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;; -100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;; -100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;; -100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;; -100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;; -100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;; -100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;; -100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;; -100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;; -100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;; -100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;; -100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;; -100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;; -100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;; -100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;; -100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;; -100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;; -100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;; -100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;; -100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;; -100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;; -100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;; -100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;; -100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;; -100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;; -100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;;;; -100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;; -100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;;;; -100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;; -100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;; -100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;; -100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;; -100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;; -100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;; -100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;; -100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;; -100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;; -100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;; -100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;; -100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;; -100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;; -100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;; -100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;; -100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;; -100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;; -100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;; -100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;; -100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;; -100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;; -100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;; -100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;; -100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;; -100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;; -100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;; -100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;; -100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;; -100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;; -100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;; -100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;; -100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;; -100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;; -100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;; -100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;; -100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;; -100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;; -100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;; -100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;; -100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;; -100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;; -100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;; -100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;; -100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;; -100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;; -100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;; -100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;; -10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;; -10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;; -10102;AEGEAN CHECK MARK;Po;0;L;;;;;N;;;;; -10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;; -10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;; -10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;; -1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;; -1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;; -1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;; -1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;; -1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;; -1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;; -10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;; -10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;; -10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;; -10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;; -10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;; -10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;; -10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;; -10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;; -1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;; -1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;; -1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;; -1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;; -1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;; -10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;; -10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;; -10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;; -10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;; -10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;; -10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;; -10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;; -10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;; -10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;; -1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;; -1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;; -1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;; -1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;; -1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;; -1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;; -10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;; -10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;; -10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;; -10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;; -10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;; -10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;; -10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;; -1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;; -1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;; -1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; -1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;; -1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;; -1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;; -10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;; -10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;; -10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;; -10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;; -10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;; -10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; -10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;; -10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;; -10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;; -1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;; -1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;; -1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;; -1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;; -1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;; -1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;; -10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;; -10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;; -10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;; -10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;; -10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;; -10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;; -10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;; -10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;; -10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;; -10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;; -1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;; -1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;; -1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;; -1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; -1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;; -1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;; -10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;; -10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;; -10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;; -10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;; -10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;; -10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;; -10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;; -10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;; -10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;; -10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;; -1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;; -1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;; -1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;; -10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;; -10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;; -10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;; -10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;; -10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;; -10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;; -10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;; -10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;; -10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;; -1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;; -1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;; -1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;; -1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;; -1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;; -1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;; -10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;; -10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;; -10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;; -10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;; -10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;; -10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;; -10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;; -10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;; -10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;; -10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;; -1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;; -1018B;GREEK ONE QUARTER SIGN;No;0;ON;;;;1/4;N;;;;; -1018C;GREEK SINUSOID SIGN;So;0;ON;;;;;N;;;;; -10190;ROMAN SEXTANS SIGN;So;0;ON;;;;;N;;;;; -10191;ROMAN UNCIA SIGN;So;0;ON;;;;;N;;;;; -10192;ROMAN SEMUNCIA SIGN;So;0;ON;;;;;N;;;;; -10193;ROMAN SEXTULA SIGN;So;0;ON;;;;;N;;;;; -10194;ROMAN DIMIDIA SEXTULA SIGN;So;0;ON;;;;;N;;;;; -10195;ROMAN SILIQUA SIGN;So;0;ON;;;;;N;;;;; -10196;ROMAN DENARIUS SIGN;So;0;ON;;;;;N;;;;; -10197;ROMAN QUINARIUS SIGN;So;0;ON;;;;;N;;;;; -10198;ROMAN SESTERTIUS SIGN;So;0;ON;;;;;N;;;;; -10199;ROMAN DUPONDIUS SIGN;So;0;ON;;;;;N;;;;; -1019A;ROMAN AS SIGN;So;0;ON;;;;;N;;;;; -1019B;ROMAN CENTURIAL SIGN;So;0;ON;;;;;N;;;;; -101A0;GREEK SYMBOL TAU RHO;So;0;ON;;;;;N;;;;; -101D0;PHAISTOS DISC SIGN PEDESTRIAN;So;0;L;;;;;N;;;;; -101D1;PHAISTOS DISC SIGN PLUMED HEAD;So;0;L;;;;;N;;;;; -101D2;PHAISTOS DISC SIGN TATTOOED HEAD;So;0;L;;;;;N;;;;; -101D3;PHAISTOS DISC SIGN CAPTIVE;So;0;L;;;;;N;;;;; -101D4;PHAISTOS DISC SIGN CHILD;So;0;L;;;;;N;;;;; -101D5;PHAISTOS DISC SIGN WOMAN;So;0;L;;;;;N;;;;; -101D6;PHAISTOS DISC SIGN HELMET;So;0;L;;;;;N;;;;; -101D7;PHAISTOS DISC SIGN GAUNTLET;So;0;L;;;;;N;;;;; -101D8;PHAISTOS DISC SIGN TIARA;So;0;L;;;;;N;;;;; -101D9;PHAISTOS DISC SIGN ARROW;So;0;L;;;;;N;;;;; -101DA;PHAISTOS DISC SIGN BOW;So;0;L;;;;;N;;;;; -101DB;PHAISTOS DISC SIGN SHIELD;So;0;L;;;;;N;;;;; -101DC;PHAISTOS DISC SIGN CLUB;So;0;L;;;;;N;;;;; -101DD;PHAISTOS DISC SIGN MANACLES;So;0;L;;;;;N;;;;; -101DE;PHAISTOS DISC SIGN MATTOCK;So;0;L;;;;;N;;;;; -101DF;PHAISTOS DISC SIGN SAW;So;0;L;;;;;N;;;;; -101E0;PHAISTOS DISC SIGN LID;So;0;L;;;;;N;;;;; -101E1;PHAISTOS DISC SIGN BOOMERANG;So;0;L;;;;;N;;;;; -101E2;PHAISTOS DISC SIGN CARPENTRY PLANE;So;0;L;;;;;N;;;;; -101E3;PHAISTOS DISC SIGN DOLIUM;So;0;L;;;;;N;;;;; -101E4;PHAISTOS DISC SIGN COMB;So;0;L;;;;;N;;;;; -101E5;PHAISTOS DISC SIGN SLING;So;0;L;;;;;N;;;;; -101E6;PHAISTOS DISC SIGN COLUMN;So;0;L;;;;;N;;;;; -101E7;PHAISTOS DISC SIGN BEEHIVE;So;0;L;;;;;N;;;;; -101E8;PHAISTOS DISC SIGN SHIP;So;0;L;;;;;N;;;;; -101E9;PHAISTOS DISC SIGN HORN;So;0;L;;;;;N;;;;; -101EA;PHAISTOS DISC SIGN HIDE;So;0;L;;;;;N;;;;; -101EB;PHAISTOS DISC SIGN BULLS LEG;So;0;L;;;;;N;;;;; -101EC;PHAISTOS DISC SIGN CAT;So;0;L;;;;;N;;;;; -101ED;PHAISTOS DISC SIGN RAM;So;0;L;;;;;N;;;;; -101EE;PHAISTOS DISC SIGN EAGLE;So;0;L;;;;;N;;;;; -101EF;PHAISTOS DISC SIGN DOVE;So;0;L;;;;;N;;;;; -101F0;PHAISTOS DISC SIGN TUNNY;So;0;L;;;;;N;;;;; -101F1;PHAISTOS DISC SIGN BEE;So;0;L;;;;;N;;;;; -101F2;PHAISTOS DISC SIGN PLANE TREE;So;0;L;;;;;N;;;;; -101F3;PHAISTOS DISC SIGN VINE;So;0;L;;;;;N;;;;; -101F4;PHAISTOS DISC SIGN PAPYRUS;So;0;L;;;;;N;;;;; -101F5;PHAISTOS DISC SIGN ROSETTE;So;0;L;;;;;N;;;;; -101F6;PHAISTOS DISC SIGN LILY;So;0;L;;;;;N;;;;; -101F7;PHAISTOS DISC SIGN OX BACK;So;0;L;;;;;N;;;;; -101F8;PHAISTOS DISC SIGN FLUTE;So;0;L;;;;;N;;;;; -101F9;PHAISTOS DISC SIGN GRATER;So;0;L;;;;;N;;;;; -101FA;PHAISTOS DISC SIGN STRAINER;So;0;L;;;;;N;;;;; -101FB;PHAISTOS DISC SIGN SMALL AXE;So;0;L;;;;;N;;;;; -101FC;PHAISTOS DISC SIGN WAVY BAND;So;0;L;;;;;N;;;;; -101FD;PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE;Mn;220;NSM;;;;;N;;;;; -10280;LYCIAN LETTER A;Lo;0;L;;;;;N;;;;; -10281;LYCIAN LETTER E;Lo;0;L;;;;;N;;;;; -10282;LYCIAN LETTER B;Lo;0;L;;;;;N;;;;; -10283;LYCIAN LETTER BH;Lo;0;L;;;;;N;;;;; -10284;LYCIAN LETTER G;Lo;0;L;;;;;N;;;;; -10285;LYCIAN LETTER D;Lo;0;L;;;;;N;;;;; -10286;LYCIAN LETTER I;Lo;0;L;;;;;N;;;;; -10287;LYCIAN LETTER W;Lo;0;L;;;;;N;;;;; -10288;LYCIAN LETTER Z;Lo;0;L;;;;;N;;;;; -10289;LYCIAN LETTER TH;Lo;0;L;;;;;N;;;;; -1028A;LYCIAN LETTER J;Lo;0;L;;;;;N;;;;; -1028B;LYCIAN LETTER K;Lo;0;L;;;;;N;;;;; -1028C;LYCIAN LETTER Q;Lo;0;L;;;;;N;;;;; -1028D;LYCIAN LETTER L;Lo;0;L;;;;;N;;;;; -1028E;LYCIAN LETTER M;Lo;0;L;;;;;N;;;;; -1028F;LYCIAN LETTER N;Lo;0;L;;;;;N;;;;; -10290;LYCIAN LETTER MM;Lo;0;L;;;;;N;;;;; -10291;LYCIAN LETTER NN;Lo;0;L;;;;;N;;;;; -10292;LYCIAN LETTER U;Lo;0;L;;;;;N;;;;; -10293;LYCIAN LETTER P;Lo;0;L;;;;;N;;;;; -10294;LYCIAN LETTER KK;Lo;0;L;;;;;N;;;;; -10295;LYCIAN LETTER R;Lo;0;L;;;;;N;;;;; -10296;LYCIAN LETTER S;Lo;0;L;;;;;N;;;;; -10297;LYCIAN LETTER T;Lo;0;L;;;;;N;;;;; -10298;LYCIAN LETTER TT;Lo;0;L;;;;;N;;;;; -10299;LYCIAN LETTER AN;Lo;0;L;;;;;N;;;;; -1029A;LYCIAN LETTER EN;Lo;0;L;;;;;N;;;;; -1029B;LYCIAN LETTER H;Lo;0;L;;;;;N;;;;; -1029C;LYCIAN LETTER X;Lo;0;L;;;;;N;;;;; -102A0;CARIAN LETTER A;Lo;0;L;;;;;N;;;;; -102A1;CARIAN LETTER P2;Lo;0;L;;;;;N;;;;; -102A2;CARIAN LETTER D;Lo;0;L;;;;;N;;;;; -102A3;CARIAN LETTER L;Lo;0;L;;;;;N;;;;; -102A4;CARIAN LETTER UUU;Lo;0;L;;;;;N;;;;; -102A5;CARIAN LETTER R;Lo;0;L;;;;;N;;;;; -102A6;CARIAN LETTER LD;Lo;0;L;;;;;N;;;;; -102A7;CARIAN LETTER A2;Lo;0;L;;;;;N;;;;; -102A8;CARIAN LETTER Q;Lo;0;L;;;;;N;;;;; -102A9;CARIAN LETTER B;Lo;0;L;;;;;N;;;;; -102AA;CARIAN LETTER M;Lo;0;L;;;;;N;;;;; -102AB;CARIAN LETTER O;Lo;0;L;;;;;N;;;;; -102AC;CARIAN LETTER D2;Lo;0;L;;;;;N;;;;; -102AD;CARIAN LETTER T;Lo;0;L;;;;;N;;;;; -102AE;CARIAN LETTER SH;Lo;0;L;;;;;N;;;;; -102AF;CARIAN LETTER SH2;Lo;0;L;;;;;N;;;;; -102B0;CARIAN LETTER S;Lo;0;L;;;;;N;;;;; -102B1;CARIAN LETTER C-18;Lo;0;L;;;;;N;;;;; -102B2;CARIAN LETTER U;Lo;0;L;;;;;N;;;;; -102B3;CARIAN LETTER NN;Lo;0;L;;;;;N;;;;; -102B4;CARIAN LETTER X;Lo;0;L;;;;;N;;;;; -102B5;CARIAN LETTER N;Lo;0;L;;;;;N;;;;; -102B6;CARIAN LETTER TT2;Lo;0;L;;;;;N;;;;; -102B7;CARIAN LETTER P;Lo;0;L;;;;;N;;;;; -102B8;CARIAN LETTER SS;Lo;0;L;;;;;N;;;;; -102B9;CARIAN LETTER I;Lo;0;L;;;;;N;;;;; -102BA;CARIAN LETTER E;Lo;0;L;;;;;N;;;;; -102BB;CARIAN LETTER UUUU;Lo;0;L;;;;;N;;;;; -102BC;CARIAN LETTER K;Lo;0;L;;;;;N;;;;; -102BD;CARIAN LETTER K2;Lo;0;L;;;;;N;;;;; -102BE;CARIAN LETTER ND;Lo;0;L;;;;;N;;;;; -102BF;CARIAN LETTER UU;Lo;0;L;;;;;N;;;;; -102C0;CARIAN LETTER G;Lo;0;L;;;;;N;;;;; -102C1;CARIAN LETTER G2;Lo;0;L;;;;;N;;;;; -102C2;CARIAN LETTER ST;Lo;0;L;;;;;N;;;;; -102C3;CARIAN LETTER ST2;Lo;0;L;;;;;N;;;;; -102C4;CARIAN LETTER NG;Lo;0;L;;;;;N;;;;; -102C5;CARIAN LETTER II;Lo;0;L;;;;;N;;;;; -102C6;CARIAN LETTER C-39;Lo;0;L;;;;;N;;;;; -102C7;CARIAN LETTER TT;Lo;0;L;;;;;N;;;;; -102C8;CARIAN LETTER UUU2;Lo;0;L;;;;;N;;;;; -102C9;CARIAN LETTER RR;Lo;0;L;;;;;N;;;;; -102CA;CARIAN LETTER MB;Lo;0;L;;;;;N;;;;; -102CB;CARIAN LETTER MB2;Lo;0;L;;;;;N;;;;; -102CC;CARIAN LETTER MB3;Lo;0;L;;;;;N;;;;; -102CD;CARIAN LETTER MB4;Lo;0;L;;;;;N;;;;; -102CE;CARIAN LETTER LD2;Lo;0;L;;;;;N;;;;; -102CF;CARIAN LETTER E2;Lo;0;L;;;;;N;;;;; -102D0;CARIAN LETTER UUU3;Lo;0;L;;;;;N;;;;; -102E0;COPTIC EPACT THOUSANDS MARK;Mn;220;NSM;;;;;N;;;;; -102E1;COPTIC EPACT DIGIT ONE;No;0;EN;;;;1;N;;;;; -102E2;COPTIC EPACT DIGIT TWO;No;0;EN;;;;2;N;;;;; -102E3;COPTIC EPACT DIGIT THREE;No;0;EN;;;;3;N;;;;; -102E4;COPTIC EPACT DIGIT FOUR;No;0;EN;;;;4;N;;;;; -102E5;COPTIC EPACT DIGIT FIVE;No;0;EN;;;;5;N;;;;; -102E6;COPTIC EPACT DIGIT SIX;No;0;EN;;;;6;N;;;;; -102E7;COPTIC EPACT DIGIT SEVEN;No;0;EN;;;;7;N;;;;; -102E8;COPTIC EPACT DIGIT EIGHT;No;0;EN;;;;8;N;;;;; -102E9;COPTIC EPACT DIGIT NINE;No;0;EN;;;;9;N;;;;; -102EA;COPTIC EPACT NUMBER TEN;No;0;EN;;;;10;N;;;;; -102EB;COPTIC EPACT NUMBER TWENTY;No;0;EN;;;;20;N;;;;; -102EC;COPTIC EPACT NUMBER THIRTY;No;0;EN;;;;30;N;;;;; -102ED;COPTIC EPACT NUMBER FORTY;No;0;EN;;;;40;N;;;;; -102EE;COPTIC EPACT NUMBER FIFTY;No;0;EN;;;;50;N;;;;; -102EF;COPTIC EPACT NUMBER SIXTY;No;0;EN;;;;60;N;;;;; -102F0;COPTIC EPACT NUMBER SEVENTY;No;0;EN;;;;70;N;;;;; -102F1;COPTIC EPACT NUMBER EIGHTY;No;0;EN;;;;80;N;;;;; -102F2;COPTIC EPACT NUMBER NINETY;No;0;EN;;;;90;N;;;;; -102F3;COPTIC EPACT NUMBER ONE HUNDRED;No;0;EN;;;;100;N;;;;; -102F4;COPTIC EPACT NUMBER TWO HUNDRED;No;0;EN;;;;200;N;;;;; -102F5;COPTIC EPACT NUMBER THREE HUNDRED;No;0;EN;;;;300;N;;;;; -102F6;COPTIC EPACT NUMBER FOUR HUNDRED;No;0;EN;;;;400;N;;;;; -102F7;COPTIC EPACT NUMBER FIVE HUNDRED;No;0;EN;;;;500;N;;;;; -102F8;COPTIC EPACT NUMBER SIX HUNDRED;No;0;EN;;;;600;N;;;;; -102F9;COPTIC EPACT NUMBER SEVEN HUNDRED;No;0;EN;;;;700;N;;;;; -102FA;COPTIC EPACT NUMBER EIGHT HUNDRED;No;0;EN;;;;800;N;;;;; -102FB;COPTIC EPACT NUMBER NINE HUNDRED;No;0;EN;;;;900;N;;;;; -10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;; -10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;; -10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;; -10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;; -10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;; -10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;; -10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;; -10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;; -10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;; -10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;; -1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;; -1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;; -1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;; -1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;; -1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;; -1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;;;; -10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;; -10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;; -10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;; -10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;; -10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;; -10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;; -10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;; -10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;;;; -10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;; -10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;; -1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;; -1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;;;; -1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;;;; -1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;;;; -1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;;;; -1031F;OLD ITALIC LETTER ESS;Lo;0;L;;;;;N;;;;; -10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;; -10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;; -10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;; -10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;; -10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;; -10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;; -10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;; -10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;; -10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;; -10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;; -10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;; -10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;; -10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;; -10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;; -1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;; -1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;; -1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;; -1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;; -1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;; -1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;; -10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;; -10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;; -10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;; -10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;; -10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;; -10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;; -10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;; -10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;; -10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;; -10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;; -1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;; -10350;OLD PERMIC LETTER AN;Lo;0;L;;;;;N;;;;; -10351;OLD PERMIC LETTER BUR;Lo;0;L;;;;;N;;;;; -10352;OLD PERMIC LETTER GAI;Lo;0;L;;;;;N;;;;; -10353;OLD PERMIC LETTER DOI;Lo;0;L;;;;;N;;;;; -10354;OLD PERMIC LETTER E;Lo;0;L;;;;;N;;;;; -10355;OLD PERMIC LETTER ZHOI;Lo;0;L;;;;;N;;;;; -10356;OLD PERMIC LETTER DZHOI;Lo;0;L;;;;;N;;;;; -10357;OLD PERMIC LETTER ZATA;Lo;0;L;;;;;N;;;;; -10358;OLD PERMIC LETTER DZITA;Lo;0;L;;;;;N;;;;; -10359;OLD PERMIC LETTER I;Lo;0;L;;;;;N;;;;; -1035A;OLD PERMIC LETTER KOKE;Lo;0;L;;;;;N;;;;; -1035B;OLD PERMIC LETTER LEI;Lo;0;L;;;;;N;;;;; -1035C;OLD PERMIC LETTER MENOE;Lo;0;L;;;;;N;;;;; -1035D;OLD PERMIC LETTER NENOE;Lo;0;L;;;;;N;;;;; -1035E;OLD PERMIC LETTER VOOI;Lo;0;L;;;;;N;;;;; -1035F;OLD PERMIC LETTER PEEI;Lo;0;L;;;;;N;;;;; -10360;OLD PERMIC LETTER REI;Lo;0;L;;;;;N;;;;; -10361;OLD PERMIC LETTER SII;Lo;0;L;;;;;N;;;;; -10362;OLD PERMIC LETTER TAI;Lo;0;L;;;;;N;;;;; -10363;OLD PERMIC LETTER U;Lo;0;L;;;;;N;;;;; -10364;OLD PERMIC LETTER CHERY;Lo;0;L;;;;;N;;;;; -10365;OLD PERMIC LETTER SHOOI;Lo;0;L;;;;;N;;;;; -10366;OLD PERMIC LETTER SHCHOOI;Lo;0;L;;;;;N;;;;; -10367;OLD PERMIC LETTER YRY;Lo;0;L;;;;;N;;;;; -10368;OLD PERMIC LETTER YERU;Lo;0;L;;;;;N;;;;; -10369;OLD PERMIC LETTER O;Lo;0;L;;;;;N;;;;; -1036A;OLD PERMIC LETTER OO;Lo;0;L;;;;;N;;;;; -1036B;OLD PERMIC LETTER EF;Lo;0;L;;;;;N;;;;; -1036C;OLD PERMIC LETTER HA;Lo;0;L;;;;;N;;;;; -1036D;OLD PERMIC LETTER TSIU;Lo;0;L;;;;;N;;;;; -1036E;OLD PERMIC LETTER VER;Lo;0;L;;;;;N;;;;; -1036F;OLD PERMIC LETTER YER;Lo;0;L;;;;;N;;;;; -10370;OLD PERMIC LETTER YERI;Lo;0;L;;;;;N;;;;; -10371;OLD PERMIC LETTER YAT;Lo;0;L;;;;;N;;;;; -10372;OLD PERMIC LETTER IE;Lo;0;L;;;;;N;;;;; -10373;OLD PERMIC LETTER YU;Lo;0;L;;;;;N;;;;; -10374;OLD PERMIC LETTER YA;Lo;0;L;;;;;N;;;;; -10375;OLD PERMIC LETTER IA;Lo;0;L;;;;;N;;;;; -10376;COMBINING OLD PERMIC LETTER AN;Mn;230;NSM;;;;;N;;;;; -10377;COMBINING OLD PERMIC LETTER DOI;Mn;230;NSM;;;;;N;;;;; -10378;COMBINING OLD PERMIC LETTER ZATA;Mn;230;NSM;;;;;N;;;;; -10379;COMBINING OLD PERMIC LETTER NENOE;Mn;230;NSM;;;;;N;;;;; -1037A;COMBINING OLD PERMIC LETTER SII;Mn;230;NSM;;;;;N;;;;; -10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;; -10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;; -10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;; -10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;; -10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;; -10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;; -10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;; -10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;; -10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;; -10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;; -1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;; -1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;; -1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;; -1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;; -1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;; -1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;; -10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;; -10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;; -10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;; -10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;; -10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;; -10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;; -10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;; -10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;; -10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;; -10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;; -1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;; -1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;; -1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;; -1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;; -1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;; -103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;; -103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;; -103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;; -103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;; -103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;; -103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;; -103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;; -103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;; -103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;; -103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;; -103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;; -103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;; -103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;; -103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;; -103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;; -103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;; -103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;; -103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;; -103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;; -103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;; -103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;; -103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;; -103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;; -103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;; -103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;; -103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;; -103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;; -103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;; -103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;; -103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;; -103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;; -103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;; -103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;; -103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;; -103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;; -103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;; -103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;; -103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;; -103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;; -103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;; -103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;; -103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;; -103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;; -103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;; -103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; -103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;; -103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;; -103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;; -103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;; -103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;; -10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428; -10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429; -10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A; -10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B; -10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C; -10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D; -10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E; -10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F; -10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430; -10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431; -1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432; -1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433; -1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434; -1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435; -1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436; -1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437; -10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438; -10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439; -10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A; -10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B; -10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C; -10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D; -10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E; -10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F; -10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440; -10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441; -1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442; -1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443; -1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444; -1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445; -1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446; -1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447; -10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448; -10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449; -10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A; -10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B; -10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C; -10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D; -10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E; -10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F; -10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400 -10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401 -1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402 -1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403 -1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404 -1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405 -1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406 -1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407 -10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408 -10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409 -10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A -10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B -10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C -10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D -10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E -10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F -10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410 -10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411 -1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412 -1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413 -1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414 -1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415 -1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416 -1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417 -10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418 -10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419 -10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A -10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B -10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C -10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D -10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E -10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F -10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420 -10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421 -1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422 -1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423 -1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424 -1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425 -1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426 -1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427 -10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;; -10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;; -10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;; -10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;; -10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;; -10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;; -10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;; -10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;; -10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;; -10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;; -1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;; -1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;; -1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;; -1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;; -1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;; -1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;; -10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;; -10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;; -10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;; -10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;; -10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;; -10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;; -10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;; -10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;; -10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;; -10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;; -1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;; -1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;; -1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;; -1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;; -1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;; -1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;; -10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;; -10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;; -10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;; -10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;; -10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;; -10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;; -10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;; -10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;; -10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;; -10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;; -1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;; -1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;; -1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;; -1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;; -1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;; -1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;; -10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;; -10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;; -10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;; -10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;; -10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;; -10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;; -10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;; -10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;; -10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;; -10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;; -1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;; -1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;; -1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;; -1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;; -1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;; -1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;; -10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;; -10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;; -10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;; -10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;; -10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;; -10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;; -10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;; -10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;; -10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;; -10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;; -1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;; -1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;; -1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;; -1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;; -104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -10500;ELBASAN LETTER A;Lo;0;L;;;;;N;;;;; -10501;ELBASAN LETTER BE;Lo;0;L;;;;;N;;;;; -10502;ELBASAN LETTER CE;Lo;0;L;;;;;N;;;;; -10503;ELBASAN LETTER CHE;Lo;0;L;;;;;N;;;;; -10504;ELBASAN LETTER DE;Lo;0;L;;;;;N;;;;; -10505;ELBASAN LETTER NDE;Lo;0;L;;;;;N;;;;; -10506;ELBASAN LETTER DHE;Lo;0;L;;;;;N;;;;; -10507;ELBASAN LETTER EI;Lo;0;L;;;;;N;;;;; -10508;ELBASAN LETTER E;Lo;0;L;;;;;N;;;;; -10509;ELBASAN LETTER FE;Lo;0;L;;;;;N;;;;; -1050A;ELBASAN LETTER GE;Lo;0;L;;;;;N;;;;; -1050B;ELBASAN LETTER GJE;Lo;0;L;;;;;N;;;;; -1050C;ELBASAN LETTER HE;Lo;0;L;;;;;N;;;;; -1050D;ELBASAN LETTER I;Lo;0;L;;;;;N;;;;; -1050E;ELBASAN LETTER JE;Lo;0;L;;;;;N;;;;; -1050F;ELBASAN LETTER KE;Lo;0;L;;;;;N;;;;; -10510;ELBASAN LETTER LE;Lo;0;L;;;;;N;;;;; -10511;ELBASAN LETTER LLE;Lo;0;L;;;;;N;;;;; -10512;ELBASAN LETTER ME;Lo;0;L;;;;;N;;;;; -10513;ELBASAN LETTER NE;Lo;0;L;;;;;N;;;;; -10514;ELBASAN LETTER NA;Lo;0;L;;;;;N;;;;; -10515;ELBASAN LETTER NJE;Lo;0;L;;;;;N;;;;; -10516;ELBASAN LETTER O;Lo;0;L;;;;;N;;;;; -10517;ELBASAN LETTER PE;Lo;0;L;;;;;N;;;;; -10518;ELBASAN LETTER QE;Lo;0;L;;;;;N;;;;; -10519;ELBASAN LETTER RE;Lo;0;L;;;;;N;;;;; -1051A;ELBASAN LETTER RRE;Lo;0;L;;;;;N;;;;; -1051B;ELBASAN LETTER SE;Lo;0;L;;;;;N;;;;; -1051C;ELBASAN LETTER SHE;Lo;0;L;;;;;N;;;;; -1051D;ELBASAN LETTER TE;Lo;0;L;;;;;N;;;;; -1051E;ELBASAN LETTER THE;Lo;0;L;;;;;N;;;;; -1051F;ELBASAN LETTER U;Lo;0;L;;;;;N;;;;; -10520;ELBASAN LETTER VE;Lo;0;L;;;;;N;;;;; -10521;ELBASAN LETTER XE;Lo;0;L;;;;;N;;;;; -10522;ELBASAN LETTER Y;Lo;0;L;;;;;N;;;;; -10523;ELBASAN LETTER ZE;Lo;0;L;;;;;N;;;;; -10524;ELBASAN LETTER ZHE;Lo;0;L;;;;;N;;;;; -10525;ELBASAN LETTER GHE;Lo;0;L;;;;;N;;;;; -10526;ELBASAN LETTER GHAMMA;Lo;0;L;;;;;N;;;;; -10527;ELBASAN LETTER KHE;Lo;0;L;;;;;N;;;;; -10530;CAUCASIAN ALBANIAN LETTER ALT;Lo;0;L;;;;;N;;;;; -10531;CAUCASIAN ALBANIAN LETTER BET;Lo;0;L;;;;;N;;;;; -10532;CAUCASIAN ALBANIAN LETTER GIM;Lo;0;L;;;;;N;;;;; -10533;CAUCASIAN ALBANIAN LETTER DAT;Lo;0;L;;;;;N;;;;; -10534;CAUCASIAN ALBANIAN LETTER EB;Lo;0;L;;;;;N;;;;; -10535;CAUCASIAN ALBANIAN LETTER ZARL;Lo;0;L;;;;;N;;;;; -10536;CAUCASIAN ALBANIAN LETTER EYN;Lo;0;L;;;;;N;;;;; -10537;CAUCASIAN ALBANIAN LETTER ZHIL;Lo;0;L;;;;;N;;;;; -10538;CAUCASIAN ALBANIAN LETTER TAS;Lo;0;L;;;;;N;;;;; -10539;CAUCASIAN ALBANIAN LETTER CHA;Lo;0;L;;;;;N;;;;; -1053A;CAUCASIAN ALBANIAN LETTER YOWD;Lo;0;L;;;;;N;;;;; -1053B;CAUCASIAN ALBANIAN LETTER ZHA;Lo;0;L;;;;;N;;;;; -1053C;CAUCASIAN ALBANIAN LETTER IRB;Lo;0;L;;;;;N;;;;; -1053D;CAUCASIAN ALBANIAN LETTER SHA;Lo;0;L;;;;;N;;;;; -1053E;CAUCASIAN ALBANIAN LETTER LAN;Lo;0;L;;;;;N;;;;; -1053F;CAUCASIAN ALBANIAN LETTER INYA;Lo;0;L;;;;;N;;;;; -10540;CAUCASIAN ALBANIAN LETTER XEYN;Lo;0;L;;;;;N;;;;; -10541;CAUCASIAN ALBANIAN LETTER DYAN;Lo;0;L;;;;;N;;;;; -10542;CAUCASIAN ALBANIAN LETTER CAR;Lo;0;L;;;;;N;;;;; -10543;CAUCASIAN ALBANIAN LETTER JHOX;Lo;0;L;;;;;N;;;;; -10544;CAUCASIAN ALBANIAN LETTER KAR;Lo;0;L;;;;;N;;;;; -10545;CAUCASIAN ALBANIAN LETTER LYIT;Lo;0;L;;;;;N;;;;; -10546;CAUCASIAN ALBANIAN LETTER HEYT;Lo;0;L;;;;;N;;;;; -10547;CAUCASIAN ALBANIAN LETTER QAY;Lo;0;L;;;;;N;;;;; -10548;CAUCASIAN ALBANIAN LETTER AOR;Lo;0;L;;;;;N;;;;; -10549;CAUCASIAN ALBANIAN LETTER CHOY;Lo;0;L;;;;;N;;;;; -1054A;CAUCASIAN ALBANIAN LETTER CHI;Lo;0;L;;;;;N;;;;; -1054B;CAUCASIAN ALBANIAN LETTER CYAY;Lo;0;L;;;;;N;;;;; -1054C;CAUCASIAN ALBANIAN LETTER MAQ;Lo;0;L;;;;;N;;;;; -1054D;CAUCASIAN ALBANIAN LETTER QAR;Lo;0;L;;;;;N;;;;; -1054E;CAUCASIAN ALBANIAN LETTER NOWC;Lo;0;L;;;;;N;;;;; -1054F;CAUCASIAN ALBANIAN LETTER DZYAY;Lo;0;L;;;;;N;;;;; -10550;CAUCASIAN ALBANIAN LETTER SHAK;Lo;0;L;;;;;N;;;;; -10551;CAUCASIAN ALBANIAN LETTER JAYN;Lo;0;L;;;;;N;;;;; -10552;CAUCASIAN ALBANIAN LETTER ON;Lo;0;L;;;;;N;;;;; -10553;CAUCASIAN ALBANIAN LETTER TYAY;Lo;0;L;;;;;N;;;;; -10554;CAUCASIAN ALBANIAN LETTER FAM;Lo;0;L;;;;;N;;;;; -10555;CAUCASIAN ALBANIAN LETTER DZAY;Lo;0;L;;;;;N;;;;; -10556;CAUCASIAN ALBANIAN LETTER CHAT;Lo;0;L;;;;;N;;;;; -10557;CAUCASIAN ALBANIAN LETTER PEN;Lo;0;L;;;;;N;;;;; -10558;CAUCASIAN ALBANIAN LETTER GHEYS;Lo;0;L;;;;;N;;;;; -10559;CAUCASIAN ALBANIAN LETTER RAT;Lo;0;L;;;;;N;;;;; -1055A;CAUCASIAN ALBANIAN LETTER SEYK;Lo;0;L;;;;;N;;;;; -1055B;CAUCASIAN ALBANIAN LETTER VEYZ;Lo;0;L;;;;;N;;;;; -1055C;CAUCASIAN ALBANIAN LETTER TIWR;Lo;0;L;;;;;N;;;;; -1055D;CAUCASIAN ALBANIAN LETTER SHOY;Lo;0;L;;;;;N;;;;; -1055E;CAUCASIAN ALBANIAN LETTER IWN;Lo;0;L;;;;;N;;;;; -1055F;CAUCASIAN ALBANIAN LETTER CYAW;Lo;0;L;;;;;N;;;;; -10560;CAUCASIAN ALBANIAN LETTER CAYN;Lo;0;L;;;;;N;;;;; -10561;CAUCASIAN ALBANIAN LETTER YAYD;Lo;0;L;;;;;N;;;;; -10562;CAUCASIAN ALBANIAN LETTER PIWR;Lo;0;L;;;;;N;;;;; -10563;CAUCASIAN ALBANIAN LETTER KIW;Lo;0;L;;;;;N;;;;; -1056F;CAUCASIAN ALBANIAN CITATION MARK;Po;0;L;;;;;N;;;;; -10600;LINEAR A SIGN AB001;Lo;0;L;;;;;N;;;;; -10601;LINEAR A SIGN AB002;Lo;0;L;;;;;N;;;;; -10602;LINEAR A SIGN AB003;Lo;0;L;;;;;N;;;;; -10603;LINEAR A SIGN AB004;Lo;0;L;;;;;N;;;;; -10604;LINEAR A SIGN AB005;Lo;0;L;;;;;N;;;;; -10605;LINEAR A SIGN AB006;Lo;0;L;;;;;N;;;;; -10606;LINEAR A SIGN AB007;Lo;0;L;;;;;N;;;;; -10607;LINEAR A SIGN AB008;Lo;0;L;;;;;N;;;;; -10608;LINEAR A SIGN AB009;Lo;0;L;;;;;N;;;;; -10609;LINEAR A SIGN AB010;Lo;0;L;;;;;N;;;;; -1060A;LINEAR A SIGN AB011;Lo;0;L;;;;;N;;;;; -1060B;LINEAR A SIGN AB013;Lo;0;L;;;;;N;;;;; -1060C;LINEAR A SIGN AB016;Lo;0;L;;;;;N;;;;; -1060D;LINEAR A SIGN AB017;Lo;0;L;;;;;N;;;;; -1060E;LINEAR A SIGN AB020;Lo;0;L;;;;;N;;;;; -1060F;LINEAR A SIGN AB021;Lo;0;L;;;;;N;;;;; -10610;LINEAR A SIGN AB021F;Lo;0;L;;;;;N;;;;; -10611;LINEAR A SIGN AB021M;Lo;0;L;;;;;N;;;;; -10612;LINEAR A SIGN AB022;Lo;0;L;;;;;N;;;;; -10613;LINEAR A SIGN AB022F;Lo;0;L;;;;;N;;;;; -10614;LINEAR A SIGN AB022M;Lo;0;L;;;;;N;;;;; -10615;LINEAR A SIGN AB023;Lo;0;L;;;;;N;;;;; -10616;LINEAR A SIGN AB023M;Lo;0;L;;;;;N;;;;; -10617;LINEAR A SIGN AB024;Lo;0;L;;;;;N;;;;; -10618;LINEAR A SIGN AB026;Lo;0;L;;;;;N;;;;; -10619;LINEAR A SIGN AB027;Lo;0;L;;;;;N;;;;; -1061A;LINEAR A SIGN AB028;Lo;0;L;;;;;N;;;;; -1061B;LINEAR A SIGN A028B;Lo;0;L;;;;;N;;;;; -1061C;LINEAR A SIGN AB029;Lo;0;L;;;;;N;;;;; -1061D;LINEAR A SIGN AB030;Lo;0;L;;;;;N;;;;; -1061E;LINEAR A SIGN AB031;Lo;0;L;;;;;N;;;;; -1061F;LINEAR A SIGN AB034;Lo;0;L;;;;;N;;;;; -10620;LINEAR A SIGN AB037;Lo;0;L;;;;;N;;;;; -10621;LINEAR A SIGN AB038;Lo;0;L;;;;;N;;;;; -10622;LINEAR A SIGN AB039;Lo;0;L;;;;;N;;;;; -10623;LINEAR A SIGN AB040;Lo;0;L;;;;;N;;;;; -10624;LINEAR A SIGN AB041;Lo;0;L;;;;;N;;;;; -10625;LINEAR A SIGN AB044;Lo;0;L;;;;;N;;;;; -10626;LINEAR A SIGN AB045;Lo;0;L;;;;;N;;;;; -10627;LINEAR A SIGN AB046;Lo;0;L;;;;;N;;;;; -10628;LINEAR A SIGN AB047;Lo;0;L;;;;;N;;;;; -10629;LINEAR A SIGN AB048;Lo;0;L;;;;;N;;;;; -1062A;LINEAR A SIGN AB049;Lo;0;L;;;;;N;;;;; -1062B;LINEAR A SIGN AB050;Lo;0;L;;;;;N;;;;; -1062C;LINEAR A SIGN AB051;Lo;0;L;;;;;N;;;;; -1062D;LINEAR A SIGN AB053;Lo;0;L;;;;;N;;;;; -1062E;LINEAR A SIGN AB054;Lo;0;L;;;;;N;;;;; -1062F;LINEAR A SIGN AB055;Lo;0;L;;;;;N;;;;; -10630;LINEAR A SIGN AB056;Lo;0;L;;;;;N;;;;; -10631;LINEAR A SIGN AB057;Lo;0;L;;;;;N;;;;; -10632;LINEAR A SIGN AB058;Lo;0;L;;;;;N;;;;; -10633;LINEAR A SIGN AB059;Lo;0;L;;;;;N;;;;; -10634;LINEAR A SIGN AB060;Lo;0;L;;;;;N;;;;; -10635;LINEAR A SIGN AB061;Lo;0;L;;;;;N;;;;; -10636;LINEAR A SIGN AB065;Lo;0;L;;;;;N;;;;; -10637;LINEAR A SIGN AB066;Lo;0;L;;;;;N;;;;; -10638;LINEAR A SIGN AB067;Lo;0;L;;;;;N;;;;; -10639;LINEAR A SIGN AB069;Lo;0;L;;;;;N;;;;; -1063A;LINEAR A SIGN AB070;Lo;0;L;;;;;N;;;;; -1063B;LINEAR A SIGN AB073;Lo;0;L;;;;;N;;;;; -1063C;LINEAR A SIGN AB074;Lo;0;L;;;;;N;;;;; -1063D;LINEAR A SIGN AB076;Lo;0;L;;;;;N;;;;; -1063E;LINEAR A SIGN AB077;Lo;0;L;;;;;N;;;;; -1063F;LINEAR A SIGN AB078;Lo;0;L;;;;;N;;;;; -10640;LINEAR A SIGN AB079;Lo;0;L;;;;;N;;;;; -10641;LINEAR A SIGN AB080;Lo;0;L;;;;;N;;;;; -10642;LINEAR A SIGN AB081;Lo;0;L;;;;;N;;;;; -10643;LINEAR A SIGN AB082;Lo;0;L;;;;;N;;;;; -10644;LINEAR A SIGN AB085;Lo;0;L;;;;;N;;;;; -10645;LINEAR A SIGN AB086;Lo;0;L;;;;;N;;;;; -10646;LINEAR A SIGN AB087;Lo;0;L;;;;;N;;;;; -10647;LINEAR A SIGN A100-102;Lo;0;L;;;;;N;;;;; -10648;LINEAR A SIGN AB118;Lo;0;L;;;;;N;;;;; -10649;LINEAR A SIGN AB120;Lo;0;L;;;;;N;;;;; -1064A;LINEAR A SIGN A120B;Lo;0;L;;;;;N;;;;; -1064B;LINEAR A SIGN AB122;Lo;0;L;;;;;N;;;;; -1064C;LINEAR A SIGN AB123;Lo;0;L;;;;;N;;;;; -1064D;LINEAR A SIGN AB131A;Lo;0;L;;;;;N;;;;; -1064E;LINEAR A SIGN AB131B;Lo;0;L;;;;;N;;;;; -1064F;LINEAR A SIGN A131C;Lo;0;L;;;;;N;;;;; -10650;LINEAR A SIGN AB164;Lo;0;L;;;;;N;;;;; -10651;LINEAR A SIGN AB171;Lo;0;L;;;;;N;;;;; -10652;LINEAR A SIGN AB180;Lo;0;L;;;;;N;;;;; -10653;LINEAR A SIGN AB188;Lo;0;L;;;;;N;;;;; -10654;LINEAR A SIGN AB191;Lo;0;L;;;;;N;;;;; -10655;LINEAR A SIGN A301;Lo;0;L;;;;;N;;;;; -10656;LINEAR A SIGN A302;Lo;0;L;;;;;N;;;;; -10657;LINEAR A SIGN A303;Lo;0;L;;;;;N;;;;; -10658;LINEAR A SIGN A304;Lo;0;L;;;;;N;;;;; -10659;LINEAR A SIGN A305;Lo;0;L;;;;;N;;;;; -1065A;LINEAR A SIGN A306;Lo;0;L;;;;;N;;;;; -1065B;LINEAR A SIGN A307;Lo;0;L;;;;;N;;;;; -1065C;LINEAR A SIGN A308;Lo;0;L;;;;;N;;;;; -1065D;LINEAR A SIGN A309A;Lo;0;L;;;;;N;;;;; -1065E;LINEAR A SIGN A309B;Lo;0;L;;;;;N;;;;; -1065F;LINEAR A SIGN A309C;Lo;0;L;;;;;N;;;;; -10660;LINEAR A SIGN A310;Lo;0;L;;;;;N;;;;; -10661;LINEAR A SIGN A311;Lo;0;L;;;;;N;;;;; -10662;LINEAR A SIGN A312;Lo;0;L;;;;;N;;;;; -10663;LINEAR A SIGN A313A;Lo;0;L;;;;;N;;;;; -10664;LINEAR A SIGN A313B;Lo;0;L;;;;;N;;;;; -10665;LINEAR A SIGN A313C;Lo;0;L;;;;;N;;;;; -10666;LINEAR A SIGN A314;Lo;0;L;;;;;N;;;;; -10667;LINEAR A SIGN A315;Lo;0;L;;;;;N;;;;; -10668;LINEAR A SIGN A316;Lo;0;L;;;;;N;;;;; -10669;LINEAR A SIGN A317;Lo;0;L;;;;;N;;;;; -1066A;LINEAR A SIGN A318;Lo;0;L;;;;;N;;;;; -1066B;LINEAR A SIGN A319;Lo;0;L;;;;;N;;;;; -1066C;LINEAR A SIGN A320;Lo;0;L;;;;;N;;;;; -1066D;LINEAR A SIGN A321;Lo;0;L;;;;;N;;;;; -1066E;LINEAR A SIGN A322;Lo;0;L;;;;;N;;;;; -1066F;LINEAR A SIGN A323;Lo;0;L;;;;;N;;;;; -10670;LINEAR A SIGN A324;Lo;0;L;;;;;N;;;;; -10671;LINEAR A SIGN A325;Lo;0;L;;;;;N;;;;; -10672;LINEAR A SIGN A326;Lo;0;L;;;;;N;;;;; -10673;LINEAR A SIGN A327;Lo;0;L;;;;;N;;;;; -10674;LINEAR A SIGN A328;Lo;0;L;;;;;N;;;;; -10675;LINEAR A SIGN A329;Lo;0;L;;;;;N;;;;; -10676;LINEAR A SIGN A330;Lo;0;L;;;;;N;;;;; -10677;LINEAR A SIGN A331;Lo;0;L;;;;;N;;;;; -10678;LINEAR A SIGN A332;Lo;0;L;;;;;N;;;;; -10679;LINEAR A SIGN A333;Lo;0;L;;;;;N;;;;; -1067A;LINEAR A SIGN A334;Lo;0;L;;;;;N;;;;; -1067B;LINEAR A SIGN A335;Lo;0;L;;;;;N;;;;; -1067C;LINEAR A SIGN A336;Lo;0;L;;;;;N;;;;; -1067D;LINEAR A SIGN A337;Lo;0;L;;;;;N;;;;; -1067E;LINEAR A SIGN A338;Lo;0;L;;;;;N;;;;; -1067F;LINEAR A SIGN A339;Lo;0;L;;;;;N;;;;; -10680;LINEAR A SIGN A340;Lo;0;L;;;;;N;;;;; -10681;LINEAR A SIGN A341;Lo;0;L;;;;;N;;;;; -10682;LINEAR A SIGN A342;Lo;0;L;;;;;N;;;;; -10683;LINEAR A SIGN A343;Lo;0;L;;;;;N;;;;; -10684;LINEAR A SIGN A344;Lo;0;L;;;;;N;;;;; -10685;LINEAR A SIGN A345;Lo;0;L;;;;;N;;;;; -10686;LINEAR A SIGN A346;Lo;0;L;;;;;N;;;;; -10687;LINEAR A SIGN A347;Lo;0;L;;;;;N;;;;; -10688;LINEAR A SIGN A348;Lo;0;L;;;;;N;;;;; -10689;LINEAR A SIGN A349;Lo;0;L;;;;;N;;;;; -1068A;LINEAR A SIGN A350;Lo;0;L;;;;;N;;;;; -1068B;LINEAR A SIGN A351;Lo;0;L;;;;;N;;;;; -1068C;LINEAR A SIGN A352;Lo;0;L;;;;;N;;;;; -1068D;LINEAR A SIGN A353;Lo;0;L;;;;;N;;;;; -1068E;LINEAR A SIGN A354;Lo;0;L;;;;;N;;;;; -1068F;LINEAR A SIGN A355;Lo;0;L;;;;;N;;;;; -10690;LINEAR A SIGN A356;Lo;0;L;;;;;N;;;;; -10691;LINEAR A SIGN A357;Lo;0;L;;;;;N;;;;; -10692;LINEAR A SIGN A358;Lo;0;L;;;;;N;;;;; -10693;LINEAR A SIGN A359;Lo;0;L;;;;;N;;;;; -10694;LINEAR A SIGN A360;Lo;0;L;;;;;N;;;;; -10695;LINEAR A SIGN A361;Lo;0;L;;;;;N;;;;; -10696;LINEAR A SIGN A362;Lo;0;L;;;;;N;;;;; -10697;LINEAR A SIGN A363;Lo;0;L;;;;;N;;;;; -10698;LINEAR A SIGN A364;Lo;0;L;;;;;N;;;;; -10699;LINEAR A SIGN A365;Lo;0;L;;;;;N;;;;; -1069A;LINEAR A SIGN A366;Lo;0;L;;;;;N;;;;; -1069B;LINEAR A SIGN A367;Lo;0;L;;;;;N;;;;; -1069C;LINEAR A SIGN A368;Lo;0;L;;;;;N;;;;; -1069D;LINEAR A SIGN A369;Lo;0;L;;;;;N;;;;; -1069E;LINEAR A SIGN A370;Lo;0;L;;;;;N;;;;; -1069F;LINEAR A SIGN A371;Lo;0;L;;;;;N;;;;; -106A0;LINEAR A SIGN A400-VAS;Lo;0;L;;;;;N;;;;; -106A1;LINEAR A SIGN A401-VAS;Lo;0;L;;;;;N;;;;; -106A2;LINEAR A SIGN A402-VAS;Lo;0;L;;;;;N;;;;; -106A3;LINEAR A SIGN A403-VAS;Lo;0;L;;;;;N;;;;; -106A4;LINEAR A SIGN A404-VAS;Lo;0;L;;;;;N;;;;; -106A5;LINEAR A SIGN A405-VAS;Lo;0;L;;;;;N;;;;; -106A6;LINEAR A SIGN A406-VAS;Lo;0;L;;;;;N;;;;; -106A7;LINEAR A SIGN A407-VAS;Lo;0;L;;;;;N;;;;; -106A8;LINEAR A SIGN A408-VAS;Lo;0;L;;;;;N;;;;; -106A9;LINEAR A SIGN A409-VAS;Lo;0;L;;;;;N;;;;; -106AA;LINEAR A SIGN A410-VAS;Lo;0;L;;;;;N;;;;; -106AB;LINEAR A SIGN A411-VAS;Lo;0;L;;;;;N;;;;; -106AC;LINEAR A SIGN A412-VAS;Lo;0;L;;;;;N;;;;; -106AD;LINEAR A SIGN A413-VAS;Lo;0;L;;;;;N;;;;; -106AE;LINEAR A SIGN A414-VAS;Lo;0;L;;;;;N;;;;; -106AF;LINEAR A SIGN A415-VAS;Lo;0;L;;;;;N;;;;; -106B0;LINEAR A SIGN A416-VAS;Lo;0;L;;;;;N;;;;; -106B1;LINEAR A SIGN A417-VAS;Lo;0;L;;;;;N;;;;; -106B2;LINEAR A SIGN A418-VAS;Lo;0;L;;;;;N;;;;; -106B3;LINEAR A SIGN A501;Lo;0;L;;;;;N;;;;; -106B4;LINEAR A SIGN A502;Lo;0;L;;;;;N;;;;; -106B5;LINEAR A SIGN A503;Lo;0;L;;;;;N;;;;; -106B6;LINEAR A SIGN A504;Lo;0;L;;;;;N;;;;; -106B7;LINEAR A SIGN A505;Lo;0;L;;;;;N;;;;; -106B8;LINEAR A SIGN A506;Lo;0;L;;;;;N;;;;; -106B9;LINEAR A SIGN A508;Lo;0;L;;;;;N;;;;; -106BA;LINEAR A SIGN A509;Lo;0;L;;;;;N;;;;; -106BB;LINEAR A SIGN A510;Lo;0;L;;;;;N;;;;; -106BC;LINEAR A SIGN A511;Lo;0;L;;;;;N;;;;; -106BD;LINEAR A SIGN A512;Lo;0;L;;;;;N;;;;; -106BE;LINEAR A SIGN A513;Lo;0;L;;;;;N;;;;; -106BF;LINEAR A SIGN A515;Lo;0;L;;;;;N;;;;; -106C0;LINEAR A SIGN A516;Lo;0;L;;;;;N;;;;; -106C1;LINEAR A SIGN A520;Lo;0;L;;;;;N;;;;; -106C2;LINEAR A SIGN A521;Lo;0;L;;;;;N;;;;; -106C3;LINEAR A SIGN A523;Lo;0;L;;;;;N;;;;; -106C4;LINEAR A SIGN A524;Lo;0;L;;;;;N;;;;; -106C5;LINEAR A SIGN A525;Lo;0;L;;;;;N;;;;; -106C6;LINEAR A SIGN A526;Lo;0;L;;;;;N;;;;; -106C7;LINEAR A SIGN A527;Lo;0;L;;;;;N;;;;; -106C8;LINEAR A SIGN A528;Lo;0;L;;;;;N;;;;; -106C9;LINEAR A SIGN A529;Lo;0;L;;;;;N;;;;; -106CA;LINEAR A SIGN A530;Lo;0;L;;;;;N;;;;; -106CB;LINEAR A SIGN A531;Lo;0;L;;;;;N;;;;; -106CC;LINEAR A SIGN A532;Lo;0;L;;;;;N;;;;; -106CD;LINEAR A SIGN A534;Lo;0;L;;;;;N;;;;; -106CE;LINEAR A SIGN A535;Lo;0;L;;;;;N;;;;; -106CF;LINEAR A SIGN A536;Lo;0;L;;;;;N;;;;; -106D0;LINEAR A SIGN A537;Lo;0;L;;;;;N;;;;; -106D1;LINEAR A SIGN A538;Lo;0;L;;;;;N;;;;; -106D2;LINEAR A SIGN A539;Lo;0;L;;;;;N;;;;; -106D3;LINEAR A SIGN A540;Lo;0;L;;;;;N;;;;; -106D4;LINEAR A SIGN A541;Lo;0;L;;;;;N;;;;; -106D5;LINEAR A SIGN A542;Lo;0;L;;;;;N;;;;; -106D6;LINEAR A SIGN A545;Lo;0;L;;;;;N;;;;; -106D7;LINEAR A SIGN A547;Lo;0;L;;;;;N;;;;; -106D8;LINEAR A SIGN A548;Lo;0;L;;;;;N;;;;; -106D9;LINEAR A SIGN A549;Lo;0;L;;;;;N;;;;; -106DA;LINEAR A SIGN A550;Lo;0;L;;;;;N;;;;; -106DB;LINEAR A SIGN A551;Lo;0;L;;;;;N;;;;; -106DC;LINEAR A SIGN A552;Lo;0;L;;;;;N;;;;; -106DD;LINEAR A SIGN A553;Lo;0;L;;;;;N;;;;; -106DE;LINEAR A SIGN A554;Lo;0;L;;;;;N;;;;; -106DF;LINEAR A SIGN A555;Lo;0;L;;;;;N;;;;; -106E0;LINEAR A SIGN A556;Lo;0;L;;;;;N;;;;; -106E1;LINEAR A SIGN A557;Lo;0;L;;;;;N;;;;; -106E2;LINEAR A SIGN A559;Lo;0;L;;;;;N;;;;; -106E3;LINEAR A SIGN A563;Lo;0;L;;;;;N;;;;; -106E4;LINEAR A SIGN A564;Lo;0;L;;;;;N;;;;; -106E5;LINEAR A SIGN A565;Lo;0;L;;;;;N;;;;; -106E6;LINEAR A SIGN A566;Lo;0;L;;;;;N;;;;; -106E7;LINEAR A SIGN A568;Lo;0;L;;;;;N;;;;; -106E8;LINEAR A SIGN A569;Lo;0;L;;;;;N;;;;; -106E9;LINEAR A SIGN A570;Lo;0;L;;;;;N;;;;; -106EA;LINEAR A SIGN A571;Lo;0;L;;;;;N;;;;; -106EB;LINEAR A SIGN A572;Lo;0;L;;;;;N;;;;; -106EC;LINEAR A SIGN A573;Lo;0;L;;;;;N;;;;; -106ED;LINEAR A SIGN A574;Lo;0;L;;;;;N;;;;; -106EE;LINEAR A SIGN A575;Lo;0;L;;;;;N;;;;; -106EF;LINEAR A SIGN A576;Lo;0;L;;;;;N;;;;; -106F0;LINEAR A SIGN A577;Lo;0;L;;;;;N;;;;; -106F1;LINEAR A SIGN A578;Lo;0;L;;;;;N;;;;; -106F2;LINEAR A SIGN A579;Lo;0;L;;;;;N;;;;; -106F3;LINEAR A SIGN A580;Lo;0;L;;;;;N;;;;; -106F4;LINEAR A SIGN A581;Lo;0;L;;;;;N;;;;; -106F5;LINEAR A SIGN A582;Lo;0;L;;;;;N;;;;; -106F6;LINEAR A SIGN A583;Lo;0;L;;;;;N;;;;; -106F7;LINEAR A SIGN A584;Lo;0;L;;;;;N;;;;; -106F8;LINEAR A SIGN A585;Lo;0;L;;;;;N;;;;; -106F9;LINEAR A SIGN A586;Lo;0;L;;;;;N;;;;; -106FA;LINEAR A SIGN A587;Lo;0;L;;;;;N;;;;; -106FB;LINEAR A SIGN A588;Lo;0;L;;;;;N;;;;; -106FC;LINEAR A SIGN A589;Lo;0;L;;;;;N;;;;; -106FD;LINEAR A SIGN A591;Lo;0;L;;;;;N;;;;; -106FE;LINEAR A SIGN A592;Lo;0;L;;;;;N;;;;; -106FF;LINEAR A SIGN A594;Lo;0;L;;;;;N;;;;; -10700;LINEAR A SIGN A595;Lo;0;L;;;;;N;;;;; -10701;LINEAR A SIGN A596;Lo;0;L;;;;;N;;;;; -10702;LINEAR A SIGN A598;Lo;0;L;;;;;N;;;;; -10703;LINEAR A SIGN A600;Lo;0;L;;;;;N;;;;; -10704;LINEAR A SIGN A601;Lo;0;L;;;;;N;;;;; -10705;LINEAR A SIGN A602;Lo;0;L;;;;;N;;;;; -10706;LINEAR A SIGN A603;Lo;0;L;;;;;N;;;;; -10707;LINEAR A SIGN A604;Lo;0;L;;;;;N;;;;; -10708;LINEAR A SIGN A606;Lo;0;L;;;;;N;;;;; -10709;LINEAR A SIGN A608;Lo;0;L;;;;;N;;;;; -1070A;LINEAR A SIGN A609;Lo;0;L;;;;;N;;;;; -1070B;LINEAR A SIGN A610;Lo;0;L;;;;;N;;;;; -1070C;LINEAR A SIGN A611;Lo;0;L;;;;;N;;;;; -1070D;LINEAR A SIGN A612;Lo;0;L;;;;;N;;;;; -1070E;LINEAR A SIGN A613;Lo;0;L;;;;;N;;;;; -1070F;LINEAR A SIGN A614;Lo;0;L;;;;;N;;;;; -10710;LINEAR A SIGN A615;Lo;0;L;;;;;N;;;;; -10711;LINEAR A SIGN A616;Lo;0;L;;;;;N;;;;; -10712;LINEAR A SIGN A617;Lo;0;L;;;;;N;;;;; -10713;LINEAR A SIGN A618;Lo;0;L;;;;;N;;;;; -10714;LINEAR A SIGN A619;Lo;0;L;;;;;N;;;;; -10715;LINEAR A SIGN A620;Lo;0;L;;;;;N;;;;; -10716;LINEAR A SIGN A621;Lo;0;L;;;;;N;;;;; -10717;LINEAR A SIGN A622;Lo;0;L;;;;;N;;;;; -10718;LINEAR A SIGN A623;Lo;0;L;;;;;N;;;;; -10719;LINEAR A SIGN A624;Lo;0;L;;;;;N;;;;; -1071A;LINEAR A SIGN A626;Lo;0;L;;;;;N;;;;; -1071B;LINEAR A SIGN A627;Lo;0;L;;;;;N;;;;; -1071C;LINEAR A SIGN A628;Lo;0;L;;;;;N;;;;; -1071D;LINEAR A SIGN A629;Lo;0;L;;;;;N;;;;; -1071E;LINEAR A SIGN A634;Lo;0;L;;;;;N;;;;; -1071F;LINEAR A SIGN A637;Lo;0;L;;;;;N;;;;; -10720;LINEAR A SIGN A638;Lo;0;L;;;;;N;;;;; -10721;LINEAR A SIGN A640;Lo;0;L;;;;;N;;;;; -10722;LINEAR A SIGN A642;Lo;0;L;;;;;N;;;;; -10723;LINEAR A SIGN A643;Lo;0;L;;;;;N;;;;; -10724;LINEAR A SIGN A644;Lo;0;L;;;;;N;;;;; -10725;LINEAR A SIGN A645;Lo;0;L;;;;;N;;;;; -10726;LINEAR A SIGN A646;Lo;0;L;;;;;N;;;;; -10727;LINEAR A SIGN A648;Lo;0;L;;;;;N;;;;; -10728;LINEAR A SIGN A649;Lo;0;L;;;;;N;;;;; -10729;LINEAR A SIGN A651;Lo;0;L;;;;;N;;;;; -1072A;LINEAR A SIGN A652;Lo;0;L;;;;;N;;;;; -1072B;LINEAR A SIGN A653;Lo;0;L;;;;;N;;;;; -1072C;LINEAR A SIGN A654;Lo;0;L;;;;;N;;;;; -1072D;LINEAR A SIGN A655;Lo;0;L;;;;;N;;;;; -1072E;LINEAR A SIGN A656;Lo;0;L;;;;;N;;;;; -1072F;LINEAR A SIGN A657;Lo;0;L;;;;;N;;;;; -10730;LINEAR A SIGN A658;Lo;0;L;;;;;N;;;;; -10731;LINEAR A SIGN A659;Lo;0;L;;;;;N;;;;; -10732;LINEAR A SIGN A660;Lo;0;L;;;;;N;;;;; -10733;LINEAR A SIGN A661;Lo;0;L;;;;;N;;;;; -10734;LINEAR A SIGN A662;Lo;0;L;;;;;N;;;;; -10735;LINEAR A SIGN A663;Lo;0;L;;;;;N;;;;; -10736;LINEAR A SIGN A664;Lo;0;L;;;;;N;;;;; -10740;LINEAR A SIGN A701 A;Lo;0;L;;;;;N;;;;; -10741;LINEAR A SIGN A702 B;Lo;0;L;;;;;N;;;;; -10742;LINEAR A SIGN A703 D;Lo;0;L;;;;;N;;;;; -10743;LINEAR A SIGN A704 E;Lo;0;L;;;;;N;;;;; -10744;LINEAR A SIGN A705 F;Lo;0;L;;;;;N;;;;; -10745;LINEAR A SIGN A706 H;Lo;0;L;;;;;N;;;;; -10746;LINEAR A SIGN A707 J;Lo;0;L;;;;;N;;;;; -10747;LINEAR A SIGN A708 K;Lo;0;L;;;;;N;;;;; -10748;LINEAR A SIGN A709 L;Lo;0;L;;;;;N;;;;; -10749;LINEAR A SIGN A709-2 L2;Lo;0;L;;;;;N;;;;; -1074A;LINEAR A SIGN A709-3 L3;Lo;0;L;;;;;N;;;;; -1074B;LINEAR A SIGN A709-4 L4;Lo;0;L;;;;;N;;;;; -1074C;LINEAR A SIGN A709-6 L6;Lo;0;L;;;;;N;;;;; -1074D;LINEAR A SIGN A710 W;Lo;0;L;;;;;N;;;;; -1074E;LINEAR A SIGN A711 X;Lo;0;L;;;;;N;;;;; -1074F;LINEAR A SIGN A712 Y;Lo;0;L;;;;;N;;;;; -10750;LINEAR A SIGN A713 OMEGA;Lo;0;L;;;;;N;;;;; -10751;LINEAR A SIGN A714 ABB;Lo;0;L;;;;;N;;;;; -10752;LINEAR A SIGN A715 BB;Lo;0;L;;;;;N;;;;; -10753;LINEAR A SIGN A717 DD;Lo;0;L;;;;;N;;;;; -10754;LINEAR A SIGN A726 EYYY;Lo;0;L;;;;;N;;;;; -10755;LINEAR A SIGN A732 JE;Lo;0;L;;;;;N;;;;; -10760;LINEAR A SIGN A800;Lo;0;L;;;;;N;;;;; -10761;LINEAR A SIGN A801;Lo;0;L;;;;;N;;;;; -10762;LINEAR A SIGN A802;Lo;0;L;;;;;N;;;;; -10763;LINEAR A SIGN A803;Lo;0;L;;;;;N;;;;; -10764;LINEAR A SIGN A804;Lo;0;L;;;;;N;;;;; -10765;LINEAR A SIGN A805;Lo;0;L;;;;;N;;;;; -10766;LINEAR A SIGN A806;Lo;0;L;;;;;N;;;;; -10767;LINEAR A SIGN A807;Lo;0;L;;;;;N;;;;; -10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;; -10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;; -10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;; -10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;; -10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;; -10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;; -10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;; -1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;; -1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;; -1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;; -1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;; -1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;; -1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;; -10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;; -10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;; -10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;; -10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;; -10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;; -10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;; -10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;; -10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;; -10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;; -10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;; -1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;; -1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;; -1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;; -1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;; -1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;; -1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;; -10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;; -10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;; -10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;; -10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;; -10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;; -10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;; -10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;; -10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;; -10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;; -10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;; -1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;; -1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;; -1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;; -1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;; -1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;; -1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;; -10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;; -10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;; -10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;; -10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;; -10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;; -10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;; -10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;; -10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;; -1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;; -1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;; -10840;IMPERIAL ARAMAIC LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10841;IMPERIAL ARAMAIC LETTER BETH;Lo;0;R;;;;;N;;;;; -10842;IMPERIAL ARAMAIC LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10843;IMPERIAL ARAMAIC LETTER DALETH;Lo;0;R;;;;;N;;;;; -10844;IMPERIAL ARAMAIC LETTER HE;Lo;0;R;;;;;N;;;;; -10845;IMPERIAL ARAMAIC LETTER WAW;Lo;0;R;;;;;N;;;;; -10846;IMPERIAL ARAMAIC LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10847;IMPERIAL ARAMAIC LETTER HETH;Lo;0;R;;;;;N;;;;; -10848;IMPERIAL ARAMAIC LETTER TETH;Lo;0;R;;;;;N;;;;; -10849;IMPERIAL ARAMAIC LETTER YODH;Lo;0;R;;;;;N;;;;; -1084A;IMPERIAL ARAMAIC LETTER KAPH;Lo;0;R;;;;;N;;;;; -1084B;IMPERIAL ARAMAIC LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -1084C;IMPERIAL ARAMAIC LETTER MEM;Lo;0;R;;;;;N;;;;; -1084D;IMPERIAL ARAMAIC LETTER NUN;Lo;0;R;;;;;N;;;;; -1084E;IMPERIAL ARAMAIC LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -1084F;IMPERIAL ARAMAIC LETTER AYIN;Lo;0;R;;;;;N;;;;; -10850;IMPERIAL ARAMAIC LETTER PE;Lo;0;R;;;;;N;;;;; -10851;IMPERIAL ARAMAIC LETTER SADHE;Lo;0;R;;;;;N;;;;; -10852;IMPERIAL ARAMAIC LETTER QOPH;Lo;0;R;;;;;N;;;;; -10853;IMPERIAL ARAMAIC LETTER RESH;Lo;0;R;;;;;N;;;;; -10854;IMPERIAL ARAMAIC LETTER SHIN;Lo;0;R;;;;;N;;;;; -10855;IMPERIAL ARAMAIC LETTER TAW;Lo;0;R;;;;;N;;;;; -10857;IMPERIAL ARAMAIC SECTION SIGN;Po;0;R;;;;;N;;;;; -10858;IMPERIAL ARAMAIC NUMBER ONE;No;0;R;;;;1;N;;;;; -10859;IMPERIAL ARAMAIC NUMBER TWO;No;0;R;;;;2;N;;;;; -1085A;IMPERIAL ARAMAIC NUMBER THREE;No;0;R;;;;3;N;;;;; -1085B;IMPERIAL ARAMAIC NUMBER TEN;No;0;R;;;;10;N;;;;; -1085C;IMPERIAL ARAMAIC NUMBER TWENTY;No;0;R;;;;20;N;;;;; -1085D;IMPERIAL ARAMAIC NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -1085E;IMPERIAL ARAMAIC NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -1085F;IMPERIAL ARAMAIC NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; -10860;PALMYRENE LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10861;PALMYRENE LETTER BETH;Lo;0;R;;;;;N;;;;; -10862;PALMYRENE LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10863;PALMYRENE LETTER DALETH;Lo;0;R;;;;;N;;;;; -10864;PALMYRENE LETTER HE;Lo;0;R;;;;;N;;;;; -10865;PALMYRENE LETTER WAW;Lo;0;R;;;;;N;;;;; -10866;PALMYRENE LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10867;PALMYRENE LETTER HETH;Lo;0;R;;;;;N;;;;; -10868;PALMYRENE LETTER TETH;Lo;0;R;;;;;N;;;;; -10869;PALMYRENE LETTER YODH;Lo;0;R;;;;;N;;;;; -1086A;PALMYRENE LETTER KAPH;Lo;0;R;;;;;N;;;;; -1086B;PALMYRENE LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -1086C;PALMYRENE LETTER MEM;Lo;0;R;;;;;N;;;;; -1086D;PALMYRENE LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -1086E;PALMYRENE LETTER NUN;Lo;0;R;;;;;N;;;;; -1086F;PALMYRENE LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10870;PALMYRENE LETTER AYIN;Lo;0;R;;;;;N;;;;; -10871;PALMYRENE LETTER PE;Lo;0;R;;;;;N;;;;; -10872;PALMYRENE LETTER SADHE;Lo;0;R;;;;;N;;;;; -10873;PALMYRENE LETTER QOPH;Lo;0;R;;;;;N;;;;; -10874;PALMYRENE LETTER RESH;Lo;0;R;;;;;N;;;;; -10875;PALMYRENE LETTER SHIN;Lo;0;R;;;;;N;;;;; -10876;PALMYRENE LETTER TAW;Lo;0;R;;;;;N;;;;; -10877;PALMYRENE LEFT-POINTING FLEURON;So;0;R;;;;;N;;;;; -10878;PALMYRENE RIGHT-POINTING FLEURON;So;0;R;;;;;N;;;;; -10879;PALMYRENE NUMBER ONE;No;0;R;;;;1;N;;;;; -1087A;PALMYRENE NUMBER TWO;No;0;R;;;;2;N;;;;; -1087B;PALMYRENE NUMBER THREE;No;0;R;;;;3;N;;;;; -1087C;PALMYRENE NUMBER FOUR;No;0;R;;;;4;N;;;;; -1087D;PALMYRENE NUMBER FIVE;No;0;R;;;;5;N;;;;; -1087E;PALMYRENE NUMBER TEN;No;0;R;;;;10;N;;;;; -1087F;PALMYRENE NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10880;NABATAEAN LETTER FINAL ALEPH;Lo;0;R;;;;;N;;;;; -10881;NABATAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10882;NABATAEAN LETTER FINAL BETH;Lo;0;R;;;;;N;;;;; -10883;NABATAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10884;NABATAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10885;NABATAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10886;NABATAEAN LETTER FINAL HE;Lo;0;R;;;;;N;;;;; -10887;NABATAEAN LETTER HE;Lo;0;R;;;;;N;;;;; -10888;NABATAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10889;NABATAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -1088A;NABATAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; -1088B;NABATAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; -1088C;NABATAEAN LETTER FINAL YODH;Lo;0;R;;;;;N;;;;; -1088D;NABATAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; -1088E;NABATAEAN LETTER FINAL KAPH;Lo;0;R;;;;;N;;;;; -1088F;NABATAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10890;NABATAEAN LETTER FINAL LAMEDH;Lo;0;R;;;;;N;;;;; -10891;NABATAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10892;NABATAEAN LETTER FINAL MEM;Lo;0;R;;;;;N;;;;; -10893;NABATAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10894;NABATAEAN LETTER FINAL NUN;Lo;0;R;;;;;N;;;;; -10895;NABATAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10896;NABATAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10897;NABATAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; -10898;NABATAEAN LETTER PE;Lo;0;R;;;;;N;;;;; -10899;NABATAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -1089A;NABATAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -1089B;NABATAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; -1089C;NABATAEAN LETTER FINAL SHIN;Lo;0;R;;;;;N;;;;; -1089D;NABATAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -1089E;NABATAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; -108A7;NABATAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; -108A8;NABATAEAN NUMBER TWO;No;0;R;;;;2;N;;;;; -108A9;NABATAEAN NUMBER THREE;No;0;R;;;;3;N;;;;; -108AA;NABATAEAN NUMBER FOUR;No;0;R;;;;4;N;;;;; -108AB;NABATAEAN CRUCIFORM NUMBER FOUR;No;0;R;;;;4;N;;;;; -108AC;NABATAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -108AD;NABATAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; -108AE;NABATAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -108AF;NABATAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -108E0;HATRAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -108E1;HATRAN LETTER BETH;Lo;0;R;;;;;N;;;;; -108E2;HATRAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -108E3;HATRAN LETTER DALETH-RESH;Lo;0;R;;;;;N;;;;; -108E4;HATRAN LETTER HE;Lo;0;R;;;;;N;;;;; -108E5;HATRAN LETTER WAW;Lo;0;R;;;;;N;;;;; -108E6;HATRAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; -108E7;HATRAN LETTER HETH;Lo;0;R;;;;;N;;;;; -108E8;HATRAN LETTER TETH;Lo;0;R;;;;;N;;;;; -108E9;HATRAN LETTER YODH;Lo;0;R;;;;;N;;;;; -108EA;HATRAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -108EB;HATRAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -108EC;HATRAN LETTER MEM;Lo;0;R;;;;;N;;;;; -108ED;HATRAN LETTER NUN;Lo;0;R;;;;;N;;;;; -108EE;HATRAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -108EF;HATRAN LETTER AYN;Lo;0;R;;;;;N;;;;; -108F0;HATRAN LETTER PE;Lo;0;R;;;;;N;;;;; -108F1;HATRAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -108F2;HATRAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -108F4;HATRAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -108F5;HATRAN LETTER TAW;Lo;0;R;;;;;N;;;;; -108FB;HATRAN NUMBER ONE;No;0;R;;;;1;N;;;;; -108FC;HATRAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -108FD;HATRAN NUMBER TEN;No;0;R;;;;10;N;;;;; -108FE;HATRAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -108FF;HATRAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;; -10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;; -10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;; -10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;; -10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;; -10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;; -10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;; -10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;; -10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;; -10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;; -1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;; -1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;; -1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;; -1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;; -1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;; -1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;; -10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;; -10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;; -10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;; -10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;; -10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;; -10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -1091A;PHOENICIAN NUMBER TWO;No;0;R;;;;2;N;;;;; -1091B;PHOENICIAN NUMBER THREE;No;0;R;;;;3;N;;;;; -1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;; -10920;LYDIAN LETTER A;Lo;0;R;;;;;N;;;;; -10921;LYDIAN LETTER B;Lo;0;R;;;;;N;;;;; -10922;LYDIAN LETTER G;Lo;0;R;;;;;N;;;;; -10923;LYDIAN LETTER D;Lo;0;R;;;;;N;;;;; -10924;LYDIAN LETTER E;Lo;0;R;;;;;N;;;;; -10925;LYDIAN LETTER V;Lo;0;R;;;;;N;;;;; -10926;LYDIAN LETTER I;Lo;0;R;;;;;N;;;;; -10927;LYDIAN LETTER Y;Lo;0;R;;;;;N;;;;; -10928;LYDIAN LETTER K;Lo;0;R;;;;;N;;;;; -10929;LYDIAN LETTER L;Lo;0;R;;;;;N;;;;; -1092A;LYDIAN LETTER M;Lo;0;R;;;;;N;;;;; -1092B;LYDIAN LETTER N;Lo;0;R;;;;;N;;;;; -1092C;LYDIAN LETTER O;Lo;0;R;;;;;N;;;;; -1092D;LYDIAN LETTER R;Lo;0;R;;;;;N;;;;; -1092E;LYDIAN LETTER SS;Lo;0;R;;;;;N;;;;; -1092F;LYDIAN LETTER T;Lo;0;R;;;;;N;;;;; -10930;LYDIAN LETTER U;Lo;0;R;;;;;N;;;;; -10931;LYDIAN LETTER F;Lo;0;R;;;;;N;;;;; -10932;LYDIAN LETTER Q;Lo;0;R;;;;;N;;;;; -10933;LYDIAN LETTER S;Lo;0;R;;;;;N;;;;; -10934;LYDIAN LETTER TT;Lo;0;R;;;;;N;;;;; -10935;LYDIAN LETTER AN;Lo;0;R;;;;;N;;;;; -10936;LYDIAN LETTER EN;Lo;0;R;;;;;N;;;;; -10937;LYDIAN LETTER LY;Lo;0;R;;;;;N;;;;; -10938;LYDIAN LETTER NN;Lo;0;R;;;;;N;;;;; -10939;LYDIAN LETTER C;Lo;0;R;;;;;N;;;;; -1093F;LYDIAN TRIANGULAR MARK;Po;0;R;;;;;N;;;;; -10980;MEROITIC HIEROGLYPHIC LETTER A;Lo;0;R;;;;;N;;;;; -10981;MEROITIC HIEROGLYPHIC LETTER E;Lo;0;R;;;;;N;;;;; -10982;MEROITIC HIEROGLYPHIC LETTER I;Lo;0;R;;;;;N;;;;; -10983;MEROITIC HIEROGLYPHIC LETTER O;Lo;0;R;;;;;N;;;;; -10984;MEROITIC HIEROGLYPHIC LETTER YA;Lo;0;R;;;;;N;;;;; -10985;MEROITIC HIEROGLYPHIC LETTER WA;Lo;0;R;;;;;N;;;;; -10986;MEROITIC HIEROGLYPHIC LETTER BA;Lo;0;R;;;;;N;;;;; -10987;MEROITIC HIEROGLYPHIC LETTER BA-2;Lo;0;R;;;;;N;;;;; -10988;MEROITIC HIEROGLYPHIC LETTER PA;Lo;0;R;;;;;N;;;;; -10989;MEROITIC HIEROGLYPHIC LETTER MA;Lo;0;R;;;;;N;;;;; -1098A;MEROITIC HIEROGLYPHIC LETTER NA;Lo;0;R;;;;;N;;;;; -1098B;MEROITIC HIEROGLYPHIC LETTER NA-2;Lo;0;R;;;;;N;;;;; -1098C;MEROITIC HIEROGLYPHIC LETTER NE;Lo;0;R;;;;;N;;;;; -1098D;MEROITIC HIEROGLYPHIC LETTER NE-2;Lo;0;R;;;;;N;;;;; -1098E;MEROITIC HIEROGLYPHIC LETTER RA;Lo;0;R;;;;;N;;;;; -1098F;MEROITIC HIEROGLYPHIC LETTER RA-2;Lo;0;R;;;;;N;;;;; -10990;MEROITIC HIEROGLYPHIC LETTER LA;Lo;0;R;;;;;N;;;;; -10991;MEROITIC HIEROGLYPHIC LETTER KHA;Lo;0;R;;;;;N;;;;; -10992;MEROITIC HIEROGLYPHIC LETTER HHA;Lo;0;R;;;;;N;;;;; -10993;MEROITIC HIEROGLYPHIC LETTER SA;Lo;0;R;;;;;N;;;;; -10994;MEROITIC HIEROGLYPHIC LETTER SA-2;Lo;0;R;;;;;N;;;;; -10995;MEROITIC HIEROGLYPHIC LETTER SE;Lo;0;R;;;;;N;;;;; -10996;MEROITIC HIEROGLYPHIC LETTER KA;Lo;0;R;;;;;N;;;;; -10997;MEROITIC HIEROGLYPHIC LETTER QA;Lo;0;R;;;;;N;;;;; -10998;MEROITIC HIEROGLYPHIC LETTER TA;Lo;0;R;;;;;N;;;;; -10999;MEROITIC HIEROGLYPHIC LETTER TA-2;Lo;0;R;;;;;N;;;;; -1099A;MEROITIC HIEROGLYPHIC LETTER TE;Lo;0;R;;;;;N;;;;; -1099B;MEROITIC HIEROGLYPHIC LETTER TE-2;Lo;0;R;;;;;N;;;;; -1099C;MEROITIC HIEROGLYPHIC LETTER TO;Lo;0;R;;;;;N;;;;; -1099D;MEROITIC HIEROGLYPHIC LETTER DA;Lo;0;R;;;;;N;;;;; -1099E;MEROITIC HIEROGLYPHIC SYMBOL VIDJ;Lo;0;R;;;;;N;;;;; -1099F;MEROITIC HIEROGLYPHIC SYMBOL VIDJ-2;Lo;0;R;;;;;N;;;;; -109A0;MEROITIC CURSIVE LETTER A;Lo;0;R;;;;;N;;;;; -109A1;MEROITIC CURSIVE LETTER E;Lo;0;R;;;;;N;;;;; -109A2;MEROITIC CURSIVE LETTER I;Lo;0;R;;;;;N;;;;; -109A3;MEROITIC CURSIVE LETTER O;Lo;0;R;;;;;N;;;;; -109A4;MEROITIC CURSIVE LETTER YA;Lo;0;R;;;;;N;;;;; -109A5;MEROITIC CURSIVE LETTER WA;Lo;0;R;;;;;N;;;;; -109A6;MEROITIC CURSIVE LETTER BA;Lo;0;R;;;;;N;;;;; -109A7;MEROITIC CURSIVE LETTER PA;Lo;0;R;;;;;N;;;;; -109A8;MEROITIC CURSIVE LETTER MA;Lo;0;R;;;;;N;;;;; -109A9;MEROITIC CURSIVE LETTER NA;Lo;0;R;;;;;N;;;;; -109AA;MEROITIC CURSIVE LETTER NE;Lo;0;R;;;;;N;;;;; -109AB;MEROITIC CURSIVE LETTER RA;Lo;0;R;;;;;N;;;;; -109AC;MEROITIC CURSIVE LETTER LA;Lo;0;R;;;;;N;;;;; -109AD;MEROITIC CURSIVE LETTER KHA;Lo;0;R;;;;;N;;;;; -109AE;MEROITIC CURSIVE LETTER HHA;Lo;0;R;;;;;N;;;;; -109AF;MEROITIC CURSIVE LETTER SA;Lo;0;R;;;;;N;;;;; -109B0;MEROITIC CURSIVE LETTER ARCHAIC SA;Lo;0;R;;;;;N;;;;; -109B1;MEROITIC CURSIVE LETTER SE;Lo;0;R;;;;;N;;;;; -109B2;MEROITIC CURSIVE LETTER KA;Lo;0;R;;;;;N;;;;; -109B3;MEROITIC CURSIVE LETTER QA;Lo;0;R;;;;;N;;;;; -109B4;MEROITIC CURSIVE LETTER TA;Lo;0;R;;;;;N;;;;; -109B5;MEROITIC CURSIVE LETTER TE;Lo;0;R;;;;;N;;;;; -109B6;MEROITIC CURSIVE LETTER TO;Lo;0;R;;;;;N;;;;; -109B7;MEROITIC CURSIVE LETTER DA;Lo;0;R;;;;;N;;;;; -109BC;MEROITIC CURSIVE FRACTION ELEVEN TWELFTHS;No;0;R;;;;11/12;N;;;;; -109BD;MEROITIC CURSIVE FRACTION ONE HALF;No;0;R;;;;1/2;N;;;;; -109BE;MEROITIC CURSIVE LOGOGRAM RMT;Lo;0;R;;;;;N;;;;; -109BF;MEROITIC CURSIVE LOGOGRAM IMN;Lo;0;R;;;;;N;;;;; -109C0;MEROITIC CURSIVE NUMBER ONE;No;0;R;;;;1;N;;;;; -109C1;MEROITIC CURSIVE NUMBER TWO;No;0;R;;;;2;N;;;;; -109C2;MEROITIC CURSIVE NUMBER THREE;No;0;R;;;;3;N;;;;; -109C3;MEROITIC CURSIVE NUMBER FOUR;No;0;R;;;;4;N;;;;; -109C4;MEROITIC CURSIVE NUMBER FIVE;No;0;R;;;;5;N;;;;; -109C5;MEROITIC CURSIVE NUMBER SIX;No;0;R;;;;6;N;;;;; -109C6;MEROITIC CURSIVE NUMBER SEVEN;No;0;R;;;;7;N;;;;; -109C7;MEROITIC CURSIVE NUMBER EIGHT;No;0;R;;;;8;N;;;;; -109C8;MEROITIC CURSIVE NUMBER NINE;No;0;R;;;;9;N;;;;; -109C9;MEROITIC CURSIVE NUMBER TEN;No;0;R;;;;10;N;;;;; -109CA;MEROITIC CURSIVE NUMBER TWENTY;No;0;R;;;;20;N;;;;; -109CB;MEROITIC CURSIVE NUMBER THIRTY;No;0;R;;;;30;N;;;;; -109CC;MEROITIC CURSIVE NUMBER FORTY;No;0;R;;;;40;N;;;;; -109CD;MEROITIC CURSIVE NUMBER FIFTY;No;0;R;;;;50;N;;;;; -109CE;MEROITIC CURSIVE NUMBER SIXTY;No;0;R;;;;60;N;;;;; -109CF;MEROITIC CURSIVE NUMBER SEVENTY;No;0;R;;;;70;N;;;;; -109D2;MEROITIC CURSIVE NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -109D3;MEROITIC CURSIVE NUMBER TWO HUNDRED;No;0;R;;;;200;N;;;;; -109D4;MEROITIC CURSIVE NUMBER THREE HUNDRED;No;0;R;;;;300;N;;;;; -109D5;MEROITIC CURSIVE NUMBER FOUR HUNDRED;No;0;R;;;;400;N;;;;; -109D6;MEROITIC CURSIVE NUMBER FIVE HUNDRED;No;0;R;;;;500;N;;;;; -109D7;MEROITIC CURSIVE NUMBER SIX HUNDRED;No;0;R;;;;600;N;;;;; -109D8;MEROITIC CURSIVE NUMBER SEVEN HUNDRED;No;0;R;;;;700;N;;;;; -109D9;MEROITIC CURSIVE NUMBER EIGHT HUNDRED;No;0;R;;;;800;N;;;;; -109DA;MEROITIC CURSIVE NUMBER NINE HUNDRED;No;0;R;;;;900;N;;;;; -109DB;MEROITIC CURSIVE NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -109DC;MEROITIC CURSIVE NUMBER TWO THOUSAND;No;0;R;;;;2000;N;;;;; -109DD;MEROITIC CURSIVE NUMBER THREE THOUSAND;No;0;R;;;;3000;N;;;;; -109DE;MEROITIC CURSIVE NUMBER FOUR THOUSAND;No;0;R;;;;4000;N;;;;; -109DF;MEROITIC CURSIVE NUMBER FIVE THOUSAND;No;0;R;;;;5000;N;;;;; -109E0;MEROITIC CURSIVE NUMBER SIX THOUSAND;No;0;R;;;;6000;N;;;;; -109E1;MEROITIC CURSIVE NUMBER SEVEN THOUSAND;No;0;R;;;;7000;N;;;;; -109E2;MEROITIC CURSIVE NUMBER EIGHT THOUSAND;No;0;R;;;;8000;N;;;;; -109E3;MEROITIC CURSIVE NUMBER NINE THOUSAND;No;0;R;;;;9000;N;;;;; -109E4;MEROITIC CURSIVE NUMBER TEN THOUSAND;No;0;R;;;;10000;N;;;;; -109E5;MEROITIC CURSIVE NUMBER TWENTY THOUSAND;No;0;R;;;;20000;N;;;;; -109E6;MEROITIC CURSIVE NUMBER THIRTY THOUSAND;No;0;R;;;;30000;N;;;;; -109E7;MEROITIC CURSIVE NUMBER FORTY THOUSAND;No;0;R;;;;40000;N;;;;; -109E8;MEROITIC CURSIVE NUMBER FIFTY THOUSAND;No;0;R;;;;50000;N;;;;; -109E9;MEROITIC CURSIVE NUMBER SIXTY THOUSAND;No;0;R;;;;60000;N;;;;; -109EA;MEROITIC CURSIVE NUMBER SEVENTY THOUSAND;No;0;R;;;;70000;N;;;;; -109EB;MEROITIC CURSIVE NUMBER EIGHTY THOUSAND;No;0;R;;;;80000;N;;;;; -109EC;MEROITIC CURSIVE NUMBER NINETY THOUSAND;No;0;R;;;;90000;N;;;;; -109ED;MEROITIC CURSIVE NUMBER ONE HUNDRED THOUSAND;No;0;R;;;;100000;N;;;;; -109EE;MEROITIC CURSIVE NUMBER TWO HUNDRED THOUSAND;No;0;R;;;;200000;N;;;;; -109EF;MEROITIC CURSIVE NUMBER THREE HUNDRED THOUSAND;No;0;R;;;;300000;N;;;;; -109F0;MEROITIC CURSIVE NUMBER FOUR HUNDRED THOUSAND;No;0;R;;;;400000;N;;;;; -109F1;MEROITIC CURSIVE NUMBER FIVE HUNDRED THOUSAND;No;0;R;;;;500000;N;;;;; -109F2;MEROITIC CURSIVE NUMBER SIX HUNDRED THOUSAND;No;0;R;;;;600000;N;;;;; -109F3;MEROITIC CURSIVE NUMBER SEVEN HUNDRED THOUSAND;No;0;R;;;;700000;N;;;;; -109F4;MEROITIC CURSIVE NUMBER EIGHT HUNDRED THOUSAND;No;0;R;;;;800000;N;;;;; -109F5;MEROITIC CURSIVE NUMBER NINE HUNDRED THOUSAND;No;0;R;;;;900000;N;;;;; -109F6;MEROITIC CURSIVE FRACTION ONE TWELFTH;No;0;R;;;;1/12;N;;;;; -109F7;MEROITIC CURSIVE FRACTION TWO TWELFTHS;No;0;R;;;;2/12;N;;;;; -109F8;MEROITIC CURSIVE FRACTION THREE TWELFTHS;No;0;R;;;;3/12;N;;;;; -109F9;MEROITIC CURSIVE FRACTION FOUR TWELFTHS;No;0;R;;;;4/12;N;;;;; -109FA;MEROITIC CURSIVE FRACTION FIVE TWELFTHS;No;0;R;;;;5/12;N;;;;; -109FB;MEROITIC CURSIVE FRACTION SIX TWELFTHS;No;0;R;;;;6/12;N;;;;; -109FC;MEROITIC CURSIVE FRACTION SEVEN TWELFTHS;No;0;R;;;;7/12;N;;;;; -109FD;MEROITIC CURSIVE FRACTION EIGHT TWELFTHS;No;0;R;;;;8/12;N;;;;; -109FE;MEROITIC CURSIVE FRACTION NINE TWELFTHS;No;0;R;;;;9/12;N;;;;; -109FF;MEROITIC CURSIVE FRACTION TEN TWELFTHS;No;0;R;;;;10/12;N;;;;; -10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;; -10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;; -10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;; -10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; -10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;; -10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;; -10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;; -10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;; -10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;; -10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;; -10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;; -10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;; -10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;; -10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;; -10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;; -10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;; -10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;; -10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;; -10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;; -10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;; -10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;; -10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;; -10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;; -10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;; -10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;; -10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;; -10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;; -10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;; -10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;; -10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;; -10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;; -10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;; -10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;; -10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;; -10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;; -10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;; -10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;; -10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;; -10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;; -10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;; -10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;; -10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;; -10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;; -10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;; -10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;; -10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;; -10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;; -10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;; -10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;; -10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;; -10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;; -10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;; -10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;; -10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;; -10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;; -10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;; -10A60;OLD SOUTH ARABIAN LETTER HE;Lo;0;R;;;;;N;;;;; -10A61;OLD SOUTH ARABIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10A62;OLD SOUTH ARABIAN LETTER HETH;Lo;0;R;;;;;N;;;;; -10A63;OLD SOUTH ARABIAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10A64;OLD SOUTH ARABIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -10A65;OLD SOUTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10A66;OLD SOUTH ARABIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10A67;OLD SOUTH ARABIAN LETTER RESH;Lo;0;R;;;;;N;;;;; -10A68;OLD SOUTH ARABIAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10A69;OLD SOUTH ARABIAN LETTER TAW;Lo;0;R;;;;;N;;;;; -10A6A;OLD SOUTH ARABIAN LETTER SAT;Lo;0;R;;;;;N;;;;; -10A6B;OLD SOUTH ARABIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10A6C;OLD SOUTH ARABIAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10A6D;OLD SOUTH ARABIAN LETTER KHETH;Lo;0;R;;;;;N;;;;; -10A6E;OLD SOUTH ARABIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -10A6F;OLD SOUTH ARABIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10A70;OLD SOUTH ARABIAN LETTER FE;Lo;0;R;;;;;N;;;;; -10A71;OLD SOUTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; -10A72;OLD SOUTH ARABIAN LETTER AYN;Lo;0;R;;;;;N;;;;; -10A73;OLD SOUTH ARABIAN LETTER DHADHE;Lo;0;R;;;;;N;;;;; -10A74;OLD SOUTH ARABIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10A75;OLD SOUTH ARABIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10A76;OLD SOUTH ARABIAN LETTER GHAYN;Lo;0;R;;;;;N;;;;; -10A77;OLD SOUTH ARABIAN LETTER TETH;Lo;0;R;;;;;N;;;;; -10A78;OLD SOUTH ARABIAN LETTER ZAYN;Lo;0;R;;;;;N;;;;; -10A79;OLD SOUTH ARABIAN LETTER DHALETH;Lo;0;R;;;;;N;;;;; -10A7A;OLD SOUTH ARABIAN LETTER YODH;Lo;0;R;;;;;N;;;;; -10A7B;OLD SOUTH ARABIAN LETTER THAW;Lo;0;R;;;;;N;;;;; -10A7C;OLD SOUTH ARABIAN LETTER THETH;Lo;0;R;;;;;N;;;;; -10A7D;OLD SOUTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10A7E;OLD SOUTH ARABIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; -10A7F;OLD SOUTH ARABIAN NUMERIC INDICATOR;Po;0;R;;;;;N;;;;; -10A80;OLD NORTH ARABIAN LETTER HEH;Lo;0;R;;;;;N;;;;; -10A81;OLD NORTH ARABIAN LETTER LAM;Lo;0;R;;;;;N;;;;; -10A82;OLD NORTH ARABIAN LETTER HAH;Lo;0;R;;;;;N;;;;; -10A83;OLD NORTH ARABIAN LETTER MEEM;Lo;0;R;;;;;N;;;;; -10A84;OLD NORTH ARABIAN LETTER QAF;Lo;0;R;;;;;N;;;;; -10A85;OLD NORTH ARABIAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10A86;OLD NORTH ARABIAN LETTER ES-2;Lo;0;R;;;;;N;;;;; -10A87;OLD NORTH ARABIAN LETTER REH;Lo;0;R;;;;;N;;;;; -10A88;OLD NORTH ARABIAN LETTER BEH;Lo;0;R;;;;;N;;;;; -10A89;OLD NORTH ARABIAN LETTER TEH;Lo;0;R;;;;;N;;;;; -10A8A;OLD NORTH ARABIAN LETTER ES-1;Lo;0;R;;;;;N;;;;; -10A8B;OLD NORTH ARABIAN LETTER KAF;Lo;0;R;;;;;N;;;;; -10A8C;OLD NORTH ARABIAN LETTER NOON;Lo;0;R;;;;;N;;;;; -10A8D;OLD NORTH ARABIAN LETTER KHAH;Lo;0;R;;;;;N;;;;; -10A8E;OLD NORTH ARABIAN LETTER SAD;Lo;0;R;;;;;N;;;;; -10A8F;OLD NORTH ARABIAN LETTER ES-3;Lo;0;R;;;;;N;;;;; -10A90;OLD NORTH ARABIAN LETTER FEH;Lo;0;R;;;;;N;;;;; -10A91;OLD NORTH ARABIAN LETTER ALEF;Lo;0;R;;;;;N;;;;; -10A92;OLD NORTH ARABIAN LETTER AIN;Lo;0;R;;;;;N;;;;; -10A93;OLD NORTH ARABIAN LETTER DAD;Lo;0;R;;;;;N;;;;; -10A94;OLD NORTH ARABIAN LETTER GEEM;Lo;0;R;;;;;N;;;;; -10A95;OLD NORTH ARABIAN LETTER DAL;Lo;0;R;;;;;N;;;;; -10A96;OLD NORTH ARABIAN LETTER GHAIN;Lo;0;R;;;;;N;;;;; -10A97;OLD NORTH ARABIAN LETTER TAH;Lo;0;R;;;;;N;;;;; -10A98;OLD NORTH ARABIAN LETTER ZAIN;Lo;0;R;;;;;N;;;;; -10A99;OLD NORTH ARABIAN LETTER THAL;Lo;0;R;;;;;N;;;;; -10A9A;OLD NORTH ARABIAN LETTER YEH;Lo;0;R;;;;;N;;;;; -10A9B;OLD NORTH ARABIAN LETTER THEH;Lo;0;R;;;;;N;;;;; -10A9C;OLD NORTH ARABIAN LETTER ZAH;Lo;0;R;;;;;N;;;;; -10A9D;OLD NORTH ARABIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10A9E;OLD NORTH ARABIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10A9F;OLD NORTH ARABIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10AC0;MANICHAEAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10AC1;MANICHAEAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10AC2;MANICHAEAN LETTER BHETH;Lo;0;R;;;;;N;;;;; -10AC3;MANICHAEAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10AC4;MANICHAEAN LETTER GHIMEL;Lo;0;R;;;;;N;;;;; -10AC5;MANICHAEAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10AC6;MANICHAEAN LETTER HE;Lo;0;R;;;;;N;;;;; -10AC7;MANICHAEAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10AC8;MANICHAEAN SIGN UD;So;0;R;;;;;N;;;;; -10AC9;MANICHAEAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10ACA;MANICHAEAN LETTER ZHAYIN;Lo;0;R;;;;;N;;;;; -10ACB;MANICHAEAN LETTER JAYIN;Lo;0;R;;;;;N;;;;; -10ACC;MANICHAEAN LETTER JHAYIN;Lo;0;R;;;;;N;;;;; -10ACD;MANICHAEAN LETTER HETH;Lo;0;R;;;;;N;;;;; -10ACE;MANICHAEAN LETTER TETH;Lo;0;R;;;;;N;;;;; -10ACF;MANICHAEAN LETTER YODH;Lo;0;R;;;;;N;;;;; -10AD0;MANICHAEAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10AD1;MANICHAEAN LETTER XAPH;Lo;0;R;;;;;N;;;;; -10AD2;MANICHAEAN LETTER KHAPH;Lo;0;R;;;;;N;;;;; -10AD3;MANICHAEAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10AD4;MANICHAEAN LETTER DHAMEDH;Lo;0;R;;;;;N;;;;; -10AD5;MANICHAEAN LETTER THAMEDH;Lo;0;R;;;;;N;;;;; -10AD6;MANICHAEAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10AD7;MANICHAEAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10AD8;MANICHAEAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10AD9;MANICHAEAN LETTER AYIN;Lo;0;R;;;;;N;;;;; -10ADA;MANICHAEAN LETTER AAYIN;Lo;0;R;;;;;N;;;;; -10ADB;MANICHAEAN LETTER PE;Lo;0;R;;;;;N;;;;; -10ADC;MANICHAEAN LETTER FE;Lo;0;R;;;;;N;;;;; -10ADD;MANICHAEAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -10ADE;MANICHAEAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -10ADF;MANICHAEAN LETTER XOPH;Lo;0;R;;;;;N;;;;; -10AE0;MANICHAEAN LETTER QHOPH;Lo;0;R;;;;;N;;;;; -10AE1;MANICHAEAN LETTER RESH;Lo;0;R;;;;;N;;;;; -10AE2;MANICHAEAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10AE3;MANICHAEAN LETTER SSHIN;Lo;0;R;;;;;N;;;;; -10AE4;MANICHAEAN LETTER TAW;Lo;0;R;;;;;N;;;;; -10AE5;MANICHAEAN ABBREVIATION MARK ABOVE;Mn;230;NSM;;;;;N;;;;; -10AE6;MANICHAEAN ABBREVIATION MARK BELOW;Mn;220;NSM;;;;;N;;;;; -10AEB;MANICHAEAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10AEC;MANICHAEAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -10AED;MANICHAEAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10AEE;MANICHAEAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10AEF;MANICHAEAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10AF0;MANICHAEAN PUNCTUATION STAR;Po;0;R;;;;;N;;;;; -10AF1;MANICHAEAN PUNCTUATION FLEURON;Po;0;R;;;;;N;;;;; -10AF2;MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT;Po;0;R;;;;;N;;;;; -10AF3;MANICHAEAN PUNCTUATION DOT WITHIN DOT;Po;0;R;;;;;N;;;;; -10AF4;MANICHAEAN PUNCTUATION DOT;Po;0;R;;;;;N;;;;; -10AF5;MANICHAEAN PUNCTUATION TWO DOTS;Po;0;R;;;;;N;;;;; -10AF6;MANICHAEAN PUNCTUATION LINE FILLER;Po;0;R;;;;;N;;;;; -10B00;AVESTAN LETTER A;Lo;0;R;;;;;N;;;;; -10B01;AVESTAN LETTER AA;Lo;0;R;;;;;N;;;;; -10B02;AVESTAN LETTER AO;Lo;0;R;;;;;N;;;;; -10B03;AVESTAN LETTER AAO;Lo;0;R;;;;;N;;;;; -10B04;AVESTAN LETTER AN;Lo;0;R;;;;;N;;;;; -10B05;AVESTAN LETTER AAN;Lo;0;R;;;;;N;;;;; -10B06;AVESTAN LETTER AE;Lo;0;R;;;;;N;;;;; -10B07;AVESTAN LETTER AEE;Lo;0;R;;;;;N;;;;; -10B08;AVESTAN LETTER E;Lo;0;R;;;;;N;;;;; -10B09;AVESTAN LETTER EE;Lo;0;R;;;;;N;;;;; -10B0A;AVESTAN LETTER O;Lo;0;R;;;;;N;;;;; -10B0B;AVESTAN LETTER OO;Lo;0;R;;;;;N;;;;; -10B0C;AVESTAN LETTER I;Lo;0;R;;;;;N;;;;; -10B0D;AVESTAN LETTER II;Lo;0;R;;;;;N;;;;; -10B0E;AVESTAN LETTER U;Lo;0;R;;;;;N;;;;; -10B0F;AVESTAN LETTER UU;Lo;0;R;;;;;N;;;;; -10B10;AVESTAN LETTER KE;Lo;0;R;;;;;N;;;;; -10B11;AVESTAN LETTER XE;Lo;0;R;;;;;N;;;;; -10B12;AVESTAN LETTER XYE;Lo;0;R;;;;;N;;;;; -10B13;AVESTAN LETTER XVE;Lo;0;R;;;;;N;;;;; -10B14;AVESTAN LETTER GE;Lo;0;R;;;;;N;;;;; -10B15;AVESTAN LETTER GGE;Lo;0;R;;;;;N;;;;; -10B16;AVESTAN LETTER GHE;Lo;0;R;;;;;N;;;;; -10B17;AVESTAN LETTER CE;Lo;0;R;;;;;N;;;;; -10B18;AVESTAN LETTER JE;Lo;0;R;;;;;N;;;;; -10B19;AVESTAN LETTER TE;Lo;0;R;;;;;N;;;;; -10B1A;AVESTAN LETTER THE;Lo;0;R;;;;;N;;;;; -10B1B;AVESTAN LETTER DE;Lo;0;R;;;;;N;;;;; -10B1C;AVESTAN LETTER DHE;Lo;0;R;;;;;N;;;;; -10B1D;AVESTAN LETTER TTE;Lo;0;R;;;;;N;;;;; -10B1E;AVESTAN LETTER PE;Lo;0;R;;;;;N;;;;; -10B1F;AVESTAN LETTER FE;Lo;0;R;;;;;N;;;;; -10B20;AVESTAN LETTER BE;Lo;0;R;;;;;N;;;;; -10B21;AVESTAN LETTER BHE;Lo;0;R;;;;;N;;;;; -10B22;AVESTAN LETTER NGE;Lo;0;R;;;;;N;;;;; -10B23;AVESTAN LETTER NGYE;Lo;0;R;;;;;N;;;;; -10B24;AVESTAN LETTER NGVE;Lo;0;R;;;;;N;;;;; -10B25;AVESTAN LETTER NE;Lo;0;R;;;;;N;;;;; -10B26;AVESTAN LETTER NYE;Lo;0;R;;;;;N;;;;; -10B27;AVESTAN LETTER NNE;Lo;0;R;;;;;N;;;;; -10B28;AVESTAN LETTER ME;Lo;0;R;;;;;N;;;;; -10B29;AVESTAN LETTER HME;Lo;0;R;;;;;N;;;;; -10B2A;AVESTAN LETTER YYE;Lo;0;R;;;;;N;;;;; -10B2B;AVESTAN LETTER YE;Lo;0;R;;;;;N;;;;; -10B2C;AVESTAN LETTER VE;Lo;0;R;;;;;N;;;;; -10B2D;AVESTAN LETTER RE;Lo;0;R;;;;;N;;;;; -10B2E;AVESTAN LETTER LE;Lo;0;R;;;;;N;;;;; -10B2F;AVESTAN LETTER SE;Lo;0;R;;;;;N;;;;; -10B30;AVESTAN LETTER ZE;Lo;0;R;;;;;N;;;;; -10B31;AVESTAN LETTER SHE;Lo;0;R;;;;;N;;;;; -10B32;AVESTAN LETTER ZHE;Lo;0;R;;;;;N;;;;; -10B33;AVESTAN LETTER SHYE;Lo;0;R;;;;;N;;;;; -10B34;AVESTAN LETTER SSHE;Lo;0;R;;;;;N;;;;; -10B35;AVESTAN LETTER HE;Lo;0;R;;;;;N;;;;; -10B39;AVESTAN ABBREVIATION MARK;Po;0;ON;;;;;N;;;;; -10B3A;TINY TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3B;SMALL TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3C;LARGE TWO DOTS OVER ONE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3D;LARGE ONE DOT OVER TWO DOTS PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3E;LARGE TWO RINGS OVER ONE RING PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B3F;LARGE ONE RING OVER TWO RINGS PUNCTUATION;Po;0;ON;;;;;N;;;;; -10B40;INSCRIPTIONAL PARTHIAN LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10B41;INSCRIPTIONAL PARTHIAN LETTER BETH;Lo;0;R;;;;;N;;;;; -10B42;INSCRIPTIONAL PARTHIAN LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10B43;INSCRIPTIONAL PARTHIAN LETTER DALETH;Lo;0;R;;;;;N;;;;; -10B44;INSCRIPTIONAL PARTHIAN LETTER HE;Lo;0;R;;;;;N;;;;; -10B45;INSCRIPTIONAL PARTHIAN LETTER WAW;Lo;0;R;;;;;N;;;;; -10B46;INSCRIPTIONAL PARTHIAN LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10B47;INSCRIPTIONAL PARTHIAN LETTER HETH;Lo;0;R;;;;;N;;;;; -10B48;INSCRIPTIONAL PARTHIAN LETTER TETH;Lo;0;R;;;;;N;;;;; -10B49;INSCRIPTIONAL PARTHIAN LETTER YODH;Lo;0;R;;;;;N;;;;; -10B4A;INSCRIPTIONAL PARTHIAN LETTER KAPH;Lo;0;R;;;;;N;;;;; -10B4B;INSCRIPTIONAL PARTHIAN LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10B4C;INSCRIPTIONAL PARTHIAN LETTER MEM;Lo;0;R;;;;;N;;;;; -10B4D;INSCRIPTIONAL PARTHIAN LETTER NUN;Lo;0;R;;;;;N;;;;; -10B4E;INSCRIPTIONAL PARTHIAN LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10B4F;INSCRIPTIONAL PARTHIAN LETTER AYIN;Lo;0;R;;;;;N;;;;; -10B50;INSCRIPTIONAL PARTHIAN LETTER PE;Lo;0;R;;;;;N;;;;; -10B51;INSCRIPTIONAL PARTHIAN LETTER SADHE;Lo;0;R;;;;;N;;;;; -10B52;INSCRIPTIONAL PARTHIAN LETTER QOPH;Lo;0;R;;;;;N;;;;; -10B53;INSCRIPTIONAL PARTHIAN LETTER RESH;Lo;0;R;;;;;N;;;;; -10B54;INSCRIPTIONAL PARTHIAN LETTER SHIN;Lo;0;R;;;;;N;;;;; -10B55;INSCRIPTIONAL PARTHIAN LETTER TAW;Lo;0;R;;;;;N;;;;; -10B58;INSCRIPTIONAL PARTHIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10B59;INSCRIPTIONAL PARTHIAN NUMBER TWO;No;0;R;;;;2;N;;;;; -10B5A;INSCRIPTIONAL PARTHIAN NUMBER THREE;No;0;R;;;;3;N;;;;; -10B5B;INSCRIPTIONAL PARTHIAN NUMBER FOUR;No;0;R;;;;4;N;;;;; -10B5C;INSCRIPTIONAL PARTHIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10B5D;INSCRIPTIONAL PARTHIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10B5E;INSCRIPTIONAL PARTHIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10B5F;INSCRIPTIONAL PARTHIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10B60;INSCRIPTIONAL PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10B61;INSCRIPTIONAL PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; -10B62;INSCRIPTIONAL PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10B63;INSCRIPTIONAL PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; -10B64;INSCRIPTIONAL PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; -10B65;INSCRIPTIONAL PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; -10B66;INSCRIPTIONAL PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10B67;INSCRIPTIONAL PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; -10B68;INSCRIPTIONAL PAHLAVI LETTER TETH;Lo;0;R;;;;;N;;;;; -10B69;INSCRIPTIONAL PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; -10B6A;INSCRIPTIONAL PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; -10B6B;INSCRIPTIONAL PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10B6C;INSCRIPTIONAL PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; -10B6D;INSCRIPTIONAL PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; -10B6E;INSCRIPTIONAL PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10B6F;INSCRIPTIONAL PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; -10B70;INSCRIPTIONAL PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; -10B71;INSCRIPTIONAL PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; -10B72;INSCRIPTIONAL PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; -10B78;INSCRIPTIONAL PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; -10B79;INSCRIPTIONAL PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; -10B7A;INSCRIPTIONAL PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; -10B7B;INSCRIPTIONAL PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; -10B7C;INSCRIPTIONAL PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; -10B7D;INSCRIPTIONAL PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10B7E;INSCRIPTIONAL PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10B7F;INSCRIPTIONAL PAHLAVI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10B80;PSALTER PAHLAVI LETTER ALEPH;Lo;0;R;;;;;N;;;;; -10B81;PSALTER PAHLAVI LETTER BETH;Lo;0;R;;;;;N;;;;; -10B82;PSALTER PAHLAVI LETTER GIMEL;Lo;0;R;;;;;N;;;;; -10B83;PSALTER PAHLAVI LETTER DALETH;Lo;0;R;;;;;N;;;;; -10B84;PSALTER PAHLAVI LETTER HE;Lo;0;R;;;;;N;;;;; -10B85;PSALTER PAHLAVI LETTER WAW-AYIN-RESH;Lo;0;R;;;;;N;;;;; -10B86;PSALTER PAHLAVI LETTER ZAYIN;Lo;0;R;;;;;N;;;;; -10B87;PSALTER PAHLAVI LETTER HETH;Lo;0;R;;;;;N;;;;; -10B88;PSALTER PAHLAVI LETTER YODH;Lo;0;R;;;;;N;;;;; -10B89;PSALTER PAHLAVI LETTER KAPH;Lo;0;R;;;;;N;;;;; -10B8A;PSALTER PAHLAVI LETTER LAMEDH;Lo;0;R;;;;;N;;;;; -10B8B;PSALTER PAHLAVI LETTER MEM-QOPH;Lo;0;R;;;;;N;;;;; -10B8C;PSALTER PAHLAVI LETTER NUN;Lo;0;R;;;;;N;;;;; -10B8D;PSALTER PAHLAVI LETTER SAMEKH;Lo;0;R;;;;;N;;;;; -10B8E;PSALTER PAHLAVI LETTER PE;Lo;0;R;;;;;N;;;;; -10B8F;PSALTER PAHLAVI LETTER SADHE;Lo;0;R;;;;;N;;;;; -10B90;PSALTER PAHLAVI LETTER SHIN;Lo;0;R;;;;;N;;;;; -10B91;PSALTER PAHLAVI LETTER TAW;Lo;0;R;;;;;N;;;;; -10B99;PSALTER PAHLAVI SECTION MARK;Po;0;R;;;;;N;;;;; -10B9A;PSALTER PAHLAVI TURNED SECTION MARK;Po;0;R;;;;;N;;;;; -10B9B;PSALTER PAHLAVI FOUR DOTS WITH CROSS;Po;0;R;;;;;N;;;;; -10B9C;PSALTER PAHLAVI FOUR DOTS WITH DOT;Po;0;R;;;;;N;;;;; -10BA9;PSALTER PAHLAVI NUMBER ONE;No;0;R;;;;1;N;;;;; -10BAA;PSALTER PAHLAVI NUMBER TWO;No;0;R;;;;2;N;;;;; -10BAB;PSALTER PAHLAVI NUMBER THREE;No;0;R;;;;3;N;;;;; -10BAC;PSALTER PAHLAVI NUMBER FOUR;No;0;R;;;;4;N;;;;; -10BAD;PSALTER PAHLAVI NUMBER TEN;No;0;R;;;;10;N;;;;; -10BAE;PSALTER PAHLAVI NUMBER TWENTY;No;0;R;;;;20;N;;;;; -10BAF;PSALTER PAHLAVI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10C00;OLD TURKIC LETTER ORKHON A;Lo;0;R;;;;;N;;;;; -10C01;OLD TURKIC LETTER YENISEI A;Lo;0;R;;;;;N;;;;; -10C02;OLD TURKIC LETTER YENISEI AE;Lo;0;R;;;;;N;;;;; -10C03;OLD TURKIC LETTER ORKHON I;Lo;0;R;;;;;N;;;;; -10C04;OLD TURKIC LETTER YENISEI I;Lo;0;R;;;;;N;;;;; -10C05;OLD TURKIC LETTER YENISEI E;Lo;0;R;;;;;N;;;;; -10C06;OLD TURKIC LETTER ORKHON O;Lo;0;R;;;;;N;;;;; -10C07;OLD TURKIC LETTER ORKHON OE;Lo;0;R;;;;;N;;;;; -10C08;OLD TURKIC LETTER YENISEI OE;Lo;0;R;;;;;N;;;;; -10C09;OLD TURKIC LETTER ORKHON AB;Lo;0;R;;;;;N;;;;; -10C0A;OLD TURKIC LETTER YENISEI AB;Lo;0;R;;;;;N;;;;; -10C0B;OLD TURKIC LETTER ORKHON AEB;Lo;0;R;;;;;N;;;;; -10C0C;OLD TURKIC LETTER YENISEI AEB;Lo;0;R;;;;;N;;;;; -10C0D;OLD TURKIC LETTER ORKHON AG;Lo;0;R;;;;;N;;;;; -10C0E;OLD TURKIC LETTER YENISEI AG;Lo;0;R;;;;;N;;;;; -10C0F;OLD TURKIC LETTER ORKHON AEG;Lo;0;R;;;;;N;;;;; -10C10;OLD TURKIC LETTER YENISEI AEG;Lo;0;R;;;;;N;;;;; -10C11;OLD TURKIC LETTER ORKHON AD;Lo;0;R;;;;;N;;;;; -10C12;OLD TURKIC LETTER YENISEI AD;Lo;0;R;;;;;N;;;;; -10C13;OLD TURKIC LETTER ORKHON AED;Lo;0;R;;;;;N;;;;; -10C14;OLD TURKIC LETTER ORKHON EZ;Lo;0;R;;;;;N;;;;; -10C15;OLD TURKIC LETTER YENISEI EZ;Lo;0;R;;;;;N;;;;; -10C16;OLD TURKIC LETTER ORKHON AY;Lo;0;R;;;;;N;;;;; -10C17;OLD TURKIC LETTER YENISEI AY;Lo;0;R;;;;;N;;;;; -10C18;OLD TURKIC LETTER ORKHON AEY;Lo;0;R;;;;;N;;;;; -10C19;OLD TURKIC LETTER YENISEI AEY;Lo;0;R;;;;;N;;;;; -10C1A;OLD TURKIC LETTER ORKHON AEK;Lo;0;R;;;;;N;;;;; -10C1B;OLD TURKIC LETTER YENISEI AEK;Lo;0;R;;;;;N;;;;; -10C1C;OLD TURKIC LETTER ORKHON OEK;Lo;0;R;;;;;N;;;;; -10C1D;OLD TURKIC LETTER YENISEI OEK;Lo;0;R;;;;;N;;;;; -10C1E;OLD TURKIC LETTER ORKHON AL;Lo;0;R;;;;;N;;;;; -10C1F;OLD TURKIC LETTER YENISEI AL;Lo;0;R;;;;;N;;;;; -10C20;OLD TURKIC LETTER ORKHON AEL;Lo;0;R;;;;;N;;;;; -10C21;OLD TURKIC LETTER ORKHON ELT;Lo;0;R;;;;;N;;;;; -10C22;OLD TURKIC LETTER ORKHON EM;Lo;0;R;;;;;N;;;;; -10C23;OLD TURKIC LETTER ORKHON AN;Lo;0;R;;;;;N;;;;; -10C24;OLD TURKIC LETTER ORKHON AEN;Lo;0;R;;;;;N;;;;; -10C25;OLD TURKIC LETTER YENISEI AEN;Lo;0;R;;;;;N;;;;; -10C26;OLD TURKIC LETTER ORKHON ENT;Lo;0;R;;;;;N;;;;; -10C27;OLD TURKIC LETTER YENISEI ENT;Lo;0;R;;;;;N;;;;; -10C28;OLD TURKIC LETTER ORKHON ENC;Lo;0;R;;;;;N;;;;; -10C29;OLD TURKIC LETTER YENISEI ENC;Lo;0;R;;;;;N;;;;; -10C2A;OLD TURKIC LETTER ORKHON ENY;Lo;0;R;;;;;N;;;;; -10C2B;OLD TURKIC LETTER YENISEI ENY;Lo;0;R;;;;;N;;;;; -10C2C;OLD TURKIC LETTER YENISEI ANG;Lo;0;R;;;;;N;;;;; -10C2D;OLD TURKIC LETTER ORKHON ENG;Lo;0;R;;;;;N;;;;; -10C2E;OLD TURKIC LETTER YENISEI AENG;Lo;0;R;;;;;N;;;;; -10C2F;OLD TURKIC LETTER ORKHON EP;Lo;0;R;;;;;N;;;;; -10C30;OLD TURKIC LETTER ORKHON OP;Lo;0;R;;;;;N;;;;; -10C31;OLD TURKIC LETTER ORKHON IC;Lo;0;R;;;;;N;;;;; -10C32;OLD TURKIC LETTER ORKHON EC;Lo;0;R;;;;;N;;;;; -10C33;OLD TURKIC LETTER YENISEI EC;Lo;0;R;;;;;N;;;;; -10C34;OLD TURKIC LETTER ORKHON AQ;Lo;0;R;;;;;N;;;;; -10C35;OLD TURKIC LETTER YENISEI AQ;Lo;0;R;;;;;N;;;;; -10C36;OLD TURKIC LETTER ORKHON IQ;Lo;0;R;;;;;N;;;;; -10C37;OLD TURKIC LETTER YENISEI IQ;Lo;0;R;;;;;N;;;;; -10C38;OLD TURKIC LETTER ORKHON OQ;Lo;0;R;;;;;N;;;;; -10C39;OLD TURKIC LETTER YENISEI OQ;Lo;0;R;;;;;N;;;;; -10C3A;OLD TURKIC LETTER ORKHON AR;Lo;0;R;;;;;N;;;;; -10C3B;OLD TURKIC LETTER YENISEI AR;Lo;0;R;;;;;N;;;;; -10C3C;OLD TURKIC LETTER ORKHON AER;Lo;0;R;;;;;N;;;;; -10C3D;OLD TURKIC LETTER ORKHON AS;Lo;0;R;;;;;N;;;;; -10C3E;OLD TURKIC LETTER ORKHON AES;Lo;0;R;;;;;N;;;;; -10C3F;OLD TURKIC LETTER ORKHON ASH;Lo;0;R;;;;;N;;;;; -10C40;OLD TURKIC LETTER YENISEI ASH;Lo;0;R;;;;;N;;;;; -10C41;OLD TURKIC LETTER ORKHON ESH;Lo;0;R;;;;;N;;;;; -10C42;OLD TURKIC LETTER YENISEI ESH;Lo;0;R;;;;;N;;;;; -10C43;OLD TURKIC LETTER ORKHON AT;Lo;0;R;;;;;N;;;;; -10C44;OLD TURKIC LETTER YENISEI AT;Lo;0;R;;;;;N;;;;; -10C45;OLD TURKIC LETTER ORKHON AET;Lo;0;R;;;;;N;;;;; -10C46;OLD TURKIC LETTER YENISEI AET;Lo;0;R;;;;;N;;;;; -10C47;OLD TURKIC LETTER ORKHON OT;Lo;0;R;;;;;N;;;;; -10C48;OLD TURKIC LETTER ORKHON BASH;Lo;0;R;;;;;N;;;;; -10C80;OLD HUNGARIAN CAPITAL LETTER A;Lu;0;R;;;;;N;;;;10CC0; -10C81;OLD HUNGARIAN CAPITAL LETTER AA;Lu;0;R;;;;;N;;;;10CC1; -10C82;OLD HUNGARIAN CAPITAL LETTER EB;Lu;0;R;;;;;N;;;;10CC2; -10C83;OLD HUNGARIAN CAPITAL LETTER AMB;Lu;0;R;;;;;N;;;;10CC3; -10C84;OLD HUNGARIAN CAPITAL LETTER EC;Lu;0;R;;;;;N;;;;10CC4; -10C85;OLD HUNGARIAN CAPITAL LETTER ENC;Lu;0;R;;;;;N;;;;10CC5; -10C86;OLD HUNGARIAN CAPITAL LETTER ECS;Lu;0;R;;;;;N;;;;10CC6; -10C87;OLD HUNGARIAN CAPITAL LETTER ED;Lu;0;R;;;;;N;;;;10CC7; -10C88;OLD HUNGARIAN CAPITAL LETTER AND;Lu;0;R;;;;;N;;;;10CC8; -10C89;OLD HUNGARIAN CAPITAL LETTER E;Lu;0;R;;;;;N;;;;10CC9; -10C8A;OLD HUNGARIAN CAPITAL LETTER CLOSE E;Lu;0;R;;;;;N;;;;10CCA; -10C8B;OLD HUNGARIAN CAPITAL LETTER EE;Lu;0;R;;;;;N;;;;10CCB; -10C8C;OLD HUNGARIAN CAPITAL LETTER EF;Lu;0;R;;;;;N;;;;10CCC; -10C8D;OLD HUNGARIAN CAPITAL LETTER EG;Lu;0;R;;;;;N;;;;10CCD; -10C8E;OLD HUNGARIAN CAPITAL LETTER EGY;Lu;0;R;;;;;N;;;;10CCE; -10C8F;OLD HUNGARIAN CAPITAL LETTER EH;Lu;0;R;;;;;N;;;;10CCF; -10C90;OLD HUNGARIAN CAPITAL LETTER I;Lu;0;R;;;;;N;;;;10CD0; -10C91;OLD HUNGARIAN CAPITAL LETTER II;Lu;0;R;;;;;N;;;;10CD1; -10C92;OLD HUNGARIAN CAPITAL LETTER EJ;Lu;0;R;;;;;N;;;;10CD2; -10C93;OLD HUNGARIAN CAPITAL LETTER EK;Lu;0;R;;;;;N;;;;10CD3; -10C94;OLD HUNGARIAN CAPITAL LETTER AK;Lu;0;R;;;;;N;;;;10CD4; -10C95;OLD HUNGARIAN CAPITAL LETTER UNK;Lu;0;R;;;;;N;;;;10CD5; -10C96;OLD HUNGARIAN CAPITAL LETTER EL;Lu;0;R;;;;;N;;;;10CD6; -10C97;OLD HUNGARIAN CAPITAL LETTER ELY;Lu;0;R;;;;;N;;;;10CD7; -10C98;OLD HUNGARIAN CAPITAL LETTER EM;Lu;0;R;;;;;N;;;;10CD8; -10C99;OLD HUNGARIAN CAPITAL LETTER EN;Lu;0;R;;;;;N;;;;10CD9; -10C9A;OLD HUNGARIAN CAPITAL LETTER ENY;Lu;0;R;;;;;N;;;;10CDA; -10C9B;OLD HUNGARIAN CAPITAL LETTER O;Lu;0;R;;;;;N;;;;10CDB; -10C9C;OLD HUNGARIAN CAPITAL LETTER OO;Lu;0;R;;;;;N;;;;10CDC; -10C9D;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG OE;Lu;0;R;;;;;N;;;;10CDD; -10C9E;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA OE;Lu;0;R;;;;;N;;;;10CDE; -10C9F;OLD HUNGARIAN CAPITAL LETTER OEE;Lu;0;R;;;;;N;;;;10CDF; -10CA0;OLD HUNGARIAN CAPITAL LETTER EP;Lu;0;R;;;;;N;;;;10CE0; -10CA1;OLD HUNGARIAN CAPITAL LETTER EMP;Lu;0;R;;;;;N;;;;10CE1; -10CA2;OLD HUNGARIAN CAPITAL LETTER ER;Lu;0;R;;;;;N;;;;10CE2; -10CA3;OLD HUNGARIAN CAPITAL LETTER SHORT ER;Lu;0;R;;;;;N;;;;10CE3; -10CA4;OLD HUNGARIAN CAPITAL LETTER ES;Lu;0;R;;;;;N;;;;10CE4; -10CA5;OLD HUNGARIAN CAPITAL LETTER ESZ;Lu;0;R;;;;;N;;;;10CE5; -10CA6;OLD HUNGARIAN CAPITAL LETTER ET;Lu;0;R;;;;;N;;;;10CE6; -10CA7;OLD HUNGARIAN CAPITAL LETTER ENT;Lu;0;R;;;;;N;;;;10CE7; -10CA8;OLD HUNGARIAN CAPITAL LETTER ETY;Lu;0;R;;;;;N;;;;10CE8; -10CA9;OLD HUNGARIAN CAPITAL LETTER ECH;Lu;0;R;;;;;N;;;;10CE9; -10CAA;OLD HUNGARIAN CAPITAL LETTER U;Lu;0;R;;;;;N;;;;10CEA; -10CAB;OLD HUNGARIAN CAPITAL LETTER UU;Lu;0;R;;;;;N;;;;10CEB; -10CAC;OLD HUNGARIAN CAPITAL LETTER NIKOLSBURG UE;Lu;0;R;;;;;N;;;;10CEC; -10CAD;OLD HUNGARIAN CAPITAL LETTER RUDIMENTA UE;Lu;0;R;;;;;N;;;;10CED; -10CAE;OLD HUNGARIAN CAPITAL LETTER EV;Lu;0;R;;;;;N;;;;10CEE; -10CAF;OLD HUNGARIAN CAPITAL LETTER EZ;Lu;0;R;;;;;N;;;;10CEF; -10CB0;OLD HUNGARIAN CAPITAL LETTER EZS;Lu;0;R;;;;;N;;;;10CF0; -10CB1;OLD HUNGARIAN CAPITAL LETTER ENT-SHAPED SIGN;Lu;0;R;;;;;N;;;;10CF1; -10CB2;OLD HUNGARIAN CAPITAL LETTER US;Lu;0;R;;;;;N;;;;10CF2; -10CC0;OLD HUNGARIAN SMALL LETTER A;Ll;0;R;;;;;N;;;10C80;;10C80 -10CC1;OLD HUNGARIAN SMALL LETTER AA;Ll;0;R;;;;;N;;;10C81;;10C81 -10CC2;OLD HUNGARIAN SMALL LETTER EB;Ll;0;R;;;;;N;;;10C82;;10C82 -10CC3;OLD HUNGARIAN SMALL LETTER AMB;Ll;0;R;;;;;N;;;10C83;;10C83 -10CC4;OLD HUNGARIAN SMALL LETTER EC;Ll;0;R;;;;;N;;;10C84;;10C84 -10CC5;OLD HUNGARIAN SMALL LETTER ENC;Ll;0;R;;;;;N;;;10C85;;10C85 -10CC6;OLD HUNGARIAN SMALL LETTER ECS;Ll;0;R;;;;;N;;;10C86;;10C86 -10CC7;OLD HUNGARIAN SMALL LETTER ED;Ll;0;R;;;;;N;;;10C87;;10C87 -10CC8;OLD HUNGARIAN SMALL LETTER AND;Ll;0;R;;;;;N;;;10C88;;10C88 -10CC9;OLD HUNGARIAN SMALL LETTER E;Ll;0;R;;;;;N;;;10C89;;10C89 -10CCA;OLD HUNGARIAN SMALL LETTER CLOSE E;Ll;0;R;;;;;N;;;10C8A;;10C8A -10CCB;OLD HUNGARIAN SMALL LETTER EE;Ll;0;R;;;;;N;;;10C8B;;10C8B -10CCC;OLD HUNGARIAN SMALL LETTER EF;Ll;0;R;;;;;N;;;10C8C;;10C8C -10CCD;OLD HUNGARIAN SMALL LETTER EG;Ll;0;R;;;;;N;;;10C8D;;10C8D -10CCE;OLD HUNGARIAN SMALL LETTER EGY;Ll;0;R;;;;;N;;;10C8E;;10C8E -10CCF;OLD HUNGARIAN SMALL LETTER EH;Ll;0;R;;;;;N;;;10C8F;;10C8F -10CD0;OLD HUNGARIAN SMALL LETTER I;Ll;0;R;;;;;N;;;10C90;;10C90 -10CD1;OLD HUNGARIAN SMALL LETTER II;Ll;0;R;;;;;N;;;10C91;;10C91 -10CD2;OLD HUNGARIAN SMALL LETTER EJ;Ll;0;R;;;;;N;;;10C92;;10C92 -10CD3;OLD HUNGARIAN SMALL LETTER EK;Ll;0;R;;;;;N;;;10C93;;10C93 -10CD4;OLD HUNGARIAN SMALL LETTER AK;Ll;0;R;;;;;N;;;10C94;;10C94 -10CD5;OLD HUNGARIAN SMALL LETTER UNK;Ll;0;R;;;;;N;;;10C95;;10C95 -10CD6;OLD HUNGARIAN SMALL LETTER EL;Ll;0;R;;;;;N;;;10C96;;10C96 -10CD7;OLD HUNGARIAN SMALL LETTER ELY;Ll;0;R;;;;;N;;;10C97;;10C97 -10CD8;OLD HUNGARIAN SMALL LETTER EM;Ll;0;R;;;;;N;;;10C98;;10C98 -10CD9;OLD HUNGARIAN SMALL LETTER EN;Ll;0;R;;;;;N;;;10C99;;10C99 -10CDA;OLD HUNGARIAN SMALL LETTER ENY;Ll;0;R;;;;;N;;;10C9A;;10C9A -10CDB;OLD HUNGARIAN SMALL LETTER O;Ll;0;R;;;;;N;;;10C9B;;10C9B -10CDC;OLD HUNGARIAN SMALL LETTER OO;Ll;0;R;;;;;N;;;10C9C;;10C9C -10CDD;OLD HUNGARIAN SMALL LETTER NIKOLSBURG OE;Ll;0;R;;;;;N;;;10C9D;;10C9D -10CDE;OLD HUNGARIAN SMALL LETTER RUDIMENTA OE;Ll;0;R;;;;;N;;;10C9E;;10C9E -10CDF;OLD HUNGARIAN SMALL LETTER OEE;Ll;0;R;;;;;N;;;10C9F;;10C9F -10CE0;OLD HUNGARIAN SMALL LETTER EP;Ll;0;R;;;;;N;;;10CA0;;10CA0 -10CE1;OLD HUNGARIAN SMALL LETTER EMP;Ll;0;R;;;;;N;;;10CA1;;10CA1 -10CE2;OLD HUNGARIAN SMALL LETTER ER;Ll;0;R;;;;;N;;;10CA2;;10CA2 -10CE3;OLD HUNGARIAN SMALL LETTER SHORT ER;Ll;0;R;;;;;N;;;10CA3;;10CA3 -10CE4;OLD HUNGARIAN SMALL LETTER ES;Ll;0;R;;;;;N;;;10CA4;;10CA4 -10CE5;OLD HUNGARIAN SMALL LETTER ESZ;Ll;0;R;;;;;N;;;10CA5;;10CA5 -10CE6;OLD HUNGARIAN SMALL LETTER ET;Ll;0;R;;;;;N;;;10CA6;;10CA6 -10CE7;OLD HUNGARIAN SMALL LETTER ENT;Ll;0;R;;;;;N;;;10CA7;;10CA7 -10CE8;OLD HUNGARIAN SMALL LETTER ETY;Ll;0;R;;;;;N;;;10CA8;;10CA8 -10CE9;OLD HUNGARIAN SMALL LETTER ECH;Ll;0;R;;;;;N;;;10CA9;;10CA9 -10CEA;OLD HUNGARIAN SMALL LETTER U;Ll;0;R;;;;;N;;;10CAA;;10CAA -10CEB;OLD HUNGARIAN SMALL LETTER UU;Ll;0;R;;;;;N;;;10CAB;;10CAB -10CEC;OLD HUNGARIAN SMALL LETTER NIKOLSBURG UE;Ll;0;R;;;;;N;;;10CAC;;10CAC -10CED;OLD HUNGARIAN SMALL LETTER RUDIMENTA UE;Ll;0;R;;;;;N;;;10CAD;;10CAD -10CEE;OLD HUNGARIAN SMALL LETTER EV;Ll;0;R;;;;;N;;;10CAE;;10CAE -10CEF;OLD HUNGARIAN SMALL LETTER EZ;Ll;0;R;;;;;N;;;10CAF;;10CAF -10CF0;OLD HUNGARIAN SMALL LETTER EZS;Ll;0;R;;;;;N;;;10CB0;;10CB0 -10CF1;OLD HUNGARIAN SMALL LETTER ENT-SHAPED SIGN;Ll;0;R;;;;;N;;;10CB1;;10CB1 -10CF2;OLD HUNGARIAN SMALL LETTER US;Ll;0;R;;;;;N;;;10CB2;;10CB2 -10CFA;OLD HUNGARIAN NUMBER ONE;No;0;R;;;;1;N;;;;; -10CFB;OLD HUNGARIAN NUMBER FIVE;No;0;R;;;;5;N;;;;; -10CFC;OLD HUNGARIAN NUMBER TEN;No;0;R;;;;10;N;;;;; -10CFD;OLD HUNGARIAN NUMBER FIFTY;No;0;R;;;;50;N;;;;; -10CFE;OLD HUNGARIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;; -10CFF;OLD HUNGARIAN NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;; -10E60;RUMI DIGIT ONE;No;0;AN;;;1;1;N;;;;; -10E61;RUMI DIGIT TWO;No;0;AN;;;2;2;N;;;;; -10E62;RUMI DIGIT THREE;No;0;AN;;;3;3;N;;;;; -10E63;RUMI DIGIT FOUR;No;0;AN;;;4;4;N;;;;; -10E64;RUMI DIGIT FIVE;No;0;AN;;;5;5;N;;;;; -10E65;RUMI DIGIT SIX;No;0;AN;;;6;6;N;;;;; -10E66;RUMI DIGIT SEVEN;No;0;AN;;;7;7;N;;;;; -10E67;RUMI DIGIT EIGHT;No;0;AN;;;8;8;N;;;;; -10E68;RUMI DIGIT NINE;No;0;AN;;;9;9;N;;;;; -10E69;RUMI NUMBER TEN;No;0;AN;;;;10;N;;;;; -10E6A;RUMI NUMBER TWENTY;No;0;AN;;;;20;N;;;;; -10E6B;RUMI NUMBER THIRTY;No;0;AN;;;;30;N;;;;; -10E6C;RUMI NUMBER FORTY;No;0;AN;;;;40;N;;;;; -10E6D;RUMI NUMBER FIFTY;No;0;AN;;;;50;N;;;;; -10E6E;RUMI NUMBER SIXTY;No;0;AN;;;;60;N;;;;; -10E6F;RUMI NUMBER SEVENTY;No;0;AN;;;;70;N;;;;; -10E70;RUMI NUMBER EIGHTY;No;0;AN;;;;80;N;;;;; -10E71;RUMI NUMBER NINETY;No;0;AN;;;;90;N;;;;; -10E72;RUMI NUMBER ONE HUNDRED;No;0;AN;;;;100;N;;;;; -10E73;RUMI NUMBER TWO HUNDRED;No;0;AN;;;;200;N;;;;; -10E74;RUMI NUMBER THREE HUNDRED;No;0;AN;;;;300;N;;;;; -10E75;RUMI NUMBER FOUR HUNDRED;No;0;AN;;;;400;N;;;;; -10E76;RUMI NUMBER FIVE HUNDRED;No;0;AN;;;;500;N;;;;; -10E77;RUMI NUMBER SIX HUNDRED;No;0;AN;;;;600;N;;;;; -10E78;RUMI NUMBER SEVEN HUNDRED;No;0;AN;;;;700;N;;;;; -10E79;RUMI NUMBER EIGHT HUNDRED;No;0;AN;;;;800;N;;;;; -10E7A;RUMI NUMBER NINE HUNDRED;No;0;AN;;;;900;N;;;;; -10E7B;RUMI FRACTION ONE HALF;No;0;AN;;;;1/2;N;;;;; -10E7C;RUMI FRACTION ONE QUARTER;No;0;AN;;;;1/4;N;;;;; -10E7D;RUMI FRACTION ONE THIRD;No;0;AN;;;;1/3;N;;;;; -10E7E;RUMI FRACTION TWO THIRDS;No;0;AN;;;;2/3;N;;;;; -11000;BRAHMI SIGN CANDRABINDU;Mc;0;L;;;;;N;;;;; -11001;BRAHMI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11002;BRAHMI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11003;BRAHMI SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -11004;BRAHMI SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -11005;BRAHMI LETTER A;Lo;0;L;;;;;N;;;;; -11006;BRAHMI LETTER AA;Lo;0;L;;;;;N;;;;; -11007;BRAHMI LETTER I;Lo;0;L;;;;;N;;;;; -11008;BRAHMI LETTER II;Lo;0;L;;;;;N;;;;; -11009;BRAHMI LETTER U;Lo;0;L;;;;;N;;;;; -1100A;BRAHMI LETTER UU;Lo;0;L;;;;;N;;;;; -1100B;BRAHMI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1100C;BRAHMI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1100D;BRAHMI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1100E;BRAHMI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1100F;BRAHMI LETTER E;Lo;0;L;;;;;N;;;;; -11010;BRAHMI LETTER AI;Lo;0;L;;;;;N;;;;; -11011;BRAHMI LETTER O;Lo;0;L;;;;;N;;;;; -11012;BRAHMI LETTER AU;Lo;0;L;;;;;N;;;;; -11013;BRAHMI LETTER KA;Lo;0;L;;;;;N;;;;; -11014;BRAHMI LETTER KHA;Lo;0;L;;;;;N;;;;; -11015;BRAHMI LETTER GA;Lo;0;L;;;;;N;;;;; -11016;BRAHMI LETTER GHA;Lo;0;L;;;;;N;;;;; -11017;BRAHMI LETTER NGA;Lo;0;L;;;;;N;;;;; -11018;BRAHMI LETTER CA;Lo;0;L;;;;;N;;;;; -11019;BRAHMI LETTER CHA;Lo;0;L;;;;;N;;;;; -1101A;BRAHMI LETTER JA;Lo;0;L;;;;;N;;;;; -1101B;BRAHMI LETTER JHA;Lo;0;L;;;;;N;;;;; -1101C;BRAHMI LETTER NYA;Lo;0;L;;;;;N;;;;; -1101D;BRAHMI LETTER TTA;Lo;0;L;;;;;N;;;;; -1101E;BRAHMI LETTER TTHA;Lo;0;L;;;;;N;;;;; -1101F;BRAHMI LETTER DDA;Lo;0;L;;;;;N;;;;; -11020;BRAHMI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11021;BRAHMI LETTER NNA;Lo;0;L;;;;;N;;;;; -11022;BRAHMI LETTER TA;Lo;0;L;;;;;N;;;;; -11023;BRAHMI LETTER THA;Lo;0;L;;;;;N;;;;; -11024;BRAHMI LETTER DA;Lo;0;L;;;;;N;;;;; -11025;BRAHMI LETTER DHA;Lo;0;L;;;;;N;;;;; -11026;BRAHMI LETTER NA;Lo;0;L;;;;;N;;;;; -11027;BRAHMI LETTER PA;Lo;0;L;;;;;N;;;;; -11028;BRAHMI LETTER PHA;Lo;0;L;;;;;N;;;;; -11029;BRAHMI LETTER BA;Lo;0;L;;;;;N;;;;; -1102A;BRAHMI LETTER BHA;Lo;0;L;;;;;N;;;;; -1102B;BRAHMI LETTER MA;Lo;0;L;;;;;N;;;;; -1102C;BRAHMI LETTER YA;Lo;0;L;;;;;N;;;;; -1102D;BRAHMI LETTER RA;Lo;0;L;;;;;N;;;;; -1102E;BRAHMI LETTER LA;Lo;0;L;;;;;N;;;;; -1102F;BRAHMI LETTER VA;Lo;0;L;;;;;N;;;;; -11030;BRAHMI LETTER SHA;Lo;0;L;;;;;N;;;;; -11031;BRAHMI LETTER SSA;Lo;0;L;;;;;N;;;;; -11032;BRAHMI LETTER SA;Lo;0;L;;;;;N;;;;; -11033;BRAHMI LETTER HA;Lo;0;L;;;;;N;;;;; -11034;BRAHMI LETTER LLA;Lo;0;L;;;;;N;;;;; -11035;BRAHMI LETTER OLD TAMIL LLLA;Lo;0;L;;;;;N;;;;; -11036;BRAHMI LETTER OLD TAMIL RRA;Lo;0;L;;;;;N;;;;; -11037;BRAHMI LETTER OLD TAMIL NNNA;Lo;0;L;;;;;N;;;;; -11038;BRAHMI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -11039;BRAHMI VOWEL SIGN BHATTIPROLU AA;Mn;0;NSM;;;;;N;;;;; -1103A;BRAHMI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -1103B;BRAHMI VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -1103C;BRAHMI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1103D;BRAHMI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1103E;BRAHMI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -1103F;BRAHMI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -11040;BRAHMI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -11041;BRAHMI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -11042;BRAHMI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -11043;BRAHMI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -11044;BRAHMI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -11045;BRAHMI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -11046;BRAHMI VIRAMA;Mn;9;NSM;;;;;N;;;;; -11047;BRAHMI DANDA;Po;0;L;;;;;N;;;;; -11048;BRAHMI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -11049;BRAHMI PUNCTUATION DOT;Po;0;L;;;;;N;;;;; -1104A;BRAHMI PUNCTUATION DOUBLE DOT;Po;0;L;;;;;N;;;;; -1104B;BRAHMI PUNCTUATION LINE;Po;0;L;;;;;N;;;;; -1104C;BRAHMI PUNCTUATION CRESCENT BAR;Po;0;L;;;;;N;;;;; -1104D;BRAHMI PUNCTUATION LOTUS;Po;0;L;;;;;N;;;;; -11052;BRAHMI NUMBER ONE;No;0;ON;;;1;1;N;;;;; -11053;BRAHMI NUMBER TWO;No;0;ON;;;2;2;N;;;;; -11054;BRAHMI NUMBER THREE;No;0;ON;;;3;3;N;;;;; -11055;BRAHMI NUMBER FOUR;No;0;ON;;;4;4;N;;;;; -11056;BRAHMI NUMBER FIVE;No;0;ON;;;5;5;N;;;;; -11057;BRAHMI NUMBER SIX;No;0;ON;;;6;6;N;;;;; -11058;BRAHMI NUMBER SEVEN;No;0;ON;;;7;7;N;;;;; -11059;BRAHMI NUMBER EIGHT;No;0;ON;;;8;8;N;;;;; -1105A;BRAHMI NUMBER NINE;No;0;ON;;;9;9;N;;;;; -1105B;BRAHMI NUMBER TEN;No;0;ON;;;;10;N;;;;; -1105C;BRAHMI NUMBER TWENTY;No;0;ON;;;;20;N;;;;; -1105D;BRAHMI NUMBER THIRTY;No;0;ON;;;;30;N;;;;; -1105E;BRAHMI NUMBER FORTY;No;0;ON;;;;40;N;;;;; -1105F;BRAHMI NUMBER FIFTY;No;0;ON;;;;50;N;;;;; -11060;BRAHMI NUMBER SIXTY;No;0;ON;;;;60;N;;;;; -11061;BRAHMI NUMBER SEVENTY;No;0;ON;;;;70;N;;;;; -11062;BRAHMI NUMBER EIGHTY;No;0;ON;;;;80;N;;;;; -11063;BRAHMI NUMBER NINETY;No;0;ON;;;;90;N;;;;; -11064;BRAHMI NUMBER ONE HUNDRED;No;0;ON;;;;100;N;;;;; -11065;BRAHMI NUMBER ONE THOUSAND;No;0;ON;;;;1000;N;;;;; -11066;BRAHMI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11067;BRAHMI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11068;BRAHMI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11069;BRAHMI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1106A;BRAHMI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1106B;BRAHMI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1106C;BRAHMI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1106D;BRAHMI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1106E;BRAHMI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1106F;BRAHMI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1107F;BRAHMI NUMBER JOINER;Mn;9;NSM;;;;;N;;;;; -11080;KAITHI SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -11081;KAITHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11082;KAITHI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11083;KAITHI LETTER A;Lo;0;L;;;;;N;;;;; -11084;KAITHI LETTER AA;Lo;0;L;;;;;N;;;;; -11085;KAITHI LETTER I;Lo;0;L;;;;;N;;;;; -11086;KAITHI LETTER II;Lo;0;L;;;;;N;;;;; -11087;KAITHI LETTER U;Lo;0;L;;;;;N;;;;; -11088;KAITHI LETTER UU;Lo;0;L;;;;;N;;;;; -11089;KAITHI LETTER E;Lo;0;L;;;;;N;;;;; -1108A;KAITHI LETTER AI;Lo;0;L;;;;;N;;;;; -1108B;KAITHI LETTER O;Lo;0;L;;;;;N;;;;; -1108C;KAITHI LETTER AU;Lo;0;L;;;;;N;;;;; -1108D;KAITHI LETTER KA;Lo;0;L;;;;;N;;;;; -1108E;KAITHI LETTER KHA;Lo;0;L;;;;;N;;;;; -1108F;KAITHI LETTER GA;Lo;0;L;;;;;N;;;;; -11090;KAITHI LETTER GHA;Lo;0;L;;;;;N;;;;; -11091;KAITHI LETTER NGA;Lo;0;L;;;;;N;;;;; -11092;KAITHI LETTER CA;Lo;0;L;;;;;N;;;;; -11093;KAITHI LETTER CHA;Lo;0;L;;;;;N;;;;; -11094;KAITHI LETTER JA;Lo;0;L;;;;;N;;;;; -11095;KAITHI LETTER JHA;Lo;0;L;;;;;N;;;;; -11096;KAITHI LETTER NYA;Lo;0;L;;;;;N;;;;; -11097;KAITHI LETTER TTA;Lo;0;L;;;;;N;;;;; -11098;KAITHI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11099;KAITHI LETTER DDA;Lo;0;L;;;;;N;;;;; -1109A;KAITHI LETTER DDDHA;Lo;0;L;11099 110BA;;;;N;;;;; -1109B;KAITHI LETTER DDHA;Lo;0;L;;;;;N;;;;; -1109C;KAITHI LETTER RHA;Lo;0;L;1109B 110BA;;;;N;;;;; -1109D;KAITHI LETTER NNA;Lo;0;L;;;;;N;;;;; -1109E;KAITHI LETTER TA;Lo;0;L;;;;;N;;;;; -1109F;KAITHI LETTER THA;Lo;0;L;;;;;N;;;;; -110A0;KAITHI LETTER DA;Lo;0;L;;;;;N;;;;; -110A1;KAITHI LETTER DHA;Lo;0;L;;;;;N;;;;; -110A2;KAITHI LETTER NA;Lo;0;L;;;;;N;;;;; -110A3;KAITHI LETTER PA;Lo;0;L;;;;;N;;;;; -110A4;KAITHI LETTER PHA;Lo;0;L;;;;;N;;;;; -110A5;KAITHI LETTER BA;Lo;0;L;;;;;N;;;;; -110A6;KAITHI LETTER BHA;Lo;0;L;;;;;N;;;;; -110A7;KAITHI LETTER MA;Lo;0;L;;;;;N;;;;; -110A8;KAITHI LETTER YA;Lo;0;L;;;;;N;;;;; -110A9;KAITHI LETTER RA;Lo;0;L;;;;;N;;;;; -110AA;KAITHI LETTER LA;Lo;0;L;;;;;N;;;;; -110AB;KAITHI LETTER VA;Lo;0;L;110A5 110BA;;;;N;;;;; -110AC;KAITHI LETTER SHA;Lo;0;L;;;;;N;;;;; -110AD;KAITHI LETTER SSA;Lo;0;L;;;;;N;;;;; -110AE;KAITHI LETTER SA;Lo;0;L;;;;;N;;;;; -110AF;KAITHI LETTER HA;Lo;0;L;;;;;N;;;;; -110B0;KAITHI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -110B1;KAITHI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -110B2;KAITHI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -110B3;KAITHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -110B4;KAITHI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -110B5;KAITHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -110B6;KAITHI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -110B7;KAITHI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -110B8;KAITHI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -110B9;KAITHI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -110BA;KAITHI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -110BB;KAITHI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -110BC;KAITHI ENUMERATION SIGN;Po;0;L;;;;;N;;;;; -110BD;KAITHI NUMBER SIGN;Cf;0;L;;;;;N;;;;; -110BE;KAITHI SECTION MARK;Po;0;L;;;;;N;;;;; -110BF;KAITHI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; -110C0;KAITHI DANDA;Po;0;L;;;;;N;;;;; -110C1;KAITHI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -110D0;SORA SOMPENG LETTER SAH;Lo;0;L;;;;;N;;;;; -110D1;SORA SOMPENG LETTER TAH;Lo;0;L;;;;;N;;;;; -110D2;SORA SOMPENG LETTER BAH;Lo;0;L;;;;;N;;;;; -110D3;SORA SOMPENG LETTER CAH;Lo;0;L;;;;;N;;;;; -110D4;SORA SOMPENG LETTER DAH;Lo;0;L;;;;;N;;;;; -110D5;SORA SOMPENG LETTER GAH;Lo;0;L;;;;;N;;;;; -110D6;SORA SOMPENG LETTER MAH;Lo;0;L;;;;;N;;;;; -110D7;SORA SOMPENG LETTER NGAH;Lo;0;L;;;;;N;;;;; -110D8;SORA SOMPENG LETTER LAH;Lo;0;L;;;;;N;;;;; -110D9;SORA SOMPENG LETTER NAH;Lo;0;L;;;;;N;;;;; -110DA;SORA SOMPENG LETTER VAH;Lo;0;L;;;;;N;;;;; -110DB;SORA SOMPENG LETTER PAH;Lo;0;L;;;;;N;;;;; -110DC;SORA SOMPENG LETTER YAH;Lo;0;L;;;;;N;;;;; -110DD;SORA SOMPENG LETTER RAH;Lo;0;L;;;;;N;;;;; -110DE;SORA SOMPENG LETTER HAH;Lo;0;L;;;;;N;;;;; -110DF;SORA SOMPENG LETTER KAH;Lo;0;L;;;;;N;;;;; -110E0;SORA SOMPENG LETTER JAH;Lo;0;L;;;;;N;;;;; -110E1;SORA SOMPENG LETTER NYAH;Lo;0;L;;;;;N;;;;; -110E2;SORA SOMPENG LETTER AH;Lo;0;L;;;;;N;;;;; -110E3;SORA SOMPENG LETTER EEH;Lo;0;L;;;;;N;;;;; -110E4;SORA SOMPENG LETTER IH;Lo;0;L;;;;;N;;;;; -110E5;SORA SOMPENG LETTER UH;Lo;0;L;;;;;N;;;;; -110E6;SORA SOMPENG LETTER OH;Lo;0;L;;;;;N;;;;; -110E7;SORA SOMPENG LETTER EH;Lo;0;L;;;;;N;;;;; -110E8;SORA SOMPENG LETTER MAE;Lo;0;L;;;;;N;;;;; -110F0;SORA SOMPENG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -110F1;SORA SOMPENG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -110F2;SORA SOMPENG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -110F3;SORA SOMPENG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -110F4;SORA SOMPENG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -110F5;SORA SOMPENG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -110F6;SORA SOMPENG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -110F7;SORA SOMPENG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -110F8;SORA SOMPENG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -110F9;SORA SOMPENG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11100;CHAKMA SIGN CANDRABINDU;Mn;230;NSM;;;;;N;;;;; -11101;CHAKMA SIGN ANUSVARA;Mn;230;NSM;;;;;N;;;;; -11102;CHAKMA SIGN VISARGA;Mn;230;NSM;;;;;N;;;;; -11103;CHAKMA LETTER AA;Lo;0;L;;;;;N;;;;; -11104;CHAKMA LETTER I;Lo;0;L;;;;;N;;;;; -11105;CHAKMA LETTER U;Lo;0;L;;;;;N;;;;; -11106;CHAKMA LETTER E;Lo;0;L;;;;;N;;;;; -11107;CHAKMA LETTER KAA;Lo;0;L;;;;;N;;;;; -11108;CHAKMA LETTER KHAA;Lo;0;L;;;;;N;;;;; -11109;CHAKMA LETTER GAA;Lo;0;L;;;;;N;;;;; -1110A;CHAKMA LETTER GHAA;Lo;0;L;;;;;N;;;;; -1110B;CHAKMA LETTER NGAA;Lo;0;L;;;;;N;;;;; -1110C;CHAKMA LETTER CAA;Lo;0;L;;;;;N;;;;; -1110D;CHAKMA LETTER CHAA;Lo;0;L;;;;;N;;;;; -1110E;CHAKMA LETTER JAA;Lo;0;L;;;;;N;;;;; -1110F;CHAKMA LETTER JHAA;Lo;0;L;;;;;N;;;;; -11110;CHAKMA LETTER NYAA;Lo;0;L;;;;;N;;;;; -11111;CHAKMA LETTER TTAA;Lo;0;L;;;;;N;;;;; -11112;CHAKMA LETTER TTHAA;Lo;0;L;;;;;N;;;;; -11113;CHAKMA LETTER DDAA;Lo;0;L;;;;;N;;;;; -11114;CHAKMA LETTER DDHAA;Lo;0;L;;;;;N;;;;; -11115;CHAKMA LETTER NNAA;Lo;0;L;;;;;N;;;;; -11116;CHAKMA LETTER TAA;Lo;0;L;;;;;N;;;;; -11117;CHAKMA LETTER THAA;Lo;0;L;;;;;N;;;;; -11118;CHAKMA LETTER DAA;Lo;0;L;;;;;N;;;;; -11119;CHAKMA LETTER DHAA;Lo;0;L;;;;;N;;;;; -1111A;CHAKMA LETTER NAA;Lo;0;L;;;;;N;;;;; -1111B;CHAKMA LETTER PAA;Lo;0;L;;;;;N;;;;; -1111C;CHAKMA LETTER PHAA;Lo;0;L;;;;;N;;;;; -1111D;CHAKMA LETTER BAA;Lo;0;L;;;;;N;;;;; -1111E;CHAKMA LETTER BHAA;Lo;0;L;;;;;N;;;;; -1111F;CHAKMA LETTER MAA;Lo;0;L;;;;;N;;;;; -11120;CHAKMA LETTER YYAA;Lo;0;L;;;;;N;;;;; -11121;CHAKMA LETTER YAA;Lo;0;L;;;;;N;;;;; -11122;CHAKMA LETTER RAA;Lo;0;L;;;;;N;;;;; -11123;CHAKMA LETTER LAA;Lo;0;L;;;;;N;;;;; -11124;CHAKMA LETTER WAA;Lo;0;L;;;;;N;;;;; -11125;CHAKMA LETTER SAA;Lo;0;L;;;;;N;;;;; -11126;CHAKMA LETTER HAA;Lo;0;L;;;;;N;;;;; -11127;CHAKMA VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;; -11128;CHAKMA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -11129;CHAKMA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -1112A;CHAKMA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -1112B;CHAKMA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -1112C;CHAKMA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -1112D;CHAKMA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1112E;CHAKMA VOWEL SIGN O;Mn;0;NSM;11131 11127;;;;N;;;;; -1112F;CHAKMA VOWEL SIGN AU;Mn;0;NSM;11132 11127;;;;N;;;;; -11130;CHAKMA VOWEL SIGN OI;Mn;0;NSM;;;;;N;;;;; -11131;CHAKMA O MARK;Mn;0;NSM;;;;;N;;;;; -11132;CHAKMA AU MARK;Mn;0;NSM;;;;;N;;;;; -11133;CHAKMA VIRAMA;Mn;9;NSM;;;;;N;;;;; -11134;CHAKMA MAAYYAA;Mn;9;NSM;;;;;N;;;;; -11136;CHAKMA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11137;CHAKMA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11138;CHAKMA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11139;CHAKMA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -1113A;CHAKMA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -1113B;CHAKMA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -1113C;CHAKMA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -1113D;CHAKMA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -1113E;CHAKMA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -1113F;CHAKMA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11140;CHAKMA SECTION MARK;Po;0;L;;;;;N;;;;; -11141;CHAKMA DANDA;Po;0;L;;;;;N;;;;; -11142;CHAKMA DOUBLE DANDA;Po;0;L;;;;;N;;;;; -11143;CHAKMA QUESTION MARK;Po;0;L;;;;;N;;;;; -11150;MAHAJANI LETTER A;Lo;0;L;;;;;N;;;;; -11151;MAHAJANI LETTER I;Lo;0;L;;;;;N;;;;; -11152;MAHAJANI LETTER U;Lo;0;L;;;;;N;;;;; -11153;MAHAJANI LETTER E;Lo;0;L;;;;;N;;;;; -11154;MAHAJANI LETTER O;Lo;0;L;;;;;N;;;;; -11155;MAHAJANI LETTER KA;Lo;0;L;;;;;N;;;;; -11156;MAHAJANI LETTER KHA;Lo;0;L;;;;;N;;;;; -11157;MAHAJANI LETTER GA;Lo;0;L;;;;;N;;;;; -11158;MAHAJANI LETTER GHA;Lo;0;L;;;;;N;;;;; -11159;MAHAJANI LETTER CA;Lo;0;L;;;;;N;;;;; -1115A;MAHAJANI LETTER CHA;Lo;0;L;;;;;N;;;;; -1115B;MAHAJANI LETTER JA;Lo;0;L;;;;;N;;;;; -1115C;MAHAJANI LETTER JHA;Lo;0;L;;;;;N;;;;; -1115D;MAHAJANI LETTER NYA;Lo;0;L;;;;;N;;;;; -1115E;MAHAJANI LETTER TTA;Lo;0;L;;;;;N;;;;; -1115F;MAHAJANI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11160;MAHAJANI LETTER DDA;Lo;0;L;;;;;N;;;;; -11161;MAHAJANI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11162;MAHAJANI LETTER NNA;Lo;0;L;;;;;N;;;;; -11163;MAHAJANI LETTER TA;Lo;0;L;;;;;N;;;;; -11164;MAHAJANI LETTER THA;Lo;0;L;;;;;N;;;;; -11165;MAHAJANI LETTER DA;Lo;0;L;;;;;N;;;;; -11166;MAHAJANI LETTER DHA;Lo;0;L;;;;;N;;;;; -11167;MAHAJANI LETTER NA;Lo;0;L;;;;;N;;;;; -11168;MAHAJANI LETTER PA;Lo;0;L;;;;;N;;;;; -11169;MAHAJANI LETTER PHA;Lo;0;L;;;;;N;;;;; -1116A;MAHAJANI LETTER BA;Lo;0;L;;;;;N;;;;; -1116B;MAHAJANI LETTER BHA;Lo;0;L;;;;;N;;;;; -1116C;MAHAJANI LETTER MA;Lo;0;L;;;;;N;;;;; -1116D;MAHAJANI LETTER RA;Lo;0;L;;;;;N;;;;; -1116E;MAHAJANI LETTER LA;Lo;0;L;;;;;N;;;;; -1116F;MAHAJANI LETTER VA;Lo;0;L;;;;;N;;;;; -11170;MAHAJANI LETTER SA;Lo;0;L;;;;;N;;;;; -11171;MAHAJANI LETTER HA;Lo;0;L;;;;;N;;;;; -11172;MAHAJANI LETTER RRA;Lo;0;L;;;;;N;;;;; -11173;MAHAJANI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -11174;MAHAJANI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -11175;MAHAJANI SECTION MARK;Po;0;L;;;;;N;;;;; -11176;MAHAJANI LIGATURE SHRI;Lo;0;L;;;;;N;;;;; -11180;SHARADA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -11181;SHARADA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11182;SHARADA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11183;SHARADA LETTER A;Lo;0;L;;;;;N;;;;; -11184;SHARADA LETTER AA;Lo;0;L;;;;;N;;;;; -11185;SHARADA LETTER I;Lo;0;L;;;;;N;;;;; -11186;SHARADA LETTER II;Lo;0;L;;;;;N;;;;; -11187;SHARADA LETTER U;Lo;0;L;;;;;N;;;;; -11188;SHARADA LETTER UU;Lo;0;L;;;;;N;;;;; -11189;SHARADA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1118A;SHARADA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -1118B;SHARADA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1118C;SHARADA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1118D;SHARADA LETTER E;Lo;0;L;;;;;N;;;;; -1118E;SHARADA LETTER AI;Lo;0;L;;;;;N;;;;; -1118F;SHARADA LETTER O;Lo;0;L;;;;;N;;;;; -11190;SHARADA LETTER AU;Lo;0;L;;;;;N;;;;; -11191;SHARADA LETTER KA;Lo;0;L;;;;;N;;;;; -11192;SHARADA LETTER KHA;Lo;0;L;;;;;N;;;;; -11193;SHARADA LETTER GA;Lo;0;L;;;;;N;;;;; -11194;SHARADA LETTER GHA;Lo;0;L;;;;;N;;;;; -11195;SHARADA LETTER NGA;Lo;0;L;;;;;N;;;;; -11196;SHARADA LETTER CA;Lo;0;L;;;;;N;;;;; -11197;SHARADA LETTER CHA;Lo;0;L;;;;;N;;;;; -11198;SHARADA LETTER JA;Lo;0;L;;;;;N;;;;; -11199;SHARADA LETTER JHA;Lo;0;L;;;;;N;;;;; -1119A;SHARADA LETTER NYA;Lo;0;L;;;;;N;;;;; -1119B;SHARADA LETTER TTA;Lo;0;L;;;;;N;;;;; -1119C;SHARADA LETTER TTHA;Lo;0;L;;;;;N;;;;; -1119D;SHARADA LETTER DDA;Lo;0;L;;;;;N;;;;; -1119E;SHARADA LETTER DDHA;Lo;0;L;;;;;N;;;;; -1119F;SHARADA LETTER NNA;Lo;0;L;;;;;N;;;;; -111A0;SHARADA LETTER TA;Lo;0;L;;;;;N;;;;; -111A1;SHARADA LETTER THA;Lo;0;L;;;;;N;;;;; -111A2;SHARADA LETTER DA;Lo;0;L;;;;;N;;;;; -111A3;SHARADA LETTER DHA;Lo;0;L;;;;;N;;;;; -111A4;SHARADA LETTER NA;Lo;0;L;;;;;N;;;;; -111A5;SHARADA LETTER PA;Lo;0;L;;;;;N;;;;; -111A6;SHARADA LETTER PHA;Lo;0;L;;;;;N;;;;; -111A7;SHARADA LETTER BA;Lo;0;L;;;;;N;;;;; -111A8;SHARADA LETTER BHA;Lo;0;L;;;;;N;;;;; -111A9;SHARADA LETTER MA;Lo;0;L;;;;;N;;;;; -111AA;SHARADA LETTER YA;Lo;0;L;;;;;N;;;;; -111AB;SHARADA LETTER RA;Lo;0;L;;;;;N;;;;; -111AC;SHARADA LETTER LA;Lo;0;L;;;;;N;;;;; -111AD;SHARADA LETTER LLA;Lo;0;L;;;;;N;;;;; -111AE;SHARADA LETTER VA;Lo;0;L;;;;;N;;;;; -111AF;SHARADA LETTER SHA;Lo;0;L;;;;;N;;;;; -111B0;SHARADA LETTER SSA;Lo;0;L;;;;;N;;;;; -111B1;SHARADA LETTER SA;Lo;0;L;;;;;N;;;;; -111B2;SHARADA LETTER HA;Lo;0;L;;;;;N;;;;; -111B3;SHARADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -111B4;SHARADA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -111B5;SHARADA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -111B6;SHARADA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -111B7;SHARADA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -111B8;SHARADA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -111B9;SHARADA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -111BA;SHARADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -111BB;SHARADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -111BC;SHARADA VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -111BD;SHARADA VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -111BE;SHARADA VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -111BF;SHARADA VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -111C0;SHARADA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -111C1;SHARADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -111C2;SHARADA SIGN JIHVAMULIYA;Lo;0;L;;;;;N;;;;; -111C3;SHARADA SIGN UPADHMANIYA;Lo;0;L;;;;;N;;;;; -111C4;SHARADA OM;Lo;0;L;;;;;N;;;;; -111C5;SHARADA DANDA;Po;0;L;;;;;N;;;;; -111C6;SHARADA DOUBLE DANDA;Po;0;L;;;;;N;;;;; -111C7;SHARADA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -111C8;SHARADA SEPARATOR;Po;0;L;;;;;N;;;;; -111C9;SHARADA SANDHI MARK;Po;0;L;;;;;N;;;;; -111CA;SHARADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -111CB;SHARADA VOWEL MODIFIER MARK;Mn;0;NSM;;;;;N;;;;; -111CC;SHARADA EXTRA SHORT VOWEL MARK;Mn;0;NSM;;;;;N;;;;; -111CD;SHARADA SUTRA MARK;Po;0;L;;;;;N;;;;; -111D0;SHARADA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -111D1;SHARADA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -111D2;SHARADA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -111D3;SHARADA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -111D4;SHARADA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -111D5;SHARADA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -111D6;SHARADA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -111D7;SHARADA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -111D8;SHARADA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -111D9;SHARADA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -111DA;SHARADA EKAM;Lo;0;L;;;;;N;;;;; -111DB;SHARADA SIGN SIDDHAM;Po;0;L;;;;;N;;;;; -111DC;SHARADA HEADSTROKE;Lo;0;L;;;;;N;;;;; -111DD;SHARADA CONTINUATION SIGN;Po;0;L;;;;;N;;;;; -111DE;SHARADA SECTION MARK-1;Po;0;L;;;;;N;;;;; -111DF;SHARADA SECTION MARK-2;Po;0;L;;;;;N;;;;; -111E1;SINHALA ARCHAIC DIGIT ONE;No;0;L;;;;1;N;;;;; -111E2;SINHALA ARCHAIC DIGIT TWO;No;0;L;;;;2;N;;;;; -111E3;SINHALA ARCHAIC DIGIT THREE;No;0;L;;;;3;N;;;;; -111E4;SINHALA ARCHAIC DIGIT FOUR;No;0;L;;;;4;N;;;;; -111E5;SINHALA ARCHAIC DIGIT FIVE;No;0;L;;;;5;N;;;;; -111E6;SINHALA ARCHAIC DIGIT SIX;No;0;L;;;;6;N;;;;; -111E7;SINHALA ARCHAIC DIGIT SEVEN;No;0;L;;;;7;N;;;;; -111E8;SINHALA ARCHAIC DIGIT EIGHT;No;0;L;;;;8;N;;;;; -111E9;SINHALA ARCHAIC DIGIT NINE;No;0;L;;;;9;N;;;;; -111EA;SINHALA ARCHAIC NUMBER TEN;No;0;L;;;;10;N;;;;; -111EB;SINHALA ARCHAIC NUMBER TWENTY;No;0;L;;;;20;N;;;;; -111EC;SINHALA ARCHAIC NUMBER THIRTY;No;0;L;;;;30;N;;;;; -111ED;SINHALA ARCHAIC NUMBER FORTY;No;0;L;;;;40;N;;;;; -111EE;SINHALA ARCHAIC NUMBER FIFTY;No;0;L;;;;50;N;;;;; -111EF;SINHALA ARCHAIC NUMBER SIXTY;No;0;L;;;;60;N;;;;; -111F0;SINHALA ARCHAIC NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -111F1;SINHALA ARCHAIC NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -111F2;SINHALA ARCHAIC NUMBER NINETY;No;0;L;;;;90;N;;;;; -111F3;SINHALA ARCHAIC NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;; -111F4;SINHALA ARCHAIC NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;; -11200;KHOJKI LETTER A;Lo;0;L;;;;;N;;;;; -11201;KHOJKI LETTER AA;Lo;0;L;;;;;N;;;;; -11202;KHOJKI LETTER I;Lo;0;L;;;;;N;;;;; -11203;KHOJKI LETTER U;Lo;0;L;;;;;N;;;;; -11204;KHOJKI LETTER E;Lo;0;L;;;;;N;;;;; -11205;KHOJKI LETTER AI;Lo;0;L;;;;;N;;;;; -11206;KHOJKI LETTER O;Lo;0;L;;;;;N;;;;; -11207;KHOJKI LETTER AU;Lo;0;L;;;;;N;;;;; -11208;KHOJKI LETTER KA;Lo;0;L;;;;;N;;;;; -11209;KHOJKI LETTER KHA;Lo;0;L;;;;;N;;;;; -1120A;KHOJKI LETTER GA;Lo;0;L;;;;;N;;;;; -1120B;KHOJKI LETTER GGA;Lo;0;L;;;;;N;;;;; -1120C;KHOJKI LETTER GHA;Lo;0;L;;;;;N;;;;; -1120D;KHOJKI LETTER NGA;Lo;0;L;;;;;N;;;;; -1120E;KHOJKI LETTER CA;Lo;0;L;;;;;N;;;;; -1120F;KHOJKI LETTER CHA;Lo;0;L;;;;;N;;;;; -11210;KHOJKI LETTER JA;Lo;0;L;;;;;N;;;;; -11211;KHOJKI LETTER JJA;Lo;0;L;;;;;N;;;;; -11213;KHOJKI LETTER NYA;Lo;0;L;;;;;N;;;;; -11214;KHOJKI LETTER TTA;Lo;0;L;;;;;N;;;;; -11215;KHOJKI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11216;KHOJKI LETTER DDA;Lo;0;L;;;;;N;;;;; -11217;KHOJKI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11218;KHOJKI LETTER NNA;Lo;0;L;;;;;N;;;;; -11219;KHOJKI LETTER TA;Lo;0;L;;;;;N;;;;; -1121A;KHOJKI LETTER THA;Lo;0;L;;;;;N;;;;; -1121B;KHOJKI LETTER DA;Lo;0;L;;;;;N;;;;; -1121C;KHOJKI LETTER DDDA;Lo;0;L;;;;;N;;;;; -1121D;KHOJKI LETTER DHA;Lo;0;L;;;;;N;;;;; -1121E;KHOJKI LETTER NA;Lo;0;L;;;;;N;;;;; -1121F;KHOJKI LETTER PA;Lo;0;L;;;;;N;;;;; -11220;KHOJKI LETTER PHA;Lo;0;L;;;;;N;;;;; -11221;KHOJKI LETTER BA;Lo;0;L;;;;;N;;;;; -11222;KHOJKI LETTER BBA;Lo;0;L;;;;;N;;;;; -11223;KHOJKI LETTER BHA;Lo;0;L;;;;;N;;;;; -11224;KHOJKI LETTER MA;Lo;0;L;;;;;N;;;;; -11225;KHOJKI LETTER YA;Lo;0;L;;;;;N;;;;; -11226;KHOJKI LETTER RA;Lo;0;L;;;;;N;;;;; -11227;KHOJKI LETTER LA;Lo;0;L;;;;;N;;;;; -11228;KHOJKI LETTER VA;Lo;0;L;;;;;N;;;;; -11229;KHOJKI LETTER SA;Lo;0;L;;;;;N;;;;; -1122A;KHOJKI LETTER HA;Lo;0;L;;;;;N;;;;; -1122B;KHOJKI LETTER LLA;Lo;0;L;;;;;N;;;;; -1122C;KHOJKI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1122D;KHOJKI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -1122E;KHOJKI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -1122F;KHOJKI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -11230;KHOJKI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -11231;KHOJKI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -11232;KHOJKI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -11233;KHOJKI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -11234;KHOJKI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -11235;KHOJKI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -11236;KHOJKI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -11237;KHOJKI SIGN SHADDA;Mn;0;NSM;;;;;N;;;;; -11238;KHOJKI DANDA;Po;0;L;;;;;N;;;;; -11239;KHOJKI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -1123A;KHOJKI WORD SEPARATOR;Po;0;L;;;;;N;;;;; -1123B;KHOJKI SECTION MARK;Po;0;L;;;;;N;;;;; -1123C;KHOJKI DOUBLE SECTION MARK;Po;0;L;;;;;N;;;;; -1123D;KHOJKI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -11280;MULTANI LETTER A;Lo;0;L;;;;;N;;;;; -11281;MULTANI LETTER I;Lo;0;L;;;;;N;;;;; -11282;MULTANI LETTER U;Lo;0;L;;;;;N;;;;; -11283;MULTANI LETTER E;Lo;0;L;;;;;N;;;;; -11284;MULTANI LETTER KA;Lo;0;L;;;;;N;;;;; -11285;MULTANI LETTER KHA;Lo;0;L;;;;;N;;;;; -11286;MULTANI LETTER GA;Lo;0;L;;;;;N;;;;; -11288;MULTANI LETTER GHA;Lo;0;L;;;;;N;;;;; -1128A;MULTANI LETTER CA;Lo;0;L;;;;;N;;;;; -1128B;MULTANI LETTER CHA;Lo;0;L;;;;;N;;;;; -1128C;MULTANI LETTER JA;Lo;0;L;;;;;N;;;;; -1128D;MULTANI LETTER JJA;Lo;0;L;;;;;N;;;;; -1128F;MULTANI LETTER NYA;Lo;0;L;;;;;N;;;;; -11290;MULTANI LETTER TTA;Lo;0;L;;;;;N;;;;; -11291;MULTANI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11292;MULTANI LETTER DDA;Lo;0;L;;;;;N;;;;; -11293;MULTANI LETTER DDDA;Lo;0;L;;;;;N;;;;; -11294;MULTANI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11295;MULTANI LETTER NNA;Lo;0;L;;;;;N;;;;; -11296;MULTANI LETTER TA;Lo;0;L;;;;;N;;;;; -11297;MULTANI LETTER THA;Lo;0;L;;;;;N;;;;; -11298;MULTANI LETTER DA;Lo;0;L;;;;;N;;;;; -11299;MULTANI LETTER DHA;Lo;0;L;;;;;N;;;;; -1129A;MULTANI LETTER NA;Lo;0;L;;;;;N;;;;; -1129B;MULTANI LETTER PA;Lo;0;L;;;;;N;;;;; -1129C;MULTANI LETTER PHA;Lo;0;L;;;;;N;;;;; -1129D;MULTANI LETTER BA;Lo;0;L;;;;;N;;;;; -1129F;MULTANI LETTER BHA;Lo;0;L;;;;;N;;;;; -112A0;MULTANI LETTER MA;Lo;0;L;;;;;N;;;;; -112A1;MULTANI LETTER YA;Lo;0;L;;;;;N;;;;; -112A2;MULTANI LETTER RA;Lo;0;L;;;;;N;;;;; -112A3;MULTANI LETTER LA;Lo;0;L;;;;;N;;;;; -112A4;MULTANI LETTER VA;Lo;0;L;;;;;N;;;;; -112A5;MULTANI LETTER SA;Lo;0;L;;;;;N;;;;; -112A6;MULTANI LETTER HA;Lo;0;L;;;;;N;;;;; -112A7;MULTANI LETTER RRA;Lo;0;L;;;;;N;;;;; -112A8;MULTANI LETTER RHA;Lo;0;L;;;;;N;;;;; -112A9;MULTANI SECTION MARK;Po;0;L;;;;;N;;;;; -112B0;KHUDAWADI LETTER A;Lo;0;L;;;;;N;;;;; -112B1;KHUDAWADI LETTER AA;Lo;0;L;;;;;N;;;;; -112B2;KHUDAWADI LETTER I;Lo;0;L;;;;;N;;;;; -112B3;KHUDAWADI LETTER II;Lo;0;L;;;;;N;;;;; -112B4;KHUDAWADI LETTER U;Lo;0;L;;;;;N;;;;; -112B5;KHUDAWADI LETTER UU;Lo;0;L;;;;;N;;;;; -112B6;KHUDAWADI LETTER E;Lo;0;L;;;;;N;;;;; -112B7;KHUDAWADI LETTER AI;Lo;0;L;;;;;N;;;;; -112B8;KHUDAWADI LETTER O;Lo;0;L;;;;;N;;;;; -112B9;KHUDAWADI LETTER AU;Lo;0;L;;;;;N;;;;; -112BA;KHUDAWADI LETTER KA;Lo;0;L;;;;;N;;;;; -112BB;KHUDAWADI LETTER KHA;Lo;0;L;;;;;N;;;;; -112BC;KHUDAWADI LETTER GA;Lo;0;L;;;;;N;;;;; -112BD;KHUDAWADI LETTER GGA;Lo;0;L;;;;;N;;;;; -112BE;KHUDAWADI LETTER GHA;Lo;0;L;;;;;N;;;;; -112BF;KHUDAWADI LETTER NGA;Lo;0;L;;;;;N;;;;; -112C0;KHUDAWADI LETTER CA;Lo;0;L;;;;;N;;;;; -112C1;KHUDAWADI LETTER CHA;Lo;0;L;;;;;N;;;;; -112C2;KHUDAWADI LETTER JA;Lo;0;L;;;;;N;;;;; -112C3;KHUDAWADI LETTER JJA;Lo;0;L;;;;;N;;;;; -112C4;KHUDAWADI LETTER JHA;Lo;0;L;;;;;N;;;;; -112C5;KHUDAWADI LETTER NYA;Lo;0;L;;;;;N;;;;; -112C6;KHUDAWADI LETTER TTA;Lo;0;L;;;;;N;;;;; -112C7;KHUDAWADI LETTER TTHA;Lo;0;L;;;;;N;;;;; -112C8;KHUDAWADI LETTER DDA;Lo;0;L;;;;;N;;;;; -112C9;KHUDAWADI LETTER DDDA;Lo;0;L;;;;;N;;;;; -112CA;KHUDAWADI LETTER RRA;Lo;0;L;;;;;N;;;;; -112CB;KHUDAWADI LETTER DDHA;Lo;0;L;;;;;N;;;;; -112CC;KHUDAWADI LETTER NNA;Lo;0;L;;;;;N;;;;; -112CD;KHUDAWADI LETTER TA;Lo;0;L;;;;;N;;;;; -112CE;KHUDAWADI LETTER THA;Lo;0;L;;;;;N;;;;; -112CF;KHUDAWADI LETTER DA;Lo;0;L;;;;;N;;;;; -112D0;KHUDAWADI LETTER DHA;Lo;0;L;;;;;N;;;;; -112D1;KHUDAWADI LETTER NA;Lo;0;L;;;;;N;;;;; -112D2;KHUDAWADI LETTER PA;Lo;0;L;;;;;N;;;;; -112D3;KHUDAWADI LETTER PHA;Lo;0;L;;;;;N;;;;; -112D4;KHUDAWADI LETTER BA;Lo;0;L;;;;;N;;;;; -112D5;KHUDAWADI LETTER BBA;Lo;0;L;;;;;N;;;;; -112D6;KHUDAWADI LETTER BHA;Lo;0;L;;;;;N;;;;; -112D7;KHUDAWADI LETTER MA;Lo;0;L;;;;;N;;;;; -112D8;KHUDAWADI LETTER YA;Lo;0;L;;;;;N;;;;; -112D9;KHUDAWADI LETTER RA;Lo;0;L;;;;;N;;;;; -112DA;KHUDAWADI LETTER LA;Lo;0;L;;;;;N;;;;; -112DB;KHUDAWADI LETTER VA;Lo;0;L;;;;;N;;;;; -112DC;KHUDAWADI LETTER SHA;Lo;0;L;;;;;N;;;;; -112DD;KHUDAWADI LETTER SA;Lo;0;L;;;;;N;;;;; -112DE;KHUDAWADI LETTER HA;Lo;0;L;;;;;N;;;;; -112DF;KHUDAWADI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -112E0;KHUDAWADI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -112E1;KHUDAWADI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -112E2;KHUDAWADI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -112E3;KHUDAWADI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -112E4;KHUDAWADI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -112E5;KHUDAWADI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -112E6;KHUDAWADI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -112E7;KHUDAWADI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -112E8;KHUDAWADI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -112E9;KHUDAWADI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -112EA;KHUDAWADI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -112F0;KHUDAWADI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -112F1;KHUDAWADI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -112F2;KHUDAWADI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -112F3;KHUDAWADI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -112F4;KHUDAWADI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -112F5;KHUDAWADI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -112F6;KHUDAWADI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -112F7;KHUDAWADI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -112F8;KHUDAWADI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -112F9;KHUDAWADI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11300;GRANTHA SIGN COMBINING ANUSVARA ABOVE;Mn;0;NSM;;;;;N;;;;; -11301;GRANTHA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -11302;GRANTHA SIGN ANUSVARA;Mc;0;L;;;;;N;;;;; -11303;GRANTHA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -11305;GRANTHA LETTER A;Lo;0;L;;;;;N;;;;; -11306;GRANTHA LETTER AA;Lo;0;L;;;;;N;;;;; -11307;GRANTHA LETTER I;Lo;0;L;;;;;N;;;;; -11308;GRANTHA LETTER II;Lo;0;L;;;;;N;;;;; -11309;GRANTHA LETTER U;Lo;0;L;;;;;N;;;;; -1130A;GRANTHA LETTER UU;Lo;0;L;;;;;N;;;;; -1130B;GRANTHA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -1130C;GRANTHA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1130F;GRANTHA LETTER EE;Lo;0;L;;;;;N;;;;; -11310;GRANTHA LETTER AI;Lo;0;L;;;;;N;;;;; -11313;GRANTHA LETTER OO;Lo;0;L;;;;;N;;;;; -11314;GRANTHA LETTER AU;Lo;0;L;;;;;N;;;;; -11315;GRANTHA LETTER KA;Lo;0;L;;;;;N;;;;; -11316;GRANTHA LETTER KHA;Lo;0;L;;;;;N;;;;; -11317;GRANTHA LETTER GA;Lo;0;L;;;;;N;;;;; -11318;GRANTHA LETTER GHA;Lo;0;L;;;;;N;;;;; -11319;GRANTHA LETTER NGA;Lo;0;L;;;;;N;;;;; -1131A;GRANTHA LETTER CA;Lo;0;L;;;;;N;;;;; -1131B;GRANTHA LETTER CHA;Lo;0;L;;;;;N;;;;; -1131C;GRANTHA LETTER JA;Lo;0;L;;;;;N;;;;; -1131D;GRANTHA LETTER JHA;Lo;0;L;;;;;N;;;;; -1131E;GRANTHA LETTER NYA;Lo;0;L;;;;;N;;;;; -1131F;GRANTHA LETTER TTA;Lo;0;L;;;;;N;;;;; -11320;GRANTHA LETTER TTHA;Lo;0;L;;;;;N;;;;; -11321;GRANTHA LETTER DDA;Lo;0;L;;;;;N;;;;; -11322;GRANTHA LETTER DDHA;Lo;0;L;;;;;N;;;;; -11323;GRANTHA LETTER NNA;Lo;0;L;;;;;N;;;;; -11324;GRANTHA LETTER TA;Lo;0;L;;;;;N;;;;; -11325;GRANTHA LETTER THA;Lo;0;L;;;;;N;;;;; -11326;GRANTHA LETTER DA;Lo;0;L;;;;;N;;;;; -11327;GRANTHA LETTER DHA;Lo;0;L;;;;;N;;;;; -11328;GRANTHA LETTER NA;Lo;0;L;;;;;N;;;;; -1132A;GRANTHA LETTER PA;Lo;0;L;;;;;N;;;;; -1132B;GRANTHA LETTER PHA;Lo;0;L;;;;;N;;;;; -1132C;GRANTHA LETTER BA;Lo;0;L;;;;;N;;;;; -1132D;GRANTHA LETTER BHA;Lo;0;L;;;;;N;;;;; -1132E;GRANTHA LETTER MA;Lo;0;L;;;;;N;;;;; -1132F;GRANTHA LETTER YA;Lo;0;L;;;;;N;;;;; -11330;GRANTHA LETTER RA;Lo;0;L;;;;;N;;;;; -11332;GRANTHA LETTER LA;Lo;0;L;;;;;N;;;;; -11333;GRANTHA LETTER LLA;Lo;0;L;;;;;N;;;;; -11335;GRANTHA LETTER VA;Lo;0;L;;;;;N;;;;; -11336;GRANTHA LETTER SHA;Lo;0;L;;;;;N;;;;; -11337;GRANTHA LETTER SSA;Lo;0;L;;;;;N;;;;; -11338;GRANTHA LETTER SA;Lo;0;L;;;;;N;;;;; -11339;GRANTHA LETTER HA;Lo;0;L;;;;;N;;;;; -1133C;GRANTHA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -1133D;GRANTHA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -1133E;GRANTHA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -1133F;GRANTHA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -11340;GRANTHA VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -11341;GRANTHA VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -11342;GRANTHA VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -11343;GRANTHA VOWEL SIGN VOCALIC R;Mc;0;L;;;;;N;;;;; -11344;GRANTHA VOWEL SIGN VOCALIC RR;Mc;0;L;;;;;N;;;;; -11347;GRANTHA VOWEL SIGN EE;Mc;0;L;;;;;N;;;;; -11348;GRANTHA VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -1134B;GRANTHA VOWEL SIGN OO;Mc;0;L;11347 1133E;;;;N;;;;; -1134C;GRANTHA VOWEL SIGN AU;Mc;0;L;11347 11357;;;;N;;;;; -1134D;GRANTHA SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -11350;GRANTHA OM;Lo;0;L;;;;;N;;;;; -11357;GRANTHA AU LENGTH MARK;Mc;0;L;;;;;N;;;;; -1135D;GRANTHA SIGN PLUTA;Lo;0;L;;;;;N;;;;; -1135E;GRANTHA LETTER VEDIC ANUSVARA;Lo;0;L;;;;;N;;;;; -1135F;GRANTHA LETTER VEDIC DOUBLE ANUSVARA;Lo;0;L;;;;;N;;;;; -11360;GRANTHA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11361;GRANTHA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -11362;GRANTHA VOWEL SIGN VOCALIC L;Mc;0;L;;;;;N;;;;; -11363;GRANTHA VOWEL SIGN VOCALIC LL;Mc;0;L;;;;;N;;;;; -11366;COMBINING GRANTHA DIGIT ZERO;Mn;230;NSM;;;;;N;;;;; -11367;COMBINING GRANTHA DIGIT ONE;Mn;230;NSM;;;;;N;;;;; -11368;COMBINING GRANTHA DIGIT TWO;Mn;230;NSM;;;;;N;;;;; -11369;COMBINING GRANTHA DIGIT THREE;Mn;230;NSM;;;;;N;;;;; -1136A;COMBINING GRANTHA DIGIT FOUR;Mn;230;NSM;;;;;N;;;;; -1136B;COMBINING GRANTHA DIGIT FIVE;Mn;230;NSM;;;;;N;;;;; -1136C;COMBINING GRANTHA DIGIT SIX;Mn;230;NSM;;;;;N;;;;; -11370;COMBINING GRANTHA LETTER A;Mn;230;NSM;;;;;N;;;;; -11371;COMBINING GRANTHA LETTER KA;Mn;230;NSM;;;;;N;;;;; -11372;COMBINING GRANTHA LETTER NA;Mn;230;NSM;;;;;N;;;;; -11373;COMBINING GRANTHA LETTER VI;Mn;230;NSM;;;;;N;;;;; -11374;COMBINING GRANTHA LETTER PA;Mn;230;NSM;;;;;N;;;;; -11480;TIRHUTA ANJI;Lo;0;L;;;;;N;;;;; -11481;TIRHUTA LETTER A;Lo;0;L;;;;;N;;;;; -11482;TIRHUTA LETTER AA;Lo;0;L;;;;;N;;;;; -11483;TIRHUTA LETTER I;Lo;0;L;;;;;N;;;;; -11484;TIRHUTA LETTER II;Lo;0;L;;;;;N;;;;; -11485;TIRHUTA LETTER U;Lo;0;L;;;;;N;;;;; -11486;TIRHUTA LETTER UU;Lo;0;L;;;;;N;;;;; -11487;TIRHUTA LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -11488;TIRHUTA LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11489;TIRHUTA LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -1148A;TIRHUTA LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1148B;TIRHUTA LETTER E;Lo;0;L;;;;;N;;;;; -1148C;TIRHUTA LETTER AI;Lo;0;L;;;;;N;;;;; -1148D;TIRHUTA LETTER O;Lo;0;L;;;;;N;;;;; -1148E;TIRHUTA LETTER AU;Lo;0;L;;;;;N;;;;; -1148F;TIRHUTA LETTER KA;Lo;0;L;;;;;N;;;;; -11490;TIRHUTA LETTER KHA;Lo;0;L;;;;;N;;;;; -11491;TIRHUTA LETTER GA;Lo;0;L;;;;;N;;;;; -11492;TIRHUTA LETTER GHA;Lo;0;L;;;;;N;;;;; -11493;TIRHUTA LETTER NGA;Lo;0;L;;;;;N;;;;; -11494;TIRHUTA LETTER CA;Lo;0;L;;;;;N;;;;; -11495;TIRHUTA LETTER CHA;Lo;0;L;;;;;N;;;;; -11496;TIRHUTA LETTER JA;Lo;0;L;;;;;N;;;;; -11497;TIRHUTA LETTER JHA;Lo;0;L;;;;;N;;;;; -11498;TIRHUTA LETTER NYA;Lo;0;L;;;;;N;;;;; -11499;TIRHUTA LETTER TTA;Lo;0;L;;;;;N;;;;; -1149A;TIRHUTA LETTER TTHA;Lo;0;L;;;;;N;;;;; -1149B;TIRHUTA LETTER DDA;Lo;0;L;;;;;N;;;;; -1149C;TIRHUTA LETTER DDHA;Lo;0;L;;;;;N;;;;; -1149D;TIRHUTA LETTER NNA;Lo;0;L;;;;;N;;;;; -1149E;TIRHUTA LETTER TA;Lo;0;L;;;;;N;;;;; -1149F;TIRHUTA LETTER THA;Lo;0;L;;;;;N;;;;; -114A0;TIRHUTA LETTER DA;Lo;0;L;;;;;N;;;;; -114A1;TIRHUTA LETTER DHA;Lo;0;L;;;;;N;;;;; -114A2;TIRHUTA LETTER NA;Lo;0;L;;;;;N;;;;; -114A3;TIRHUTA LETTER PA;Lo;0;L;;;;;N;;;;; -114A4;TIRHUTA LETTER PHA;Lo;0;L;;;;;N;;;;; -114A5;TIRHUTA LETTER BA;Lo;0;L;;;;;N;;;;; -114A6;TIRHUTA LETTER BHA;Lo;0;L;;;;;N;;;;; -114A7;TIRHUTA LETTER MA;Lo;0;L;;;;;N;;;;; -114A8;TIRHUTA LETTER YA;Lo;0;L;;;;;N;;;;; -114A9;TIRHUTA LETTER RA;Lo;0;L;;;;;N;;;;; -114AA;TIRHUTA LETTER LA;Lo;0;L;;;;;N;;;;; -114AB;TIRHUTA LETTER VA;Lo;0;L;;;;;N;;;;; -114AC;TIRHUTA LETTER SHA;Lo;0;L;;;;;N;;;;; -114AD;TIRHUTA LETTER SSA;Lo;0;L;;;;;N;;;;; -114AE;TIRHUTA LETTER SA;Lo;0;L;;;;;N;;;;; -114AF;TIRHUTA LETTER HA;Lo;0;L;;;;;N;;;;; -114B0;TIRHUTA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -114B1;TIRHUTA VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -114B2;TIRHUTA VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -114B3;TIRHUTA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -114B4;TIRHUTA VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -114B5;TIRHUTA VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -114B6;TIRHUTA VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -114B7;TIRHUTA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -114B8;TIRHUTA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -114B9;TIRHUTA VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -114BA;TIRHUTA VOWEL SIGN SHORT E;Mn;0;NSM;;;;;N;;;;; -114BB;TIRHUTA VOWEL SIGN AI;Mc;0;L;114B9 114BA;;;;N;;;;; -114BC;TIRHUTA VOWEL SIGN O;Mc;0;L;114B9 114B0;;;;N;;;;; -114BD;TIRHUTA VOWEL SIGN SHORT O;Mc;0;L;;;;;N;;;;; -114BE;TIRHUTA VOWEL SIGN AU;Mc;0;L;114B9 114BD;;;;N;;;;; -114BF;TIRHUTA SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -114C0;TIRHUTA SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -114C1;TIRHUTA SIGN VISARGA;Mc;0;L;;;;;N;;;;; -114C2;TIRHUTA SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -114C3;TIRHUTA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -114C4;TIRHUTA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;; -114C5;TIRHUTA GVANG;Lo;0;L;;;;;N;;;;; -114C6;TIRHUTA ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -114C7;TIRHUTA OM;Lo;0;L;;;;;N;;;;; -114D0;TIRHUTA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -114D1;TIRHUTA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -114D2;TIRHUTA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -114D3;TIRHUTA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -114D4;TIRHUTA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -114D5;TIRHUTA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -114D6;TIRHUTA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -114D7;TIRHUTA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -114D8;TIRHUTA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -114D9;TIRHUTA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11580;SIDDHAM LETTER A;Lo;0;L;;;;;N;;;;; -11581;SIDDHAM LETTER AA;Lo;0;L;;;;;N;;;;; -11582;SIDDHAM LETTER I;Lo;0;L;;;;;N;;;;; -11583;SIDDHAM LETTER II;Lo;0;L;;;;;N;;;;; -11584;SIDDHAM LETTER U;Lo;0;L;;;;;N;;;;; -11585;SIDDHAM LETTER UU;Lo;0;L;;;;;N;;;;; -11586;SIDDHAM LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -11587;SIDDHAM LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11588;SIDDHAM LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -11589;SIDDHAM LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1158A;SIDDHAM LETTER E;Lo;0;L;;;;;N;;;;; -1158B;SIDDHAM LETTER AI;Lo;0;L;;;;;N;;;;; -1158C;SIDDHAM LETTER O;Lo;0;L;;;;;N;;;;; -1158D;SIDDHAM LETTER AU;Lo;0;L;;;;;N;;;;; -1158E;SIDDHAM LETTER KA;Lo;0;L;;;;;N;;;;; -1158F;SIDDHAM LETTER KHA;Lo;0;L;;;;;N;;;;; -11590;SIDDHAM LETTER GA;Lo;0;L;;;;;N;;;;; -11591;SIDDHAM LETTER GHA;Lo;0;L;;;;;N;;;;; -11592;SIDDHAM LETTER NGA;Lo;0;L;;;;;N;;;;; -11593;SIDDHAM LETTER CA;Lo;0;L;;;;;N;;;;; -11594;SIDDHAM LETTER CHA;Lo;0;L;;;;;N;;;;; -11595;SIDDHAM LETTER JA;Lo;0;L;;;;;N;;;;; -11596;SIDDHAM LETTER JHA;Lo;0;L;;;;;N;;;;; -11597;SIDDHAM LETTER NYA;Lo;0;L;;;;;N;;;;; -11598;SIDDHAM LETTER TTA;Lo;0;L;;;;;N;;;;; -11599;SIDDHAM LETTER TTHA;Lo;0;L;;;;;N;;;;; -1159A;SIDDHAM LETTER DDA;Lo;0;L;;;;;N;;;;; -1159B;SIDDHAM LETTER DDHA;Lo;0;L;;;;;N;;;;; -1159C;SIDDHAM LETTER NNA;Lo;0;L;;;;;N;;;;; -1159D;SIDDHAM LETTER TA;Lo;0;L;;;;;N;;;;; -1159E;SIDDHAM LETTER THA;Lo;0;L;;;;;N;;;;; -1159F;SIDDHAM LETTER DA;Lo;0;L;;;;;N;;;;; -115A0;SIDDHAM LETTER DHA;Lo;0;L;;;;;N;;;;; -115A1;SIDDHAM LETTER NA;Lo;0;L;;;;;N;;;;; -115A2;SIDDHAM LETTER PA;Lo;0;L;;;;;N;;;;; -115A3;SIDDHAM LETTER PHA;Lo;0;L;;;;;N;;;;; -115A4;SIDDHAM LETTER BA;Lo;0;L;;;;;N;;;;; -115A5;SIDDHAM LETTER BHA;Lo;0;L;;;;;N;;;;; -115A6;SIDDHAM LETTER MA;Lo;0;L;;;;;N;;;;; -115A7;SIDDHAM LETTER YA;Lo;0;L;;;;;N;;;;; -115A8;SIDDHAM LETTER RA;Lo;0;L;;;;;N;;;;; -115A9;SIDDHAM LETTER LA;Lo;0;L;;;;;N;;;;; -115AA;SIDDHAM LETTER VA;Lo;0;L;;;;;N;;;;; -115AB;SIDDHAM LETTER SHA;Lo;0;L;;;;;N;;;;; -115AC;SIDDHAM LETTER SSA;Lo;0;L;;;;;N;;;;; -115AD;SIDDHAM LETTER SA;Lo;0;L;;;;;N;;;;; -115AE;SIDDHAM LETTER HA;Lo;0;L;;;;;N;;;;; -115AF;SIDDHAM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -115B0;SIDDHAM VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -115B1;SIDDHAM VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -115B2;SIDDHAM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -115B3;SIDDHAM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -115B4;SIDDHAM VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -115B5;SIDDHAM VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -115B8;SIDDHAM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -115B9;SIDDHAM VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -115BA;SIDDHAM VOWEL SIGN O;Mc;0;L;115B8 115AF;;;;N;;;;; -115BB;SIDDHAM VOWEL SIGN AU;Mc;0;L;115B9 115AF;;;;N;;;;; -115BC;SIDDHAM SIGN CANDRABINDU;Mn;0;NSM;;;;;N;;;;; -115BD;SIDDHAM SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -115BE;SIDDHAM SIGN VISARGA;Mc;0;L;;;;;N;;;;; -115BF;SIDDHAM SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -115C0;SIDDHAM SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -115C1;SIDDHAM SIGN SIDDHAM;Po;0;L;;;;;N;;;;; -115C2;SIDDHAM DANDA;Po;0;L;;;;;N;;;;; -115C3;SIDDHAM DOUBLE DANDA;Po;0;L;;;;;N;;;;; -115C4;SIDDHAM SEPARATOR DOT;Po;0;L;;;;;N;;;;; -115C5;SIDDHAM SEPARATOR BAR;Po;0;L;;;;;N;;;;; -115C6;SIDDHAM REPETITION MARK-1;Po;0;L;;;;;N;;;;; -115C7;SIDDHAM REPETITION MARK-2;Po;0;L;;;;;N;;;;; -115C8;SIDDHAM REPETITION MARK-3;Po;0;L;;;;;N;;;;; -115C9;SIDDHAM END OF TEXT MARK;Po;0;L;;;;;N;;;;; -115CA;SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS;Po;0;L;;;;;N;;;;; -115CB;SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; -115CC;SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS;Po;0;L;;;;;N;;;;; -115CD;SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; -115CE;SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115CF;SIDDHAM SECTION MARK DOUBLE RING;Po;0;L;;;;;N;;;;; -115D0;SIDDHAM SECTION MARK DOUBLE RING WITH RAYS;Po;0;L;;;;;N;;;;; -115D1;SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D2;SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D3;SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D4;SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS;Po;0;L;;;;;N;;;;; -115D5;SIDDHAM SECTION MARK WITH CIRCLES AND RAYS;Po;0;L;;;;;N;;;;; -115D6;SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES;Po;0;L;;;;;N;;;;; -115D7;SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES;Po;0;L;;;;;N;;;;; -115D8;SIDDHAM LETTER THREE-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; -115D9;SIDDHAM LETTER TWO-CIRCLE ALTERNATE I;Lo;0;L;;;;;N;;;;; -115DA;SIDDHAM LETTER TWO-CIRCLE ALTERNATE II;Lo;0;L;;;;;N;;;;; -115DB;SIDDHAM LETTER ALTERNATE U;Lo;0;L;;;;;N;;;;; -115DC;SIDDHAM VOWEL SIGN ALTERNATE U;Mn;0;NSM;;;;;N;;;;; -115DD;SIDDHAM VOWEL SIGN ALTERNATE UU;Mn;0;NSM;;;;;N;;;;; -11600;MODI LETTER A;Lo;0;L;;;;;N;;;;; -11601;MODI LETTER AA;Lo;0;L;;;;;N;;;;; -11602;MODI LETTER I;Lo;0;L;;;;;N;;;;; -11603;MODI LETTER II;Lo;0;L;;;;;N;;;;; -11604;MODI LETTER U;Lo;0;L;;;;;N;;;;; -11605;MODI LETTER UU;Lo;0;L;;;;;N;;;;; -11606;MODI LETTER VOCALIC R;Lo;0;L;;;;;N;;;;; -11607;MODI LETTER VOCALIC RR;Lo;0;L;;;;;N;;;;; -11608;MODI LETTER VOCALIC L;Lo;0;L;;;;;N;;;;; -11609;MODI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;; -1160A;MODI LETTER E;Lo;0;L;;;;;N;;;;; -1160B;MODI LETTER AI;Lo;0;L;;;;;N;;;;; -1160C;MODI LETTER O;Lo;0;L;;;;;N;;;;; -1160D;MODI LETTER AU;Lo;0;L;;;;;N;;;;; -1160E;MODI LETTER KA;Lo;0;L;;;;;N;;;;; -1160F;MODI LETTER KHA;Lo;0;L;;;;;N;;;;; -11610;MODI LETTER GA;Lo;0;L;;;;;N;;;;; -11611;MODI LETTER GHA;Lo;0;L;;;;;N;;;;; -11612;MODI LETTER NGA;Lo;0;L;;;;;N;;;;; -11613;MODI LETTER CA;Lo;0;L;;;;;N;;;;; -11614;MODI LETTER CHA;Lo;0;L;;;;;N;;;;; -11615;MODI LETTER JA;Lo;0;L;;;;;N;;;;; -11616;MODI LETTER JHA;Lo;0;L;;;;;N;;;;; -11617;MODI LETTER NYA;Lo;0;L;;;;;N;;;;; -11618;MODI LETTER TTA;Lo;0;L;;;;;N;;;;; -11619;MODI LETTER TTHA;Lo;0;L;;;;;N;;;;; -1161A;MODI LETTER DDA;Lo;0;L;;;;;N;;;;; -1161B;MODI LETTER DDHA;Lo;0;L;;;;;N;;;;; -1161C;MODI LETTER NNA;Lo;0;L;;;;;N;;;;; -1161D;MODI LETTER TA;Lo;0;L;;;;;N;;;;; -1161E;MODI LETTER THA;Lo;0;L;;;;;N;;;;; -1161F;MODI LETTER DA;Lo;0;L;;;;;N;;;;; -11620;MODI LETTER DHA;Lo;0;L;;;;;N;;;;; -11621;MODI LETTER NA;Lo;0;L;;;;;N;;;;; -11622;MODI LETTER PA;Lo;0;L;;;;;N;;;;; -11623;MODI LETTER PHA;Lo;0;L;;;;;N;;;;; -11624;MODI LETTER BA;Lo;0;L;;;;;N;;;;; -11625;MODI LETTER BHA;Lo;0;L;;;;;N;;;;; -11626;MODI LETTER MA;Lo;0;L;;;;;N;;;;; -11627;MODI LETTER YA;Lo;0;L;;;;;N;;;;; -11628;MODI LETTER RA;Lo;0;L;;;;;N;;;;; -11629;MODI LETTER LA;Lo;0;L;;;;;N;;;;; -1162A;MODI LETTER VA;Lo;0;L;;;;;N;;;;; -1162B;MODI LETTER SHA;Lo;0;L;;;;;N;;;;; -1162C;MODI LETTER SSA;Lo;0;L;;;;;N;;;;; -1162D;MODI LETTER SA;Lo;0;L;;;;;N;;;;; -1162E;MODI LETTER HA;Lo;0;L;;;;;N;;;;; -1162F;MODI LETTER LLA;Lo;0;L;;;;;N;;;;; -11630;MODI VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -11631;MODI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -11632;MODI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -11633;MODI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -11634;MODI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -11635;MODI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;; -11636;MODI VOWEL SIGN VOCALIC RR;Mn;0;NSM;;;;;N;;;;; -11637;MODI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;; -11638;MODI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;N;;;;; -11639;MODI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -1163A;MODI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1163B;MODI VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -1163C;MODI VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -1163D;MODI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -1163E;MODI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -1163F;MODI SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;; -11640;MODI SIGN ARDHACANDRA;Mn;0;NSM;;;;;N;;;;; -11641;MODI DANDA;Po;0;L;;;;;N;;;;; -11642;MODI DOUBLE DANDA;Po;0;L;;;;;N;;;;; -11643;MODI ABBREVIATION SIGN;Po;0;L;;;;;N;;;;; -11644;MODI SIGN HUVA;Lo;0;L;;;;;N;;;;; -11650;MODI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11651;MODI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11652;MODI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11653;MODI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -11654;MODI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -11655;MODI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -11656;MODI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -11657;MODI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -11658;MODI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -11659;MODI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11680;TAKRI LETTER A;Lo;0;L;;;;;N;;;;; -11681;TAKRI LETTER AA;Lo;0;L;;;;;N;;;;; -11682;TAKRI LETTER I;Lo;0;L;;;;;N;;;;; -11683;TAKRI LETTER II;Lo;0;L;;;;;N;;;;; -11684;TAKRI LETTER U;Lo;0;L;;;;;N;;;;; -11685;TAKRI LETTER UU;Lo;0;L;;;;;N;;;;; -11686;TAKRI LETTER E;Lo;0;L;;;;;N;;;;; -11687;TAKRI LETTER AI;Lo;0;L;;;;;N;;;;; -11688;TAKRI LETTER O;Lo;0;L;;;;;N;;;;; -11689;TAKRI LETTER AU;Lo;0;L;;;;;N;;;;; -1168A;TAKRI LETTER KA;Lo;0;L;;;;;N;;;;; -1168B;TAKRI LETTER KHA;Lo;0;L;;;;;N;;;;; -1168C;TAKRI LETTER GA;Lo;0;L;;;;;N;;;;; -1168D;TAKRI LETTER GHA;Lo;0;L;;;;;N;;;;; -1168E;TAKRI LETTER NGA;Lo;0;L;;;;;N;;;;; -1168F;TAKRI LETTER CA;Lo;0;L;;;;;N;;;;; -11690;TAKRI LETTER CHA;Lo;0;L;;;;;N;;;;; -11691;TAKRI LETTER JA;Lo;0;L;;;;;N;;;;; -11692;TAKRI LETTER JHA;Lo;0;L;;;;;N;;;;; -11693;TAKRI LETTER NYA;Lo;0;L;;;;;N;;;;; -11694;TAKRI LETTER TTA;Lo;0;L;;;;;N;;;;; -11695;TAKRI LETTER TTHA;Lo;0;L;;;;;N;;;;; -11696;TAKRI LETTER DDA;Lo;0;L;;;;;N;;;;; -11697;TAKRI LETTER DDHA;Lo;0;L;;;;;N;;;;; -11698;TAKRI LETTER NNA;Lo;0;L;;;;;N;;;;; -11699;TAKRI LETTER TA;Lo;0;L;;;;;N;;;;; -1169A;TAKRI LETTER THA;Lo;0;L;;;;;N;;;;; -1169B;TAKRI LETTER DA;Lo;0;L;;;;;N;;;;; -1169C;TAKRI LETTER DHA;Lo;0;L;;;;;N;;;;; -1169D;TAKRI LETTER NA;Lo;0;L;;;;;N;;;;; -1169E;TAKRI LETTER PA;Lo;0;L;;;;;N;;;;; -1169F;TAKRI LETTER PHA;Lo;0;L;;;;;N;;;;; -116A0;TAKRI LETTER BA;Lo;0;L;;;;;N;;;;; -116A1;TAKRI LETTER BHA;Lo;0;L;;;;;N;;;;; -116A2;TAKRI LETTER MA;Lo;0;L;;;;;N;;;;; -116A3;TAKRI LETTER YA;Lo;0;L;;;;;N;;;;; -116A4;TAKRI LETTER RA;Lo;0;L;;;;;N;;;;; -116A5;TAKRI LETTER LA;Lo;0;L;;;;;N;;;;; -116A6;TAKRI LETTER VA;Lo;0;L;;;;;N;;;;; -116A7;TAKRI LETTER SHA;Lo;0;L;;;;;N;;;;; -116A8;TAKRI LETTER SA;Lo;0;L;;;;;N;;;;; -116A9;TAKRI LETTER HA;Lo;0;L;;;;;N;;;;; -116AA;TAKRI LETTER RRA;Lo;0;L;;;;;N;;;;; -116AB;TAKRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;; -116AC;TAKRI SIGN VISARGA;Mc;0;L;;;;;N;;;;; -116AD;TAKRI VOWEL SIGN AA;Mn;0;NSM;;;;;N;;;;; -116AE;TAKRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -116AF;TAKRI VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -116B0;TAKRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -116B1;TAKRI VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -116B2;TAKRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;; -116B3;TAKRI VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -116B4;TAKRI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -116B5;TAKRI VOWEL SIGN AU;Mn;0;NSM;;;;;N;;;;; -116B6;TAKRI SIGN VIRAMA;Mc;9;L;;;;;N;;;;; -116B7;TAKRI SIGN NUKTA;Mn;7;NSM;;;;;N;;;;; -116C0;TAKRI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -116C1;TAKRI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -116C2;TAKRI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -116C3;TAKRI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -116C4;TAKRI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -116C5;TAKRI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -116C6;TAKRI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -116C7;TAKRI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -116C8;TAKRI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -116C9;TAKRI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -11700;AHOM LETTER KA;Lo;0;L;;;;;N;;;;; -11701;AHOM LETTER KHA;Lo;0;L;;;;;N;;;;; -11702;AHOM LETTER NGA;Lo;0;L;;;;;N;;;;; -11703;AHOM LETTER NA;Lo;0;L;;;;;N;;;;; -11704;AHOM LETTER TA;Lo;0;L;;;;;N;;;;; -11705;AHOM LETTER ALTERNATE TA;Lo;0;L;;;;;N;;;;; -11706;AHOM LETTER PA;Lo;0;L;;;;;N;;;;; -11707;AHOM LETTER PHA;Lo;0;L;;;;;N;;;;; -11708;AHOM LETTER BA;Lo;0;L;;;;;N;;;;; -11709;AHOM LETTER MA;Lo;0;L;;;;;N;;;;; -1170A;AHOM LETTER JA;Lo;0;L;;;;;N;;;;; -1170B;AHOM LETTER CHA;Lo;0;L;;;;;N;;;;; -1170C;AHOM LETTER THA;Lo;0;L;;;;;N;;;;; -1170D;AHOM LETTER RA;Lo;0;L;;;;;N;;;;; -1170E;AHOM LETTER LA;Lo;0;L;;;;;N;;;;; -1170F;AHOM LETTER SA;Lo;0;L;;;;;N;;;;; -11710;AHOM LETTER NYA;Lo;0;L;;;;;N;;;;; -11711;AHOM LETTER HA;Lo;0;L;;;;;N;;;;; -11712;AHOM LETTER A;Lo;0;L;;;;;N;;;;; -11713;AHOM LETTER DA;Lo;0;L;;;;;N;;;;; -11714;AHOM LETTER DHA;Lo;0;L;;;;;N;;;;; -11715;AHOM LETTER GA;Lo;0;L;;;;;N;;;;; -11716;AHOM LETTER ALTERNATE GA;Lo;0;L;;;;;N;;;;; -11717;AHOM LETTER GHA;Lo;0;L;;;;;N;;;;; -11718;AHOM LETTER BHA;Lo;0;L;;;;;N;;;;; -11719;AHOM LETTER JHA;Lo;0;L;;;;;N;;;;; -1171D;AHOM CONSONANT SIGN MEDIAL LA;Mn;0;NSM;;;;;N;;;;; -1171E;AHOM CONSONANT SIGN MEDIAL RA;Mn;0;NSM;;;;;N;;;;; -1171F;AHOM CONSONANT SIGN MEDIAL LIGATING RA;Mn;0;NSM;;;;;N;;;;; -11720;AHOM VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -11721;AHOM VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -11722;AHOM VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;; -11723;AHOM VOWEL SIGN II;Mn;0;NSM;;;;;N;;;;; -11724;AHOM VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;; -11725;AHOM VOWEL SIGN UU;Mn;0;NSM;;;;;N;;;;; -11726;AHOM VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -11727;AHOM VOWEL SIGN AW;Mn;0;NSM;;;;;N;;;;; -11728;AHOM VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;; -11729;AHOM VOWEL SIGN AI;Mn;0;NSM;;;;;N;;;;; -1172A;AHOM VOWEL SIGN AM;Mn;0;NSM;;;;;N;;;;; -1172B;AHOM SIGN KILLER;Mn;9;NSM;;;;;N;;;;; -11730;AHOM DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -11731;AHOM DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -11732;AHOM DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -11733;AHOM DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -11734;AHOM DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -11735;AHOM DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -11736;AHOM DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -11737;AHOM DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -11738;AHOM DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -11739;AHOM DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -1173A;AHOM NUMBER TEN;No;0;L;;;;10;N;;;;; -1173B;AHOM NUMBER TWENTY;No;0;L;;;;20;N;;;;; -1173C;AHOM SIGN SMALL SECTION;Po;0;L;;;;;N;;;;; -1173D;AHOM SIGN SECTION;Po;0;L;;;;;N;;;;; -1173E;AHOM SIGN RULAI;Po;0;L;;;;;N;;;;; -1173F;AHOM SYMBOL VI;So;0;L;;;;;N;;;;; -118A0;WARANG CITI CAPITAL LETTER NGAA;Lu;0;L;;;;;N;;;;118C0; -118A1;WARANG CITI CAPITAL LETTER A;Lu;0;L;;;;;N;;;;118C1; -118A2;WARANG CITI CAPITAL LETTER WI;Lu;0;L;;;;;N;;;;118C2; -118A3;WARANG CITI CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;118C3; -118A4;WARANG CITI CAPITAL LETTER YA;Lu;0;L;;;;;N;;;;118C4; -118A5;WARANG CITI CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;118C5; -118A6;WARANG CITI CAPITAL LETTER II;Lu;0;L;;;;;N;;;;118C6; -118A7;WARANG CITI CAPITAL LETTER UU;Lu;0;L;;;;;N;;;;118C7; -118A8;WARANG CITI CAPITAL LETTER E;Lu;0;L;;;;;N;;;;118C8; -118A9;WARANG CITI CAPITAL LETTER O;Lu;0;L;;;;;N;;;;118C9; -118AA;WARANG CITI CAPITAL LETTER ANG;Lu;0;L;;;;;N;;;;118CA; -118AB;WARANG CITI CAPITAL LETTER GA;Lu;0;L;;;;;N;;;;118CB; -118AC;WARANG CITI CAPITAL LETTER KO;Lu;0;L;;;;;N;;;;118CC; -118AD;WARANG CITI CAPITAL LETTER ENY;Lu;0;L;;;;;N;;;;118CD; -118AE;WARANG CITI CAPITAL LETTER YUJ;Lu;0;L;;;;;N;;;;118CE; -118AF;WARANG CITI CAPITAL LETTER UC;Lu;0;L;;;;;N;;;;118CF; -118B0;WARANG CITI CAPITAL LETTER ENN;Lu;0;L;;;;;N;;;;118D0; -118B1;WARANG CITI CAPITAL LETTER ODD;Lu;0;L;;;;;N;;;;118D1; -118B2;WARANG CITI CAPITAL LETTER TTE;Lu;0;L;;;;;N;;;;118D2; -118B3;WARANG CITI CAPITAL LETTER NUNG;Lu;0;L;;;;;N;;;;118D3; -118B4;WARANG CITI CAPITAL LETTER DA;Lu;0;L;;;;;N;;;;118D4; -118B5;WARANG CITI CAPITAL LETTER AT;Lu;0;L;;;;;N;;;;118D5; -118B6;WARANG CITI CAPITAL LETTER AM;Lu;0;L;;;;;N;;;;118D6; -118B7;WARANG CITI CAPITAL LETTER BU;Lu;0;L;;;;;N;;;;118D7; -118B8;WARANG CITI CAPITAL LETTER PU;Lu;0;L;;;;;N;;;;118D8; -118B9;WARANG CITI CAPITAL LETTER HIYO;Lu;0;L;;;;;N;;;;118D9; -118BA;WARANG CITI CAPITAL LETTER HOLO;Lu;0;L;;;;;N;;;;118DA; -118BB;WARANG CITI CAPITAL LETTER HORR;Lu;0;L;;;;;N;;;;118DB; -118BC;WARANG CITI CAPITAL LETTER HAR;Lu;0;L;;;;;N;;;;118DC; -118BD;WARANG CITI CAPITAL LETTER SSUU;Lu;0;L;;;;;N;;;;118DD; -118BE;WARANG CITI CAPITAL LETTER SII;Lu;0;L;;;;;N;;;;118DE; -118BF;WARANG CITI CAPITAL LETTER VIYO;Lu;0;L;;;;;N;;;;118DF; -118C0;WARANG CITI SMALL LETTER NGAA;Ll;0;L;;;;;N;;;118A0;;118A0 -118C1;WARANG CITI SMALL LETTER A;Ll;0;L;;;;;N;;;118A1;;118A1 -118C2;WARANG CITI SMALL LETTER WI;Ll;0;L;;;;;N;;;118A2;;118A2 -118C3;WARANG CITI SMALL LETTER YU;Ll;0;L;;;;;N;;;118A3;;118A3 -118C4;WARANG CITI SMALL LETTER YA;Ll;0;L;;;;;N;;;118A4;;118A4 -118C5;WARANG CITI SMALL LETTER YO;Ll;0;L;;;;;N;;;118A5;;118A5 -118C6;WARANG CITI SMALL LETTER II;Ll;0;L;;;;;N;;;118A6;;118A6 -118C7;WARANG CITI SMALL LETTER UU;Ll;0;L;;;;;N;;;118A7;;118A7 -118C8;WARANG CITI SMALL LETTER E;Ll;0;L;;;;;N;;;118A8;;118A8 -118C9;WARANG CITI SMALL LETTER O;Ll;0;L;;;;;N;;;118A9;;118A9 -118CA;WARANG CITI SMALL LETTER ANG;Ll;0;L;;;;;N;;;118AA;;118AA -118CB;WARANG CITI SMALL LETTER GA;Ll;0;L;;;;;N;;;118AB;;118AB -118CC;WARANG CITI SMALL LETTER KO;Ll;0;L;;;;;N;;;118AC;;118AC -118CD;WARANG CITI SMALL LETTER ENY;Ll;0;L;;;;;N;;;118AD;;118AD -118CE;WARANG CITI SMALL LETTER YUJ;Ll;0;L;;;;;N;;;118AE;;118AE -118CF;WARANG CITI SMALL LETTER UC;Ll;0;L;;;;;N;;;118AF;;118AF -118D0;WARANG CITI SMALL LETTER ENN;Ll;0;L;;;;;N;;;118B0;;118B0 -118D1;WARANG CITI SMALL LETTER ODD;Ll;0;L;;;;;N;;;118B1;;118B1 -118D2;WARANG CITI SMALL LETTER TTE;Ll;0;L;;;;;N;;;118B2;;118B2 -118D3;WARANG CITI SMALL LETTER NUNG;Ll;0;L;;;;;N;;;118B3;;118B3 -118D4;WARANG CITI SMALL LETTER DA;Ll;0;L;;;;;N;;;118B4;;118B4 -118D5;WARANG CITI SMALL LETTER AT;Ll;0;L;;;;;N;;;118B5;;118B5 -118D6;WARANG CITI SMALL LETTER AM;Ll;0;L;;;;;N;;;118B6;;118B6 -118D7;WARANG CITI SMALL LETTER BU;Ll;0;L;;;;;N;;;118B7;;118B7 -118D8;WARANG CITI SMALL LETTER PU;Ll;0;L;;;;;N;;;118B8;;118B8 -118D9;WARANG CITI SMALL LETTER HIYO;Ll;0;L;;;;;N;;;118B9;;118B9 -118DA;WARANG CITI SMALL LETTER HOLO;Ll;0;L;;;;;N;;;118BA;;118BA -118DB;WARANG CITI SMALL LETTER HORR;Ll;0;L;;;;;N;;;118BB;;118BB -118DC;WARANG CITI SMALL LETTER HAR;Ll;0;L;;;;;N;;;118BC;;118BC -118DD;WARANG CITI SMALL LETTER SSUU;Ll;0;L;;;;;N;;;118BD;;118BD -118DE;WARANG CITI SMALL LETTER SII;Ll;0;L;;;;;N;;;118BE;;118BE -118DF;WARANG CITI SMALL LETTER VIYO;Ll;0;L;;;;;N;;;118BF;;118BF -118E0;WARANG CITI DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -118E1;WARANG CITI DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -118E2;WARANG CITI DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -118E3;WARANG CITI DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -118E4;WARANG CITI DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -118E5;WARANG CITI DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -118E6;WARANG CITI DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -118E7;WARANG CITI DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -118E8;WARANG CITI DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -118E9;WARANG CITI DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -118EA;WARANG CITI NUMBER TEN;No;0;L;;;;10;N;;;;; -118EB;WARANG CITI NUMBER TWENTY;No;0;L;;;;20;N;;;;; -118EC;WARANG CITI NUMBER THIRTY;No;0;L;;;;30;N;;;;; -118ED;WARANG CITI NUMBER FORTY;No;0;L;;;;40;N;;;;; -118EE;WARANG CITI NUMBER FIFTY;No;0;L;;;;50;N;;;;; -118EF;WARANG CITI NUMBER SIXTY;No;0;L;;;;60;N;;;;; -118F0;WARANG CITI NUMBER SEVENTY;No;0;L;;;;70;N;;;;; -118F1;WARANG CITI NUMBER EIGHTY;No;0;L;;;;80;N;;;;; -118F2;WARANG CITI NUMBER NINETY;No;0;L;;;;90;N;;;;; -118FF;WARANG CITI OM;Lo;0;L;;;;;N;;;;; -11AC0;PAU CIN HAU LETTER PA;Lo;0;L;;;;;N;;;;; -11AC1;PAU CIN HAU LETTER KA;Lo;0;L;;;;;N;;;;; -11AC2;PAU CIN HAU LETTER LA;Lo;0;L;;;;;N;;;;; -11AC3;PAU CIN HAU LETTER MA;Lo;0;L;;;;;N;;;;; -11AC4;PAU CIN HAU LETTER DA;Lo;0;L;;;;;N;;;;; -11AC5;PAU CIN HAU LETTER ZA;Lo;0;L;;;;;N;;;;; -11AC6;PAU CIN HAU LETTER VA;Lo;0;L;;;;;N;;;;; -11AC7;PAU CIN HAU LETTER NGA;Lo;0;L;;;;;N;;;;; -11AC8;PAU CIN HAU LETTER HA;Lo;0;L;;;;;N;;;;; -11AC9;PAU CIN HAU LETTER GA;Lo;0;L;;;;;N;;;;; -11ACA;PAU CIN HAU LETTER KHA;Lo;0;L;;;;;N;;;;; -11ACB;PAU CIN HAU LETTER SA;Lo;0;L;;;;;N;;;;; -11ACC;PAU CIN HAU LETTER BA;Lo;0;L;;;;;N;;;;; -11ACD;PAU CIN HAU LETTER CA;Lo;0;L;;;;;N;;;;; -11ACE;PAU CIN HAU LETTER TA;Lo;0;L;;;;;N;;;;; -11ACF;PAU CIN HAU LETTER THA;Lo;0;L;;;;;N;;;;; -11AD0;PAU CIN HAU LETTER NA;Lo;0;L;;;;;N;;;;; -11AD1;PAU CIN HAU LETTER PHA;Lo;0;L;;;;;N;;;;; -11AD2;PAU CIN HAU LETTER RA;Lo;0;L;;;;;N;;;;; -11AD3;PAU CIN HAU LETTER FA;Lo;0;L;;;;;N;;;;; -11AD4;PAU CIN HAU LETTER CHA;Lo;0;L;;;;;N;;;;; -11AD5;PAU CIN HAU LETTER A;Lo;0;L;;;;;N;;;;; -11AD6;PAU CIN HAU LETTER E;Lo;0;L;;;;;N;;;;; -11AD7;PAU CIN HAU LETTER I;Lo;0;L;;;;;N;;;;; -11AD8;PAU CIN HAU LETTER O;Lo;0;L;;;;;N;;;;; -11AD9;PAU CIN HAU LETTER U;Lo;0;L;;;;;N;;;;; -11ADA;PAU CIN HAU LETTER UA;Lo;0;L;;;;;N;;;;; -11ADB;PAU CIN HAU LETTER IA;Lo;0;L;;;;;N;;;;; -11ADC;PAU CIN HAU LETTER FINAL P;Lo;0;L;;;;;N;;;;; -11ADD;PAU CIN HAU LETTER FINAL K;Lo;0;L;;;;;N;;;;; -11ADE;PAU CIN HAU LETTER FINAL T;Lo;0;L;;;;;N;;;;; -11ADF;PAU CIN HAU LETTER FINAL M;Lo;0;L;;;;;N;;;;; -11AE0;PAU CIN HAU LETTER FINAL N;Lo;0;L;;;;;N;;;;; -11AE1;PAU CIN HAU LETTER FINAL L;Lo;0;L;;;;;N;;;;; -11AE2;PAU CIN HAU LETTER FINAL W;Lo;0;L;;;;;N;;;;; -11AE3;PAU CIN HAU LETTER FINAL NG;Lo;0;L;;;;;N;;;;; -11AE4;PAU CIN HAU LETTER FINAL Y;Lo;0;L;;;;;N;;;;; -11AE5;PAU CIN HAU RISING TONE LONG;Lo;0;L;;;;;N;;;;; -11AE6;PAU CIN HAU RISING TONE;Lo;0;L;;;;;N;;;;; -11AE7;PAU CIN HAU SANDHI GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -11AE8;PAU CIN HAU RISING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AE9;PAU CIN HAU RISING TONE FINAL;Lo;0;L;;;;;N;;;;; -11AEA;PAU CIN HAU SANDHI GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; -11AEB;PAU CIN HAU SANDHI TONE LONG;Lo;0;L;;;;;N;;;;; -11AEC;PAU CIN HAU SANDHI TONE;Lo;0;L;;;;;N;;;;; -11AED;PAU CIN HAU SANDHI TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AEE;PAU CIN HAU SANDHI TONE FINAL;Lo;0;L;;;;;N;;;;; -11AEF;PAU CIN HAU MID-LEVEL TONE;Lo;0;L;;;;;N;;;;; -11AF0;PAU CIN HAU GLOTTAL STOP VARIANT;Lo;0;L;;;;;N;;;;; -11AF1;PAU CIN HAU MID-LEVEL TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AF2;PAU CIN HAU MID-LEVEL TONE FINAL;Lo;0;L;;;;;N;;;;; -11AF3;PAU CIN HAU LOW-FALLING TONE LONG;Lo;0;L;;;;;N;;;;; -11AF4;PAU CIN HAU LOW-FALLING TONE;Lo;0;L;;;;;N;;;;; -11AF5;PAU CIN HAU GLOTTAL STOP;Lo;0;L;;;;;N;;;;; -11AF6;PAU CIN HAU LOW-FALLING TONE LONG FINAL;Lo;0;L;;;;;N;;;;; -11AF7;PAU CIN HAU LOW-FALLING TONE FINAL;Lo;0;L;;;;;N;;;;; -11AF8;PAU CIN HAU GLOTTAL STOP FINAL;Lo;0;L;;;;;N;;;;; -12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;; -12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;; -12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;; -12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;; -12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;; -12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;; -12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;; -12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;; -12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;; -1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;; -1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;; -1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; -1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;; -1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;; -12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;; -12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;; -12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;; -12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; -12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;; -12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;; -12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;; -12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;; -1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;; -1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;; -1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;; -1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;; -1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;; -12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;; -12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;; -12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;; -12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;; -12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;; -12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;; -12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;; -12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;; -12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;; -12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;; -1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;; -1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;; -1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;; -1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;; -1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;; -1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;; -12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;; -12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;; -12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;; -12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;; -12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;; -12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;; -12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;; -12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;; -12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;; -12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; -1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;; -1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;; -1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; -1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;; -1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;; -1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;; -12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;; -12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;; -12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;; -12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;; -12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;; -12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;; -12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;; -12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;; -12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;; -12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;; -1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;; -1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;; -1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;; -1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;; -1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;; -12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;; -12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;; -12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;; -12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;; -12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;; -12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;; -12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;; -12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;; -12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;; -12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;; -1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; -1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;; -1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;; -1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;; -1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;; -1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;; -12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;; -12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;; -12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;; -12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;; -12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;; -12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;; -12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;; -12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;; -12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;; -12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; -1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;; -1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;; -1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;; -1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;; -1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;; -1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;; -12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;; -12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;; -12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;; -12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;; -12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;; -12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;; -12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;; -12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;; -12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;; -12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;; -1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;; -1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;; -1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;; -1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;; -1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;; -1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;; -12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;; -12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;; -12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;; -12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;; -12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;; -12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;; -12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;; -12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; -12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;; -12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;; -1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;; -1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;; -1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;; -1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;; -1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;; -1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;; -12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;; -12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;; -12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;; -12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;; -12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;; -12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;; -12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;; -12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;; -12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;; -12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;; -1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;; -1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;; -1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;; -1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;; -1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;; -120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;; -120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;; -120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;; -120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; -120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;; -120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;; -120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;; -120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;; -120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; -120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;; -120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;; -120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;; -120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;; -120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;; -120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;; -120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;; -120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;; -120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;; -120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;; -120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;; -120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;; -120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;; -120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;; -120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; -120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; -120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; -120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;; -120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;; -120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;; -120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;; -120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;; -120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;; -120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;; -120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;; -120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;; -120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;; -120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;; -120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;; -120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;; -120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;; -120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;; -120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;; -120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;; -120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;; -120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;; -120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;; -120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;; -120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;; -120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;; -120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;; -120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;; -120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;; -120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;; -120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; -120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;; -120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;; -120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;; -120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;; -120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;; -120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;; -120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;; -120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;; -120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;; -120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;; -120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;; -120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;; -120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;; -120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;; -120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;; -120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;; -120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;; -120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;; -120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;; -120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;; -120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;; -120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;; -120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;; -120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;; -120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;; -120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;; -120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;; -120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;; -120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;; -120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;; -120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;; -120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;; -120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;; -120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;; -120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;; -12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;; -12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;; -12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;; -12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;; -12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;; -12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;; -12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;; -12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;; -12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;; -12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;; -1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;; -1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;; -1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;; -1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;; -1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;; -12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;; -12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;; -12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; -12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;; -12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; -12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;; -12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;; -12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;; -12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;; -12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;; -1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;; -1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;; -1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;; -1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;; -1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;; -12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;; -12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;; -12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;; -12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;; -12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;; -12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;; -12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;; -12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;; -12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;; -12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;; -1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;; -1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;; -1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;; -1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;; -1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;; -1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;; -12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;; -12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;; -12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;; -12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;; -12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;; -12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;; -12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;; -12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;; -12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;; -12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;; -1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;; -1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;; -1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;; -1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;; -1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;; -1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;; -12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;; -12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;; -12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;; -12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;; -12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;; -12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;; -12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;; -12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;; -12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;; -12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;; -1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;; -1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;; -1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;; -1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;; -1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;; -12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;; -12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;; -12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;; -12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;; -12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;; -12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;; -12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;; -12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;; -12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;; -12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;; -1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;; -1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;; -1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;; -1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;; -1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;; -1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;; -12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;; -12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;; -12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;; -12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;; -12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;; -12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;; -12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;; -12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;; -12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;; -1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; -1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;; -1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;; -1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;; -1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;; -1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;; -12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;; -12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;; -12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;; -12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;; -12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;; -12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;; -12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;; -12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;; -12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;; -12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;; -1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;; -1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;; -1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;; -1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;; -1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;; -1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;; -12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;; -12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;; -12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;; -12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;; -12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;; -12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;; -12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;; -12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;; -12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;; -12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;; -1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;; -1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;; -1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;; -1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;; -1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;; -1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;; -12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;; -12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;; -12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;; -12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;; -12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;; -12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;; -12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;; -12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;; -12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;; -1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;; -1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;; -1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;; -1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; -1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;; -1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;; -121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;; -121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;; -121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;; -121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;; -121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;; -121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;; -121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;; -121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;; -121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;; -121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;; -121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;; -121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;; -121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;; -121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;; -121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;; -121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;; -121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;; -121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;; -121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;; -121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;; -121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;; -121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;; -121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;; -121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;; -121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;; -121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;; -121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;; -121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;; -121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;; -121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;; -121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;; -121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;; -121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;; -121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;; -121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;; -121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;; -121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;; -121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;; -121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;; -121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;; -121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;; -121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;; -121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;; -121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;; -121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;; -121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;; -121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;; -121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;; -121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;; -121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;; -121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;; -121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;; -121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;; -121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;; -121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;; -121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;; -121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;; -121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;; -121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; -121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;; -121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;; -121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;; -121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;; -121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;; -121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;; -121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;; -121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;; -121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;; -121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;; -121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; -121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; -121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;; -121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;; -121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;; -121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;; -121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;; -121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;; -121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;; -121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;; -121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;; -121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;; -121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;; -121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;; -121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;; -121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;; -121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;; -121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;; -121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;; -121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;; -121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;; -121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;; -121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;; -121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;; -121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;; -12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;; -12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;; -12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;; -12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;; -12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;; -12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;; -12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;; -12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;; -12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;; -1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;; -1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;; -1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;; -1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;; -1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;; -1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;; -12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;; -12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;; -12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;; -12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;; -12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;; -12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;; -12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;; -12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;; -12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;; -12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;; -1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;; -1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;; -1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;; -1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;; -1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;; -1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;; -12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;; -12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;; -12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;; -12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;; -12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;; -12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;; -12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;; -12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;; -12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;; -12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;; -1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;; -1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;; -1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;; -1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;; -1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;; -1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;; -12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;; -12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;; -12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;; -12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;; -12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;; -12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;; -12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;; -12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; -12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;; -12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;; -1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;; -1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;; -1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;; -1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;; -1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;; -1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;; -12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;; -12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;; -12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;; -12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;; -12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;; -12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;; -12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;; -12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;; -12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;; -12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;; -1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;; -1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;; -1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;; -1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;; -1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;; -1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;; -12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; -12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;; -12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;; -12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;; -12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;; -12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;; -12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;; -12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;; -12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;; -1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;; -1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;; -1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;; -1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;; -1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; -1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;; -12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;; -12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;; -12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;; -12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;; -12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;; -12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;; -12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; -12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;; -12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;; -12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;; -1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;; -1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;; -1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;; -1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;; -1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;; -1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;; -12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;; -12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;; -12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;; -12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;; -12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;; -12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;; -12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;; -12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;; -12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;; -1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;; -1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;; -1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;; -1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;; -1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;; -1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;; -12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;; -12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;; -12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;; -12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;; -12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;; -12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;; -12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;; -12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;; -12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;; -12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;; -1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;; -1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;; -1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;; -1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;; -1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;; -1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;; -12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;; -12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;; -12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;; -12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;; -12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;; -12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;; -12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;; -12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;; -12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;; -12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;; -1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;; -1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;; -1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;; -1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;; -1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;; -1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;; -122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;; -122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;; -122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;; -122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;; -122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;; -122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;; -122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;; -122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;; -122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;; -122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;; -122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;; -122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;; -122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;; -122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;; -122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;; -122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;; -122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;; -122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;; -122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;; -122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;; -122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;; -122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;; -122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;; -122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;; -122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;; -122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;; -122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;; -122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;; -122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;; -122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;; -122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;; -122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;; -122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;; -122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;; -122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;; -122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;; -122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;; -122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;; -122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;; -122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;; -122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;; -122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;; -122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;; -122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;; -122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;; -122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;; -122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;; -122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;; -122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;; -122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;; -122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;; -122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;; -122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;; -122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;; -122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;; -122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;; -122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;; -122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;; -122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;; -122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;; -122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;; -122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;; -122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;; -122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;; -122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;; -122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;; -122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;; -122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;; -122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;; -122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;; -122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;; -122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;; -122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;; -122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;; -122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;; -122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;; -122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;; -122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;; -122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;; -122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;; -122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;; -122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;; -122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;; -122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;; -122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;; -122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;; -122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;; -122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;; -122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;; -122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;; -122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;; -122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;; -122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;; -122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;; -12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;; -12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;; -12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;; -12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;; -12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;; -12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;; -12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;; -12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;; -12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;; -12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;; -1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;; -1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;; -1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;; -1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;; -1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;; -1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;; -12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;; -12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;; -12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;; -12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;; -12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;; -12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;; -12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;; -12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;; -12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;; -12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;; -1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;; -1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; -1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;; -1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;; -1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;; -1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;; -12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;; -12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;; -12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;; -12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;; -12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;; -12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;; -12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;; -12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;; -12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;; -12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;; -1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;; -1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;; -1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;; -1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;; -1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;; -1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;; -12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;; -12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;; -12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;; -12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;; -12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;; -12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;; -12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;; -12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;; -12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;; -12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;; -1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;; -1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;; -1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;; -1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;; -1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;; -12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;; -12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;; -12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;; -12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;; -12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;; -12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;; -12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;; -12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;; -12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;; -12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;; -1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;; -1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;; -1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;; -1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;; -1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;; -1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;; -12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;; -12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;; -12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;; -12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;; -12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;; -12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;; -12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;; -12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;; -12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;; -12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;; -1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;; -1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;; -1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;; -1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;; -1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;; -1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;; -12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;; -12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;; -12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;; -12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;; -12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;; -12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;; -12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;; -12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;; -12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;; -12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;; -1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;; -1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;; -1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;; -1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;; -1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;; -1236F;CUNEIFORM SIGN KAP ELAMITE;Lo;0;L;;;;;N;;;;; -12370;CUNEIFORM SIGN AB TIMES NUN;Lo;0;L;;;;;N;;;;; -12371;CUNEIFORM SIGN AB2 TIMES A;Lo;0;L;;;;;N;;;;; -12372;CUNEIFORM SIGN AMAR TIMES KUG;Lo;0;L;;;;;N;;;;; -12373;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS MASH;Lo;0;L;;;;;N;;;;; -12374;CUNEIFORM SIGN DAG3;Lo;0;L;;;;;N;;;;; -12375;CUNEIFORM SIGN DISH PLUS SHU;Lo;0;L;;;;;N;;;;; -12376;CUNEIFORM SIGN DUB TIMES SHE;Lo;0;L;;;;;N;;;;; -12377;CUNEIFORM SIGN EZEN TIMES GUD;Lo;0;L;;;;;N;;;;; -12378;CUNEIFORM SIGN EZEN TIMES SHE;Lo;0;L;;;;;N;;;;; -12379;CUNEIFORM SIGN GA2 TIMES AN PLUS KAK PLUS A;Lo;0;L;;;;;N;;;;; -1237A;CUNEIFORM SIGN GA2 TIMES ASH2;Lo;0;L;;;;;N;;;;; -1237B;CUNEIFORM SIGN GE22;Lo;0;L;;;;;N;;;;; -1237C;CUNEIFORM SIGN GIG;Lo;0;L;;;;;N;;;;; -1237D;CUNEIFORM SIGN HUSH;Lo;0;L;;;;;N;;;;; -1237E;CUNEIFORM SIGN KA TIMES ANSHE;Lo;0;L;;;;;N;;;;; -1237F;CUNEIFORM SIGN KA TIMES ASH3;Lo;0;L;;;;;N;;;;; -12380;CUNEIFORM SIGN KA TIMES GISH;Lo;0;L;;;;;N;;;;; -12381;CUNEIFORM SIGN KA TIMES GUD;Lo;0;L;;;;;N;;;;; -12382;CUNEIFORM SIGN KA TIMES HI TIMES ASH2;Lo;0;L;;;;;N;;;;; -12383;CUNEIFORM SIGN KA TIMES LUM;Lo;0;L;;;;;N;;;;; -12384;CUNEIFORM SIGN KA TIMES PA;Lo;0;L;;;;;N;;;;; -12385;CUNEIFORM SIGN KA TIMES SHUL;Lo;0;L;;;;;N;;;;; -12386;CUNEIFORM SIGN KA TIMES TU;Lo;0;L;;;;;N;;;;; -12387;CUNEIFORM SIGN KA TIMES UR2;Lo;0;L;;;;;N;;;;; -12388;CUNEIFORM SIGN LAGAB TIMES GI;Lo;0;L;;;;;N;;;;; -12389;CUNEIFORM SIGN LU2 SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;; -1238A;CUNEIFORM SIGN LU2 TIMES ESH2 PLUS LAL;Lo;0;L;;;;;N;;;;; -1238B;CUNEIFORM SIGN LU2 TIMES SHU;Lo;0;L;;;;;N;;;;; -1238C;CUNEIFORM SIGN MESH;Lo;0;L;;;;;N;;;;; -1238D;CUNEIFORM SIGN MUSH3 TIMES ZA;Lo;0;L;;;;;N;;;;; -1238E;CUNEIFORM SIGN NA4;Lo;0;L;;;;;N;;;;; -1238F;CUNEIFORM SIGN NIN;Lo;0;L;;;;;N;;;;; -12390;CUNEIFORM SIGN NIN9;Lo;0;L;;;;;N;;;;; -12391;CUNEIFORM SIGN NINDA2 TIMES BAL;Lo;0;L;;;;;N;;;;; -12392;CUNEIFORM SIGN NINDA2 TIMES GI;Lo;0;L;;;;;N;;;;; -12393;CUNEIFORM SIGN NU11 ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; -12394;CUNEIFORM SIGN PESH2 ASTERISK;Lo;0;L;;;;;N;;;;; -12395;CUNEIFORM SIGN PIR2;Lo;0;L;;;;;N;;;;; -12396;CUNEIFORM SIGN SAG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12397;CUNEIFORM SIGN TI2;Lo;0;L;;;;;N;;;;; -12398;CUNEIFORM SIGN UM TIMES ME;Lo;0;L;;;;;N;;;;; -12399;CUNEIFORM SIGN U U;Lo;0;L;;;;;N;;;;; -12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;; -12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;; -12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;; -12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;; -12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;; -12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;; -12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;; -12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;; -12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;; -12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;; -1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;; -1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;; -1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;; -1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;; -1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;; -1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;; -12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;; -12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;; -12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;; -12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;; -12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;; -12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;; -12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;; -12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;; -12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;; -12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;; -1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;; -1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;; -1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;; -1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;; -1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;; -1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;; -12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;; -12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;; -12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;; -12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;; -12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;; -12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;; -12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;; -12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;; -12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;; -12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;; -1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;; -1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;; -1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;; -1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;; -1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;; -1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;; -12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;; -12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;; -12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;216000;N;;;;; -12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;432000;N;;;;; -12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;; -12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;; -12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;; -12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;; -12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;; -12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;; -1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;; -1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;; -1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;; -1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;; -1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;; -1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;; -12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;; -12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;; -12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;; -12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;; -12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;; -12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;; -12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;; -12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;; -12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;; -12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;; -1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;; -1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;; -1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;; -1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;; -1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;; -1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;; -12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;; -12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;; -12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;; -12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;; -12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;; -12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;; -12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;2;N;;;;; -12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;3;N;;;;; -12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;; -12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;; -1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;; -1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;; -1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;; -1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;; -1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;; -1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;; -12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;; -12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;; -12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;; -12463;CUNEIFORM NUMERIC SIGN ONE QUARTER GUR;Nl;0;L;;;;1/4;N;;;;; -12464;CUNEIFORM NUMERIC SIGN ONE HALF GUR;Nl;0;L;;;;1/2;N;;;;; -12465;CUNEIFORM NUMERIC SIGN ELAMITE ONE THIRD;Nl;0;L;;;;1/3;N;;;;; -12466;CUNEIFORM NUMERIC SIGN ELAMITE TWO THIRDS;Nl;0;L;;;;2/3;N;;;;; -12467;CUNEIFORM NUMERIC SIGN ELAMITE FORTY;Nl;0;L;;;;40;N;;;;; -12468;CUNEIFORM NUMERIC SIGN ELAMITE FIFTY;Nl;0;L;;;;50;N;;;;; -12469;CUNEIFORM NUMERIC SIGN FOUR U VARIANT FORM;Nl;0;L;;;;4;N;;;;; -1246A;CUNEIFORM NUMERIC SIGN FIVE U VARIANT FORM;Nl;0;L;;;;5;N;;;;; -1246B;CUNEIFORM NUMERIC SIGN SIX U VARIANT FORM;Nl;0;L;;;;6;N;;;;; -1246C;CUNEIFORM NUMERIC SIGN SEVEN U VARIANT FORM;Nl;0;L;;;;7;N;;;;; -1246D;CUNEIFORM NUMERIC SIGN EIGHT U VARIANT FORM;Nl;0;L;;;;8;N;;;;; -1246E;CUNEIFORM NUMERIC SIGN NINE U VARIANT FORM;Nl;0;L;;;;9;N;;;;; -12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;; -12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;; -12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;; -12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;; -12474;CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON;Po;0;L;;;;;N;;;;; -12480;CUNEIFORM SIGN AB TIMES NUN TENU;Lo;0;L;;;;;N;;;;; -12481;CUNEIFORM SIGN AB TIMES SHU2;Lo;0;L;;;;;N;;;;; -12482;CUNEIFORM SIGN AD TIMES ESH2;Lo;0;L;;;;;N;;;;; -12483;CUNEIFORM SIGN BAD TIMES DISH TENU;Lo;0;L;;;;;N;;;;; -12484;CUNEIFORM SIGN BAHAR2 TIMES AB2;Lo;0;L;;;;;N;;;;; -12485;CUNEIFORM SIGN BAHAR2 TIMES NI;Lo;0;L;;;;;N;;;;; -12486;CUNEIFORM SIGN BAHAR2 TIMES ZA;Lo;0;L;;;;;N;;;;; -12487;CUNEIFORM SIGN BU OVER BU TIMES NA2;Lo;0;L;;;;;N;;;;; -12488;CUNEIFORM SIGN DA TIMES TAK4;Lo;0;L;;;;;N;;;;; -12489;CUNEIFORM SIGN DAG TIMES KUR;Lo;0;L;;;;;N;;;;; -1248A;CUNEIFORM SIGN DIM TIMES IGI;Lo;0;L;;;;;N;;;;; -1248B;CUNEIFORM SIGN DIM TIMES U U U;Lo;0;L;;;;;N;;;;; -1248C;CUNEIFORM SIGN DIM2 TIMES UD;Lo;0;L;;;;;N;;;;; -1248D;CUNEIFORM SIGN DUG TIMES ANSHE;Lo;0;L;;;;;N;;;;; -1248E;CUNEIFORM SIGN DUG TIMES ASH;Lo;0;L;;;;;N;;;;; -1248F;CUNEIFORM SIGN DUG TIMES ASH AT LEFT;Lo;0;L;;;;;N;;;;; -12490;CUNEIFORM SIGN DUG TIMES DIN;Lo;0;L;;;;;N;;;;; -12491;CUNEIFORM SIGN DUG TIMES DUN;Lo;0;L;;;;;N;;;;; -12492;CUNEIFORM SIGN DUG TIMES ERIN2;Lo;0;L;;;;;N;;;;; -12493;CUNEIFORM SIGN DUG TIMES GA;Lo;0;L;;;;;N;;;;; -12494;CUNEIFORM SIGN DUG TIMES GI;Lo;0;L;;;;;N;;;;; -12495;CUNEIFORM SIGN DUG TIMES GIR2 GUNU;Lo;0;L;;;;;N;;;;; -12496;CUNEIFORM SIGN DUG TIMES GISH;Lo;0;L;;;;;N;;;;; -12497;CUNEIFORM SIGN DUG TIMES HA;Lo;0;L;;;;;N;;;;; -12498;CUNEIFORM SIGN DUG TIMES HI;Lo;0;L;;;;;N;;;;; -12499;CUNEIFORM SIGN DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -1249A;CUNEIFORM SIGN DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; -1249B;CUNEIFORM SIGN DUG TIMES KUR;Lo;0;L;;;;;N;;;;; -1249C;CUNEIFORM SIGN DUG TIMES KUSHU2;Lo;0;L;;;;;N;;;;; -1249D;CUNEIFORM SIGN DUG TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; -1249E;CUNEIFORM SIGN DUG TIMES LAK-020;Lo;0;L;;;;;N;;;;; -1249F;CUNEIFORM SIGN DUG TIMES LAM;Lo;0;L;;;;;N;;;;; -124A0;CUNEIFORM SIGN DUG TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; -124A1;CUNEIFORM SIGN DUG TIMES LUH PLUS GISH;Lo;0;L;;;;;N;;;;; -124A2;CUNEIFORM SIGN DUG TIMES MASH;Lo;0;L;;;;;N;;;;; -124A3;CUNEIFORM SIGN DUG TIMES MES;Lo;0;L;;;;;N;;;;; -124A4;CUNEIFORM SIGN DUG TIMES MI;Lo;0;L;;;;;N;;;;; -124A5;CUNEIFORM SIGN DUG TIMES NI;Lo;0;L;;;;;N;;;;; -124A6;CUNEIFORM SIGN DUG TIMES PI;Lo;0;L;;;;;N;;;;; -124A7;CUNEIFORM SIGN DUG TIMES SHE;Lo;0;L;;;;;N;;;;; -124A8;CUNEIFORM SIGN DUG TIMES SI GUNU;Lo;0;L;;;;;N;;;;; -124A9;CUNEIFORM SIGN E2 TIMES KUR;Lo;0;L;;;;;N;;;;; -124AA;CUNEIFORM SIGN E2 TIMES PAP;Lo;0;L;;;;;N;;;;; -124AB;CUNEIFORM SIGN ERIN2 X;Lo;0;L;;;;;N;;;;; -124AC;CUNEIFORM SIGN ESH2 CROSSING ESH2;Lo;0;L;;;;;N;;;;; -124AD;CUNEIFORM SIGN EZEN SHESHIG TIMES ASH;Lo;0;L;;;;;N;;;;; -124AE;CUNEIFORM SIGN EZEN SHESHIG TIMES HI;Lo;0;L;;;;;N;;;;; -124AF;CUNEIFORM SIGN EZEN SHESHIG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -124B0;CUNEIFORM SIGN EZEN SHESHIG TIMES LA;Lo;0;L;;;;;N;;;;; -124B1;CUNEIFORM SIGN EZEN SHESHIG TIMES LAL;Lo;0;L;;;;;N;;;;; -124B2;CUNEIFORM SIGN EZEN SHESHIG TIMES ME;Lo;0;L;;;;;N;;;;; -124B3;CUNEIFORM SIGN EZEN SHESHIG TIMES MES;Lo;0;L;;;;;N;;;;; -124B4;CUNEIFORM SIGN EZEN SHESHIG TIMES SU;Lo;0;L;;;;;N;;;;; -124B5;CUNEIFORM SIGN EZEN TIMES SU;Lo;0;L;;;;;N;;;;; -124B6;CUNEIFORM SIGN GA2 TIMES BAHAR2;Lo;0;L;;;;;N;;;;; -124B7;CUNEIFORM SIGN GA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; -124B8;CUNEIFORM SIGN GA2 TIMES DUG TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -124B9;CUNEIFORM SIGN GA2 TIMES DUG TIMES KASKAL;Lo;0;L;;;;;N;;;;; -124BA;CUNEIFORM SIGN GA2 TIMES EREN;Lo;0;L;;;;;N;;;;; -124BB;CUNEIFORM SIGN GA2 TIMES GA;Lo;0;L;;;;;N;;;;; -124BC;CUNEIFORM SIGN GA2 TIMES GAR PLUS DI;Lo;0;L;;;;;N;;;;; -124BD;CUNEIFORM SIGN GA2 TIMES GAR PLUS NE;Lo;0;L;;;;;N;;;;; -124BE;CUNEIFORM SIGN GA2 TIMES HA PLUS A;Lo;0;L;;;;;N;;;;; -124BF;CUNEIFORM SIGN GA2 TIMES KUSHU2 PLUS KASKAL;Lo;0;L;;;;;N;;;;; -124C0;CUNEIFORM SIGN GA2 TIMES LAM;Lo;0;L;;;;;N;;;;; -124C1;CUNEIFORM SIGN GA2 TIMES LAM TIMES KUR;Lo;0;L;;;;;N;;;;; -124C2;CUNEIFORM SIGN GA2 TIMES LUH;Lo;0;L;;;;;N;;;;; -124C3;CUNEIFORM SIGN GA2 TIMES MUSH;Lo;0;L;;;;;N;;;;; -124C4;CUNEIFORM SIGN GA2 TIMES NE;Lo;0;L;;;;;N;;;;; -124C5;CUNEIFORM SIGN GA2 TIMES NE PLUS E2;Lo;0;L;;;;;N;;;;; -124C6;CUNEIFORM SIGN GA2 TIMES NE PLUS GI;Lo;0;L;;;;;N;;;;; -124C7;CUNEIFORM SIGN GA2 TIMES SHIM;Lo;0;L;;;;;N;;;;; -124C8;CUNEIFORM SIGN GA2 TIMES ZIZ2;Lo;0;L;;;;;N;;;;; -124C9;CUNEIFORM SIGN GABA ROTATED NINETY DEGREES;Lo;0;L;;;;;N;;;;; -124CA;CUNEIFORM SIGN GESHTIN TIMES U;Lo;0;L;;;;;N;;;;; -124CB;CUNEIFORM SIGN GISH TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;; -124CC;CUNEIFORM SIGN GU2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -124CD;CUNEIFORM SIGN GUD PLUS GISH TIMES TAK4;Lo;0;L;;;;;N;;;;; -124CE;CUNEIFORM SIGN HA TENU GUNU;Lo;0;L;;;;;N;;;;; -124CF;CUNEIFORM SIGN HI TIMES ASH OVER HI TIMES ASH;Lo;0;L;;;;;N;;;;; -124D0;CUNEIFORM SIGN KA TIMES BU;Lo;0;L;;;;;N;;;;; -124D1;CUNEIFORM SIGN KA TIMES KA;Lo;0;L;;;;;N;;;;; -124D2;CUNEIFORM SIGN KA TIMES U U U;Lo;0;L;;;;;N;;;;; -124D3;CUNEIFORM SIGN KA TIMES UR;Lo;0;L;;;;;N;;;;; -124D4;CUNEIFORM SIGN LAGAB TIMES ZU OVER ZU;Lo;0;L;;;;;N;;;;; -124D5;CUNEIFORM SIGN LAK-003;Lo;0;L;;;;;N;;;;; -124D6;CUNEIFORM SIGN LAK-021;Lo;0;L;;;;;N;;;;; -124D7;CUNEIFORM SIGN LAK-025;Lo;0;L;;;;;N;;;;; -124D8;CUNEIFORM SIGN LAK-030;Lo;0;L;;;;;N;;;;; -124D9;CUNEIFORM SIGN LAK-050;Lo;0;L;;;;;N;;;;; -124DA;CUNEIFORM SIGN LAK-051;Lo;0;L;;;;;N;;;;; -124DB;CUNEIFORM SIGN LAK-062;Lo;0;L;;;;;N;;;;; -124DC;CUNEIFORM SIGN LAK-079 OVER LAK-079 GUNU;Lo;0;L;;;;;N;;;;; -124DD;CUNEIFORM SIGN LAK-080;Lo;0;L;;;;;N;;;;; -124DE;CUNEIFORM SIGN LAK-081 OVER LAK-081;Lo;0;L;;;;;N;;;;; -124DF;CUNEIFORM SIGN LAK-092;Lo;0;L;;;;;N;;;;; -124E0;CUNEIFORM SIGN LAK-130;Lo;0;L;;;;;N;;;;; -124E1;CUNEIFORM SIGN LAK-142;Lo;0;L;;;;;N;;;;; -124E2;CUNEIFORM SIGN LAK-210;Lo;0;L;;;;;N;;;;; -124E3;CUNEIFORM SIGN LAK-219;Lo;0;L;;;;;N;;;;; -124E4;CUNEIFORM SIGN LAK-220;Lo;0;L;;;;;N;;;;; -124E5;CUNEIFORM SIGN LAK-225;Lo;0;L;;;;;N;;;;; -124E6;CUNEIFORM SIGN LAK-228;Lo;0;L;;;;;N;;;;; -124E7;CUNEIFORM SIGN LAK-238;Lo;0;L;;;;;N;;;;; -124E8;CUNEIFORM SIGN LAK-265;Lo;0;L;;;;;N;;;;; -124E9;CUNEIFORM SIGN LAK-266;Lo;0;L;;;;;N;;;;; -124EA;CUNEIFORM SIGN LAK-343;Lo;0;L;;;;;N;;;;; -124EB;CUNEIFORM SIGN LAK-347;Lo;0;L;;;;;N;;;;; -124EC;CUNEIFORM SIGN LAK-348;Lo;0;L;;;;;N;;;;; -124ED;CUNEIFORM SIGN LAK-383;Lo;0;L;;;;;N;;;;; -124EE;CUNEIFORM SIGN LAK-384;Lo;0;L;;;;;N;;;;; -124EF;CUNEIFORM SIGN LAK-390;Lo;0;L;;;;;N;;;;; -124F0;CUNEIFORM SIGN LAK-441;Lo;0;L;;;;;N;;;;; -124F1;CUNEIFORM SIGN LAK-449;Lo;0;L;;;;;N;;;;; -124F2;CUNEIFORM SIGN LAK-449 TIMES GU;Lo;0;L;;;;;N;;;;; -124F3;CUNEIFORM SIGN LAK-449 TIMES IGI;Lo;0;L;;;;;N;;;;; -124F4;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -124F5;CUNEIFORM SIGN LAK-449 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -124F6;CUNEIFORM SIGN LAK-449 TIMES U2 PLUS BA;Lo;0;L;;;;;N;;;;; -124F7;CUNEIFORM SIGN LAK-450;Lo;0;L;;;;;N;;;;; -124F8;CUNEIFORM SIGN LAK-457;Lo;0;L;;;;;N;;;;; -124F9;CUNEIFORM SIGN LAK-470;Lo;0;L;;;;;N;;;;; -124FA;CUNEIFORM SIGN LAK-483;Lo;0;L;;;;;N;;;;; -124FB;CUNEIFORM SIGN LAK-490;Lo;0;L;;;;;N;;;;; -124FC;CUNEIFORM SIGN LAK-492;Lo;0;L;;;;;N;;;;; -124FD;CUNEIFORM SIGN LAK-493;Lo;0;L;;;;;N;;;;; -124FE;CUNEIFORM SIGN LAK-495;Lo;0;L;;;;;N;;;;; -124FF;CUNEIFORM SIGN LAK-550;Lo;0;L;;;;;N;;;;; -12500;CUNEIFORM SIGN LAK-608;Lo;0;L;;;;;N;;;;; -12501;CUNEIFORM SIGN LAK-617;Lo;0;L;;;;;N;;;;; -12502;CUNEIFORM SIGN LAK-617 TIMES ASH;Lo;0;L;;;;;N;;;;; -12503;CUNEIFORM SIGN LAK-617 TIMES BAD;Lo;0;L;;;;;N;;;;; -12504;CUNEIFORM SIGN LAK-617 TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;; -12505;CUNEIFORM SIGN LAK-617 TIMES KU3;Lo;0;L;;;;;N;;;;; -12506;CUNEIFORM SIGN LAK-617 TIMES LA;Lo;0;L;;;;;N;;;;; -12507;CUNEIFORM SIGN LAK-617 TIMES TAR;Lo;0;L;;;;;N;;;;; -12508;CUNEIFORM SIGN LAK-617 TIMES TE;Lo;0;L;;;;;N;;;;; -12509;CUNEIFORM SIGN LAK-617 TIMES U2;Lo;0;L;;;;;N;;;;; -1250A;CUNEIFORM SIGN LAK-617 TIMES UD;Lo;0;L;;;;;N;;;;; -1250B;CUNEIFORM SIGN LAK-617 TIMES URUDA;Lo;0;L;;;;;N;;;;; -1250C;CUNEIFORM SIGN LAK-636;Lo;0;L;;;;;N;;;;; -1250D;CUNEIFORM SIGN LAK-648;Lo;0;L;;;;;N;;;;; -1250E;CUNEIFORM SIGN LAK-648 TIMES DUB;Lo;0;L;;;;;N;;;;; -1250F;CUNEIFORM SIGN LAK-648 TIMES GA;Lo;0;L;;;;;N;;;;; -12510;CUNEIFORM SIGN LAK-648 TIMES IGI;Lo;0;L;;;;;N;;;;; -12511;CUNEIFORM SIGN LAK-648 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;; -12512;CUNEIFORM SIGN LAK-648 TIMES NI;Lo;0;L;;;;;N;;;;; -12513;CUNEIFORM SIGN LAK-648 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -12514;CUNEIFORM SIGN LAK-648 TIMES SHESH PLUS KI;Lo;0;L;;;;;N;;;;; -12515;CUNEIFORM SIGN LAK-648 TIMES UD;Lo;0;L;;;;;N;;;;; -12516;CUNEIFORM SIGN LAK-648 TIMES URUDA;Lo;0;L;;;;;N;;;;; -12517;CUNEIFORM SIGN LAK-724;Lo;0;L;;;;;N;;;;; -12518;CUNEIFORM SIGN LAK-749;Lo;0;L;;;;;N;;;;; -12519;CUNEIFORM SIGN LU2 GUNU TIMES ASH;Lo;0;L;;;;;N;;;;; -1251A;CUNEIFORM SIGN LU2 TIMES DISH;Lo;0;L;;;;;N;;;;; -1251B;CUNEIFORM SIGN LU2 TIMES HAL;Lo;0;L;;;;;N;;;;; -1251C;CUNEIFORM SIGN LU2 TIMES PAP;Lo;0;L;;;;;N;;;;; -1251D;CUNEIFORM SIGN LU2 TIMES PAP PLUS PAP PLUS LU3;Lo;0;L;;;;;N;;;;; -1251E;CUNEIFORM SIGN LU2 TIMES TAK4;Lo;0;L;;;;;N;;;;; -1251F;CUNEIFORM SIGN MI PLUS ZA7;Lo;0;L;;;;;N;;;;; -12520;CUNEIFORM SIGN MUSH OVER MUSH TIMES GA;Lo;0;L;;;;;N;;;;; -12521;CUNEIFORM SIGN MUSH OVER MUSH TIMES KAK;Lo;0;L;;;;;N;;;;; -12522;CUNEIFORM SIGN NINDA2 TIMES DIM GUNU;Lo;0;L;;;;;N;;;;; -12523;CUNEIFORM SIGN NINDA2 TIMES GISH;Lo;0;L;;;;;N;;;;; -12524;CUNEIFORM SIGN NINDA2 TIMES GUL;Lo;0;L;;;;;N;;;;; -12525;CUNEIFORM SIGN NINDA2 TIMES HI;Lo;0;L;;;;;N;;;;; -12526;CUNEIFORM SIGN NINDA2 TIMES KESH2;Lo;0;L;;;;;N;;;;; -12527;CUNEIFORM SIGN NINDA2 TIMES LAK-050;Lo;0;L;;;;;N;;;;; -12528;CUNEIFORM SIGN NINDA2 TIMES MASH;Lo;0;L;;;;;N;;;;; -12529;CUNEIFORM SIGN NINDA2 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;; -1252A;CUNEIFORM SIGN NINDA2 TIMES U;Lo;0;L;;;;;N;;;;; -1252B;CUNEIFORM SIGN NINDA2 TIMES U PLUS U;Lo;0;L;;;;;N;;;;; -1252C;CUNEIFORM SIGN NINDA2 TIMES URUDA;Lo;0;L;;;;;N;;;;; -1252D;CUNEIFORM SIGN SAG GUNU TIMES HA;Lo;0;L;;;;;N;;;;; -1252E;CUNEIFORM SIGN SAG TIMES EN;Lo;0;L;;;;;N;;;;; -1252F;CUNEIFORM SIGN SAG TIMES SHE AT LEFT;Lo;0;L;;;;;N;;;;; -12530;CUNEIFORM SIGN SAG TIMES TAK4;Lo;0;L;;;;;N;;;;; -12531;CUNEIFORM SIGN SHA6 TENU;Lo;0;L;;;;;N;;;;; -12532;CUNEIFORM SIGN SHE OVER SHE;Lo;0;L;;;;;N;;;;; -12533;CUNEIFORM SIGN SHE PLUS HUB2;Lo;0;L;;;;;N;;;;; -12534;CUNEIFORM SIGN SHE PLUS NAM2;Lo;0;L;;;;;N;;;;; -12535;CUNEIFORM SIGN SHE PLUS SAR;Lo;0;L;;;;;N;;;;; -12536;CUNEIFORM SIGN SHU2 PLUS DUG TIMES NI;Lo;0;L;;;;;N;;;;; -12537;CUNEIFORM SIGN SHU2 PLUS E2 TIMES AN;Lo;0;L;;;;;N;;;;; -12538;CUNEIFORM SIGN SI TIMES TAK4;Lo;0;L;;;;;N;;;;; -12539;CUNEIFORM SIGN TAK4 PLUS SAG;Lo;0;L;;;;;N;;;;; -1253A;CUNEIFORM SIGN TUM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;; -1253B;CUNEIFORM SIGN TUM TIMES THREE DISH;Lo;0;L;;;;;N;;;;; -1253C;CUNEIFORM SIGN UR2 INVERTED;Lo;0;L;;;;;N;;;;; -1253D;CUNEIFORM SIGN UR2 TIMES UD;Lo;0;L;;;;;N;;;;; -1253E;CUNEIFORM SIGN URU TIMES DARA3;Lo;0;L;;;;;N;;;;; -1253F;CUNEIFORM SIGN URU TIMES LAK-668;Lo;0;L;;;;;N;;;;; -12540;CUNEIFORM SIGN URU TIMES LU3;Lo;0;L;;;;;N;;;;; -12541;CUNEIFORM SIGN ZA7;Lo;0;L;;;;;N;;;;; -12542;CUNEIFORM SIGN ZU OVER ZU PLUS SAR;Lo;0;L;;;;;N;;;;; -12543;CUNEIFORM SIGN ZU5 TIMES THREE DISH TENU;Lo;0;L;;;;;N;;;;; -13000;EGYPTIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; -13001;EGYPTIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; -13002;EGYPTIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; -13003;EGYPTIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; -13004;EGYPTIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; -13005;EGYPTIAN HIEROGLYPH A005A;Lo;0;L;;;;;N;;;;; -13006;EGYPTIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; -13007;EGYPTIAN HIEROGLYPH A006A;Lo;0;L;;;;;N;;;;; -13008;EGYPTIAN HIEROGLYPH A006B;Lo;0;L;;;;;N;;;;; -13009;EGYPTIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; -1300A;EGYPTIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; -1300B;EGYPTIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; -1300C;EGYPTIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; -1300D;EGYPTIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; -1300E;EGYPTIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; -1300F;EGYPTIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; -13010;EGYPTIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; -13011;EGYPTIAN HIEROGLYPH A014A;Lo;0;L;;;;;N;;;;; -13012;EGYPTIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; -13013;EGYPTIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; -13014;EGYPTIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; -13015;EGYPTIAN HIEROGLYPH A017A;Lo;0;L;;;;;N;;;;; -13016;EGYPTIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; -13017;EGYPTIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; -13018;EGYPTIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; -13019;EGYPTIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; -1301A;EGYPTIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; -1301B;EGYPTIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; -1301C;EGYPTIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; -1301D;EGYPTIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; -1301E;EGYPTIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; -1301F;EGYPTIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; -13020;EGYPTIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; -13021;EGYPTIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; -13022;EGYPTIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; -13023;EGYPTIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; -13024;EGYPTIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; -13025;EGYPTIAN HIEROGLYPH A032A;Lo;0;L;;;;;N;;;;; -13026;EGYPTIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; -13027;EGYPTIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; -13028;EGYPTIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; -13029;EGYPTIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; -1302A;EGYPTIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; -1302B;EGYPTIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; -1302C;EGYPTIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; -1302D;EGYPTIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; -1302E;EGYPTIAN HIEROGLYPH A040A;Lo;0;L;;;;;N;;;;; -1302F;EGYPTIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; -13030;EGYPTIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; -13031;EGYPTIAN HIEROGLYPH A042A;Lo;0;L;;;;;N;;;;; -13032;EGYPTIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; -13033;EGYPTIAN HIEROGLYPH A043A;Lo;0;L;;;;;N;;;;; -13034;EGYPTIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; -13035;EGYPTIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; -13036;EGYPTIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; -13037;EGYPTIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; -13038;EGYPTIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; -13039;EGYPTIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; -1303A;EGYPTIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; -1303B;EGYPTIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; -1303C;EGYPTIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; -1303D;EGYPTIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; -1303E;EGYPTIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; -1303F;EGYPTIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; -13040;EGYPTIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; -13041;EGYPTIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; -13042;EGYPTIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; -13043;EGYPTIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; -13044;EGYPTIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; -13045;EGYPTIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; -13046;EGYPTIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; -13047;EGYPTIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; -13048;EGYPTIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; -13049;EGYPTIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; -1304A;EGYPTIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; -1304B;EGYPTIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; -1304C;EGYPTIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; -1304D;EGYPTIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; -1304E;EGYPTIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; -1304F;EGYPTIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; -13050;EGYPTIAN HIEROGLYPH B001;Lo;0;L;;;;;N;;;;; -13051;EGYPTIAN HIEROGLYPH B002;Lo;0;L;;;;;N;;;;; -13052;EGYPTIAN HIEROGLYPH B003;Lo;0;L;;;;;N;;;;; -13053;EGYPTIAN HIEROGLYPH B004;Lo;0;L;;;;;N;;;;; -13054;EGYPTIAN HIEROGLYPH B005;Lo;0;L;;;;;N;;;;; -13055;EGYPTIAN HIEROGLYPH B005A;Lo;0;L;;;;;N;;;;; -13056;EGYPTIAN HIEROGLYPH B006;Lo;0;L;;;;;N;;;;; -13057;EGYPTIAN HIEROGLYPH B007;Lo;0;L;;;;;N;;;;; -13058;EGYPTIAN HIEROGLYPH B008;Lo;0;L;;;;;N;;;;; -13059;EGYPTIAN HIEROGLYPH B009;Lo;0;L;;;;;N;;;;; -1305A;EGYPTIAN HIEROGLYPH C001;Lo;0;L;;;;;N;;;;; -1305B;EGYPTIAN HIEROGLYPH C002;Lo;0;L;;;;;N;;;;; -1305C;EGYPTIAN HIEROGLYPH C002A;Lo;0;L;;;;;N;;;;; -1305D;EGYPTIAN HIEROGLYPH C002B;Lo;0;L;;;;;N;;;;; -1305E;EGYPTIAN HIEROGLYPH C002C;Lo;0;L;;;;;N;;;;; -1305F;EGYPTIAN HIEROGLYPH C003;Lo;0;L;;;;;N;;;;; -13060;EGYPTIAN HIEROGLYPH C004;Lo;0;L;;;;;N;;;;; -13061;EGYPTIAN HIEROGLYPH C005;Lo;0;L;;;;;N;;;;; -13062;EGYPTIAN HIEROGLYPH C006;Lo;0;L;;;;;N;;;;; -13063;EGYPTIAN HIEROGLYPH C007;Lo;0;L;;;;;N;;;;; -13064;EGYPTIAN HIEROGLYPH C008;Lo;0;L;;;;;N;;;;; -13065;EGYPTIAN HIEROGLYPH C009;Lo;0;L;;;;;N;;;;; -13066;EGYPTIAN HIEROGLYPH C010;Lo;0;L;;;;;N;;;;; -13067;EGYPTIAN HIEROGLYPH C010A;Lo;0;L;;;;;N;;;;; -13068;EGYPTIAN HIEROGLYPH C011;Lo;0;L;;;;;N;;;;; -13069;EGYPTIAN HIEROGLYPH C012;Lo;0;L;;;;;N;;;;; -1306A;EGYPTIAN HIEROGLYPH C013;Lo;0;L;;;;;N;;;;; -1306B;EGYPTIAN HIEROGLYPH C014;Lo;0;L;;;;;N;;;;; -1306C;EGYPTIAN HIEROGLYPH C015;Lo;0;L;;;;;N;;;;; -1306D;EGYPTIAN HIEROGLYPH C016;Lo;0;L;;;;;N;;;;; -1306E;EGYPTIAN HIEROGLYPH C017;Lo;0;L;;;;;N;;;;; -1306F;EGYPTIAN HIEROGLYPH C018;Lo;0;L;;;;;N;;;;; -13070;EGYPTIAN HIEROGLYPH C019;Lo;0;L;;;;;N;;;;; -13071;EGYPTIAN HIEROGLYPH C020;Lo;0;L;;;;;N;;;;; -13072;EGYPTIAN HIEROGLYPH C021;Lo;0;L;;;;;N;;;;; -13073;EGYPTIAN HIEROGLYPH C022;Lo;0;L;;;;;N;;;;; -13074;EGYPTIAN HIEROGLYPH C023;Lo;0;L;;;;;N;;;;; -13075;EGYPTIAN HIEROGLYPH C024;Lo;0;L;;;;;N;;;;; -13076;EGYPTIAN HIEROGLYPH D001;Lo;0;L;;;;;N;;;;; -13077;EGYPTIAN HIEROGLYPH D002;Lo;0;L;;;;;N;;;;; -13078;EGYPTIAN HIEROGLYPH D003;Lo;0;L;;;;;N;;;;; -13079;EGYPTIAN HIEROGLYPH D004;Lo;0;L;;;;;N;;;;; -1307A;EGYPTIAN HIEROGLYPH D005;Lo;0;L;;;;;N;;;;; -1307B;EGYPTIAN HIEROGLYPH D006;Lo;0;L;;;;;N;;;;; -1307C;EGYPTIAN HIEROGLYPH D007;Lo;0;L;;;;;N;;;;; -1307D;EGYPTIAN HIEROGLYPH D008;Lo;0;L;;;;;N;;;;; -1307E;EGYPTIAN HIEROGLYPH D008A;Lo;0;L;;;;;N;;;;; -1307F;EGYPTIAN HIEROGLYPH D009;Lo;0;L;;;;;N;;;;; -13080;EGYPTIAN HIEROGLYPH D010;Lo;0;L;;;;;N;;;;; -13081;EGYPTIAN HIEROGLYPH D011;Lo;0;L;;;;;N;;;;; -13082;EGYPTIAN HIEROGLYPH D012;Lo;0;L;;;;;N;;;;; -13083;EGYPTIAN HIEROGLYPH D013;Lo;0;L;;;;;N;;;;; -13084;EGYPTIAN HIEROGLYPH D014;Lo;0;L;;;;;N;;;;; -13085;EGYPTIAN HIEROGLYPH D015;Lo;0;L;;;;;N;;;;; -13086;EGYPTIAN HIEROGLYPH D016;Lo;0;L;;;;;N;;;;; -13087;EGYPTIAN HIEROGLYPH D017;Lo;0;L;;;;;N;;;;; -13088;EGYPTIAN HIEROGLYPH D018;Lo;0;L;;;;;N;;;;; -13089;EGYPTIAN HIEROGLYPH D019;Lo;0;L;;;;;N;;;;; -1308A;EGYPTIAN HIEROGLYPH D020;Lo;0;L;;;;;N;;;;; -1308B;EGYPTIAN HIEROGLYPH D021;Lo;0;L;;;;;N;;;;; -1308C;EGYPTIAN HIEROGLYPH D022;Lo;0;L;;;;;N;;;;; -1308D;EGYPTIAN HIEROGLYPH D023;Lo;0;L;;;;;N;;;;; -1308E;EGYPTIAN HIEROGLYPH D024;Lo;0;L;;;;;N;;;;; -1308F;EGYPTIAN HIEROGLYPH D025;Lo;0;L;;;;;N;;;;; -13090;EGYPTIAN HIEROGLYPH D026;Lo;0;L;;;;;N;;;;; -13091;EGYPTIAN HIEROGLYPH D027;Lo;0;L;;;;;N;;;;; -13092;EGYPTIAN HIEROGLYPH D027A;Lo;0;L;;;;;N;;;;; -13093;EGYPTIAN HIEROGLYPH D028;Lo;0;L;;;;;N;;;;; -13094;EGYPTIAN HIEROGLYPH D029;Lo;0;L;;;;;N;;;;; -13095;EGYPTIAN HIEROGLYPH D030;Lo;0;L;;;;;N;;;;; -13096;EGYPTIAN HIEROGLYPH D031;Lo;0;L;;;;;N;;;;; -13097;EGYPTIAN HIEROGLYPH D031A;Lo;0;L;;;;;N;;;;; -13098;EGYPTIAN HIEROGLYPH D032;Lo;0;L;;;;;N;;;;; -13099;EGYPTIAN HIEROGLYPH D033;Lo;0;L;;;;;N;;;;; -1309A;EGYPTIAN HIEROGLYPH D034;Lo;0;L;;;;;N;;;;; -1309B;EGYPTIAN HIEROGLYPH D034A;Lo;0;L;;;;;N;;;;; -1309C;EGYPTIAN HIEROGLYPH D035;Lo;0;L;;;;;N;;;;; -1309D;EGYPTIAN HIEROGLYPH D036;Lo;0;L;;;;;N;;;;; -1309E;EGYPTIAN HIEROGLYPH D037;Lo;0;L;;;;;N;;;;; -1309F;EGYPTIAN HIEROGLYPH D038;Lo;0;L;;;;;N;;;;; -130A0;EGYPTIAN HIEROGLYPH D039;Lo;0;L;;;;;N;;;;; -130A1;EGYPTIAN HIEROGLYPH D040;Lo;0;L;;;;;N;;;;; -130A2;EGYPTIAN HIEROGLYPH D041;Lo;0;L;;;;;N;;;;; -130A3;EGYPTIAN HIEROGLYPH D042;Lo;0;L;;;;;N;;;;; -130A4;EGYPTIAN HIEROGLYPH D043;Lo;0;L;;;;;N;;;;; -130A5;EGYPTIAN HIEROGLYPH D044;Lo;0;L;;;;;N;;;;; -130A6;EGYPTIAN HIEROGLYPH D045;Lo;0;L;;;;;N;;;;; -130A7;EGYPTIAN HIEROGLYPH D046;Lo;0;L;;;;;N;;;;; -130A8;EGYPTIAN HIEROGLYPH D046A;Lo;0;L;;;;;N;;;;; -130A9;EGYPTIAN HIEROGLYPH D047;Lo;0;L;;;;;N;;;;; -130AA;EGYPTIAN HIEROGLYPH D048;Lo;0;L;;;;;N;;;;; -130AB;EGYPTIAN HIEROGLYPH D048A;Lo;0;L;;;;;N;;;;; -130AC;EGYPTIAN HIEROGLYPH D049;Lo;0;L;;;;;N;;;;; -130AD;EGYPTIAN HIEROGLYPH D050;Lo;0;L;;;;;N;;;;; -130AE;EGYPTIAN HIEROGLYPH D050A;Lo;0;L;;;;;N;;;;; -130AF;EGYPTIAN HIEROGLYPH D050B;Lo;0;L;;;;;N;;;;; -130B0;EGYPTIAN HIEROGLYPH D050C;Lo;0;L;;;;;N;;;;; -130B1;EGYPTIAN HIEROGLYPH D050D;Lo;0;L;;;;;N;;;;; -130B2;EGYPTIAN HIEROGLYPH D050E;Lo;0;L;;;;;N;;;;; -130B3;EGYPTIAN HIEROGLYPH D050F;Lo;0;L;;;;;N;;;;; -130B4;EGYPTIAN HIEROGLYPH D050G;Lo;0;L;;;;;N;;;;; -130B5;EGYPTIAN HIEROGLYPH D050H;Lo;0;L;;;;;N;;;;; -130B6;EGYPTIAN HIEROGLYPH D050I;Lo;0;L;;;;;N;;;;; -130B7;EGYPTIAN HIEROGLYPH D051;Lo;0;L;;;;;N;;;;; -130B8;EGYPTIAN HIEROGLYPH D052;Lo;0;L;;;;;N;;;;; -130B9;EGYPTIAN HIEROGLYPH D052A;Lo;0;L;;;;;N;;;;; -130BA;EGYPTIAN HIEROGLYPH D053;Lo;0;L;;;;;N;;;;; -130BB;EGYPTIAN HIEROGLYPH D054;Lo;0;L;;;;;N;;;;; -130BC;EGYPTIAN HIEROGLYPH D054A;Lo;0;L;;;;;N;;;;; -130BD;EGYPTIAN HIEROGLYPH D055;Lo;0;L;;;;;N;;;;; -130BE;EGYPTIAN HIEROGLYPH D056;Lo;0;L;;;;;N;;;;; -130BF;EGYPTIAN HIEROGLYPH D057;Lo;0;L;;;;;N;;;;; -130C0;EGYPTIAN HIEROGLYPH D058;Lo;0;L;;;;;N;;;;; -130C1;EGYPTIAN HIEROGLYPH D059;Lo;0;L;;;;;N;;;;; -130C2;EGYPTIAN HIEROGLYPH D060;Lo;0;L;;;;;N;;;;; -130C3;EGYPTIAN HIEROGLYPH D061;Lo;0;L;;;;;N;;;;; -130C4;EGYPTIAN HIEROGLYPH D062;Lo;0;L;;;;;N;;;;; -130C5;EGYPTIAN HIEROGLYPH D063;Lo;0;L;;;;;N;;;;; -130C6;EGYPTIAN HIEROGLYPH D064;Lo;0;L;;;;;N;;;;; -130C7;EGYPTIAN HIEROGLYPH D065;Lo;0;L;;;;;N;;;;; -130C8;EGYPTIAN HIEROGLYPH D066;Lo;0;L;;;;;N;;;;; -130C9;EGYPTIAN HIEROGLYPH D067;Lo;0;L;;;;;N;;;;; -130CA;EGYPTIAN HIEROGLYPH D067A;Lo;0;L;;;;;N;;;;; -130CB;EGYPTIAN HIEROGLYPH D067B;Lo;0;L;;;;;N;;;;; -130CC;EGYPTIAN HIEROGLYPH D067C;Lo;0;L;;;;;N;;;;; -130CD;EGYPTIAN HIEROGLYPH D067D;Lo;0;L;;;;;N;;;;; -130CE;EGYPTIAN HIEROGLYPH D067E;Lo;0;L;;;;;N;;;;; -130CF;EGYPTIAN HIEROGLYPH D067F;Lo;0;L;;;;;N;;;;; -130D0;EGYPTIAN HIEROGLYPH D067G;Lo;0;L;;;;;N;;;;; -130D1;EGYPTIAN HIEROGLYPH D067H;Lo;0;L;;;;;N;;;;; -130D2;EGYPTIAN HIEROGLYPH E001;Lo;0;L;;;;;N;;;;; -130D3;EGYPTIAN HIEROGLYPH E002;Lo;0;L;;;;;N;;;;; -130D4;EGYPTIAN HIEROGLYPH E003;Lo;0;L;;;;;N;;;;; -130D5;EGYPTIAN HIEROGLYPH E004;Lo;0;L;;;;;N;;;;; -130D6;EGYPTIAN HIEROGLYPH E005;Lo;0;L;;;;;N;;;;; -130D7;EGYPTIAN HIEROGLYPH E006;Lo;0;L;;;;;N;;;;; -130D8;EGYPTIAN HIEROGLYPH E007;Lo;0;L;;;;;N;;;;; -130D9;EGYPTIAN HIEROGLYPH E008;Lo;0;L;;;;;N;;;;; -130DA;EGYPTIAN HIEROGLYPH E008A;Lo;0;L;;;;;N;;;;; -130DB;EGYPTIAN HIEROGLYPH E009;Lo;0;L;;;;;N;;;;; -130DC;EGYPTIAN HIEROGLYPH E009A;Lo;0;L;;;;;N;;;;; -130DD;EGYPTIAN HIEROGLYPH E010;Lo;0;L;;;;;N;;;;; -130DE;EGYPTIAN HIEROGLYPH E011;Lo;0;L;;;;;N;;;;; -130DF;EGYPTIAN HIEROGLYPH E012;Lo;0;L;;;;;N;;;;; -130E0;EGYPTIAN HIEROGLYPH E013;Lo;0;L;;;;;N;;;;; -130E1;EGYPTIAN HIEROGLYPH E014;Lo;0;L;;;;;N;;;;; -130E2;EGYPTIAN HIEROGLYPH E015;Lo;0;L;;;;;N;;;;; -130E3;EGYPTIAN HIEROGLYPH E016;Lo;0;L;;;;;N;;;;; -130E4;EGYPTIAN HIEROGLYPH E016A;Lo;0;L;;;;;N;;;;; -130E5;EGYPTIAN HIEROGLYPH E017;Lo;0;L;;;;;N;;;;; -130E6;EGYPTIAN HIEROGLYPH E017A;Lo;0;L;;;;;N;;;;; -130E7;EGYPTIAN HIEROGLYPH E018;Lo;0;L;;;;;N;;;;; -130E8;EGYPTIAN HIEROGLYPH E019;Lo;0;L;;;;;N;;;;; -130E9;EGYPTIAN HIEROGLYPH E020;Lo;0;L;;;;;N;;;;; -130EA;EGYPTIAN HIEROGLYPH E020A;Lo;0;L;;;;;N;;;;; -130EB;EGYPTIAN HIEROGLYPH E021;Lo;0;L;;;;;N;;;;; -130EC;EGYPTIAN HIEROGLYPH E022;Lo;0;L;;;;;N;;;;; -130ED;EGYPTIAN HIEROGLYPH E023;Lo;0;L;;;;;N;;;;; -130EE;EGYPTIAN HIEROGLYPH E024;Lo;0;L;;;;;N;;;;; -130EF;EGYPTIAN HIEROGLYPH E025;Lo;0;L;;;;;N;;;;; -130F0;EGYPTIAN HIEROGLYPH E026;Lo;0;L;;;;;N;;;;; -130F1;EGYPTIAN HIEROGLYPH E027;Lo;0;L;;;;;N;;;;; -130F2;EGYPTIAN HIEROGLYPH E028;Lo;0;L;;;;;N;;;;; -130F3;EGYPTIAN HIEROGLYPH E028A;Lo;0;L;;;;;N;;;;; -130F4;EGYPTIAN HIEROGLYPH E029;Lo;0;L;;;;;N;;;;; -130F5;EGYPTIAN HIEROGLYPH E030;Lo;0;L;;;;;N;;;;; -130F6;EGYPTIAN HIEROGLYPH E031;Lo;0;L;;;;;N;;;;; -130F7;EGYPTIAN HIEROGLYPH E032;Lo;0;L;;;;;N;;;;; -130F8;EGYPTIAN HIEROGLYPH E033;Lo;0;L;;;;;N;;;;; -130F9;EGYPTIAN HIEROGLYPH E034;Lo;0;L;;;;;N;;;;; -130FA;EGYPTIAN HIEROGLYPH E034A;Lo;0;L;;;;;N;;;;; -130FB;EGYPTIAN HIEROGLYPH E036;Lo;0;L;;;;;N;;;;; -130FC;EGYPTIAN HIEROGLYPH E037;Lo;0;L;;;;;N;;;;; -130FD;EGYPTIAN HIEROGLYPH E038;Lo;0;L;;;;;N;;;;; -130FE;EGYPTIAN HIEROGLYPH F001;Lo;0;L;;;;;N;;;;; -130FF;EGYPTIAN HIEROGLYPH F001A;Lo;0;L;;;;;N;;;;; -13100;EGYPTIAN HIEROGLYPH F002;Lo;0;L;;;;;N;;;;; -13101;EGYPTIAN HIEROGLYPH F003;Lo;0;L;;;;;N;;;;; -13102;EGYPTIAN HIEROGLYPH F004;Lo;0;L;;;;;N;;;;; -13103;EGYPTIAN HIEROGLYPH F005;Lo;0;L;;;;;N;;;;; -13104;EGYPTIAN HIEROGLYPH F006;Lo;0;L;;;;;N;;;;; -13105;EGYPTIAN HIEROGLYPH F007;Lo;0;L;;;;;N;;;;; -13106;EGYPTIAN HIEROGLYPH F008;Lo;0;L;;;;;N;;;;; -13107;EGYPTIAN HIEROGLYPH F009;Lo;0;L;;;;;N;;;;; -13108;EGYPTIAN HIEROGLYPH F010;Lo;0;L;;;;;N;;;;; -13109;EGYPTIAN HIEROGLYPH F011;Lo;0;L;;;;;N;;;;; -1310A;EGYPTIAN HIEROGLYPH F012;Lo;0;L;;;;;N;;;;; -1310B;EGYPTIAN HIEROGLYPH F013;Lo;0;L;;;;;N;;;;; -1310C;EGYPTIAN HIEROGLYPH F013A;Lo;0;L;;;;;N;;;;; -1310D;EGYPTIAN HIEROGLYPH F014;Lo;0;L;;;;;N;;;;; -1310E;EGYPTIAN HIEROGLYPH F015;Lo;0;L;;;;;N;;;;; -1310F;EGYPTIAN HIEROGLYPH F016;Lo;0;L;;;;;N;;;;; -13110;EGYPTIAN HIEROGLYPH F017;Lo;0;L;;;;;N;;;;; -13111;EGYPTIAN HIEROGLYPH F018;Lo;0;L;;;;;N;;;;; -13112;EGYPTIAN HIEROGLYPH F019;Lo;0;L;;;;;N;;;;; -13113;EGYPTIAN HIEROGLYPH F020;Lo;0;L;;;;;N;;;;; -13114;EGYPTIAN HIEROGLYPH F021;Lo;0;L;;;;;N;;;;; -13115;EGYPTIAN HIEROGLYPH F021A;Lo;0;L;;;;;N;;;;; -13116;EGYPTIAN HIEROGLYPH F022;Lo;0;L;;;;;N;;;;; -13117;EGYPTIAN HIEROGLYPH F023;Lo;0;L;;;;;N;;;;; -13118;EGYPTIAN HIEROGLYPH F024;Lo;0;L;;;;;N;;;;; -13119;EGYPTIAN HIEROGLYPH F025;Lo;0;L;;;;;N;;;;; -1311A;EGYPTIAN HIEROGLYPH F026;Lo;0;L;;;;;N;;;;; -1311B;EGYPTIAN HIEROGLYPH F027;Lo;0;L;;;;;N;;;;; -1311C;EGYPTIAN HIEROGLYPH F028;Lo;0;L;;;;;N;;;;; -1311D;EGYPTIAN HIEROGLYPH F029;Lo;0;L;;;;;N;;;;; -1311E;EGYPTIAN HIEROGLYPH F030;Lo;0;L;;;;;N;;;;; -1311F;EGYPTIAN HIEROGLYPH F031;Lo;0;L;;;;;N;;;;; -13120;EGYPTIAN HIEROGLYPH F031A;Lo;0;L;;;;;N;;;;; -13121;EGYPTIAN HIEROGLYPH F032;Lo;0;L;;;;;N;;;;; -13122;EGYPTIAN HIEROGLYPH F033;Lo;0;L;;;;;N;;;;; -13123;EGYPTIAN HIEROGLYPH F034;Lo;0;L;;;;;N;;;;; -13124;EGYPTIAN HIEROGLYPH F035;Lo;0;L;;;;;N;;;;; -13125;EGYPTIAN HIEROGLYPH F036;Lo;0;L;;;;;N;;;;; -13126;EGYPTIAN HIEROGLYPH F037;Lo;0;L;;;;;N;;;;; -13127;EGYPTIAN HIEROGLYPH F037A;Lo;0;L;;;;;N;;;;; -13128;EGYPTIAN HIEROGLYPH F038;Lo;0;L;;;;;N;;;;; -13129;EGYPTIAN HIEROGLYPH F038A;Lo;0;L;;;;;N;;;;; -1312A;EGYPTIAN HIEROGLYPH F039;Lo;0;L;;;;;N;;;;; -1312B;EGYPTIAN HIEROGLYPH F040;Lo;0;L;;;;;N;;;;; -1312C;EGYPTIAN HIEROGLYPH F041;Lo;0;L;;;;;N;;;;; -1312D;EGYPTIAN HIEROGLYPH F042;Lo;0;L;;;;;N;;;;; -1312E;EGYPTIAN HIEROGLYPH F043;Lo;0;L;;;;;N;;;;; -1312F;EGYPTIAN HIEROGLYPH F044;Lo;0;L;;;;;N;;;;; -13130;EGYPTIAN HIEROGLYPH F045;Lo;0;L;;;;;N;;;;; -13131;EGYPTIAN HIEROGLYPH F045A;Lo;0;L;;;;;N;;;;; -13132;EGYPTIAN HIEROGLYPH F046;Lo;0;L;;;;;N;;;;; -13133;EGYPTIAN HIEROGLYPH F046A;Lo;0;L;;;;;N;;;;; -13134;EGYPTIAN HIEROGLYPH F047;Lo;0;L;;;;;N;;;;; -13135;EGYPTIAN HIEROGLYPH F047A;Lo;0;L;;;;;N;;;;; -13136;EGYPTIAN HIEROGLYPH F048;Lo;0;L;;;;;N;;;;; -13137;EGYPTIAN HIEROGLYPH F049;Lo;0;L;;;;;N;;;;; -13138;EGYPTIAN HIEROGLYPH F050;Lo;0;L;;;;;N;;;;; -13139;EGYPTIAN HIEROGLYPH F051;Lo;0;L;;;;;N;;;;; -1313A;EGYPTIAN HIEROGLYPH F051A;Lo;0;L;;;;;N;;;;; -1313B;EGYPTIAN HIEROGLYPH F051B;Lo;0;L;;;;;N;;;;; -1313C;EGYPTIAN HIEROGLYPH F051C;Lo;0;L;;;;;N;;;;; -1313D;EGYPTIAN HIEROGLYPH F052;Lo;0;L;;;;;N;;;;; -1313E;EGYPTIAN HIEROGLYPH F053;Lo;0;L;;;;;N;;;;; -1313F;EGYPTIAN HIEROGLYPH G001;Lo;0;L;;;;;N;;;;; -13140;EGYPTIAN HIEROGLYPH G002;Lo;0;L;;;;;N;;;;; -13141;EGYPTIAN HIEROGLYPH G003;Lo;0;L;;;;;N;;;;; -13142;EGYPTIAN HIEROGLYPH G004;Lo;0;L;;;;;N;;;;; -13143;EGYPTIAN HIEROGLYPH G005;Lo;0;L;;;;;N;;;;; -13144;EGYPTIAN HIEROGLYPH G006;Lo;0;L;;;;;N;;;;; -13145;EGYPTIAN HIEROGLYPH G006A;Lo;0;L;;;;;N;;;;; -13146;EGYPTIAN HIEROGLYPH G007;Lo;0;L;;;;;N;;;;; -13147;EGYPTIAN HIEROGLYPH G007A;Lo;0;L;;;;;N;;;;; -13148;EGYPTIAN HIEROGLYPH G007B;Lo;0;L;;;;;N;;;;; -13149;EGYPTIAN HIEROGLYPH G008;Lo;0;L;;;;;N;;;;; -1314A;EGYPTIAN HIEROGLYPH G009;Lo;0;L;;;;;N;;;;; -1314B;EGYPTIAN HIEROGLYPH G010;Lo;0;L;;;;;N;;;;; -1314C;EGYPTIAN HIEROGLYPH G011;Lo;0;L;;;;;N;;;;; -1314D;EGYPTIAN HIEROGLYPH G011A;Lo;0;L;;;;;N;;;;; -1314E;EGYPTIAN HIEROGLYPH G012;Lo;0;L;;;;;N;;;;; -1314F;EGYPTIAN HIEROGLYPH G013;Lo;0;L;;;;;N;;;;; -13150;EGYPTIAN HIEROGLYPH G014;Lo;0;L;;;;;N;;;;; -13151;EGYPTIAN HIEROGLYPH G015;Lo;0;L;;;;;N;;;;; -13152;EGYPTIAN HIEROGLYPH G016;Lo;0;L;;;;;N;;;;; -13153;EGYPTIAN HIEROGLYPH G017;Lo;0;L;;;;;N;;;;; -13154;EGYPTIAN HIEROGLYPH G018;Lo;0;L;;;;;N;;;;; -13155;EGYPTIAN HIEROGLYPH G019;Lo;0;L;;;;;N;;;;; -13156;EGYPTIAN HIEROGLYPH G020;Lo;0;L;;;;;N;;;;; -13157;EGYPTIAN HIEROGLYPH G020A;Lo;0;L;;;;;N;;;;; -13158;EGYPTIAN HIEROGLYPH G021;Lo;0;L;;;;;N;;;;; -13159;EGYPTIAN HIEROGLYPH G022;Lo;0;L;;;;;N;;;;; -1315A;EGYPTIAN HIEROGLYPH G023;Lo;0;L;;;;;N;;;;; -1315B;EGYPTIAN HIEROGLYPH G024;Lo;0;L;;;;;N;;;;; -1315C;EGYPTIAN HIEROGLYPH G025;Lo;0;L;;;;;N;;;;; -1315D;EGYPTIAN HIEROGLYPH G026;Lo;0;L;;;;;N;;;;; -1315E;EGYPTIAN HIEROGLYPH G026A;Lo;0;L;;;;;N;;;;; -1315F;EGYPTIAN HIEROGLYPH G027;Lo;0;L;;;;;N;;;;; -13160;EGYPTIAN HIEROGLYPH G028;Lo;0;L;;;;;N;;;;; -13161;EGYPTIAN HIEROGLYPH G029;Lo;0;L;;;;;N;;;;; -13162;EGYPTIAN HIEROGLYPH G030;Lo;0;L;;;;;N;;;;; -13163;EGYPTIAN HIEROGLYPH G031;Lo;0;L;;;;;N;;;;; -13164;EGYPTIAN HIEROGLYPH G032;Lo;0;L;;;;;N;;;;; -13165;EGYPTIAN HIEROGLYPH G033;Lo;0;L;;;;;N;;;;; -13166;EGYPTIAN HIEROGLYPH G034;Lo;0;L;;;;;N;;;;; -13167;EGYPTIAN HIEROGLYPH G035;Lo;0;L;;;;;N;;;;; -13168;EGYPTIAN HIEROGLYPH G036;Lo;0;L;;;;;N;;;;; -13169;EGYPTIAN HIEROGLYPH G036A;Lo;0;L;;;;;N;;;;; -1316A;EGYPTIAN HIEROGLYPH G037;Lo;0;L;;;;;N;;;;; -1316B;EGYPTIAN HIEROGLYPH G037A;Lo;0;L;;;;;N;;;;; -1316C;EGYPTIAN HIEROGLYPH G038;Lo;0;L;;;;;N;;;;; -1316D;EGYPTIAN HIEROGLYPH G039;Lo;0;L;;;;;N;;;;; -1316E;EGYPTIAN HIEROGLYPH G040;Lo;0;L;;;;;N;;;;; -1316F;EGYPTIAN HIEROGLYPH G041;Lo;0;L;;;;;N;;;;; -13170;EGYPTIAN HIEROGLYPH G042;Lo;0;L;;;;;N;;;;; -13171;EGYPTIAN HIEROGLYPH G043;Lo;0;L;;;;;N;;;;; -13172;EGYPTIAN HIEROGLYPH G043A;Lo;0;L;;;;;N;;;;; -13173;EGYPTIAN HIEROGLYPH G044;Lo;0;L;;;;;N;;;;; -13174;EGYPTIAN HIEROGLYPH G045;Lo;0;L;;;;;N;;;;; -13175;EGYPTIAN HIEROGLYPH G045A;Lo;0;L;;;;;N;;;;; -13176;EGYPTIAN HIEROGLYPH G046;Lo;0;L;;;;;N;;;;; -13177;EGYPTIAN HIEROGLYPH G047;Lo;0;L;;;;;N;;;;; -13178;EGYPTIAN HIEROGLYPH G048;Lo;0;L;;;;;N;;;;; -13179;EGYPTIAN HIEROGLYPH G049;Lo;0;L;;;;;N;;;;; -1317A;EGYPTIAN HIEROGLYPH G050;Lo;0;L;;;;;N;;;;; -1317B;EGYPTIAN HIEROGLYPH G051;Lo;0;L;;;;;N;;;;; -1317C;EGYPTIAN HIEROGLYPH G052;Lo;0;L;;;;;N;;;;; -1317D;EGYPTIAN HIEROGLYPH G053;Lo;0;L;;;;;N;;;;; -1317E;EGYPTIAN HIEROGLYPH G054;Lo;0;L;;;;;N;;;;; -1317F;EGYPTIAN HIEROGLYPH H001;Lo;0;L;;;;;N;;;;; -13180;EGYPTIAN HIEROGLYPH H002;Lo;0;L;;;;;N;;;;; -13181;EGYPTIAN HIEROGLYPH H003;Lo;0;L;;;;;N;;;;; -13182;EGYPTIAN HIEROGLYPH H004;Lo;0;L;;;;;N;;;;; -13183;EGYPTIAN HIEROGLYPH H005;Lo;0;L;;;;;N;;;;; -13184;EGYPTIAN HIEROGLYPH H006;Lo;0;L;;;;;N;;;;; -13185;EGYPTIAN HIEROGLYPH H006A;Lo;0;L;;;;;N;;;;; -13186;EGYPTIAN HIEROGLYPH H007;Lo;0;L;;;;;N;;;;; -13187;EGYPTIAN HIEROGLYPH H008;Lo;0;L;;;;;N;;;;; -13188;EGYPTIAN HIEROGLYPH I001;Lo;0;L;;;;;N;;;;; -13189;EGYPTIAN HIEROGLYPH I002;Lo;0;L;;;;;N;;;;; -1318A;EGYPTIAN HIEROGLYPH I003;Lo;0;L;;;;;N;;;;; -1318B;EGYPTIAN HIEROGLYPH I004;Lo;0;L;;;;;N;;;;; -1318C;EGYPTIAN HIEROGLYPH I005;Lo;0;L;;;;;N;;;;; -1318D;EGYPTIAN HIEROGLYPH I005A;Lo;0;L;;;;;N;;;;; -1318E;EGYPTIAN HIEROGLYPH I006;Lo;0;L;;;;;N;;;;; -1318F;EGYPTIAN HIEROGLYPH I007;Lo;0;L;;;;;N;;;;; -13190;EGYPTIAN HIEROGLYPH I008;Lo;0;L;;;;;N;;;;; -13191;EGYPTIAN HIEROGLYPH I009;Lo;0;L;;;;;N;;;;; -13192;EGYPTIAN HIEROGLYPH I009A;Lo;0;L;;;;;N;;;;; -13193;EGYPTIAN HIEROGLYPH I010;Lo;0;L;;;;;N;;;;; -13194;EGYPTIAN HIEROGLYPH I010A;Lo;0;L;;;;;N;;;;; -13195;EGYPTIAN HIEROGLYPH I011;Lo;0;L;;;;;N;;;;; -13196;EGYPTIAN HIEROGLYPH I011A;Lo;0;L;;;;;N;;;;; -13197;EGYPTIAN HIEROGLYPH I012;Lo;0;L;;;;;N;;;;; -13198;EGYPTIAN HIEROGLYPH I013;Lo;0;L;;;;;N;;;;; -13199;EGYPTIAN HIEROGLYPH I014;Lo;0;L;;;;;N;;;;; -1319A;EGYPTIAN HIEROGLYPH I015;Lo;0;L;;;;;N;;;;; -1319B;EGYPTIAN HIEROGLYPH K001;Lo;0;L;;;;;N;;;;; -1319C;EGYPTIAN HIEROGLYPH K002;Lo;0;L;;;;;N;;;;; -1319D;EGYPTIAN HIEROGLYPH K003;Lo;0;L;;;;;N;;;;; -1319E;EGYPTIAN HIEROGLYPH K004;Lo;0;L;;;;;N;;;;; -1319F;EGYPTIAN HIEROGLYPH K005;Lo;0;L;;;;;N;;;;; -131A0;EGYPTIAN HIEROGLYPH K006;Lo;0;L;;;;;N;;;;; -131A1;EGYPTIAN HIEROGLYPH K007;Lo;0;L;;;;;N;;;;; -131A2;EGYPTIAN HIEROGLYPH K008;Lo;0;L;;;;;N;;;;; -131A3;EGYPTIAN HIEROGLYPH L001;Lo;0;L;;;;;N;;;;; -131A4;EGYPTIAN HIEROGLYPH L002;Lo;0;L;;;;;N;;;;; -131A5;EGYPTIAN HIEROGLYPH L002A;Lo;0;L;;;;;N;;;;; -131A6;EGYPTIAN HIEROGLYPH L003;Lo;0;L;;;;;N;;;;; -131A7;EGYPTIAN HIEROGLYPH L004;Lo;0;L;;;;;N;;;;; -131A8;EGYPTIAN HIEROGLYPH L005;Lo;0;L;;;;;N;;;;; -131A9;EGYPTIAN HIEROGLYPH L006;Lo;0;L;;;;;N;;;;; -131AA;EGYPTIAN HIEROGLYPH L006A;Lo;0;L;;;;;N;;;;; -131AB;EGYPTIAN HIEROGLYPH L007;Lo;0;L;;;;;N;;;;; -131AC;EGYPTIAN HIEROGLYPH L008;Lo;0;L;;;;;N;;;;; -131AD;EGYPTIAN HIEROGLYPH M001;Lo;0;L;;;;;N;;;;; -131AE;EGYPTIAN HIEROGLYPH M001A;Lo;0;L;;;;;N;;;;; -131AF;EGYPTIAN HIEROGLYPH M001B;Lo;0;L;;;;;N;;;;; -131B0;EGYPTIAN HIEROGLYPH M002;Lo;0;L;;;;;N;;;;; -131B1;EGYPTIAN HIEROGLYPH M003;Lo;0;L;;;;;N;;;;; -131B2;EGYPTIAN HIEROGLYPH M003A;Lo;0;L;;;;;N;;;;; -131B3;EGYPTIAN HIEROGLYPH M004;Lo;0;L;;;;;N;;;;; -131B4;EGYPTIAN HIEROGLYPH M005;Lo;0;L;;;;;N;;;;; -131B5;EGYPTIAN HIEROGLYPH M006;Lo;0;L;;;;;N;;;;; -131B6;EGYPTIAN HIEROGLYPH M007;Lo;0;L;;;;;N;;;;; -131B7;EGYPTIAN HIEROGLYPH M008;Lo;0;L;;;;;N;;;;; -131B8;EGYPTIAN HIEROGLYPH M009;Lo;0;L;;;;;N;;;;; -131B9;EGYPTIAN HIEROGLYPH M010;Lo;0;L;;;;;N;;;;; -131BA;EGYPTIAN HIEROGLYPH M010A;Lo;0;L;;;;;N;;;;; -131BB;EGYPTIAN HIEROGLYPH M011;Lo;0;L;;;;;N;;;;; -131BC;EGYPTIAN HIEROGLYPH M012;Lo;0;L;;;;;N;;;;; -131BD;EGYPTIAN HIEROGLYPH M012A;Lo;0;L;;;;;N;;;;; -131BE;EGYPTIAN HIEROGLYPH M012B;Lo;0;L;;;;;N;;;;; -131BF;EGYPTIAN HIEROGLYPH M012C;Lo;0;L;;;;;N;;;;; -131C0;EGYPTIAN HIEROGLYPH M012D;Lo;0;L;;;;;N;;;;; -131C1;EGYPTIAN HIEROGLYPH M012E;Lo;0;L;;;;;N;;;;; -131C2;EGYPTIAN HIEROGLYPH M012F;Lo;0;L;;;;;N;;;;; -131C3;EGYPTIAN HIEROGLYPH M012G;Lo;0;L;;;;;N;;;;; -131C4;EGYPTIAN HIEROGLYPH M012H;Lo;0;L;;;;;N;;;;; -131C5;EGYPTIAN HIEROGLYPH M013;Lo;0;L;;;;;N;;;;; -131C6;EGYPTIAN HIEROGLYPH M014;Lo;0;L;;;;;N;;;;; -131C7;EGYPTIAN HIEROGLYPH M015;Lo;0;L;;;;;N;;;;; -131C8;EGYPTIAN HIEROGLYPH M015A;Lo;0;L;;;;;N;;;;; -131C9;EGYPTIAN HIEROGLYPH M016;Lo;0;L;;;;;N;;;;; -131CA;EGYPTIAN HIEROGLYPH M016A;Lo;0;L;;;;;N;;;;; -131CB;EGYPTIAN HIEROGLYPH M017;Lo;0;L;;;;;N;;;;; -131CC;EGYPTIAN HIEROGLYPH M017A;Lo;0;L;;;;;N;;;;; -131CD;EGYPTIAN HIEROGLYPH M018;Lo;0;L;;;;;N;;;;; -131CE;EGYPTIAN HIEROGLYPH M019;Lo;0;L;;;;;N;;;;; -131CF;EGYPTIAN HIEROGLYPH M020;Lo;0;L;;;;;N;;;;; -131D0;EGYPTIAN HIEROGLYPH M021;Lo;0;L;;;;;N;;;;; -131D1;EGYPTIAN HIEROGLYPH M022;Lo;0;L;;;;;N;;;;; -131D2;EGYPTIAN HIEROGLYPH M022A;Lo;0;L;;;;;N;;;;; -131D3;EGYPTIAN HIEROGLYPH M023;Lo;0;L;;;;;N;;;;; -131D4;EGYPTIAN HIEROGLYPH M024;Lo;0;L;;;;;N;;;;; -131D5;EGYPTIAN HIEROGLYPH M024A;Lo;0;L;;;;;N;;;;; -131D6;EGYPTIAN HIEROGLYPH M025;Lo;0;L;;;;;N;;;;; -131D7;EGYPTIAN HIEROGLYPH M026;Lo;0;L;;;;;N;;;;; -131D8;EGYPTIAN HIEROGLYPH M027;Lo;0;L;;;;;N;;;;; -131D9;EGYPTIAN HIEROGLYPH M028;Lo;0;L;;;;;N;;;;; -131DA;EGYPTIAN HIEROGLYPH M028A;Lo;0;L;;;;;N;;;;; -131DB;EGYPTIAN HIEROGLYPH M029;Lo;0;L;;;;;N;;;;; -131DC;EGYPTIAN HIEROGLYPH M030;Lo;0;L;;;;;N;;;;; -131DD;EGYPTIAN HIEROGLYPH M031;Lo;0;L;;;;;N;;;;; -131DE;EGYPTIAN HIEROGLYPH M031A;Lo;0;L;;;;;N;;;;; -131DF;EGYPTIAN HIEROGLYPH M032;Lo;0;L;;;;;N;;;;; -131E0;EGYPTIAN HIEROGLYPH M033;Lo;0;L;;;;;N;;;;; -131E1;EGYPTIAN HIEROGLYPH M033A;Lo;0;L;;;;;N;;;;; -131E2;EGYPTIAN HIEROGLYPH M033B;Lo;0;L;;;;;N;;;;; -131E3;EGYPTIAN HIEROGLYPH M034;Lo;0;L;;;;;N;;;;; -131E4;EGYPTIAN HIEROGLYPH M035;Lo;0;L;;;;;N;;;;; -131E5;EGYPTIAN HIEROGLYPH M036;Lo;0;L;;;;;N;;;;; -131E6;EGYPTIAN HIEROGLYPH M037;Lo;0;L;;;;;N;;;;; -131E7;EGYPTIAN HIEROGLYPH M038;Lo;0;L;;;;;N;;;;; -131E8;EGYPTIAN HIEROGLYPH M039;Lo;0;L;;;;;N;;;;; -131E9;EGYPTIAN HIEROGLYPH M040;Lo;0;L;;;;;N;;;;; -131EA;EGYPTIAN HIEROGLYPH M040A;Lo;0;L;;;;;N;;;;; -131EB;EGYPTIAN HIEROGLYPH M041;Lo;0;L;;;;;N;;;;; -131EC;EGYPTIAN HIEROGLYPH M042;Lo;0;L;;;;;N;;;;; -131ED;EGYPTIAN HIEROGLYPH M043;Lo;0;L;;;;;N;;;;; -131EE;EGYPTIAN HIEROGLYPH M044;Lo;0;L;;;;;N;;;;; -131EF;EGYPTIAN HIEROGLYPH N001;Lo;0;L;;;;;N;;;;; -131F0;EGYPTIAN HIEROGLYPH N002;Lo;0;L;;;;;N;;;;; -131F1;EGYPTIAN HIEROGLYPH N003;Lo;0;L;;;;;N;;;;; -131F2;EGYPTIAN HIEROGLYPH N004;Lo;0;L;;;;;N;;;;; -131F3;EGYPTIAN HIEROGLYPH N005;Lo;0;L;;;;;N;;;;; -131F4;EGYPTIAN HIEROGLYPH N006;Lo;0;L;;;;;N;;;;; -131F5;EGYPTIAN HIEROGLYPH N007;Lo;0;L;;;;;N;;;;; -131F6;EGYPTIAN HIEROGLYPH N008;Lo;0;L;;;;;N;;;;; -131F7;EGYPTIAN HIEROGLYPH N009;Lo;0;L;;;;;N;;;;; -131F8;EGYPTIAN HIEROGLYPH N010;Lo;0;L;;;;;N;;;;; -131F9;EGYPTIAN HIEROGLYPH N011;Lo;0;L;;;;;N;;;;; -131FA;EGYPTIAN HIEROGLYPH N012;Lo;0;L;;;;;N;;;;; -131FB;EGYPTIAN HIEROGLYPH N013;Lo;0;L;;;;;N;;;;; -131FC;EGYPTIAN HIEROGLYPH N014;Lo;0;L;;;;;N;;;;; -131FD;EGYPTIAN HIEROGLYPH N015;Lo;0;L;;;;;N;;;;; -131FE;EGYPTIAN HIEROGLYPH N016;Lo;0;L;;;;;N;;;;; -131FF;EGYPTIAN HIEROGLYPH N017;Lo;0;L;;;;;N;;;;; -13200;EGYPTIAN HIEROGLYPH N018;Lo;0;L;;;;;N;;;;; -13201;EGYPTIAN HIEROGLYPH N018A;Lo;0;L;;;;;N;;;;; -13202;EGYPTIAN HIEROGLYPH N018B;Lo;0;L;;;;;N;;;;; -13203;EGYPTIAN HIEROGLYPH N019;Lo;0;L;;;;;N;;;;; -13204;EGYPTIAN HIEROGLYPH N020;Lo;0;L;;;;;N;;;;; -13205;EGYPTIAN HIEROGLYPH N021;Lo;0;L;;;;;N;;;;; -13206;EGYPTIAN HIEROGLYPH N022;Lo;0;L;;;;;N;;;;; -13207;EGYPTIAN HIEROGLYPH N023;Lo;0;L;;;;;N;;;;; -13208;EGYPTIAN HIEROGLYPH N024;Lo;0;L;;;;;N;;;;; -13209;EGYPTIAN HIEROGLYPH N025;Lo;0;L;;;;;N;;;;; -1320A;EGYPTIAN HIEROGLYPH N025A;Lo;0;L;;;;;N;;;;; -1320B;EGYPTIAN HIEROGLYPH N026;Lo;0;L;;;;;N;;;;; -1320C;EGYPTIAN HIEROGLYPH N027;Lo;0;L;;;;;N;;;;; -1320D;EGYPTIAN HIEROGLYPH N028;Lo;0;L;;;;;N;;;;; -1320E;EGYPTIAN HIEROGLYPH N029;Lo;0;L;;;;;N;;;;; -1320F;EGYPTIAN HIEROGLYPH N030;Lo;0;L;;;;;N;;;;; -13210;EGYPTIAN HIEROGLYPH N031;Lo;0;L;;;;;N;;;;; -13211;EGYPTIAN HIEROGLYPH N032;Lo;0;L;;;;;N;;;;; -13212;EGYPTIAN HIEROGLYPH N033;Lo;0;L;;;;;N;;;;; -13213;EGYPTIAN HIEROGLYPH N033A;Lo;0;L;;;;;N;;;;; -13214;EGYPTIAN HIEROGLYPH N034;Lo;0;L;;;;;N;;;;; -13215;EGYPTIAN HIEROGLYPH N034A;Lo;0;L;;;;;N;;;;; -13216;EGYPTIAN HIEROGLYPH N035;Lo;0;L;;;;;N;;;;; -13217;EGYPTIAN HIEROGLYPH N035A;Lo;0;L;;;;;N;;;;; -13218;EGYPTIAN HIEROGLYPH N036;Lo;0;L;;;;;N;;;;; -13219;EGYPTIAN HIEROGLYPH N037;Lo;0;L;;;;;N;;;;; -1321A;EGYPTIAN HIEROGLYPH N037A;Lo;0;L;;;;;N;;;;; -1321B;EGYPTIAN HIEROGLYPH N038;Lo;0;L;;;;;N;;;;; -1321C;EGYPTIAN HIEROGLYPH N039;Lo;0;L;;;;;N;;;;; -1321D;EGYPTIAN HIEROGLYPH N040;Lo;0;L;;;;;N;;;;; -1321E;EGYPTIAN HIEROGLYPH N041;Lo;0;L;;;;;N;;;;; -1321F;EGYPTIAN HIEROGLYPH N042;Lo;0;L;;;;;N;;;;; -13220;EGYPTIAN HIEROGLYPH NL001;Lo;0;L;;;;;N;;;;; -13221;EGYPTIAN HIEROGLYPH NL002;Lo;0;L;;;;;N;;;;; -13222;EGYPTIAN HIEROGLYPH NL003;Lo;0;L;;;;;N;;;;; -13223;EGYPTIAN HIEROGLYPH NL004;Lo;0;L;;;;;N;;;;; -13224;EGYPTIAN HIEROGLYPH NL005;Lo;0;L;;;;;N;;;;; -13225;EGYPTIAN HIEROGLYPH NL005A;Lo;0;L;;;;;N;;;;; -13226;EGYPTIAN HIEROGLYPH NL006;Lo;0;L;;;;;N;;;;; -13227;EGYPTIAN HIEROGLYPH NL007;Lo;0;L;;;;;N;;;;; -13228;EGYPTIAN HIEROGLYPH NL008;Lo;0;L;;;;;N;;;;; -13229;EGYPTIAN HIEROGLYPH NL009;Lo;0;L;;;;;N;;;;; -1322A;EGYPTIAN HIEROGLYPH NL010;Lo;0;L;;;;;N;;;;; -1322B;EGYPTIAN HIEROGLYPH NL011;Lo;0;L;;;;;N;;;;; -1322C;EGYPTIAN HIEROGLYPH NL012;Lo;0;L;;;;;N;;;;; -1322D;EGYPTIAN HIEROGLYPH NL013;Lo;0;L;;;;;N;;;;; -1322E;EGYPTIAN HIEROGLYPH NL014;Lo;0;L;;;;;N;;;;; -1322F;EGYPTIAN HIEROGLYPH NL015;Lo;0;L;;;;;N;;;;; -13230;EGYPTIAN HIEROGLYPH NL016;Lo;0;L;;;;;N;;;;; -13231;EGYPTIAN HIEROGLYPH NL017;Lo;0;L;;;;;N;;;;; -13232;EGYPTIAN HIEROGLYPH NL017A;Lo;0;L;;;;;N;;;;; -13233;EGYPTIAN HIEROGLYPH NL018;Lo;0;L;;;;;N;;;;; -13234;EGYPTIAN HIEROGLYPH NL019;Lo;0;L;;;;;N;;;;; -13235;EGYPTIAN HIEROGLYPH NL020;Lo;0;L;;;;;N;;;;; -13236;EGYPTIAN HIEROGLYPH NU001;Lo;0;L;;;;;N;;;;; -13237;EGYPTIAN HIEROGLYPH NU002;Lo;0;L;;;;;N;;;;; -13238;EGYPTIAN HIEROGLYPH NU003;Lo;0;L;;;;;N;;;;; -13239;EGYPTIAN HIEROGLYPH NU004;Lo;0;L;;;;;N;;;;; -1323A;EGYPTIAN HIEROGLYPH NU005;Lo;0;L;;;;;N;;;;; -1323B;EGYPTIAN HIEROGLYPH NU006;Lo;0;L;;;;;N;;;;; -1323C;EGYPTIAN HIEROGLYPH NU007;Lo;0;L;;;;;N;;;;; -1323D;EGYPTIAN HIEROGLYPH NU008;Lo;0;L;;;;;N;;;;; -1323E;EGYPTIAN HIEROGLYPH NU009;Lo;0;L;;;;;N;;;;; -1323F;EGYPTIAN HIEROGLYPH NU010;Lo;0;L;;;;;N;;;;; -13240;EGYPTIAN HIEROGLYPH NU010A;Lo;0;L;;;;;N;;;;; -13241;EGYPTIAN HIEROGLYPH NU011;Lo;0;L;;;;;N;;;;; -13242;EGYPTIAN HIEROGLYPH NU011A;Lo;0;L;;;;;N;;;;; -13243;EGYPTIAN HIEROGLYPH NU012;Lo;0;L;;;;;N;;;;; -13244;EGYPTIAN HIEROGLYPH NU013;Lo;0;L;;;;;N;;;;; -13245;EGYPTIAN HIEROGLYPH NU014;Lo;0;L;;;;;N;;;;; -13246;EGYPTIAN HIEROGLYPH NU015;Lo;0;L;;;;;N;;;;; -13247;EGYPTIAN HIEROGLYPH NU016;Lo;0;L;;;;;N;;;;; -13248;EGYPTIAN HIEROGLYPH NU017;Lo;0;L;;;;;N;;;;; -13249;EGYPTIAN HIEROGLYPH NU018;Lo;0;L;;;;;N;;;;; -1324A;EGYPTIAN HIEROGLYPH NU018A;Lo;0;L;;;;;N;;;;; -1324B;EGYPTIAN HIEROGLYPH NU019;Lo;0;L;;;;;N;;;;; -1324C;EGYPTIAN HIEROGLYPH NU020;Lo;0;L;;;;;N;;;;; -1324D;EGYPTIAN HIEROGLYPH NU021;Lo;0;L;;;;;N;;;;; -1324E;EGYPTIAN HIEROGLYPH NU022;Lo;0;L;;;;;N;;;;; -1324F;EGYPTIAN HIEROGLYPH NU022A;Lo;0;L;;;;;N;;;;; -13250;EGYPTIAN HIEROGLYPH O001;Lo;0;L;;;;;N;;;;; -13251;EGYPTIAN HIEROGLYPH O001A;Lo;0;L;;;;;N;;;;; -13252;EGYPTIAN HIEROGLYPH O002;Lo;0;L;;;;;N;;;;; -13253;EGYPTIAN HIEROGLYPH O003;Lo;0;L;;;;;N;;;;; -13254;EGYPTIAN HIEROGLYPH O004;Lo;0;L;;;;;N;;;;; -13255;EGYPTIAN HIEROGLYPH O005;Lo;0;L;;;;;N;;;;; -13256;EGYPTIAN HIEROGLYPH O005A;Lo;0;L;;;;;N;;;;; -13257;EGYPTIAN HIEROGLYPH O006;Lo;0;L;;;;;N;;;;; -13258;EGYPTIAN HIEROGLYPH O006A;Lo;0;L;;;;;N;;;;; -13259;EGYPTIAN HIEROGLYPH O006B;Lo;0;L;;;;;N;;;;; -1325A;EGYPTIAN HIEROGLYPH O006C;Lo;0;L;;;;;N;;;;; -1325B;EGYPTIAN HIEROGLYPH O006D;Lo;0;L;;;;;N;;;;; -1325C;EGYPTIAN HIEROGLYPH O006E;Lo;0;L;;;;;N;;;;; -1325D;EGYPTIAN HIEROGLYPH O006F;Lo;0;L;;;;;N;;;;; -1325E;EGYPTIAN HIEROGLYPH O007;Lo;0;L;;;;;N;;;;; -1325F;EGYPTIAN HIEROGLYPH O008;Lo;0;L;;;;;N;;;;; -13260;EGYPTIAN HIEROGLYPH O009;Lo;0;L;;;;;N;;;;; -13261;EGYPTIAN HIEROGLYPH O010;Lo;0;L;;;;;N;;;;; -13262;EGYPTIAN HIEROGLYPH O010A;Lo;0;L;;;;;N;;;;; -13263;EGYPTIAN HIEROGLYPH O010B;Lo;0;L;;;;;N;;;;; -13264;EGYPTIAN HIEROGLYPH O010C;Lo;0;L;;;;;N;;;;; -13265;EGYPTIAN HIEROGLYPH O011;Lo;0;L;;;;;N;;;;; -13266;EGYPTIAN HIEROGLYPH O012;Lo;0;L;;;;;N;;;;; -13267;EGYPTIAN HIEROGLYPH O013;Lo;0;L;;;;;N;;;;; -13268;EGYPTIAN HIEROGLYPH O014;Lo;0;L;;;;;N;;;;; -13269;EGYPTIAN HIEROGLYPH O015;Lo;0;L;;;;;N;;;;; -1326A;EGYPTIAN HIEROGLYPH O016;Lo;0;L;;;;;N;;;;; -1326B;EGYPTIAN HIEROGLYPH O017;Lo;0;L;;;;;N;;;;; -1326C;EGYPTIAN HIEROGLYPH O018;Lo;0;L;;;;;N;;;;; -1326D;EGYPTIAN HIEROGLYPH O019;Lo;0;L;;;;;N;;;;; -1326E;EGYPTIAN HIEROGLYPH O019A;Lo;0;L;;;;;N;;;;; -1326F;EGYPTIAN HIEROGLYPH O020;Lo;0;L;;;;;N;;;;; -13270;EGYPTIAN HIEROGLYPH O020A;Lo;0;L;;;;;N;;;;; -13271;EGYPTIAN HIEROGLYPH O021;Lo;0;L;;;;;N;;;;; -13272;EGYPTIAN HIEROGLYPH O022;Lo;0;L;;;;;N;;;;; -13273;EGYPTIAN HIEROGLYPH O023;Lo;0;L;;;;;N;;;;; -13274;EGYPTIAN HIEROGLYPH O024;Lo;0;L;;;;;N;;;;; -13275;EGYPTIAN HIEROGLYPH O024A;Lo;0;L;;;;;N;;;;; -13276;EGYPTIAN HIEROGLYPH O025;Lo;0;L;;;;;N;;;;; -13277;EGYPTIAN HIEROGLYPH O025A;Lo;0;L;;;;;N;;;;; -13278;EGYPTIAN HIEROGLYPH O026;Lo;0;L;;;;;N;;;;; -13279;EGYPTIAN HIEROGLYPH O027;Lo;0;L;;;;;N;;;;; -1327A;EGYPTIAN HIEROGLYPH O028;Lo;0;L;;;;;N;;;;; -1327B;EGYPTIAN HIEROGLYPH O029;Lo;0;L;;;;;N;;;;; -1327C;EGYPTIAN HIEROGLYPH O029A;Lo;0;L;;;;;N;;;;; -1327D;EGYPTIAN HIEROGLYPH O030;Lo;0;L;;;;;N;;;;; -1327E;EGYPTIAN HIEROGLYPH O030A;Lo;0;L;;;;;N;;;;; -1327F;EGYPTIAN HIEROGLYPH O031;Lo;0;L;;;;;N;;;;; -13280;EGYPTIAN HIEROGLYPH O032;Lo;0;L;;;;;N;;;;; -13281;EGYPTIAN HIEROGLYPH O033;Lo;0;L;;;;;N;;;;; -13282;EGYPTIAN HIEROGLYPH O033A;Lo;0;L;;;;;N;;;;; -13283;EGYPTIAN HIEROGLYPH O034;Lo;0;L;;;;;N;;;;; -13284;EGYPTIAN HIEROGLYPH O035;Lo;0;L;;;;;N;;;;; -13285;EGYPTIAN HIEROGLYPH O036;Lo;0;L;;;;;N;;;;; -13286;EGYPTIAN HIEROGLYPH O036A;Lo;0;L;;;;;N;;;;; -13287;EGYPTIAN HIEROGLYPH O036B;Lo;0;L;;;;;N;;;;; -13288;EGYPTIAN HIEROGLYPH O036C;Lo;0;L;;;;;N;;;;; -13289;EGYPTIAN HIEROGLYPH O036D;Lo;0;L;;;;;N;;;;; -1328A;EGYPTIAN HIEROGLYPH O037;Lo;0;L;;;;;N;;;;; -1328B;EGYPTIAN HIEROGLYPH O038;Lo;0;L;;;;;N;;;;; -1328C;EGYPTIAN HIEROGLYPH O039;Lo;0;L;;;;;N;;;;; -1328D;EGYPTIAN HIEROGLYPH O040;Lo;0;L;;;;;N;;;;; -1328E;EGYPTIAN HIEROGLYPH O041;Lo;0;L;;;;;N;;;;; -1328F;EGYPTIAN HIEROGLYPH O042;Lo;0;L;;;;;N;;;;; -13290;EGYPTIAN HIEROGLYPH O043;Lo;0;L;;;;;N;;;;; -13291;EGYPTIAN HIEROGLYPH O044;Lo;0;L;;;;;N;;;;; -13292;EGYPTIAN HIEROGLYPH O045;Lo;0;L;;;;;N;;;;; -13293;EGYPTIAN HIEROGLYPH O046;Lo;0;L;;;;;N;;;;; -13294;EGYPTIAN HIEROGLYPH O047;Lo;0;L;;;;;N;;;;; -13295;EGYPTIAN HIEROGLYPH O048;Lo;0;L;;;;;N;;;;; -13296;EGYPTIAN HIEROGLYPH O049;Lo;0;L;;;;;N;;;;; -13297;EGYPTIAN HIEROGLYPH O050;Lo;0;L;;;;;N;;;;; -13298;EGYPTIAN HIEROGLYPH O050A;Lo;0;L;;;;;N;;;;; -13299;EGYPTIAN HIEROGLYPH O050B;Lo;0;L;;;;;N;;;;; -1329A;EGYPTIAN HIEROGLYPH O051;Lo;0;L;;;;;N;;;;; -1329B;EGYPTIAN HIEROGLYPH P001;Lo;0;L;;;;;N;;;;; -1329C;EGYPTIAN HIEROGLYPH P001A;Lo;0;L;;;;;N;;;;; -1329D;EGYPTIAN HIEROGLYPH P002;Lo;0;L;;;;;N;;;;; -1329E;EGYPTIAN HIEROGLYPH P003;Lo;0;L;;;;;N;;;;; -1329F;EGYPTIAN HIEROGLYPH P003A;Lo;0;L;;;;;N;;;;; -132A0;EGYPTIAN HIEROGLYPH P004;Lo;0;L;;;;;N;;;;; -132A1;EGYPTIAN HIEROGLYPH P005;Lo;0;L;;;;;N;;;;; -132A2;EGYPTIAN HIEROGLYPH P006;Lo;0;L;;;;;N;;;;; -132A3;EGYPTIAN HIEROGLYPH P007;Lo;0;L;;;;;N;;;;; -132A4;EGYPTIAN HIEROGLYPH P008;Lo;0;L;;;;;N;;;;; -132A5;EGYPTIAN HIEROGLYPH P009;Lo;0;L;;;;;N;;;;; -132A6;EGYPTIAN HIEROGLYPH P010;Lo;0;L;;;;;N;;;;; -132A7;EGYPTIAN HIEROGLYPH P011;Lo;0;L;;;;;N;;;;; -132A8;EGYPTIAN HIEROGLYPH Q001;Lo;0;L;;;;;N;;;;; -132A9;EGYPTIAN HIEROGLYPH Q002;Lo;0;L;;;;;N;;;;; -132AA;EGYPTIAN HIEROGLYPH Q003;Lo;0;L;;;;;N;;;;; -132AB;EGYPTIAN HIEROGLYPH Q004;Lo;0;L;;;;;N;;;;; -132AC;EGYPTIAN HIEROGLYPH Q005;Lo;0;L;;;;;N;;;;; -132AD;EGYPTIAN HIEROGLYPH Q006;Lo;0;L;;;;;N;;;;; -132AE;EGYPTIAN HIEROGLYPH Q007;Lo;0;L;;;;;N;;;;; -132AF;EGYPTIAN HIEROGLYPH R001;Lo;0;L;;;;;N;;;;; -132B0;EGYPTIAN HIEROGLYPH R002;Lo;0;L;;;;;N;;;;; -132B1;EGYPTIAN HIEROGLYPH R002A;Lo;0;L;;;;;N;;;;; -132B2;EGYPTIAN HIEROGLYPH R003;Lo;0;L;;;;;N;;;;; -132B3;EGYPTIAN HIEROGLYPH R003A;Lo;0;L;;;;;N;;;;; -132B4;EGYPTIAN HIEROGLYPH R003B;Lo;0;L;;;;;N;;;;; -132B5;EGYPTIAN HIEROGLYPH R004;Lo;0;L;;;;;N;;;;; -132B6;EGYPTIAN HIEROGLYPH R005;Lo;0;L;;;;;N;;;;; -132B7;EGYPTIAN HIEROGLYPH R006;Lo;0;L;;;;;N;;;;; -132B8;EGYPTIAN HIEROGLYPH R007;Lo;0;L;;;;;N;;;;; -132B9;EGYPTIAN HIEROGLYPH R008;Lo;0;L;;;;;N;;;;; -132BA;EGYPTIAN HIEROGLYPH R009;Lo;0;L;;;;;N;;;;; -132BB;EGYPTIAN HIEROGLYPH R010;Lo;0;L;;;;;N;;;;; -132BC;EGYPTIAN HIEROGLYPH R010A;Lo;0;L;;;;;N;;;;; -132BD;EGYPTIAN HIEROGLYPH R011;Lo;0;L;;;;;N;;;;; -132BE;EGYPTIAN HIEROGLYPH R012;Lo;0;L;;;;;N;;;;; -132BF;EGYPTIAN HIEROGLYPH R013;Lo;0;L;;;;;N;;;;; -132C0;EGYPTIAN HIEROGLYPH R014;Lo;0;L;;;;;N;;;;; -132C1;EGYPTIAN HIEROGLYPH R015;Lo;0;L;;;;;N;;;;; -132C2;EGYPTIAN HIEROGLYPH R016;Lo;0;L;;;;;N;;;;; -132C3;EGYPTIAN HIEROGLYPH R016A;Lo;0;L;;;;;N;;;;; -132C4;EGYPTIAN HIEROGLYPH R017;Lo;0;L;;;;;N;;;;; -132C5;EGYPTIAN HIEROGLYPH R018;Lo;0;L;;;;;N;;;;; -132C6;EGYPTIAN HIEROGLYPH R019;Lo;0;L;;;;;N;;;;; -132C7;EGYPTIAN HIEROGLYPH R020;Lo;0;L;;;;;N;;;;; -132C8;EGYPTIAN HIEROGLYPH R021;Lo;0;L;;;;;N;;;;; -132C9;EGYPTIAN HIEROGLYPH R022;Lo;0;L;;;;;N;;;;; -132CA;EGYPTIAN HIEROGLYPH R023;Lo;0;L;;;;;N;;;;; -132CB;EGYPTIAN HIEROGLYPH R024;Lo;0;L;;;;;N;;;;; -132CC;EGYPTIAN HIEROGLYPH R025;Lo;0;L;;;;;N;;;;; -132CD;EGYPTIAN HIEROGLYPH R026;Lo;0;L;;;;;N;;;;; -132CE;EGYPTIAN HIEROGLYPH R027;Lo;0;L;;;;;N;;;;; -132CF;EGYPTIAN HIEROGLYPH R028;Lo;0;L;;;;;N;;;;; -132D0;EGYPTIAN HIEROGLYPH R029;Lo;0;L;;;;;N;;;;; -132D1;EGYPTIAN HIEROGLYPH S001;Lo;0;L;;;;;N;;;;; -132D2;EGYPTIAN HIEROGLYPH S002;Lo;0;L;;;;;N;;;;; -132D3;EGYPTIAN HIEROGLYPH S002A;Lo;0;L;;;;;N;;;;; -132D4;EGYPTIAN HIEROGLYPH S003;Lo;0;L;;;;;N;;;;; -132D5;EGYPTIAN HIEROGLYPH S004;Lo;0;L;;;;;N;;;;; -132D6;EGYPTIAN HIEROGLYPH S005;Lo;0;L;;;;;N;;;;; -132D7;EGYPTIAN HIEROGLYPH S006;Lo;0;L;;;;;N;;;;; -132D8;EGYPTIAN HIEROGLYPH S006A;Lo;0;L;;;;;N;;;;; -132D9;EGYPTIAN HIEROGLYPH S007;Lo;0;L;;;;;N;;;;; -132DA;EGYPTIAN HIEROGLYPH S008;Lo;0;L;;;;;N;;;;; -132DB;EGYPTIAN HIEROGLYPH S009;Lo;0;L;;;;;N;;;;; -132DC;EGYPTIAN HIEROGLYPH S010;Lo;0;L;;;;;N;;;;; -132DD;EGYPTIAN HIEROGLYPH S011;Lo;0;L;;;;;N;;;;; -132DE;EGYPTIAN HIEROGLYPH S012;Lo;0;L;;;;;N;;;;; -132DF;EGYPTIAN HIEROGLYPH S013;Lo;0;L;;;;;N;;;;; -132E0;EGYPTIAN HIEROGLYPH S014;Lo;0;L;;;;;N;;;;; -132E1;EGYPTIAN HIEROGLYPH S014A;Lo;0;L;;;;;N;;;;; -132E2;EGYPTIAN HIEROGLYPH S014B;Lo;0;L;;;;;N;;;;; -132E3;EGYPTIAN HIEROGLYPH S015;Lo;0;L;;;;;N;;;;; -132E4;EGYPTIAN HIEROGLYPH S016;Lo;0;L;;;;;N;;;;; -132E5;EGYPTIAN HIEROGLYPH S017;Lo;0;L;;;;;N;;;;; -132E6;EGYPTIAN HIEROGLYPH S017A;Lo;0;L;;;;;N;;;;; -132E7;EGYPTIAN HIEROGLYPH S018;Lo;0;L;;;;;N;;;;; -132E8;EGYPTIAN HIEROGLYPH S019;Lo;0;L;;;;;N;;;;; -132E9;EGYPTIAN HIEROGLYPH S020;Lo;0;L;;;;;N;;;;; -132EA;EGYPTIAN HIEROGLYPH S021;Lo;0;L;;;;;N;;;;; -132EB;EGYPTIAN HIEROGLYPH S022;Lo;0;L;;;;;N;;;;; -132EC;EGYPTIAN HIEROGLYPH S023;Lo;0;L;;;;;N;;;;; -132ED;EGYPTIAN HIEROGLYPH S024;Lo;0;L;;;;;N;;;;; -132EE;EGYPTIAN HIEROGLYPH S025;Lo;0;L;;;;;N;;;;; -132EF;EGYPTIAN HIEROGLYPH S026;Lo;0;L;;;;;N;;;;; -132F0;EGYPTIAN HIEROGLYPH S026A;Lo;0;L;;;;;N;;;;; -132F1;EGYPTIAN HIEROGLYPH S026B;Lo;0;L;;;;;N;;;;; -132F2;EGYPTIAN HIEROGLYPH S027;Lo;0;L;;;;;N;;;;; -132F3;EGYPTIAN HIEROGLYPH S028;Lo;0;L;;;;;N;;;;; -132F4;EGYPTIAN HIEROGLYPH S029;Lo;0;L;;;;;N;;;;; -132F5;EGYPTIAN HIEROGLYPH S030;Lo;0;L;;;;;N;;;;; -132F6;EGYPTIAN HIEROGLYPH S031;Lo;0;L;;;;;N;;;;; -132F7;EGYPTIAN HIEROGLYPH S032;Lo;0;L;;;;;N;;;;; -132F8;EGYPTIAN HIEROGLYPH S033;Lo;0;L;;;;;N;;;;; -132F9;EGYPTIAN HIEROGLYPH S034;Lo;0;L;;;;;N;;;;; -132FA;EGYPTIAN HIEROGLYPH S035;Lo;0;L;;;;;N;;;;; -132FB;EGYPTIAN HIEROGLYPH S035A;Lo;0;L;;;;;N;;;;; -132FC;EGYPTIAN HIEROGLYPH S036;Lo;0;L;;;;;N;;;;; -132FD;EGYPTIAN HIEROGLYPH S037;Lo;0;L;;;;;N;;;;; -132FE;EGYPTIAN HIEROGLYPH S038;Lo;0;L;;;;;N;;;;; -132FF;EGYPTIAN HIEROGLYPH S039;Lo;0;L;;;;;N;;;;; -13300;EGYPTIAN HIEROGLYPH S040;Lo;0;L;;;;;N;;;;; -13301;EGYPTIAN HIEROGLYPH S041;Lo;0;L;;;;;N;;;;; -13302;EGYPTIAN HIEROGLYPH S042;Lo;0;L;;;;;N;;;;; -13303;EGYPTIAN HIEROGLYPH S043;Lo;0;L;;;;;N;;;;; -13304;EGYPTIAN HIEROGLYPH S044;Lo;0;L;;;;;N;;;;; -13305;EGYPTIAN HIEROGLYPH S045;Lo;0;L;;;;;N;;;;; -13306;EGYPTIAN HIEROGLYPH S046;Lo;0;L;;;;;N;;;;; -13307;EGYPTIAN HIEROGLYPH T001;Lo;0;L;;;;;N;;;;; -13308;EGYPTIAN HIEROGLYPH T002;Lo;0;L;;;;;N;;;;; -13309;EGYPTIAN HIEROGLYPH T003;Lo;0;L;;;;;N;;;;; -1330A;EGYPTIAN HIEROGLYPH T003A;Lo;0;L;;;;;N;;;;; -1330B;EGYPTIAN HIEROGLYPH T004;Lo;0;L;;;;;N;;;;; -1330C;EGYPTIAN HIEROGLYPH T005;Lo;0;L;;;;;N;;;;; -1330D;EGYPTIAN HIEROGLYPH T006;Lo;0;L;;;;;N;;;;; -1330E;EGYPTIAN HIEROGLYPH T007;Lo;0;L;;;;;N;;;;; -1330F;EGYPTIAN HIEROGLYPH T007A;Lo;0;L;;;;;N;;;;; -13310;EGYPTIAN HIEROGLYPH T008;Lo;0;L;;;;;N;;;;; -13311;EGYPTIAN HIEROGLYPH T008A;Lo;0;L;;;;;N;;;;; -13312;EGYPTIAN HIEROGLYPH T009;Lo;0;L;;;;;N;;;;; -13313;EGYPTIAN HIEROGLYPH T009A;Lo;0;L;;;;;N;;;;; -13314;EGYPTIAN HIEROGLYPH T010;Lo;0;L;;;;;N;;;;; -13315;EGYPTIAN HIEROGLYPH T011;Lo;0;L;;;;;N;;;;; -13316;EGYPTIAN HIEROGLYPH T011A;Lo;0;L;;;;;N;;;;; -13317;EGYPTIAN HIEROGLYPH T012;Lo;0;L;;;;;N;;;;; -13318;EGYPTIAN HIEROGLYPH T013;Lo;0;L;;;;;N;;;;; -13319;EGYPTIAN HIEROGLYPH T014;Lo;0;L;;;;;N;;;;; -1331A;EGYPTIAN HIEROGLYPH T015;Lo;0;L;;;;;N;;;;; -1331B;EGYPTIAN HIEROGLYPH T016;Lo;0;L;;;;;N;;;;; -1331C;EGYPTIAN HIEROGLYPH T016A;Lo;0;L;;;;;N;;;;; -1331D;EGYPTIAN HIEROGLYPH T017;Lo;0;L;;;;;N;;;;; -1331E;EGYPTIAN HIEROGLYPH T018;Lo;0;L;;;;;N;;;;; -1331F;EGYPTIAN HIEROGLYPH T019;Lo;0;L;;;;;N;;;;; -13320;EGYPTIAN HIEROGLYPH T020;Lo;0;L;;;;;N;;;;; -13321;EGYPTIAN HIEROGLYPH T021;Lo;0;L;;;;;N;;;;; -13322;EGYPTIAN HIEROGLYPH T022;Lo;0;L;;;;;N;;;;; -13323;EGYPTIAN HIEROGLYPH T023;Lo;0;L;;;;;N;;;;; -13324;EGYPTIAN HIEROGLYPH T024;Lo;0;L;;;;;N;;;;; -13325;EGYPTIAN HIEROGLYPH T025;Lo;0;L;;;;;N;;;;; -13326;EGYPTIAN HIEROGLYPH T026;Lo;0;L;;;;;N;;;;; -13327;EGYPTIAN HIEROGLYPH T027;Lo;0;L;;;;;N;;;;; -13328;EGYPTIAN HIEROGLYPH T028;Lo;0;L;;;;;N;;;;; -13329;EGYPTIAN HIEROGLYPH T029;Lo;0;L;;;;;N;;;;; -1332A;EGYPTIAN HIEROGLYPH T030;Lo;0;L;;;;;N;;;;; -1332B;EGYPTIAN HIEROGLYPH T031;Lo;0;L;;;;;N;;;;; -1332C;EGYPTIAN HIEROGLYPH T032;Lo;0;L;;;;;N;;;;; -1332D;EGYPTIAN HIEROGLYPH T032A;Lo;0;L;;;;;N;;;;; -1332E;EGYPTIAN HIEROGLYPH T033;Lo;0;L;;;;;N;;;;; -1332F;EGYPTIAN HIEROGLYPH T033A;Lo;0;L;;;;;N;;;;; -13330;EGYPTIAN HIEROGLYPH T034;Lo;0;L;;;;;N;;;;; -13331;EGYPTIAN HIEROGLYPH T035;Lo;0;L;;;;;N;;;;; -13332;EGYPTIAN HIEROGLYPH T036;Lo;0;L;;;;;N;;;;; -13333;EGYPTIAN HIEROGLYPH U001;Lo;0;L;;;;;N;;;;; -13334;EGYPTIAN HIEROGLYPH U002;Lo;0;L;;;;;N;;;;; -13335;EGYPTIAN HIEROGLYPH U003;Lo;0;L;;;;;N;;;;; -13336;EGYPTIAN HIEROGLYPH U004;Lo;0;L;;;;;N;;;;; -13337;EGYPTIAN HIEROGLYPH U005;Lo;0;L;;;;;N;;;;; -13338;EGYPTIAN HIEROGLYPH U006;Lo;0;L;;;;;N;;;;; -13339;EGYPTIAN HIEROGLYPH U006A;Lo;0;L;;;;;N;;;;; -1333A;EGYPTIAN HIEROGLYPH U006B;Lo;0;L;;;;;N;;;;; -1333B;EGYPTIAN HIEROGLYPH U007;Lo;0;L;;;;;N;;;;; -1333C;EGYPTIAN HIEROGLYPH U008;Lo;0;L;;;;;N;;;;; -1333D;EGYPTIAN HIEROGLYPH U009;Lo;0;L;;;;;N;;;;; -1333E;EGYPTIAN HIEROGLYPH U010;Lo;0;L;;;;;N;;;;; -1333F;EGYPTIAN HIEROGLYPH U011;Lo;0;L;;;;;N;;;;; -13340;EGYPTIAN HIEROGLYPH U012;Lo;0;L;;;;;N;;;;; -13341;EGYPTIAN HIEROGLYPH U013;Lo;0;L;;;;;N;;;;; -13342;EGYPTIAN HIEROGLYPH U014;Lo;0;L;;;;;N;;;;; -13343;EGYPTIAN HIEROGLYPH U015;Lo;0;L;;;;;N;;;;; -13344;EGYPTIAN HIEROGLYPH U016;Lo;0;L;;;;;N;;;;; -13345;EGYPTIAN HIEROGLYPH U017;Lo;0;L;;;;;N;;;;; -13346;EGYPTIAN HIEROGLYPH U018;Lo;0;L;;;;;N;;;;; -13347;EGYPTIAN HIEROGLYPH U019;Lo;0;L;;;;;N;;;;; -13348;EGYPTIAN HIEROGLYPH U020;Lo;0;L;;;;;N;;;;; -13349;EGYPTIAN HIEROGLYPH U021;Lo;0;L;;;;;N;;;;; -1334A;EGYPTIAN HIEROGLYPH U022;Lo;0;L;;;;;N;;;;; -1334B;EGYPTIAN HIEROGLYPH U023;Lo;0;L;;;;;N;;;;; -1334C;EGYPTIAN HIEROGLYPH U023A;Lo;0;L;;;;;N;;;;; -1334D;EGYPTIAN HIEROGLYPH U024;Lo;0;L;;;;;N;;;;; -1334E;EGYPTIAN HIEROGLYPH U025;Lo;0;L;;;;;N;;;;; -1334F;EGYPTIAN HIEROGLYPH U026;Lo;0;L;;;;;N;;;;; -13350;EGYPTIAN HIEROGLYPH U027;Lo;0;L;;;;;N;;;;; -13351;EGYPTIAN HIEROGLYPH U028;Lo;0;L;;;;;N;;;;; -13352;EGYPTIAN HIEROGLYPH U029;Lo;0;L;;;;;N;;;;; -13353;EGYPTIAN HIEROGLYPH U029A;Lo;0;L;;;;;N;;;;; -13354;EGYPTIAN HIEROGLYPH U030;Lo;0;L;;;;;N;;;;; -13355;EGYPTIAN HIEROGLYPH U031;Lo;0;L;;;;;N;;;;; -13356;EGYPTIAN HIEROGLYPH U032;Lo;0;L;;;;;N;;;;; -13357;EGYPTIAN HIEROGLYPH U032A;Lo;0;L;;;;;N;;;;; -13358;EGYPTIAN HIEROGLYPH U033;Lo;0;L;;;;;N;;;;; -13359;EGYPTIAN HIEROGLYPH U034;Lo;0;L;;;;;N;;;;; -1335A;EGYPTIAN HIEROGLYPH U035;Lo;0;L;;;;;N;;;;; -1335B;EGYPTIAN HIEROGLYPH U036;Lo;0;L;;;;;N;;;;; -1335C;EGYPTIAN HIEROGLYPH U037;Lo;0;L;;;;;N;;;;; -1335D;EGYPTIAN HIEROGLYPH U038;Lo;0;L;;;;;N;;;;; -1335E;EGYPTIAN HIEROGLYPH U039;Lo;0;L;;;;;N;;;;; -1335F;EGYPTIAN HIEROGLYPH U040;Lo;0;L;;;;;N;;;;; -13360;EGYPTIAN HIEROGLYPH U041;Lo;0;L;;;;;N;;;;; -13361;EGYPTIAN HIEROGLYPH U042;Lo;0;L;;;;;N;;;;; -13362;EGYPTIAN HIEROGLYPH V001;Lo;0;L;;;;;N;;;;; -13363;EGYPTIAN HIEROGLYPH V001A;Lo;0;L;;;;;N;;;;; -13364;EGYPTIAN HIEROGLYPH V001B;Lo;0;L;;;;;N;;;;; -13365;EGYPTIAN HIEROGLYPH V001C;Lo;0;L;;;;;N;;;;; -13366;EGYPTIAN HIEROGLYPH V001D;Lo;0;L;;;;;N;;;;; -13367;EGYPTIAN HIEROGLYPH V001E;Lo;0;L;;;;;N;;;;; -13368;EGYPTIAN HIEROGLYPH V001F;Lo;0;L;;;;;N;;;;; -13369;EGYPTIAN HIEROGLYPH V001G;Lo;0;L;;;;;N;;;;; -1336A;EGYPTIAN HIEROGLYPH V001H;Lo;0;L;;;;;N;;;;; -1336B;EGYPTIAN HIEROGLYPH V001I;Lo;0;L;;;;;N;;;;; -1336C;EGYPTIAN HIEROGLYPH V002;Lo;0;L;;;;;N;;;;; -1336D;EGYPTIAN HIEROGLYPH V002A;Lo;0;L;;;;;N;;;;; -1336E;EGYPTIAN HIEROGLYPH V003;Lo;0;L;;;;;N;;;;; -1336F;EGYPTIAN HIEROGLYPH V004;Lo;0;L;;;;;N;;;;; -13370;EGYPTIAN HIEROGLYPH V005;Lo;0;L;;;;;N;;;;; -13371;EGYPTIAN HIEROGLYPH V006;Lo;0;L;;;;;N;;;;; -13372;EGYPTIAN HIEROGLYPH V007;Lo;0;L;;;;;N;;;;; -13373;EGYPTIAN HIEROGLYPH V007A;Lo;0;L;;;;;N;;;;; -13374;EGYPTIAN HIEROGLYPH V007B;Lo;0;L;;;;;N;;;;; -13375;EGYPTIAN HIEROGLYPH V008;Lo;0;L;;;;;N;;;;; -13376;EGYPTIAN HIEROGLYPH V009;Lo;0;L;;;;;N;;;;; -13377;EGYPTIAN HIEROGLYPH V010;Lo;0;L;;;;;N;;;;; -13378;EGYPTIAN HIEROGLYPH V011;Lo;0;L;;;;;N;;;;; -13379;EGYPTIAN HIEROGLYPH V011A;Lo;0;L;;;;;N;;;;; -1337A;EGYPTIAN HIEROGLYPH V011B;Lo;0;L;;;;;N;;;;; -1337B;EGYPTIAN HIEROGLYPH V011C;Lo;0;L;;;;;N;;;;; -1337C;EGYPTIAN HIEROGLYPH V012;Lo;0;L;;;;;N;;;;; -1337D;EGYPTIAN HIEROGLYPH V012A;Lo;0;L;;;;;N;;;;; -1337E;EGYPTIAN HIEROGLYPH V012B;Lo;0;L;;;;;N;;;;; -1337F;EGYPTIAN HIEROGLYPH V013;Lo;0;L;;;;;N;;;;; -13380;EGYPTIAN HIEROGLYPH V014;Lo;0;L;;;;;N;;;;; -13381;EGYPTIAN HIEROGLYPH V015;Lo;0;L;;;;;N;;;;; -13382;EGYPTIAN HIEROGLYPH V016;Lo;0;L;;;;;N;;;;; -13383;EGYPTIAN HIEROGLYPH V017;Lo;0;L;;;;;N;;;;; -13384;EGYPTIAN HIEROGLYPH V018;Lo;0;L;;;;;N;;;;; -13385;EGYPTIAN HIEROGLYPH V019;Lo;0;L;;;;;N;;;;; -13386;EGYPTIAN HIEROGLYPH V020;Lo;0;L;;;;;N;;;;; -13387;EGYPTIAN HIEROGLYPH V020A;Lo;0;L;;;;;N;;;;; -13388;EGYPTIAN HIEROGLYPH V020B;Lo;0;L;;;;;N;;;;; -13389;EGYPTIAN HIEROGLYPH V020C;Lo;0;L;;;;;N;;;;; -1338A;EGYPTIAN HIEROGLYPH V020D;Lo;0;L;;;;;N;;;;; -1338B;EGYPTIAN HIEROGLYPH V020E;Lo;0;L;;;;;N;;;;; -1338C;EGYPTIAN HIEROGLYPH V020F;Lo;0;L;;;;;N;;;;; -1338D;EGYPTIAN HIEROGLYPH V020G;Lo;0;L;;;;;N;;;;; -1338E;EGYPTIAN HIEROGLYPH V020H;Lo;0;L;;;;;N;;;;; -1338F;EGYPTIAN HIEROGLYPH V020I;Lo;0;L;;;;;N;;;;; -13390;EGYPTIAN HIEROGLYPH V020J;Lo;0;L;;;;;N;;;;; -13391;EGYPTIAN HIEROGLYPH V020K;Lo;0;L;;;;;N;;;;; -13392;EGYPTIAN HIEROGLYPH V020L;Lo;0;L;;;;;N;;;;; -13393;EGYPTIAN HIEROGLYPH V021;Lo;0;L;;;;;N;;;;; -13394;EGYPTIAN HIEROGLYPH V022;Lo;0;L;;;;;N;;;;; -13395;EGYPTIAN HIEROGLYPH V023;Lo;0;L;;;;;N;;;;; -13396;EGYPTIAN HIEROGLYPH V023A;Lo;0;L;;;;;N;;;;; -13397;EGYPTIAN HIEROGLYPH V024;Lo;0;L;;;;;N;;;;; -13398;EGYPTIAN HIEROGLYPH V025;Lo;0;L;;;;;N;;;;; -13399;EGYPTIAN HIEROGLYPH V026;Lo;0;L;;;;;N;;;;; -1339A;EGYPTIAN HIEROGLYPH V027;Lo;0;L;;;;;N;;;;; -1339B;EGYPTIAN HIEROGLYPH V028;Lo;0;L;;;;;N;;;;; -1339C;EGYPTIAN HIEROGLYPH V028A;Lo;0;L;;;;;N;;;;; -1339D;EGYPTIAN HIEROGLYPH V029;Lo;0;L;;;;;N;;;;; -1339E;EGYPTIAN HIEROGLYPH V029A;Lo;0;L;;;;;N;;;;; -1339F;EGYPTIAN HIEROGLYPH V030;Lo;0;L;;;;;N;;;;; -133A0;EGYPTIAN HIEROGLYPH V030A;Lo;0;L;;;;;N;;;;; -133A1;EGYPTIAN HIEROGLYPH V031;Lo;0;L;;;;;N;;;;; -133A2;EGYPTIAN HIEROGLYPH V031A;Lo;0;L;;;;;N;;;;; -133A3;EGYPTIAN HIEROGLYPH V032;Lo;0;L;;;;;N;;;;; -133A4;EGYPTIAN HIEROGLYPH V033;Lo;0;L;;;;;N;;;;; -133A5;EGYPTIAN HIEROGLYPH V033A;Lo;0;L;;;;;N;;;;; -133A6;EGYPTIAN HIEROGLYPH V034;Lo;0;L;;;;;N;;;;; -133A7;EGYPTIAN HIEROGLYPH V035;Lo;0;L;;;;;N;;;;; -133A8;EGYPTIAN HIEROGLYPH V036;Lo;0;L;;;;;N;;;;; -133A9;EGYPTIAN HIEROGLYPH V037;Lo;0;L;;;;;N;;;;; -133AA;EGYPTIAN HIEROGLYPH V037A;Lo;0;L;;;;;N;;;;; -133AB;EGYPTIAN HIEROGLYPH V038;Lo;0;L;;;;;N;;;;; -133AC;EGYPTIAN HIEROGLYPH V039;Lo;0;L;;;;;N;;;;; -133AD;EGYPTIAN HIEROGLYPH V040;Lo;0;L;;;;;N;;;;; -133AE;EGYPTIAN HIEROGLYPH V040A;Lo;0;L;;;;;N;;;;; -133AF;EGYPTIAN HIEROGLYPH W001;Lo;0;L;;;;;N;;;;; -133B0;EGYPTIAN HIEROGLYPH W002;Lo;0;L;;;;;N;;;;; -133B1;EGYPTIAN HIEROGLYPH W003;Lo;0;L;;;;;N;;;;; -133B2;EGYPTIAN HIEROGLYPH W003A;Lo;0;L;;;;;N;;;;; -133B3;EGYPTIAN HIEROGLYPH W004;Lo;0;L;;;;;N;;;;; -133B4;EGYPTIAN HIEROGLYPH W005;Lo;0;L;;;;;N;;;;; -133B5;EGYPTIAN HIEROGLYPH W006;Lo;0;L;;;;;N;;;;; -133B6;EGYPTIAN HIEROGLYPH W007;Lo;0;L;;;;;N;;;;; -133B7;EGYPTIAN HIEROGLYPH W008;Lo;0;L;;;;;N;;;;; -133B8;EGYPTIAN HIEROGLYPH W009;Lo;0;L;;;;;N;;;;; -133B9;EGYPTIAN HIEROGLYPH W009A;Lo;0;L;;;;;N;;;;; -133BA;EGYPTIAN HIEROGLYPH W010;Lo;0;L;;;;;N;;;;; -133BB;EGYPTIAN HIEROGLYPH W010A;Lo;0;L;;;;;N;;;;; -133BC;EGYPTIAN HIEROGLYPH W011;Lo;0;L;;;;;N;;;;; -133BD;EGYPTIAN HIEROGLYPH W012;Lo;0;L;;;;;N;;;;; -133BE;EGYPTIAN HIEROGLYPH W013;Lo;0;L;;;;;N;;;;; -133BF;EGYPTIAN HIEROGLYPH W014;Lo;0;L;;;;;N;;;;; -133C0;EGYPTIAN HIEROGLYPH W014A;Lo;0;L;;;;;N;;;;; -133C1;EGYPTIAN HIEROGLYPH W015;Lo;0;L;;;;;N;;;;; -133C2;EGYPTIAN HIEROGLYPH W016;Lo;0;L;;;;;N;;;;; -133C3;EGYPTIAN HIEROGLYPH W017;Lo;0;L;;;;;N;;;;; -133C4;EGYPTIAN HIEROGLYPH W017A;Lo;0;L;;;;;N;;;;; -133C5;EGYPTIAN HIEROGLYPH W018;Lo;0;L;;;;;N;;;;; -133C6;EGYPTIAN HIEROGLYPH W018A;Lo;0;L;;;;;N;;;;; -133C7;EGYPTIAN HIEROGLYPH W019;Lo;0;L;;;;;N;;;;; -133C8;EGYPTIAN HIEROGLYPH W020;Lo;0;L;;;;;N;;;;; -133C9;EGYPTIAN HIEROGLYPH W021;Lo;0;L;;;;;N;;;;; -133CA;EGYPTIAN HIEROGLYPH W022;Lo;0;L;;;;;N;;;;; -133CB;EGYPTIAN HIEROGLYPH W023;Lo;0;L;;;;;N;;;;; -133CC;EGYPTIAN HIEROGLYPH W024;Lo;0;L;;;;;N;;;;; -133CD;EGYPTIAN HIEROGLYPH W024A;Lo;0;L;;;;;N;;;;; -133CE;EGYPTIAN HIEROGLYPH W025;Lo;0;L;;;;;N;;;;; -133CF;EGYPTIAN HIEROGLYPH X001;Lo;0;L;;;;;N;;;;; -133D0;EGYPTIAN HIEROGLYPH X002;Lo;0;L;;;;;N;;;;; -133D1;EGYPTIAN HIEROGLYPH X003;Lo;0;L;;;;;N;;;;; -133D2;EGYPTIAN HIEROGLYPH X004;Lo;0;L;;;;;N;;;;; -133D3;EGYPTIAN HIEROGLYPH X004A;Lo;0;L;;;;;N;;;;; -133D4;EGYPTIAN HIEROGLYPH X004B;Lo;0;L;;;;;N;;;;; -133D5;EGYPTIAN HIEROGLYPH X005;Lo;0;L;;;;;N;;;;; -133D6;EGYPTIAN HIEROGLYPH X006;Lo;0;L;;;;;N;;;;; -133D7;EGYPTIAN HIEROGLYPH X006A;Lo;0;L;;;;;N;;;;; -133D8;EGYPTIAN HIEROGLYPH X007;Lo;0;L;;;;;N;;;;; -133D9;EGYPTIAN HIEROGLYPH X008;Lo;0;L;;;;;N;;;;; -133DA;EGYPTIAN HIEROGLYPH X008A;Lo;0;L;;;;;N;;;;; -133DB;EGYPTIAN HIEROGLYPH Y001;Lo;0;L;;;;;N;;;;; -133DC;EGYPTIAN HIEROGLYPH Y001A;Lo;0;L;;;;;N;;;;; -133DD;EGYPTIAN HIEROGLYPH Y002;Lo;0;L;;;;;N;;;;; -133DE;EGYPTIAN HIEROGLYPH Y003;Lo;0;L;;;;;N;;;;; -133DF;EGYPTIAN HIEROGLYPH Y004;Lo;0;L;;;;;N;;;;; -133E0;EGYPTIAN HIEROGLYPH Y005;Lo;0;L;;;;;N;;;;; -133E1;EGYPTIAN HIEROGLYPH Y006;Lo;0;L;;;;;N;;;;; -133E2;EGYPTIAN HIEROGLYPH Y007;Lo;0;L;;;;;N;;;;; -133E3;EGYPTIAN HIEROGLYPH Y008;Lo;0;L;;;;;N;;;;; -133E4;EGYPTIAN HIEROGLYPH Z001;Lo;0;L;;;;;N;;;;; -133E5;EGYPTIAN HIEROGLYPH Z002;Lo;0;L;;;;;N;;;;; -133E6;EGYPTIAN HIEROGLYPH Z002A;Lo;0;L;;;;;N;;;;; -133E7;EGYPTIAN HIEROGLYPH Z002B;Lo;0;L;;;;;N;;;;; -133E8;EGYPTIAN HIEROGLYPH Z002C;Lo;0;L;;;;;N;;;;; -133E9;EGYPTIAN HIEROGLYPH Z002D;Lo;0;L;;;;;N;;;;; -133EA;EGYPTIAN HIEROGLYPH Z003;Lo;0;L;;;;;N;;;;; -133EB;EGYPTIAN HIEROGLYPH Z003A;Lo;0;L;;;;;N;;;;; -133EC;EGYPTIAN HIEROGLYPH Z003B;Lo;0;L;;;;;N;;;;; -133ED;EGYPTIAN HIEROGLYPH Z004;Lo;0;L;;;;;N;;;;; -133EE;EGYPTIAN HIEROGLYPH Z004A;Lo;0;L;;;;;N;;;;; -133EF;EGYPTIAN HIEROGLYPH Z005;Lo;0;L;;;;;N;;;;; -133F0;EGYPTIAN HIEROGLYPH Z005A;Lo;0;L;;;;;N;;;;; -133F1;EGYPTIAN HIEROGLYPH Z006;Lo;0;L;;;;;N;;;;; -133F2;EGYPTIAN HIEROGLYPH Z007;Lo;0;L;;;;;N;;;;; -133F3;EGYPTIAN HIEROGLYPH Z008;Lo;0;L;;;;;N;;;;; -133F4;EGYPTIAN HIEROGLYPH Z009;Lo;0;L;;;;;N;;;;; -133F5;EGYPTIAN HIEROGLYPH Z010;Lo;0;L;;;;;N;;;;; -133F6;EGYPTIAN HIEROGLYPH Z011;Lo;0;L;;;;;N;;;;; -133F7;EGYPTIAN HIEROGLYPH Z012;Lo;0;L;;;;;N;;;;; -133F8;EGYPTIAN HIEROGLYPH Z013;Lo;0;L;;;;;N;;;;; -133F9;EGYPTIAN HIEROGLYPH Z014;Lo;0;L;;;;;N;;;;; -133FA;EGYPTIAN HIEROGLYPH Z015;Lo;0;L;;;;;N;;;;; -133FB;EGYPTIAN HIEROGLYPH Z015A;Lo;0;L;;;;;N;;;;; -133FC;EGYPTIAN HIEROGLYPH Z015B;Lo;0;L;;;;;N;;;;; -133FD;EGYPTIAN HIEROGLYPH Z015C;Lo;0;L;;;;;N;;;;; -133FE;EGYPTIAN HIEROGLYPH Z015D;Lo;0;L;;;;;N;;;;; -133FF;EGYPTIAN HIEROGLYPH Z015E;Lo;0;L;;;;;N;;;;; -13400;EGYPTIAN HIEROGLYPH Z015F;Lo;0;L;;;;;N;;;;; -13401;EGYPTIAN HIEROGLYPH Z015G;Lo;0;L;;;;;N;;;;; -13402;EGYPTIAN HIEROGLYPH Z015H;Lo;0;L;;;;;N;;;;; -13403;EGYPTIAN HIEROGLYPH Z015I;Lo;0;L;;;;;N;;;;; -13404;EGYPTIAN HIEROGLYPH Z016;Lo;0;L;;;;;N;;;;; -13405;EGYPTIAN HIEROGLYPH Z016A;Lo;0;L;;;;;N;;;;; -13406;EGYPTIAN HIEROGLYPH Z016B;Lo;0;L;;;;;N;;;;; -13407;EGYPTIAN HIEROGLYPH Z016C;Lo;0;L;;;;;N;;;;; -13408;EGYPTIAN HIEROGLYPH Z016D;Lo;0;L;;;;;N;;;;; -13409;EGYPTIAN HIEROGLYPH Z016E;Lo;0;L;;;;;N;;;;; -1340A;EGYPTIAN HIEROGLYPH Z016F;Lo;0;L;;;;;N;;;;; -1340B;EGYPTIAN HIEROGLYPH Z016G;Lo;0;L;;;;;N;;;;; -1340C;EGYPTIAN HIEROGLYPH Z016H;Lo;0;L;;;;;N;;;;; -1340D;EGYPTIAN HIEROGLYPH AA001;Lo;0;L;;;;;N;;;;; -1340E;EGYPTIAN HIEROGLYPH AA002;Lo;0;L;;;;;N;;;;; -1340F;EGYPTIAN HIEROGLYPH AA003;Lo;0;L;;;;;N;;;;; -13410;EGYPTIAN HIEROGLYPH AA004;Lo;0;L;;;;;N;;;;; -13411;EGYPTIAN HIEROGLYPH AA005;Lo;0;L;;;;;N;;;;; -13412;EGYPTIAN HIEROGLYPH AA006;Lo;0;L;;;;;N;;;;; -13413;EGYPTIAN HIEROGLYPH AA007;Lo;0;L;;;;;N;;;;; -13414;EGYPTIAN HIEROGLYPH AA007A;Lo;0;L;;;;;N;;;;; -13415;EGYPTIAN HIEROGLYPH AA007B;Lo;0;L;;;;;N;;;;; -13416;EGYPTIAN HIEROGLYPH AA008;Lo;0;L;;;;;N;;;;; -13417;EGYPTIAN HIEROGLYPH AA009;Lo;0;L;;;;;N;;;;; -13418;EGYPTIAN HIEROGLYPH AA010;Lo;0;L;;;;;N;;;;; -13419;EGYPTIAN HIEROGLYPH AA011;Lo;0;L;;;;;N;;;;; -1341A;EGYPTIAN HIEROGLYPH AA012;Lo;0;L;;;;;N;;;;; -1341B;EGYPTIAN HIEROGLYPH AA013;Lo;0;L;;;;;N;;;;; -1341C;EGYPTIAN HIEROGLYPH AA014;Lo;0;L;;;;;N;;;;; -1341D;EGYPTIAN HIEROGLYPH AA015;Lo;0;L;;;;;N;;;;; -1341E;EGYPTIAN HIEROGLYPH AA016;Lo;0;L;;;;;N;;;;; -1341F;EGYPTIAN HIEROGLYPH AA017;Lo;0;L;;;;;N;;;;; -13420;EGYPTIAN HIEROGLYPH AA018;Lo;0;L;;;;;N;;;;; -13421;EGYPTIAN HIEROGLYPH AA019;Lo;0;L;;;;;N;;;;; -13422;EGYPTIAN HIEROGLYPH AA020;Lo;0;L;;;;;N;;;;; -13423;EGYPTIAN HIEROGLYPH AA021;Lo;0;L;;;;;N;;;;; -13424;EGYPTIAN HIEROGLYPH AA022;Lo;0;L;;;;;N;;;;; -13425;EGYPTIAN HIEROGLYPH AA023;Lo;0;L;;;;;N;;;;; -13426;EGYPTIAN HIEROGLYPH AA024;Lo;0;L;;;;;N;;;;; -13427;EGYPTIAN HIEROGLYPH AA025;Lo;0;L;;;;;N;;;;; -13428;EGYPTIAN HIEROGLYPH AA026;Lo;0;L;;;;;N;;;;; -13429;EGYPTIAN HIEROGLYPH AA027;Lo;0;L;;;;;N;;;;; -1342A;EGYPTIAN HIEROGLYPH AA028;Lo;0;L;;;;;N;;;;; -1342B;EGYPTIAN HIEROGLYPH AA029;Lo;0;L;;;;;N;;;;; -1342C;EGYPTIAN HIEROGLYPH AA030;Lo;0;L;;;;;N;;;;; -1342D;EGYPTIAN HIEROGLYPH AA031;Lo;0;L;;;;;N;;;;; -1342E;EGYPTIAN HIEROGLYPH AA032;Lo;0;L;;;;;N;;;;; -14400;ANATOLIAN HIEROGLYPH A001;Lo;0;L;;;;;N;;;;; -14401;ANATOLIAN HIEROGLYPH A002;Lo;0;L;;;;;N;;;;; -14402;ANATOLIAN HIEROGLYPH A003;Lo;0;L;;;;;N;;;;; -14403;ANATOLIAN HIEROGLYPH A004;Lo;0;L;;;;;N;;;;; -14404;ANATOLIAN HIEROGLYPH A005;Lo;0;L;;;;;N;;;;; -14405;ANATOLIAN HIEROGLYPH A006;Lo;0;L;;;;;N;;;;; -14406;ANATOLIAN HIEROGLYPH A007;Lo;0;L;;;;;N;;;;; -14407;ANATOLIAN HIEROGLYPH A008;Lo;0;L;;;;;N;;;;; -14408;ANATOLIAN HIEROGLYPH A009;Lo;0;L;;;;;N;;;;; -14409;ANATOLIAN HIEROGLYPH A010;Lo;0;L;;;;;N;;;;; -1440A;ANATOLIAN HIEROGLYPH A010A;Lo;0;L;;;;;N;;;;; -1440B;ANATOLIAN HIEROGLYPH A011;Lo;0;L;;;;;N;;;;; -1440C;ANATOLIAN HIEROGLYPH A012;Lo;0;L;;;;;N;;;;; -1440D;ANATOLIAN HIEROGLYPH A013;Lo;0;L;;;;;N;;;;; -1440E;ANATOLIAN HIEROGLYPH A014;Lo;0;L;;;;;N;;;;; -1440F;ANATOLIAN HIEROGLYPH A015;Lo;0;L;;;;;N;;;;; -14410;ANATOLIAN HIEROGLYPH A016;Lo;0;L;;;;;N;;;;; -14411;ANATOLIAN HIEROGLYPH A017;Lo;0;L;;;;;N;;;;; -14412;ANATOLIAN HIEROGLYPH A018;Lo;0;L;;;;;N;;;;; -14413;ANATOLIAN HIEROGLYPH A019;Lo;0;L;;;;;N;;;;; -14414;ANATOLIAN HIEROGLYPH A020;Lo;0;L;;;;;N;;;;; -14415;ANATOLIAN HIEROGLYPH A021;Lo;0;L;;;;;N;;;;; -14416;ANATOLIAN HIEROGLYPH A022;Lo;0;L;;;;;N;;;;; -14417;ANATOLIAN HIEROGLYPH A023;Lo;0;L;;;;;N;;;;; -14418;ANATOLIAN HIEROGLYPH A024;Lo;0;L;;;;;N;;;;; -14419;ANATOLIAN HIEROGLYPH A025;Lo;0;L;;;;;N;;;;; -1441A;ANATOLIAN HIEROGLYPH A026;Lo;0;L;;;;;N;;;;; -1441B;ANATOLIAN HIEROGLYPH A026A;Lo;0;L;;;;;N;;;;; -1441C;ANATOLIAN HIEROGLYPH A027;Lo;0;L;;;;;N;;;;; -1441D;ANATOLIAN HIEROGLYPH A028;Lo;0;L;;;;;N;;;;; -1441E;ANATOLIAN HIEROGLYPH A029;Lo;0;L;;;;;N;;;;; -1441F;ANATOLIAN HIEROGLYPH A030;Lo;0;L;;;;;N;;;;; -14420;ANATOLIAN HIEROGLYPH A031;Lo;0;L;;;;;N;;;;; -14421;ANATOLIAN HIEROGLYPH A032;Lo;0;L;;;;;N;;;;; -14422;ANATOLIAN HIEROGLYPH A033;Lo;0;L;;;;;N;;;;; -14423;ANATOLIAN HIEROGLYPH A034;Lo;0;L;;;;;N;;;;; -14424;ANATOLIAN HIEROGLYPH A035;Lo;0;L;;;;;N;;;;; -14425;ANATOLIAN HIEROGLYPH A036;Lo;0;L;;;;;N;;;;; -14426;ANATOLIAN HIEROGLYPH A037;Lo;0;L;;;;;N;;;;; -14427;ANATOLIAN HIEROGLYPH A038;Lo;0;L;;;;;N;;;;; -14428;ANATOLIAN HIEROGLYPH A039;Lo;0;L;;;;;N;;;;; -14429;ANATOLIAN HIEROGLYPH A039A;Lo;0;L;;;;;N;;;;; -1442A;ANATOLIAN HIEROGLYPH A040;Lo;0;L;;;;;N;;;;; -1442B;ANATOLIAN HIEROGLYPH A041;Lo;0;L;;;;;N;;;;; -1442C;ANATOLIAN HIEROGLYPH A041A;Lo;0;L;;;;;N;;;;; -1442D;ANATOLIAN HIEROGLYPH A042;Lo;0;L;;;;;N;;;;; -1442E;ANATOLIAN HIEROGLYPH A043;Lo;0;L;;;;;N;;;;; -1442F;ANATOLIAN HIEROGLYPH A044;Lo;0;L;;;;;N;;;;; -14430;ANATOLIAN HIEROGLYPH A045;Lo;0;L;;;;;N;;;;; -14431;ANATOLIAN HIEROGLYPH A045A;Lo;0;L;;;;;N;;;;; -14432;ANATOLIAN HIEROGLYPH A046;Lo;0;L;;;;;N;;;;; -14433;ANATOLIAN HIEROGLYPH A046A;Lo;0;L;;;;;N;;;;; -14434;ANATOLIAN HIEROGLYPH A046B;Lo;0;L;;;;;N;;;;; -14435;ANATOLIAN HIEROGLYPH A047;Lo;0;L;;;;;N;;;;; -14436;ANATOLIAN HIEROGLYPH A048;Lo;0;L;;;;;N;;;;; -14437;ANATOLIAN HIEROGLYPH A049;Lo;0;L;;;;;N;;;;; -14438;ANATOLIAN HIEROGLYPH A050;Lo;0;L;;;;;N;;;;; -14439;ANATOLIAN HIEROGLYPH A051;Lo;0;L;;;;;N;;;;; -1443A;ANATOLIAN HIEROGLYPH A052;Lo;0;L;;;;;N;;;;; -1443B;ANATOLIAN HIEROGLYPH A053;Lo;0;L;;;;;N;;;;; -1443C;ANATOLIAN HIEROGLYPH A054;Lo;0;L;;;;;N;;;;; -1443D;ANATOLIAN HIEROGLYPH A055;Lo;0;L;;;;;N;;;;; -1443E;ANATOLIAN HIEROGLYPH A056;Lo;0;L;;;;;N;;;;; -1443F;ANATOLIAN HIEROGLYPH A057;Lo;0;L;;;;;N;;;;; -14440;ANATOLIAN HIEROGLYPH A058;Lo;0;L;;;;;N;;;;; -14441;ANATOLIAN HIEROGLYPH A059;Lo;0;L;;;;;N;;;;; -14442;ANATOLIAN HIEROGLYPH A060;Lo;0;L;;;;;N;;;;; -14443;ANATOLIAN HIEROGLYPH A061;Lo;0;L;;;;;N;;;;; -14444;ANATOLIAN HIEROGLYPH A062;Lo;0;L;;;;;N;;;;; -14445;ANATOLIAN HIEROGLYPH A063;Lo;0;L;;;;;N;;;;; -14446;ANATOLIAN HIEROGLYPH A064;Lo;0;L;;;;;N;;;;; -14447;ANATOLIAN HIEROGLYPH A065;Lo;0;L;;;;;N;;;;; -14448;ANATOLIAN HIEROGLYPH A066;Lo;0;L;;;;;N;;;;; -14449;ANATOLIAN HIEROGLYPH A066A;Lo;0;L;;;;;N;;;;; -1444A;ANATOLIAN HIEROGLYPH A066B;Lo;0;L;;;;;N;;;;; -1444B;ANATOLIAN HIEROGLYPH A066C;Lo;0;L;;;;;N;;;;; -1444C;ANATOLIAN HIEROGLYPH A067;Lo;0;L;;;;;N;;;;; -1444D;ANATOLIAN HIEROGLYPH A068;Lo;0;L;;;;;N;;;;; -1444E;ANATOLIAN HIEROGLYPH A069;Lo;0;L;;;;;N;;;;; -1444F;ANATOLIAN HIEROGLYPH A070;Lo;0;L;;;;;N;;;;; -14450;ANATOLIAN HIEROGLYPH A071;Lo;0;L;;;;;N;;;;; -14451;ANATOLIAN HIEROGLYPH A072;Lo;0;L;;;;;N;;;;; -14452;ANATOLIAN HIEROGLYPH A073;Lo;0;L;;;;;N;;;;; -14453;ANATOLIAN HIEROGLYPH A074;Lo;0;L;;;;;N;;;;; -14454;ANATOLIAN HIEROGLYPH A075;Lo;0;L;;;;;N;;;;; -14455;ANATOLIAN HIEROGLYPH A076;Lo;0;L;;;;;N;;;;; -14456;ANATOLIAN HIEROGLYPH A077;Lo;0;L;;;;;N;;;;; -14457;ANATOLIAN HIEROGLYPH A078;Lo;0;L;;;;;N;;;;; -14458;ANATOLIAN HIEROGLYPH A079;Lo;0;L;;;;;N;;;;; -14459;ANATOLIAN HIEROGLYPH A080;Lo;0;L;;;;;N;;;;; -1445A;ANATOLIAN HIEROGLYPH A081;Lo;0;L;;;;;N;;;;; -1445B;ANATOLIAN HIEROGLYPH A082;Lo;0;L;;;;;N;;;;; -1445C;ANATOLIAN HIEROGLYPH A083;Lo;0;L;;;;;N;;;;; -1445D;ANATOLIAN HIEROGLYPH A084;Lo;0;L;;;;;N;;;;; -1445E;ANATOLIAN HIEROGLYPH A085;Lo;0;L;;;;;N;;;;; -1445F;ANATOLIAN HIEROGLYPH A086;Lo;0;L;;;;;N;;;;; -14460;ANATOLIAN HIEROGLYPH A087;Lo;0;L;;;;;N;;;;; -14461;ANATOLIAN HIEROGLYPH A088;Lo;0;L;;;;;N;;;;; -14462;ANATOLIAN HIEROGLYPH A089;Lo;0;L;;;;;N;;;;; -14463;ANATOLIAN HIEROGLYPH A090;Lo;0;L;;;;;N;;;;; -14464;ANATOLIAN HIEROGLYPH A091;Lo;0;L;;;;;N;;;;; -14465;ANATOLIAN HIEROGLYPH A092;Lo;0;L;;;;;N;;;;; -14466;ANATOLIAN HIEROGLYPH A093;Lo;0;L;;;;;N;;;;; -14467;ANATOLIAN HIEROGLYPH A094;Lo;0;L;;;;;N;;;;; -14468;ANATOLIAN HIEROGLYPH A095;Lo;0;L;;;;;N;;;;; -14469;ANATOLIAN HIEROGLYPH A096;Lo;0;L;;;;;N;;;;; -1446A;ANATOLIAN HIEROGLYPH A097;Lo;0;L;;;;;N;;;;; -1446B;ANATOLIAN HIEROGLYPH A097A;Lo;0;L;;;;;N;;;;; -1446C;ANATOLIAN HIEROGLYPH A098;Lo;0;L;;;;;N;;;;; -1446D;ANATOLIAN HIEROGLYPH A098A;Lo;0;L;;;;;N;;;;; -1446E;ANATOLIAN HIEROGLYPH A099;Lo;0;L;;;;;N;;;;; -1446F;ANATOLIAN HIEROGLYPH A100;Lo;0;L;;;;;N;;;;; -14470;ANATOLIAN HIEROGLYPH A100A;Lo;0;L;;;;;N;;;;; -14471;ANATOLIAN HIEROGLYPH A101;Lo;0;L;;;;;N;;;;; -14472;ANATOLIAN HIEROGLYPH A101A;Lo;0;L;;;;;N;;;;; -14473;ANATOLIAN HIEROGLYPH A102;Lo;0;L;;;;;N;;;;; -14474;ANATOLIAN HIEROGLYPH A102A;Lo;0;L;;;;;N;;;;; -14475;ANATOLIAN HIEROGLYPH A103;Lo;0;L;;;;;N;;;;; -14476;ANATOLIAN HIEROGLYPH A104;Lo;0;L;;;;;N;;;;; -14477;ANATOLIAN HIEROGLYPH A104A;Lo;0;L;;;;;N;;;;; -14478;ANATOLIAN HIEROGLYPH A104B;Lo;0;L;;;;;N;;;;; -14479;ANATOLIAN HIEROGLYPH A104C;Lo;0;L;;;;;N;;;;; -1447A;ANATOLIAN HIEROGLYPH A105;Lo;0;L;;;;;N;;;;; -1447B;ANATOLIAN HIEROGLYPH A105A;Lo;0;L;;;;;N;;;;; -1447C;ANATOLIAN HIEROGLYPH A105B;Lo;0;L;;;;;N;;;;; -1447D;ANATOLIAN HIEROGLYPH A106;Lo;0;L;;;;;N;;;;; -1447E;ANATOLIAN HIEROGLYPH A107;Lo;0;L;;;;;N;;;;; -1447F;ANATOLIAN HIEROGLYPH A107A;Lo;0;L;;;;;N;;;;; -14480;ANATOLIAN HIEROGLYPH A107B;Lo;0;L;;;;;N;;;;; -14481;ANATOLIAN HIEROGLYPH A107C;Lo;0;L;;;;;N;;;;; -14482;ANATOLIAN HIEROGLYPH A108;Lo;0;L;;;;;N;;;;; -14483;ANATOLIAN HIEROGLYPH A109;Lo;0;L;;;;;N;;;;; -14484;ANATOLIAN HIEROGLYPH A110;Lo;0;L;;;;;N;;;;; -14485;ANATOLIAN HIEROGLYPH A110A;Lo;0;L;;;;;N;;;;; -14486;ANATOLIAN HIEROGLYPH A110B;Lo;0;L;;;;;N;;;;; -14487;ANATOLIAN HIEROGLYPH A111;Lo;0;L;;;;;N;;;;; -14488;ANATOLIAN HIEROGLYPH A112;Lo;0;L;;;;;N;;;;; -14489;ANATOLIAN HIEROGLYPH A113;Lo;0;L;;;;;N;;;;; -1448A;ANATOLIAN HIEROGLYPH A114;Lo;0;L;;;;;N;;;;; -1448B;ANATOLIAN HIEROGLYPH A115;Lo;0;L;;;;;N;;;;; -1448C;ANATOLIAN HIEROGLYPH A115A;Lo;0;L;;;;;N;;;;; -1448D;ANATOLIAN HIEROGLYPH A116;Lo;0;L;;;;;N;;;;; -1448E;ANATOLIAN HIEROGLYPH A117;Lo;0;L;;;;;N;;;;; -1448F;ANATOLIAN HIEROGLYPH A118;Lo;0;L;;;;;N;;;;; -14490;ANATOLIAN HIEROGLYPH A119;Lo;0;L;;;;;N;;;;; -14491;ANATOLIAN HIEROGLYPH A120;Lo;0;L;;;;;N;;;;; -14492;ANATOLIAN HIEROGLYPH A121;Lo;0;L;;;;;N;;;;; -14493;ANATOLIAN HIEROGLYPH A122;Lo;0;L;;;;;N;;;;; -14494;ANATOLIAN HIEROGLYPH A123;Lo;0;L;;;;;N;;;;; -14495;ANATOLIAN HIEROGLYPH A124;Lo;0;L;;;;;N;;;;; -14496;ANATOLIAN HIEROGLYPH A125;Lo;0;L;;;;;N;;;;; -14497;ANATOLIAN HIEROGLYPH A125A;Lo;0;L;;;;;N;;;;; -14498;ANATOLIAN HIEROGLYPH A126;Lo;0;L;;;;;N;;;;; -14499;ANATOLIAN HIEROGLYPH A127;Lo;0;L;;;;;N;;;;; -1449A;ANATOLIAN HIEROGLYPH A128;Lo;0;L;;;;;N;;;;; -1449B;ANATOLIAN HIEROGLYPH A129;Lo;0;L;;;;;N;;;;; -1449C;ANATOLIAN HIEROGLYPH A130;Lo;0;L;;;;;N;;;;; -1449D;ANATOLIAN HIEROGLYPH A131;Lo;0;L;;;;;N;;;;; -1449E;ANATOLIAN HIEROGLYPH A132;Lo;0;L;;;;;N;;;;; -1449F;ANATOLIAN HIEROGLYPH A133;Lo;0;L;;;;;N;;;;; -144A0;ANATOLIAN HIEROGLYPH A134;Lo;0;L;;;;;N;;;;; -144A1;ANATOLIAN HIEROGLYPH A135;Lo;0;L;;;;;N;;;;; -144A2;ANATOLIAN HIEROGLYPH A135A;Lo;0;L;;;;;N;;;;; -144A3;ANATOLIAN HIEROGLYPH A136;Lo;0;L;;;;;N;;;;; -144A4;ANATOLIAN HIEROGLYPH A137;Lo;0;L;;;;;N;;;;; -144A5;ANATOLIAN HIEROGLYPH A138;Lo;0;L;;;;;N;;;;; -144A6;ANATOLIAN HIEROGLYPH A139;Lo;0;L;;;;;N;;;;; -144A7;ANATOLIAN HIEROGLYPH A140;Lo;0;L;;;;;N;;;;; -144A8;ANATOLIAN HIEROGLYPH A141;Lo;0;L;;;;;N;;;;; -144A9;ANATOLIAN HIEROGLYPH A142;Lo;0;L;;;;;N;;;;; -144AA;ANATOLIAN HIEROGLYPH A143;Lo;0;L;;;;;N;;;;; -144AB;ANATOLIAN HIEROGLYPH A144;Lo;0;L;;;;;N;;;;; -144AC;ANATOLIAN HIEROGLYPH A145;Lo;0;L;;;;;N;;;;; -144AD;ANATOLIAN HIEROGLYPH A146;Lo;0;L;;;;;N;;;;; -144AE;ANATOLIAN HIEROGLYPH A147;Lo;0;L;;;;;N;;;;; -144AF;ANATOLIAN HIEROGLYPH A148;Lo;0;L;;;;;N;;;;; -144B0;ANATOLIAN HIEROGLYPH A149;Lo;0;L;;;;;N;;;;; -144B1;ANATOLIAN HIEROGLYPH A150;Lo;0;L;;;;;N;;;;; -144B2;ANATOLIAN HIEROGLYPH A151;Lo;0;L;;;;;N;;;;; -144B3;ANATOLIAN HIEROGLYPH A152;Lo;0;L;;;;;N;;;;; -144B4;ANATOLIAN HIEROGLYPH A153;Lo;0;L;;;;;N;;;;; -144B5;ANATOLIAN HIEROGLYPH A154;Lo;0;L;;;;;N;;;;; -144B6;ANATOLIAN HIEROGLYPH A155;Lo;0;L;;;;;N;;;;; -144B7;ANATOLIAN HIEROGLYPH A156;Lo;0;L;;;;;N;;;;; -144B8;ANATOLIAN HIEROGLYPH A157;Lo;0;L;;;;;N;;;;; -144B9;ANATOLIAN HIEROGLYPH A158;Lo;0;L;;;;;N;;;;; -144BA;ANATOLIAN HIEROGLYPH A159;Lo;0;L;;;;;N;;;;; -144BB;ANATOLIAN HIEROGLYPH A160;Lo;0;L;;;;;N;;;;; -144BC;ANATOLIAN HIEROGLYPH A161;Lo;0;L;;;;;N;;;;; -144BD;ANATOLIAN HIEROGLYPH A162;Lo;0;L;;;;;N;;;;; -144BE;ANATOLIAN HIEROGLYPH A163;Lo;0;L;;;;;N;;;;; -144BF;ANATOLIAN HIEROGLYPH A164;Lo;0;L;;;;;N;;;;; -144C0;ANATOLIAN HIEROGLYPH A165;Lo;0;L;;;;;N;;;;; -144C1;ANATOLIAN HIEROGLYPH A166;Lo;0;L;;;;;N;;;;; -144C2;ANATOLIAN HIEROGLYPH A167;Lo;0;L;;;;;N;;;;; -144C3;ANATOLIAN HIEROGLYPH A168;Lo;0;L;;;;;N;;;;; -144C4;ANATOLIAN HIEROGLYPH A169;Lo;0;L;;;;;N;;;;; -144C5;ANATOLIAN HIEROGLYPH A170;Lo;0;L;;;;;N;;;;; -144C6;ANATOLIAN HIEROGLYPH A171;Lo;0;L;;;;;N;;;;; -144C7;ANATOLIAN HIEROGLYPH A172;Lo;0;L;;;;;N;;;;; -144C8;ANATOLIAN HIEROGLYPH A173;Lo;0;L;;;;;N;;;;; -144C9;ANATOLIAN HIEROGLYPH A174;Lo;0;L;;;;;N;;;;; -144CA;ANATOLIAN HIEROGLYPH A175;Lo;0;L;;;;;N;;;;; -144CB;ANATOLIAN HIEROGLYPH A176;Lo;0;L;;;;;N;;;;; -144CC;ANATOLIAN HIEROGLYPH A177;Lo;0;L;;;;;N;;;;; -144CD;ANATOLIAN HIEROGLYPH A178;Lo;0;L;;;;;N;;;;; -144CE;ANATOLIAN HIEROGLYPH A179;Lo;0;L;;;;;N;;;;; -144CF;ANATOLIAN HIEROGLYPH A180;Lo;0;L;;;;;N;;;;; -144D0;ANATOLIAN HIEROGLYPH A181;Lo;0;L;;;;;N;;;;; -144D1;ANATOLIAN HIEROGLYPH A182;Lo;0;L;;;;;N;;;;; -144D2;ANATOLIAN HIEROGLYPH A183;Lo;0;L;;;;;N;;;;; -144D3;ANATOLIAN HIEROGLYPH A184;Lo;0;L;;;;;N;;;;; -144D4;ANATOLIAN HIEROGLYPH A185;Lo;0;L;;;;;N;;;;; -144D5;ANATOLIAN HIEROGLYPH A186;Lo;0;L;;;;;N;;;;; -144D6;ANATOLIAN HIEROGLYPH A187;Lo;0;L;;;;;N;;;;; -144D7;ANATOLIAN HIEROGLYPH A188;Lo;0;L;;;;;N;;;;; -144D8;ANATOLIAN HIEROGLYPH A189;Lo;0;L;;;;;N;;;;; -144D9;ANATOLIAN HIEROGLYPH A190;Lo;0;L;;;;;N;;;;; -144DA;ANATOLIAN HIEROGLYPH A191;Lo;0;L;;;;;N;;;;; -144DB;ANATOLIAN HIEROGLYPH A192;Lo;0;L;;;;;N;;;;; -144DC;ANATOLIAN HIEROGLYPH A193;Lo;0;L;;;;;N;;;;; -144DD;ANATOLIAN HIEROGLYPH A194;Lo;0;L;;;;;N;;;;; -144DE;ANATOLIAN HIEROGLYPH A195;Lo;0;L;;;;;N;;;;; -144DF;ANATOLIAN HIEROGLYPH A196;Lo;0;L;;;;;N;;;;; -144E0;ANATOLIAN HIEROGLYPH A197;Lo;0;L;;;;;N;;;;; -144E1;ANATOLIAN HIEROGLYPH A198;Lo;0;L;;;;;N;;;;; -144E2;ANATOLIAN HIEROGLYPH A199;Lo;0;L;;;;;N;;;;; -144E3;ANATOLIAN HIEROGLYPH A200;Lo;0;L;;;;;N;;;;; -144E4;ANATOLIAN HIEROGLYPH A201;Lo;0;L;;;;;N;;;;; -144E5;ANATOLIAN HIEROGLYPH A202;Lo;0;L;;;;;N;;;;; -144E6;ANATOLIAN HIEROGLYPH A202A;Lo;0;L;;;;;N;;;;; -144E7;ANATOLIAN HIEROGLYPH A202B;Lo;0;L;;;;;N;;;;; -144E8;ANATOLIAN HIEROGLYPH A203;Lo;0;L;;;;;N;;;;; -144E9;ANATOLIAN HIEROGLYPH A204;Lo;0;L;;;;;N;;;;; -144EA;ANATOLIAN HIEROGLYPH A205;Lo;0;L;;;;;N;;;;; -144EB;ANATOLIAN HIEROGLYPH A206;Lo;0;L;;;;;N;;;;; -144EC;ANATOLIAN HIEROGLYPH A207;Lo;0;L;;;;;N;;;;; -144ED;ANATOLIAN HIEROGLYPH A207A;Lo;0;L;;;;;N;;;;; -144EE;ANATOLIAN HIEROGLYPH A208;Lo;0;L;;;;;N;;;;; -144EF;ANATOLIAN HIEROGLYPH A209;Lo;0;L;;;;;N;;;;; -144F0;ANATOLIAN HIEROGLYPH A209A;Lo;0;L;;;;;N;;;;; -144F1;ANATOLIAN HIEROGLYPH A210;Lo;0;L;;;;;N;;;;; -144F2;ANATOLIAN HIEROGLYPH A211;Lo;0;L;;;;;N;;;;; -144F3;ANATOLIAN HIEROGLYPH A212;Lo;0;L;;;;;N;;;;; -144F4;ANATOLIAN HIEROGLYPH A213;Lo;0;L;;;;;N;;;;; -144F5;ANATOLIAN HIEROGLYPH A214;Lo;0;L;;;;;N;;;;; -144F6;ANATOLIAN HIEROGLYPH A215;Lo;0;L;;;;;N;;;;; -144F7;ANATOLIAN HIEROGLYPH A215A;Lo;0;L;;;;;N;;;;; -144F8;ANATOLIAN HIEROGLYPH A216;Lo;0;L;;;;;N;;;;; -144F9;ANATOLIAN HIEROGLYPH A216A;Lo;0;L;;;;;N;;;;; -144FA;ANATOLIAN HIEROGLYPH A217;Lo;0;L;;;;;N;;;;; -144FB;ANATOLIAN HIEROGLYPH A218;Lo;0;L;;;;;N;;;;; -144FC;ANATOLIAN HIEROGLYPH A219;Lo;0;L;;;;;N;;;;; -144FD;ANATOLIAN HIEROGLYPH A220;Lo;0;L;;;;;N;;;;; -144FE;ANATOLIAN HIEROGLYPH A221;Lo;0;L;;;;;N;;;;; -144FF;ANATOLIAN HIEROGLYPH A222;Lo;0;L;;;;;N;;;;; -14500;ANATOLIAN HIEROGLYPH A223;Lo;0;L;;;;;N;;;;; -14501;ANATOLIAN HIEROGLYPH A224;Lo;0;L;;;;;N;;;;; -14502;ANATOLIAN HIEROGLYPH A225;Lo;0;L;;;;;N;;;;; -14503;ANATOLIAN HIEROGLYPH A226;Lo;0;L;;;;;N;;;;; -14504;ANATOLIAN HIEROGLYPH A227;Lo;0;L;;;;;N;;;;; -14505;ANATOLIAN HIEROGLYPH A227A;Lo;0;L;;;;;N;;;;; -14506;ANATOLIAN HIEROGLYPH A228;Lo;0;L;;;;;N;;;;; -14507;ANATOLIAN HIEROGLYPH A229;Lo;0;L;;;;;N;;;;; -14508;ANATOLIAN HIEROGLYPH A230;Lo;0;L;;;;;N;;;;; -14509;ANATOLIAN HIEROGLYPH A231;Lo;0;L;;;;;N;;;;; -1450A;ANATOLIAN HIEROGLYPH A232;Lo;0;L;;;;;N;;;;; -1450B;ANATOLIAN HIEROGLYPH A233;Lo;0;L;;;;;N;;;;; -1450C;ANATOLIAN HIEROGLYPH A234;Lo;0;L;;;;;N;;;;; -1450D;ANATOLIAN HIEROGLYPH A235;Lo;0;L;;;;;N;;;;; -1450E;ANATOLIAN HIEROGLYPH A236;Lo;0;L;;;;;N;;;;; -1450F;ANATOLIAN HIEROGLYPH A237;Lo;0;L;;;;;N;;;;; -14510;ANATOLIAN HIEROGLYPH A238;Lo;0;L;;;;;N;;;;; -14511;ANATOLIAN HIEROGLYPH A239;Lo;0;L;;;;;N;;;;; -14512;ANATOLIAN HIEROGLYPH A240;Lo;0;L;;;;;N;;;;; -14513;ANATOLIAN HIEROGLYPH A241;Lo;0;L;;;;;N;;;;; -14514;ANATOLIAN HIEROGLYPH A242;Lo;0;L;;;;;N;;;;; -14515;ANATOLIAN HIEROGLYPH A243;Lo;0;L;;;;;N;;;;; -14516;ANATOLIAN HIEROGLYPH A244;Lo;0;L;;;;;N;;;;; -14517;ANATOLIAN HIEROGLYPH A245;Lo;0;L;;;;;N;;;;; -14518;ANATOLIAN HIEROGLYPH A246;Lo;0;L;;;;;N;;;;; -14519;ANATOLIAN HIEROGLYPH A247;Lo;0;L;;;;;N;;;;; -1451A;ANATOLIAN HIEROGLYPH A248;Lo;0;L;;;;;N;;;;; -1451B;ANATOLIAN HIEROGLYPH A249;Lo;0;L;;;;;N;;;;; -1451C;ANATOLIAN HIEROGLYPH A250;Lo;0;L;;;;;N;;;;; -1451D;ANATOLIAN HIEROGLYPH A251;Lo;0;L;;;;;N;;;;; -1451E;ANATOLIAN HIEROGLYPH A252;Lo;0;L;;;;;N;;;;; -1451F;ANATOLIAN HIEROGLYPH A253;Lo;0;L;;;;;N;;;;; -14520;ANATOLIAN HIEROGLYPH A254;Lo;0;L;;;;;N;;;;; -14521;ANATOLIAN HIEROGLYPH A255;Lo;0;L;;;;;N;;;;; -14522;ANATOLIAN HIEROGLYPH A256;Lo;0;L;;;;;N;;;;; -14523;ANATOLIAN HIEROGLYPH A257;Lo;0;L;;;;;N;;;;; -14524;ANATOLIAN HIEROGLYPH A258;Lo;0;L;;;;;N;;;;; -14525;ANATOLIAN HIEROGLYPH A259;Lo;0;L;;;;;N;;;;; -14526;ANATOLIAN HIEROGLYPH A260;Lo;0;L;;;;;N;;;;; -14527;ANATOLIAN HIEROGLYPH A261;Lo;0;L;;;;;N;;;;; -14528;ANATOLIAN HIEROGLYPH A262;Lo;0;L;;;;;N;;;;; -14529;ANATOLIAN HIEROGLYPH A263;Lo;0;L;;;;;N;;;;; -1452A;ANATOLIAN HIEROGLYPH A264;Lo;0;L;;;;;N;;;;; -1452B;ANATOLIAN HIEROGLYPH A265;Lo;0;L;;;;;N;;;;; -1452C;ANATOLIAN HIEROGLYPH A266;Lo;0;L;;;;;N;;;;; -1452D;ANATOLIAN HIEROGLYPH A267;Lo;0;L;;;;;N;;;;; -1452E;ANATOLIAN HIEROGLYPH A267A;Lo;0;L;;;;;N;;;;; -1452F;ANATOLIAN HIEROGLYPH A268;Lo;0;L;;;;;N;;;;; -14530;ANATOLIAN HIEROGLYPH A269;Lo;0;L;;;;;N;;;;; -14531;ANATOLIAN HIEROGLYPH A270;Lo;0;L;;;;;N;;;;; -14532;ANATOLIAN HIEROGLYPH A271;Lo;0;L;;;;;N;;;;; -14533;ANATOLIAN HIEROGLYPH A272;Lo;0;L;;;;;N;;;;; -14534;ANATOLIAN HIEROGLYPH A273;Lo;0;L;;;;;N;;;;; -14535;ANATOLIAN HIEROGLYPH A274;Lo;0;L;;;;;N;;;;; -14536;ANATOLIAN HIEROGLYPH A275;Lo;0;L;;;;;N;;;;; -14537;ANATOLIAN HIEROGLYPH A276;Lo;0;L;;;;;N;;;;; -14538;ANATOLIAN HIEROGLYPH A277;Lo;0;L;;;;;N;;;;; -14539;ANATOLIAN HIEROGLYPH A278;Lo;0;L;;;;;N;;;;; -1453A;ANATOLIAN HIEROGLYPH A279;Lo;0;L;;;;;N;;;;; -1453B;ANATOLIAN HIEROGLYPH A280;Lo;0;L;;;;;N;;;;; -1453C;ANATOLIAN HIEROGLYPH A281;Lo;0;L;;;;;N;;;;; -1453D;ANATOLIAN HIEROGLYPH A282;Lo;0;L;;;;;N;;;;; -1453E;ANATOLIAN HIEROGLYPH A283;Lo;0;L;;;;;N;;;;; -1453F;ANATOLIAN HIEROGLYPH A284;Lo;0;L;;;;;N;;;;; -14540;ANATOLIAN HIEROGLYPH A285;Lo;0;L;;;;;N;;;;; -14541;ANATOLIAN HIEROGLYPH A286;Lo;0;L;;;;;N;;;;; -14542;ANATOLIAN HIEROGLYPH A287;Lo;0;L;;;;;N;;;;; -14543;ANATOLIAN HIEROGLYPH A288;Lo;0;L;;;;;N;;;;; -14544;ANATOLIAN HIEROGLYPH A289;Lo;0;L;;;;;N;;;;; -14545;ANATOLIAN HIEROGLYPH A289A;Lo;0;L;;;;;N;;;;; -14546;ANATOLIAN HIEROGLYPH A290;Lo;0;L;;;;;N;;;;; -14547;ANATOLIAN HIEROGLYPH A291;Lo;0;L;;;;;N;;;;; -14548;ANATOLIAN HIEROGLYPH A292;Lo;0;L;;;;;N;;;;; -14549;ANATOLIAN HIEROGLYPH A293;Lo;0;L;;;;;N;;;;; -1454A;ANATOLIAN HIEROGLYPH A294;Lo;0;L;;;;;N;;;;; -1454B;ANATOLIAN HIEROGLYPH A294A;Lo;0;L;;;;;N;;;;; -1454C;ANATOLIAN HIEROGLYPH A295;Lo;0;L;;;;;N;;;;; -1454D;ANATOLIAN HIEROGLYPH A296;Lo;0;L;;;;;N;;;;; -1454E;ANATOLIAN HIEROGLYPH A297;Lo;0;L;;;;;N;;;;; -1454F;ANATOLIAN HIEROGLYPH A298;Lo;0;L;;;;;N;;;;; -14550;ANATOLIAN HIEROGLYPH A299;Lo;0;L;;;;;N;;;;; -14551;ANATOLIAN HIEROGLYPH A299A;Lo;0;L;;;;;N;;;;; -14552;ANATOLIAN HIEROGLYPH A300;Lo;0;L;;;;;N;;;;; -14553;ANATOLIAN HIEROGLYPH A301;Lo;0;L;;;;;N;;;;; -14554;ANATOLIAN HIEROGLYPH A302;Lo;0;L;;;;;N;;;;; -14555;ANATOLIAN HIEROGLYPH A303;Lo;0;L;;;;;N;;;;; -14556;ANATOLIAN HIEROGLYPH A304;Lo;0;L;;;;;N;;;;; -14557;ANATOLIAN HIEROGLYPH A305;Lo;0;L;;;;;N;;;;; -14558;ANATOLIAN HIEROGLYPH A306;Lo;0;L;;;;;N;;;;; -14559;ANATOLIAN HIEROGLYPH A307;Lo;0;L;;;;;N;;;;; -1455A;ANATOLIAN HIEROGLYPH A308;Lo;0;L;;;;;N;;;;; -1455B;ANATOLIAN HIEROGLYPH A309;Lo;0;L;;;;;N;;;;; -1455C;ANATOLIAN HIEROGLYPH A309A;Lo;0;L;;;;;N;;;;; -1455D;ANATOLIAN HIEROGLYPH A310;Lo;0;L;;;;;N;;;;; -1455E;ANATOLIAN HIEROGLYPH A311;Lo;0;L;;;;;N;;;;; -1455F;ANATOLIAN HIEROGLYPH A312;Lo;0;L;;;;;N;;;;; -14560;ANATOLIAN HIEROGLYPH A313;Lo;0;L;;;;;N;;;;; -14561;ANATOLIAN HIEROGLYPH A314;Lo;0;L;;;;;N;;;;; -14562;ANATOLIAN HIEROGLYPH A315;Lo;0;L;;;;;N;;;;; -14563;ANATOLIAN HIEROGLYPH A316;Lo;0;L;;;;;N;;;;; -14564;ANATOLIAN HIEROGLYPH A317;Lo;0;L;;;;;N;;;;; -14565;ANATOLIAN HIEROGLYPH A318;Lo;0;L;;;;;N;;;;; -14566;ANATOLIAN HIEROGLYPH A319;Lo;0;L;;;;;N;;;;; -14567;ANATOLIAN HIEROGLYPH A320;Lo;0;L;;;;;N;;;;; -14568;ANATOLIAN HIEROGLYPH A321;Lo;0;L;;;;;N;;;;; -14569;ANATOLIAN HIEROGLYPH A322;Lo;0;L;;;;;N;;;;; -1456A;ANATOLIAN HIEROGLYPH A323;Lo;0;L;;;;;N;;;;; -1456B;ANATOLIAN HIEROGLYPH A324;Lo;0;L;;;;;N;;;;; -1456C;ANATOLIAN HIEROGLYPH A325;Lo;0;L;;;;;N;;;;; -1456D;ANATOLIAN HIEROGLYPH A326;Lo;0;L;;;;;N;;;;; -1456E;ANATOLIAN HIEROGLYPH A327;Lo;0;L;;;;;N;;;;; -1456F;ANATOLIAN HIEROGLYPH A328;Lo;0;L;;;;;N;;;;; -14570;ANATOLIAN HIEROGLYPH A329;Lo;0;L;;;;;N;;;;; -14571;ANATOLIAN HIEROGLYPH A329A;Lo;0;L;;;;;N;;;;; -14572;ANATOLIAN HIEROGLYPH A330;Lo;0;L;;;;;N;;;;; -14573;ANATOLIAN HIEROGLYPH A331;Lo;0;L;;;;;N;;;;; -14574;ANATOLIAN HIEROGLYPH A332A;Lo;0;L;;;;;N;;;;; -14575;ANATOLIAN HIEROGLYPH A332B;Lo;0;L;;;;;N;;;;; -14576;ANATOLIAN HIEROGLYPH A332C;Lo;0;L;;;;;N;;;;; -14577;ANATOLIAN HIEROGLYPH A333;Lo;0;L;;;;;N;;;;; -14578;ANATOLIAN HIEROGLYPH A334;Lo;0;L;;;;;N;;;;; -14579;ANATOLIAN HIEROGLYPH A335;Lo;0;L;;;;;N;;;;; -1457A;ANATOLIAN HIEROGLYPH A336;Lo;0;L;;;;;N;;;;; -1457B;ANATOLIAN HIEROGLYPH A336A;Lo;0;L;;;;;N;;;;; -1457C;ANATOLIAN HIEROGLYPH A336B;Lo;0;L;;;;;N;;;;; -1457D;ANATOLIAN HIEROGLYPH A336C;Lo;0;L;;;;;N;;;;; -1457E;ANATOLIAN HIEROGLYPH A337;Lo;0;L;;;;;N;;;;; -1457F;ANATOLIAN HIEROGLYPH A338;Lo;0;L;;;;;N;;;;; -14580;ANATOLIAN HIEROGLYPH A339;Lo;0;L;;;;;N;;;;; -14581;ANATOLIAN HIEROGLYPH A340;Lo;0;L;;;;;N;;;;; -14582;ANATOLIAN HIEROGLYPH A341;Lo;0;L;;;;;N;;;;; -14583;ANATOLIAN HIEROGLYPH A342;Lo;0;L;;;;;N;;;;; -14584;ANATOLIAN HIEROGLYPH A343;Lo;0;L;;;;;N;;;;; -14585;ANATOLIAN HIEROGLYPH A344;Lo;0;L;;;;;N;;;;; -14586;ANATOLIAN HIEROGLYPH A345;Lo;0;L;;;;;N;;;;; -14587;ANATOLIAN HIEROGLYPH A346;Lo;0;L;;;;;N;;;;; -14588;ANATOLIAN HIEROGLYPH A347;Lo;0;L;;;;;N;;;;; -14589;ANATOLIAN HIEROGLYPH A348;Lo;0;L;;;;;N;;;;; -1458A;ANATOLIAN HIEROGLYPH A349;Lo;0;L;;;;;N;;;;; -1458B;ANATOLIAN HIEROGLYPH A350;Lo;0;L;;;;;N;;;;; -1458C;ANATOLIAN HIEROGLYPH A351;Lo;0;L;;;;;N;;;;; -1458D;ANATOLIAN HIEROGLYPH A352;Lo;0;L;;;;;N;;;;; -1458E;ANATOLIAN HIEROGLYPH A353;Lo;0;L;;;;;N;;;;; -1458F;ANATOLIAN HIEROGLYPH A354;Lo;0;L;;;;;N;;;;; -14590;ANATOLIAN HIEROGLYPH A355;Lo;0;L;;;;;N;;;;; -14591;ANATOLIAN HIEROGLYPH A356;Lo;0;L;;;;;N;;;;; -14592;ANATOLIAN HIEROGLYPH A357;Lo;0;L;;;;;N;;;;; -14593;ANATOLIAN HIEROGLYPH A358;Lo;0;L;;;;;N;;;;; -14594;ANATOLIAN HIEROGLYPH A359;Lo;0;L;;;;;N;;;;; -14595;ANATOLIAN HIEROGLYPH A359A;Lo;0;L;;;;;N;;;;; -14596;ANATOLIAN HIEROGLYPH A360;Lo;0;L;;;;;N;;;;; -14597;ANATOLIAN HIEROGLYPH A361;Lo;0;L;;;;;N;;;;; -14598;ANATOLIAN HIEROGLYPH A362;Lo;0;L;;;;;N;;;;; -14599;ANATOLIAN HIEROGLYPH A363;Lo;0;L;;;;;N;;;;; -1459A;ANATOLIAN HIEROGLYPH A364;Lo;0;L;;;;;N;;;;; -1459B;ANATOLIAN HIEROGLYPH A364A;Lo;0;L;;;;;N;;;;; -1459C;ANATOLIAN HIEROGLYPH A365;Lo;0;L;;;;;N;;;;; -1459D;ANATOLIAN HIEROGLYPH A366;Lo;0;L;;;;;N;;;;; -1459E;ANATOLIAN HIEROGLYPH A367;Lo;0;L;;;;;N;;;;; -1459F;ANATOLIAN HIEROGLYPH A368;Lo;0;L;;;;;N;;;;; -145A0;ANATOLIAN HIEROGLYPH A368A;Lo;0;L;;;;;N;;;;; -145A1;ANATOLIAN HIEROGLYPH A369;Lo;0;L;;;;;N;;;;; -145A2;ANATOLIAN HIEROGLYPH A370;Lo;0;L;;;;;N;;;;; -145A3;ANATOLIAN HIEROGLYPH A371;Lo;0;L;;;;;N;;;;; -145A4;ANATOLIAN HIEROGLYPH A371A;Lo;0;L;;;;;N;;;;; -145A5;ANATOLIAN HIEROGLYPH A372;Lo;0;L;;;;;N;;;;; -145A6;ANATOLIAN HIEROGLYPH A373;Lo;0;L;;;;;N;;;;; -145A7;ANATOLIAN HIEROGLYPH A374;Lo;0;L;;;;;N;;;;; -145A8;ANATOLIAN HIEROGLYPH A375;Lo;0;L;;;;;N;;;;; -145A9;ANATOLIAN HIEROGLYPH A376;Lo;0;L;;;;;N;;;;; -145AA;ANATOLIAN HIEROGLYPH A377;Lo;0;L;;;;;N;;;;; -145AB;ANATOLIAN HIEROGLYPH A378;Lo;0;L;;;;;N;;;;; -145AC;ANATOLIAN HIEROGLYPH A379;Lo;0;L;;;;;N;;;;; -145AD;ANATOLIAN HIEROGLYPH A380;Lo;0;L;;;;;N;;;;; -145AE;ANATOLIAN HIEROGLYPH A381;Lo;0;L;;;;;N;;;;; -145AF;ANATOLIAN HIEROGLYPH A381A;Lo;0;L;;;;;N;;;;; -145B0;ANATOLIAN HIEROGLYPH A382;Lo;0;L;;;;;N;;;;; -145B1;ANATOLIAN HIEROGLYPH A383 RA OR RI;Lo;0;L;;;;;N;;;;; -145B2;ANATOLIAN HIEROGLYPH A383A;Lo;0;L;;;;;N;;;;; -145B3;ANATOLIAN HIEROGLYPH A384;Lo;0;L;;;;;N;;;;; -145B4;ANATOLIAN HIEROGLYPH A385;Lo;0;L;;;;;N;;;;; -145B5;ANATOLIAN HIEROGLYPH A386;Lo;0;L;;;;;N;;;;; -145B6;ANATOLIAN HIEROGLYPH A386A;Lo;0;L;;;;;N;;;;; -145B7;ANATOLIAN HIEROGLYPH A387;Lo;0;L;;;;;N;;;;; -145B8;ANATOLIAN HIEROGLYPH A388;Lo;0;L;;;;;N;;;;; -145B9;ANATOLIAN HIEROGLYPH A389;Lo;0;L;;;;;N;;;;; -145BA;ANATOLIAN HIEROGLYPH A390;Lo;0;L;;;;;N;;;;; -145BB;ANATOLIAN HIEROGLYPH A391;Lo;0;L;;;;;N;;;;; -145BC;ANATOLIAN HIEROGLYPH A392;Lo;0;L;;;;;N;;;;; -145BD;ANATOLIAN HIEROGLYPH A393 EIGHT;Lo;0;L;;;;;N;;;;; -145BE;ANATOLIAN HIEROGLYPH A394;Lo;0;L;;;;;N;;;;; -145BF;ANATOLIAN HIEROGLYPH A395;Lo;0;L;;;;;N;;;;; -145C0;ANATOLIAN HIEROGLYPH A396;Lo;0;L;;;;;N;;;;; -145C1;ANATOLIAN HIEROGLYPH A397;Lo;0;L;;;;;N;;;;; -145C2;ANATOLIAN HIEROGLYPH A398;Lo;0;L;;;;;N;;;;; -145C3;ANATOLIAN HIEROGLYPH A399;Lo;0;L;;;;;N;;;;; -145C4;ANATOLIAN HIEROGLYPH A400;Lo;0;L;;;;;N;;;;; -145C5;ANATOLIAN HIEROGLYPH A401;Lo;0;L;;;;;N;;;;; -145C6;ANATOLIAN HIEROGLYPH A402;Lo;0;L;;;;;N;;;;; -145C7;ANATOLIAN HIEROGLYPH A403;Lo;0;L;;;;;N;;;;; -145C8;ANATOLIAN HIEROGLYPH A404;Lo;0;L;;;;;N;;;;; -145C9;ANATOLIAN HIEROGLYPH A405;Lo;0;L;;;;;N;;;;; -145CA;ANATOLIAN HIEROGLYPH A406;Lo;0;L;;;;;N;;;;; -145CB;ANATOLIAN HIEROGLYPH A407;Lo;0;L;;;;;N;;;;; -145CC;ANATOLIAN HIEROGLYPH A408;Lo;0;L;;;;;N;;;;; -145CD;ANATOLIAN HIEROGLYPH A409;Lo;0;L;;;;;N;;;;; -145CE;ANATOLIAN HIEROGLYPH A410 BEGIN LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; -145CF;ANATOLIAN HIEROGLYPH A410A END LOGOGRAM MARK;Lo;0;L;;;;;N;;;;; -145D0;ANATOLIAN HIEROGLYPH A411;Lo;0;L;;;;;N;;;;; -145D1;ANATOLIAN HIEROGLYPH A412;Lo;0;L;;;;;N;;;;; -145D2;ANATOLIAN HIEROGLYPH A413;Lo;0;L;;;;;N;;;;; -145D3;ANATOLIAN HIEROGLYPH A414;Lo;0;L;;;;;N;;;;; -145D4;ANATOLIAN HIEROGLYPH A415;Lo;0;L;;;;;N;;;;; -145D5;ANATOLIAN HIEROGLYPH A416;Lo;0;L;;;;;N;;;;; -145D6;ANATOLIAN HIEROGLYPH A417;Lo;0;L;;;;;N;;;;; -145D7;ANATOLIAN HIEROGLYPH A418;Lo;0;L;;;;;N;;;;; -145D8;ANATOLIAN HIEROGLYPH A419;Lo;0;L;;;;;N;;;;; -145D9;ANATOLIAN HIEROGLYPH A420;Lo;0;L;;;;;N;;;;; -145DA;ANATOLIAN HIEROGLYPH A421;Lo;0;L;;;;;N;;;;; -145DB;ANATOLIAN HIEROGLYPH A422;Lo;0;L;;;;;N;;;;; -145DC;ANATOLIAN HIEROGLYPH A423;Lo;0;L;;;;;N;;;;; -145DD;ANATOLIAN HIEROGLYPH A424;Lo;0;L;;;;;N;;;;; -145DE;ANATOLIAN HIEROGLYPH A425;Lo;0;L;;;;;N;;;;; -145DF;ANATOLIAN HIEROGLYPH A426;Lo;0;L;;;;;N;;;;; -145E0;ANATOLIAN HIEROGLYPH A427;Lo;0;L;;;;;N;;;;; -145E1;ANATOLIAN HIEROGLYPH A428;Lo;0;L;;;;;N;;;;; -145E2;ANATOLIAN HIEROGLYPH A429;Lo;0;L;;;;;N;;;;; -145E3;ANATOLIAN HIEROGLYPH A430;Lo;0;L;;;;;N;;;;; -145E4;ANATOLIAN HIEROGLYPH A431;Lo;0;L;;;;;N;;;;; -145E5;ANATOLIAN HIEROGLYPH A432;Lo;0;L;;;;;N;;;;; -145E6;ANATOLIAN HIEROGLYPH A433;Lo;0;L;;;;;N;;;;; -145E7;ANATOLIAN HIEROGLYPH A434;Lo;0;L;;;;;N;;;;; -145E8;ANATOLIAN HIEROGLYPH A435;Lo;0;L;;;;;N;;;;; -145E9;ANATOLIAN HIEROGLYPH A436;Lo;0;L;;;;;N;;;;; -145EA;ANATOLIAN HIEROGLYPH A437;Lo;0;L;;;;;N;;;;; -145EB;ANATOLIAN HIEROGLYPH A438;Lo;0;L;;;;;N;;;;; -145EC;ANATOLIAN HIEROGLYPH A439;Lo;0;L;;;;;N;;;;; -145ED;ANATOLIAN HIEROGLYPH A440;Lo;0;L;;;;;N;;;;; -145EE;ANATOLIAN HIEROGLYPH A441;Lo;0;L;;;;;N;;;;; -145EF;ANATOLIAN HIEROGLYPH A442;Lo;0;L;;;;;N;;;;; -145F0;ANATOLIAN HIEROGLYPH A443;Lo;0;L;;;;;N;;;;; -145F1;ANATOLIAN HIEROGLYPH A444;Lo;0;L;;;;;N;;;;; -145F2;ANATOLIAN HIEROGLYPH A445;Lo;0;L;;;;;N;;;;; -145F3;ANATOLIAN HIEROGLYPH A446;Lo;0;L;;;;;N;;;;; -145F4;ANATOLIAN HIEROGLYPH A447;Lo;0;L;;;;;N;;;;; -145F5;ANATOLIAN HIEROGLYPH A448;Lo;0;L;;;;;N;;;;; -145F6;ANATOLIAN HIEROGLYPH A449;Lo;0;L;;;;;N;;;;; -145F7;ANATOLIAN HIEROGLYPH A450;Lo;0;L;;;;;N;;;;; -145F8;ANATOLIAN HIEROGLYPH A450A;Lo;0;L;;;;;N;;;;; -145F9;ANATOLIAN HIEROGLYPH A451;Lo;0;L;;;;;N;;;;; -145FA;ANATOLIAN HIEROGLYPH A452;Lo;0;L;;;;;N;;;;; -145FB;ANATOLIAN HIEROGLYPH A453;Lo;0;L;;;;;N;;;;; -145FC;ANATOLIAN HIEROGLYPH A454;Lo;0;L;;;;;N;;;;; -145FD;ANATOLIAN HIEROGLYPH A455;Lo;0;L;;;;;N;;;;; -145FE;ANATOLIAN HIEROGLYPH A456;Lo;0;L;;;;;N;;;;; -145FF;ANATOLIAN HIEROGLYPH A457;Lo;0;L;;;;;N;;;;; -14600;ANATOLIAN HIEROGLYPH A457A;Lo;0;L;;;;;N;;;;; -14601;ANATOLIAN HIEROGLYPH A458;Lo;0;L;;;;;N;;;;; -14602;ANATOLIAN HIEROGLYPH A459;Lo;0;L;;;;;N;;;;; -14603;ANATOLIAN HIEROGLYPH A460;Lo;0;L;;;;;N;;;;; -14604;ANATOLIAN HIEROGLYPH A461;Lo;0;L;;;;;N;;;;; -14605;ANATOLIAN HIEROGLYPH A462;Lo;0;L;;;;;N;;;;; -14606;ANATOLIAN HIEROGLYPH A463;Lo;0;L;;;;;N;;;;; -14607;ANATOLIAN HIEROGLYPH A464;Lo;0;L;;;;;N;;;;; -14608;ANATOLIAN HIEROGLYPH A465;Lo;0;L;;;;;N;;;;; -14609;ANATOLIAN HIEROGLYPH A466;Lo;0;L;;;;;N;;;;; -1460A;ANATOLIAN HIEROGLYPH A467;Lo;0;L;;;;;N;;;;; -1460B;ANATOLIAN HIEROGLYPH A468;Lo;0;L;;;;;N;;;;; -1460C;ANATOLIAN HIEROGLYPH A469;Lo;0;L;;;;;N;;;;; -1460D;ANATOLIAN HIEROGLYPH A470;Lo;0;L;;;;;N;;;;; -1460E;ANATOLIAN HIEROGLYPH A471;Lo;0;L;;;;;N;;;;; -1460F;ANATOLIAN HIEROGLYPH A472;Lo;0;L;;;;;N;;;;; -14610;ANATOLIAN HIEROGLYPH A473;Lo;0;L;;;;;N;;;;; -14611;ANATOLIAN HIEROGLYPH A474;Lo;0;L;;;;;N;;;;; -14612;ANATOLIAN HIEROGLYPH A475;Lo;0;L;;;;;N;;;;; -14613;ANATOLIAN HIEROGLYPH A476;Lo;0;L;;;;;N;;;;; -14614;ANATOLIAN HIEROGLYPH A477;Lo;0;L;;;;;N;;;;; -14615;ANATOLIAN HIEROGLYPH A478;Lo;0;L;;;;;N;;;;; -14616;ANATOLIAN HIEROGLYPH A479;Lo;0;L;;;;;N;;;;; -14617;ANATOLIAN HIEROGLYPH A480;Lo;0;L;;;;;N;;;;; -14618;ANATOLIAN HIEROGLYPH A481;Lo;0;L;;;;;N;;;;; -14619;ANATOLIAN HIEROGLYPH A482;Lo;0;L;;;;;N;;;;; -1461A;ANATOLIAN HIEROGLYPH A483;Lo;0;L;;;;;N;;;;; -1461B;ANATOLIAN HIEROGLYPH A484;Lo;0;L;;;;;N;;;;; -1461C;ANATOLIAN HIEROGLYPH A485;Lo;0;L;;;;;N;;;;; -1461D;ANATOLIAN HIEROGLYPH A486;Lo;0;L;;;;;N;;;;; -1461E;ANATOLIAN HIEROGLYPH A487;Lo;0;L;;;;;N;;;;; -1461F;ANATOLIAN HIEROGLYPH A488;Lo;0;L;;;;;N;;;;; -14620;ANATOLIAN HIEROGLYPH A489;Lo;0;L;;;;;N;;;;; -14621;ANATOLIAN HIEROGLYPH A490;Lo;0;L;;;;;N;;;;; -14622;ANATOLIAN HIEROGLYPH A491;Lo;0;L;;;;;N;;;;; -14623;ANATOLIAN HIEROGLYPH A492;Lo;0;L;;;;;N;;;;; -14624;ANATOLIAN HIEROGLYPH A493;Lo;0;L;;;;;N;;;;; -14625;ANATOLIAN HIEROGLYPH A494;Lo;0;L;;;;;N;;;;; -14626;ANATOLIAN HIEROGLYPH A495;Lo;0;L;;;;;N;;;;; -14627;ANATOLIAN HIEROGLYPH A496;Lo;0;L;;;;;N;;;;; -14628;ANATOLIAN HIEROGLYPH A497;Lo;0;L;;;;;N;;;;; -14629;ANATOLIAN HIEROGLYPH A501;Lo;0;L;;;;;N;;;;; -1462A;ANATOLIAN HIEROGLYPH A502;Lo;0;L;;;;;N;;;;; -1462B;ANATOLIAN HIEROGLYPH A503;Lo;0;L;;;;;N;;;;; -1462C;ANATOLIAN HIEROGLYPH A504;Lo;0;L;;;;;N;;;;; -1462D;ANATOLIAN HIEROGLYPH A505;Lo;0;L;;;;;N;;;;; -1462E;ANATOLIAN HIEROGLYPH A506;Lo;0;L;;;;;N;;;;; -1462F;ANATOLIAN HIEROGLYPH A507;Lo;0;L;;;;;N;;;;; -14630;ANATOLIAN HIEROGLYPH A508;Lo;0;L;;;;;N;;;;; -14631;ANATOLIAN HIEROGLYPH A509;Lo;0;L;;;;;N;;;;; -14632;ANATOLIAN HIEROGLYPH A510;Lo;0;L;;;;;N;;;;; -14633;ANATOLIAN HIEROGLYPH A511;Lo;0;L;;;;;N;;;;; -14634;ANATOLIAN HIEROGLYPH A512;Lo;0;L;;;;;N;;;;; -14635;ANATOLIAN HIEROGLYPH A513;Lo;0;L;;;;;N;;;;; -14636;ANATOLIAN HIEROGLYPH A514;Lo;0;L;;;;;N;;;;; -14637;ANATOLIAN HIEROGLYPH A515;Lo;0;L;;;;;N;;;;; -14638;ANATOLIAN HIEROGLYPH A516;Lo;0;L;;;;;N;;;;; -14639;ANATOLIAN HIEROGLYPH A517;Lo;0;L;;;;;N;;;;; -1463A;ANATOLIAN HIEROGLYPH A518;Lo;0;L;;;;;N;;;;; -1463B;ANATOLIAN HIEROGLYPH A519;Lo;0;L;;;;;N;;;;; -1463C;ANATOLIAN HIEROGLYPH A520;Lo;0;L;;;;;N;;;;; -1463D;ANATOLIAN HIEROGLYPH A521;Lo;0;L;;;;;N;;;;; -1463E;ANATOLIAN HIEROGLYPH A522;Lo;0;L;;;;;N;;;;; -1463F;ANATOLIAN HIEROGLYPH A523;Lo;0;L;;;;;N;;;;; -14640;ANATOLIAN HIEROGLYPH A524;Lo;0;L;;;;;N;;;;; -14641;ANATOLIAN HIEROGLYPH A525;Lo;0;L;;;;;N;;;;; -14642;ANATOLIAN HIEROGLYPH A526;Lo;0;L;;;;;N;;;;; -14643;ANATOLIAN HIEROGLYPH A527;Lo;0;L;;;;;N;;;;; -14644;ANATOLIAN HIEROGLYPH A528;Lo;0;L;;;;;N;;;;; -14645;ANATOLIAN HIEROGLYPH A529;Lo;0;L;;;;;N;;;;; -14646;ANATOLIAN HIEROGLYPH A530;Lo;0;L;;;;;N;;;;; -16800;BAMUM LETTER PHASE-A NGKUE MFON;Lo;0;L;;;;;N;;;;; -16801;BAMUM LETTER PHASE-A GBIEE FON;Lo;0;L;;;;;N;;;;; -16802;BAMUM LETTER PHASE-A PON MFON PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; -16803;BAMUM LETTER PHASE-A PON MFON PIPAEMBA;Lo;0;L;;;;;N;;;;; -16804;BAMUM LETTER PHASE-A NAA MFON;Lo;0;L;;;;;N;;;;; -16805;BAMUM LETTER PHASE-A SHUENSHUET;Lo;0;L;;;;;N;;;;; -16806;BAMUM LETTER PHASE-A TITA MFON;Lo;0;L;;;;;N;;;;; -16807;BAMUM LETTER PHASE-A NZA MFON;Lo;0;L;;;;;N;;;;; -16808;BAMUM LETTER PHASE-A SHINDA PA NJI;Lo;0;L;;;;;N;;;;; -16809;BAMUM LETTER PHASE-A PON PA NJI PIPAEMGBIEE;Lo;0;L;;;;;N;;;;; -1680A;BAMUM LETTER PHASE-A PON PA NJI PIPAEMBA;Lo;0;L;;;;;N;;;;; -1680B;BAMUM LETTER PHASE-A MAEMBGBIEE;Lo;0;L;;;;;N;;;;; -1680C;BAMUM LETTER PHASE-A TU MAEMBA;Lo;0;L;;;;;N;;;;; -1680D;BAMUM LETTER PHASE-A NGANGU;Lo;0;L;;;;;N;;;;; -1680E;BAMUM LETTER PHASE-A MAEMVEUX;Lo;0;L;;;;;N;;;;; -1680F;BAMUM LETTER PHASE-A MANSUAE;Lo;0;L;;;;;N;;;;; -16810;BAMUM LETTER PHASE-A MVEUAENGAM;Lo;0;L;;;;;N;;;;; -16811;BAMUM LETTER PHASE-A SEUNYAM;Lo;0;L;;;;;N;;;;; -16812;BAMUM LETTER PHASE-A NTOQPEN;Lo;0;L;;;;;N;;;;; -16813;BAMUM LETTER PHASE-A KEUKEUTNDA;Lo;0;L;;;;;N;;;;; -16814;BAMUM LETTER PHASE-A NKINDI;Lo;0;L;;;;;N;;;;; -16815;BAMUM LETTER PHASE-A SUU;Lo;0;L;;;;;N;;;;; -16816;BAMUM LETTER PHASE-A NGKUENZEUM;Lo;0;L;;;;;N;;;;; -16817;BAMUM LETTER PHASE-A LAPAQ;Lo;0;L;;;;;N;;;;; -16818;BAMUM LETTER PHASE-A LET KUT;Lo;0;L;;;;;N;;;;; -16819;BAMUM LETTER PHASE-A NTAP MFAA;Lo;0;L;;;;;N;;;;; -1681A;BAMUM LETTER PHASE-A MAEKEUP;Lo;0;L;;;;;N;;;;; -1681B;BAMUM LETTER PHASE-A PASHAE;Lo;0;L;;;;;N;;;;; -1681C;BAMUM LETTER PHASE-A GHEUAERAE;Lo;0;L;;;;;N;;;;; -1681D;BAMUM LETTER PHASE-A PAMSHAE;Lo;0;L;;;;;N;;;;; -1681E;BAMUM LETTER PHASE-A MON NGGEUAET;Lo;0;L;;;;;N;;;;; -1681F;BAMUM LETTER PHASE-A NZUN MEUT;Lo;0;L;;;;;N;;;;; -16820;BAMUM LETTER PHASE-A U YUQ NAE;Lo;0;L;;;;;N;;;;; -16821;BAMUM LETTER PHASE-A GHEUAEGHEUAE;Lo;0;L;;;;;N;;;;; -16822;BAMUM LETTER PHASE-A NTAP NTAA;Lo;0;L;;;;;N;;;;; -16823;BAMUM LETTER PHASE-A SISA;Lo;0;L;;;;;N;;;;; -16824;BAMUM LETTER PHASE-A MGBASA;Lo;0;L;;;;;N;;;;; -16825;BAMUM LETTER PHASE-A MEUNJOMNDEUQ;Lo;0;L;;;;;N;;;;; -16826;BAMUM LETTER PHASE-A MOOMPUQ;Lo;0;L;;;;;N;;;;; -16827;BAMUM LETTER PHASE-A KAFA;Lo;0;L;;;;;N;;;;; -16828;BAMUM LETTER PHASE-A PA LEERAEWA;Lo;0;L;;;;;N;;;;; -16829;BAMUM LETTER PHASE-A NDA LEERAEWA;Lo;0;L;;;;;N;;;;; -1682A;BAMUM LETTER PHASE-A PET;Lo;0;L;;;;;N;;;;; -1682B;BAMUM LETTER PHASE-A MAEMKPEN;Lo;0;L;;;;;N;;;;; -1682C;BAMUM LETTER PHASE-A NIKA;Lo;0;L;;;;;N;;;;; -1682D;BAMUM LETTER PHASE-A PUP;Lo;0;L;;;;;N;;;;; -1682E;BAMUM LETTER PHASE-A TUAEP;Lo;0;L;;;;;N;;;;; -1682F;BAMUM LETTER PHASE-A LUAEP;Lo;0;L;;;;;N;;;;; -16830;BAMUM LETTER PHASE-A SONJAM;Lo;0;L;;;;;N;;;;; -16831;BAMUM LETTER PHASE-A TEUTEUWEN;Lo;0;L;;;;;N;;;;; -16832;BAMUM LETTER PHASE-A MAENYI;Lo;0;L;;;;;N;;;;; -16833;BAMUM LETTER PHASE-A KET;Lo;0;L;;;;;N;;;;; -16834;BAMUM LETTER PHASE-A NDAANGGEUAET;Lo;0;L;;;;;N;;;;; -16835;BAMUM LETTER PHASE-A KUOQ;Lo;0;L;;;;;N;;;;; -16836;BAMUM LETTER PHASE-A MOOMEUT;Lo;0;L;;;;;N;;;;; -16837;BAMUM LETTER PHASE-A SHUM;Lo;0;L;;;;;N;;;;; -16838;BAMUM LETTER PHASE-A LOMMAE;Lo;0;L;;;;;N;;;;; -16839;BAMUM LETTER PHASE-A FIRI;Lo;0;L;;;;;N;;;;; -1683A;BAMUM LETTER PHASE-A ROM;Lo;0;L;;;;;N;;;;; -1683B;BAMUM LETTER PHASE-A KPOQ;Lo;0;L;;;;;N;;;;; -1683C;BAMUM LETTER PHASE-A SOQ;Lo;0;L;;;;;N;;;;; -1683D;BAMUM LETTER PHASE-A MAP PIEET;Lo;0;L;;;;;N;;;;; -1683E;BAMUM LETTER PHASE-A SHIRAE;Lo;0;L;;;;;N;;;;; -1683F;BAMUM LETTER PHASE-A NTAP;Lo;0;L;;;;;N;;;;; -16840;BAMUM LETTER PHASE-A SHOQ NSHUT YUM;Lo;0;L;;;;;N;;;;; -16841;BAMUM LETTER PHASE-A NYIT MONGKEUAEQ;Lo;0;L;;;;;N;;;;; -16842;BAMUM LETTER PHASE-A PAARAE;Lo;0;L;;;;;N;;;;; -16843;BAMUM LETTER PHASE-A NKAARAE;Lo;0;L;;;;;N;;;;; -16844;BAMUM LETTER PHASE-A UNKNOWN;Lo;0;L;;;;;N;;;;; -16845;BAMUM LETTER PHASE-A NGGEN;Lo;0;L;;;;;N;;;;; -16846;BAMUM LETTER PHASE-A MAESI;Lo;0;L;;;;;N;;;;; -16847;BAMUM LETTER PHASE-A NJAM;Lo;0;L;;;;;N;;;;; -16848;BAMUM LETTER PHASE-A MBANYI;Lo;0;L;;;;;N;;;;; -16849;BAMUM LETTER PHASE-A NYET;Lo;0;L;;;;;N;;;;; -1684A;BAMUM LETTER PHASE-A TEUAEN;Lo;0;L;;;;;N;;;;; -1684B;BAMUM LETTER PHASE-A SOT;Lo;0;L;;;;;N;;;;; -1684C;BAMUM LETTER PHASE-A PAAM;Lo;0;L;;;;;N;;;;; -1684D;BAMUM LETTER PHASE-A NSHIEE;Lo;0;L;;;;;N;;;;; -1684E;BAMUM LETTER PHASE-A MAEM;Lo;0;L;;;;;N;;;;; -1684F;BAMUM LETTER PHASE-A NYI;Lo;0;L;;;;;N;;;;; -16850;BAMUM LETTER PHASE-A KAQ;Lo;0;L;;;;;N;;;;; -16851;BAMUM LETTER PHASE-A NSHA;Lo;0;L;;;;;N;;;;; -16852;BAMUM LETTER PHASE-A VEE;Lo;0;L;;;;;N;;;;; -16853;BAMUM LETTER PHASE-A LU;Lo;0;L;;;;;N;;;;; -16854;BAMUM LETTER PHASE-A NEN;Lo;0;L;;;;;N;;;;; -16855;BAMUM LETTER PHASE-A NAQ;Lo;0;L;;;;;N;;;;; -16856;BAMUM LETTER PHASE-A MBAQ;Lo;0;L;;;;;N;;;;; -16857;BAMUM LETTER PHASE-B NSHUET;Lo;0;L;;;;;N;;;;; -16858;BAMUM LETTER PHASE-B TU MAEMGBIEE;Lo;0;L;;;;;N;;;;; -16859;BAMUM LETTER PHASE-B SIEE;Lo;0;L;;;;;N;;;;; -1685A;BAMUM LETTER PHASE-B SET TU;Lo;0;L;;;;;N;;;;; -1685B;BAMUM LETTER PHASE-B LOM NTEUM;Lo;0;L;;;;;N;;;;; -1685C;BAMUM LETTER PHASE-B MBA MAELEE;Lo;0;L;;;;;N;;;;; -1685D;BAMUM LETTER PHASE-B KIEEM;Lo;0;L;;;;;N;;;;; -1685E;BAMUM LETTER PHASE-B YEURAE;Lo;0;L;;;;;N;;;;; -1685F;BAMUM LETTER PHASE-B MBAARAE;Lo;0;L;;;;;N;;;;; -16860;BAMUM LETTER PHASE-B KAM;Lo;0;L;;;;;N;;;;; -16861;BAMUM LETTER PHASE-B PEESHI;Lo;0;L;;;;;N;;;;; -16862;BAMUM LETTER PHASE-B YAFU LEERAEWA;Lo;0;L;;;;;N;;;;; -16863;BAMUM LETTER PHASE-B LAM NSHUT NYAM;Lo;0;L;;;;;N;;;;; -16864;BAMUM LETTER PHASE-B NTIEE SHEUOQ;Lo;0;L;;;;;N;;;;; -16865;BAMUM LETTER PHASE-B NDU NJAA;Lo;0;L;;;;;N;;;;; -16866;BAMUM LETTER PHASE-B GHEUGHEUAEM;Lo;0;L;;;;;N;;;;; -16867;BAMUM LETTER PHASE-B PIT;Lo;0;L;;;;;N;;;;; -16868;BAMUM LETTER PHASE-B TU NSIEE;Lo;0;L;;;;;N;;;;; -16869;BAMUM LETTER PHASE-B SHET NJAQ;Lo;0;L;;;;;N;;;;; -1686A;BAMUM LETTER PHASE-B SHEUAEQTU;Lo;0;L;;;;;N;;;;; -1686B;BAMUM LETTER PHASE-B MFON TEUAEQ;Lo;0;L;;;;;N;;;;; -1686C;BAMUM LETTER PHASE-B MBIT MBAAKET;Lo;0;L;;;;;N;;;;; -1686D;BAMUM LETTER PHASE-B NYI NTEUM;Lo;0;L;;;;;N;;;;; -1686E;BAMUM LETTER PHASE-B KEUPUQ;Lo;0;L;;;;;N;;;;; -1686F;BAMUM LETTER PHASE-B GHEUGHEN;Lo;0;L;;;;;N;;;;; -16870;BAMUM LETTER PHASE-B KEUYEUX;Lo;0;L;;;;;N;;;;; -16871;BAMUM LETTER PHASE-B LAANAE;Lo;0;L;;;;;N;;;;; -16872;BAMUM LETTER PHASE-B PARUM;Lo;0;L;;;;;N;;;;; -16873;BAMUM LETTER PHASE-B VEUM;Lo;0;L;;;;;N;;;;; -16874;BAMUM LETTER PHASE-B NGKINDI MVOP;Lo;0;L;;;;;N;;;;; -16875;BAMUM LETTER PHASE-B NGGEU MBU;Lo;0;L;;;;;N;;;;; -16876;BAMUM LETTER PHASE-B WUAET;Lo;0;L;;;;;N;;;;; -16877;BAMUM LETTER PHASE-B SAKEUAE;Lo;0;L;;;;;N;;;;; -16878;BAMUM LETTER PHASE-B TAAM;Lo;0;L;;;;;N;;;;; -16879;BAMUM LETTER PHASE-B MEUQ;Lo;0;L;;;;;N;;;;; -1687A;BAMUM LETTER PHASE-B NGGUOQ;Lo;0;L;;;;;N;;;;; -1687B;BAMUM LETTER PHASE-B NGGUOQ LARGE;Lo;0;L;;;;;N;;;;; -1687C;BAMUM LETTER PHASE-B MFIYAQ;Lo;0;L;;;;;N;;;;; -1687D;BAMUM LETTER PHASE-B SUE;Lo;0;L;;;;;N;;;;; -1687E;BAMUM LETTER PHASE-B MBEURI;Lo;0;L;;;;;N;;;;; -1687F;BAMUM LETTER PHASE-B MONTIEEN;Lo;0;L;;;;;N;;;;; -16880;BAMUM LETTER PHASE-B NYAEMAE;Lo;0;L;;;;;N;;;;; -16881;BAMUM LETTER PHASE-B PUNGAAM;Lo;0;L;;;;;N;;;;; -16882;BAMUM LETTER PHASE-B MEUT NGGEET;Lo;0;L;;;;;N;;;;; -16883;BAMUM LETTER PHASE-B FEUX;Lo;0;L;;;;;N;;;;; -16884;BAMUM LETTER PHASE-B MBUOQ;Lo;0;L;;;;;N;;;;; -16885;BAMUM LETTER PHASE-B FEE;Lo;0;L;;;;;N;;;;; -16886;BAMUM LETTER PHASE-B KEUAEM;Lo;0;L;;;;;N;;;;; -16887;BAMUM LETTER PHASE-B MA NJEUAENA;Lo;0;L;;;;;N;;;;; -16888;BAMUM LETTER PHASE-B MA NJUQA;Lo;0;L;;;;;N;;;;; -16889;BAMUM LETTER PHASE-B LET;Lo;0;L;;;;;N;;;;; -1688A;BAMUM LETTER PHASE-B NGGAAM;Lo;0;L;;;;;N;;;;; -1688B;BAMUM LETTER PHASE-B NSEN;Lo;0;L;;;;;N;;;;; -1688C;BAMUM LETTER PHASE-B MA;Lo;0;L;;;;;N;;;;; -1688D;BAMUM LETTER PHASE-B KIQ;Lo;0;L;;;;;N;;;;; -1688E;BAMUM LETTER PHASE-B NGOM;Lo;0;L;;;;;N;;;;; -1688F;BAMUM LETTER PHASE-C NGKUE MAEMBA;Lo;0;L;;;;;N;;;;; -16890;BAMUM LETTER PHASE-C NZA;Lo;0;L;;;;;N;;;;; -16891;BAMUM LETTER PHASE-C YUM;Lo;0;L;;;;;N;;;;; -16892;BAMUM LETTER PHASE-C WANGKUOQ;Lo;0;L;;;;;N;;;;; -16893;BAMUM LETTER PHASE-C NGGEN;Lo;0;L;;;;;N;;;;; -16894;BAMUM LETTER PHASE-C NDEUAEREE;Lo;0;L;;;;;N;;;;; -16895;BAMUM LETTER PHASE-C NGKAQ;Lo;0;L;;;;;N;;;;; -16896;BAMUM LETTER PHASE-C GHARAE;Lo;0;L;;;;;N;;;;; -16897;BAMUM LETTER PHASE-C MBEEKEET;Lo;0;L;;;;;N;;;;; -16898;BAMUM LETTER PHASE-C GBAYI;Lo;0;L;;;;;N;;;;; -16899;BAMUM LETTER PHASE-C NYIR MKPARAQ MEUN;Lo;0;L;;;;;N;;;;; -1689A;BAMUM LETTER PHASE-C NTU MBIT;Lo;0;L;;;;;N;;;;; -1689B;BAMUM LETTER PHASE-C MBEUM;Lo;0;L;;;;;N;;;;; -1689C;BAMUM LETTER PHASE-C PIRIEEN;Lo;0;L;;;;;N;;;;; -1689D;BAMUM LETTER PHASE-C NDOMBU;Lo;0;L;;;;;N;;;;; -1689E;BAMUM LETTER PHASE-C MBAA CABBAGE-TREE;Lo;0;L;;;;;N;;;;; -1689F;BAMUM LETTER PHASE-C KEUSHEUAEP;Lo;0;L;;;;;N;;;;; -168A0;BAMUM LETTER PHASE-C GHAP;Lo;0;L;;;;;N;;;;; -168A1;BAMUM LETTER PHASE-C KEUKAQ;Lo;0;L;;;;;N;;;;; -168A2;BAMUM LETTER PHASE-C YU MUOMAE;Lo;0;L;;;;;N;;;;; -168A3;BAMUM LETTER PHASE-C NZEUM;Lo;0;L;;;;;N;;;;; -168A4;BAMUM LETTER PHASE-C MBUE;Lo;0;L;;;;;N;;;;; -168A5;BAMUM LETTER PHASE-C NSEUAEN;Lo;0;L;;;;;N;;;;; -168A6;BAMUM LETTER PHASE-C MBIT;Lo;0;L;;;;;N;;;;; -168A7;BAMUM LETTER PHASE-C YEUQ;Lo;0;L;;;;;N;;;;; -168A8;BAMUM LETTER PHASE-C KPARAQ;Lo;0;L;;;;;N;;;;; -168A9;BAMUM LETTER PHASE-C KAA;Lo;0;L;;;;;N;;;;; -168AA;BAMUM LETTER PHASE-C SEUX;Lo;0;L;;;;;N;;;;; -168AB;BAMUM LETTER PHASE-C NDIDA;Lo;0;L;;;;;N;;;;; -168AC;BAMUM LETTER PHASE-C TAASHAE;Lo;0;L;;;;;N;;;;; -168AD;BAMUM LETTER PHASE-C NJUEQ;Lo;0;L;;;;;N;;;;; -168AE;BAMUM LETTER PHASE-C TITA YUE;Lo;0;L;;;;;N;;;;; -168AF;BAMUM LETTER PHASE-C SUAET;Lo;0;L;;;;;N;;;;; -168B0;BAMUM LETTER PHASE-C NGGUAEN NYAM;Lo;0;L;;;;;N;;;;; -168B1;BAMUM LETTER PHASE-C VEUX;Lo;0;L;;;;;N;;;;; -168B2;BAMUM LETTER PHASE-C NANSANAQ;Lo;0;L;;;;;N;;;;; -168B3;BAMUM LETTER PHASE-C MA KEUAERI;Lo;0;L;;;;;N;;;;; -168B4;BAMUM LETTER PHASE-C NTAA;Lo;0;L;;;;;N;;;;; -168B5;BAMUM LETTER PHASE-C NGGUON;Lo;0;L;;;;;N;;;;; -168B6;BAMUM LETTER PHASE-C LAP;Lo;0;L;;;;;N;;;;; -168B7;BAMUM LETTER PHASE-C MBIRIEEN;Lo;0;L;;;;;N;;;;; -168B8;BAMUM LETTER PHASE-C MGBASAQ;Lo;0;L;;;;;N;;;;; -168B9;BAMUM LETTER PHASE-C NTEUNGBA;Lo;0;L;;;;;N;;;;; -168BA;BAMUM LETTER PHASE-C TEUTEUX;Lo;0;L;;;;;N;;;;; -168BB;BAMUM LETTER PHASE-C NGGUM;Lo;0;L;;;;;N;;;;; -168BC;BAMUM LETTER PHASE-C FUE;Lo;0;L;;;;;N;;;;; -168BD;BAMUM LETTER PHASE-C NDEUT;Lo;0;L;;;;;N;;;;; -168BE;BAMUM LETTER PHASE-C NSA;Lo;0;L;;;;;N;;;;; -168BF;BAMUM LETTER PHASE-C NSHAQ;Lo;0;L;;;;;N;;;;; -168C0;BAMUM LETTER PHASE-C BUNG;Lo;0;L;;;;;N;;;;; -168C1;BAMUM LETTER PHASE-C VEUAEPEN;Lo;0;L;;;;;N;;;;; -168C2;BAMUM LETTER PHASE-C MBERAE;Lo;0;L;;;;;N;;;;; -168C3;BAMUM LETTER PHASE-C RU;Lo;0;L;;;;;N;;;;; -168C4;BAMUM LETTER PHASE-C NJAEM;Lo;0;L;;;;;N;;;;; -168C5;BAMUM LETTER PHASE-C LAM;Lo;0;L;;;;;N;;;;; -168C6;BAMUM LETTER PHASE-C TITUAEP;Lo;0;L;;;;;N;;;;; -168C7;BAMUM LETTER PHASE-C NSUOT NGOM;Lo;0;L;;;;;N;;;;; -168C8;BAMUM LETTER PHASE-C NJEEEE;Lo;0;L;;;;;N;;;;; -168C9;BAMUM LETTER PHASE-C KET;Lo;0;L;;;;;N;;;;; -168CA;BAMUM LETTER PHASE-C NGGU;Lo;0;L;;;;;N;;;;; -168CB;BAMUM LETTER PHASE-C MAESI;Lo;0;L;;;;;N;;;;; -168CC;BAMUM LETTER PHASE-C MBUAEM;Lo;0;L;;;;;N;;;;; -168CD;BAMUM LETTER PHASE-C LU;Lo;0;L;;;;;N;;;;; -168CE;BAMUM LETTER PHASE-C KUT;Lo;0;L;;;;;N;;;;; -168CF;BAMUM LETTER PHASE-C NJAM;Lo;0;L;;;;;N;;;;; -168D0;BAMUM LETTER PHASE-C NGOM;Lo;0;L;;;;;N;;;;; -168D1;BAMUM LETTER PHASE-C WUP;Lo;0;L;;;;;N;;;;; -168D2;BAMUM LETTER PHASE-C NGGUEET;Lo;0;L;;;;;N;;;;; -168D3;BAMUM LETTER PHASE-C NSOM;Lo;0;L;;;;;N;;;;; -168D4;BAMUM LETTER PHASE-C NTEN;Lo;0;L;;;;;N;;;;; -168D5;BAMUM LETTER PHASE-C KUOP NKAARAE;Lo;0;L;;;;;N;;;;; -168D6;BAMUM LETTER PHASE-C NSUN;Lo;0;L;;;;;N;;;;; -168D7;BAMUM LETTER PHASE-C NDAM;Lo;0;L;;;;;N;;;;; -168D8;BAMUM LETTER PHASE-C MA NSIEE;Lo;0;L;;;;;N;;;;; -168D9;BAMUM LETTER PHASE-C YAA;Lo;0;L;;;;;N;;;;; -168DA;BAMUM LETTER PHASE-C NDAP;Lo;0;L;;;;;N;;;;; -168DB;BAMUM LETTER PHASE-C SHUEQ;Lo;0;L;;;;;N;;;;; -168DC;BAMUM LETTER PHASE-C SETFON;Lo;0;L;;;;;N;;;;; -168DD;BAMUM LETTER PHASE-C MBI;Lo;0;L;;;;;N;;;;; -168DE;BAMUM LETTER PHASE-C MAEMBA;Lo;0;L;;;;;N;;;;; -168DF;BAMUM LETTER PHASE-C MBANYI;Lo;0;L;;;;;N;;;;; -168E0;BAMUM LETTER PHASE-C KEUSEUX;Lo;0;L;;;;;N;;;;; -168E1;BAMUM LETTER PHASE-C MBEUX;Lo;0;L;;;;;N;;;;; -168E2;BAMUM LETTER PHASE-C KEUM;Lo;0;L;;;;;N;;;;; -168E3;BAMUM LETTER PHASE-C MBAA PICKET;Lo;0;L;;;;;N;;;;; -168E4;BAMUM LETTER PHASE-C YUWOQ;Lo;0;L;;;;;N;;;;; -168E5;BAMUM LETTER PHASE-C NJEUX;Lo;0;L;;;;;N;;;;; -168E6;BAMUM LETTER PHASE-C MIEE;Lo;0;L;;;;;N;;;;; -168E7;BAMUM LETTER PHASE-C MUAE;Lo;0;L;;;;;N;;;;; -168E8;BAMUM LETTER PHASE-C SHIQ;Lo;0;L;;;;;N;;;;; -168E9;BAMUM LETTER PHASE-C KEN LAW;Lo;0;L;;;;;N;;;;; -168EA;BAMUM LETTER PHASE-C KEN FATIGUE;Lo;0;L;;;;;N;;;;; -168EB;BAMUM LETTER PHASE-C NGAQ;Lo;0;L;;;;;N;;;;; -168EC;BAMUM LETTER PHASE-C NAQ;Lo;0;L;;;;;N;;;;; -168ED;BAMUM LETTER PHASE-C LIQ;Lo;0;L;;;;;N;;;;; -168EE;BAMUM LETTER PHASE-C PIN;Lo;0;L;;;;;N;;;;; -168EF;BAMUM LETTER PHASE-C PEN;Lo;0;L;;;;;N;;;;; -168F0;BAMUM LETTER PHASE-C TET;Lo;0;L;;;;;N;;;;; -168F1;BAMUM LETTER PHASE-D MBUO;Lo;0;L;;;;;N;;;;; -168F2;BAMUM LETTER PHASE-D WAP;Lo;0;L;;;;;N;;;;; -168F3;BAMUM LETTER PHASE-D NJI;Lo;0;L;;;;;N;;;;; -168F4;BAMUM LETTER PHASE-D MFON;Lo;0;L;;;;;N;;;;; -168F5;BAMUM LETTER PHASE-D NJIEE;Lo;0;L;;;;;N;;;;; -168F6;BAMUM LETTER PHASE-D LIEE;Lo;0;L;;;;;N;;;;; -168F7;BAMUM LETTER PHASE-D NJEUT;Lo;0;L;;;;;N;;;;; -168F8;BAMUM LETTER PHASE-D NSHEE;Lo;0;L;;;;;N;;;;; -168F9;BAMUM LETTER PHASE-D NGGAAMAE;Lo;0;L;;;;;N;;;;; -168FA;BAMUM LETTER PHASE-D NYAM;Lo;0;L;;;;;N;;;;; -168FB;BAMUM LETTER PHASE-D WUAEN;Lo;0;L;;;;;N;;;;; -168FC;BAMUM LETTER PHASE-D NGKUN;Lo;0;L;;;;;N;;;;; -168FD;BAMUM LETTER PHASE-D SHEE;Lo;0;L;;;;;N;;;;; -168FE;BAMUM LETTER PHASE-D NGKAP;Lo;0;L;;;;;N;;;;; -168FF;BAMUM LETTER PHASE-D KEUAETMEUN;Lo;0;L;;;;;N;;;;; -16900;BAMUM LETTER PHASE-D TEUT;Lo;0;L;;;;;N;;;;; -16901;BAMUM LETTER PHASE-D SHEUAE;Lo;0;L;;;;;N;;;;; -16902;BAMUM LETTER PHASE-D NJAP;Lo;0;L;;;;;N;;;;; -16903;BAMUM LETTER PHASE-D SUE;Lo;0;L;;;;;N;;;;; -16904;BAMUM LETTER PHASE-D KET;Lo;0;L;;;;;N;;;;; -16905;BAMUM LETTER PHASE-D YAEMMAE;Lo;0;L;;;;;N;;;;; -16906;BAMUM LETTER PHASE-D KUOM;Lo;0;L;;;;;N;;;;; -16907;BAMUM LETTER PHASE-D SAP;Lo;0;L;;;;;N;;;;; -16908;BAMUM LETTER PHASE-D MFEUT;Lo;0;L;;;;;N;;;;; -16909;BAMUM LETTER PHASE-D NDEUX;Lo;0;L;;;;;N;;;;; -1690A;BAMUM LETTER PHASE-D MALEERI;Lo;0;L;;;;;N;;;;; -1690B;BAMUM LETTER PHASE-D MEUT;Lo;0;L;;;;;N;;;;; -1690C;BAMUM LETTER PHASE-D SEUAEQ;Lo;0;L;;;;;N;;;;; -1690D;BAMUM LETTER PHASE-D YEN;Lo;0;L;;;;;N;;;;; -1690E;BAMUM LETTER PHASE-D NJEUAEM;Lo;0;L;;;;;N;;;;; -1690F;BAMUM LETTER PHASE-D KEUOT MBUAE;Lo;0;L;;;;;N;;;;; -16910;BAMUM LETTER PHASE-D NGKEURI;Lo;0;L;;;;;N;;;;; -16911;BAMUM LETTER PHASE-D TU;Lo;0;L;;;;;N;;;;; -16912;BAMUM LETTER PHASE-D GHAA;Lo;0;L;;;;;N;;;;; -16913;BAMUM LETTER PHASE-D NGKYEE;Lo;0;L;;;;;N;;;;; -16914;BAMUM LETTER PHASE-D FEUFEUAET;Lo;0;L;;;;;N;;;;; -16915;BAMUM LETTER PHASE-D NDEE;Lo;0;L;;;;;N;;;;; -16916;BAMUM LETTER PHASE-D MGBOFUM;Lo;0;L;;;;;N;;;;; -16917;BAMUM LETTER PHASE-D LEUAEP;Lo;0;L;;;;;N;;;;; -16918;BAMUM LETTER PHASE-D NDON;Lo;0;L;;;;;N;;;;; -16919;BAMUM LETTER PHASE-D MONI;Lo;0;L;;;;;N;;;;; -1691A;BAMUM LETTER PHASE-D MGBEUN;Lo;0;L;;;;;N;;;;; -1691B;BAMUM LETTER PHASE-D PUUT;Lo;0;L;;;;;N;;;;; -1691C;BAMUM LETTER PHASE-D MGBIEE;Lo;0;L;;;;;N;;;;; -1691D;BAMUM LETTER PHASE-D MFO;Lo;0;L;;;;;N;;;;; -1691E;BAMUM LETTER PHASE-D LUM;Lo;0;L;;;;;N;;;;; -1691F;BAMUM LETTER PHASE-D NSIEEP;Lo;0;L;;;;;N;;;;; -16920;BAMUM LETTER PHASE-D MBAA;Lo;0;L;;;;;N;;;;; -16921;BAMUM LETTER PHASE-D KWAET;Lo;0;L;;;;;N;;;;; -16922;BAMUM LETTER PHASE-D NYET;Lo;0;L;;;;;N;;;;; -16923;BAMUM LETTER PHASE-D TEUAEN;Lo;0;L;;;;;N;;;;; -16924;BAMUM LETTER PHASE-D SOT;Lo;0;L;;;;;N;;;;; -16925;BAMUM LETTER PHASE-D YUWOQ;Lo;0;L;;;;;N;;;;; -16926;BAMUM LETTER PHASE-D KEUM;Lo;0;L;;;;;N;;;;; -16927;BAMUM LETTER PHASE-D RAEM;Lo;0;L;;;;;N;;;;; -16928;BAMUM LETTER PHASE-D TEEEE;Lo;0;L;;;;;N;;;;; -16929;BAMUM LETTER PHASE-D NGKEUAEQ;Lo;0;L;;;;;N;;;;; -1692A;BAMUM LETTER PHASE-D MFEUAE;Lo;0;L;;;;;N;;;;; -1692B;BAMUM LETTER PHASE-D NSIEET;Lo;0;L;;;;;N;;;;; -1692C;BAMUM LETTER PHASE-D KEUP;Lo;0;L;;;;;N;;;;; -1692D;BAMUM LETTER PHASE-D PIP;Lo;0;L;;;;;N;;;;; -1692E;BAMUM LETTER PHASE-D PEUTAE;Lo;0;L;;;;;N;;;;; -1692F;BAMUM LETTER PHASE-D NYUE;Lo;0;L;;;;;N;;;;; -16930;BAMUM LETTER PHASE-D LET;Lo;0;L;;;;;N;;;;; -16931;BAMUM LETTER PHASE-D NGGAAM;Lo;0;L;;;;;N;;;;; -16932;BAMUM LETTER PHASE-D MFIEE;Lo;0;L;;;;;N;;;;; -16933;BAMUM LETTER PHASE-D NGGWAEN;Lo;0;L;;;;;N;;;;; -16934;BAMUM LETTER PHASE-D YUOM;Lo;0;L;;;;;N;;;;; -16935;BAMUM LETTER PHASE-D PAP;Lo;0;L;;;;;N;;;;; -16936;BAMUM LETTER PHASE-D YUOP;Lo;0;L;;;;;N;;;;; -16937;BAMUM LETTER PHASE-D NDAM;Lo;0;L;;;;;N;;;;; -16938;BAMUM LETTER PHASE-D NTEUM;Lo;0;L;;;;;N;;;;; -16939;BAMUM LETTER PHASE-D SUAE;Lo;0;L;;;;;N;;;;; -1693A;BAMUM LETTER PHASE-D KUN;Lo;0;L;;;;;N;;;;; -1693B;BAMUM LETTER PHASE-D NGGEUX;Lo;0;L;;;;;N;;;;; -1693C;BAMUM LETTER PHASE-D NGKIEE;Lo;0;L;;;;;N;;;;; -1693D;BAMUM LETTER PHASE-D TUOT;Lo;0;L;;;;;N;;;;; -1693E;BAMUM LETTER PHASE-D MEUN;Lo;0;L;;;;;N;;;;; -1693F;BAMUM LETTER PHASE-D KUQ;Lo;0;L;;;;;N;;;;; -16940;BAMUM LETTER PHASE-D NSUM;Lo;0;L;;;;;N;;;;; -16941;BAMUM LETTER PHASE-D TEUN;Lo;0;L;;;;;N;;;;; -16942;BAMUM LETTER PHASE-D MAENJET;Lo;0;L;;;;;N;;;;; -16943;BAMUM LETTER PHASE-D NGGAP;Lo;0;L;;;;;N;;;;; -16944;BAMUM LETTER PHASE-D LEUM;Lo;0;L;;;;;N;;;;; -16945;BAMUM LETTER PHASE-D NGGUOM;Lo;0;L;;;;;N;;;;; -16946;BAMUM LETTER PHASE-D NSHUT;Lo;0;L;;;;;N;;;;; -16947;BAMUM LETTER PHASE-D NJUEQ;Lo;0;L;;;;;N;;;;; -16948;BAMUM LETTER PHASE-D GHEUAE;Lo;0;L;;;;;N;;;;; -16949;BAMUM LETTER PHASE-D KU;Lo;0;L;;;;;N;;;;; -1694A;BAMUM LETTER PHASE-D REN OLD;Lo;0;L;;;;;N;;;;; -1694B;BAMUM LETTER PHASE-D TAE;Lo;0;L;;;;;N;;;;; -1694C;BAMUM LETTER PHASE-D TOQ;Lo;0;L;;;;;N;;;;; -1694D;BAMUM LETTER PHASE-D NYI;Lo;0;L;;;;;N;;;;; -1694E;BAMUM LETTER PHASE-D RII;Lo;0;L;;;;;N;;;;; -1694F;BAMUM LETTER PHASE-D LEEEE;Lo;0;L;;;;;N;;;;; -16950;BAMUM LETTER PHASE-D MEEEE;Lo;0;L;;;;;N;;;;; -16951;BAMUM LETTER PHASE-D M;Lo;0;L;;;;;N;;;;; -16952;BAMUM LETTER PHASE-D SUU;Lo;0;L;;;;;N;;;;; -16953;BAMUM LETTER PHASE-D MU;Lo;0;L;;;;;N;;;;; -16954;BAMUM LETTER PHASE-D SHII;Lo;0;L;;;;;N;;;;; -16955;BAMUM LETTER PHASE-D SHEUX;Lo;0;L;;;;;N;;;;; -16956;BAMUM LETTER PHASE-D KYEE;Lo;0;L;;;;;N;;;;; -16957;BAMUM LETTER PHASE-D NU;Lo;0;L;;;;;N;;;;; -16958;BAMUM LETTER PHASE-D SHU;Lo;0;L;;;;;N;;;;; -16959;BAMUM LETTER PHASE-D NTEE;Lo;0;L;;;;;N;;;;; -1695A;BAMUM LETTER PHASE-D PEE;Lo;0;L;;;;;N;;;;; -1695B;BAMUM LETTER PHASE-D NI;Lo;0;L;;;;;N;;;;; -1695C;BAMUM LETTER PHASE-D SHOQ;Lo;0;L;;;;;N;;;;; -1695D;BAMUM LETTER PHASE-D PUQ;Lo;0;L;;;;;N;;;;; -1695E;BAMUM LETTER PHASE-D MVOP;Lo;0;L;;;;;N;;;;; -1695F;BAMUM LETTER PHASE-D LOQ;Lo;0;L;;;;;N;;;;; -16960;BAMUM LETTER PHASE-D REN MUCH;Lo;0;L;;;;;N;;;;; -16961;BAMUM LETTER PHASE-D TI;Lo;0;L;;;;;N;;;;; -16962;BAMUM LETTER PHASE-D NTUU;Lo;0;L;;;;;N;;;;; -16963;BAMUM LETTER PHASE-D MBAA SEVEN;Lo;0;L;;;;;N;;;;; -16964;BAMUM LETTER PHASE-D SAQ;Lo;0;L;;;;;N;;;;; -16965;BAMUM LETTER PHASE-D FAA;Lo;0;L;;;;;N;;;;; -16966;BAMUM LETTER PHASE-E NDAP;Lo;0;L;;;;;N;;;;; -16967;BAMUM LETTER PHASE-E TOON;Lo;0;L;;;;;N;;;;; -16968;BAMUM LETTER PHASE-E MBEUM;Lo;0;L;;;;;N;;;;; -16969;BAMUM LETTER PHASE-E LAP;Lo;0;L;;;;;N;;;;; -1696A;BAMUM LETTER PHASE-E VOM;Lo;0;L;;;;;N;;;;; -1696B;BAMUM LETTER PHASE-E LOON;Lo;0;L;;;;;N;;;;; -1696C;BAMUM LETTER PHASE-E PAA;Lo;0;L;;;;;N;;;;; -1696D;BAMUM LETTER PHASE-E SOM;Lo;0;L;;;;;N;;;;; -1696E;BAMUM LETTER PHASE-E RAQ;Lo;0;L;;;;;N;;;;; -1696F;BAMUM LETTER PHASE-E NSHUOP;Lo;0;L;;;;;N;;;;; -16970;BAMUM LETTER PHASE-E NDUN;Lo;0;L;;;;;N;;;;; -16971;BAMUM LETTER PHASE-E PUAE;Lo;0;L;;;;;N;;;;; -16972;BAMUM LETTER PHASE-E TAM;Lo;0;L;;;;;N;;;;; -16973;BAMUM LETTER PHASE-E NGKA;Lo;0;L;;;;;N;;;;; -16974;BAMUM LETTER PHASE-E KPEUX;Lo;0;L;;;;;N;;;;; -16975;BAMUM LETTER PHASE-E WUO;Lo;0;L;;;;;N;;;;; -16976;BAMUM LETTER PHASE-E SEE;Lo;0;L;;;;;N;;;;; -16977;BAMUM LETTER PHASE-E NGGEUAET;Lo;0;L;;;;;N;;;;; -16978;BAMUM LETTER PHASE-E PAAM;Lo;0;L;;;;;N;;;;; -16979;BAMUM LETTER PHASE-E TOO;Lo;0;L;;;;;N;;;;; -1697A;BAMUM LETTER PHASE-E KUOP;Lo;0;L;;;;;N;;;;; -1697B;BAMUM LETTER PHASE-E LOM;Lo;0;L;;;;;N;;;;; -1697C;BAMUM LETTER PHASE-E NSHIEE;Lo;0;L;;;;;N;;;;; -1697D;BAMUM LETTER PHASE-E NGOP;Lo;0;L;;;;;N;;;;; -1697E;BAMUM LETTER PHASE-E MAEM;Lo;0;L;;;;;N;;;;; -1697F;BAMUM LETTER PHASE-E NGKEUX;Lo;0;L;;;;;N;;;;; -16980;BAMUM LETTER PHASE-E NGOQ;Lo;0;L;;;;;N;;;;; -16981;BAMUM LETTER PHASE-E NSHUE;Lo;0;L;;;;;N;;;;; -16982;BAMUM LETTER PHASE-E RIMGBA;Lo;0;L;;;;;N;;;;; -16983;BAMUM LETTER PHASE-E NJEUX;Lo;0;L;;;;;N;;;;; -16984;BAMUM LETTER PHASE-E PEEM;Lo;0;L;;;;;N;;;;; -16985;BAMUM LETTER PHASE-E SAA;Lo;0;L;;;;;N;;;;; -16986;BAMUM LETTER PHASE-E NGGURAE;Lo;0;L;;;;;N;;;;; -16987;BAMUM LETTER PHASE-E MGBA;Lo;0;L;;;;;N;;;;; -16988;BAMUM LETTER PHASE-E GHEUX;Lo;0;L;;;;;N;;;;; -16989;BAMUM LETTER PHASE-E NGKEUAEM;Lo;0;L;;;;;N;;;;; -1698A;BAMUM LETTER PHASE-E NJAEMLI;Lo;0;L;;;;;N;;;;; -1698B;BAMUM LETTER PHASE-E MAP;Lo;0;L;;;;;N;;;;; -1698C;BAMUM LETTER PHASE-E LOOT;Lo;0;L;;;;;N;;;;; -1698D;BAMUM LETTER PHASE-E NGGEEEE;Lo;0;L;;;;;N;;;;; -1698E;BAMUM LETTER PHASE-E NDIQ;Lo;0;L;;;;;N;;;;; -1698F;BAMUM LETTER PHASE-E TAEN NTEUM;Lo;0;L;;;;;N;;;;; -16990;BAMUM LETTER PHASE-E SET;Lo;0;L;;;;;N;;;;; -16991;BAMUM LETTER PHASE-E PUM;Lo;0;L;;;;;N;;;;; -16992;BAMUM LETTER PHASE-E NDAA SOFTNESS;Lo;0;L;;;;;N;;;;; -16993;BAMUM LETTER PHASE-E NGGUAESHAE NYAM;Lo;0;L;;;;;N;;;;; -16994;BAMUM LETTER PHASE-E YIEE;Lo;0;L;;;;;N;;;;; -16995;BAMUM LETTER PHASE-E GHEUN;Lo;0;L;;;;;N;;;;; -16996;BAMUM LETTER PHASE-E TUAE;Lo;0;L;;;;;N;;;;; -16997;BAMUM LETTER PHASE-E YEUAE;Lo;0;L;;;;;N;;;;; -16998;BAMUM LETTER PHASE-E PO;Lo;0;L;;;;;N;;;;; -16999;BAMUM LETTER PHASE-E TUMAE;Lo;0;L;;;;;N;;;;; -1699A;BAMUM LETTER PHASE-E KEUAE;Lo;0;L;;;;;N;;;;; -1699B;BAMUM LETTER PHASE-E SUAEN;Lo;0;L;;;;;N;;;;; -1699C;BAMUM LETTER PHASE-E TEUAEQ;Lo;0;L;;;;;N;;;;; -1699D;BAMUM LETTER PHASE-E VEUAE;Lo;0;L;;;;;N;;;;; -1699E;BAMUM LETTER PHASE-E WEUX;Lo;0;L;;;;;N;;;;; -1699F;BAMUM LETTER PHASE-E LAAM;Lo;0;L;;;;;N;;;;; -169A0;BAMUM LETTER PHASE-E PU;Lo;0;L;;;;;N;;;;; -169A1;BAMUM LETTER PHASE-E TAAQ;Lo;0;L;;;;;N;;;;; -169A2;BAMUM LETTER PHASE-E GHAAMAE;Lo;0;L;;;;;N;;;;; -169A3;BAMUM LETTER PHASE-E NGEUREUT;Lo;0;L;;;;;N;;;;; -169A4;BAMUM LETTER PHASE-E SHEUAEQ;Lo;0;L;;;;;N;;;;; -169A5;BAMUM LETTER PHASE-E MGBEN;Lo;0;L;;;;;N;;;;; -169A6;BAMUM LETTER PHASE-E MBEE;Lo;0;L;;;;;N;;;;; -169A7;BAMUM LETTER PHASE-E NZAQ;Lo;0;L;;;;;N;;;;; -169A8;BAMUM LETTER PHASE-E NKOM;Lo;0;L;;;;;N;;;;; -169A9;BAMUM LETTER PHASE-E GBET;Lo;0;L;;;;;N;;;;; -169AA;BAMUM LETTER PHASE-E TUM;Lo;0;L;;;;;N;;;;; -169AB;BAMUM LETTER PHASE-E KUET;Lo;0;L;;;;;N;;;;; -169AC;BAMUM LETTER PHASE-E YAP;Lo;0;L;;;;;N;;;;; -169AD;BAMUM LETTER PHASE-E NYI CLEAVER;Lo;0;L;;;;;N;;;;; -169AE;BAMUM LETTER PHASE-E YIT;Lo;0;L;;;;;N;;;;; -169AF;BAMUM LETTER PHASE-E MFEUQ;Lo;0;L;;;;;N;;;;; -169B0;BAMUM LETTER PHASE-E NDIAQ;Lo;0;L;;;;;N;;;;; -169B1;BAMUM LETTER PHASE-E PIEEQ;Lo;0;L;;;;;N;;;;; -169B2;BAMUM LETTER PHASE-E YUEQ;Lo;0;L;;;;;N;;;;; -169B3;BAMUM LETTER PHASE-E LEUAEM;Lo;0;L;;;;;N;;;;; -169B4;BAMUM LETTER PHASE-E FUE;Lo;0;L;;;;;N;;;;; -169B5;BAMUM LETTER PHASE-E GBEUX;Lo;0;L;;;;;N;;;;; -169B6;BAMUM LETTER PHASE-E NGKUP;Lo;0;L;;;;;N;;;;; -169B7;BAMUM LETTER PHASE-E KET;Lo;0;L;;;;;N;;;;; -169B8;BAMUM LETTER PHASE-E MAE;Lo;0;L;;;;;N;;;;; -169B9;BAMUM LETTER PHASE-E NGKAAMI;Lo;0;L;;;;;N;;;;; -169BA;BAMUM LETTER PHASE-E GHET;Lo;0;L;;;;;N;;;;; -169BB;BAMUM LETTER PHASE-E FA;Lo;0;L;;;;;N;;;;; -169BC;BAMUM LETTER PHASE-E NTUM;Lo;0;L;;;;;N;;;;; -169BD;BAMUM LETTER PHASE-E PEUT;Lo;0;L;;;;;N;;;;; -169BE;BAMUM LETTER PHASE-E YEUM;Lo;0;L;;;;;N;;;;; -169BF;BAMUM LETTER PHASE-E NGGEUAE;Lo;0;L;;;;;N;;;;; -169C0;BAMUM LETTER PHASE-E NYI BETWEEN;Lo;0;L;;;;;N;;;;; -169C1;BAMUM LETTER PHASE-E NZUQ;Lo;0;L;;;;;N;;;;; -169C2;BAMUM LETTER PHASE-E POON;Lo;0;L;;;;;N;;;;; -169C3;BAMUM LETTER PHASE-E MIEE;Lo;0;L;;;;;N;;;;; -169C4;BAMUM LETTER PHASE-E FUET;Lo;0;L;;;;;N;;;;; -169C5;BAMUM LETTER PHASE-E NAE;Lo;0;L;;;;;N;;;;; -169C6;BAMUM LETTER PHASE-E MUAE;Lo;0;L;;;;;N;;;;; -169C7;BAMUM LETTER PHASE-E GHEUAE;Lo;0;L;;;;;N;;;;; -169C8;BAMUM LETTER PHASE-E FU I;Lo;0;L;;;;;N;;;;; -169C9;BAMUM LETTER PHASE-E MVI;Lo;0;L;;;;;N;;;;; -169CA;BAMUM LETTER PHASE-E PUAQ;Lo;0;L;;;;;N;;;;; -169CB;BAMUM LETTER PHASE-E NGKUM;Lo;0;L;;;;;N;;;;; -169CC;BAMUM LETTER PHASE-E KUT;Lo;0;L;;;;;N;;;;; -169CD;BAMUM LETTER PHASE-E PIET;Lo;0;L;;;;;N;;;;; -169CE;BAMUM LETTER PHASE-E NTAP;Lo;0;L;;;;;N;;;;; -169CF;BAMUM LETTER PHASE-E YEUAET;Lo;0;L;;;;;N;;;;; -169D0;BAMUM LETTER PHASE-E NGGUP;Lo;0;L;;;;;N;;;;; -169D1;BAMUM LETTER PHASE-E PA PEOPLE;Lo;0;L;;;;;N;;;;; -169D2;BAMUM LETTER PHASE-E FU CALL;Lo;0;L;;;;;N;;;;; -169D3;BAMUM LETTER PHASE-E FOM;Lo;0;L;;;;;N;;;;; -169D4;BAMUM LETTER PHASE-E NJEE;Lo;0;L;;;;;N;;;;; -169D5;BAMUM LETTER PHASE-E A;Lo;0;L;;;;;N;;;;; -169D6;BAMUM LETTER PHASE-E TOQ;Lo;0;L;;;;;N;;;;; -169D7;BAMUM LETTER PHASE-E O;Lo;0;L;;;;;N;;;;; -169D8;BAMUM LETTER PHASE-E I;Lo;0;L;;;;;N;;;;; -169D9;BAMUM LETTER PHASE-E LAQ;Lo;0;L;;;;;N;;;;; -169DA;BAMUM LETTER PHASE-E PA PLURAL;Lo;0;L;;;;;N;;;;; -169DB;BAMUM LETTER PHASE-E TAA;Lo;0;L;;;;;N;;;;; -169DC;BAMUM LETTER PHASE-E TAQ;Lo;0;L;;;;;N;;;;; -169DD;BAMUM LETTER PHASE-E NDAA MY HOUSE;Lo;0;L;;;;;N;;;;; -169DE;BAMUM LETTER PHASE-E SHIQ;Lo;0;L;;;;;N;;;;; -169DF;BAMUM LETTER PHASE-E YEUX;Lo;0;L;;;;;N;;;;; -169E0;BAMUM LETTER PHASE-E NGUAE;Lo;0;L;;;;;N;;;;; -169E1;BAMUM LETTER PHASE-E YUAEN;Lo;0;L;;;;;N;;;;; -169E2;BAMUM LETTER PHASE-E YOQ SWIMMING;Lo;0;L;;;;;N;;;;; -169E3;BAMUM LETTER PHASE-E YOQ COVER;Lo;0;L;;;;;N;;;;; -169E4;BAMUM LETTER PHASE-E YUQ;Lo;0;L;;;;;N;;;;; -169E5;BAMUM LETTER PHASE-E YUN;Lo;0;L;;;;;N;;;;; -169E6;BAMUM LETTER PHASE-E KEUX;Lo;0;L;;;;;N;;;;; -169E7;BAMUM LETTER PHASE-E PEUX;Lo;0;L;;;;;N;;;;; -169E8;BAMUM LETTER PHASE-E NJEE EPOCH;Lo;0;L;;;;;N;;;;; -169E9;BAMUM LETTER PHASE-E PUE;Lo;0;L;;;;;N;;;;; -169EA;BAMUM LETTER PHASE-E WUE;Lo;0;L;;;;;N;;;;; -169EB;BAMUM LETTER PHASE-E FEE;Lo;0;L;;;;;N;;;;; -169EC;BAMUM LETTER PHASE-E VEE;Lo;0;L;;;;;N;;;;; -169ED;BAMUM LETTER PHASE-E LU;Lo;0;L;;;;;N;;;;; -169EE;BAMUM LETTER PHASE-E MI;Lo;0;L;;;;;N;;;;; -169EF;BAMUM LETTER PHASE-E REUX;Lo;0;L;;;;;N;;;;; -169F0;BAMUM LETTER PHASE-E RAE;Lo;0;L;;;;;N;;;;; -169F1;BAMUM LETTER PHASE-E NGUAET;Lo;0;L;;;;;N;;;;; -169F2;BAMUM LETTER PHASE-E NGA;Lo;0;L;;;;;N;;;;; -169F3;BAMUM LETTER PHASE-E SHO;Lo;0;L;;;;;N;;;;; -169F4;BAMUM LETTER PHASE-E SHOQ;Lo;0;L;;;;;N;;;;; -169F5;BAMUM LETTER PHASE-E FU REMEDY;Lo;0;L;;;;;N;;;;; -169F6;BAMUM LETTER PHASE-E NA;Lo;0;L;;;;;N;;;;; -169F7;BAMUM LETTER PHASE-E PI;Lo;0;L;;;;;N;;;;; -169F8;BAMUM LETTER PHASE-E LOQ;Lo;0;L;;;;;N;;;;; -169F9;BAMUM LETTER PHASE-E KO;Lo;0;L;;;;;N;;;;; -169FA;BAMUM LETTER PHASE-E MEN;Lo;0;L;;;;;N;;;;; -169FB;BAMUM LETTER PHASE-E MA;Lo;0;L;;;;;N;;;;; -169FC;BAMUM LETTER PHASE-E MAQ;Lo;0;L;;;;;N;;;;; -169FD;BAMUM LETTER PHASE-E TEU;Lo;0;L;;;;;N;;;;; -169FE;BAMUM LETTER PHASE-E KI;Lo;0;L;;;;;N;;;;; -169FF;BAMUM LETTER PHASE-E MON;Lo;0;L;;;;;N;;;;; -16A00;BAMUM LETTER PHASE-E TEN;Lo;0;L;;;;;N;;;;; -16A01;BAMUM LETTER PHASE-E FAQ;Lo;0;L;;;;;N;;;;; -16A02;BAMUM LETTER PHASE-E GHOM;Lo;0;L;;;;;N;;;;; -16A03;BAMUM LETTER PHASE-F KA;Lo;0;L;;;;;N;;;;; -16A04;BAMUM LETTER PHASE-F U;Lo;0;L;;;;;N;;;;; -16A05;BAMUM LETTER PHASE-F KU;Lo;0;L;;;;;N;;;;; -16A06;BAMUM LETTER PHASE-F EE;Lo;0;L;;;;;N;;;;; -16A07;BAMUM LETTER PHASE-F REE;Lo;0;L;;;;;N;;;;; -16A08;BAMUM LETTER PHASE-F TAE;Lo;0;L;;;;;N;;;;; -16A09;BAMUM LETTER PHASE-F NYI;Lo;0;L;;;;;N;;;;; -16A0A;BAMUM LETTER PHASE-F LA;Lo;0;L;;;;;N;;;;; -16A0B;BAMUM LETTER PHASE-F RII;Lo;0;L;;;;;N;;;;; -16A0C;BAMUM LETTER PHASE-F RIEE;Lo;0;L;;;;;N;;;;; -16A0D;BAMUM LETTER PHASE-F MEEEE;Lo;0;L;;;;;N;;;;; -16A0E;BAMUM LETTER PHASE-F TAA;Lo;0;L;;;;;N;;;;; -16A0F;BAMUM LETTER PHASE-F NDAA;Lo;0;L;;;;;N;;;;; -16A10;BAMUM LETTER PHASE-F NJAEM;Lo;0;L;;;;;N;;;;; -16A11;BAMUM LETTER PHASE-F M;Lo;0;L;;;;;N;;;;; -16A12;BAMUM LETTER PHASE-F SUU;Lo;0;L;;;;;N;;;;; -16A13;BAMUM LETTER PHASE-F SHII;Lo;0;L;;;;;N;;;;; -16A14;BAMUM LETTER PHASE-F SI;Lo;0;L;;;;;N;;;;; -16A15;BAMUM LETTER PHASE-F SEUX;Lo;0;L;;;;;N;;;;; -16A16;BAMUM LETTER PHASE-F KYEE;Lo;0;L;;;;;N;;;;; -16A17;BAMUM LETTER PHASE-F KET;Lo;0;L;;;;;N;;;;; -16A18;BAMUM LETTER PHASE-F NUAE;Lo;0;L;;;;;N;;;;; -16A19;BAMUM LETTER PHASE-F NU;Lo;0;L;;;;;N;;;;; -16A1A;BAMUM LETTER PHASE-F NJUAE;Lo;0;L;;;;;N;;;;; -16A1B;BAMUM LETTER PHASE-F YOQ;Lo;0;L;;;;;N;;;;; -16A1C;BAMUM LETTER PHASE-F SHU;Lo;0;L;;;;;N;;;;; -16A1D;BAMUM LETTER PHASE-F YA;Lo;0;L;;;;;N;;;;; -16A1E;BAMUM LETTER PHASE-F NSHA;Lo;0;L;;;;;N;;;;; -16A1F;BAMUM LETTER PHASE-F PEUX;Lo;0;L;;;;;N;;;;; -16A20;BAMUM LETTER PHASE-F NTEE;Lo;0;L;;;;;N;;;;; -16A21;BAMUM LETTER PHASE-F WUE;Lo;0;L;;;;;N;;;;; -16A22;BAMUM LETTER PHASE-F PEE;Lo;0;L;;;;;N;;;;; -16A23;BAMUM LETTER PHASE-F RU;Lo;0;L;;;;;N;;;;; -16A24;BAMUM LETTER PHASE-F NI;Lo;0;L;;;;;N;;;;; -16A25;BAMUM LETTER PHASE-F REUX;Lo;0;L;;;;;N;;;;; -16A26;BAMUM LETTER PHASE-F KEN;Lo;0;L;;;;;N;;;;; -16A27;BAMUM LETTER PHASE-F NGKWAEN;Lo;0;L;;;;;N;;;;; -16A28;BAMUM LETTER PHASE-F NGGA;Lo;0;L;;;;;N;;;;; -16A29;BAMUM LETTER PHASE-F SHO;Lo;0;L;;;;;N;;;;; -16A2A;BAMUM LETTER PHASE-F PUAE;Lo;0;L;;;;;N;;;;; -16A2B;BAMUM LETTER PHASE-F FOM;Lo;0;L;;;;;N;;;;; -16A2C;BAMUM LETTER PHASE-F WA;Lo;0;L;;;;;N;;;;; -16A2D;BAMUM LETTER PHASE-F LI;Lo;0;L;;;;;N;;;;; -16A2E;BAMUM LETTER PHASE-F LOQ;Lo;0;L;;;;;N;;;;; -16A2F;BAMUM LETTER PHASE-F KO;Lo;0;L;;;;;N;;;;; -16A30;BAMUM LETTER PHASE-F MBEN;Lo;0;L;;;;;N;;;;; -16A31;BAMUM LETTER PHASE-F REN;Lo;0;L;;;;;N;;;;; -16A32;BAMUM LETTER PHASE-F MA;Lo;0;L;;;;;N;;;;; -16A33;BAMUM LETTER PHASE-F MO;Lo;0;L;;;;;N;;;;; -16A34;BAMUM LETTER PHASE-F MBAA;Lo;0;L;;;;;N;;;;; -16A35;BAMUM LETTER PHASE-F TET;Lo;0;L;;;;;N;;;;; -16A36;BAMUM LETTER PHASE-F KPA;Lo;0;L;;;;;N;;;;; -16A37;BAMUM LETTER PHASE-F SAMBA;Lo;0;L;;;;;N;;;;; -16A38;BAMUM LETTER PHASE-F VUEQ;Lo;0;L;;;;;N;;;;; -16A40;MRO LETTER TA;Lo;0;L;;;;;N;;;;; -16A41;MRO LETTER NGI;Lo;0;L;;;;;N;;;;; -16A42;MRO LETTER YO;Lo;0;L;;;;;N;;;;; -16A43;MRO LETTER MIM;Lo;0;L;;;;;N;;;;; -16A44;MRO LETTER BA;Lo;0;L;;;;;N;;;;; -16A45;MRO LETTER DA;Lo;0;L;;;;;N;;;;; -16A46;MRO LETTER A;Lo;0;L;;;;;N;;;;; -16A47;MRO LETTER PHI;Lo;0;L;;;;;N;;;;; -16A48;MRO LETTER KHAI;Lo;0;L;;;;;N;;;;; -16A49;MRO LETTER HAO;Lo;0;L;;;;;N;;;;; -16A4A;MRO LETTER DAI;Lo;0;L;;;;;N;;;;; -16A4B;MRO LETTER CHU;Lo;0;L;;;;;N;;;;; -16A4C;MRO LETTER KEAAE;Lo;0;L;;;;;N;;;;; -16A4D;MRO LETTER OL;Lo;0;L;;;;;N;;;;; -16A4E;MRO LETTER MAEM;Lo;0;L;;;;;N;;;;; -16A4F;MRO LETTER NIN;Lo;0;L;;;;;N;;;;; -16A50;MRO LETTER PA;Lo;0;L;;;;;N;;;;; -16A51;MRO LETTER OO;Lo;0;L;;;;;N;;;;; -16A52;MRO LETTER O;Lo;0;L;;;;;N;;;;; -16A53;MRO LETTER RO;Lo;0;L;;;;;N;;;;; -16A54;MRO LETTER SHI;Lo;0;L;;;;;N;;;;; -16A55;MRO LETTER THEA;Lo;0;L;;;;;N;;;;; -16A56;MRO LETTER EA;Lo;0;L;;;;;N;;;;; -16A57;MRO LETTER WA;Lo;0;L;;;;;N;;;;; -16A58;MRO LETTER E;Lo;0;L;;;;;N;;;;; -16A59;MRO LETTER KO;Lo;0;L;;;;;N;;;;; -16A5A;MRO LETTER LAN;Lo;0;L;;;;;N;;;;; -16A5B;MRO LETTER LA;Lo;0;L;;;;;N;;;;; -16A5C;MRO LETTER HAI;Lo;0;L;;;;;N;;;;; -16A5D;MRO LETTER RI;Lo;0;L;;;;;N;;;;; -16A5E;MRO LETTER TEK;Lo;0;L;;;;;N;;;;; -16A60;MRO DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -16A61;MRO DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -16A62;MRO DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -16A63;MRO DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -16A64;MRO DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -16A65;MRO DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -16A66;MRO DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -16A67;MRO DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -16A68;MRO DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -16A69;MRO DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -16A6E;MRO DANDA;Po;0;L;;;;;N;;;;; -16A6F;MRO DOUBLE DANDA;Po;0;L;;;;;N;;;;; -16AD0;BASSA VAH LETTER ENNI;Lo;0;L;;;;;N;;;;; -16AD1;BASSA VAH LETTER KA;Lo;0;L;;;;;N;;;;; -16AD2;BASSA VAH LETTER SE;Lo;0;L;;;;;N;;;;; -16AD3;BASSA VAH LETTER FA;Lo;0;L;;;;;N;;;;; -16AD4;BASSA VAH LETTER MBE;Lo;0;L;;;;;N;;;;; -16AD5;BASSA VAH LETTER YIE;Lo;0;L;;;;;N;;;;; -16AD6;BASSA VAH LETTER GAH;Lo;0;L;;;;;N;;;;; -16AD7;BASSA VAH LETTER DHII;Lo;0;L;;;;;N;;;;; -16AD8;BASSA VAH LETTER KPAH;Lo;0;L;;;;;N;;;;; -16AD9;BASSA VAH LETTER JO;Lo;0;L;;;;;N;;;;; -16ADA;BASSA VAH LETTER HWAH;Lo;0;L;;;;;N;;;;; -16ADB;BASSA VAH LETTER WA;Lo;0;L;;;;;N;;;;; -16ADC;BASSA VAH LETTER ZO;Lo;0;L;;;;;N;;;;; -16ADD;BASSA VAH LETTER GBU;Lo;0;L;;;;;N;;;;; -16ADE;BASSA VAH LETTER DO;Lo;0;L;;;;;N;;;;; -16ADF;BASSA VAH LETTER CE;Lo;0;L;;;;;N;;;;; -16AE0;BASSA VAH LETTER UWU;Lo;0;L;;;;;N;;;;; -16AE1;BASSA VAH LETTER TO;Lo;0;L;;;;;N;;;;; -16AE2;BASSA VAH LETTER BA;Lo;0;L;;;;;N;;;;; -16AE3;BASSA VAH LETTER VU;Lo;0;L;;;;;N;;;;; -16AE4;BASSA VAH LETTER YEIN;Lo;0;L;;;;;N;;;;; -16AE5;BASSA VAH LETTER PA;Lo;0;L;;;;;N;;;;; -16AE6;BASSA VAH LETTER WADDA;Lo;0;L;;;;;N;;;;; -16AE7;BASSA VAH LETTER A;Lo;0;L;;;;;N;;;;; -16AE8;BASSA VAH LETTER O;Lo;0;L;;;;;N;;;;; -16AE9;BASSA VAH LETTER OO;Lo;0;L;;;;;N;;;;; -16AEA;BASSA VAH LETTER U;Lo;0;L;;;;;N;;;;; -16AEB;BASSA VAH LETTER EE;Lo;0;L;;;;;N;;;;; -16AEC;BASSA VAH LETTER E;Lo;0;L;;;;;N;;;;; -16AED;BASSA VAH LETTER I;Lo;0;L;;;;;N;;;;; -16AF0;BASSA VAH COMBINING HIGH TONE;Mn;1;NSM;;;;;N;;;;; -16AF1;BASSA VAH COMBINING LOW TONE;Mn;1;NSM;;;;;N;;;;; -16AF2;BASSA VAH COMBINING MID TONE;Mn;1;NSM;;;;;N;;;;; -16AF3;BASSA VAH COMBINING LOW-MID TONE;Mn;1;NSM;;;;;N;;;;; -16AF4;BASSA VAH COMBINING HIGH-LOW TONE;Mn;1;NSM;;;;;N;;;;; -16AF5;BASSA VAH FULL STOP;Po;0;L;;;;;N;;;;; -16B00;PAHAWH HMONG VOWEL KEEB;Lo;0;L;;;;;N;;;;; -16B01;PAHAWH HMONG VOWEL KEEV;Lo;0;L;;;;;N;;;;; -16B02;PAHAWH HMONG VOWEL KIB;Lo;0;L;;;;;N;;;;; -16B03;PAHAWH HMONG VOWEL KIV;Lo;0;L;;;;;N;;;;; -16B04;PAHAWH HMONG VOWEL KAUB;Lo;0;L;;;;;N;;;;; -16B05;PAHAWH HMONG VOWEL KAUV;Lo;0;L;;;;;N;;;;; -16B06;PAHAWH HMONG VOWEL KUB;Lo;0;L;;;;;N;;;;; -16B07;PAHAWH HMONG VOWEL KUV;Lo;0;L;;;;;N;;;;; -16B08;PAHAWH HMONG VOWEL KEB;Lo;0;L;;;;;N;;;;; -16B09;PAHAWH HMONG VOWEL KEV;Lo;0;L;;;;;N;;;;; -16B0A;PAHAWH HMONG VOWEL KAIB;Lo;0;L;;;;;N;;;;; -16B0B;PAHAWH HMONG VOWEL KAIV;Lo;0;L;;;;;N;;;;; -16B0C;PAHAWH HMONG VOWEL KOOB;Lo;0;L;;;;;N;;;;; -16B0D;PAHAWH HMONG VOWEL KOOV;Lo;0;L;;;;;N;;;;; -16B0E;PAHAWH HMONG VOWEL KAWB;Lo;0;L;;;;;N;;;;; -16B0F;PAHAWH HMONG VOWEL KAWV;Lo;0;L;;;;;N;;;;; -16B10;PAHAWH HMONG VOWEL KUAB;Lo;0;L;;;;;N;;;;; -16B11;PAHAWH HMONG VOWEL KUAV;Lo;0;L;;;;;N;;;;; -16B12;PAHAWH HMONG VOWEL KOB;Lo;0;L;;;;;N;;;;; -16B13;PAHAWH HMONG VOWEL KOV;Lo;0;L;;;;;N;;;;; -16B14;PAHAWH HMONG VOWEL KIAB;Lo;0;L;;;;;N;;;;; -16B15;PAHAWH HMONG VOWEL KIAV;Lo;0;L;;;;;N;;;;; -16B16;PAHAWH HMONG VOWEL KAB;Lo;0;L;;;;;N;;;;; -16B17;PAHAWH HMONG VOWEL KAV;Lo;0;L;;;;;N;;;;; -16B18;PAHAWH HMONG VOWEL KWB;Lo;0;L;;;;;N;;;;; -16B19;PAHAWH HMONG VOWEL KWV;Lo;0;L;;;;;N;;;;; -16B1A;PAHAWH HMONG VOWEL KAAB;Lo;0;L;;;;;N;;;;; -16B1B;PAHAWH HMONG VOWEL KAAV;Lo;0;L;;;;;N;;;;; -16B1C;PAHAWH HMONG CONSONANT VAU;Lo;0;L;;;;;N;;;;; -16B1D;PAHAWH HMONG CONSONANT NTSAU;Lo;0;L;;;;;N;;;;; -16B1E;PAHAWH HMONG CONSONANT LAU;Lo;0;L;;;;;N;;;;; -16B1F;PAHAWH HMONG CONSONANT HAU;Lo;0;L;;;;;N;;;;; -16B20;PAHAWH HMONG CONSONANT NLAU;Lo;0;L;;;;;N;;;;; -16B21;PAHAWH HMONG CONSONANT RAU;Lo;0;L;;;;;N;;;;; -16B22;PAHAWH HMONG CONSONANT NKAU;Lo;0;L;;;;;N;;;;; -16B23;PAHAWH HMONG CONSONANT QHAU;Lo;0;L;;;;;N;;;;; -16B24;PAHAWH HMONG CONSONANT YAU;Lo;0;L;;;;;N;;;;; -16B25;PAHAWH HMONG CONSONANT HLAU;Lo;0;L;;;;;N;;;;; -16B26;PAHAWH HMONG CONSONANT MAU;Lo;0;L;;;;;N;;;;; -16B27;PAHAWH HMONG CONSONANT CHAU;Lo;0;L;;;;;N;;;;; -16B28;PAHAWH HMONG CONSONANT NCHAU;Lo;0;L;;;;;N;;;;; -16B29;PAHAWH HMONG CONSONANT HNAU;Lo;0;L;;;;;N;;;;; -16B2A;PAHAWH HMONG CONSONANT PLHAU;Lo;0;L;;;;;N;;;;; -16B2B;PAHAWH HMONG CONSONANT NTHAU;Lo;0;L;;;;;N;;;;; -16B2C;PAHAWH HMONG CONSONANT NAU;Lo;0;L;;;;;N;;;;; -16B2D;PAHAWH HMONG CONSONANT AU;Lo;0;L;;;;;N;;;;; -16B2E;PAHAWH HMONG CONSONANT XAU;Lo;0;L;;;;;N;;;;; -16B2F;PAHAWH HMONG CONSONANT CAU;Lo;0;L;;;;;N;;;;; -16B30;PAHAWH HMONG MARK CIM TUB;Mn;230;NSM;;;;;N;;;;; -16B31;PAHAWH HMONG MARK CIM SO;Mn;230;NSM;;;;;N;;;;; -16B32;PAHAWH HMONG MARK CIM KES;Mn;230;NSM;;;;;N;;;;; -16B33;PAHAWH HMONG MARK CIM KHAV;Mn;230;NSM;;;;;N;;;;; -16B34;PAHAWH HMONG MARK CIM SUAM;Mn;230;NSM;;;;;N;;;;; -16B35;PAHAWH HMONG MARK CIM HOM;Mn;230;NSM;;;;;N;;;;; -16B36;PAHAWH HMONG MARK CIM TAUM;Mn;230;NSM;;;;;N;;;;; -16B37;PAHAWH HMONG SIGN VOS THOM;Po;0;L;;;;;N;;;;; -16B38;PAHAWH HMONG SIGN VOS TSHAB CEEB;Po;0;L;;;;;N;;;;; -16B39;PAHAWH HMONG SIGN CIM CHEEM;Po;0;L;;;;;N;;;;; -16B3A;PAHAWH HMONG SIGN VOS THIAB;Po;0;L;;;;;N;;;;; -16B3B;PAHAWH HMONG SIGN VOS FEEM;Po;0;L;;;;;N;;;;; -16B3C;PAHAWH HMONG SIGN XYEEM NTXIV;So;0;L;;;;;N;;;;; -16B3D;PAHAWH HMONG SIGN XYEEM RHO;So;0;L;;;;;N;;;;; -16B3E;PAHAWH HMONG SIGN XYEEM TOV;So;0;L;;;;;N;;;;; -16B3F;PAHAWH HMONG SIGN XYEEM FAIB;So;0;L;;;;;N;;;;; -16B40;PAHAWH HMONG SIGN VOS SEEV;Lm;0;L;;;;;N;;;;; -16B41;PAHAWH HMONG SIGN MEEJ SUAB;Lm;0;L;;;;;N;;;;; -16B42;PAHAWH HMONG SIGN VOS NRUA;Lm;0;L;;;;;N;;;;; -16B43;PAHAWH HMONG SIGN IB YAM;Lm;0;L;;;;;N;;;;; -16B44;PAHAWH HMONG SIGN XAUS;Po;0;L;;;;;N;;;;; -16B45;PAHAWH HMONG SIGN CIM TSOV ROG;So;0;L;;;;;N;;;;; -16B50;PAHAWH HMONG DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;; -16B51;PAHAWH HMONG DIGIT ONE;Nd;0;L;;1;1;1;N;;;;; -16B52;PAHAWH HMONG DIGIT TWO;Nd;0;L;;2;2;2;N;;;;; -16B53;PAHAWH HMONG DIGIT THREE;Nd;0;L;;3;3;3;N;;;;; -16B54;PAHAWH HMONG DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;; -16B55;PAHAWH HMONG DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;; -16B56;PAHAWH HMONG DIGIT SIX;Nd;0;L;;6;6;6;N;;;;; -16B57;PAHAWH HMONG DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;; -16B58;PAHAWH HMONG DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;; -16B59;PAHAWH HMONG DIGIT NINE;Nd;0;L;;9;9;9;N;;;;; -16B5B;PAHAWH HMONG NUMBER TENS;No;0;L;;;;10;N;;;;; -16B5C;PAHAWH HMONG NUMBER HUNDREDS;No;0;L;;;;100;N;;;;; -16B5D;PAHAWH HMONG NUMBER TEN THOUSANDS;No;0;L;;;;10000;N;;;;; -16B5E;PAHAWH HMONG NUMBER MILLIONS;No;0;L;;;;1000000;N;;;;; -16B5F;PAHAWH HMONG NUMBER HUNDRED MILLIONS;No;0;L;;;;100000000;N;;;;; -16B60;PAHAWH HMONG NUMBER TEN BILLIONS;No;0;L;;;;10000000000;N;;;;; -16B61;PAHAWH HMONG NUMBER TRILLIONS;No;0;L;;;;1000000000000;N;;;;; -16B63;PAHAWH HMONG SIGN VOS LUB;Lo;0;L;;;;;N;;;;; -16B64;PAHAWH HMONG SIGN XYOO;Lo;0;L;;;;;N;;;;; -16B65;PAHAWH HMONG SIGN HLI;Lo;0;L;;;;;N;;;;; -16B66;PAHAWH HMONG SIGN THIRD-STAGE HLI;Lo;0;L;;;;;N;;;;; -16B67;PAHAWH HMONG SIGN ZWJ THAJ;Lo;0;L;;;;;N;;;;; -16B68;PAHAWH HMONG SIGN HNUB;Lo;0;L;;;;;N;;;;; -16B69;PAHAWH HMONG SIGN NQIG;Lo;0;L;;;;;N;;;;; -16B6A;PAHAWH HMONG SIGN XIAB;Lo;0;L;;;;;N;;;;; -16B6B;PAHAWH HMONG SIGN NTUJ;Lo;0;L;;;;;N;;;;; -16B6C;PAHAWH HMONG SIGN AV;Lo;0;L;;;;;N;;;;; -16B6D;PAHAWH HMONG SIGN TXHEEJ CEEV;Lo;0;L;;;;;N;;;;; -16B6E;PAHAWH HMONG SIGN MEEJ TSEEB;Lo;0;L;;;;;N;;;;; -16B6F;PAHAWH HMONG SIGN TAU;Lo;0;L;;;;;N;;;;; -16B70;PAHAWH HMONG SIGN LOS;Lo;0;L;;;;;N;;;;; -16B71;PAHAWH HMONG SIGN MUS;Lo;0;L;;;;;N;;;;; -16B72;PAHAWH HMONG SIGN CIM HAIS LUS NTOG NTOG;Lo;0;L;;;;;N;;;;; -16B73;PAHAWH HMONG SIGN CIM CUAM TSHOOJ;Lo;0;L;;;;;N;;;;; -16B74;PAHAWH HMONG SIGN CIM TXWV;Lo;0;L;;;;;N;;;;; -16B75;PAHAWH HMONG SIGN CIM TXWV CHWV;Lo;0;L;;;;;N;;;;; -16B76;PAHAWH HMONG SIGN CIM PUB DAWB;Lo;0;L;;;;;N;;;;; -16B77;PAHAWH HMONG SIGN CIM NRES TOS;Lo;0;L;;;;;N;;;;; -16B7D;PAHAWH HMONG CLAN SIGN TSHEEJ;Lo;0;L;;;;;N;;;;; -16B7E;PAHAWH HMONG CLAN SIGN YEEG;Lo;0;L;;;;;N;;;;; -16B7F;PAHAWH HMONG CLAN SIGN LIS;Lo;0;L;;;;;N;;;;; -16B80;PAHAWH HMONG CLAN SIGN LAUJ;Lo;0;L;;;;;N;;;;; -16B81;PAHAWH HMONG CLAN SIGN XYOOJ;Lo;0;L;;;;;N;;;;; -16B82;PAHAWH HMONG CLAN SIGN KOO;Lo;0;L;;;;;N;;;;; -16B83;PAHAWH HMONG CLAN SIGN HAWJ;Lo;0;L;;;;;N;;;;; -16B84;PAHAWH HMONG CLAN SIGN MUAS;Lo;0;L;;;;;N;;;;; -16B85;PAHAWH HMONG CLAN SIGN THOJ;Lo;0;L;;;;;N;;;;; -16B86;PAHAWH HMONG CLAN SIGN TSAB;Lo;0;L;;;;;N;;;;; -16B87;PAHAWH HMONG CLAN SIGN PHAB;Lo;0;L;;;;;N;;;;; -16B88;PAHAWH HMONG CLAN SIGN KHAB;Lo;0;L;;;;;N;;;;; -16B89;PAHAWH HMONG CLAN SIGN HAM;Lo;0;L;;;;;N;;;;; -16B8A;PAHAWH HMONG CLAN SIGN VAJ;Lo;0;L;;;;;N;;;;; -16B8B;PAHAWH HMONG CLAN SIGN FAJ;Lo;0;L;;;;;N;;;;; -16B8C;PAHAWH HMONG CLAN SIGN YAJ;Lo;0;L;;;;;N;;;;; -16B8D;PAHAWH HMONG CLAN SIGN TSWB;Lo;0;L;;;;;N;;;;; -16B8E;PAHAWH HMONG CLAN SIGN KWM;Lo;0;L;;;;;N;;;;; -16B8F;PAHAWH HMONG CLAN SIGN VWJ;Lo;0;L;;;;;N;;;;; -16F00;MIAO LETTER PA;Lo;0;L;;;;;N;;;;; -16F01;MIAO LETTER BA;Lo;0;L;;;;;N;;;;; -16F02;MIAO LETTER YI PA;Lo;0;L;;;;;N;;;;; -16F03;MIAO LETTER PLA;Lo;0;L;;;;;N;;;;; -16F04;MIAO LETTER MA;Lo;0;L;;;;;N;;;;; -16F05;MIAO LETTER MHA;Lo;0;L;;;;;N;;;;; -16F06;MIAO LETTER ARCHAIC MA;Lo;0;L;;;;;N;;;;; -16F07;MIAO LETTER FA;Lo;0;L;;;;;N;;;;; -16F08;MIAO LETTER VA;Lo;0;L;;;;;N;;;;; -16F09;MIAO LETTER VFA;Lo;0;L;;;;;N;;;;; -16F0A;MIAO LETTER TA;Lo;0;L;;;;;N;;;;; -16F0B;MIAO LETTER DA;Lo;0;L;;;;;N;;;;; -16F0C;MIAO LETTER YI TTA;Lo;0;L;;;;;N;;;;; -16F0D;MIAO LETTER YI TA;Lo;0;L;;;;;N;;;;; -16F0E;MIAO LETTER TTA;Lo;0;L;;;;;N;;;;; -16F0F;MIAO LETTER DDA;Lo;0;L;;;;;N;;;;; -16F10;MIAO LETTER NA;Lo;0;L;;;;;N;;;;; -16F11;MIAO LETTER NHA;Lo;0;L;;;;;N;;;;; -16F12;MIAO LETTER YI NNA;Lo;0;L;;;;;N;;;;; -16F13;MIAO LETTER ARCHAIC NA;Lo;0;L;;;;;N;;;;; -16F14;MIAO LETTER NNA;Lo;0;L;;;;;N;;;;; -16F15;MIAO LETTER NNHA;Lo;0;L;;;;;N;;;;; -16F16;MIAO LETTER LA;Lo;0;L;;;;;N;;;;; -16F17;MIAO LETTER LYA;Lo;0;L;;;;;N;;;;; -16F18;MIAO LETTER LHA;Lo;0;L;;;;;N;;;;; -16F19;MIAO LETTER LHYA;Lo;0;L;;;;;N;;;;; -16F1A;MIAO LETTER TLHA;Lo;0;L;;;;;N;;;;; -16F1B;MIAO LETTER DLHA;Lo;0;L;;;;;N;;;;; -16F1C;MIAO LETTER TLHYA;Lo;0;L;;;;;N;;;;; -16F1D;MIAO LETTER DLHYA;Lo;0;L;;;;;N;;;;; -16F1E;MIAO LETTER KA;Lo;0;L;;;;;N;;;;; -16F1F;MIAO LETTER GA;Lo;0;L;;;;;N;;;;; -16F20;MIAO LETTER YI KA;Lo;0;L;;;;;N;;;;; -16F21;MIAO LETTER QA;Lo;0;L;;;;;N;;;;; -16F22;MIAO LETTER QGA;Lo;0;L;;;;;N;;;;; -16F23;MIAO LETTER NGA;Lo;0;L;;;;;N;;;;; -16F24;MIAO LETTER NGHA;Lo;0;L;;;;;N;;;;; -16F25;MIAO LETTER ARCHAIC NGA;Lo;0;L;;;;;N;;;;; -16F26;MIAO LETTER HA;Lo;0;L;;;;;N;;;;; -16F27;MIAO LETTER XA;Lo;0;L;;;;;N;;;;; -16F28;MIAO LETTER GHA;Lo;0;L;;;;;N;;;;; -16F29;MIAO LETTER GHHA;Lo;0;L;;;;;N;;;;; -16F2A;MIAO LETTER TSSA;Lo;0;L;;;;;N;;;;; -16F2B;MIAO LETTER DZZA;Lo;0;L;;;;;N;;;;; -16F2C;MIAO LETTER NYA;Lo;0;L;;;;;N;;;;; -16F2D;MIAO LETTER NYHA;Lo;0;L;;;;;N;;;;; -16F2E;MIAO LETTER TSHA;Lo;0;L;;;;;N;;;;; -16F2F;MIAO LETTER DZHA;Lo;0;L;;;;;N;;;;; -16F30;MIAO LETTER YI TSHA;Lo;0;L;;;;;N;;;;; -16F31;MIAO LETTER YI DZHA;Lo;0;L;;;;;N;;;;; -16F32;MIAO LETTER REFORMED TSHA;Lo;0;L;;;;;N;;;;; -16F33;MIAO LETTER SHA;Lo;0;L;;;;;N;;;;; -16F34;MIAO LETTER SSA;Lo;0;L;;;;;N;;;;; -16F35;MIAO LETTER ZHA;Lo;0;L;;;;;N;;;;; -16F36;MIAO LETTER ZSHA;Lo;0;L;;;;;N;;;;; -16F37;MIAO LETTER TSA;Lo;0;L;;;;;N;;;;; -16F38;MIAO LETTER DZA;Lo;0;L;;;;;N;;;;; -16F39;MIAO LETTER YI TSA;Lo;0;L;;;;;N;;;;; -16F3A;MIAO LETTER SA;Lo;0;L;;;;;N;;;;; -16F3B;MIAO LETTER ZA;Lo;0;L;;;;;N;;;;; -16F3C;MIAO LETTER ZSA;Lo;0;L;;;;;N;;;;; -16F3D;MIAO LETTER ZZA;Lo;0;L;;;;;N;;;;; -16F3E;MIAO LETTER ZZSA;Lo;0;L;;;;;N;;;;; -16F3F;MIAO LETTER ARCHAIC ZZA;Lo;0;L;;;;;N;;;;; -16F40;MIAO LETTER ZZYA;Lo;0;L;;;;;N;;;;; -16F41;MIAO LETTER ZZSYA;Lo;0;L;;;;;N;;;;; -16F42;MIAO LETTER WA;Lo;0;L;;;;;N;;;;; -16F43;MIAO LETTER AH;Lo;0;L;;;;;N;;;;; -16F44;MIAO LETTER HHA;Lo;0;L;;;;;N;;;;; -16F50;MIAO LETTER NASALIZATION;Lo;0;L;;;;;N;;;;; -16F51;MIAO SIGN ASPIRATION;Mc;0;L;;;;;N;;;;; -16F52;MIAO SIGN REFORMED VOICING;Mc;0;L;;;;;N;;;;; -16F53;MIAO SIGN REFORMED ASPIRATION;Mc;0;L;;;;;N;;;;; -16F54;MIAO VOWEL SIGN A;Mc;0;L;;;;;N;;;;; -16F55;MIAO VOWEL SIGN AA;Mc;0;L;;;;;N;;;;; -16F56;MIAO VOWEL SIGN AHH;Mc;0;L;;;;;N;;;;; -16F57;MIAO VOWEL SIGN AN;Mc;0;L;;;;;N;;;;; -16F58;MIAO VOWEL SIGN ANG;Mc;0;L;;;;;N;;;;; -16F59;MIAO VOWEL SIGN O;Mc;0;L;;;;;N;;;;; -16F5A;MIAO VOWEL SIGN OO;Mc;0;L;;;;;N;;;;; -16F5B;MIAO VOWEL SIGN WO;Mc;0;L;;;;;N;;;;; -16F5C;MIAO VOWEL SIGN W;Mc;0;L;;;;;N;;;;; -16F5D;MIAO VOWEL SIGN E;Mc;0;L;;;;;N;;;;; -16F5E;MIAO VOWEL SIGN EN;Mc;0;L;;;;;N;;;;; -16F5F;MIAO VOWEL SIGN ENG;Mc;0;L;;;;;N;;;;; -16F60;MIAO VOWEL SIGN OEY;Mc;0;L;;;;;N;;;;; -16F61;MIAO VOWEL SIGN I;Mc;0;L;;;;;N;;;;; -16F62;MIAO VOWEL SIGN IA;Mc;0;L;;;;;N;;;;; -16F63;MIAO VOWEL SIGN IAN;Mc;0;L;;;;;N;;;;; -16F64;MIAO VOWEL SIGN IANG;Mc;0;L;;;;;N;;;;; -16F65;MIAO VOWEL SIGN IO;Mc;0;L;;;;;N;;;;; -16F66;MIAO VOWEL SIGN IE;Mc;0;L;;;;;N;;;;; -16F67;MIAO VOWEL SIGN II;Mc;0;L;;;;;N;;;;; -16F68;MIAO VOWEL SIGN IU;Mc;0;L;;;;;N;;;;; -16F69;MIAO VOWEL SIGN ING;Mc;0;L;;;;;N;;;;; -16F6A;MIAO VOWEL SIGN U;Mc;0;L;;;;;N;;;;; -16F6B;MIAO VOWEL SIGN UA;Mc;0;L;;;;;N;;;;; -16F6C;MIAO VOWEL SIGN UAN;Mc;0;L;;;;;N;;;;; -16F6D;MIAO VOWEL SIGN UANG;Mc;0;L;;;;;N;;;;; -16F6E;MIAO VOWEL SIGN UU;Mc;0;L;;;;;N;;;;; -16F6F;MIAO VOWEL SIGN UEI;Mc;0;L;;;;;N;;;;; -16F70;MIAO VOWEL SIGN UNG;Mc;0;L;;;;;N;;;;; -16F71;MIAO VOWEL SIGN Y;Mc;0;L;;;;;N;;;;; -16F72;MIAO VOWEL SIGN YI;Mc;0;L;;;;;N;;;;; -16F73;MIAO VOWEL SIGN AE;Mc;0;L;;;;;N;;;;; -16F74;MIAO VOWEL SIGN AEE;Mc;0;L;;;;;N;;;;; -16F75;MIAO VOWEL SIGN ERR;Mc;0;L;;;;;N;;;;; -16F76;MIAO VOWEL SIGN ROUNDED ERR;Mc;0;L;;;;;N;;;;; -16F77;MIAO VOWEL SIGN ER;Mc;0;L;;;;;N;;;;; -16F78;MIAO VOWEL SIGN ROUNDED ER;Mc;0;L;;;;;N;;;;; -16F79;MIAO VOWEL SIGN AI;Mc;0;L;;;;;N;;;;; -16F7A;MIAO VOWEL SIGN EI;Mc;0;L;;;;;N;;;;; -16F7B;MIAO VOWEL SIGN AU;Mc;0;L;;;;;N;;;;; -16F7C;MIAO VOWEL SIGN OU;Mc;0;L;;;;;N;;;;; -16F7D;MIAO VOWEL SIGN N;Mc;0;L;;;;;N;;;;; -16F7E;MIAO VOWEL SIGN NG;Mc;0;L;;;;;N;;;;; -16F8F;MIAO TONE RIGHT;Mn;0;NSM;;;;;N;;;;; -16F90;MIAO TONE TOP RIGHT;Mn;0;NSM;;;;;N;;;;; -16F91;MIAO TONE ABOVE;Mn;0;NSM;;;;;N;;;;; -16F92;MIAO TONE BELOW;Mn;0;NSM;;;;;N;;;;; -16F93;MIAO LETTER TONE-2;Lm;0;L;;;;;N;;;;; -16F94;MIAO LETTER TONE-3;Lm;0;L;;;;;N;;;;; -16F95;MIAO LETTER TONE-4;Lm;0;L;;;;;N;;;;; -16F96;MIAO LETTER TONE-5;Lm;0;L;;;;;N;;;;; -16F97;MIAO LETTER TONE-6;Lm;0;L;;;;;N;;;;; -16F98;MIAO LETTER TONE-7;Lm;0;L;;;;;N;;;;; -16F99;MIAO LETTER TONE-8;Lm;0;L;;;;;N;;;;; -16F9A;MIAO LETTER REFORMED TONE-1;Lm;0;L;;;;;N;;;;; -16F9B;MIAO LETTER REFORMED TONE-2;Lm;0;L;;;;;N;;;;; -16F9C;MIAO LETTER REFORMED TONE-4;Lm;0;L;;;;;N;;;;; -16F9D;MIAO LETTER REFORMED TONE-5;Lm;0;L;;;;;N;;;;; -16F9E;MIAO LETTER REFORMED TONE-6;Lm;0;L;;;;;N;;;;; -16F9F;MIAO LETTER REFORMED TONE-8;Lm;0;L;;;;;N;;;;; -1B000;KATAKANA LETTER ARCHAIC E;Lo;0;L;;;;;N;;;;; -1B001;HIRAGANA LETTER ARCHAIC YE;Lo;0;L;;;;;N;;;;; -1BC00;DUPLOYAN LETTER H;Lo;0;L;;;;;N;;;;; -1BC01;DUPLOYAN LETTER X;Lo;0;L;;;;;N;;;;; -1BC02;DUPLOYAN LETTER P;Lo;0;L;;;;;N;;;;; -1BC03;DUPLOYAN LETTER T;Lo;0;L;;;;;N;;;;; -1BC04;DUPLOYAN LETTER F;Lo;0;L;;;;;N;;;;; -1BC05;DUPLOYAN LETTER K;Lo;0;L;;;;;N;;;;; -1BC06;DUPLOYAN LETTER L;Lo;0;L;;;;;N;;;;; -1BC07;DUPLOYAN LETTER B;Lo;0;L;;;;;N;;;;; -1BC08;DUPLOYAN LETTER D;Lo;0;L;;;;;N;;;;; -1BC09;DUPLOYAN LETTER V;Lo;0;L;;;;;N;;;;; -1BC0A;DUPLOYAN LETTER G;Lo;0;L;;;;;N;;;;; -1BC0B;DUPLOYAN LETTER R;Lo;0;L;;;;;N;;;;; -1BC0C;DUPLOYAN LETTER P N;Lo;0;L;;;;;N;;;;; -1BC0D;DUPLOYAN LETTER D S;Lo;0;L;;;;;N;;;;; -1BC0E;DUPLOYAN LETTER F N;Lo;0;L;;;;;N;;;;; -1BC0F;DUPLOYAN LETTER K M;Lo;0;L;;;;;N;;;;; -1BC10;DUPLOYAN LETTER R S;Lo;0;L;;;;;N;;;;; -1BC11;DUPLOYAN LETTER TH;Lo;0;L;;;;;N;;;;; -1BC12;DUPLOYAN LETTER SLOAN DH;Lo;0;L;;;;;N;;;;; -1BC13;DUPLOYAN LETTER DH;Lo;0;L;;;;;N;;;;; -1BC14;DUPLOYAN LETTER KK;Lo;0;L;;;;;N;;;;; -1BC15;DUPLOYAN LETTER SLOAN J;Lo;0;L;;;;;N;;;;; -1BC16;DUPLOYAN LETTER HL;Lo;0;L;;;;;N;;;;; -1BC17;DUPLOYAN LETTER LH;Lo;0;L;;;;;N;;;;; -1BC18;DUPLOYAN LETTER RH;Lo;0;L;;;;;N;;;;; -1BC19;DUPLOYAN LETTER M;Lo;0;L;;;;;N;;;;; -1BC1A;DUPLOYAN LETTER N;Lo;0;L;;;;;N;;;;; -1BC1B;DUPLOYAN LETTER J;Lo;0;L;;;;;N;;;;; -1BC1C;DUPLOYAN LETTER S;Lo;0;L;;;;;N;;;;; -1BC1D;DUPLOYAN LETTER M N;Lo;0;L;;;;;N;;;;; -1BC1E;DUPLOYAN LETTER N M;Lo;0;L;;;;;N;;;;; -1BC1F;DUPLOYAN LETTER J M;Lo;0;L;;;;;N;;;;; -1BC20;DUPLOYAN LETTER S J;Lo;0;L;;;;;N;;;;; -1BC21;DUPLOYAN LETTER M WITH DOT;Lo;0;L;;;;;N;;;;; -1BC22;DUPLOYAN LETTER N WITH DOT;Lo;0;L;;;;;N;;;;; -1BC23;DUPLOYAN LETTER J WITH DOT;Lo;0;L;;;;;N;;;;; -1BC24;DUPLOYAN LETTER J WITH DOTS INSIDE AND ABOVE;Lo;0;L;;;;;N;;;;; -1BC25;DUPLOYAN LETTER S WITH DOT;Lo;0;L;;;;;N;;;;; -1BC26;DUPLOYAN LETTER S WITH DOT BELOW;Lo;0;L;;;;;N;;;;; -1BC27;DUPLOYAN LETTER M S;Lo;0;L;;;;;N;;;;; -1BC28;DUPLOYAN LETTER N S;Lo;0;L;;;;;N;;;;; -1BC29;DUPLOYAN LETTER J S;Lo;0;L;;;;;N;;;;; -1BC2A;DUPLOYAN LETTER S S;Lo;0;L;;;;;N;;;;; -1BC2B;DUPLOYAN LETTER M N S;Lo;0;L;;;;;N;;;;; -1BC2C;DUPLOYAN LETTER N M S;Lo;0;L;;;;;N;;;;; -1BC2D;DUPLOYAN LETTER J M S;Lo;0;L;;;;;N;;;;; -1BC2E;DUPLOYAN LETTER S J S;Lo;0;L;;;;;N;;;;; -1BC2F;DUPLOYAN LETTER J S WITH DOT;Lo;0;L;;;;;N;;;;; -1BC30;DUPLOYAN LETTER J N;Lo;0;L;;;;;N;;;;; -1BC31;DUPLOYAN LETTER J N S;Lo;0;L;;;;;N;;;;; -1BC32;DUPLOYAN LETTER S T;Lo;0;L;;;;;N;;;;; -1BC33;DUPLOYAN LETTER S T R;Lo;0;L;;;;;N;;;;; -1BC34;DUPLOYAN LETTER S P;Lo;0;L;;;;;N;;;;; -1BC35;DUPLOYAN LETTER S P R;Lo;0;L;;;;;N;;;;; -1BC36;DUPLOYAN LETTER T S;Lo;0;L;;;;;N;;;;; -1BC37;DUPLOYAN LETTER T R S;Lo;0;L;;;;;N;;;;; -1BC38;DUPLOYAN LETTER W;Lo;0;L;;;;;N;;;;; -1BC39;DUPLOYAN LETTER WH;Lo;0;L;;;;;N;;;;; -1BC3A;DUPLOYAN LETTER W R;Lo;0;L;;;;;N;;;;; -1BC3B;DUPLOYAN LETTER S N;Lo;0;L;;;;;N;;;;; -1BC3C;DUPLOYAN LETTER S M;Lo;0;L;;;;;N;;;;; -1BC3D;DUPLOYAN LETTER K R S;Lo;0;L;;;;;N;;;;; -1BC3E;DUPLOYAN LETTER G R S;Lo;0;L;;;;;N;;;;; -1BC3F;DUPLOYAN LETTER S K;Lo;0;L;;;;;N;;;;; -1BC40;DUPLOYAN LETTER S K R;Lo;0;L;;;;;N;;;;; -1BC41;DUPLOYAN LETTER A;Lo;0;L;;;;;N;;;;; -1BC42;DUPLOYAN LETTER SLOAN OW;Lo;0;L;;;;;N;;;;; -1BC43;DUPLOYAN LETTER OA;Lo;0;L;;;;;N;;;;; -1BC44;DUPLOYAN LETTER O;Lo;0;L;;;;;N;;;;; -1BC45;DUPLOYAN LETTER AOU;Lo;0;L;;;;;N;;;;; -1BC46;DUPLOYAN LETTER I;Lo;0;L;;;;;N;;;;; -1BC47;DUPLOYAN LETTER E;Lo;0;L;;;;;N;;;;; -1BC48;DUPLOYAN LETTER IE;Lo;0;L;;;;;N;;;;; -1BC49;DUPLOYAN LETTER SHORT I;Lo;0;L;;;;;N;;;;; -1BC4A;DUPLOYAN LETTER UI;Lo;0;L;;;;;N;;;;; -1BC4B;DUPLOYAN LETTER EE;Lo;0;L;;;;;N;;;;; -1BC4C;DUPLOYAN LETTER SLOAN EH;Lo;0;L;;;;;N;;;;; -1BC4D;DUPLOYAN LETTER ROMANIAN I;Lo;0;L;;;;;N;;;;; -1BC4E;DUPLOYAN LETTER SLOAN EE;Lo;0;L;;;;;N;;;;; -1BC4F;DUPLOYAN LETTER LONG I;Lo;0;L;;;;;N;;;;; -1BC50;DUPLOYAN LETTER YE;Lo;0;L;;;;;N;;;;; -1BC51;DUPLOYAN LETTER U;Lo;0;L;;;;;N;;;;; -1BC52;DUPLOYAN LETTER EU;Lo;0;L;;;;;N;;;;; -1BC53;DUPLOYAN LETTER XW;Lo;0;L;;;;;N;;;;; -1BC54;DUPLOYAN LETTER U N;Lo;0;L;;;;;N;;;;; -1BC55;DUPLOYAN LETTER LONG U;Lo;0;L;;;;;N;;;;; -1BC56;DUPLOYAN LETTER ROMANIAN U;Lo;0;L;;;;;N;;;;; -1BC57;DUPLOYAN LETTER UH;Lo;0;L;;;;;N;;;;; -1BC58;DUPLOYAN LETTER SLOAN U;Lo;0;L;;;;;N;;;;; -1BC59;DUPLOYAN LETTER OOH;Lo;0;L;;;;;N;;;;; -1BC5A;DUPLOYAN LETTER OW;Lo;0;L;;;;;N;;;;; -1BC5B;DUPLOYAN LETTER OU;Lo;0;L;;;;;N;;;;; -1BC5C;DUPLOYAN LETTER WA;Lo;0;L;;;;;N;;;;; -1BC5D;DUPLOYAN LETTER WO;Lo;0;L;;;;;N;;;;; -1BC5E;DUPLOYAN LETTER WI;Lo;0;L;;;;;N;;;;; -1BC5F;DUPLOYAN LETTER WEI;Lo;0;L;;;;;N;;;;; -1BC60;DUPLOYAN LETTER WOW;Lo;0;L;;;;;N;;;;; -1BC61;DUPLOYAN LETTER NASAL U;Lo;0;L;;;;;N;;;;; -1BC62;DUPLOYAN LETTER NASAL O;Lo;0;L;;;;;N;;;;; -1BC63;DUPLOYAN LETTER NASAL I;Lo;0;L;;;;;N;;;;; -1BC64;DUPLOYAN LETTER NASAL A;Lo;0;L;;;;;N;;;;; -1BC65;DUPLOYAN LETTER PERNIN AN;Lo;0;L;;;;;N;;;;; -1BC66;DUPLOYAN LETTER PERNIN AM;Lo;0;L;;;;;N;;;;; -1BC67;DUPLOYAN LETTER SLOAN EN;Lo;0;L;;;;;N;;;;; -1BC68;DUPLOYAN LETTER SLOAN AN;Lo;0;L;;;;;N;;;;; -1BC69;DUPLOYAN LETTER SLOAN ON;Lo;0;L;;;;;N;;;;; -1BC6A;DUPLOYAN LETTER VOCALIC M;Lo;0;L;;;;;N;;;;; -1BC70;DUPLOYAN AFFIX LEFT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; -1BC71;DUPLOYAN AFFIX MID HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; -1BC72;DUPLOYAN AFFIX RIGHT HORIZONTAL SECANT;Lo;0;L;;;;;N;;;;; -1BC73;DUPLOYAN AFFIX LOW VERTICAL SECANT;Lo;0;L;;;;;N;;;;; -1BC74;DUPLOYAN AFFIX MID VERTICAL SECANT;Lo;0;L;;;;;N;;;;; -1BC75;DUPLOYAN AFFIX HIGH VERTICAL SECANT;Lo;0;L;;;;;N;;;;; -1BC76;DUPLOYAN AFFIX ATTACHED SECANT;Lo;0;L;;;;;N;;;;; -1BC77;DUPLOYAN AFFIX ATTACHED LEFT-TO-RIGHT SECANT;Lo;0;L;;;;;N;;;;; -1BC78;DUPLOYAN AFFIX ATTACHED TANGENT;Lo;0;L;;;;;N;;;;; -1BC79;DUPLOYAN AFFIX ATTACHED TAIL;Lo;0;L;;;;;N;;;;; -1BC7A;DUPLOYAN AFFIX ATTACHED E HOOK;Lo;0;L;;;;;N;;;;; -1BC7B;DUPLOYAN AFFIX ATTACHED I HOOK;Lo;0;L;;;;;N;;;;; -1BC7C;DUPLOYAN AFFIX ATTACHED TANGENT HOOK;Lo;0;L;;;;;N;;;;; -1BC80;DUPLOYAN AFFIX HIGH ACUTE;Lo;0;L;;;;;N;;;;; -1BC81;DUPLOYAN AFFIX HIGH TIGHT ACUTE;Lo;0;L;;;;;N;;;;; -1BC82;DUPLOYAN AFFIX HIGH GRAVE;Lo;0;L;;;;;N;;;;; -1BC83;DUPLOYAN AFFIX HIGH LONG GRAVE;Lo;0;L;;;;;N;;;;; -1BC84;DUPLOYAN AFFIX HIGH DOT;Lo;0;L;;;;;N;;;;; -1BC85;DUPLOYAN AFFIX HIGH CIRCLE;Lo;0;L;;;;;N;;;;; -1BC86;DUPLOYAN AFFIX HIGH LINE;Lo;0;L;;;;;N;;;;; -1BC87;DUPLOYAN AFFIX HIGH WAVE;Lo;0;L;;;;;N;;;;; -1BC88;DUPLOYAN AFFIX HIGH VERTICAL;Lo;0;L;;;;;N;;;;; -1BC90;DUPLOYAN AFFIX LOW ACUTE;Lo;0;L;;;;;N;;;;; -1BC91;DUPLOYAN AFFIX LOW TIGHT ACUTE;Lo;0;L;;;;;N;;;;; -1BC92;DUPLOYAN AFFIX LOW GRAVE;Lo;0;L;;;;;N;;;;; -1BC93;DUPLOYAN AFFIX LOW LONG GRAVE;Lo;0;L;;;;;N;;;;; -1BC94;DUPLOYAN AFFIX LOW DOT;Lo;0;L;;;;;N;;;;; -1BC95;DUPLOYAN AFFIX LOW CIRCLE;Lo;0;L;;;;;N;;;;; -1BC96;DUPLOYAN AFFIX LOW LINE;Lo;0;L;;;;;N;;;;; -1BC97;DUPLOYAN AFFIX LOW WAVE;Lo;0;L;;;;;N;;;;; -1BC98;DUPLOYAN AFFIX LOW VERTICAL;Lo;0;L;;;;;N;;;;; -1BC99;DUPLOYAN AFFIX LOW ARROW;Lo;0;L;;;;;N;;;;; -1BC9C;DUPLOYAN SIGN O WITH CROSS;So;0;L;;;;;N;;;;; -1BC9D;DUPLOYAN THICK LETTER SELECTOR;Mn;0;NSM;;;;;N;;;;; -1BC9E;DUPLOYAN DOUBLE MARK;Mn;1;NSM;;;;;N;;;;; -1BC9F;DUPLOYAN PUNCTUATION CHINOOK FULL STOP;Po;0;L;;;;;N;;;;; -1BCA0;SHORTHAND FORMAT LETTER OVERLAP;Cf;0;BN;;;;;N;;;;; -1BCA1;SHORTHAND FORMAT CONTINUING OVERLAP;Cf;0;BN;;;;;N;;;;; -1BCA2;SHORTHAND FORMAT DOWN STEP;Cf;0;BN;;;;;N;;;;; -1BCA3;SHORTHAND FORMAT UP STEP;Cf;0;BN;;;;;N;;;;; -1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;; -1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;; -1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;; -1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;; -1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;; -1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;; -1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;; -1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;; -1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;; -1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;; -1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;; -1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;; -1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;; -1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;; -1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;; -1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;; -1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;; -1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;; -1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;; -1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;; -1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;; -1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;; -1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;; -1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;; -1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;; -1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;; -1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;; -1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;; -1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;; -1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;; -1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;; -1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;; -1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;; -1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;; -1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;; -1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;; -1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;; -1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;; -1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;; -1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;; -1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;; -1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;; -1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;; -1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;; -1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;; -1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;; -1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;; -1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;; -1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;; -1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;; -1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;; -1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;; -1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;; -1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;; -1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;; -1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;; -1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;; -1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;; -1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;; -1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;; -1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;; -1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;; -1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;; -1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;; -1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;; -1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;; -1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;; -1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;; -1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;; -1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;; -1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;; -1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;; -1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;; -1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;; -1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;; -1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;; -1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;; -1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;; -1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;; -1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;; -1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;; -1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;; -1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;; -1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;; -1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;; -1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;; -1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;; -1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;; -1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;; -1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;; -1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;; -1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;; -1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;; -1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;; -1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;; -1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;; -1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;; -1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;; -1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;; -1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;; -1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;; -1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;; -1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;; -1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;; -1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;; -1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;; -1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;; -1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;; -1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;; -1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;; -1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;; -1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;; -1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;; -1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;; -1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;; -1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;; -1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;; -1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;; -1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;; -1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;; -1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;; -1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;; -1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;; -1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;; -1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;; -1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;; -1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;; -1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;; -1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;; -1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;; -1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;; -1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;; -1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;; -1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;; -1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;; -1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;; -1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;; -1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;; -1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;; -1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;; -1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;; -1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;; -1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;; -1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;; -1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;; -1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; -1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;; -1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;; -1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;; -1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;; -1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;; -1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;; -1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;; -1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;; -1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;; -1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;; -1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;; -1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;; -1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;; -1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;; -1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;; -1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;; -1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;; -1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;; -1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;; -1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;; -1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;; -1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;; -1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;; -1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;; -1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; -1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;; -1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;; -1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;; -1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;; -1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;; -1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;; -1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;; -1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;; -1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;; -1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;; -1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;; -1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;; -1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;; -1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;; -1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;; -1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;; -1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;; -1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;; -1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;; -1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;; -1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;; -1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;; -1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;; -1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;; -1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;; -1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;; -1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;; -1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;; -1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;; -1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;; -1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;; -1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;; -1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;; -1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;; -1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;; -1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; -1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; -1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; -1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; -1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;; -1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;; -1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;; -1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;; -1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;; -1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;; -1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;; -1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;; -1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;; -1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;; -1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;; -1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;; -1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;; -1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;; -1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;; -1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;; -1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;; -1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;; -1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;; -1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;; -1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;; -1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;; -1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;; -1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;; -1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;; -1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;; -1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;; -1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;; -1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;; -1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;; -1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;; -1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;; -1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;; -1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;; -1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;; -1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;; -1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;; -1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;; -1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;; -1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;; -1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;; -1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;; -1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;; -1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;; -1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;; -1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;; -1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;; -1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;; -1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;; -1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;; -1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;; -1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;; -1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;; -1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;; -1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;; -1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;; -1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;; -1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;; -1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;; -1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;; -1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;; -1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;; -1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;; -1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;; -1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;; -1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;; -1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;; -1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;; -1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;; -1D129;MUSICAL SYMBOL MULTIPLE MEASURE REST;So;0;L;;;;;N;;;;; -1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;; -1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;; -1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;; -1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;; -1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;; -1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;; -1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;; -1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;; -1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;; -1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;; -1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;; -1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;; -1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;; -1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;; -1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;; -1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;; -1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;; -1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;; -1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;; -1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;; -1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;; -1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;; -1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;; -1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;; -1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;; -1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;; -1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;; -1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;; -1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;; -1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;; -1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;; -1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;; -1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;; -1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;; -1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; -1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; -1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;; -1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;; -1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;; -1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;; -1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;; -1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;; -1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;; -1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;; -1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;; -1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;; -1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;; -1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;; -1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;; -1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;; -1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;; -1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;; -1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;; -1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;; -1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;; -1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;; -1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;; -1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;; -1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;; -1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;; -1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;; -1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;; -1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;; -1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;; -1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;; -1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;; -1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;; -1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;; -1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;; -1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;; -1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;; -1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;; -1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;; -1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;; -1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;; -1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;; -1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;; -1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;; -1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;; -1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;; -1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;; -1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;; -1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;; -1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;; -1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;; -1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;; -1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;; -1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;; -1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;; -1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;; -1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;; -1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;; -1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;; -1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;; -1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;; -1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;; -1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;; -1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;; -1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;; -1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;; -1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;; -1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;; -1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;; -1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;; -1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;; -1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;; -1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;; -1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;; -1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;; -1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;; -1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;; -1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;; -1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;; -1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;; -1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;; -1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;; -1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;; -1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;; -1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;; -1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;; -1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;; -1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;; -1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;; -1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;; -1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;; -1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;; -1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;; -1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;; -1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;; -1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;; -1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;; -1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;; -1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;; -1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;; -1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;; -1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;; -1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;; -1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;; -1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;; -1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;; -1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;; -1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;; -1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;; -1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;; -1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;; -1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;; -1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;; -1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;; -1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;; -1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;; -1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;; -1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;; -1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; -1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; -1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; -1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;; -1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;; -1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;; -1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;; -1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;; -1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;; -1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;; -1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;; -1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;; -1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;; -1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;; -1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;; -1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;; -1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;; -1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;; -1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;; -1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;; -1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;; -1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;; -1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;; -1D1DE;MUSICAL SYMBOL KIEVAN C CLEF;So;0;L;;;;;N;;;;; -1D1DF;MUSICAL SYMBOL KIEVAN END OF PIECE;So;0;L;;;;;N;;;;; -1D1E0;MUSICAL SYMBOL KIEVAN FINAL NOTE;So;0;L;;;;;N;;;;; -1D1E1;MUSICAL SYMBOL KIEVAN RECITATIVE MARK;So;0;L;;;;;N;;;;; -1D1E2;MUSICAL SYMBOL KIEVAN WHOLE NOTE;So;0;L;;;;;N;;;;; -1D1E3;MUSICAL SYMBOL KIEVAN HALF NOTE;So;0;L;;;;;N;;;;; -1D1E4;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM DOWN;So;0;L;;;;;N;;;;; -1D1E5;MUSICAL SYMBOL KIEVAN QUARTER NOTE STEM UP;So;0;L;;;;;N;;;;; -1D1E6;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM DOWN;So;0;L;;;;;N;;;;; -1D1E7;MUSICAL SYMBOL KIEVAN EIGHTH NOTE STEM UP;So;0;L;;;;;N;;;;; -1D1E8;MUSICAL SYMBOL KIEVAN FLAT SIGN;So;0;L;;;;;N;;;;; -1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; -1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; -1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;; -1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; -1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; -1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;; -1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; -1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; -1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;; -1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;; -1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; -1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; -1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; -1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; -1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;; -1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;; -1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; -1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; -1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; -1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;; -1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;; -1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;; -1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; -1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; -1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; -1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; -1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; -1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; -1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; -1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;; -1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;; -1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;; -1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;; -1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;; -1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;; -1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;; -1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;; -1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;; -1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;; -1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;; -1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;; -1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;; -1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;; -1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;; -1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;; -1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;; -1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;; -1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;; -1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;; -1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;; -1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;; -1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;; -1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;; -1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;; -1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;; -1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;; -1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;; -1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;; -1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;; -1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;; -1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;; -1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;; -1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;; -1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;; -1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;; -1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;; -1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;; -1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;; -1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;; -1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;; -1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;;;; -1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;;;; -1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;;;; -1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;;;; -1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;;;; -1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;; -1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;; -1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;; -1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;; -1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;; -1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;; -1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;; -1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;; -1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;; -1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;; -1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;; -1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;; -1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;; -1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;; -1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;; -1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;; -1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;; -1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;; -1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;; -1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;; -1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;; -1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;; -1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;; -1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;; -1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;; -1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;; -1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;; -1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;; -1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;; -1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;; -1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;; -1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;; -1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;; -1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;; -1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;; -1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;; -1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;; -1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;; -1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;; -1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;; -1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;; -1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;; -1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;; -1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;; -1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;; -1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;; -1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;; -1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;; -1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;; -1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;; -1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;; -1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;; -1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;; -1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;; -1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;; -1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;; -1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;; -1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;; -1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;; -1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;; -1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;; -1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;; -1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;; -1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;; -1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;; -1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;; -1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;; -1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;; -1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;; -1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;; -1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;; -1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;; -1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;; -1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;; -1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;; -1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;; -1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;; -1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;; -1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;; -1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;; -1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;; -1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;; -1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;; -1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;; -1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;; -1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;; -1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;; -1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;; -1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;; -1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;; -1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;; -1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;; -1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;; -1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;; -1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;; -1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;; -1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;; -1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;; -1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;; -1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L; 0041;;;;N;;;;; -1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L; 0042;;;;N;;;;; -1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L; 0043;;;;N;;;;; -1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L; 0044;;;;N;;;;; -1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L; 0045;;;;N;;;;; -1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L; 0046;;;;N;;;;; -1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L; 0047;;;;N;;;;; -1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L; 0048;;;;N;;;;; -1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L; 0049;;;;N;;;;; -1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L; 004A;;;;N;;;;; -1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L; 004B;;;;N;;;;; -1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L; 004C;;;;N;;;;; -1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L; 004D;;;;N;;;;; -1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L; 004E;;;;N;;;;; -1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L; 004F;;;;N;;;;; -1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L; 0050;;;;N;;;;; -1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L; 0051;;;;N;;;;; -1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L; 0052;;;;N;;;;; -1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L; 0053;;;;N;;;;; -1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L; 0054;;;;N;;;;; -1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L; 0055;;;;N;;;;; -1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L; 0056;;;;N;;;;; -1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L; 0057;;;;N;;;;; -1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L; 0058;;;;N;;;;; -1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L; 0059;;;;N;;;;; -1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L; 005A;;;;N;;;;; -1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L; 0061;;;;N;;;;; -1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L; 0062;;;;N;;;;; -1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L; 0063;;;;N;;;;; -1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L; 0064;;;;N;;;;; -1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L; 0065;;;;N;;;;; -1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L; 0066;;;;N;;;;; -1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L; 0067;;;;N;;;;; -1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L; 0068;;;;N;;;;; -1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L; 0069;;;;N;;;;; -1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L; 006A;;;;N;;;;; -1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L; 006B;;;;N;;;;; -1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L; 006C;;;;N;;;;; -1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L; 006D;;;;N;;;;; -1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L; 006E;;;;N;;;;; -1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L; 006F;;;;N;;;;; -1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L; 0070;;;;N;;;;; -1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L; 0071;;;;N;;;;; -1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L; 0072;;;;N;;;;; -1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L; 0073;;;;N;;;;; -1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L; 0074;;;;N;;;;; -1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L; 0075;;;;N;;;;; -1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L; 0076;;;;N;;;;; -1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L; 0077;;;;N;;;;; -1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L; 0078;;;;N;;;;; -1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L; 0079;;;;N;;;;; -1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L; 007A;;;;N;;;;; -1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L; 0131;;;;N;;;;; -1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L; 0237;;;;N;;;;; -1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; -1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L; 2207;;;;N;;;;; -1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L; 0391;;;;N;;;;; -1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L; 0392;;;;N;;;;; -1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L; 0393;;;;N;;;;; -1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L; 0394;;;;N;;;;; -1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L; 0395;;;;N;;;;; -1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L; 0396;;;;N;;;;; -1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L; 0397;;;;N;;;;; -1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L; 0398;;;;N;;;;; -1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L; 0399;;;;N;;;;; -1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L; 039A;;;;N;;;;; -1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L; 039B;;;;N;;;;; -1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L; 039C;;;;N;;;;; -1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L; 039D;;;;N;;;;; -1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L; 039E;;;;N;;;;; -1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L; 039F;;;;N;;;;; -1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L; 03A0;;;;N;;;;; -1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L; 03A1;;;;N;;;;; -1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L; 03F4;;;;N;;;;; -1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L; 03A3;;;;N;;;;; -1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L; 03A4;;;;N;;;;; -1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L; 03A5;;;;N;;;;; -1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L; 03A6;;;;N;;;;; -1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L; 03A7;;;;N;;;;; -1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L; 03A8;;;;N;;;;; -1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L; 03A9;;;;N;;;;; -1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L; 2207;;;;N;;;;; -1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L; 03B1;;;;N;;;;; -1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L; 03B2;;;;N;;;;; -1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L; 03B3;;;;N;;;;; -1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L; 03B4;;;;N;;;;; -1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L; 03B5;;;;N;;;;; -1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L; 03B6;;;;N;;;;; -1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L; 03B7;;;;N;;;;; -1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L; 03B8;;;;N;;;;; -1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L; 03B9;;;;N;;;;; -1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L; 03BA;;;;N;;;;; -1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L; 03BB;;;;N;;;;; -1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L; 03BC;;;;N;;;;; -1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L; 03BD;;;;N;;;;; -1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L; 03BE;;;;N;;;;; -1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L; 03BF;;;;N;;;;; -1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L; 03C0;;;;N;;;;; -1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L; 03C1;;;;N;;;;; -1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L; 03C2;;;;N;;;;; -1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L; 03C3;;;;N;;;;; -1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L; 03C4;;;;N;;;;; -1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L; 03C5;;;;N;;;;; -1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L; 03C6;;;;N;;;;; -1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L; 03C7;;;;N;;;;; -1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L; 03C8;;;;N;;;;; -1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L; 03C9;;;;N;;;;; -1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;ON; 2202;;;;Y;;;;; -1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L; 03F5;;;;N;;;;; -1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L; 03D1;;;;N;;;;; -1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L; 03F0;;;;N;;;;; -1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L; 03D5;;;;N;;;;; -1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L; 03F1;;;;N;;;;; -1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L; 03D6;;;;N;;;;; -1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L; 03DC;;;;N;;;;; -1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L; 03DD;;;;N;;;;; -1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN; 0030;0;0;0;N;;;;; -1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN; 0031;1;1;1;N;;;;; -1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN; 0032;2;2;2;N;;;;; -1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN; 0033;3;3;3;N;;;;; -1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN; 0034;4;4;4;N;;;;; -1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN; 0035;5;5;5;N;;;;; -1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN; 0036;6;6;6;N;;;;; -1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN; 0037;7;7;7;N;;;;; -1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN; 0038;8;8;8;N;;;;; -1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN; 0039;9;9;9;N;;;;; -1D800;SIGNWRITING HAND-FIST INDEX;So;0;L;;;;;N;;;;; -1D801;SIGNWRITING HAND-CIRCLE INDEX;So;0;L;;;;;N;;;;; -1D802;SIGNWRITING HAND-CUP INDEX;So;0;L;;;;;N;;;;; -1D803;SIGNWRITING HAND-OVAL INDEX;So;0;L;;;;;N;;;;; -1D804;SIGNWRITING HAND-HINGE INDEX;So;0;L;;;;;N;;;;; -1D805;SIGNWRITING HAND-ANGLE INDEX;So;0;L;;;;;N;;;;; -1D806;SIGNWRITING HAND-FIST INDEX BENT;So;0;L;;;;;N;;;;; -1D807;SIGNWRITING HAND-CIRCLE INDEX BENT;So;0;L;;;;;N;;;;; -1D808;SIGNWRITING HAND-FIST THUMB UNDER INDEX BENT;So;0;L;;;;;N;;;;; -1D809;SIGNWRITING HAND-FIST INDEX RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D80A;SIGNWRITING HAND-FIST INDEX CUPPED;So;0;L;;;;;N;;;;; -1D80B;SIGNWRITING HAND-FIST INDEX HINGED;So;0;L;;;;;N;;;;; -1D80C;SIGNWRITING HAND-FIST INDEX HINGED LOW;So;0;L;;;;;N;;;;; -1D80D;SIGNWRITING HAND-CIRCLE INDEX HINGE;So;0;L;;;;;N;;;;; -1D80E;SIGNWRITING HAND-FIST INDEX MIDDLE;So;0;L;;;;;N;;;;; -1D80F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE;So;0;L;;;;;N;;;;; -1D810;SIGNWRITING HAND-FIST INDEX MIDDLE BENT;So;0;L;;;;;N;;;;; -1D811;SIGNWRITING HAND-FIST INDEX MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; -1D812;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED;So;0;L;;;;;N;;;;; -1D813;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED;So;0;L;;;;;N;;;;; -1D814;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP;So;0;L;;;;;N;;;;; -1D815;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED;So;0;L;;;;;N;;;;; -1D816;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED INDEX BENT;So;0;L;;;;;N;;;;; -1D817;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED MIDDLE BENT;So;0;L;;;;;N;;;;; -1D818;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED;So;0;L;;;;;N;;;;; -1D819;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED;So;0;L;;;;;N;;;;; -1D81A;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; -1D81B;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSSED;So;0;L;;;;;N;;;;; -1D81C;SIGNWRITING HAND-FIST MIDDLE BENT OVER INDEX;So;0;L;;;;;N;;;;; -1D81D;SIGNWRITING HAND-FIST INDEX BENT OVER MIDDLE;So;0;L;;;;;N;;;;; -1D81E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; -1D81F;SIGNWRITING HAND-CIRCLE INDEX MIDDLE THUMB;So;0;L;;;;;N;;;;; -1D820;SIGNWRITING HAND-FIST INDEX MIDDLE STRAIGHT THUMB BENT;So;0;L;;;;;N;;;;; -1D821;SIGNWRITING HAND-FIST INDEX MIDDLE BENT THUMB STRAIGHT;So;0;L;;;;;N;;;;; -1D822;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB BENT;So;0;L;;;;;N;;;;; -1D823;SIGNWRITING HAND-FIST INDEX MIDDLE HINGED SPREAD THUMB SIDE;So;0;L;;;;;N;;;;; -1D824;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB SIDE;So;0;L;;;;;N;;;;; -1D825;SIGNWRITING HAND-FIST INDEX UP MIDDLE HINGED THUMB CONJOINED;So;0;L;;;;;N;;;;; -1D826;SIGNWRITING HAND-FIST INDEX HINGED MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; -1D827;SIGNWRITING HAND-FIST INDEX MIDDLE UP SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; -1D828;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CUPPED;So;0;L;;;;;N;;;;; -1D829;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CIRCLED;So;0;L;;;;;N;;;;; -1D82A;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HOOKED;So;0;L;;;;;N;;;;; -1D82B;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB HINGED;So;0;L;;;;;N;;;;; -1D82C;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE STRAIGHT;So;0;L;;;;;N;;;;; -1D82D;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE;So;0;L;;;;;N;;;;; -1D82E;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; -1D82F;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB SIDE BENT;So;0;L;;;;;N;;;;; -1D830;SIGNWRITING HAND-FIST MIDDLE THUMB HOOKED INDEX UP;So;0;L;;;;;N;;;;; -1D831;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE UP;So;0;L;;;;;N;;;;; -1D832;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED HINGED THUMB SIDE;So;0;L;;;;;N;;;;; -1D833;SIGNWRITING HAND-FIST INDEX MIDDLE CROSSED THUMB SIDE;So;0;L;;;;;N;;;;; -1D834;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED THUMB FORWARD;So;0;L;;;;;N;;;;; -1D835;SIGNWRITING HAND-FIST INDEX MIDDLE CONJOINED CUPPED THUMB FORWARD;So;0;L;;;;;N;;;;; -1D836;SIGNWRITING HAND-FIST MIDDLE THUMB CUPPED INDEX UP;So;0;L;;;;;N;;;;; -1D837;SIGNWRITING HAND-FIST INDEX THUMB CUPPED MIDDLE UP;So;0;L;;;;;N;;;;; -1D838;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX UP;So;0;L;;;;;N;;;;; -1D839;SIGNWRITING HAND-FIST MIDDLE THUMB CIRCLED INDEX HINGED;So;0;L;;;;;N;;;;; -1D83A;SIGNWRITING HAND-FIST INDEX THUMB ANGLED OUT MIDDLE UP;So;0;L;;;;;N;;;;; -1D83B;SIGNWRITING HAND-FIST INDEX THUMB ANGLED IN MIDDLE UP;So;0;L;;;;;N;;;;; -1D83C;SIGNWRITING HAND-FIST INDEX THUMB CIRCLED MIDDLE UP;So;0;L;;;;;N;;;;; -1D83D;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB CONJOINED HINGED;So;0;L;;;;;N;;;;; -1D83E;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED OUT;So;0;L;;;;;N;;;;; -1D83F;SIGNWRITING HAND-FIST INDEX MIDDLE THUMB ANGLED;So;0;L;;;;;N;;;;; -1D840;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX UP;So;0;L;;;;;N;;;;; -1D841;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED OUT INDEX CROSSED;So;0;L;;;;;N;;;;; -1D842;SIGNWRITING HAND-FIST MIDDLE THUMB ANGLED INDEX UP;So;0;L;;;;;N;;;;; -1D843;SIGNWRITING HAND-FIST INDEX THUMB HOOKED MIDDLE HINGED;So;0;L;;;;;N;;;;; -1D844;SIGNWRITING HAND-FLAT FOUR FINGERS;So;0;L;;;;;N;;;;; -1D845;SIGNWRITING HAND-FLAT FOUR FINGERS BENT;So;0;L;;;;;N;;;;; -1D846;SIGNWRITING HAND-FLAT FOUR FINGERS HINGED;So;0;L;;;;;N;;;;; -1D847;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; -1D848;SIGNWRITING HAND-FLAT FOUR FINGERS CONJOINED SPLIT;So;0;L;;;;;N;;;;; -1D849;SIGNWRITING HAND-CLAW FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; -1D84A;SIGNWRITING HAND-FIST FOUR FINGERS CONJOINED BENT;So;0;L;;;;;N;;;;; -1D84B;SIGNWRITING HAND-HINGE FOUR FINGERS CONJOINED;So;0;L;;;;;N;;;;; -1D84C;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D84D;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D84E;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; -1D84F;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD FOUR BENT;So;0;L;;;;;N;;;;; -1D850;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; -1D851;SIGNWRITING HAND-FLAT HEEL FIVE FINGERS SPREAD BENT;So;0;L;;;;;N;;;;; -1D852;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD THUMB FORWARD;So;0;L;;;;;N;;;;; -1D853;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D854;SIGNWRITING HAND-CUP FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; -1D855;SIGNWRITING HAND-HINGE FIVE FINGERS SPREAD OPEN;So;0;L;;;;;N;;;;; -1D856;SIGNWRITING HAND-OVAL FIVE FINGERS SPREAD;So;0;L;;;;;N;;;;; -1D857;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED;So;0;L;;;;;N;;;;; -1D858;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED THUMB SIDE;So;0;L;;;;;N;;;;; -1D859;SIGNWRITING HAND-FLAT FIVE FINGERS SPREAD HINGED NO THUMB;So;0;L;;;;;N;;;;; -1D85A;SIGNWRITING HAND-FLAT;So;0;L;;;;;N;;;;; -1D85B;SIGNWRITING HAND-FLAT BETWEEN PALM FACINGS;So;0;L;;;;;N;;;;; -1D85C;SIGNWRITING HAND-FLAT HEEL;So;0;L;;;;;N;;;;; -1D85D;SIGNWRITING HAND-FLAT THUMB SIDE;So;0;L;;;;;N;;;;; -1D85E;SIGNWRITING HAND-FLAT HEEL THUMB SIDE;So;0;L;;;;;N;;;;; -1D85F;SIGNWRITING HAND-FLAT THUMB BENT;So;0;L;;;;;N;;;;; -1D860;SIGNWRITING HAND-FLAT THUMB FORWARD;So;0;L;;;;;N;;;;; -1D861;SIGNWRITING HAND-FLAT SPLIT INDEX THUMB SIDE;So;0;L;;;;;N;;;;; -1D862;SIGNWRITING HAND-FLAT SPLIT CENTRE;So;0;L;;;;;N;;;;; -1D863;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE;So;0;L;;;;;N;;;;; -1D864;SIGNWRITING HAND-FLAT SPLIT CENTRE THUMB SIDE BENT;So;0;L;;;;;N;;;;; -1D865;SIGNWRITING HAND-FLAT SPLIT LITTLE;So;0;L;;;;;N;;;;; -1D866;SIGNWRITING HAND-CLAW;So;0;L;;;;;N;;;;; -1D867;SIGNWRITING HAND-CLAW THUMB SIDE;So;0;L;;;;;N;;;;; -1D868;SIGNWRITING HAND-CLAW NO THUMB;So;0;L;;;;;N;;;;; -1D869;SIGNWRITING HAND-CLAW THUMB FORWARD;So;0;L;;;;;N;;;;; -1D86A;SIGNWRITING HAND-HOOK CURLICUE;So;0;L;;;;;N;;;;; -1D86B;SIGNWRITING HAND-HOOK;So;0;L;;;;;N;;;;; -1D86C;SIGNWRITING HAND-CUP OPEN;So;0;L;;;;;N;;;;; -1D86D;SIGNWRITING HAND-CUP;So;0;L;;;;;N;;;;; -1D86E;SIGNWRITING HAND-CUP OPEN THUMB SIDE;So;0;L;;;;;N;;;;; -1D86F;SIGNWRITING HAND-CUP THUMB SIDE;So;0;L;;;;;N;;;;; -1D870;SIGNWRITING HAND-CUP OPEN NO THUMB;So;0;L;;;;;N;;;;; -1D871;SIGNWRITING HAND-CUP NO THUMB;So;0;L;;;;;N;;;;; -1D872;SIGNWRITING HAND-CUP OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; -1D873;SIGNWRITING HAND-CUP THUMB FORWARD;So;0;L;;;;;N;;;;; -1D874;SIGNWRITING HAND-CURLICUE OPEN;So;0;L;;;;;N;;;;; -1D875;SIGNWRITING HAND-CURLICUE;So;0;L;;;;;N;;;;; -1D876;SIGNWRITING HAND-CIRCLE;So;0;L;;;;;N;;;;; -1D877;SIGNWRITING HAND-OVAL;So;0;L;;;;;N;;;;; -1D878;SIGNWRITING HAND-OVAL THUMB SIDE;So;0;L;;;;;N;;;;; -1D879;SIGNWRITING HAND-OVAL NO THUMB;So;0;L;;;;;N;;;;; -1D87A;SIGNWRITING HAND-OVAL THUMB FORWARD;So;0;L;;;;;N;;;;; -1D87B;SIGNWRITING HAND-HINGE OPEN;So;0;L;;;;;N;;;;; -1D87C;SIGNWRITING HAND-HINGE OPEN THUMB FORWARD;So;0;L;;;;;N;;;;; -1D87D;SIGNWRITING HAND-HINGE;So;0;L;;;;;N;;;;; -1D87E;SIGNWRITING HAND-HINGE SMALL;So;0;L;;;;;N;;;;; -1D87F;SIGNWRITING HAND-HINGE OPEN THUMB SIDE;So;0;L;;;;;N;;;;; -1D880;SIGNWRITING HAND-HINGE THUMB SIDE;So;0;L;;;;;N;;;;; -1D881;SIGNWRITING HAND-HINGE OPEN NO THUMB;So;0;L;;;;;N;;;;; -1D882;SIGNWRITING HAND-HINGE NO THUMB;So;0;L;;;;;N;;;;; -1D883;SIGNWRITING HAND-HINGE THUMB SIDE TOUCHING INDEX;So;0;L;;;;;N;;;;; -1D884;SIGNWRITING HAND-HINGE THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; -1D885;SIGNWRITING HAND-ANGLE;So;0;L;;;;;N;;;;; -1D886;SIGNWRITING HAND-FIST INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D887;SIGNWRITING HAND-CIRCLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D888;SIGNWRITING HAND-HINGE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D889;SIGNWRITING HAND-ANGLE INDEX MIDDLE RING;So;0;L;;;;;N;;;;; -1D88A;SIGNWRITING HAND-HINGE LITTLE;So;0;L;;;;;N;;;;; -1D88B;SIGNWRITING HAND-FIST INDEX MIDDLE RING BENT;So;0;L;;;;;N;;;;; -1D88C;SIGNWRITING HAND-FIST INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; -1D88D;SIGNWRITING HAND-HINGE INDEX MIDDLE RING CONJOINED;So;0;L;;;;;N;;;;; -1D88E;SIGNWRITING HAND-FIST LITTLE DOWN;So;0;L;;;;;N;;;;; -1D88F;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE STRAIGHT;So;0;L;;;;;N;;;;; -1D890;SIGNWRITING HAND-FIST LITTLE DOWN RIPPLE CURVED;So;0;L;;;;;N;;;;; -1D891;SIGNWRITING HAND-FIST LITTLE DOWN OTHERS CIRCLED;So;0;L;;;;;N;;;;; -1D892;SIGNWRITING HAND-FIST LITTLE UP;So;0;L;;;;;N;;;;; -1D893;SIGNWRITING HAND-FIST THUMB UNDER LITTLE UP;So;0;L;;;;;N;;;;; -1D894;SIGNWRITING HAND-CIRCLE LITTLE UP;So;0;L;;;;;N;;;;; -1D895;SIGNWRITING HAND-OVAL LITTLE UP;So;0;L;;;;;N;;;;; -1D896;SIGNWRITING HAND-ANGLE LITTLE UP;So;0;L;;;;;N;;;;; -1D897;SIGNWRITING HAND-FIST LITTLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D898;SIGNWRITING HAND-FIST LITTLE BENT;So;0;L;;;;;N;;;;; -1D899;SIGNWRITING HAND-FIST LITTLE TOUCHES THUMB;So;0;L;;;;;N;;;;; -1D89A;SIGNWRITING HAND-FIST LITTLE THUMB;So;0;L;;;;;N;;;;; -1D89B;SIGNWRITING HAND-HINGE LITTLE THUMB;So;0;L;;;;;N;;;;; -1D89C;SIGNWRITING HAND-FIST LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; -1D89D;SIGNWRITING HAND-HINGE LITTLE INDEX THUMB;So;0;L;;;;;N;;;;; -1D89E;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB OUT;So;0;L;;;;;N;;;;; -1D89F;SIGNWRITING HAND-ANGLE LITTLE INDEX THUMB INDEX THUMB;So;0;L;;;;;N;;;;; -1D8A0;SIGNWRITING HAND-FIST LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A1;SIGNWRITING HAND-CIRCLE LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A2;SIGNWRITING HAND-HINGE LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A3;SIGNWRITING HAND-ANGLE LITTLE INDEX;So;0;L;;;;;N;;;;; -1D8A4;SIGNWRITING HAND-FIST INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A5;SIGNWRITING HAND-CIRCLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A6;SIGNWRITING HAND-HINGE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A7;SIGNWRITING HAND-HINGE RING;So;0;L;;;;;N;;;;; -1D8A8;SIGNWRITING HAND-ANGLE INDEX MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8A9;SIGNWRITING HAND-FIST INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; -1D8AA;SIGNWRITING HAND-CIRCLE INDEX MIDDLE CROSS LITTLE;So;0;L;;;;;N;;;;; -1D8AB;SIGNWRITING HAND-FIST RING DOWN;So;0;L;;;;;N;;;;; -1D8AC;SIGNWRITING HAND-HINGE RING DOWN INDEX THUMB HOOK MIDDLE;So;0;L;;;;;N;;;;; -1D8AD;SIGNWRITING HAND-ANGLE RING DOWN MIDDLE THUMB INDEX CROSS;So;0;L;;;;;N;;;;; -1D8AE;SIGNWRITING HAND-FIST RING UP;So;0;L;;;;;N;;;;; -1D8AF;SIGNWRITING HAND-FIST RING RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D8B0;SIGNWRITING HAND-FIST RING LITTLE;So;0;L;;;;;N;;;;; -1D8B1;SIGNWRITING HAND-CIRCLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8B2;SIGNWRITING HAND-OVAL RING LITTLE;So;0;L;;;;;N;;;;; -1D8B3;SIGNWRITING HAND-ANGLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8B4;SIGNWRITING HAND-FIST RING MIDDLE;So;0;L;;;;;N;;;;; -1D8B5;SIGNWRITING HAND-FIST RING MIDDLE CONJOINED;So;0;L;;;;;N;;;;; -1D8B6;SIGNWRITING HAND-FIST RING MIDDLE RAISED KNUCKLES;So;0;L;;;;;N;;;;; -1D8B7;SIGNWRITING HAND-FIST RING INDEX;So;0;L;;;;;N;;;;; -1D8B8;SIGNWRITING HAND-FIST RING THUMB;So;0;L;;;;;N;;;;; -1D8B9;SIGNWRITING HAND-HOOK RING THUMB;So;0;L;;;;;N;;;;; -1D8BA;SIGNWRITING HAND-FIST INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8BB;SIGNWRITING HAND-CIRCLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8BC;SIGNWRITING HAND-CURLICUE INDEX RING LITTLE ON;So;0;L;;;;;N;;;;; -1D8BD;SIGNWRITING HAND-HOOK INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; -1D8BE;SIGNWRITING HAND-HOOK INDEX RING LITTLE IN;So;0;L;;;;;N;;;;; -1D8BF;SIGNWRITING HAND-HOOK INDEX RING LITTLE UNDER;So;0;L;;;;;N;;;;; -1D8C0;SIGNWRITING HAND-CUP INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8C1;SIGNWRITING HAND-HINGE INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8C2;SIGNWRITING HAND-ANGLE INDEX RING LITTLE OUT;So;0;L;;;;;N;;;;; -1D8C3;SIGNWRITING HAND-ANGLE INDEX RING LITTLE;So;0;L;;;;;N;;;;; -1D8C4;SIGNWRITING HAND-FIST MIDDLE DOWN;So;0;L;;;;;N;;;;; -1D8C5;SIGNWRITING HAND-HINGE MIDDLE;So;0;L;;;;;N;;;;; -1D8C6;SIGNWRITING HAND-FIST MIDDLE UP;So;0;L;;;;;N;;;;; -1D8C7;SIGNWRITING HAND-CIRCLE MIDDLE UP;So;0;L;;;;;N;;;;; -1D8C8;SIGNWRITING HAND-FIST MIDDLE RAISED KNUCKLE;So;0;L;;;;;N;;;;; -1D8C9;SIGNWRITING HAND-FIST MIDDLE UP THUMB SIDE;So;0;L;;;;;N;;;;; -1D8CA;SIGNWRITING HAND-HOOK MIDDLE THUMB;So;0;L;;;;;N;;;;; -1D8CB;SIGNWRITING HAND-FIST MIDDLE THUMB LITTLE;So;0;L;;;;;N;;;;; -1D8CC;SIGNWRITING HAND-FIST MIDDLE LITTLE;So;0;L;;;;;N;;;;; -1D8CD;SIGNWRITING HAND-FIST MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8CE;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8CF;SIGNWRITING HAND-CURLICUE MIDDLE RING LITTLE ON;So;0;L;;;;;N;;;;; -1D8D0;SIGNWRITING HAND-CUP MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8D1;SIGNWRITING HAND-HINGE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8D2;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE OUT;So;0;L;;;;;N;;;;; -1D8D3;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE IN;So;0;L;;;;;N;;;;; -1D8D4;SIGNWRITING HAND-ANGLE MIDDLE RING LITTLE;So;0;L;;;;;N;;;;; -1D8D5;SIGNWRITING HAND-CIRCLE MIDDLE RING LITTLE BENT;So;0;L;;;;;N;;;;; -1D8D6;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; -1D8D7;SIGNWRITING HAND-CLAW MIDDLE RING LITTLE CONJOINED SIDE;So;0;L;;;;;N;;;;; -1D8D8;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED OUT;So;0;L;;;;;N;;;;; -1D8D9;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED IN;So;0;L;;;;;N;;;;; -1D8DA;SIGNWRITING HAND-HOOK MIDDLE RING LITTLE CONJOINED;So;0;L;;;;;N;;;;; -1D8DB;SIGNWRITING HAND-HINGE INDEX HINGED;So;0;L;;;;;N;;;;; -1D8DC;SIGNWRITING HAND-FIST INDEX THUMB SIDE;So;0;L;;;;;N;;;;; -1D8DD;SIGNWRITING HAND-HINGE INDEX THUMB SIDE;So;0;L;;;;;N;;;;; -1D8DE;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB DIAGONAL;So;0;L;;;;;N;;;;; -1D8DF;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB CONJOINED;So;0;L;;;;;N;;;;; -1D8E0;SIGNWRITING HAND-FIST INDEX THUMB SIDE THUMB BENT;So;0;L;;;;;N;;;;; -1D8E1;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX BENT;So;0;L;;;;;N;;;;; -1D8E2;SIGNWRITING HAND-FIST INDEX THUMB SIDE BOTH BENT;So;0;L;;;;;N;;;;; -1D8E3;SIGNWRITING HAND-FIST INDEX THUMB SIDE INDEX HINGE;So;0;L;;;;;N;;;;; -1D8E4;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX STRAIGHT;So;0;L;;;;;N;;;;; -1D8E5;SIGNWRITING HAND-FIST INDEX THUMB FORWARD INDEX BENT;So;0;L;;;;;N;;;;; -1D8E6;SIGNWRITING HAND-FIST INDEX THUMB HOOK;So;0;L;;;;;N;;;;; -1D8E7;SIGNWRITING HAND-FIST INDEX THUMB CURLICUE;So;0;L;;;;;N;;;;; -1D8E8;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; -1D8E9;SIGNWRITING HAND-CLAW INDEX THUMB CURVE THUMB INSIDE;So;0;L;;;;;N;;;;; -1D8EA;SIGNWRITING HAND-FIST INDEX THUMB CURVE THUMB UNDER;So;0;L;;;;;N;;;;; -1D8EB;SIGNWRITING HAND-FIST INDEX THUMB CIRCLE;So;0;L;;;;;N;;;;; -1D8EC;SIGNWRITING HAND-CUP INDEX THUMB;So;0;L;;;;;N;;;;; -1D8ED;SIGNWRITING HAND-CUP INDEX THUMB OPEN;So;0;L;;;;;N;;;;; -1D8EE;SIGNWRITING HAND-HINGE INDEX THUMB OPEN;So;0;L;;;;;N;;;;; -1D8EF;SIGNWRITING HAND-HINGE INDEX THUMB LARGE;So;0;L;;;;;N;;;;; -1D8F0;SIGNWRITING HAND-HINGE INDEX THUMB;So;0;L;;;;;N;;;;; -1D8F1;SIGNWRITING HAND-HINGE INDEX THUMB SMALL;So;0;L;;;;;N;;;;; -1D8F2;SIGNWRITING HAND-ANGLE INDEX THUMB OUT;So;0;L;;;;;N;;;;; -1D8F3;SIGNWRITING HAND-ANGLE INDEX THUMB IN;So;0;L;;;;;N;;;;; -1D8F4;SIGNWRITING HAND-ANGLE INDEX THUMB;So;0;L;;;;;N;;;;; -1D8F5;SIGNWRITING HAND-FIST THUMB;So;0;L;;;;;N;;;;; -1D8F6;SIGNWRITING HAND-FIST THUMB HEEL;So;0;L;;;;;N;;;;; -1D8F7;SIGNWRITING HAND-FIST THUMB SIDE DIAGONAL;So;0;L;;;;;N;;;;; -1D8F8;SIGNWRITING HAND-FIST THUMB SIDE CONJOINED;So;0;L;;;;;N;;;;; -1D8F9;SIGNWRITING HAND-FIST THUMB SIDE BENT;So;0;L;;;;;N;;;;; -1D8FA;SIGNWRITING HAND-FIST THUMB FORWARD;So;0;L;;;;;N;;;;; -1D8FB;SIGNWRITING HAND-FIST THUMB BETWEEN INDEX MIDDLE;So;0;L;;;;;N;;;;; -1D8FC;SIGNWRITING HAND-FIST THUMB BETWEEN MIDDLE RING;So;0;L;;;;;N;;;;; -1D8FD;SIGNWRITING HAND-FIST THUMB BETWEEN RING LITTLE;So;0;L;;;;;N;;;;; -1D8FE;SIGNWRITING HAND-FIST THUMB UNDER TWO FINGERS;So;0;L;;;;;N;;;;; -1D8FF;SIGNWRITING HAND-FIST THUMB OVER TWO FINGERS;So;0;L;;;;;N;;;;; -1D900;SIGNWRITING HAND-FIST THUMB UNDER THREE FINGERS;So;0;L;;;;;N;;;;; -1D901;SIGNWRITING HAND-FIST THUMB UNDER FOUR FINGERS;So;0;L;;;;;N;;;;; -1D902;SIGNWRITING HAND-FIST THUMB OVER FOUR RAISED KNUCKLES;So;0;L;;;;;N;;;;; -1D903;SIGNWRITING HAND-FIST;So;0;L;;;;;N;;;;; -1D904;SIGNWRITING HAND-FIST HEEL;So;0;L;;;;;N;;;;; -1D905;SIGNWRITING TOUCH SINGLE;So;0;L;;;;;N;;;;; -1D906;SIGNWRITING TOUCH MULTIPLE;So;0;L;;;;;N;;;;; -1D907;SIGNWRITING TOUCH BETWEEN;So;0;L;;;;;N;;;;; -1D908;SIGNWRITING GRASP SINGLE;So;0;L;;;;;N;;;;; -1D909;SIGNWRITING GRASP MULTIPLE;So;0;L;;;;;N;;;;; -1D90A;SIGNWRITING GRASP BETWEEN;So;0;L;;;;;N;;;;; -1D90B;SIGNWRITING STRIKE SINGLE;So;0;L;;;;;N;;;;; -1D90C;SIGNWRITING STRIKE MULTIPLE;So;0;L;;;;;N;;;;; -1D90D;SIGNWRITING STRIKE BETWEEN;So;0;L;;;;;N;;;;; -1D90E;SIGNWRITING BRUSH SINGLE;So;0;L;;;;;N;;;;; -1D90F;SIGNWRITING BRUSH MULTIPLE;So;0;L;;;;;N;;;;; -1D910;SIGNWRITING BRUSH BETWEEN;So;0;L;;;;;N;;;;; -1D911;SIGNWRITING RUB SINGLE;So;0;L;;;;;N;;;;; -1D912;SIGNWRITING RUB MULTIPLE;So;0;L;;;;;N;;;;; -1D913;SIGNWRITING RUB BETWEEN;So;0;L;;;;;N;;;;; -1D914;SIGNWRITING SURFACE SYMBOLS;So;0;L;;;;;N;;;;; -1D915;SIGNWRITING SURFACE BETWEEN;So;0;L;;;;;N;;;;; -1D916;SIGNWRITING SQUEEZE LARGE SINGLE;So;0;L;;;;;N;;;;; -1D917;SIGNWRITING SQUEEZE SMALL SINGLE;So;0;L;;;;;N;;;;; -1D918;SIGNWRITING SQUEEZE LARGE MULTIPLE;So;0;L;;;;;N;;;;; -1D919;SIGNWRITING SQUEEZE SMALL MULTIPLE;So;0;L;;;;;N;;;;; -1D91A;SIGNWRITING SQUEEZE SEQUENTIAL;So;0;L;;;;;N;;;;; -1D91B;SIGNWRITING FLICK LARGE SINGLE;So;0;L;;;;;N;;;;; -1D91C;SIGNWRITING FLICK SMALL SINGLE;So;0;L;;;;;N;;;;; -1D91D;SIGNWRITING FLICK LARGE MULTIPLE;So;0;L;;;;;N;;;;; -1D91E;SIGNWRITING FLICK SMALL MULTIPLE;So;0;L;;;;;N;;;;; -1D91F;SIGNWRITING FLICK SEQUENTIAL;So;0;L;;;;;N;;;;; -1D920;SIGNWRITING SQUEEZE FLICK ALTERNATING;So;0;L;;;;;N;;;;; -1D921;SIGNWRITING MOVEMENT-HINGE UP DOWN LARGE;So;0;L;;;;;N;;;;; -1D922;SIGNWRITING MOVEMENT-HINGE UP DOWN SMALL;So;0;L;;;;;N;;;;; -1D923;SIGNWRITING MOVEMENT-HINGE UP SEQUENTIAL;So;0;L;;;;;N;;;;; -1D924;SIGNWRITING MOVEMENT-HINGE DOWN SEQUENTIAL;So;0;L;;;;;N;;;;; -1D925;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING LARGE;So;0;L;;;;;N;;;;; -1D926;SIGNWRITING MOVEMENT-HINGE UP DOWN ALTERNATING SMALL;So;0;L;;;;;N;;;;; -1D927;SIGNWRITING MOVEMENT-HINGE SIDE TO SIDE SCISSORS;So;0;L;;;;;N;;;;; -1D928;SIGNWRITING MOVEMENT-WALLPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; -1D929;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CONTACT;So;0;L;;;;;N;;;;; -1D92A;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; -1D92B;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; -1D92C;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; -1D92D;SIGNWRITING MOVEMENT-WALLPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; -1D92E;SIGNWRITING MOVEMENT-WALLPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D92F;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; -1D930;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D931;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; -1D932;SIGNWRITING MOVEMENT-WALLPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D933;SIGNWRITING MOVEMENT-WALLPLANE CROSS;So;0;L;;;;;N;;;;; -1D934;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; -1D935;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D936;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING;So;0;L;;;;;N;;;;; -1D937;SIGNWRITING MOVEMENT-WALLPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D938;SIGNWRITING MOVEMENT-WALLPLANE BEND SMALL;So;0;L;;;;;N;;;;; -1D939;SIGNWRITING MOVEMENT-WALLPLANE BEND MEDIUM;So;0;L;;;;;N;;;;; -1D93A;SIGNWRITING MOVEMENT-WALLPLANE BEND LARGE;So;0;L;;;;;N;;;;; -1D93B;SIGNWRITING MOVEMENT-WALLPLANE CORNER SMALL;So;0;L;;;;;N;;;;; -1D93C;SIGNWRITING MOVEMENT-WALLPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; -1D93D;SIGNWRITING MOVEMENT-WALLPLANE CORNER LARGE;So;0;L;;;;;N;;;;; -1D93E;SIGNWRITING MOVEMENT-WALLPLANE CORNER ROTATION;So;0;L;;;;;N;;;;; -1D93F;SIGNWRITING MOVEMENT-WALLPLANE CHECK SMALL;So;0;L;;;;;N;;;;; -1D940;SIGNWRITING MOVEMENT-WALLPLANE CHECK MEDIUM;So;0;L;;;;;N;;;;; -1D941;SIGNWRITING MOVEMENT-WALLPLANE CHECK LARGE;So;0;L;;;;;N;;;;; -1D942;SIGNWRITING MOVEMENT-WALLPLANE BOX SMALL;So;0;L;;;;;N;;;;; -1D943;SIGNWRITING MOVEMENT-WALLPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; -1D944;SIGNWRITING MOVEMENT-WALLPLANE BOX LARGE;So;0;L;;;;;N;;;;; -1D945;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; -1D946;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; -1D947;SIGNWRITING MOVEMENT-WALLPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; -1D948;SIGNWRITING MOVEMENT-WALLPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; -1D949;SIGNWRITING MOVEMENT-WALLPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; -1D94A;SIGNWRITING MOVEMENT-WALLPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; -1D94B;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; -1D94C;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D94D;SIGNWRITING TRAVEL-WALLPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D94E;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; -1D94F;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D950;SIGNWRITING TRAVEL-WALLPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D951;SIGNWRITING TRAVEL-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; -1D952;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL SINGLE;So;0;L;;;;;N;;;;; -1D953;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL DOUBLE;So;0;L;;;;;N;;;;; -1D954;SIGNWRITING TRAVEL-WALLPLANE ARM SPIRAL TRIPLE;So;0;L;;;;;N;;;;; -1D955;SIGNWRITING MOVEMENT-DIAGONAL AWAY SMALL;So;0;L;;;;;N;;;;; -1D956;SIGNWRITING MOVEMENT-DIAGONAL AWAY MEDIUM;So;0;L;;;;;N;;;;; -1D957;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGE;So;0;L;;;;;N;;;;; -1D958;SIGNWRITING MOVEMENT-DIAGONAL AWAY LARGEST;So;0;L;;;;;N;;;;; -1D959;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS SMALL;So;0;L;;;;;N;;;;; -1D95A;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS MEDIUM;So;0;L;;;;;N;;;;; -1D95B;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGE;So;0;L;;;;;N;;;;; -1D95C;SIGNWRITING MOVEMENT-DIAGONAL TOWARDS LARGEST;So;0;L;;;;;N;;;;; -1D95D;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY SMALL;So;0;L;;;;;N;;;;; -1D95E;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY MEDIUM;So;0;L;;;;;N;;;;; -1D95F;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGE;So;0;L;;;;;N;;;;; -1D960;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN AWAY LARGEST;So;0;L;;;;;N;;;;; -1D961;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS SMALL;So;0;L;;;;;N;;;;; -1D962;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS MEDIUM;So;0;L;;;;;N;;;;; -1D963;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGE;So;0;L;;;;;N;;;;; -1D964;SIGNWRITING MOVEMENT-DIAGONAL BETWEEN TOWARDS LARGEST;So;0;L;;;;;N;;;;; -1D965;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT SMALL;So;0;L;;;;;N;;;;; -1D966;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT MEDIUM;So;0;L;;;;;N;;;;; -1D967;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGE;So;0;L;;;;;N;;;;; -1D968;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE STRAIGHT LARGEST;So;0;L;;;;;N;;;;; -1D969;SIGNWRITING MOVEMENT-FLOORPLANE SINGLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D96A;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE STRAIGHT;So;0;L;;;;;N;;;;; -1D96B;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D96C;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING;So;0;L;;;;;N;;;;; -1D96D;SIGNWRITING MOVEMENT-FLOORPLANE DOUBLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D96E;SIGNWRITING MOVEMENT-FLOORPLANE CROSS;So;0;L;;;;;N;;;;; -1D96F;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE STRAIGHT MOVEMENT;So;0;L;;;;;N;;;;; -1D970;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE WRIST FLEX;So;0;L;;;;;N;;;;; -1D971;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING MOVEMENT;So;0;L;;;;;N;;;;; -1D972;SIGNWRITING MOVEMENT-FLOORPLANE TRIPLE ALTERNATING WRIST FLEX;So;0;L;;;;;N;;;;; -1D973;SIGNWRITING MOVEMENT-FLOORPLANE BEND;So;0;L;;;;;N;;;;; -1D974;SIGNWRITING MOVEMENT-FLOORPLANE CORNER SMALL;So;0;L;;;;;N;;;;; -1D975;SIGNWRITING MOVEMENT-FLOORPLANE CORNER MEDIUM;So;0;L;;;;;N;;;;; -1D976;SIGNWRITING MOVEMENT-FLOORPLANE CORNER LARGE;So;0;L;;;;;N;;;;; -1D977;SIGNWRITING MOVEMENT-FLOORPLANE CHECK;So;0;L;;;;;N;;;;; -1D978;SIGNWRITING MOVEMENT-FLOORPLANE BOX SMALL;So;0;L;;;;;N;;;;; -1D979;SIGNWRITING MOVEMENT-FLOORPLANE BOX MEDIUM;So;0;L;;;;;N;;;;; -1D97A;SIGNWRITING MOVEMENT-FLOORPLANE BOX LARGE;So;0;L;;;;;N;;;;; -1D97B;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG SMALL;So;0;L;;;;;N;;;;; -1D97C;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG MEDIUM;So;0;L;;;;;N;;;;; -1D97D;SIGNWRITING MOVEMENT-FLOORPLANE ZIGZAG LARGE;So;0;L;;;;;N;;;;; -1D97E;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS SMALL;So;0;L;;;;;N;;;;; -1D97F;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS MEDIUM;So;0;L;;;;;N;;;;; -1D980;SIGNWRITING MOVEMENT-FLOORPLANE PEAKS LARGE;So;0;L;;;;;N;;;;; -1D981;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; -1D982;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D983;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D984;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; -1D985;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D986;SIGNWRITING TRAVEL-FLOORPLANE ROTATION-WALLPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D987;SIGNWRITING TRAVEL-FLOORPLANE SHAKING;So;0;L;;;;;N;;;;; -1D988;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER SMALL;So;0;L;;;;;N;;;;; -1D989;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER MEDIUM;So;0;L;;;;;N;;;;; -1D98A;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGE;So;0;L;;;;;N;;;;; -1D98B;SIGNWRITING MOVEMENT-WALLPLANE CURVE QUARTER LARGEST;So;0;L;;;;;N;;;;; -1D98C;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE SMALL;So;0;L;;;;;N;;;;; -1D98D;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE MEDIUM;So;0;L;;;;;N;;;;; -1D98E;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGE;So;0;L;;;;;N;;;;; -1D98F;SIGNWRITING MOVEMENT-WALLPLANE CURVE HALF-CIRCLE LARGEST;So;0;L;;;;;N;;;;; -1D990;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE SMALL;So;0;L;;;;;N;;;;; -1D991;SIGNWRITING MOVEMENT-WALLPLANE CURVE THREE-QUARTER CIRCLE MEDIUM;So;0;L;;;;;N;;;;; -1D992;SIGNWRITING MOVEMENT-WALLPLANE HUMP SMALL;So;0;L;;;;;N;;;;; -1D993;SIGNWRITING MOVEMENT-WALLPLANE HUMP MEDIUM;So;0;L;;;;;N;;;;; -1D994;SIGNWRITING MOVEMENT-WALLPLANE HUMP LARGE;So;0;L;;;;;N;;;;; -1D995;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL;So;0;L;;;;;N;;;;; -1D996;SIGNWRITING MOVEMENT-WALLPLANE LOOP MEDIUM;So;0;L;;;;;N;;;;; -1D997;SIGNWRITING MOVEMENT-WALLPLANE LOOP LARGE;So;0;L;;;;;N;;;;; -1D998;SIGNWRITING MOVEMENT-WALLPLANE LOOP SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D999;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE SMALL;So;0;L;;;;;N;;;;; -1D99A;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE MEDIUM;So;0;L;;;;;N;;;;; -1D99B;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE DOUBLE LARGE;So;0;L;;;;;N;;;;; -1D99C;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE SMALL;So;0;L;;;;;N;;;;; -1D99D;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE MEDIUM;So;0;L;;;;;N;;;;; -1D99E;SIGNWRITING MOVEMENT-WALLPLANE WAVE CURVE TRIPLE LARGE;So;0;L;;;;;N;;;;; -1D99F;SIGNWRITING MOVEMENT-WALLPLANE CURVE THEN STRAIGHT;So;0;L;;;;;N;;;;; -1D9A0;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS SMALL;So;0;L;;;;;N;;;;; -1D9A1;SIGNWRITING MOVEMENT-WALLPLANE CURVED CROSS MEDIUM;So;0;L;;;;;N;;;;; -1D9A2;SIGNWRITING ROTATION-WALLPLANE SINGLE;So;0;L;;;;;N;;;;; -1D9A3;SIGNWRITING ROTATION-WALLPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D9A4;SIGNWRITING ROTATION-WALLPLANE ALTERNATE;So;0;L;;;;;N;;;;; -1D9A5;SIGNWRITING MOVEMENT-WALLPLANE SHAKING;So;0;L;;;;;N;;;;; -1D9A6;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9A7;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9A8;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9A9;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AA;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AB;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AC;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING FRONT WALL;So;0;L;;;;;N;;;;; -1D9AD;SIGNWRITING MOVEMENT-WALLPLANE CURVE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9AE;SIGNWRITING MOVEMENT-WALLPLANE HUMP HITTING CHEST;So;0;L;;;;;N;;;;; -1D9AF;SIGNWRITING MOVEMENT-WALLPLANE LOOP HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B0;SIGNWRITING MOVEMENT-WALLPLANE WAVE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B1;SIGNWRITING ROTATION-WALLPLANE SINGLE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B2;SIGNWRITING ROTATION-WALLPLANE DOUBLE HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B3;SIGNWRITING ROTATION-WALLPLANE ALTERNATING HITTING CHEST;So;0;L;;;;;N;;;;; -1D9B4;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH SMALL;So;0;L;;;;;N;;;;; -1D9B5;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH MEDIUM;So;0;L;;;;;N;;;;; -1D9B6;SIGNWRITING MOVEMENT-WALLPLANE WAVE DIAGONAL PATH LARGE;So;0;L;;;;;N;;;;; -1D9B7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; -1D9B8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; -1D9B9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9BA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9BB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING SMALL TRIPLE;So;0;L;;;;;N;;;;; -1D9BC;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING CEILING LARGE TRIPLE;So;0;L;;;;;N;;;;; -1D9BD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9BE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE SINGLE;So;0;L;;;;;N;;;;; -1D9BF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9C0;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING CEILING LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9C1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING SMALL;So;0;L;;;;;N;;;;; -1D9C2;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING CEILING LARGE;So;0;L;;;;;N;;;;; -1D9C3;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING CEILING;So;0;L;;;;;N;;;;; -1D9C4;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING CEILING;So;0;L;;;;;N;;;;; -1D9C5;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING CEILING;So;0;L;;;;;N;;;;; -1D9C6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; -1D9C7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; -1D9C8;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9C9;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9CA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE SMALL TRIPLE;So;0;L;;;;;N;;;;; -1D9CB;SIGNWRITING MOVEMENT-FLOORPLANE HUMP HITTING FLOOR TRIPLE LARGE TRIPLE;So;0;L;;;;;N;;;;; -1D9CC;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9CD;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE SINGLE;So;0;L;;;;;N;;;;; -1D9CE;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9CF;SIGNWRITING MOVEMENT-FLOORPLANE LOOP HITTING FLOOR LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9D0;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR SMALL;So;0;L;;;;;N;;;;; -1D9D1;SIGNWRITING MOVEMENT-FLOORPLANE WAVE HITTING FLOOR LARGE;So;0;L;;;;;N;;;;; -1D9D2;SIGNWRITING ROTATION-FLOORPLANE SINGLE HITTING FLOOR;So;0;L;;;;;N;;;;; -1D9D3;SIGNWRITING ROTATION-FLOORPLANE DOUBLE HITTING FLOOR;So;0;L;;;;;N;;;;; -1D9D4;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING HITTING FLOOR;So;0;L;;;;;N;;;;; -1D9D5;SIGNWRITING MOVEMENT-FLOORPLANE CURVE SMALL;So;0;L;;;;;N;;;;; -1D9D6;SIGNWRITING MOVEMENT-FLOORPLANE CURVE MEDIUM;So;0;L;;;;;N;;;;; -1D9D7;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGE;So;0;L;;;;;N;;;;; -1D9D8;SIGNWRITING MOVEMENT-FLOORPLANE CURVE LARGEST;So;0;L;;;;;N;;;;; -1D9D9;SIGNWRITING MOVEMENT-FLOORPLANE CURVE COMBINED;So;0;L;;;;;N;;;;; -1D9DA;SIGNWRITING MOVEMENT-FLOORPLANE HUMP SMALL;So;0;L;;;;;N;;;;; -1D9DB;SIGNWRITING MOVEMENT-FLOORPLANE LOOP SMALL;So;0;L;;;;;N;;;;; -1D9DC;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SNAKE;So;0;L;;;;;N;;;;; -1D9DD;SIGNWRITING MOVEMENT-FLOORPLANE WAVE SMALL;So;0;L;;;;;N;;;;; -1D9DE;SIGNWRITING MOVEMENT-FLOORPLANE WAVE LARGE;So;0;L;;;;;N;;;;; -1D9DF;SIGNWRITING ROTATION-FLOORPLANE SINGLE;So;0;L;;;;;N;;;;; -1D9E0;SIGNWRITING ROTATION-FLOORPLANE DOUBLE;So;0;L;;;;;N;;;;; -1D9E1;SIGNWRITING ROTATION-FLOORPLANE ALTERNATING;So;0;L;;;;;N;;;;; -1D9E2;SIGNWRITING MOVEMENT-FLOORPLANE SHAKING PARALLEL;So;0;L;;;;;N;;;;; -1D9E3;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9E4;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM SINGLE;So;0;L;;;;;N;;;;; -1D9E5;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9E6;SIGNWRITING MOVEMENT-WALLPLANE ARM CIRCLE MEDIUM DOUBLE;So;0;L;;;;;N;;;;; -1D9E7;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL SINGLE;So;0;L;;;;;N;;;;; -1D9E8;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM SINGLE;So;0;L;;;;;N;;;;; -1D9E9;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE SINGLE;So;0;L;;;;;N;;;;; -1D9EA;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL SMALL DOUBLE;So;0;L;;;;;N;;;;; -1D9EB;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL MEDIUM DOUBLE;So;0;L;;;;;N;;;;; -1D9EC;SIGNWRITING MOVEMENT-FLOORPLANE ARM CIRCLE HITTING WALL LARGE DOUBLE;So;0;L;;;;;N;;;;; -1D9ED;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT SINGLE;So;0;L;;;;;N;;;;; -1D9EE;SIGNWRITING MOVEMENT-WALLPLANE WRIST CIRCLE FRONT DOUBLE;So;0;L;;;;;N;;;;; -1D9EF;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL SINGLE;So;0;L;;;;;N;;;;; -1D9F0;SIGNWRITING MOVEMENT-FLOORPLANE WRIST CIRCLE HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; -1D9F1;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES SINGLE;So;0;L;;;;;N;;;;; -1D9F2;SIGNWRITING MOVEMENT-WALLPLANE FINGER CIRCLES DOUBLE;So;0;L;;;;;N;;;;; -1D9F3;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL SINGLE;So;0;L;;;;;N;;;;; -1D9F4;SIGNWRITING MOVEMENT-FLOORPLANE FINGER CIRCLES HITTING WALL DOUBLE;So;0;L;;;;;N;;;;; -1D9F5;SIGNWRITING DYNAMIC ARROWHEAD SMALL;So;0;L;;;;;N;;;;; -1D9F6;SIGNWRITING DYNAMIC ARROWHEAD LARGE;So;0;L;;;;;N;;;;; -1D9F7;SIGNWRITING DYNAMIC FAST;So;0;L;;;;;N;;;;; -1D9F8;SIGNWRITING DYNAMIC SLOW;So;0;L;;;;;N;;;;; -1D9F9;SIGNWRITING DYNAMIC TENSE;So;0;L;;;;;N;;;;; -1D9FA;SIGNWRITING DYNAMIC RELAXED;So;0;L;;;;;N;;;;; -1D9FB;SIGNWRITING DYNAMIC SIMULTANEOUS;So;0;L;;;;;N;;;;; -1D9FC;SIGNWRITING DYNAMIC SIMULTANEOUS ALTERNATING;So;0;L;;;;;N;;;;; -1D9FD;SIGNWRITING DYNAMIC EVERY OTHER TIME;So;0;L;;;;;N;;;;; -1D9FE;SIGNWRITING DYNAMIC GRADUAL;So;0;L;;;;;N;;;;; -1D9FF;SIGNWRITING HEAD;So;0;L;;;;;N;;;;; -1DA00;SIGNWRITING HEAD RIM;Mn;0;NSM;;;;;N;;;;; -1DA01;SIGNWRITING HEAD MOVEMENT-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA02;SIGNWRITING HEAD MOVEMENT-WALLPLANE TILT;Mn;0;NSM;;;;;N;;;;; -1DA03;SIGNWRITING HEAD MOVEMENT-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA04;SIGNWRITING HEAD MOVEMENT-WALLPLANE CURVE;Mn;0;NSM;;;;;N;;;;; -1DA05;SIGNWRITING HEAD MOVEMENT-FLOORPLANE CURVE;Mn;0;NSM;;;;;N;;;;; -1DA06;SIGNWRITING HEAD MOVEMENT CIRCLE;Mn;0;NSM;;;;;N;;;;; -1DA07;SIGNWRITING FACE DIRECTION POSITION NOSE FORWARD TILTING;Mn;0;NSM;;;;;N;;;;; -1DA08;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN;Mn;0;NSM;;;;;N;;;;; -1DA09;SIGNWRITING FACE DIRECTION POSITION NOSE UP OR DOWN TILTING;Mn;0;NSM;;;;;N;;;;; -1DA0A;SIGNWRITING EYEBROWS STRAIGHT UP;Mn;0;NSM;;;;;N;;;;; -1DA0B;SIGNWRITING EYEBROWS STRAIGHT NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA0C;SIGNWRITING EYEBROWS STRAIGHT DOWN;Mn;0;NSM;;;;;N;;;;; -1DA0D;SIGNWRITING DREAMY EYEBROWS NEUTRAL DOWN;Mn;0;NSM;;;;;N;;;;; -1DA0E;SIGNWRITING DREAMY EYEBROWS DOWN NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA0F;SIGNWRITING DREAMY EYEBROWS UP NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA10;SIGNWRITING DREAMY EYEBROWS NEUTRAL UP;Mn;0;NSM;;;;;N;;;;; -1DA11;SIGNWRITING FOREHEAD NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA12;SIGNWRITING FOREHEAD CONTACT;Mn;0;NSM;;;;;N;;;;; -1DA13;SIGNWRITING FOREHEAD WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA14;SIGNWRITING EYES OPEN;Mn;0;NSM;;;;;N;;;;; -1DA15;SIGNWRITING EYES SQUEEZED;Mn;0;NSM;;;;;N;;;;; -1DA16;SIGNWRITING EYES CLOSED;Mn;0;NSM;;;;;N;;;;; -1DA17;SIGNWRITING EYE BLINK SINGLE;Mn;0;NSM;;;;;N;;;;; -1DA18;SIGNWRITING EYE BLINK MULTIPLE;Mn;0;NSM;;;;;N;;;;; -1DA19;SIGNWRITING EYES HALF OPEN;Mn;0;NSM;;;;;N;;;;; -1DA1A;SIGNWRITING EYES WIDE OPEN;Mn;0;NSM;;;;;N;;;;; -1DA1B;SIGNWRITING EYES HALF CLOSED;Mn;0;NSM;;;;;N;;;;; -1DA1C;SIGNWRITING EYES WIDENING MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA1D;SIGNWRITING EYE WINK;Mn;0;NSM;;;;;N;;;;; -1DA1E;SIGNWRITING EYELASHES UP;Mn;0;NSM;;;;;N;;;;; -1DA1F;SIGNWRITING EYELASHES DOWN;Mn;0;NSM;;;;;N;;;;; -1DA20;SIGNWRITING EYELASHES FLUTTERING;Mn;0;NSM;;;;;N;;;;; -1DA21;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA22;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; -1DA23;SIGNWRITING EYEGAZE-WALLPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; -1DA24;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT;Mn;0;NSM;;;;;N;;;;; -1DA25;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT DOUBLE;Mn;0;NSM;;;;;N;;;;; -1DA26;SIGNWRITING EYEGAZE-FLOORPLANE STRAIGHT ALTERNATING;Mn;0;NSM;;;;;N;;;;; -1DA27;SIGNWRITING EYEGAZE-WALLPLANE CURVED;Mn;0;NSM;;;;;N;;;;; -1DA28;SIGNWRITING EYEGAZE-FLOORPLANE CURVED;Mn;0;NSM;;;;;N;;;;; -1DA29;SIGNWRITING EYEGAZE-WALLPLANE CIRCLING;Mn;0;NSM;;;;;N;;;;; -1DA2A;SIGNWRITING CHEEKS PUFFED;Mn;0;NSM;;;;;N;;;;; -1DA2B;SIGNWRITING CHEEKS NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA2C;SIGNWRITING CHEEKS SUCKED;Mn;0;NSM;;;;;N;;;;; -1DA2D;SIGNWRITING TENSE CHEEKS HIGH;Mn;0;NSM;;;;;N;;;;; -1DA2E;SIGNWRITING TENSE CHEEKS MIDDLE;Mn;0;NSM;;;;;N;;;;; -1DA2F;SIGNWRITING TENSE CHEEKS LOW;Mn;0;NSM;;;;;N;;;;; -1DA30;SIGNWRITING EARS;Mn;0;NSM;;;;;N;;;;; -1DA31;SIGNWRITING NOSE NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA32;SIGNWRITING NOSE CONTACT;Mn;0;NSM;;;;;N;;;;; -1DA33;SIGNWRITING NOSE WRINKLES;Mn;0;NSM;;;;;N;;;;; -1DA34;SIGNWRITING NOSE WIGGLES;Mn;0;NSM;;;;;N;;;;; -1DA35;SIGNWRITING AIR BLOWING OUT;Mn;0;NSM;;;;;N;;;;; -1DA36;SIGNWRITING AIR SUCKING IN;Mn;0;NSM;;;;;N;;;;; -1DA37;SIGNWRITING AIR BLOW SMALL ROTATIONS;So;0;L;;;;;N;;;;; -1DA38;SIGNWRITING AIR SUCK SMALL ROTATIONS;So;0;L;;;;;N;;;;; -1DA39;SIGNWRITING BREATH INHALE;So;0;L;;;;;N;;;;; -1DA3A;SIGNWRITING BREATH EXHALE;So;0;L;;;;;N;;;;; -1DA3B;SIGNWRITING MOUTH CLOSED NEUTRAL;Mn;0;NSM;;;;;N;;;;; -1DA3C;SIGNWRITING MOUTH CLOSED FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA3D;SIGNWRITING MOUTH CLOSED CONTACT;Mn;0;NSM;;;;;N;;;;; -1DA3E;SIGNWRITING MOUTH SMILE;Mn;0;NSM;;;;;N;;;;; -1DA3F;SIGNWRITING MOUTH SMILE WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA40;SIGNWRITING MOUTH SMILE OPEN;Mn;0;NSM;;;;;N;;;;; -1DA41;SIGNWRITING MOUTH FROWN;Mn;0;NSM;;;;;N;;;;; -1DA42;SIGNWRITING MOUTH FROWN WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA43;SIGNWRITING MOUTH FROWN OPEN;Mn;0;NSM;;;;;N;;;;; -1DA44;SIGNWRITING MOUTH OPEN CIRCLE;Mn;0;NSM;;;;;N;;;;; -1DA45;SIGNWRITING MOUTH OPEN FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA46;SIGNWRITING MOUTH OPEN WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA47;SIGNWRITING MOUTH OPEN OVAL;Mn;0;NSM;;;;;N;;;;; -1DA48;SIGNWRITING MOUTH OPEN OVAL WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA49;SIGNWRITING MOUTH OPEN OVAL YAWN;Mn;0;NSM;;;;;N;;;;; -1DA4A;SIGNWRITING MOUTH OPEN RECTANGLE;Mn;0;NSM;;;;;N;;;;; -1DA4B;SIGNWRITING MOUTH OPEN RECTANGLE WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA4C;SIGNWRITING MOUTH OPEN RECTANGLE YAWN;Mn;0;NSM;;;;;N;;;;; -1DA4D;SIGNWRITING MOUTH KISS;Mn;0;NSM;;;;;N;;;;; -1DA4E;SIGNWRITING MOUTH KISS FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA4F;SIGNWRITING MOUTH KISS WRINKLED;Mn;0;NSM;;;;;N;;;;; -1DA50;SIGNWRITING MOUTH TENSE;Mn;0;NSM;;;;;N;;;;; -1DA51;SIGNWRITING MOUTH TENSE FORWARD;Mn;0;NSM;;;;;N;;;;; -1DA52;SIGNWRITING MOUTH TENSE SUCKED;Mn;0;NSM;;;;;N;;;;; -1DA53;SIGNWRITING LIPS PRESSED TOGETHER;Mn;0;NSM;;;;;N;;;;; -1DA54;SIGNWRITING LIP LOWER OVER UPPER;Mn;0;NSM;;;;;N;;;;; -1DA55;SIGNWRITING LIP UPPER OVER LOWER;Mn;0;NSM;;;;;N;;;;; -1DA56;SIGNWRITING MOUTH CORNERS;Mn;0;NSM;;;;;N;;;;; -1DA57;SIGNWRITING MOUTH WRINKLES SINGLE;Mn;0;NSM;;;;;N;;;;; -1DA58;SIGNWRITING MOUTH WRINKLES DOUBLE;Mn;0;NSM;;;;;N;;;;; -1DA59;SIGNWRITING TONGUE STICKING OUT FAR;Mn;0;NSM;;;;;N;;;;; -1DA5A;SIGNWRITING TONGUE LICKING LIPS;Mn;0;NSM;;;;;N;;;;; -1DA5B;SIGNWRITING TONGUE TIP BETWEEN LIPS;Mn;0;NSM;;;;;N;;;;; -1DA5C;SIGNWRITING TONGUE TIP TOUCHING INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; -1DA5D;SIGNWRITING TONGUE INSIDE MOUTH RELAXED;Mn;0;NSM;;;;;N;;;;; -1DA5E;SIGNWRITING TONGUE MOVES AGAINST CHEEK;Mn;0;NSM;;;;;N;;;;; -1DA5F;SIGNWRITING TONGUE CENTRE STICKING OUT;Mn;0;NSM;;;;;N;;;;; -1DA60;SIGNWRITING TONGUE CENTRE INSIDE MOUTH;Mn;0;NSM;;;;;N;;;;; -1DA61;SIGNWRITING TEETH;Mn;0;NSM;;;;;N;;;;; -1DA62;SIGNWRITING TEETH MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA63;SIGNWRITING TEETH ON TONGUE;Mn;0;NSM;;;;;N;;;;; -1DA64;SIGNWRITING TEETH ON TONGUE MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA65;SIGNWRITING TEETH ON LIPS;Mn;0;NSM;;;;;N;;;;; -1DA66;SIGNWRITING TEETH ON LIPS MOVEMENT;Mn;0;NSM;;;;;N;;;;; -1DA67;SIGNWRITING TEETH BITE LIPS;Mn;0;NSM;;;;;N;;;;; -1DA68;SIGNWRITING MOVEMENT-WALLPLANE JAW;Mn;0;NSM;;;;;N;;;;; -1DA69;SIGNWRITING MOVEMENT-FLOORPLANE JAW;Mn;0;NSM;;;;;N;;;;; -1DA6A;SIGNWRITING NECK;Mn;0;NSM;;;;;N;;;;; -1DA6B;SIGNWRITING HAIR;Mn;0;NSM;;;;;N;;;;; -1DA6C;SIGNWRITING EXCITEMENT;Mn;0;NSM;;;;;N;;;;; -1DA6D;SIGNWRITING SHOULDER HIP SPINE;So;0;L;;;;;N;;;;; -1DA6E;SIGNWRITING SHOULDER HIP POSITIONS;So;0;L;;;;;N;;;;; -1DA6F;SIGNWRITING WALLPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; -1DA70;SIGNWRITING FLOORPLANE SHOULDER HIP MOVE;So;0;L;;;;;N;;;;; -1DA71;SIGNWRITING SHOULDER TILTING FROM WAIST;So;0;L;;;;;N;;;;; -1DA72;SIGNWRITING TORSO-WALLPLANE STRAIGHT STRETCH;So;0;L;;;;;N;;;;; -1DA73;SIGNWRITING TORSO-WALLPLANE CURVED BEND;So;0;L;;;;;N;;;;; -1DA74;SIGNWRITING TORSO-FLOORPLANE TWISTING;So;0;L;;;;;N;;;;; -1DA75;SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS;Mn;0;NSM;;;;;N;;;;; -1DA76;SIGNWRITING LIMB COMBINATION;So;0;L;;;;;N;;;;; -1DA77;SIGNWRITING LIMB LENGTH-1;So;0;L;;;;;N;;;;; -1DA78;SIGNWRITING LIMB LENGTH-2;So;0;L;;;;;N;;;;; -1DA79;SIGNWRITING LIMB LENGTH-3;So;0;L;;;;;N;;;;; -1DA7A;SIGNWRITING LIMB LENGTH-4;So;0;L;;;;;N;;;;; -1DA7B;SIGNWRITING LIMB LENGTH-5;So;0;L;;;;;N;;;;; -1DA7C;SIGNWRITING LIMB LENGTH-6;So;0;L;;;;;N;;;;; -1DA7D;SIGNWRITING LIMB LENGTH-7;So;0;L;;;;;N;;;;; -1DA7E;SIGNWRITING FINGER;So;0;L;;;;;N;;;;; -1DA7F;SIGNWRITING LOCATION-WALLPLANE SPACE;So;0;L;;;;;N;;;;; -1DA80;SIGNWRITING LOCATION-FLOORPLANE SPACE;So;0;L;;;;;N;;;;; -1DA81;SIGNWRITING LOCATION HEIGHT;So;0;L;;;;;N;;;;; -1DA82;SIGNWRITING LOCATION WIDTH;So;0;L;;;;;N;;;;; -1DA83;SIGNWRITING LOCATION DEPTH;So;0;L;;;;;N;;;;; -1DA84;SIGNWRITING LOCATION HEAD NECK;Mn;0;NSM;;;;;N;;;;; -1DA85;SIGNWRITING LOCATION TORSO;So;0;L;;;;;N;;;;; -1DA86;SIGNWRITING LOCATION LIMBS DIGITS;So;0;L;;;;;N;;;;; -1DA87;SIGNWRITING COMMA;Po;0;L;;;;;N;;;;; -1DA88;SIGNWRITING FULL STOP;Po;0;L;;;;;N;;;;; -1DA89;SIGNWRITING SEMICOLON;Po;0;L;;;;;N;;;;; -1DA8A;SIGNWRITING COLON;Po;0;L;;;;;N;;;;; -1DA8B;SIGNWRITING PARENTHESIS;Po;0;L;;;;;N;;;;; -1DA9B;SIGNWRITING FILL MODIFIER-2;Mn;0;NSM;;;;;N;;;;; -1DA9C;SIGNWRITING FILL MODIFIER-3;Mn;0;NSM;;;;;N;;;;; -1DA9D;SIGNWRITING FILL MODIFIER-4;Mn;0;NSM;;;;;N;;;;; -1DA9E;SIGNWRITING FILL MODIFIER-5;Mn;0;NSM;;;;;N;;;;; -1DA9F;SIGNWRITING FILL MODIFIER-6;Mn;0;NSM;;;;;N;;;;; -1DAA1;SIGNWRITING ROTATION MODIFIER-2;Mn;0;NSM;;;;;N;;;;; -1DAA2;SIGNWRITING ROTATION MODIFIER-3;Mn;0;NSM;;;;;N;;;;; -1DAA3;SIGNWRITING ROTATION MODIFIER-4;Mn;0;NSM;;;;;N;;;;; -1DAA4;SIGNWRITING ROTATION MODIFIER-5;Mn;0;NSM;;;;;N;;;;; -1DAA5;SIGNWRITING ROTATION MODIFIER-6;Mn;0;NSM;;;;;N;;;;; -1DAA6;SIGNWRITING ROTATION MODIFIER-7;Mn;0;NSM;;;;;N;;;;; -1DAA7;SIGNWRITING ROTATION MODIFIER-8;Mn;0;NSM;;;;;N;;;;; -1DAA8;SIGNWRITING ROTATION MODIFIER-9;Mn;0;NSM;;;;;N;;;;; -1DAA9;SIGNWRITING ROTATION MODIFIER-10;Mn;0;NSM;;;;;N;;;;; -1DAAA;SIGNWRITING ROTATION MODIFIER-11;Mn;0;NSM;;;;;N;;;;; -1DAAB;SIGNWRITING ROTATION MODIFIER-12;Mn;0;NSM;;;;;N;;;;; -1DAAC;SIGNWRITING ROTATION MODIFIER-13;Mn;0;NSM;;;;;N;;;;; -1DAAD;SIGNWRITING ROTATION MODIFIER-14;Mn;0;NSM;;;;;N;;;;; -1DAAE;SIGNWRITING ROTATION MODIFIER-15;Mn;0;NSM;;;;;N;;;;; -1DAAF;SIGNWRITING ROTATION MODIFIER-16;Mn;0;NSM;;;;;N;;;;; -1E800;MENDE KIKAKUI SYLLABLE M001 KI;Lo;0;R;;;;;N;;;;; -1E801;MENDE KIKAKUI SYLLABLE M002 KA;Lo;0;R;;;;;N;;;;; -1E802;MENDE KIKAKUI SYLLABLE M003 KU;Lo;0;R;;;;;N;;;;; -1E803;MENDE KIKAKUI SYLLABLE M065 KEE;Lo;0;R;;;;;N;;;;; -1E804;MENDE KIKAKUI SYLLABLE M095 KE;Lo;0;R;;;;;N;;;;; -1E805;MENDE KIKAKUI SYLLABLE M076 KOO;Lo;0;R;;;;;N;;;;; -1E806;MENDE KIKAKUI SYLLABLE M048 KO;Lo;0;R;;;;;N;;;;; -1E807;MENDE KIKAKUI SYLLABLE M179 KUA;Lo;0;R;;;;;N;;;;; -1E808;MENDE KIKAKUI SYLLABLE M004 WI;Lo;0;R;;;;;N;;;;; -1E809;MENDE KIKAKUI SYLLABLE M005 WA;Lo;0;R;;;;;N;;;;; -1E80A;MENDE KIKAKUI SYLLABLE M006 WU;Lo;0;R;;;;;N;;;;; -1E80B;MENDE KIKAKUI SYLLABLE M126 WEE;Lo;0;R;;;;;N;;;;; -1E80C;MENDE KIKAKUI SYLLABLE M118 WE;Lo;0;R;;;;;N;;;;; -1E80D;MENDE KIKAKUI SYLLABLE M114 WOO;Lo;0;R;;;;;N;;;;; -1E80E;MENDE KIKAKUI SYLLABLE M045 WO;Lo;0;R;;;;;N;;;;; -1E80F;MENDE KIKAKUI SYLLABLE M194 WUI;Lo;0;R;;;;;N;;;;; -1E810;MENDE KIKAKUI SYLLABLE M143 WEI;Lo;0;R;;;;;N;;;;; -1E811;MENDE KIKAKUI SYLLABLE M061 WVI;Lo;0;R;;;;;N;;;;; -1E812;MENDE KIKAKUI SYLLABLE M049 WVA;Lo;0;R;;;;;N;;;;; -1E813;MENDE KIKAKUI SYLLABLE M139 WVE;Lo;0;R;;;;;N;;;;; -1E814;MENDE KIKAKUI SYLLABLE M007 MIN;Lo;0;R;;;;;N;;;;; -1E815;MENDE KIKAKUI SYLLABLE M008 MAN;Lo;0;R;;;;;N;;;;; -1E816;MENDE KIKAKUI SYLLABLE M009 MUN;Lo;0;R;;;;;N;;;;; -1E817;MENDE KIKAKUI SYLLABLE M059 MEN;Lo;0;R;;;;;N;;;;; -1E818;MENDE KIKAKUI SYLLABLE M094 MON;Lo;0;R;;;;;N;;;;; -1E819;MENDE KIKAKUI SYLLABLE M154 MUAN;Lo;0;R;;;;;N;;;;; -1E81A;MENDE KIKAKUI SYLLABLE M189 MUEN;Lo;0;R;;;;;N;;;;; -1E81B;MENDE KIKAKUI SYLLABLE M010 BI;Lo;0;R;;;;;N;;;;; -1E81C;MENDE KIKAKUI SYLLABLE M011 BA;Lo;0;R;;;;;N;;;;; -1E81D;MENDE KIKAKUI SYLLABLE M012 BU;Lo;0;R;;;;;N;;;;; -1E81E;MENDE KIKAKUI SYLLABLE M150 BEE;Lo;0;R;;;;;N;;;;; -1E81F;MENDE KIKAKUI SYLLABLE M097 BE;Lo;0;R;;;;;N;;;;; -1E820;MENDE KIKAKUI SYLLABLE M103 BOO;Lo;0;R;;;;;N;;;;; -1E821;MENDE KIKAKUI SYLLABLE M138 BO;Lo;0;R;;;;;N;;;;; -1E822;MENDE KIKAKUI SYLLABLE M013 I;Lo;0;R;;;;;N;;;;; -1E823;MENDE KIKAKUI SYLLABLE M014 A;Lo;0;R;;;;;N;;;;; -1E824;MENDE KIKAKUI SYLLABLE M015 U;Lo;0;R;;;;;N;;;;; -1E825;MENDE KIKAKUI SYLLABLE M163 EE;Lo;0;R;;;;;N;;;;; -1E826;MENDE KIKAKUI SYLLABLE M100 E;Lo;0;R;;;;;N;;;;; -1E827;MENDE KIKAKUI SYLLABLE M165 OO;Lo;0;R;;;;;N;;;;; -1E828;MENDE KIKAKUI SYLLABLE M147 O;Lo;0;R;;;;;N;;;;; -1E829;MENDE KIKAKUI SYLLABLE M137 EI;Lo;0;R;;;;;N;;;;; -1E82A;MENDE KIKAKUI SYLLABLE M131 IN;Lo;0;R;;;;;N;;;;; -1E82B;MENDE KIKAKUI SYLLABLE M135 IN;Lo;0;R;;;;;N;;;;; -1E82C;MENDE KIKAKUI SYLLABLE M195 AN;Lo;0;R;;;;;N;;;;; -1E82D;MENDE KIKAKUI SYLLABLE M178 EN;Lo;0;R;;;;;N;;;;; -1E82E;MENDE KIKAKUI SYLLABLE M019 SI;Lo;0;R;;;;;N;;;;; -1E82F;MENDE KIKAKUI SYLLABLE M020 SA;Lo;0;R;;;;;N;;;;; -1E830;MENDE KIKAKUI SYLLABLE M021 SU;Lo;0;R;;;;;N;;;;; -1E831;MENDE KIKAKUI SYLLABLE M162 SEE;Lo;0;R;;;;;N;;;;; -1E832;MENDE KIKAKUI SYLLABLE M116 SE;Lo;0;R;;;;;N;;;;; -1E833;MENDE KIKAKUI SYLLABLE M136 SOO;Lo;0;R;;;;;N;;;;; -1E834;MENDE KIKAKUI SYLLABLE M079 SO;Lo;0;R;;;;;N;;;;; -1E835;MENDE KIKAKUI SYLLABLE M196 SIA;Lo;0;R;;;;;N;;;;; -1E836;MENDE KIKAKUI SYLLABLE M025 LI;Lo;0;R;;;;;N;;;;; -1E837;MENDE KIKAKUI SYLLABLE M026 LA;Lo;0;R;;;;;N;;;;; -1E838;MENDE KIKAKUI SYLLABLE M027 LU;Lo;0;R;;;;;N;;;;; -1E839;MENDE KIKAKUI SYLLABLE M084 LEE;Lo;0;R;;;;;N;;;;; -1E83A;MENDE KIKAKUI SYLLABLE M073 LE;Lo;0;R;;;;;N;;;;; -1E83B;MENDE KIKAKUI SYLLABLE M054 LOO;Lo;0;R;;;;;N;;;;; -1E83C;MENDE KIKAKUI SYLLABLE M153 LO;Lo;0;R;;;;;N;;;;; -1E83D;MENDE KIKAKUI SYLLABLE M110 LONG LE;Lo;0;R;;;;;N;;;;; -1E83E;MENDE KIKAKUI SYLLABLE M016 DI;Lo;0;R;;;;;N;;;;; -1E83F;MENDE KIKAKUI SYLLABLE M017 DA;Lo;0;R;;;;;N;;;;; -1E840;MENDE KIKAKUI SYLLABLE M018 DU;Lo;0;R;;;;;N;;;;; -1E841;MENDE KIKAKUI SYLLABLE M089 DEE;Lo;0;R;;;;;N;;;;; -1E842;MENDE KIKAKUI SYLLABLE M180 DOO;Lo;0;R;;;;;N;;;;; -1E843;MENDE KIKAKUI SYLLABLE M181 DO;Lo;0;R;;;;;N;;;;; -1E844;MENDE KIKAKUI SYLLABLE M022 TI;Lo;0;R;;;;;N;;;;; -1E845;MENDE KIKAKUI SYLLABLE M023 TA;Lo;0;R;;;;;N;;;;; -1E846;MENDE KIKAKUI SYLLABLE M024 TU;Lo;0;R;;;;;N;;;;; -1E847;MENDE KIKAKUI SYLLABLE M091 TEE;Lo;0;R;;;;;N;;;;; -1E848;MENDE KIKAKUI SYLLABLE M055 TE;Lo;0;R;;;;;N;;;;; -1E849;MENDE KIKAKUI SYLLABLE M104 TOO;Lo;0;R;;;;;N;;;;; -1E84A;MENDE KIKAKUI SYLLABLE M069 TO;Lo;0;R;;;;;N;;;;; -1E84B;MENDE KIKAKUI SYLLABLE M028 JI;Lo;0;R;;;;;N;;;;; -1E84C;MENDE KIKAKUI SYLLABLE M029 JA;Lo;0;R;;;;;N;;;;; -1E84D;MENDE KIKAKUI SYLLABLE M030 JU;Lo;0;R;;;;;N;;;;; -1E84E;MENDE KIKAKUI SYLLABLE M157 JEE;Lo;0;R;;;;;N;;;;; -1E84F;MENDE KIKAKUI SYLLABLE M113 JE;Lo;0;R;;;;;N;;;;; -1E850;MENDE KIKAKUI SYLLABLE M160 JOO;Lo;0;R;;;;;N;;;;; -1E851;MENDE KIKAKUI SYLLABLE M063 JO;Lo;0;R;;;;;N;;;;; -1E852;MENDE KIKAKUI SYLLABLE M175 LONG JO;Lo;0;R;;;;;N;;;;; -1E853;MENDE KIKAKUI SYLLABLE M031 YI;Lo;0;R;;;;;N;;;;; -1E854;MENDE KIKAKUI SYLLABLE M032 YA;Lo;0;R;;;;;N;;;;; -1E855;MENDE KIKAKUI SYLLABLE M033 YU;Lo;0;R;;;;;N;;;;; -1E856;MENDE KIKAKUI SYLLABLE M109 YEE;Lo;0;R;;;;;N;;;;; -1E857;MENDE KIKAKUI SYLLABLE M080 YE;Lo;0;R;;;;;N;;;;; -1E858;MENDE KIKAKUI SYLLABLE M141 YOO;Lo;0;R;;;;;N;;;;; -1E859;MENDE KIKAKUI SYLLABLE M121 YO;Lo;0;R;;;;;N;;;;; -1E85A;MENDE KIKAKUI SYLLABLE M034 FI;Lo;0;R;;;;;N;;;;; -1E85B;MENDE KIKAKUI SYLLABLE M035 FA;Lo;0;R;;;;;N;;;;; -1E85C;MENDE KIKAKUI SYLLABLE M036 FU;Lo;0;R;;;;;N;;;;; -1E85D;MENDE KIKAKUI SYLLABLE M078 FEE;Lo;0;R;;;;;N;;;;; -1E85E;MENDE KIKAKUI SYLLABLE M075 FE;Lo;0;R;;;;;N;;;;; -1E85F;MENDE KIKAKUI SYLLABLE M133 FOO;Lo;0;R;;;;;N;;;;; -1E860;MENDE KIKAKUI SYLLABLE M088 FO;Lo;0;R;;;;;N;;;;; -1E861;MENDE KIKAKUI SYLLABLE M197 FUA;Lo;0;R;;;;;N;;;;; -1E862;MENDE KIKAKUI SYLLABLE M101 FAN;Lo;0;R;;;;;N;;;;; -1E863;MENDE KIKAKUI SYLLABLE M037 NIN;Lo;0;R;;;;;N;;;;; -1E864;MENDE KIKAKUI SYLLABLE M038 NAN;Lo;0;R;;;;;N;;;;; -1E865;MENDE KIKAKUI SYLLABLE M039 NUN;Lo;0;R;;;;;N;;;;; -1E866;MENDE KIKAKUI SYLLABLE M117 NEN;Lo;0;R;;;;;N;;;;; -1E867;MENDE KIKAKUI SYLLABLE M169 NON;Lo;0;R;;;;;N;;;;; -1E868;MENDE KIKAKUI SYLLABLE M176 HI;Lo;0;R;;;;;N;;;;; -1E869;MENDE KIKAKUI SYLLABLE M041 HA;Lo;0;R;;;;;N;;;;; -1E86A;MENDE KIKAKUI SYLLABLE M186 HU;Lo;0;R;;;;;N;;;;; -1E86B;MENDE KIKAKUI SYLLABLE M040 HEE;Lo;0;R;;;;;N;;;;; -1E86C;MENDE KIKAKUI SYLLABLE M096 HE;Lo;0;R;;;;;N;;;;; -1E86D;MENDE KIKAKUI SYLLABLE M042 HOO;Lo;0;R;;;;;N;;;;; -1E86E;MENDE KIKAKUI SYLLABLE M140 HO;Lo;0;R;;;;;N;;;;; -1E86F;MENDE KIKAKUI SYLLABLE M083 HEEI;Lo;0;R;;;;;N;;;;; -1E870;MENDE KIKAKUI SYLLABLE M128 HOOU;Lo;0;R;;;;;N;;;;; -1E871;MENDE KIKAKUI SYLLABLE M053 HIN;Lo;0;R;;;;;N;;;;; -1E872;MENDE KIKAKUI SYLLABLE M130 HAN;Lo;0;R;;;;;N;;;;; -1E873;MENDE KIKAKUI SYLLABLE M087 HUN;Lo;0;R;;;;;N;;;;; -1E874;MENDE KIKAKUI SYLLABLE M052 HEN;Lo;0;R;;;;;N;;;;; -1E875;MENDE KIKAKUI SYLLABLE M193 HON;Lo;0;R;;;;;N;;;;; -1E876;MENDE KIKAKUI SYLLABLE M046 HUAN;Lo;0;R;;;;;N;;;;; -1E877;MENDE KIKAKUI SYLLABLE M090 NGGI;Lo;0;R;;;;;N;;;;; -1E878;MENDE KIKAKUI SYLLABLE M043 NGGA;Lo;0;R;;;;;N;;;;; -1E879;MENDE KIKAKUI SYLLABLE M082 NGGU;Lo;0;R;;;;;N;;;;; -1E87A;MENDE KIKAKUI SYLLABLE M115 NGGEE;Lo;0;R;;;;;N;;;;; -1E87B;MENDE KIKAKUI SYLLABLE M146 NGGE;Lo;0;R;;;;;N;;;;; -1E87C;MENDE KIKAKUI SYLLABLE M156 NGGOO;Lo;0;R;;;;;N;;;;; -1E87D;MENDE KIKAKUI SYLLABLE M120 NGGO;Lo;0;R;;;;;N;;;;; -1E87E;MENDE KIKAKUI SYLLABLE M159 NGGAA;Lo;0;R;;;;;N;;;;; -1E87F;MENDE KIKAKUI SYLLABLE M127 NGGUA;Lo;0;R;;;;;N;;;;; -1E880;MENDE KIKAKUI SYLLABLE M086 LONG NGGE;Lo;0;R;;;;;N;;;;; -1E881;MENDE KIKAKUI SYLLABLE M106 LONG NGGOO;Lo;0;R;;;;;N;;;;; -1E882;MENDE KIKAKUI SYLLABLE M183 LONG NGGO;Lo;0;R;;;;;N;;;;; -1E883;MENDE KIKAKUI SYLLABLE M155 GI;Lo;0;R;;;;;N;;;;; -1E884;MENDE KIKAKUI SYLLABLE M111 GA;Lo;0;R;;;;;N;;;;; -1E885;MENDE KIKAKUI SYLLABLE M168 GU;Lo;0;R;;;;;N;;;;; -1E886;MENDE KIKAKUI SYLLABLE M190 GEE;Lo;0;R;;;;;N;;;;; -1E887;MENDE KIKAKUI SYLLABLE M166 GUEI;Lo;0;R;;;;;N;;;;; -1E888;MENDE KIKAKUI SYLLABLE M167 GUAN;Lo;0;R;;;;;N;;;;; -1E889;MENDE KIKAKUI SYLLABLE M184 NGEN;Lo;0;R;;;;;N;;;;; -1E88A;MENDE KIKAKUI SYLLABLE M057 NGON;Lo;0;R;;;;;N;;;;; -1E88B;MENDE KIKAKUI SYLLABLE M177 NGUAN;Lo;0;R;;;;;N;;;;; -1E88C;MENDE KIKAKUI SYLLABLE M068 PI;Lo;0;R;;;;;N;;;;; -1E88D;MENDE KIKAKUI SYLLABLE M099 PA;Lo;0;R;;;;;N;;;;; -1E88E;MENDE KIKAKUI SYLLABLE M050 PU;Lo;0;R;;;;;N;;;;; -1E88F;MENDE KIKAKUI SYLLABLE M081 PEE;Lo;0;R;;;;;N;;;;; -1E890;MENDE KIKAKUI SYLLABLE M051 PE;Lo;0;R;;;;;N;;;;; -1E891;MENDE KIKAKUI SYLLABLE M102 POO;Lo;0;R;;;;;N;;;;; -1E892;MENDE KIKAKUI SYLLABLE M066 PO;Lo;0;R;;;;;N;;;;; -1E893;MENDE KIKAKUI SYLLABLE M145 MBI;Lo;0;R;;;;;N;;;;; -1E894;MENDE KIKAKUI SYLLABLE M062 MBA;Lo;0;R;;;;;N;;;;; -1E895;MENDE KIKAKUI SYLLABLE M122 MBU;Lo;0;R;;;;;N;;;;; -1E896;MENDE KIKAKUI SYLLABLE M047 MBEE;Lo;0;R;;;;;N;;;;; -1E897;MENDE KIKAKUI SYLLABLE M188 MBEE;Lo;0;R;;;;;N;;;;; -1E898;MENDE KIKAKUI SYLLABLE M072 MBE;Lo;0;R;;;;;N;;;;; -1E899;MENDE KIKAKUI SYLLABLE M172 MBOO;Lo;0;R;;;;;N;;;;; -1E89A;MENDE KIKAKUI SYLLABLE M174 MBO;Lo;0;R;;;;;N;;;;; -1E89B;MENDE KIKAKUI SYLLABLE M187 MBUU;Lo;0;R;;;;;N;;;;; -1E89C;MENDE KIKAKUI SYLLABLE M161 LONG MBE;Lo;0;R;;;;;N;;;;; -1E89D;MENDE KIKAKUI SYLLABLE M105 LONG MBOO;Lo;0;R;;;;;N;;;;; -1E89E;MENDE KIKAKUI SYLLABLE M142 LONG MBO;Lo;0;R;;;;;N;;;;; -1E89F;MENDE KIKAKUI SYLLABLE M132 KPI;Lo;0;R;;;;;N;;;;; -1E8A0;MENDE KIKAKUI SYLLABLE M092 KPA;Lo;0;R;;;;;N;;;;; -1E8A1;MENDE KIKAKUI SYLLABLE M074 KPU;Lo;0;R;;;;;N;;;;; -1E8A2;MENDE KIKAKUI SYLLABLE M044 KPEE;Lo;0;R;;;;;N;;;;; -1E8A3;MENDE KIKAKUI SYLLABLE M108 KPE;Lo;0;R;;;;;N;;;;; -1E8A4;MENDE KIKAKUI SYLLABLE M112 KPOO;Lo;0;R;;;;;N;;;;; -1E8A5;MENDE KIKAKUI SYLLABLE M158 KPO;Lo;0;R;;;;;N;;;;; -1E8A6;MENDE KIKAKUI SYLLABLE M124 GBI;Lo;0;R;;;;;N;;;;; -1E8A7;MENDE KIKAKUI SYLLABLE M056 GBA;Lo;0;R;;;;;N;;;;; -1E8A8;MENDE KIKAKUI SYLLABLE M148 GBU;Lo;0;R;;;;;N;;;;; -1E8A9;MENDE KIKAKUI SYLLABLE M093 GBEE;Lo;0;R;;;;;N;;;;; -1E8AA;MENDE KIKAKUI SYLLABLE M107 GBE;Lo;0;R;;;;;N;;;;; -1E8AB;MENDE KIKAKUI SYLLABLE M071 GBOO;Lo;0;R;;;;;N;;;;; -1E8AC;MENDE KIKAKUI SYLLABLE M070 GBO;Lo;0;R;;;;;N;;;;; -1E8AD;MENDE KIKAKUI SYLLABLE M171 RA;Lo;0;R;;;;;N;;;;; -1E8AE;MENDE KIKAKUI SYLLABLE M123 NDI;Lo;0;R;;;;;N;;;;; -1E8AF;MENDE KIKAKUI SYLLABLE M129 NDA;Lo;0;R;;;;;N;;;;; -1E8B0;MENDE KIKAKUI SYLLABLE M125 NDU;Lo;0;R;;;;;N;;;;; -1E8B1;MENDE KIKAKUI SYLLABLE M191 NDEE;Lo;0;R;;;;;N;;;;; -1E8B2;MENDE KIKAKUI SYLLABLE M119 NDE;Lo;0;R;;;;;N;;;;; -1E8B3;MENDE KIKAKUI SYLLABLE M067 NDOO;Lo;0;R;;;;;N;;;;; -1E8B4;MENDE KIKAKUI SYLLABLE M064 NDO;Lo;0;R;;;;;N;;;;; -1E8B5;MENDE KIKAKUI SYLLABLE M152 NJA;Lo;0;R;;;;;N;;;;; -1E8B6;MENDE KIKAKUI SYLLABLE M192 NJU;Lo;0;R;;;;;N;;;;; -1E8B7;MENDE KIKAKUI SYLLABLE M149 NJEE;Lo;0;R;;;;;N;;;;; -1E8B8;MENDE KIKAKUI SYLLABLE M134 NJOO;Lo;0;R;;;;;N;;;;; -1E8B9;MENDE KIKAKUI SYLLABLE M182 VI;Lo;0;R;;;;;N;;;;; -1E8BA;MENDE KIKAKUI SYLLABLE M185 VA;Lo;0;R;;;;;N;;;;; -1E8BB;MENDE KIKAKUI SYLLABLE M151 VU;Lo;0;R;;;;;N;;;;; -1E8BC;MENDE KIKAKUI SYLLABLE M173 VEE;Lo;0;R;;;;;N;;;;; -1E8BD;MENDE KIKAKUI SYLLABLE M085 VE;Lo;0;R;;;;;N;;;;; -1E8BE;MENDE KIKAKUI SYLLABLE M144 VOO;Lo;0;R;;;;;N;;;;; -1E8BF;MENDE KIKAKUI SYLLABLE M077 VO;Lo;0;R;;;;;N;;;;; -1E8C0;MENDE KIKAKUI SYLLABLE M164 NYIN;Lo;0;R;;;;;N;;;;; -1E8C1;MENDE KIKAKUI SYLLABLE M058 NYAN;Lo;0;R;;;;;N;;;;; -1E8C2;MENDE KIKAKUI SYLLABLE M170 NYUN;Lo;0;R;;;;;N;;;;; -1E8C3;MENDE KIKAKUI SYLLABLE M098 NYEN;Lo;0;R;;;;;N;;;;; -1E8C4;MENDE KIKAKUI SYLLABLE M060 NYON;Lo;0;R;;;;;N;;;;; -1E8C7;MENDE KIKAKUI DIGIT ONE;No;0;R;;;;1;N;;;;; -1E8C8;MENDE KIKAKUI DIGIT TWO;No;0;R;;;;2;N;;;;; -1E8C9;MENDE KIKAKUI DIGIT THREE;No;0;R;;;;3;N;;;;; -1E8CA;MENDE KIKAKUI DIGIT FOUR;No;0;R;;;;4;N;;;;; -1E8CB;MENDE KIKAKUI DIGIT FIVE;No;0;R;;;;5;N;;;;; -1E8CC;MENDE KIKAKUI DIGIT SIX;No;0;R;;;;6;N;;;;; -1E8CD;MENDE KIKAKUI DIGIT SEVEN;No;0;R;;;;7;N;;;;; -1E8CE;MENDE KIKAKUI DIGIT EIGHT;No;0;R;;;;8;N;;;;; -1E8CF;MENDE KIKAKUI DIGIT NINE;No;0;R;;;;9;N;;;;; -1E8D0;MENDE KIKAKUI COMBINING NUMBER TEENS;Mn;220;NSM;;;;;N;;;;; -1E8D1;MENDE KIKAKUI COMBINING NUMBER TENS;Mn;220;NSM;;;;;N;;;;; -1E8D2;MENDE KIKAKUI COMBINING NUMBER HUNDREDS;Mn;220;NSM;;;;;N;;;;; -1E8D3;MENDE KIKAKUI COMBINING NUMBER THOUSANDS;Mn;220;NSM;;;;;N;;;;; -1E8D4;MENDE KIKAKUI COMBINING NUMBER TEN THOUSANDS;Mn;220;NSM;;;;;N;;;;; -1E8D5;MENDE KIKAKUI COMBINING NUMBER HUNDRED THOUSANDS;Mn;220;NSM;;;;;N;;;;; -1E8D6;MENDE KIKAKUI COMBINING NUMBER MILLIONS;Mn;220;NSM;;;;;N;;;;; -1EE00;ARABIC MATHEMATICAL ALEF;Lo;0;AL; 0627;;;;N;;;;; -1EE01;ARABIC MATHEMATICAL BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE02;ARABIC MATHEMATICAL JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE03;ARABIC MATHEMATICAL DAL;Lo;0;AL; 062F;;;;N;;;;; -1EE05;ARABIC MATHEMATICAL WAW;Lo;0;AL; 0648;;;;N;;;;; -1EE06;ARABIC MATHEMATICAL ZAIN;Lo;0;AL; 0632;;;;N;;;;; -1EE07;ARABIC MATHEMATICAL HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE08;ARABIC MATHEMATICAL TAH;Lo;0;AL; 0637;;;;N;;;;; -1EE09;ARABIC MATHEMATICAL YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE0A;ARABIC MATHEMATICAL KAF;Lo;0;AL; 0643;;;;N;;;;; -1EE0B;ARABIC MATHEMATICAL LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE0C;ARABIC MATHEMATICAL MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE0D;ARABIC MATHEMATICAL NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE0E;ARABIC MATHEMATICAL SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE0F;ARABIC MATHEMATICAL AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE10;ARABIC MATHEMATICAL FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE11;ARABIC MATHEMATICAL SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE12;ARABIC MATHEMATICAL QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE13;ARABIC MATHEMATICAL REH;Lo;0;AL; 0631;;;;N;;;;; -1EE14;ARABIC MATHEMATICAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE15;ARABIC MATHEMATICAL TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE16;ARABIC MATHEMATICAL THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE17;ARABIC MATHEMATICAL KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE18;ARABIC MATHEMATICAL THAL;Lo;0;AL; 0630;;;;N;;;;; -1EE19;ARABIC MATHEMATICAL DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE1A;ARABIC MATHEMATICAL ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EE1B;ARABIC MATHEMATICAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE1C;ARABIC MATHEMATICAL DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; -1EE1D;ARABIC MATHEMATICAL DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; -1EE1E;ARABIC MATHEMATICAL DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; -1EE1F;ARABIC MATHEMATICAL DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; -1EE21;ARABIC MATHEMATICAL INITIAL BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE22;ARABIC MATHEMATICAL INITIAL JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE24;ARABIC MATHEMATICAL INITIAL HEH;Lo;0;AL; 0647;;;;N;;;;; -1EE27;ARABIC MATHEMATICAL INITIAL HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE29;ARABIC MATHEMATICAL INITIAL YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE2A;ARABIC MATHEMATICAL INITIAL KAF;Lo;0;AL; 0643;;;;N;;;;; -1EE2B;ARABIC MATHEMATICAL INITIAL LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE2C;ARABIC MATHEMATICAL INITIAL MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE2D;ARABIC MATHEMATICAL INITIAL NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE2E;ARABIC MATHEMATICAL INITIAL SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE2F;ARABIC MATHEMATICAL INITIAL AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE30;ARABIC MATHEMATICAL INITIAL FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE31;ARABIC MATHEMATICAL INITIAL SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE32;ARABIC MATHEMATICAL INITIAL QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE34;ARABIC MATHEMATICAL INITIAL SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE35;ARABIC MATHEMATICAL INITIAL TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE36;ARABIC MATHEMATICAL INITIAL THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE37;ARABIC MATHEMATICAL INITIAL KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE39;ARABIC MATHEMATICAL INITIAL DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE3B;ARABIC MATHEMATICAL INITIAL GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE42;ARABIC MATHEMATICAL TAILED JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE47;ARABIC MATHEMATICAL TAILED HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE49;ARABIC MATHEMATICAL TAILED YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE4B;ARABIC MATHEMATICAL TAILED LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE4D;ARABIC MATHEMATICAL TAILED NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE4E;ARABIC MATHEMATICAL TAILED SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE4F;ARABIC MATHEMATICAL TAILED AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE51;ARABIC MATHEMATICAL TAILED SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE52;ARABIC MATHEMATICAL TAILED QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE54;ARABIC MATHEMATICAL TAILED SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE57;ARABIC MATHEMATICAL TAILED KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE59;ARABIC MATHEMATICAL TAILED DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE5B;ARABIC MATHEMATICAL TAILED GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE5D;ARABIC MATHEMATICAL TAILED DOTLESS NOON;Lo;0;AL; 06BA;;;;N;;;;; -1EE5F;ARABIC MATHEMATICAL TAILED DOTLESS QAF;Lo;0;AL; 066F;;;;N;;;;; -1EE61;ARABIC MATHEMATICAL STRETCHED BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE62;ARABIC MATHEMATICAL STRETCHED JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE64;ARABIC MATHEMATICAL STRETCHED HEH;Lo;0;AL; 0647;;;;N;;;;; -1EE67;ARABIC MATHEMATICAL STRETCHED HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE68;ARABIC MATHEMATICAL STRETCHED TAH;Lo;0;AL; 0637;;;;N;;;;; -1EE69;ARABIC MATHEMATICAL STRETCHED YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE6A;ARABIC MATHEMATICAL STRETCHED KAF;Lo;0;AL; 0643;;;;N;;;;; -1EE6C;ARABIC MATHEMATICAL STRETCHED MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE6D;ARABIC MATHEMATICAL STRETCHED NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE6E;ARABIC MATHEMATICAL STRETCHED SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE6F;ARABIC MATHEMATICAL STRETCHED AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE70;ARABIC MATHEMATICAL STRETCHED FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE71;ARABIC MATHEMATICAL STRETCHED SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE72;ARABIC MATHEMATICAL STRETCHED QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE74;ARABIC MATHEMATICAL STRETCHED SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE75;ARABIC MATHEMATICAL STRETCHED TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE76;ARABIC MATHEMATICAL STRETCHED THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE77;ARABIC MATHEMATICAL STRETCHED KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE79;ARABIC MATHEMATICAL STRETCHED DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE7A;ARABIC MATHEMATICAL STRETCHED ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EE7B;ARABIC MATHEMATICAL STRETCHED GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EE7C;ARABIC MATHEMATICAL STRETCHED DOTLESS BEH;Lo;0;AL; 066E;;;;N;;;;; -1EE7E;ARABIC MATHEMATICAL STRETCHED DOTLESS FEH;Lo;0;AL; 06A1;;;;N;;;;; -1EE80;ARABIC MATHEMATICAL LOOPED ALEF;Lo;0;AL; 0627;;;;N;;;;; -1EE81;ARABIC MATHEMATICAL LOOPED BEH;Lo;0;AL; 0628;;;;N;;;;; -1EE82;ARABIC MATHEMATICAL LOOPED JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EE83;ARABIC MATHEMATICAL LOOPED DAL;Lo;0;AL; 062F;;;;N;;;;; -1EE84;ARABIC MATHEMATICAL LOOPED HEH;Lo;0;AL; 0647;;;;N;;;;; -1EE85;ARABIC MATHEMATICAL LOOPED WAW;Lo;0;AL; 0648;;;;N;;;;; -1EE86;ARABIC MATHEMATICAL LOOPED ZAIN;Lo;0;AL; 0632;;;;N;;;;; -1EE87;ARABIC MATHEMATICAL LOOPED HAH;Lo;0;AL; 062D;;;;N;;;;; -1EE88;ARABIC MATHEMATICAL LOOPED TAH;Lo;0;AL; 0637;;;;N;;;;; -1EE89;ARABIC MATHEMATICAL LOOPED YEH;Lo;0;AL; 064A;;;;N;;;;; -1EE8B;ARABIC MATHEMATICAL LOOPED LAM;Lo;0;AL; 0644;;;;N;;;;; -1EE8C;ARABIC MATHEMATICAL LOOPED MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EE8D;ARABIC MATHEMATICAL LOOPED NOON;Lo;0;AL; 0646;;;;N;;;;; -1EE8E;ARABIC MATHEMATICAL LOOPED SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EE8F;ARABIC MATHEMATICAL LOOPED AIN;Lo;0;AL; 0639;;;;N;;;;; -1EE90;ARABIC MATHEMATICAL LOOPED FEH;Lo;0;AL; 0641;;;;N;;;;; -1EE91;ARABIC MATHEMATICAL LOOPED SAD;Lo;0;AL; 0635;;;;N;;;;; -1EE92;ARABIC MATHEMATICAL LOOPED QAF;Lo;0;AL; 0642;;;;N;;;;; -1EE93;ARABIC MATHEMATICAL LOOPED REH;Lo;0;AL; 0631;;;;N;;;;; -1EE94;ARABIC MATHEMATICAL LOOPED SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EE95;ARABIC MATHEMATICAL LOOPED TEH;Lo;0;AL; 062A;;;;N;;;;; -1EE96;ARABIC MATHEMATICAL LOOPED THEH;Lo;0;AL; 062B;;;;N;;;;; -1EE97;ARABIC MATHEMATICAL LOOPED KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EE98;ARABIC MATHEMATICAL LOOPED THAL;Lo;0;AL; 0630;;;;N;;;;; -1EE99;ARABIC MATHEMATICAL LOOPED DAD;Lo;0;AL; 0636;;;;N;;;;; -1EE9A;ARABIC MATHEMATICAL LOOPED ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EE9B;ARABIC MATHEMATICAL LOOPED GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EEA1;ARABIC MATHEMATICAL DOUBLE-STRUCK BEH;Lo;0;AL; 0628;;;;N;;;;; -1EEA2;ARABIC MATHEMATICAL DOUBLE-STRUCK JEEM;Lo;0;AL; 062C;;;;N;;;;; -1EEA3;ARABIC MATHEMATICAL DOUBLE-STRUCK DAL;Lo;0;AL; 062F;;;;N;;;;; -1EEA5;ARABIC MATHEMATICAL DOUBLE-STRUCK WAW;Lo;0;AL; 0648;;;;N;;;;; -1EEA6;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAIN;Lo;0;AL; 0632;;;;N;;;;; -1EEA7;ARABIC MATHEMATICAL DOUBLE-STRUCK HAH;Lo;0;AL; 062D;;;;N;;;;; -1EEA8;ARABIC MATHEMATICAL DOUBLE-STRUCK TAH;Lo;0;AL; 0637;;;;N;;;;; -1EEA9;ARABIC MATHEMATICAL DOUBLE-STRUCK YEH;Lo;0;AL; 064A;;;;N;;;;; -1EEAB;ARABIC MATHEMATICAL DOUBLE-STRUCK LAM;Lo;0;AL; 0644;;;;N;;;;; -1EEAC;ARABIC MATHEMATICAL DOUBLE-STRUCK MEEM;Lo;0;AL; 0645;;;;N;;;;; -1EEAD;ARABIC MATHEMATICAL DOUBLE-STRUCK NOON;Lo;0;AL; 0646;;;;N;;;;; -1EEAE;ARABIC MATHEMATICAL DOUBLE-STRUCK SEEN;Lo;0;AL; 0633;;;;N;;;;; -1EEAF;ARABIC MATHEMATICAL DOUBLE-STRUCK AIN;Lo;0;AL; 0639;;;;N;;;;; -1EEB0;ARABIC MATHEMATICAL DOUBLE-STRUCK FEH;Lo;0;AL; 0641;;;;N;;;;; -1EEB1;ARABIC MATHEMATICAL DOUBLE-STRUCK SAD;Lo;0;AL; 0635;;;;N;;;;; -1EEB2;ARABIC MATHEMATICAL DOUBLE-STRUCK QAF;Lo;0;AL; 0642;;;;N;;;;; -1EEB3;ARABIC MATHEMATICAL DOUBLE-STRUCK REH;Lo;0;AL; 0631;;;;N;;;;; -1EEB4;ARABIC MATHEMATICAL DOUBLE-STRUCK SHEEN;Lo;0;AL; 0634;;;;N;;;;; -1EEB5;ARABIC MATHEMATICAL DOUBLE-STRUCK TEH;Lo;0;AL; 062A;;;;N;;;;; -1EEB6;ARABIC MATHEMATICAL DOUBLE-STRUCK THEH;Lo;0;AL; 062B;;;;N;;;;; -1EEB7;ARABIC MATHEMATICAL DOUBLE-STRUCK KHAH;Lo;0;AL; 062E;;;;N;;;;; -1EEB8;ARABIC MATHEMATICAL DOUBLE-STRUCK THAL;Lo;0;AL; 0630;;;;N;;;;; -1EEB9;ARABIC MATHEMATICAL DOUBLE-STRUCK DAD;Lo;0;AL; 0636;;;;N;;;;; -1EEBA;ARABIC MATHEMATICAL DOUBLE-STRUCK ZAH;Lo;0;AL; 0638;;;;N;;;;; -1EEBB;ARABIC MATHEMATICAL DOUBLE-STRUCK GHAIN;Lo;0;AL; 063A;;;;N;;;;; -1EEF0;ARABIC MATHEMATICAL OPERATOR MEEM WITH HAH WITH TATWEEL;Sm;0;ON;;;;;N;;;;; -1EEF1;ARABIC MATHEMATICAL OPERATOR HAH WITH DAL;Sm;0;ON;;;;;N;;;;; -1F000;MAHJONG TILE EAST WIND;So;0;ON;;;;;N;;;;; -1F001;MAHJONG TILE SOUTH WIND;So;0;ON;;;;;N;;;;; -1F002;MAHJONG TILE WEST WIND;So;0;ON;;;;;N;;;;; -1F003;MAHJONG TILE NORTH WIND;So;0;ON;;;;;N;;;;; -1F004;MAHJONG TILE RED DRAGON;So;0;ON;;;;;N;;;;; -1F005;MAHJONG TILE GREEN DRAGON;So;0;ON;;;;;N;;;;; -1F006;MAHJONG TILE WHITE DRAGON;So;0;ON;;;;;N;;;;; -1F007;MAHJONG TILE ONE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F008;MAHJONG TILE TWO OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F009;MAHJONG TILE THREE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00A;MAHJONG TILE FOUR OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00B;MAHJONG TILE FIVE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00C;MAHJONG TILE SIX OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00D;MAHJONG TILE SEVEN OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00E;MAHJONG TILE EIGHT OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F00F;MAHJONG TILE NINE OF CHARACTERS;So;0;ON;;;;;N;;;;; -1F010;MAHJONG TILE ONE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F011;MAHJONG TILE TWO OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F012;MAHJONG TILE THREE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F013;MAHJONG TILE FOUR OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F014;MAHJONG TILE FIVE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F015;MAHJONG TILE SIX OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F016;MAHJONG TILE SEVEN OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F017;MAHJONG TILE EIGHT OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F018;MAHJONG TILE NINE OF BAMBOOS;So;0;ON;;;;;N;;;;; -1F019;MAHJONG TILE ONE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01A;MAHJONG TILE TWO OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01B;MAHJONG TILE THREE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01C;MAHJONG TILE FOUR OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01D;MAHJONG TILE FIVE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01E;MAHJONG TILE SIX OF CIRCLES;So;0;ON;;;;;N;;;;; -1F01F;MAHJONG TILE SEVEN OF CIRCLES;So;0;ON;;;;;N;;;;; -1F020;MAHJONG TILE EIGHT OF CIRCLES;So;0;ON;;;;;N;;;;; -1F021;MAHJONG TILE NINE OF CIRCLES;So;0;ON;;;;;N;;;;; -1F022;MAHJONG TILE PLUM;So;0;ON;;;;;N;;;;; -1F023;MAHJONG TILE ORCHID;So;0;ON;;;;;N;;;;; -1F024;MAHJONG TILE BAMBOO;So;0;ON;;;;;N;;;;; -1F025;MAHJONG TILE CHRYSANTHEMUM;So;0;ON;;;;;N;;;;; -1F026;MAHJONG TILE SPRING;So;0;ON;;;;;N;;;;; -1F027;MAHJONG TILE SUMMER;So;0;ON;;;;;N;;;;; -1F028;MAHJONG TILE AUTUMN;So;0;ON;;;;;N;;;;; -1F029;MAHJONG TILE WINTER;So;0;ON;;;;;N;;;;; -1F02A;MAHJONG TILE JOKER;So;0;ON;;;;;N;;;;; -1F02B;MAHJONG TILE BACK;So;0;ON;;;;;N;;;;; -1F030;DOMINO TILE HORIZONTAL BACK;So;0;ON;;;;;N;;;;; -1F031;DOMINO TILE HORIZONTAL-00-00;So;0;ON;;;;;N;;;;; -1F032;DOMINO TILE HORIZONTAL-00-01;So;0;ON;;;;;N;;;;; -1F033;DOMINO TILE HORIZONTAL-00-02;So;0;ON;;;;;N;;;;; -1F034;DOMINO TILE HORIZONTAL-00-03;So;0;ON;;;;;N;;;;; -1F035;DOMINO TILE HORIZONTAL-00-04;So;0;ON;;;;;N;;;;; -1F036;DOMINO TILE HORIZONTAL-00-05;So;0;ON;;;;;N;;;;; -1F037;DOMINO TILE HORIZONTAL-00-06;So;0;ON;;;;;N;;;;; -1F038;DOMINO TILE HORIZONTAL-01-00;So;0;ON;;;;;N;;;;; -1F039;DOMINO TILE HORIZONTAL-01-01;So;0;ON;;;;;N;;;;; -1F03A;DOMINO TILE HORIZONTAL-01-02;So;0;ON;;;;;N;;;;; -1F03B;DOMINO TILE HORIZONTAL-01-03;So;0;ON;;;;;N;;;;; -1F03C;DOMINO TILE HORIZONTAL-01-04;So;0;ON;;;;;N;;;;; -1F03D;DOMINO TILE HORIZONTAL-01-05;So;0;ON;;;;;N;;;;; -1F03E;DOMINO TILE HORIZONTAL-01-06;So;0;ON;;;;;N;;;;; -1F03F;DOMINO TILE HORIZONTAL-02-00;So;0;ON;;;;;N;;;;; -1F040;DOMINO TILE HORIZONTAL-02-01;So;0;ON;;;;;N;;;;; -1F041;DOMINO TILE HORIZONTAL-02-02;So;0;ON;;;;;N;;;;; -1F042;DOMINO TILE HORIZONTAL-02-03;So;0;ON;;;;;N;;;;; -1F043;DOMINO TILE HORIZONTAL-02-04;So;0;ON;;;;;N;;;;; -1F044;DOMINO TILE HORIZONTAL-02-05;So;0;ON;;;;;N;;;;; -1F045;DOMINO TILE HORIZONTAL-02-06;So;0;ON;;;;;N;;;;; -1F046;DOMINO TILE HORIZONTAL-03-00;So;0;ON;;;;;N;;;;; -1F047;DOMINO TILE HORIZONTAL-03-01;So;0;ON;;;;;N;;;;; -1F048;DOMINO TILE HORIZONTAL-03-02;So;0;ON;;;;;N;;;;; -1F049;DOMINO TILE HORIZONTAL-03-03;So;0;ON;;;;;N;;;;; -1F04A;DOMINO TILE HORIZONTAL-03-04;So;0;ON;;;;;N;;;;; -1F04B;DOMINO TILE HORIZONTAL-03-05;So;0;ON;;;;;N;;;;; -1F04C;DOMINO TILE HORIZONTAL-03-06;So;0;ON;;;;;N;;;;; -1F04D;DOMINO TILE HORIZONTAL-04-00;So;0;ON;;;;;N;;;;; -1F04E;DOMINO TILE HORIZONTAL-04-01;So;0;ON;;;;;N;;;;; -1F04F;DOMINO TILE HORIZONTAL-04-02;So;0;ON;;;;;N;;;;; -1F050;DOMINO TILE HORIZONTAL-04-03;So;0;ON;;;;;N;;;;; -1F051;DOMINO TILE HORIZONTAL-04-04;So;0;ON;;;;;N;;;;; -1F052;DOMINO TILE HORIZONTAL-04-05;So;0;ON;;;;;N;;;;; -1F053;DOMINO TILE HORIZONTAL-04-06;So;0;ON;;;;;N;;;;; -1F054;DOMINO TILE HORIZONTAL-05-00;So;0;ON;;;;;N;;;;; -1F055;DOMINO TILE HORIZONTAL-05-01;So;0;ON;;;;;N;;;;; -1F056;DOMINO TILE HORIZONTAL-05-02;So;0;ON;;;;;N;;;;; -1F057;DOMINO TILE HORIZONTAL-05-03;So;0;ON;;;;;N;;;;; -1F058;DOMINO TILE HORIZONTAL-05-04;So;0;ON;;;;;N;;;;; -1F059;DOMINO TILE HORIZONTAL-05-05;So;0;ON;;;;;N;;;;; -1F05A;DOMINO TILE HORIZONTAL-05-06;So;0;ON;;;;;N;;;;; -1F05B;DOMINO TILE HORIZONTAL-06-00;So;0;ON;;;;;N;;;;; -1F05C;DOMINO TILE HORIZONTAL-06-01;So;0;ON;;;;;N;;;;; -1F05D;DOMINO TILE HORIZONTAL-06-02;So;0;ON;;;;;N;;;;; -1F05E;DOMINO TILE HORIZONTAL-06-03;So;0;ON;;;;;N;;;;; -1F05F;DOMINO TILE HORIZONTAL-06-04;So;0;ON;;;;;N;;;;; -1F060;DOMINO TILE HORIZONTAL-06-05;So;0;ON;;;;;N;;;;; -1F061;DOMINO TILE HORIZONTAL-06-06;So;0;ON;;;;;N;;;;; -1F062;DOMINO TILE VERTICAL BACK;So;0;ON;;;;;N;;;;; -1F063;DOMINO TILE VERTICAL-00-00;So;0;ON;;;;;N;;;;; -1F064;DOMINO TILE VERTICAL-00-01;So;0;ON;;;;;N;;;;; -1F065;DOMINO TILE VERTICAL-00-02;So;0;ON;;;;;N;;;;; -1F066;DOMINO TILE VERTICAL-00-03;So;0;ON;;;;;N;;;;; -1F067;DOMINO TILE VERTICAL-00-04;So;0;ON;;;;;N;;;;; -1F068;DOMINO TILE VERTICAL-00-05;So;0;ON;;;;;N;;;;; -1F069;DOMINO TILE VERTICAL-00-06;So;0;ON;;;;;N;;;;; -1F06A;DOMINO TILE VERTICAL-01-00;So;0;ON;;;;;N;;;;; -1F06B;DOMINO TILE VERTICAL-01-01;So;0;ON;;;;;N;;;;; -1F06C;DOMINO TILE VERTICAL-01-02;So;0;ON;;;;;N;;;;; -1F06D;DOMINO TILE VERTICAL-01-03;So;0;ON;;;;;N;;;;; -1F06E;DOMINO TILE VERTICAL-01-04;So;0;ON;;;;;N;;;;; -1F06F;DOMINO TILE VERTICAL-01-05;So;0;ON;;;;;N;;;;; -1F070;DOMINO TILE VERTICAL-01-06;So;0;ON;;;;;N;;;;; -1F071;DOMINO TILE VERTICAL-02-00;So;0;ON;;;;;N;;;;; -1F072;DOMINO TILE VERTICAL-02-01;So;0;ON;;;;;N;;;;; -1F073;DOMINO TILE VERTICAL-02-02;So;0;ON;;;;;N;;;;; -1F074;DOMINO TILE VERTICAL-02-03;So;0;ON;;;;;N;;;;; -1F075;DOMINO TILE VERTICAL-02-04;So;0;ON;;;;;N;;;;; -1F076;DOMINO TILE VERTICAL-02-05;So;0;ON;;;;;N;;;;; -1F077;DOMINO TILE VERTICAL-02-06;So;0;ON;;;;;N;;;;; -1F078;DOMINO TILE VERTICAL-03-00;So;0;ON;;;;;N;;;;; -1F079;DOMINO TILE VERTICAL-03-01;So;0;ON;;;;;N;;;;; -1F07A;DOMINO TILE VERTICAL-03-02;So;0;ON;;;;;N;;;;; -1F07B;DOMINO TILE VERTICAL-03-03;So;0;ON;;;;;N;;;;; -1F07C;DOMINO TILE VERTICAL-03-04;So;0;ON;;;;;N;;;;; -1F07D;DOMINO TILE VERTICAL-03-05;So;0;ON;;;;;N;;;;; -1F07E;DOMINO TILE VERTICAL-03-06;So;0;ON;;;;;N;;;;; -1F07F;DOMINO TILE VERTICAL-04-00;So;0;ON;;;;;N;;;;; -1F080;DOMINO TILE VERTICAL-04-01;So;0;ON;;;;;N;;;;; -1F081;DOMINO TILE VERTICAL-04-02;So;0;ON;;;;;N;;;;; -1F082;DOMINO TILE VERTICAL-04-03;So;0;ON;;;;;N;;;;; -1F083;DOMINO TILE VERTICAL-04-04;So;0;ON;;;;;N;;;;; -1F084;DOMINO TILE VERTICAL-04-05;So;0;ON;;;;;N;;;;; -1F085;DOMINO TILE VERTICAL-04-06;So;0;ON;;;;;N;;;;; -1F086;DOMINO TILE VERTICAL-05-00;So;0;ON;;;;;N;;;;; -1F087;DOMINO TILE VERTICAL-05-01;So;0;ON;;;;;N;;;;; -1F088;DOMINO TILE VERTICAL-05-02;So;0;ON;;;;;N;;;;; -1F089;DOMINO TILE VERTICAL-05-03;So;0;ON;;;;;N;;;;; -1F08A;DOMINO TILE VERTICAL-05-04;So;0;ON;;;;;N;;;;; -1F08B;DOMINO TILE VERTICAL-05-05;So;0;ON;;;;;N;;;;; -1F08C;DOMINO TILE VERTICAL-05-06;So;0;ON;;;;;N;;;;; -1F08D;DOMINO TILE VERTICAL-06-00;So;0;ON;;;;;N;;;;; -1F08E;DOMINO TILE VERTICAL-06-01;So;0;ON;;;;;N;;;;; -1F08F;DOMINO TILE VERTICAL-06-02;So;0;ON;;;;;N;;;;; -1F090;DOMINO TILE VERTICAL-06-03;So;0;ON;;;;;N;;;;; -1F091;DOMINO TILE VERTICAL-06-04;So;0;ON;;;;;N;;;;; -1F092;DOMINO TILE VERTICAL-06-05;So;0;ON;;;;;N;;;;; -1F093;DOMINO TILE VERTICAL-06-06;So;0;ON;;;;;N;;;;; -1F0A0;PLAYING CARD BACK;So;0;ON;;;;;N;;;;; -1F0A1;PLAYING CARD ACE OF SPADES;So;0;ON;;;;;N;;;;; -1F0A2;PLAYING CARD TWO OF SPADES;So;0;ON;;;;;N;;;;; -1F0A3;PLAYING CARD THREE OF SPADES;So;0;ON;;;;;N;;;;; -1F0A4;PLAYING CARD FOUR OF SPADES;So;0;ON;;;;;N;;;;; -1F0A5;PLAYING CARD FIVE OF SPADES;So;0;ON;;;;;N;;;;; -1F0A6;PLAYING CARD SIX OF SPADES;So;0;ON;;;;;N;;;;; -1F0A7;PLAYING CARD SEVEN OF SPADES;So;0;ON;;;;;N;;;;; -1F0A8;PLAYING CARD EIGHT OF SPADES;So;0;ON;;;;;N;;;;; -1F0A9;PLAYING CARD NINE OF SPADES;So;0;ON;;;;;N;;;;; -1F0AA;PLAYING CARD TEN OF SPADES;So;0;ON;;;;;N;;;;; -1F0AB;PLAYING CARD JACK OF SPADES;So;0;ON;;;;;N;;;;; -1F0AC;PLAYING CARD KNIGHT OF SPADES;So;0;ON;;;;;N;;;;; -1F0AD;PLAYING CARD QUEEN OF SPADES;So;0;ON;;;;;N;;;;; -1F0AE;PLAYING CARD KING OF SPADES;So;0;ON;;;;;N;;;;; -1F0B1;PLAYING CARD ACE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B2;PLAYING CARD TWO OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B3;PLAYING CARD THREE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B4;PLAYING CARD FOUR OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B5;PLAYING CARD FIVE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B6;PLAYING CARD SIX OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B7;PLAYING CARD SEVEN OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B8;PLAYING CARD EIGHT OF HEARTS;So;0;ON;;;;;N;;;;; -1F0B9;PLAYING CARD NINE OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BA;PLAYING CARD TEN OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BB;PLAYING CARD JACK OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BC;PLAYING CARD KNIGHT OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BD;PLAYING CARD QUEEN OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BE;PLAYING CARD KING OF HEARTS;So;0;ON;;;;;N;;;;; -1F0BF;PLAYING CARD RED JOKER;So;0;ON;;;;;N;;;;; -1F0C1;PLAYING CARD ACE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C2;PLAYING CARD TWO OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C3;PLAYING CARD THREE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C4;PLAYING CARD FOUR OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C5;PLAYING CARD FIVE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C6;PLAYING CARD SIX OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C7;PLAYING CARD SEVEN OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C8;PLAYING CARD EIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0C9;PLAYING CARD NINE OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CA;PLAYING CARD TEN OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CB;PLAYING CARD JACK OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CC;PLAYING CARD KNIGHT OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CD;PLAYING CARD QUEEN OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CE;PLAYING CARD KING OF DIAMONDS;So;0;ON;;;;;N;;;;; -1F0CF;PLAYING CARD BLACK JOKER;So;0;ON;;;;;N;;;;; -1F0D1;PLAYING CARD ACE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D2;PLAYING CARD TWO OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D3;PLAYING CARD THREE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D4;PLAYING CARD FOUR OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D5;PLAYING CARD FIVE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D6;PLAYING CARD SIX OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D7;PLAYING CARD SEVEN OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D8;PLAYING CARD EIGHT OF CLUBS;So;0;ON;;;;;N;;;;; -1F0D9;PLAYING CARD NINE OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DA;PLAYING CARD TEN OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DB;PLAYING CARD JACK OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DC;PLAYING CARD KNIGHT OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DD;PLAYING CARD QUEEN OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DE;PLAYING CARD KING OF CLUBS;So;0;ON;;;;;N;;;;; -1F0DF;PLAYING CARD WHITE JOKER;So;0;ON;;;;;N;;;;; -1F0E0;PLAYING CARD FOOL;So;0;ON;;;;;N;;;;; -1F0E1;PLAYING CARD TRUMP-1;So;0;ON;;;;;N;;;;; -1F0E2;PLAYING CARD TRUMP-2;So;0;ON;;;;;N;;;;; -1F0E3;PLAYING CARD TRUMP-3;So;0;ON;;;;;N;;;;; -1F0E4;PLAYING CARD TRUMP-4;So;0;ON;;;;;N;;;;; -1F0E5;PLAYING CARD TRUMP-5;So;0;ON;;;;;N;;;;; -1F0E6;PLAYING CARD TRUMP-6;So;0;ON;;;;;N;;;;; -1F0E7;PLAYING CARD TRUMP-7;So;0;ON;;;;;N;;;;; -1F0E8;PLAYING CARD TRUMP-8;So;0;ON;;;;;N;;;;; -1F0E9;PLAYING CARD TRUMP-9;So;0;ON;;;;;N;;;;; -1F0EA;PLAYING CARD TRUMP-10;So;0;ON;;;;;N;;;;; -1F0EB;PLAYING CARD TRUMP-11;So;0;ON;;;;;N;;;;; -1F0EC;PLAYING CARD TRUMP-12;So;0;ON;;;;;N;;;;; -1F0ED;PLAYING CARD TRUMP-13;So;0;ON;;;;;N;;;;; -1F0EE;PLAYING CARD TRUMP-14;So;0;ON;;;;;N;;;;; -1F0EF;PLAYING CARD TRUMP-15;So;0;ON;;;;;N;;;;; -1F0F0;PLAYING CARD TRUMP-16;So;0;ON;;;;;N;;;;; -1F0F1;PLAYING CARD TRUMP-17;So;0;ON;;;;;N;;;;; -1F0F2;PLAYING CARD TRUMP-18;So;0;ON;;;;;N;;;;; -1F0F3;PLAYING CARD TRUMP-19;So;0;ON;;;;;N;;;;; -1F0F4;PLAYING CARD TRUMP-20;So;0;ON;;;;;N;;;;; -1F0F5;PLAYING CARD TRUMP-21;So;0;ON;;;;;N;;;;; -1F100;DIGIT ZERO FULL STOP;No;0;EN; 0030 002E;;0;0;N;;;;; -1F101;DIGIT ZERO COMMA;No;0;EN; 0030 002C;;0;0;N;;;;; -1F102;DIGIT ONE COMMA;No;0;EN; 0031 002C;;1;1;N;;;;; -1F103;DIGIT TWO COMMA;No;0;EN; 0032 002C;;2;2;N;;;;; -1F104;DIGIT THREE COMMA;No;0;EN; 0033 002C;;3;3;N;;;;; -1F105;DIGIT FOUR COMMA;No;0;EN; 0034 002C;;4;4;N;;;;; -1F106;DIGIT FIVE COMMA;No;0;EN; 0035 002C;;5;5;N;;;;; -1F107;DIGIT SIX COMMA;No;0;EN; 0036 002C;;6;6;N;;;;; -1F108;DIGIT SEVEN COMMA;No;0;EN; 0037 002C;;7;7;N;;;;; -1F109;DIGIT EIGHT COMMA;No;0;EN; 0038 002C;;8;8;N;;;;; -1F10A;DIGIT NINE COMMA;No;0;EN; 0039 002C;;9;9;N;;;;; -1F10B;DINGBAT CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; -1F10C;DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ZERO;No;0;ON;;;;0;N;;;;; -1F110;PARENTHESIZED LATIN CAPITAL LETTER A;So;0;L; 0028 0041 0029;;;;N;;;;; -1F111;PARENTHESIZED LATIN CAPITAL LETTER B;So;0;L; 0028 0042 0029;;;;N;;;;; -1F112;PARENTHESIZED LATIN CAPITAL LETTER C;So;0;L; 0028 0043 0029;;;;N;;;;; -1F113;PARENTHESIZED LATIN CAPITAL LETTER D;So;0;L; 0028 0044 0029;;;;N;;;;; -1F114;PARENTHESIZED LATIN CAPITAL LETTER E;So;0;L; 0028 0045 0029;;;;N;;;;; -1F115;PARENTHESIZED LATIN CAPITAL LETTER F;So;0;L; 0028 0046 0029;;;;N;;;;; -1F116;PARENTHESIZED LATIN CAPITAL LETTER G;So;0;L; 0028 0047 0029;;;;N;;;;; -1F117;PARENTHESIZED LATIN CAPITAL LETTER H;So;0;L; 0028 0048 0029;;;;N;;;;; -1F118;PARENTHESIZED LATIN CAPITAL LETTER I;So;0;L; 0028 0049 0029;;;;N;;;;; -1F119;PARENTHESIZED LATIN CAPITAL LETTER J;So;0;L; 0028 004A 0029;;;;N;;;;; -1F11A;PARENTHESIZED LATIN CAPITAL LETTER K;So;0;L; 0028 004B 0029;;;;N;;;;; -1F11B;PARENTHESIZED LATIN CAPITAL LETTER L;So;0;L; 0028 004C 0029;;;;N;;;;; -1F11C;PARENTHESIZED LATIN CAPITAL LETTER M;So;0;L; 0028 004D 0029;;;;N;;;;; -1F11D;PARENTHESIZED LATIN CAPITAL LETTER N;So;0;L; 0028 004E 0029;;;;N;;;;; -1F11E;PARENTHESIZED LATIN CAPITAL LETTER O;So;0;L; 0028 004F 0029;;;;N;;;;; -1F11F;PARENTHESIZED LATIN CAPITAL LETTER P;So;0;L; 0028 0050 0029;;;;N;;;;; -1F120;PARENTHESIZED LATIN CAPITAL LETTER Q;So;0;L; 0028 0051 0029;;;;N;;;;; -1F121;PARENTHESIZED LATIN CAPITAL LETTER R;So;0;L; 0028 0052 0029;;;;N;;;;; -1F122;PARENTHESIZED LATIN CAPITAL LETTER S;So;0;L; 0028 0053 0029;;;;N;;;;; -1F123;PARENTHESIZED LATIN CAPITAL LETTER T;So;0;L; 0028 0054 0029;;;;N;;;;; -1F124;PARENTHESIZED LATIN CAPITAL LETTER U;So;0;L; 0028 0055 0029;;;;N;;;;; -1F125;PARENTHESIZED LATIN CAPITAL LETTER V;So;0;L; 0028 0056 0029;;;;N;;;;; -1F126;PARENTHESIZED LATIN CAPITAL LETTER W;So;0;L; 0028 0057 0029;;;;N;;;;; -1F127;PARENTHESIZED LATIN CAPITAL LETTER X;So;0;L; 0028 0058 0029;;;;N;;;;; -1F128;PARENTHESIZED LATIN CAPITAL LETTER Y;So;0;L; 0028 0059 0029;;;;N;;;;; -1F129;PARENTHESIZED LATIN CAPITAL LETTER Z;So;0;L; 0028 005A 0029;;;;N;;;;; -1F12A;TORTOISE SHELL BRACKETED LATIN CAPITAL LETTER S;So;0;L; 3014 0053 3015;;;;N;;;;; -1F12B;CIRCLED ITALIC LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; -1F12C;CIRCLED ITALIC LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; -1F12D;CIRCLED CD;So;0;L; 0043 0044;;;;N;;;;; -1F12E;CIRCLED WZ;So;0;L; 0057 005A;;;;N;;;;; -1F130;SQUARED LATIN CAPITAL LETTER A;So;0;L; 0041;;;;N;;;;; -1F131;SQUARED LATIN CAPITAL LETTER B;So;0;L; 0042;;;;N;;;;; -1F132;SQUARED LATIN CAPITAL LETTER C;So;0;L; 0043;;;;N;;;;; -1F133;SQUARED LATIN CAPITAL LETTER D;So;0;L; 0044;;;;N;;;;; -1F134;SQUARED LATIN CAPITAL LETTER E;So;0;L; 0045;;;;N;;;;; -1F135;SQUARED LATIN CAPITAL LETTER F;So;0;L; 0046;;;;N;;;;; -1F136;SQUARED LATIN CAPITAL LETTER G;So;0;L; 0047;;;;N;;;;; -1F137;SQUARED LATIN CAPITAL LETTER H;So;0;L; 0048;;;;N;;;;; -1F138;SQUARED LATIN CAPITAL LETTER I;So;0;L; 0049;;;;N;;;;; -1F139;SQUARED LATIN CAPITAL LETTER J;So;0;L; 004A;;;;N;;;;; -1F13A;SQUARED LATIN CAPITAL LETTER K;So;0;L; 004B;;;;N;;;;; -1F13B;SQUARED LATIN CAPITAL LETTER L;So;0;L; 004C;;;;N;;;;; -1F13C;SQUARED LATIN CAPITAL LETTER M;So;0;L; 004D;;;;N;;;;; -1F13D;SQUARED LATIN CAPITAL LETTER N;So;0;L; 004E;;;;N;;;;; -1F13E;SQUARED LATIN CAPITAL LETTER O;So;0;L; 004F;;;;N;;;;; -1F13F;SQUARED LATIN CAPITAL LETTER P;So;0;L; 0050;;;;N;;;;; -1F140;SQUARED LATIN CAPITAL LETTER Q;So;0;L; 0051;;;;N;;;;; -1F141;SQUARED LATIN CAPITAL LETTER R;So;0;L; 0052;;;;N;;;;; -1F142;SQUARED LATIN CAPITAL LETTER S;So;0;L; 0053;;;;N;;;;; -1F143;SQUARED LATIN CAPITAL LETTER T;So;0;L; 0054;;;;N;;;;; -1F144;SQUARED LATIN CAPITAL LETTER U;So;0;L; 0055;;;;N;;;;; -1F145;SQUARED LATIN CAPITAL LETTER V;So;0;L; 0056;;;;N;;;;; -1F146;SQUARED LATIN CAPITAL LETTER W;So;0;L; 0057;;;;N;;;;; -1F147;SQUARED LATIN CAPITAL LETTER X;So;0;L; 0058;;;;N;;;;; -1F148;SQUARED LATIN CAPITAL LETTER Y;So;0;L; 0059;;;;N;;;;; -1F149;SQUARED LATIN CAPITAL LETTER Z;So;0;L; 005A;;;;N;;;;; -1F14A;SQUARED HV;So;0;L; 0048 0056;;;;N;;;;; -1F14B;SQUARED MV;So;0;L; 004D 0056;;;;N;;;;; -1F14C;SQUARED SD;So;0;L; 0053 0044;;;;N;;;;; -1F14D;SQUARED SS;So;0;L; 0053 0053;;;;N;;;;; -1F14E;SQUARED PPV;So;0;L; 0050 0050 0056;;;;N;;;;; -1F14F;SQUARED WC;So;0;L; 0057 0043;;;;N;;;;; -1F150;NEGATIVE CIRCLED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; -1F151;NEGATIVE CIRCLED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; -1F152;NEGATIVE CIRCLED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; -1F153;NEGATIVE CIRCLED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; -1F154;NEGATIVE CIRCLED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; -1F155;NEGATIVE CIRCLED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; -1F156;NEGATIVE CIRCLED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; -1F157;NEGATIVE CIRCLED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; -1F158;NEGATIVE CIRCLED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; -1F159;NEGATIVE CIRCLED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; -1F15A;NEGATIVE CIRCLED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; -1F15B;NEGATIVE CIRCLED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; -1F15C;NEGATIVE CIRCLED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; -1F15D;NEGATIVE CIRCLED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; -1F15E;NEGATIVE CIRCLED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; -1F15F;NEGATIVE CIRCLED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; -1F160;NEGATIVE CIRCLED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; -1F161;NEGATIVE CIRCLED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; -1F162;NEGATIVE CIRCLED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; -1F163;NEGATIVE CIRCLED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; -1F164;NEGATIVE CIRCLED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; -1F165;NEGATIVE CIRCLED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; -1F166;NEGATIVE CIRCLED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; -1F167;NEGATIVE CIRCLED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; -1F168;NEGATIVE CIRCLED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; -1F169;NEGATIVE CIRCLED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; -1F16A;RAISED MC SIGN;So;0;ON; 004D 0043;;;;N;;;;; -1F16B;RAISED MD SIGN;So;0;ON; 004D 0044;;;;N;;;;; -1F170;NEGATIVE SQUARED LATIN CAPITAL LETTER A;So;0;L;;;;;N;;;;; -1F171;NEGATIVE SQUARED LATIN CAPITAL LETTER B;So;0;L;;;;;N;;;;; -1F172;NEGATIVE SQUARED LATIN CAPITAL LETTER C;So;0;L;;;;;N;;;;; -1F173;NEGATIVE SQUARED LATIN CAPITAL LETTER D;So;0;L;;;;;N;;;;; -1F174;NEGATIVE SQUARED LATIN CAPITAL LETTER E;So;0;L;;;;;N;;;;; -1F175;NEGATIVE SQUARED LATIN CAPITAL LETTER F;So;0;L;;;;;N;;;;; -1F176;NEGATIVE SQUARED LATIN CAPITAL LETTER G;So;0;L;;;;;N;;;;; -1F177;NEGATIVE SQUARED LATIN CAPITAL LETTER H;So;0;L;;;;;N;;;;; -1F178;NEGATIVE SQUARED LATIN CAPITAL LETTER I;So;0;L;;;;;N;;;;; -1F179;NEGATIVE SQUARED LATIN CAPITAL LETTER J;So;0;L;;;;;N;;;;; -1F17A;NEGATIVE SQUARED LATIN CAPITAL LETTER K;So;0;L;;;;;N;;;;; -1F17B;NEGATIVE SQUARED LATIN CAPITAL LETTER L;So;0;L;;;;;N;;;;; -1F17C;NEGATIVE SQUARED LATIN CAPITAL LETTER M;So;0;L;;;;;N;;;;; -1F17D;NEGATIVE SQUARED LATIN CAPITAL LETTER N;So;0;L;;;;;N;;;;; -1F17E;NEGATIVE SQUARED LATIN CAPITAL LETTER O;So;0;L;;;;;N;;;;; -1F17F;NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; -1F180;NEGATIVE SQUARED LATIN CAPITAL LETTER Q;So;0;L;;;;;N;;;;; -1F181;NEGATIVE SQUARED LATIN CAPITAL LETTER R;So;0;L;;;;;N;;;;; -1F182;NEGATIVE SQUARED LATIN CAPITAL LETTER S;So;0;L;;;;;N;;;;; -1F183;NEGATIVE SQUARED LATIN CAPITAL LETTER T;So;0;L;;;;;N;;;;; -1F184;NEGATIVE SQUARED LATIN CAPITAL LETTER U;So;0;L;;;;;N;;;;; -1F185;NEGATIVE SQUARED LATIN CAPITAL LETTER V;So;0;L;;;;;N;;;;; -1F186;NEGATIVE SQUARED LATIN CAPITAL LETTER W;So;0;L;;;;;N;;;;; -1F187;NEGATIVE SQUARED LATIN CAPITAL LETTER X;So;0;L;;;;;N;;;;; -1F188;NEGATIVE SQUARED LATIN CAPITAL LETTER Y;So;0;L;;;;;N;;;;; -1F189;NEGATIVE SQUARED LATIN CAPITAL LETTER Z;So;0;L;;;;;N;;;;; -1F18A;CROSSED NEGATIVE SQUARED LATIN CAPITAL LETTER P;So;0;L;;;;;N;;;;; -1F18B;NEGATIVE SQUARED IC;So;0;L;;;;;N;;;;; -1F18C;NEGATIVE SQUARED PA;So;0;L;;;;;N;;;;; -1F18D;NEGATIVE SQUARED SA;So;0;L;;;;;N;;;;; -1F18E;NEGATIVE SQUARED AB;So;0;L;;;;;N;;;;; -1F18F;NEGATIVE SQUARED WC;So;0;L;;;;;N;;;;; -1F190;SQUARE DJ;So;0;L; 0044 004A;;;;N;;;;; -1F191;SQUARED CL;So;0;L;;;;;N;;;;; -1F192;SQUARED COOL;So;0;L;;;;;N;;;;; -1F193;SQUARED FREE;So;0;L;;;;;N;;;;; -1F194;SQUARED ID;So;0;L;;;;;N;;;;; -1F195;SQUARED NEW;So;0;L;;;;;N;;;;; -1F196;SQUARED NG;So;0;L;;;;;N;;;;; -1F197;SQUARED OK;So;0;L;;;;;N;;;;; -1F198;SQUARED SOS;So;0;L;;;;;N;;;;; -1F199;SQUARED UP WITH EXCLAMATION MARK;So;0;L;;;;;N;;;;; -1F19A;SQUARED VS;So;0;L;;;;;N;;;;; -1F1E6;REGIONAL INDICATOR SYMBOL LETTER A;So;0;L;;;;;N;;;;; -1F1E7;REGIONAL INDICATOR SYMBOL LETTER B;So;0;L;;;;;N;;;;; -1F1E8;REGIONAL INDICATOR SYMBOL LETTER C;So;0;L;;;;;N;;;;; -1F1E9;REGIONAL INDICATOR SYMBOL LETTER D;So;0;L;;;;;N;;;;; -1F1EA;REGIONAL INDICATOR SYMBOL LETTER E;So;0;L;;;;;N;;;;; -1F1EB;REGIONAL INDICATOR SYMBOL LETTER F;So;0;L;;;;;N;;;;; -1F1EC;REGIONAL INDICATOR SYMBOL LETTER G;So;0;L;;;;;N;;;;; -1F1ED;REGIONAL INDICATOR SYMBOL LETTER H;So;0;L;;;;;N;;;;; -1F1EE;REGIONAL INDICATOR SYMBOL LETTER I;So;0;L;;;;;N;;;;; -1F1EF;REGIONAL INDICATOR SYMBOL LETTER J;So;0;L;;;;;N;;;;; -1F1F0;REGIONAL INDICATOR SYMBOL LETTER K;So;0;L;;;;;N;;;;; -1F1F1;REGIONAL INDICATOR SYMBOL LETTER L;So;0;L;;;;;N;;;;; -1F1F2;REGIONAL INDICATOR SYMBOL LETTER M;So;0;L;;;;;N;;;;; -1F1F3;REGIONAL INDICATOR SYMBOL LETTER N;So;0;L;;;;;N;;;;; -1F1F4;REGIONAL INDICATOR SYMBOL LETTER O;So;0;L;;;;;N;;;;; -1F1F5;REGIONAL INDICATOR SYMBOL LETTER P;So;0;L;;;;;N;;;;; -1F1F6;REGIONAL INDICATOR SYMBOL LETTER Q;So;0;L;;;;;N;;;;; -1F1F7;REGIONAL INDICATOR SYMBOL LETTER R;So;0;L;;;;;N;;;;; -1F1F8;REGIONAL INDICATOR SYMBOL LETTER S;So;0;L;;;;;N;;;;; -1F1F9;REGIONAL INDICATOR SYMBOL LETTER T;So;0;L;;;;;N;;;;; -1F1FA;REGIONAL INDICATOR SYMBOL LETTER U;So;0;L;;;;;N;;;;; -1F1FB;REGIONAL INDICATOR SYMBOL LETTER V;So;0;L;;;;;N;;;;; -1F1FC;REGIONAL INDICATOR SYMBOL LETTER W;So;0;L;;;;;N;;;;; -1F1FD;REGIONAL INDICATOR SYMBOL LETTER X;So;0;L;;;;;N;;;;; -1F1FE;REGIONAL INDICATOR SYMBOL LETTER Y;So;0;L;;;;;N;;;;; -1F1FF;REGIONAL INDICATOR SYMBOL LETTER Z;So;0;L;;;;;N;;;;; -1F200;SQUARE HIRAGANA HOKA;So;0;L; 307B 304B;;;;N;;;;; -1F201;SQUARED KATAKANA KOKO;So;0;L; 30B3 30B3;;;;N;;;;; -1F202;SQUARED KATAKANA SA;So;0;L; 30B5;;;;N;;;;; -1F210;SQUARED CJK UNIFIED IDEOGRAPH-624B;So;0;L; 624B;;;;N;;;;; -1F211;SQUARED CJK UNIFIED IDEOGRAPH-5B57;So;0;L; 5B57;;;;N;;;;; -1F212;SQUARED CJK UNIFIED IDEOGRAPH-53CC;So;0;L; 53CC;;;;N;;;;; -1F213;SQUARED KATAKANA DE;So;0;L; 30C7;;;;N;;;;; -1F214;SQUARED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 4E8C;;;;N;;;;; -1F215;SQUARED CJK UNIFIED IDEOGRAPH-591A;So;0;L; 591A;;;;N;;;;; -1F216;SQUARED CJK UNIFIED IDEOGRAPH-89E3;So;0;L; 89E3;;;;N;;;;; -1F217;SQUARED CJK UNIFIED IDEOGRAPH-5929;So;0;L; 5929;;;;N;;;;; -1F218;SQUARED CJK UNIFIED IDEOGRAPH-4EA4;So;0;L; 4EA4;;;;N;;;;; -1F219;SQUARED CJK UNIFIED IDEOGRAPH-6620;So;0;L; 6620;;;;N;;;;; -1F21A;SQUARED CJK UNIFIED IDEOGRAPH-7121;So;0;L; 7121;;;;N;;;;; -1F21B;SQUARED CJK UNIFIED IDEOGRAPH-6599;So;0;L; 6599;;;;N;;;;; -1F21C;SQUARED CJK UNIFIED IDEOGRAPH-524D;So;0;L; 524D;;;;N;;;;; -1F21D;SQUARED CJK UNIFIED IDEOGRAPH-5F8C;So;0;L; 5F8C;;;;N;;;;; -1F21E;SQUARED CJK UNIFIED IDEOGRAPH-518D;So;0;L; 518D;;;;N;;;;; -1F21F;SQUARED CJK UNIFIED IDEOGRAPH-65B0;So;0;L; 65B0;;;;N;;;;; -1F220;SQUARED CJK UNIFIED IDEOGRAPH-521D;So;0;L; 521D;;;;N;;;;; -1F221;SQUARED CJK UNIFIED IDEOGRAPH-7D42;So;0;L; 7D42;;;;N;;;;; -1F222;SQUARED CJK UNIFIED IDEOGRAPH-751F;So;0;L; 751F;;;;N;;;;; -1F223;SQUARED CJK UNIFIED IDEOGRAPH-8CA9;So;0;L; 8CA9;;;;N;;;;; -1F224;SQUARED CJK UNIFIED IDEOGRAPH-58F0;So;0;L; 58F0;;;;N;;;;; -1F225;SQUARED CJK UNIFIED IDEOGRAPH-5439;So;0;L; 5439;;;;N;;;;; -1F226;SQUARED CJK UNIFIED IDEOGRAPH-6F14;So;0;L; 6F14;;;;N;;;;; -1F227;SQUARED CJK UNIFIED IDEOGRAPH-6295;So;0;L; 6295;;;;N;;;;; -1F228;SQUARED CJK UNIFIED IDEOGRAPH-6355;So;0;L; 6355;;;;N;;;;; -1F229;SQUARED CJK UNIFIED IDEOGRAPH-4E00;So;0;L; 4E00;;;;N;;;;; -1F22A;SQUARED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 4E09;;;;N;;;;; -1F22B;SQUARED CJK UNIFIED IDEOGRAPH-904A;So;0;L; 904A;;;;N;;;;; -1F22C;SQUARED CJK UNIFIED IDEOGRAPH-5DE6;So;0;L; 5DE6;;;;N;;;;; -1F22D;SQUARED CJK UNIFIED IDEOGRAPH-4E2D;So;0;L; 4E2D;;;;N;;;;; -1F22E;SQUARED CJK UNIFIED IDEOGRAPH-53F3;So;0;L; 53F3;;;;N;;;;; -1F22F;SQUARED CJK UNIFIED IDEOGRAPH-6307;So;0;L; 6307;;;;N;;;;; -1F230;SQUARED CJK UNIFIED IDEOGRAPH-8D70;So;0;L; 8D70;;;;N;;;;; -1F231;SQUARED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 6253;;;;N;;;;; -1F232;SQUARED CJK UNIFIED IDEOGRAPH-7981;So;0;L; 7981;;;;N;;;;; -1F233;SQUARED CJK UNIFIED IDEOGRAPH-7A7A;So;0;L; 7A7A;;;;N;;;;; -1F234;SQUARED CJK UNIFIED IDEOGRAPH-5408;So;0;L; 5408;;;;N;;;;; -1F235;SQUARED CJK UNIFIED IDEOGRAPH-6E80;So;0;L; 6E80;;;;N;;;;; -1F236;SQUARED CJK UNIFIED IDEOGRAPH-6709;So;0;L; 6709;;;;N;;;;; -1F237;SQUARED CJK UNIFIED IDEOGRAPH-6708;So;0;L; 6708;;;;N;;;;; -1F238;SQUARED CJK UNIFIED IDEOGRAPH-7533;So;0;L; 7533;;;;N;;;;; -1F239;SQUARED CJK UNIFIED IDEOGRAPH-5272;So;0;L; 5272;;;;N;;;;; -1F23A;SQUARED CJK UNIFIED IDEOGRAPH-55B6;So;0;L; 55B6;;;;N;;;;; -1F240;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-672C;So;0;L; 3014 672C 3015;;;;N;;;;; -1F241;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E09;So;0;L; 3014 4E09 3015;;;;N;;;;; -1F242;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-4E8C;So;0;L; 3014 4E8C 3015;;;;N;;;;; -1F243;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-5B89;So;0;L; 3014 5B89 3015;;;;N;;;;; -1F244;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-70B9;So;0;L; 3014 70B9 3015;;;;N;;;;; -1F245;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6253;So;0;L; 3014 6253 3015;;;;N;;;;; -1F246;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-76D7;So;0;L; 3014 76D7 3015;;;;N;;;;; -1F247;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-52DD;So;0;L; 3014 52DD 3015;;;;N;;;;; -1F248;TORTOISE SHELL BRACKETED CJK UNIFIED IDEOGRAPH-6557;So;0;L; 3014 6557 3015;;;;N;;;;; -1F250;CIRCLED IDEOGRAPH ADVANTAGE;So;0;L; 5F97;;;;N;;;;; -1F251;CIRCLED IDEOGRAPH ACCEPT;So;0;L; 53EF;;;;N;;;;; -1F300;CYCLONE;So;0;ON;;;;;N;;;;; -1F301;FOGGY;So;0;ON;;;;;N;;;;; -1F302;CLOSED UMBRELLA;So;0;ON;;;;;N;;;;; -1F303;NIGHT WITH STARS;So;0;ON;;;;;N;;;;; -1F304;SUNRISE OVER MOUNTAINS;So;0;ON;;;;;N;;;;; -1F305;SUNRISE;So;0;ON;;;;;N;;;;; -1F306;CITYSCAPE AT DUSK;So;0;ON;;;;;N;;;;; -1F307;SUNSET OVER BUILDINGS;So;0;ON;;;;;N;;;;; -1F308;RAINBOW;So;0;ON;;;;;N;;;;; -1F309;BRIDGE AT NIGHT;So;0;ON;;;;;N;;;;; -1F30A;WATER WAVE;So;0;ON;;;;;N;;;;; -1F30B;VOLCANO;So;0;ON;;;;;N;;;;; -1F30C;MILKY WAY;So;0;ON;;;;;N;;;;; -1F30D;EARTH GLOBE EUROPE-AFRICA;So;0;ON;;;;;N;;;;; -1F30E;EARTH GLOBE AMERICAS;So;0;ON;;;;;N;;;;; -1F30F;EARTH GLOBE ASIA-AUSTRALIA;So;0;ON;;;;;N;;;;; -1F310;GLOBE WITH MERIDIANS;So;0;ON;;;;;N;;;;; -1F311;NEW MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F312;WAXING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F313;FIRST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F314;WAXING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F315;FULL MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F316;WANING GIBBOUS MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F317;LAST QUARTER MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F318;WANING CRESCENT MOON SYMBOL;So;0;ON;;;;;N;;;;; -1F319;CRESCENT MOON;So;0;ON;;;;;N;;;;; -1F31A;NEW MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31B;FIRST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31C;LAST QUARTER MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31D;FULL MOON WITH FACE;So;0;ON;;;;;N;;;;; -1F31E;SUN WITH FACE;So;0;ON;;;;;N;;;;; -1F31F;GLOWING STAR;So;0;ON;;;;;N;;;;; -1F320;SHOOTING STAR;So;0;ON;;;;;N;;;;; -1F321;THERMOMETER;So;0;ON;;;;;N;;;;; -1F322;BLACK DROPLET;So;0;ON;;;;;N;;;;; -1F323;WHITE SUN;So;0;ON;;;;;N;;;;; -1F324;WHITE SUN WITH SMALL CLOUD;So;0;ON;;;;;N;;;;; -1F325;WHITE SUN BEHIND CLOUD;So;0;ON;;;;;N;;;;; -1F326;WHITE SUN BEHIND CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; -1F327;CLOUD WITH RAIN;So;0;ON;;;;;N;;;;; -1F328;CLOUD WITH SNOW;So;0;ON;;;;;N;;;;; -1F329;CLOUD WITH LIGHTNING;So;0;ON;;;;;N;;;;; -1F32A;CLOUD WITH TORNADO;So;0;ON;;;;;N;;;;; -1F32B;FOG;So;0;ON;;;;;N;;;;; -1F32C;WIND BLOWING FACE;So;0;ON;;;;;N;;;;; -1F32D;HOT DOG;So;0;ON;;;;;N;;;;; -1F32E;TACO;So;0;ON;;;;;N;;;;; -1F32F;BURRITO;So;0;ON;;;;;N;;;;; -1F330;CHESTNUT;So;0;ON;;;;;N;;;;; -1F331;SEEDLING;So;0;ON;;;;;N;;;;; -1F332;EVERGREEN TREE;So;0;ON;;;;;N;;;;; -1F333;DECIDUOUS TREE;So;0;ON;;;;;N;;;;; -1F334;PALM TREE;So;0;ON;;;;;N;;;;; -1F335;CACTUS;So;0;ON;;;;;N;;;;; -1F336;HOT PEPPER;So;0;ON;;;;;N;;;;; -1F337;TULIP;So;0;ON;;;;;N;;;;; -1F338;CHERRY BLOSSOM;So;0;ON;;;;;N;;;;; -1F339;ROSE;So;0;ON;;;;;N;;;;; -1F33A;HIBISCUS;So;0;ON;;;;;N;;;;; -1F33B;SUNFLOWER;So;0;ON;;;;;N;;;;; -1F33C;BLOSSOM;So;0;ON;;;;;N;;;;; -1F33D;EAR OF MAIZE;So;0;ON;;;;;N;;;;; -1F33E;EAR OF RICE;So;0;ON;;;;;N;;;;; -1F33F;HERB;So;0;ON;;;;;N;;;;; -1F340;FOUR LEAF CLOVER;So;0;ON;;;;;N;;;;; -1F341;MAPLE LEAF;So;0;ON;;;;;N;;;;; -1F342;FALLEN LEAF;So;0;ON;;;;;N;;;;; -1F343;LEAF FLUTTERING IN WIND;So;0;ON;;;;;N;;;;; -1F344;MUSHROOM;So;0;ON;;;;;N;;;;; -1F345;TOMATO;So;0;ON;;;;;N;;;;; -1F346;AUBERGINE;So;0;ON;;;;;N;;;;; -1F347;GRAPES;So;0;ON;;;;;N;;;;; -1F348;MELON;So;0;ON;;;;;N;;;;; -1F349;WATERMELON;So;0;ON;;;;;N;;;;; -1F34A;TANGERINE;So;0;ON;;;;;N;;;;; -1F34B;LEMON;So;0;ON;;;;;N;;;;; -1F34C;BANANA;So;0;ON;;;;;N;;;;; -1F34D;PINEAPPLE;So;0;ON;;;;;N;;;;; -1F34E;RED APPLE;So;0;ON;;;;;N;;;;; -1F34F;GREEN APPLE;So;0;ON;;;;;N;;;;; -1F350;PEAR;So;0;ON;;;;;N;;;;; -1F351;PEACH;So;0;ON;;;;;N;;;;; -1F352;CHERRIES;So;0;ON;;;;;N;;;;; -1F353;STRAWBERRY;So;0;ON;;;;;N;;;;; -1F354;HAMBURGER;So;0;ON;;;;;N;;;;; -1F355;SLICE OF PIZZA;So;0;ON;;;;;N;;;;; -1F356;MEAT ON BONE;So;0;ON;;;;;N;;;;; -1F357;POULTRY LEG;So;0;ON;;;;;N;;;;; -1F358;RICE CRACKER;So;0;ON;;;;;N;;;;; -1F359;RICE BALL;So;0;ON;;;;;N;;;;; -1F35A;COOKED RICE;So;0;ON;;;;;N;;;;; -1F35B;CURRY AND RICE;So;0;ON;;;;;N;;;;; -1F35C;STEAMING BOWL;So;0;ON;;;;;N;;;;; -1F35D;SPAGHETTI;So;0;ON;;;;;N;;;;; -1F35E;BREAD;So;0;ON;;;;;N;;;;; -1F35F;FRENCH FRIES;So;0;ON;;;;;N;;;;; -1F360;ROASTED SWEET POTATO;So;0;ON;;;;;N;;;;; -1F361;DANGO;So;0;ON;;;;;N;;;;; -1F362;ODEN;So;0;ON;;;;;N;;;;; -1F363;SUSHI;So;0;ON;;;;;N;;;;; -1F364;FRIED SHRIMP;So;0;ON;;;;;N;;;;; -1F365;FISH CAKE WITH SWIRL DESIGN;So;0;ON;;;;;N;;;;; -1F366;SOFT ICE CREAM;So;0;ON;;;;;N;;;;; -1F367;SHAVED ICE;So;0;ON;;;;;N;;;;; -1F368;ICE CREAM;So;0;ON;;;;;N;;;;; -1F369;DOUGHNUT;So;0;ON;;;;;N;;;;; -1F36A;COOKIE;So;0;ON;;;;;N;;;;; -1F36B;CHOCOLATE BAR;So;0;ON;;;;;N;;;;; -1F36C;CANDY;So;0;ON;;;;;N;;;;; -1F36D;LOLLIPOP;So;0;ON;;;;;N;;;;; -1F36E;CUSTARD;So;0;ON;;;;;N;;;;; -1F36F;HONEY POT;So;0;ON;;;;;N;;;;; -1F370;SHORTCAKE;So;0;ON;;;;;N;;;;; -1F371;BENTO BOX;So;0;ON;;;;;N;;;;; -1F372;POT OF FOOD;So;0;ON;;;;;N;;;;; -1F373;COOKING;So;0;ON;;;;;N;;;;; -1F374;FORK AND KNIFE;So;0;ON;;;;;N;;;;; -1F375;TEACUP WITHOUT HANDLE;So;0;ON;;;;;N;;;;; -1F376;SAKE BOTTLE AND CUP;So;0;ON;;;;;N;;;;; -1F377;WINE GLASS;So;0;ON;;;;;N;;;;; -1F378;COCKTAIL GLASS;So;0;ON;;;;;N;;;;; -1F379;TROPICAL DRINK;So;0;ON;;;;;N;;;;; -1F37A;BEER MUG;So;0;ON;;;;;N;;;;; -1F37B;CLINKING BEER MUGS;So;0;ON;;;;;N;;;;; -1F37C;BABY BOTTLE;So;0;ON;;;;;N;;;;; -1F37D;FORK AND KNIFE WITH PLATE;So;0;ON;;;;;N;;;;; -1F37E;BOTTLE WITH POPPING CORK;So;0;ON;;;;;N;;;;; -1F37F;POPCORN;So;0;ON;;;;;N;;;;; -1F380;RIBBON;So;0;ON;;;;;N;;;;; -1F381;WRAPPED PRESENT;So;0;ON;;;;;N;;;;; -1F382;BIRTHDAY CAKE;So;0;ON;;;;;N;;;;; -1F383;JACK-O-LANTERN;So;0;ON;;;;;N;;;;; -1F384;CHRISTMAS TREE;So;0;ON;;;;;N;;;;; -1F385;FATHER CHRISTMAS;So;0;ON;;;;;N;;;;; -1F386;FIREWORKS;So;0;ON;;;;;N;;;;; -1F387;FIREWORK SPARKLER;So;0;ON;;;;;N;;;;; -1F388;BALLOON;So;0;ON;;;;;N;;;;; -1F389;PARTY POPPER;So;0;ON;;;;;N;;;;; -1F38A;CONFETTI BALL;So;0;ON;;;;;N;;;;; -1F38B;TANABATA TREE;So;0;ON;;;;;N;;;;; -1F38C;CROSSED FLAGS;So;0;ON;;;;;N;;;;; -1F38D;PINE DECORATION;So;0;ON;;;;;N;;;;; -1F38E;JAPANESE DOLLS;So;0;ON;;;;;N;;;;; -1F38F;CARP STREAMER;So;0;ON;;;;;N;;;;; -1F390;WIND CHIME;So;0;ON;;;;;N;;;;; -1F391;MOON VIEWING CEREMONY;So;0;ON;;;;;N;;;;; -1F392;SCHOOL SATCHEL;So;0;ON;;;;;N;;;;; -1F393;GRADUATION CAP;So;0;ON;;;;;N;;;;; -1F394;HEART WITH TIP ON THE LEFT;So;0;ON;;;;;N;;;;; -1F395;BOUQUET OF FLOWERS;So;0;ON;;;;;N;;;;; -1F396;MILITARY MEDAL;So;0;ON;;;;;N;;;;; -1F397;REMINDER RIBBON;So;0;ON;;;;;N;;;;; -1F398;MUSICAL KEYBOARD WITH JACKS;So;0;ON;;;;;N;;;;; -1F399;STUDIO MICROPHONE;So;0;ON;;;;;N;;;;; -1F39A;LEVEL SLIDER;So;0;ON;;;;;N;;;;; -1F39B;CONTROL KNOBS;So;0;ON;;;;;N;;;;; -1F39C;BEAMED ASCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; -1F39D;BEAMED DESCENDING MUSICAL NOTES;So;0;ON;;;;;N;;;;; -1F39E;FILM FRAMES;So;0;ON;;;;;N;;;;; -1F39F;ADMISSION TICKETS;So;0;ON;;;;;N;;;;; -1F3A0;CAROUSEL HORSE;So;0;ON;;;;;N;;;;; -1F3A1;FERRIS WHEEL;So;0;ON;;;;;N;;;;; -1F3A2;ROLLER COASTER;So;0;ON;;;;;N;;;;; -1F3A3;FISHING POLE AND FISH;So;0;ON;;;;;N;;;;; -1F3A4;MICROPHONE;So;0;ON;;;;;N;;;;; -1F3A5;MOVIE CAMERA;So;0;ON;;;;;N;;;;; -1F3A6;CINEMA;So;0;ON;;;;;N;;;;; -1F3A7;HEADPHONE;So;0;ON;;;;;N;;;;; -1F3A8;ARTIST PALETTE;So;0;ON;;;;;N;;;;; -1F3A9;TOP HAT;So;0;ON;;;;;N;;;;; -1F3AA;CIRCUS TENT;So;0;ON;;;;;N;;;;; -1F3AB;TICKET;So;0;ON;;;;;N;;;;; -1F3AC;CLAPPER BOARD;So;0;ON;;;;;N;;;;; -1F3AD;PERFORMING ARTS;So;0;ON;;;;;N;;;;; -1F3AE;VIDEO GAME;So;0;ON;;;;;N;;;;; -1F3AF;DIRECT HIT;So;0;ON;;;;;N;;;;; -1F3B0;SLOT MACHINE;So;0;ON;;;;;N;;;;; -1F3B1;BILLIARDS;So;0;ON;;;;;N;;;;; -1F3B2;GAME DIE;So;0;ON;;;;;N;;;;; -1F3B3;BOWLING;So;0;ON;;;;;N;;;;; -1F3B4;FLOWER PLAYING CARDS;So;0;ON;;;;;N;;;;; -1F3B5;MUSICAL NOTE;So;0;ON;;;;;N;;;;; -1F3B6;MULTIPLE MUSICAL NOTES;So;0;ON;;;;;N;;;;; -1F3B7;SAXOPHONE;So;0;ON;;;;;N;;;;; -1F3B8;GUITAR;So;0;ON;;;;;N;;;;; -1F3B9;MUSICAL KEYBOARD;So;0;ON;;;;;N;;;;; -1F3BA;TRUMPET;So;0;ON;;;;;N;;;;; -1F3BB;VIOLIN;So;0;ON;;;;;N;;;;; -1F3BC;MUSICAL SCORE;So;0;ON;;;;;N;;;;; -1F3BD;RUNNING SHIRT WITH SASH;So;0;ON;;;;;N;;;;; -1F3BE;TENNIS RACQUET AND BALL;So;0;ON;;;;;N;;;;; -1F3BF;SKI AND SKI BOOT;So;0;ON;;;;;N;;;;; -1F3C0;BASKETBALL AND HOOP;So;0;ON;;;;;N;;;;; -1F3C1;CHEQUERED FLAG;So;0;ON;;;;;N;;;;; -1F3C2;SNOWBOARDER;So;0;ON;;;;;N;;;;; -1F3C3;RUNNER;So;0;ON;;;;;N;;;;; -1F3C4;SURFER;So;0;ON;;;;;N;;;;; -1F3C5;SPORTS MEDAL;So;0;ON;;;;;N;;;;; -1F3C6;TROPHY;So;0;ON;;;;;N;;;;; -1F3C7;HORSE RACING;So;0;ON;;;;;N;;;;; -1F3C8;AMERICAN FOOTBALL;So;0;ON;;;;;N;;;;; -1F3C9;RUGBY FOOTBALL;So;0;ON;;;;;N;;;;; -1F3CA;SWIMMER;So;0;ON;;;;;N;;;;; -1F3CB;WEIGHT LIFTER;So;0;ON;;;;;N;;;;; -1F3CC;GOLFER;So;0;ON;;;;;N;;;;; -1F3CD;RACING MOTORCYCLE;So;0;ON;;;;;N;;;;; -1F3CE;RACING CAR;So;0;ON;;;;;N;;;;; -1F3CF;CRICKET BAT AND BALL;So;0;ON;;;;;N;;;;; -1F3D0;VOLLEYBALL;So;0;ON;;;;;N;;;;; -1F3D1;FIELD HOCKEY STICK AND BALL;So;0;ON;;;;;N;;;;; -1F3D2;ICE HOCKEY STICK AND PUCK;So;0;ON;;;;;N;;;;; -1F3D3;TABLE TENNIS PADDLE AND BALL;So;0;ON;;;;;N;;;;; -1F3D4;SNOW CAPPED MOUNTAIN;So;0;ON;;;;;N;;;;; -1F3D5;CAMPING;So;0;ON;;;;;N;;;;; -1F3D6;BEACH WITH UMBRELLA;So;0;ON;;;;;N;;;;; -1F3D7;BUILDING CONSTRUCTION;So;0;ON;;;;;N;;;;; -1F3D8;HOUSE BUILDINGS;So;0;ON;;;;;N;;;;; -1F3D9;CITYSCAPE;So;0;ON;;;;;N;;;;; -1F3DA;DERELICT HOUSE BUILDING;So;0;ON;;;;;N;;;;; -1F3DB;CLASSICAL BUILDING;So;0;ON;;;;;N;;;;; -1F3DC;DESERT;So;0;ON;;;;;N;;;;; -1F3DD;DESERT ISLAND;So;0;ON;;;;;N;;;;; -1F3DE;NATIONAL PARK;So;0;ON;;;;;N;;;;; -1F3DF;STADIUM;So;0;ON;;;;;N;;;;; -1F3E0;HOUSE BUILDING;So;0;ON;;;;;N;;;;; -1F3E1;HOUSE WITH GARDEN;So;0;ON;;;;;N;;;;; -1F3E2;OFFICE BUILDING;So;0;ON;;;;;N;;;;; -1F3E3;JAPANESE POST OFFICE;So;0;ON;;;;;N;;;;; -1F3E4;EUROPEAN POST OFFICE;So;0;ON;;;;;N;;;;; -1F3E5;HOSPITAL;So;0;ON;;;;;N;;;;; -1F3E6;BANK;So;0;ON;;;;;N;;;;; -1F3E7;AUTOMATED TELLER MACHINE;So;0;ON;;;;;N;;;;; -1F3E8;HOTEL;So;0;ON;;;;;N;;;;; -1F3E9;LOVE HOTEL;So;0;ON;;;;;N;;;;; -1F3EA;CONVENIENCE STORE;So;0;ON;;;;;N;;;;; -1F3EB;SCHOOL;So;0;ON;;;;;N;;;;; -1F3EC;DEPARTMENT STORE;So;0;ON;;;;;N;;;;; -1F3ED;FACTORY;So;0;ON;;;;;N;;;;; -1F3EE;IZAKAYA LANTERN;So;0;ON;;;;;N;;;;; -1F3EF;JAPANESE CASTLE;So;0;ON;;;;;N;;;;; -1F3F0;EUROPEAN CASTLE;So;0;ON;;;;;N;;;;; -1F3F1;WHITE PENNANT;So;0;ON;;;;;N;;;;; -1F3F2;BLACK PENNANT;So;0;ON;;;;;N;;;;; -1F3F3;WAVING WHITE FLAG;So;0;ON;;;;;N;;;;; -1F3F4;WAVING BLACK FLAG;So;0;ON;;;;;N;;;;; -1F3F5;ROSETTE;So;0;ON;;;;;N;;;;; -1F3F6;BLACK ROSETTE;So;0;ON;;;;;N;;;;; -1F3F7;LABEL;So;0;ON;;;;;N;;;;; -1F3F8;BADMINTON RACQUET AND SHUTTLECOCK;So;0;ON;;;;;N;;;;; -1F3F9;BOW AND ARROW;So;0;ON;;;;;N;;;;; -1F3FA;AMPHORA;So;0;ON;;;;;N;;;;; -1F3FB;EMOJI MODIFIER FITZPATRICK TYPE-1-2;Sk;0;ON;;;;;N;;;;; -1F3FC;EMOJI MODIFIER FITZPATRICK TYPE-3;Sk;0;ON;;;;;N;;;;; -1F3FD;EMOJI MODIFIER FITZPATRICK TYPE-4;Sk;0;ON;;;;;N;;;;; -1F3FE;EMOJI MODIFIER FITZPATRICK TYPE-5;Sk;0;ON;;;;;N;;;;; -1F3FF;EMOJI MODIFIER FITZPATRICK TYPE-6;Sk;0;ON;;;;;N;;;;; -1F400;RAT;So;0;ON;;;;;N;;;;; -1F401;MOUSE;So;0;ON;;;;;N;;;;; -1F402;OX;So;0;ON;;;;;N;;;;; -1F403;WATER BUFFALO;So;0;ON;;;;;N;;;;; -1F404;COW;So;0;ON;;;;;N;;;;; -1F405;TIGER;So;0;ON;;;;;N;;;;; -1F406;LEOPARD;So;0;ON;;;;;N;;;;; -1F407;RABBIT;So;0;ON;;;;;N;;;;; -1F408;CAT;So;0;ON;;;;;N;;;;; -1F409;DRAGON;So;0;ON;;;;;N;;;;; -1F40A;CROCODILE;So;0;ON;;;;;N;;;;; -1F40B;WHALE;So;0;ON;;;;;N;;;;; -1F40C;SNAIL;So;0;ON;;;;;N;;;;; -1F40D;SNAKE;So;0;ON;;;;;N;;;;; -1F40E;HORSE;So;0;ON;;;;;N;;;;; -1F40F;RAM;So;0;ON;;;;;N;;;;; -1F410;GOAT;So;0;ON;;;;;N;;;;; -1F411;SHEEP;So;0;ON;;;;;N;;;;; -1F412;MONKEY;So;0;ON;;;;;N;;;;; -1F413;ROOSTER;So;0;ON;;;;;N;;;;; -1F414;CHICKEN;So;0;ON;;;;;N;;;;; -1F415;DOG;So;0;ON;;;;;N;;;;; -1F416;PIG;So;0;ON;;;;;N;;;;; -1F417;BOAR;So;0;ON;;;;;N;;;;; -1F418;ELEPHANT;So;0;ON;;;;;N;;;;; -1F419;OCTOPUS;So;0;ON;;;;;N;;;;; -1F41A;SPIRAL SHELL;So;0;ON;;;;;N;;;;; -1F41B;BUG;So;0;ON;;;;;N;;;;; -1F41C;ANT;So;0;ON;;;;;N;;;;; -1F41D;HONEYBEE;So;0;ON;;;;;N;;;;; -1F41E;LADY BEETLE;So;0;ON;;;;;N;;;;; -1F41F;FISH;So;0;ON;;;;;N;;;;; -1F420;TROPICAL FISH;So;0;ON;;;;;N;;;;; -1F421;BLOWFISH;So;0;ON;;;;;N;;;;; -1F422;TURTLE;So;0;ON;;;;;N;;;;; -1F423;HATCHING CHICK;So;0;ON;;;;;N;;;;; -1F424;BABY CHICK;So;0;ON;;;;;N;;;;; -1F425;FRONT-FACING BABY CHICK;So;0;ON;;;;;N;;;;; -1F426;BIRD;So;0;ON;;;;;N;;;;; -1F427;PENGUIN;So;0;ON;;;;;N;;;;; -1F428;KOALA;So;0;ON;;;;;N;;;;; -1F429;POODLE;So;0;ON;;;;;N;;;;; -1F42A;DROMEDARY CAMEL;So;0;ON;;;;;N;;;;; -1F42B;BACTRIAN CAMEL;So;0;ON;;;;;N;;;;; -1F42C;DOLPHIN;So;0;ON;;;;;N;;;;; -1F42D;MOUSE FACE;So;0;ON;;;;;N;;;;; -1F42E;COW FACE;So;0;ON;;;;;N;;;;; -1F42F;TIGER FACE;So;0;ON;;;;;N;;;;; -1F430;RABBIT FACE;So;0;ON;;;;;N;;;;; -1F431;CAT FACE;So;0;ON;;;;;N;;;;; -1F432;DRAGON FACE;So;0;ON;;;;;N;;;;; -1F433;SPOUTING WHALE;So;0;ON;;;;;N;;;;; -1F434;HORSE FACE;So;0;ON;;;;;N;;;;; -1F435;MONKEY FACE;So;0;ON;;;;;N;;;;; -1F436;DOG FACE;So;0;ON;;;;;N;;;;; -1F437;PIG FACE;So;0;ON;;;;;N;;;;; -1F438;FROG FACE;So;0;ON;;;;;N;;;;; -1F439;HAMSTER FACE;So;0;ON;;;;;N;;;;; -1F43A;WOLF FACE;So;0;ON;;;;;N;;;;; -1F43B;BEAR FACE;So;0;ON;;;;;N;;;;; -1F43C;PANDA FACE;So;0;ON;;;;;N;;;;; -1F43D;PIG NOSE;So;0;ON;;;;;N;;;;; -1F43E;PAW PRINTS;So;0;ON;;;;;N;;;;; -1F43F;CHIPMUNK;So;0;ON;;;;;N;;;;; -1F440;EYES;So;0;ON;;;;;N;;;;; -1F441;EYE;So;0;ON;;;;;N;;;;; -1F442;EAR;So;0;ON;;;;;N;;;;; -1F443;NOSE;So;0;ON;;;;;N;;;;; -1F444;MOUTH;So;0;ON;;;;;N;;;;; -1F445;TONGUE;So;0;ON;;;;;N;;;;; -1F446;WHITE UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F447;WHITE DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F448;WHITE LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F449;WHITE RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F44A;FISTED HAND SIGN;So;0;ON;;;;;N;;;;; -1F44B;WAVING HAND SIGN;So;0;ON;;;;;N;;;;; -1F44C;OK HAND SIGN;So;0;ON;;;;;N;;;;; -1F44D;THUMBS UP SIGN;So;0;ON;;;;;N;;;;; -1F44E;THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; -1F44F;CLAPPING HANDS SIGN;So;0;ON;;;;;N;;;;; -1F450;OPEN HANDS SIGN;So;0;ON;;;;;N;;;;; -1F451;CROWN;So;0;ON;;;;;N;;;;; -1F452;WOMANS HAT;So;0;ON;;;;;N;;;;; -1F453;EYEGLASSES;So;0;ON;;;;;N;;;;; -1F454;NECKTIE;So;0;ON;;;;;N;;;;; -1F455;T-SHIRT;So;0;ON;;;;;N;;;;; -1F456;JEANS;So;0;ON;;;;;N;;;;; -1F457;DRESS;So;0;ON;;;;;N;;;;; -1F458;KIMONO;So;0;ON;;;;;N;;;;; -1F459;BIKINI;So;0;ON;;;;;N;;;;; -1F45A;WOMANS CLOTHES;So;0;ON;;;;;N;;;;; -1F45B;PURSE;So;0;ON;;;;;N;;;;; -1F45C;HANDBAG;So;0;ON;;;;;N;;;;; -1F45D;POUCH;So;0;ON;;;;;N;;;;; -1F45E;MANS SHOE;So;0;ON;;;;;N;;;;; -1F45F;ATHLETIC SHOE;So;0;ON;;;;;N;;;;; -1F460;HIGH-HEELED SHOE;So;0;ON;;;;;N;;;;; -1F461;WOMANS SANDAL;So;0;ON;;;;;N;;;;; -1F462;WOMANS BOOTS;So;0;ON;;;;;N;;;;; -1F463;FOOTPRINTS;So;0;ON;;;;;N;;;;; -1F464;BUST IN SILHOUETTE;So;0;ON;;;;;N;;;;; -1F465;BUSTS IN SILHOUETTE;So;0;ON;;;;;N;;;;; -1F466;BOY;So;0;ON;;;;;N;;;;; -1F467;GIRL;So;0;ON;;;;;N;;;;; -1F468;MAN;So;0;ON;;;;;N;;;;; -1F469;WOMAN;So;0;ON;;;;;N;;;;; -1F46A;FAMILY;So;0;ON;;;;;N;;;;; -1F46B;MAN AND WOMAN HOLDING HANDS;So;0;ON;;;;;N;;;;; -1F46C;TWO MEN HOLDING HANDS;So;0;ON;;;;;N;;;;; -1F46D;TWO WOMEN HOLDING HANDS;So;0;ON;;;;;N;;;;; -1F46E;POLICE OFFICER;So;0;ON;;;;;N;;;;; -1F46F;WOMAN WITH BUNNY EARS;So;0;ON;;;;;N;;;;; -1F470;BRIDE WITH VEIL;So;0;ON;;;;;N;;;;; -1F471;PERSON WITH BLOND HAIR;So;0;ON;;;;;N;;;;; -1F472;MAN WITH GUA PI MAO;So;0;ON;;;;;N;;;;; -1F473;MAN WITH TURBAN;So;0;ON;;;;;N;;;;; -1F474;OLDER MAN;So;0;ON;;;;;N;;;;; -1F475;OLDER WOMAN;So;0;ON;;;;;N;;;;; -1F476;BABY;So;0;ON;;;;;N;;;;; -1F477;CONSTRUCTION WORKER;So;0;ON;;;;;N;;;;; -1F478;PRINCESS;So;0;ON;;;;;N;;;;; -1F479;JAPANESE OGRE;So;0;ON;;;;;N;;;;; -1F47A;JAPANESE GOBLIN;So;0;ON;;;;;N;;;;; -1F47B;GHOST;So;0;ON;;;;;N;;;;; -1F47C;BABY ANGEL;So;0;ON;;;;;N;;;;; -1F47D;EXTRATERRESTRIAL ALIEN;So;0;ON;;;;;N;;;;; -1F47E;ALIEN MONSTER;So;0;ON;;;;;N;;;;; -1F47F;IMP;So;0;ON;;;;;N;;;;; -1F480;SKULL;So;0;ON;;;;;N;;;;; -1F481;INFORMATION DESK PERSON;So;0;ON;;;;;N;;;;; -1F482;GUARDSMAN;So;0;ON;;;;;N;;;;; -1F483;DANCER;So;0;ON;;;;;N;;;;; -1F484;LIPSTICK;So;0;ON;;;;;N;;;;; -1F485;NAIL POLISH;So;0;ON;;;;;N;;;;; -1F486;FACE MASSAGE;So;0;ON;;;;;N;;;;; -1F487;HAIRCUT;So;0;ON;;;;;N;;;;; -1F488;BARBER POLE;So;0;ON;;;;;N;;;;; -1F489;SYRINGE;So;0;ON;;;;;N;;;;; -1F48A;PILL;So;0;ON;;;;;N;;;;; -1F48B;KISS MARK;So;0;ON;;;;;N;;;;; -1F48C;LOVE LETTER;So;0;ON;;;;;N;;;;; -1F48D;RING;So;0;ON;;;;;N;;;;; -1F48E;GEM STONE;So;0;ON;;;;;N;;;;; -1F48F;KISS;So;0;ON;;;;;N;;;;; -1F490;BOUQUET;So;0;ON;;;;;N;;;;; -1F491;COUPLE WITH HEART;So;0;ON;;;;;N;;;;; -1F492;WEDDING;So;0;ON;;;;;N;;;;; -1F493;BEATING HEART;So;0;ON;;;;;N;;;;; -1F494;BROKEN HEART;So;0;ON;;;;;N;;;;; -1F495;TWO HEARTS;So;0;ON;;;;;N;;;;; -1F496;SPARKLING HEART;So;0;ON;;;;;N;;;;; -1F497;GROWING HEART;So;0;ON;;;;;N;;;;; -1F498;HEART WITH ARROW;So;0;ON;;;;;N;;;;; -1F499;BLUE HEART;So;0;ON;;;;;N;;;;; -1F49A;GREEN HEART;So;0;ON;;;;;N;;;;; -1F49B;YELLOW HEART;So;0;ON;;;;;N;;;;; -1F49C;PURPLE HEART;So;0;ON;;;;;N;;;;; -1F49D;HEART WITH RIBBON;So;0;ON;;;;;N;;;;; -1F49E;REVOLVING HEARTS;So;0;ON;;;;;N;;;;; -1F49F;HEART DECORATION;So;0;ON;;;;;N;;;;; -1F4A0;DIAMOND SHAPE WITH A DOT INSIDE;So;0;ON;;;;;N;;;;; -1F4A1;ELECTRIC LIGHT BULB;So;0;ON;;;;;N;;;;; -1F4A2;ANGER SYMBOL;So;0;ON;;;;;N;;;;; -1F4A3;BOMB;So;0;ON;;;;;N;;;;; -1F4A4;SLEEPING SYMBOL;So;0;ON;;;;;N;;;;; -1F4A5;COLLISION SYMBOL;So;0;ON;;;;;N;;;;; -1F4A6;SPLASHING SWEAT SYMBOL;So;0;ON;;;;;N;;;;; -1F4A7;DROPLET;So;0;ON;;;;;N;;;;; -1F4A8;DASH SYMBOL;So;0;ON;;;;;N;;;;; -1F4A9;PILE OF POO;So;0;ON;;;;;N;;;;; -1F4AA;FLEXED BICEPS;So;0;ON;;;;;N;;;;; -1F4AB;DIZZY SYMBOL;So;0;ON;;;;;N;;;;; -1F4AC;SPEECH BALLOON;So;0;ON;;;;;N;;;;; -1F4AD;THOUGHT BALLOON;So;0;ON;;;;;N;;;;; -1F4AE;WHITE FLOWER;So;0;ON;;;;;N;;;;; -1F4AF;HUNDRED POINTS SYMBOL;So;0;ON;;;;;N;;;;; -1F4B0;MONEY BAG;So;0;ON;;;;;N;;;;; -1F4B1;CURRENCY EXCHANGE;So;0;ON;;;;;N;;;;; -1F4B2;HEAVY DOLLAR SIGN;So;0;ON;;;;;N;;;;; -1F4B3;CREDIT CARD;So;0;ON;;;;;N;;;;; -1F4B4;BANKNOTE WITH YEN SIGN;So;0;ON;;;;;N;;;;; -1F4B5;BANKNOTE WITH DOLLAR SIGN;So;0;ON;;;;;N;;;;; -1F4B6;BANKNOTE WITH EURO SIGN;So;0;ON;;;;;N;;;;; -1F4B7;BANKNOTE WITH POUND SIGN;So;0;ON;;;;;N;;;;; -1F4B8;MONEY WITH WINGS;So;0;ON;;;;;N;;;;; -1F4B9;CHART WITH UPWARDS TREND AND YEN SIGN;So;0;ON;;;;;N;;;;; -1F4BA;SEAT;So;0;ON;;;;;N;;;;; -1F4BB;PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; -1F4BC;BRIEFCASE;So;0;ON;;;;;N;;;;; -1F4BD;MINIDISC;So;0;ON;;;;;N;;;;; -1F4BE;FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F4BF;OPTICAL DISC;So;0;ON;;;;;N;;;;; -1F4C0;DVD;So;0;ON;;;;;N;;;;; -1F4C1;FILE FOLDER;So;0;ON;;;;;N;;;;; -1F4C2;OPEN FILE FOLDER;So;0;ON;;;;;N;;;;; -1F4C3;PAGE WITH CURL;So;0;ON;;;;;N;;;;; -1F4C4;PAGE FACING UP;So;0;ON;;;;;N;;;;; -1F4C5;CALENDAR;So;0;ON;;;;;N;;;;; -1F4C6;TEAR-OFF CALENDAR;So;0;ON;;;;;N;;;;; -1F4C7;CARD INDEX;So;0;ON;;;;;N;;;;; -1F4C8;CHART WITH UPWARDS TREND;So;0;ON;;;;;N;;;;; -1F4C9;CHART WITH DOWNWARDS TREND;So;0;ON;;;;;N;;;;; -1F4CA;BAR CHART;So;0;ON;;;;;N;;;;; -1F4CB;CLIPBOARD;So;0;ON;;;;;N;;;;; -1F4CC;PUSHPIN;So;0;ON;;;;;N;;;;; -1F4CD;ROUND PUSHPIN;So;0;ON;;;;;N;;;;; -1F4CE;PAPERCLIP;So;0;ON;;;;;N;;;;; -1F4CF;STRAIGHT RULER;So;0;ON;;;;;N;;;;; -1F4D0;TRIANGULAR RULER;So;0;ON;;;;;N;;;;; -1F4D1;BOOKMARK TABS;So;0;ON;;;;;N;;;;; -1F4D2;LEDGER;So;0;ON;;;;;N;;;;; -1F4D3;NOTEBOOK;So;0;ON;;;;;N;;;;; -1F4D4;NOTEBOOK WITH DECORATIVE COVER;So;0;ON;;;;;N;;;;; -1F4D5;CLOSED BOOK;So;0;ON;;;;;N;;;;; -1F4D6;OPEN BOOK;So;0;ON;;;;;N;;;;; -1F4D7;GREEN BOOK;So;0;ON;;;;;N;;;;; -1F4D8;BLUE BOOK;So;0;ON;;;;;N;;;;; -1F4D9;ORANGE BOOK;So;0;ON;;;;;N;;;;; -1F4DA;BOOKS;So;0;ON;;;;;N;;;;; -1F4DB;NAME BADGE;So;0;ON;;;;;N;;;;; -1F4DC;SCROLL;So;0;ON;;;;;N;;;;; -1F4DD;MEMO;So;0;ON;;;;;N;;;;; -1F4DE;TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; -1F4DF;PAGER;So;0;ON;;;;;N;;;;; -1F4E0;FAX MACHINE;So;0;ON;;;;;N;;;;; -1F4E1;SATELLITE ANTENNA;So;0;ON;;;;;N;;;;; -1F4E2;PUBLIC ADDRESS LOUDSPEAKER;So;0;ON;;;;;N;;;;; -1F4E3;CHEERING MEGAPHONE;So;0;ON;;;;;N;;;;; -1F4E4;OUTBOX TRAY;So;0;ON;;;;;N;;;;; -1F4E5;INBOX TRAY;So;0;ON;;;;;N;;;;; -1F4E6;PACKAGE;So;0;ON;;;;;N;;;;; -1F4E7;E-MAIL SYMBOL;So;0;ON;;;;;N;;;;; -1F4E8;INCOMING ENVELOPE;So;0;ON;;;;;N;;;;; -1F4E9;ENVELOPE WITH DOWNWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F4EA;CLOSED MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; -1F4EB;CLOSED MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; -1F4EC;OPEN MAILBOX WITH RAISED FLAG;So;0;ON;;;;;N;;;;; -1F4ED;OPEN MAILBOX WITH LOWERED FLAG;So;0;ON;;;;;N;;;;; -1F4EE;POSTBOX;So;0;ON;;;;;N;;;;; -1F4EF;POSTAL HORN;So;0;ON;;;;;N;;;;; -1F4F0;NEWSPAPER;So;0;ON;;;;;N;;;;; -1F4F1;MOBILE PHONE;So;0;ON;;;;;N;;;;; -1F4F2;MOBILE PHONE WITH RIGHTWARDS ARROW AT LEFT;So;0;ON;;;;;N;;;;; -1F4F3;VIBRATION MODE;So;0;ON;;;;;N;;;;; -1F4F4;MOBILE PHONE OFF;So;0;ON;;;;;N;;;;; -1F4F5;NO MOBILE PHONES;So;0;ON;;;;;N;;;;; -1F4F6;ANTENNA WITH BARS;So;0;ON;;;;;N;;;;; -1F4F7;CAMERA;So;0;ON;;;;;N;;;;; -1F4F8;CAMERA WITH FLASH;So;0;ON;;;;;N;;;;; -1F4F9;VIDEO CAMERA;So;0;ON;;;;;N;;;;; -1F4FA;TELEVISION;So;0;ON;;;;;N;;;;; -1F4FB;RADIO;So;0;ON;;;;;N;;;;; -1F4FC;VIDEOCASSETTE;So;0;ON;;;;;N;;;;; -1F4FD;FILM PROJECTOR;So;0;ON;;;;;N;;;;; -1F4FE;PORTABLE STEREO;So;0;ON;;;;;N;;;;; -1F4FF;PRAYER BEADS;So;0;ON;;;;;N;;;;; -1F500;TWISTED RIGHTWARDS ARROWS;So;0;ON;;;;;N;;;;; -1F501;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F502;CLOCKWISE RIGHTWARDS AND LEFTWARDS OPEN CIRCLE ARROWS WITH CIRCLED ONE OVERLAY;So;0;ON;;;;;N;;;;; -1F503;CLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F504;ANTICLOCKWISE DOWNWARDS AND UPWARDS OPEN CIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F505;LOW BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; -1F506;HIGH BRIGHTNESS SYMBOL;So;0;ON;;;;;N;;;;; -1F507;SPEAKER WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; -1F508;SPEAKER;So;0;ON;;;;;N;;;;; -1F509;SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; -1F50A;SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; -1F50B;BATTERY;So;0;ON;;;;;N;;;;; -1F50C;ELECTRIC PLUG;So;0;ON;;;;;N;;;;; -1F50D;LEFT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; -1F50E;RIGHT-POINTING MAGNIFYING GLASS;So;0;ON;;;;;N;;;;; -1F50F;LOCK WITH INK PEN;So;0;ON;;;;;N;;;;; -1F510;CLOSED LOCK WITH KEY;So;0;ON;;;;;N;;;;; -1F511;KEY;So;0;ON;;;;;N;;;;; -1F512;LOCK;So;0;ON;;;;;N;;;;; -1F513;OPEN LOCK;So;0;ON;;;;;N;;;;; -1F514;BELL;So;0;ON;;;;;N;;;;; -1F515;BELL WITH CANCELLATION STROKE;So;0;ON;;;;;N;;;;; -1F516;BOOKMARK;So;0;ON;;;;;N;;;;; -1F517;LINK SYMBOL;So;0;ON;;;;;N;;;;; -1F518;RADIO BUTTON;So;0;ON;;;;;N;;;;; -1F519;BACK WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51A;END WITH LEFTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51B;ON WITH EXCLAMATION MARK WITH LEFT RIGHT ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51C;SOON WITH RIGHTWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51D;TOP WITH UPWARDS ARROW ABOVE;So;0;ON;;;;;N;;;;; -1F51E;NO ONE UNDER EIGHTEEN SYMBOL;So;0;ON;;;;;N;;;;; -1F51F;KEYCAP TEN;So;0;ON;;;;;N;;;;; -1F520;INPUT SYMBOL FOR LATIN CAPITAL LETTERS;So;0;ON;;;;;N;;;;; -1F521;INPUT SYMBOL FOR LATIN SMALL LETTERS;So;0;ON;;;;;N;;;;; -1F522;INPUT SYMBOL FOR NUMBERS;So;0;ON;;;;;N;;;;; -1F523;INPUT SYMBOL FOR SYMBOLS;So;0;ON;;;;;N;;;;; -1F524;INPUT SYMBOL FOR LATIN LETTERS;So;0;ON;;;;;N;;;;; -1F525;FIRE;So;0;ON;;;;;N;;;;; -1F526;ELECTRIC TORCH;So;0;ON;;;;;N;;;;; -1F527;WRENCH;So;0;ON;;;;;N;;;;; -1F528;HAMMER;So;0;ON;;;;;N;;;;; -1F529;NUT AND BOLT;So;0;ON;;;;;N;;;;; -1F52A;HOCHO;So;0;ON;;;;;N;;;;; -1F52B;PISTOL;So;0;ON;;;;;N;;;;; -1F52C;MICROSCOPE;So;0;ON;;;;;N;;;;; -1F52D;TELESCOPE;So;0;ON;;;;;N;;;;; -1F52E;CRYSTAL BALL;So;0;ON;;;;;N;;;;; -1F52F;SIX POINTED STAR WITH MIDDLE DOT;So;0;ON;;;;;N;;;;; -1F530;JAPANESE SYMBOL FOR BEGINNER;So;0;ON;;;;;N;;;;; -1F531;TRIDENT EMBLEM;So;0;ON;;;;;N;;;;; -1F532;BLACK SQUARE BUTTON;So;0;ON;;;;;N;;;;; -1F533;WHITE SQUARE BUTTON;So;0;ON;;;;;N;;;;; -1F534;LARGE RED CIRCLE;So;0;ON;;;;;N;;;;; -1F535;LARGE BLUE CIRCLE;So;0;ON;;;;;N;;;;; -1F536;LARGE ORANGE DIAMOND;So;0;ON;;;;;N;;;;; -1F537;LARGE BLUE DIAMOND;So;0;ON;;;;;N;;;;; -1F538;SMALL ORANGE DIAMOND;So;0;ON;;;;;N;;;;; -1F539;SMALL BLUE DIAMOND;So;0;ON;;;;;N;;;;; -1F53A;UP-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53B;DOWN-POINTING RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53C;UP-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53D;DOWN-POINTING SMALL RED TRIANGLE;So;0;ON;;;;;N;;;;; -1F53E;LOWER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F53F;UPPER RIGHT SHADOWED WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F540;CIRCLED CROSS POMMEE;So;0;ON;;;;;N;;;;; -1F541;CROSS POMMEE WITH HALF-CIRCLE BELOW;So;0;ON;;;;;N;;;;; -1F542;CROSS POMMEE;So;0;ON;;;;;N;;;;; -1F543;NOTCHED LEFT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; -1F544;NOTCHED RIGHT SEMICIRCLE WITH THREE DOTS;So;0;ON;;;;;N;;;;; -1F545;SYMBOL FOR MARKS CHAPTER;So;0;ON;;;;;N;;;;; -1F546;WHITE LATIN CROSS;So;0;ON;;;;;N;;;;; -1F547;HEAVY LATIN CROSS;So;0;ON;;;;;N;;;;; -1F548;CELTIC CROSS;So;0;ON;;;;;N;;;;; -1F549;OM SYMBOL;So;0;ON;;;;;N;;;;; -1F54A;DOVE OF PEACE;So;0;ON;;;;;N;;;;; -1F54B;KAABA;So;0;ON;;;;;N;;;;; -1F54C;MOSQUE;So;0;ON;;;;;N;;;;; -1F54D;SYNAGOGUE;So;0;ON;;;;;N;;;;; -1F54E;MENORAH WITH NINE BRANCHES;So;0;ON;;;;;N;;;;; -1F54F;BOWL OF HYGIEIA;So;0;ON;;;;;N;;;;; -1F550;CLOCK FACE ONE OCLOCK;So;0;ON;;;;;N;;;;; -1F551;CLOCK FACE TWO OCLOCK;So;0;ON;;;;;N;;;;; -1F552;CLOCK FACE THREE OCLOCK;So;0;ON;;;;;N;;;;; -1F553;CLOCK FACE FOUR OCLOCK;So;0;ON;;;;;N;;;;; -1F554;CLOCK FACE FIVE OCLOCK;So;0;ON;;;;;N;;;;; -1F555;CLOCK FACE SIX OCLOCK;So;0;ON;;;;;N;;;;; -1F556;CLOCK FACE SEVEN OCLOCK;So;0;ON;;;;;N;;;;; -1F557;CLOCK FACE EIGHT OCLOCK;So;0;ON;;;;;N;;;;; -1F558;CLOCK FACE NINE OCLOCK;So;0;ON;;;;;N;;;;; -1F559;CLOCK FACE TEN OCLOCK;So;0;ON;;;;;N;;;;; -1F55A;CLOCK FACE ELEVEN OCLOCK;So;0;ON;;;;;N;;;;; -1F55B;CLOCK FACE TWELVE OCLOCK;So;0;ON;;;;;N;;;;; -1F55C;CLOCK FACE ONE-THIRTY;So;0;ON;;;;;N;;;;; -1F55D;CLOCK FACE TWO-THIRTY;So;0;ON;;;;;N;;;;; -1F55E;CLOCK FACE THREE-THIRTY;So;0;ON;;;;;N;;;;; -1F55F;CLOCK FACE FOUR-THIRTY;So;0;ON;;;;;N;;;;; -1F560;CLOCK FACE FIVE-THIRTY;So;0;ON;;;;;N;;;;; -1F561;CLOCK FACE SIX-THIRTY;So;0;ON;;;;;N;;;;; -1F562;CLOCK FACE SEVEN-THIRTY;So;0;ON;;;;;N;;;;; -1F563;CLOCK FACE EIGHT-THIRTY;So;0;ON;;;;;N;;;;; -1F564;CLOCK FACE NINE-THIRTY;So;0;ON;;;;;N;;;;; -1F565;CLOCK FACE TEN-THIRTY;So;0;ON;;;;;N;;;;; -1F566;CLOCK FACE ELEVEN-THIRTY;So;0;ON;;;;;N;;;;; -1F567;CLOCK FACE TWELVE-THIRTY;So;0;ON;;;;;N;;;;; -1F568;RIGHT SPEAKER;So;0;ON;;;;;N;;;;; -1F569;RIGHT SPEAKER WITH ONE SOUND WAVE;So;0;ON;;;;;N;;;;; -1F56A;RIGHT SPEAKER WITH THREE SOUND WAVES;So;0;ON;;;;;N;;;;; -1F56B;BULLHORN;So;0;ON;;;;;N;;;;; -1F56C;BULLHORN WITH SOUND WAVES;So;0;ON;;;;;N;;;;; -1F56D;RINGING BELL;So;0;ON;;;;;N;;;;; -1F56E;BOOK;So;0;ON;;;;;N;;;;; -1F56F;CANDLE;So;0;ON;;;;;N;;;;; -1F570;MANTELPIECE CLOCK;So;0;ON;;;;;N;;;;; -1F571;BLACK SKULL AND CROSSBONES;So;0;ON;;;;;N;;;;; -1F572;NO PIRACY;So;0;ON;;;;;N;;;;; -1F573;HOLE;So;0;ON;;;;;N;;;;; -1F574;MAN IN BUSINESS SUIT LEVITATING;So;0;ON;;;;;N;;;;; -1F575;SLEUTH OR SPY;So;0;ON;;;;;N;;;;; -1F576;DARK SUNGLASSES;So;0;ON;;;;;N;;;;; -1F577;SPIDER;So;0;ON;;;;;N;;;;; -1F578;SPIDER WEB;So;0;ON;;;;;N;;;;; -1F579;JOYSTICK;So;0;ON;;;;;N;;;;; -1F57B;LEFT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; -1F57C;TELEPHONE RECEIVER WITH PAGE;So;0;ON;;;;;N;;;;; -1F57D;RIGHT HAND TELEPHONE RECEIVER;So;0;ON;;;;;N;;;;; -1F57E;WHITE TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; -1F57F;BLACK TOUCHTONE TELEPHONE;So;0;ON;;;;;N;;;;; -1F580;TELEPHONE ON TOP OF MODEM;So;0;ON;;;;;N;;;;; -1F581;CLAMSHELL MOBILE PHONE;So;0;ON;;;;;N;;;;; -1F582;BACK OF ENVELOPE;So;0;ON;;;;;N;;;;; -1F583;STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; -1F584;ENVELOPE WITH LIGHTNING;So;0;ON;;;;;N;;;;; -1F585;FLYING ENVELOPE;So;0;ON;;;;;N;;;;; -1F586;PEN OVER STAMPED ENVELOPE;So;0;ON;;;;;N;;;;; -1F587;LINKED PAPERCLIPS;So;0;ON;;;;;N;;;;; -1F588;BLACK PUSHPIN;So;0;ON;;;;;N;;;;; -1F589;LOWER LEFT PENCIL;So;0;ON;;;;;N;;;;; -1F58A;LOWER LEFT BALLPOINT PEN;So;0;ON;;;;;N;;;;; -1F58B;LOWER LEFT FOUNTAIN PEN;So;0;ON;;;;;N;;;;; -1F58C;LOWER LEFT PAINTBRUSH;So;0;ON;;;;;N;;;;; -1F58D;LOWER LEFT CRAYON;So;0;ON;;;;;N;;;;; -1F58E;LEFT WRITING HAND;So;0;ON;;;;;N;;;;; -1F58F;TURNED OK HAND SIGN;So;0;ON;;;;;N;;;;; -1F590;RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; -1F591;REVERSED RAISED HAND WITH FINGERS SPLAYED;So;0;ON;;;;;N;;;;; -1F592;REVERSED THUMBS UP SIGN;So;0;ON;;;;;N;;;;; -1F593;REVERSED THUMBS DOWN SIGN;So;0;ON;;;;;N;;;;; -1F594;REVERSED VICTORY HAND;So;0;ON;;;;;N;;;;; -1F595;REVERSED HAND WITH MIDDLE FINGER EXTENDED;So;0;ON;;;;;N;;;;; -1F596;RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS;So;0;ON;;;;;N;;;;; -1F597;WHITE DOWN POINTING LEFT HAND INDEX;So;0;ON;;;;;N;;;;; -1F598;SIDEWAYS WHITE LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F599;SIDEWAYS WHITE RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59A;SIDEWAYS BLACK LEFT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59B;SIDEWAYS BLACK RIGHT POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59C;BLACK LEFT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F59D;BLACK RIGHT POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F59E;SIDEWAYS WHITE UP POINTING INDEX;So;0;ON;;;;;N;;;;; -1F59F;SIDEWAYS WHITE DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -1F5A0;SIDEWAYS BLACK UP POINTING INDEX;So;0;ON;;;;;N;;;;; -1F5A1;SIDEWAYS BLACK DOWN POINTING INDEX;So;0;ON;;;;;N;;;;; -1F5A2;BLACK UP POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F5A3;BLACK DOWN POINTING BACKHAND INDEX;So;0;ON;;;;;N;;;;; -1F5A5;DESKTOP COMPUTER;So;0;ON;;;;;N;;;;; -1F5A6;KEYBOARD AND MOUSE;So;0;ON;;;;;N;;;;; -1F5A7;THREE NETWORKED COMPUTERS;So;0;ON;;;;;N;;;;; -1F5A8;PRINTER;So;0;ON;;;;;N;;;;; -1F5A9;POCKET CALCULATOR;So;0;ON;;;;;N;;;;; -1F5AA;BLACK HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F5AB;WHITE HARD SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F5AC;SOFT SHELL FLOPPY DISK;So;0;ON;;;;;N;;;;; -1F5AD;TAPE CARTRIDGE;So;0;ON;;;;;N;;;;; -1F5AE;WIRED KEYBOARD;So;0;ON;;;;;N;;;;; -1F5AF;ONE BUTTON MOUSE;So;0;ON;;;;;N;;;;; -1F5B0;TWO BUTTON MOUSE;So;0;ON;;;;;N;;;;; -1F5B1;THREE BUTTON MOUSE;So;0;ON;;;;;N;;;;; -1F5B2;TRACKBALL;So;0;ON;;;;;N;;;;; -1F5B3;OLD PERSONAL COMPUTER;So;0;ON;;;;;N;;;;; -1F5B4;HARD DISK;So;0;ON;;;;;N;;;;; -1F5B5;SCREEN;So;0;ON;;;;;N;;;;; -1F5B6;PRINTER ICON;So;0;ON;;;;;N;;;;; -1F5B7;FAX ICON;So;0;ON;;;;;N;;;;; -1F5B8;OPTICAL DISC ICON;So;0;ON;;;;;N;;;;; -1F5B9;DOCUMENT WITH TEXT;So;0;ON;;;;;N;;;;; -1F5BA;DOCUMENT WITH TEXT AND PICTURE;So;0;ON;;;;;N;;;;; -1F5BB;DOCUMENT WITH PICTURE;So;0;ON;;;;;N;;;;; -1F5BC;FRAME WITH PICTURE;So;0;ON;;;;;N;;;;; -1F5BD;FRAME WITH TILES;So;0;ON;;;;;N;;;;; -1F5BE;FRAME WITH AN X;So;0;ON;;;;;N;;;;; -1F5BF;BLACK FOLDER;So;0;ON;;;;;N;;;;; -1F5C0;FOLDER;So;0;ON;;;;;N;;;;; -1F5C1;OPEN FOLDER;So;0;ON;;;;;N;;;;; -1F5C2;CARD INDEX DIVIDERS;So;0;ON;;;;;N;;;;; -1F5C3;CARD FILE BOX;So;0;ON;;;;;N;;;;; -1F5C4;FILE CABINET;So;0;ON;;;;;N;;;;; -1F5C5;EMPTY NOTE;So;0;ON;;;;;N;;;;; -1F5C6;EMPTY NOTE PAGE;So;0;ON;;;;;N;;;;; -1F5C7;EMPTY NOTE PAD;So;0;ON;;;;;N;;;;; -1F5C8;NOTE;So;0;ON;;;;;N;;;;; -1F5C9;NOTE PAGE;So;0;ON;;;;;N;;;;; -1F5CA;NOTE PAD;So;0;ON;;;;;N;;;;; -1F5CB;EMPTY DOCUMENT;So;0;ON;;;;;N;;;;; -1F5CC;EMPTY PAGE;So;0;ON;;;;;N;;;;; -1F5CD;EMPTY PAGES;So;0;ON;;;;;N;;;;; -1F5CE;DOCUMENT;So;0;ON;;;;;N;;;;; -1F5CF;PAGE;So;0;ON;;;;;N;;;;; -1F5D0;PAGES;So;0;ON;;;;;N;;;;; -1F5D1;WASTEBASKET;So;0;ON;;;;;N;;;;; -1F5D2;SPIRAL NOTE PAD;So;0;ON;;;;;N;;;;; -1F5D3;SPIRAL CALENDAR PAD;So;0;ON;;;;;N;;;;; -1F5D4;DESKTOP WINDOW;So;0;ON;;;;;N;;;;; -1F5D5;MINIMIZE;So;0;ON;;;;;N;;;;; -1F5D6;MAXIMIZE;So;0;ON;;;;;N;;;;; -1F5D7;OVERLAP;So;0;ON;;;;;N;;;;; -1F5D8;CLOCKWISE RIGHT AND LEFT SEMICIRCLE ARROWS;So;0;ON;;;;;N;;;;; -1F5D9;CANCELLATION X;So;0;ON;;;;;N;;;;; -1F5DA;INCREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; -1F5DB;DECREASE FONT SIZE SYMBOL;So;0;ON;;;;;N;;;;; -1F5DC;COMPRESSION;So;0;ON;;;;;N;;;;; -1F5DD;OLD KEY;So;0;ON;;;;;N;;;;; -1F5DE;ROLLED-UP NEWSPAPER;So;0;ON;;;;;N;;;;; -1F5DF;PAGE WITH CIRCLED TEXT;So;0;ON;;;;;N;;;;; -1F5E0;STOCK CHART;So;0;ON;;;;;N;;;;; -1F5E1;DAGGER KNIFE;So;0;ON;;;;;N;;;;; -1F5E2;LIPS;So;0;ON;;;;;N;;;;; -1F5E3;SPEAKING HEAD IN SILHOUETTE;So;0;ON;;;;;N;;;;; -1F5E4;THREE RAYS ABOVE;So;0;ON;;;;;N;;;;; -1F5E5;THREE RAYS BELOW;So;0;ON;;;;;N;;;;; -1F5E6;THREE RAYS LEFT;So;0;ON;;;;;N;;;;; -1F5E7;THREE RAYS RIGHT;So;0;ON;;;;;N;;;;; -1F5E8;LEFT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; -1F5E9;RIGHT SPEECH BUBBLE;So;0;ON;;;;;N;;;;; -1F5EA;TWO SPEECH BUBBLES;So;0;ON;;;;;N;;;;; -1F5EB;THREE SPEECH BUBBLES;So;0;ON;;;;;N;;;;; -1F5EC;LEFT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; -1F5ED;RIGHT THOUGHT BUBBLE;So;0;ON;;;;;N;;;;; -1F5EE;LEFT ANGER BUBBLE;So;0;ON;;;;;N;;;;; -1F5EF;RIGHT ANGER BUBBLE;So;0;ON;;;;;N;;;;; -1F5F0;MOOD BUBBLE;So;0;ON;;;;;N;;;;; -1F5F1;LIGHTNING MOOD BUBBLE;So;0;ON;;;;;N;;;;; -1F5F2;LIGHTNING MOOD;So;0;ON;;;;;N;;;;; -1F5F3;BALLOT BOX WITH BALLOT;So;0;ON;;;;;N;;;;; -1F5F4;BALLOT SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F5;BALLOT BOX WITH SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F6;BALLOT BOLD SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F7;BALLOT BOX WITH BOLD SCRIPT X;So;0;ON;;;;;N;;;;; -1F5F8;LIGHT CHECK MARK;So;0;ON;;;;;N;;;;; -1F5F9;BALLOT BOX WITH BOLD CHECK;So;0;ON;;;;;N;;;;; -1F5FA;WORLD MAP;So;0;ON;;;;;N;;;;; -1F5FB;MOUNT FUJI;So;0;ON;;;;;N;;;;; -1F5FC;TOKYO TOWER;So;0;ON;;;;;N;;;;; -1F5FD;STATUE OF LIBERTY;So;0;ON;;;;;N;;;;; -1F5FE;SILHOUETTE OF JAPAN;So;0;ON;;;;;N;;;;; -1F5FF;MOYAI;So;0;ON;;;;;N;;;;; -1F600;GRINNING FACE;So;0;ON;;;;;N;;;;; -1F601;GRINNING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F602;FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; -1F603;SMILING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F604;SMILING FACE WITH OPEN MOUTH AND SMILING EYES;So;0;ON;;;;;N;;;;; -1F605;SMILING FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; -1F606;SMILING FACE WITH OPEN MOUTH AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; -1F607;SMILING FACE WITH HALO;So;0;ON;;;;;N;;;;; -1F608;SMILING FACE WITH HORNS;So;0;ON;;;;;N;;;;; -1F609;WINKING FACE;So;0;ON;;;;;N;;;;; -1F60A;SMILING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F60B;FACE SAVOURING DELICIOUS FOOD;So;0;ON;;;;;N;;;;; -1F60C;RELIEVED FACE;So;0;ON;;;;;N;;;;; -1F60D;SMILING FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; -1F60E;SMILING FACE WITH SUNGLASSES;So;0;ON;;;;;N;;;;; -1F60F;SMIRKING FACE;So;0;ON;;;;;N;;;;; -1F610;NEUTRAL FACE;So;0;ON;;;;;N;;;;; -1F611;EXPRESSIONLESS FACE;So;0;ON;;;;;N;;;;; -1F612;UNAMUSED FACE;So;0;ON;;;;;N;;;;; -1F613;FACE WITH COLD SWEAT;So;0;ON;;;;;N;;;;; -1F614;PENSIVE FACE;So;0;ON;;;;;N;;;;; -1F615;CONFUSED FACE;So;0;ON;;;;;N;;;;; -1F616;CONFOUNDED FACE;So;0;ON;;;;;N;;;;; -1F617;KISSING FACE;So;0;ON;;;;;N;;;;; -1F618;FACE THROWING A KISS;So;0;ON;;;;;N;;;;; -1F619;KISSING FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F61A;KISSING FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; -1F61B;FACE WITH STUCK-OUT TONGUE;So;0;ON;;;;;N;;;;; -1F61C;FACE WITH STUCK-OUT TONGUE AND WINKING EYE;So;0;ON;;;;;N;;;;; -1F61D;FACE WITH STUCK-OUT TONGUE AND TIGHTLY-CLOSED EYES;So;0;ON;;;;;N;;;;; -1F61E;DISAPPOINTED FACE;So;0;ON;;;;;N;;;;; -1F61F;WORRIED FACE;So;0;ON;;;;;N;;;;; -1F620;ANGRY FACE;So;0;ON;;;;;N;;;;; -1F621;POUTING FACE;So;0;ON;;;;;N;;;;; -1F622;CRYING FACE;So;0;ON;;;;;N;;;;; -1F623;PERSEVERING FACE;So;0;ON;;;;;N;;;;; -1F624;FACE WITH LOOK OF TRIUMPH;So;0;ON;;;;;N;;;;; -1F625;DISAPPOINTED BUT RELIEVED FACE;So;0;ON;;;;;N;;;;; -1F626;FROWNING FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F627;ANGUISHED FACE;So;0;ON;;;;;N;;;;; -1F628;FEARFUL FACE;So;0;ON;;;;;N;;;;; -1F629;WEARY FACE;So;0;ON;;;;;N;;;;; -1F62A;SLEEPY FACE;So;0;ON;;;;;N;;;;; -1F62B;TIRED FACE;So;0;ON;;;;;N;;;;; -1F62C;GRIMACING FACE;So;0;ON;;;;;N;;;;; -1F62D;LOUDLY CRYING FACE;So;0;ON;;;;;N;;;;; -1F62E;FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F62F;HUSHED FACE;So;0;ON;;;;;N;;;;; -1F630;FACE WITH OPEN MOUTH AND COLD SWEAT;So;0;ON;;;;;N;;;;; -1F631;FACE SCREAMING IN FEAR;So;0;ON;;;;;N;;;;; -1F632;ASTONISHED FACE;So;0;ON;;;;;N;;;;; -1F633;FLUSHED FACE;So;0;ON;;;;;N;;;;; -1F634;SLEEPING FACE;So;0;ON;;;;;N;;;;; -1F635;DIZZY FACE;So;0;ON;;;;;N;;;;; -1F636;FACE WITHOUT MOUTH;So;0;ON;;;;;N;;;;; -1F637;FACE WITH MEDICAL MASK;So;0;ON;;;;;N;;;;; -1F638;GRINNING CAT FACE WITH SMILING EYES;So;0;ON;;;;;N;;;;; -1F639;CAT FACE WITH TEARS OF JOY;So;0;ON;;;;;N;;;;; -1F63A;SMILING CAT FACE WITH OPEN MOUTH;So;0;ON;;;;;N;;;;; -1F63B;SMILING CAT FACE WITH HEART-SHAPED EYES;So;0;ON;;;;;N;;;;; -1F63C;CAT FACE WITH WRY SMILE;So;0;ON;;;;;N;;;;; -1F63D;KISSING CAT FACE WITH CLOSED EYES;So;0;ON;;;;;N;;;;; -1F63E;POUTING CAT FACE;So;0;ON;;;;;N;;;;; -1F63F;CRYING CAT FACE;So;0;ON;;;;;N;;;;; -1F640;WEARY CAT FACE;So;0;ON;;;;;N;;;;; -1F641;SLIGHTLY FROWNING FACE;So;0;ON;;;;;N;;;;; -1F642;SLIGHTLY SMILING FACE;So;0;ON;;;;;N;;;;; -1F643;UPSIDE-DOWN FACE;So;0;ON;;;;;N;;;;; -1F644;FACE WITH ROLLING EYES;So;0;ON;;;;;N;;;;; -1F645;FACE WITH NO GOOD GESTURE;So;0;ON;;;;;N;;;;; -1F646;FACE WITH OK GESTURE;So;0;ON;;;;;N;;;;; -1F647;PERSON BOWING DEEPLY;So;0;ON;;;;;N;;;;; -1F648;SEE-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; -1F649;HEAR-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; -1F64A;SPEAK-NO-EVIL MONKEY;So;0;ON;;;;;N;;;;; -1F64B;HAPPY PERSON RAISING ONE HAND;So;0;ON;;;;;N;;;;; -1F64C;PERSON RAISING BOTH HANDS IN CELEBRATION;So;0;ON;;;;;N;;;;; -1F64D;PERSON FROWNING;So;0;ON;;;;;N;;;;; -1F64E;PERSON WITH POUTING FACE;So;0;ON;;;;;N;;;;; -1F64F;PERSON WITH FOLDED HANDS;So;0;ON;;;;;N;;;;; -1F650;NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F651;SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F652;NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F653;SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F654;TURNED NORTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F655;TURNED SOUTH WEST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F656;TURNED NORTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F657;TURNED SOUTH EAST POINTING LEAF;So;0;ON;;;;;N;;;;; -1F658;NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F659;SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65A;NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65B;SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65C;HEAVY NORTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65D;HEAVY SOUTH WEST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65E;HEAVY NORTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F65F;HEAVY SOUTH EAST POINTING VINE LEAF;So;0;ON;;;;;N;;;;; -1F660;NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F661;SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F662;NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F663;SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F664;HEAVY NORTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F665;HEAVY SOUTH WEST POINTING BUD;So;0;ON;;;;;N;;;;; -1F666;HEAVY NORTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F667;HEAVY SOUTH EAST POINTING BUD;So;0;ON;;;;;N;;;;; -1F668;HOLLOW QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; -1F669;HOLLOW QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; -1F66A;SOLID QUILT SQUARE ORNAMENT;So;0;ON;;;;;N;;;;; -1F66B;SOLID QUILT SQUARE ORNAMENT IN BLACK SQUARE;So;0;ON;;;;;N;;;;; -1F66C;LEFTWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F66D;UPWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F66E;RIGHTWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F66F;DOWNWARDS ROCKET;So;0;ON;;;;;N;;;;; -1F670;SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F671;HEAVY SCRIPT LIGATURE ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F672;LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F673;HEAVY LIGATURE OPEN ET ORNAMENT;So;0;ON;;;;;N;;;;; -1F674;HEAVY AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; -1F675;SWASH AMPERSAND ORNAMENT;So;0;ON;;;;;N;;;;; -1F676;SANS-SERIF HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -1F677;SANS-SERIF HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -1F678;SANS-SERIF HEAVY LOW DOUBLE COMMA QUOTATION MARK ORNAMENT;So;0;ON;;;;;N;;;;; -1F679;HEAVY INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; -1F67A;SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; -1F67B;HEAVY SANS-SERIF INTERROBANG ORNAMENT;So;0;ON;;;;;N;;;;; -1F67C;VERY HEAVY SOLIDUS;So;0;ON;;;;;N;;;;; -1F67D;VERY HEAVY REVERSE SOLIDUS;So;0;ON;;;;;N;;;;; -1F67E;CHECKER BOARD;So;0;ON;;;;;N;;;;; -1F67F;REVERSE CHECKER BOARD;So;0;ON;;;;;N;;;;; -1F680;ROCKET;So;0;ON;;;;;N;;;;; -1F681;HELICOPTER;So;0;ON;;;;;N;;;;; -1F682;STEAM LOCOMOTIVE;So;0;ON;;;;;N;;;;; -1F683;RAILWAY CAR;So;0;ON;;;;;N;;;;; -1F684;HIGH-SPEED TRAIN;So;0;ON;;;;;N;;;;; -1F685;HIGH-SPEED TRAIN WITH BULLET NOSE;So;0;ON;;;;;N;;;;; -1F686;TRAIN;So;0;ON;;;;;N;;;;; -1F687;METRO;So;0;ON;;;;;N;;;;; -1F688;LIGHT RAIL;So;0;ON;;;;;N;;;;; -1F689;STATION;So;0;ON;;;;;N;;;;; -1F68A;TRAM;So;0;ON;;;;;N;;;;; -1F68B;TRAM CAR;So;0;ON;;;;;N;;;;; -1F68C;BUS;So;0;ON;;;;;N;;;;; -1F68D;ONCOMING BUS;So;0;ON;;;;;N;;;;; -1F68E;TROLLEYBUS;So;0;ON;;;;;N;;;;; -1F68F;BUS STOP;So;0;ON;;;;;N;;;;; -1F690;MINIBUS;So;0;ON;;;;;N;;;;; -1F691;AMBULANCE;So;0;ON;;;;;N;;;;; -1F692;FIRE ENGINE;So;0;ON;;;;;N;;;;; -1F693;POLICE CAR;So;0;ON;;;;;N;;;;; -1F694;ONCOMING POLICE CAR;So;0;ON;;;;;N;;;;; -1F695;TAXI;So;0;ON;;;;;N;;;;; -1F696;ONCOMING TAXI;So;0;ON;;;;;N;;;;; -1F697;AUTOMOBILE;So;0;ON;;;;;N;;;;; -1F698;ONCOMING AUTOMOBILE;So;0;ON;;;;;N;;;;; -1F699;RECREATIONAL VEHICLE;So;0;ON;;;;;N;;;;; -1F69A;DELIVERY TRUCK;So;0;ON;;;;;N;;;;; -1F69B;ARTICULATED LORRY;So;0;ON;;;;;N;;;;; -1F69C;TRACTOR;So;0;ON;;;;;N;;;;; -1F69D;MONORAIL;So;0;ON;;;;;N;;;;; -1F69E;MOUNTAIN RAILWAY;So;0;ON;;;;;N;;;;; -1F69F;SUSPENSION RAILWAY;So;0;ON;;;;;N;;;;; -1F6A0;MOUNTAIN CABLEWAY;So;0;ON;;;;;N;;;;; -1F6A1;AERIAL TRAMWAY;So;0;ON;;;;;N;;;;; -1F6A2;SHIP;So;0;ON;;;;;N;;;;; -1F6A3;ROWBOAT;So;0;ON;;;;;N;;;;; -1F6A4;SPEEDBOAT;So;0;ON;;;;;N;;;;; -1F6A5;HORIZONTAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; -1F6A6;VERTICAL TRAFFIC LIGHT;So;0;ON;;;;;N;;;;; -1F6A7;CONSTRUCTION SIGN;So;0;ON;;;;;N;;;;; -1F6A8;POLICE CARS REVOLVING LIGHT;So;0;ON;;;;;N;;;;; -1F6A9;TRIANGULAR FLAG ON POST;So;0;ON;;;;;N;;;;; -1F6AA;DOOR;So;0;ON;;;;;N;;;;; -1F6AB;NO ENTRY SIGN;So;0;ON;;;;;N;;;;; -1F6AC;SMOKING SYMBOL;So;0;ON;;;;;N;;;;; -1F6AD;NO SMOKING SYMBOL;So;0;ON;;;;;N;;;;; -1F6AE;PUT LITTER IN ITS PLACE SYMBOL;So;0;ON;;;;;N;;;;; -1F6AF;DO NOT LITTER SYMBOL;So;0;ON;;;;;N;;;;; -1F6B0;POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; -1F6B1;NON-POTABLE WATER SYMBOL;So;0;ON;;;;;N;;;;; -1F6B2;BICYCLE;So;0;ON;;;;;N;;;;; -1F6B3;NO BICYCLES;So;0;ON;;;;;N;;;;; -1F6B4;BICYCLIST;So;0;ON;;;;;N;;;;; -1F6B5;MOUNTAIN BICYCLIST;So;0;ON;;;;;N;;;;; -1F6B6;PEDESTRIAN;So;0;ON;;;;;N;;;;; -1F6B7;NO PEDESTRIANS;So;0;ON;;;;;N;;;;; -1F6B8;CHILDREN CROSSING;So;0;ON;;;;;N;;;;; -1F6B9;MENS SYMBOL;So;0;ON;;;;;N;;;;; -1F6BA;WOMENS SYMBOL;So;0;ON;;;;;N;;;;; -1F6BB;RESTROOM;So;0;ON;;;;;N;;;;; -1F6BC;BABY SYMBOL;So;0;ON;;;;;N;;;;; -1F6BD;TOILET;So;0;ON;;;;;N;;;;; -1F6BE;WATER CLOSET;So;0;ON;;;;;N;;;;; -1F6BF;SHOWER;So;0;ON;;;;;N;;;;; -1F6C0;BATH;So;0;ON;;;;;N;;;;; -1F6C1;BATHTUB;So;0;ON;;;;;N;;;;; -1F6C2;PASSPORT CONTROL;So;0;ON;;;;;N;;;;; -1F6C3;CUSTOMS;So;0;ON;;;;;N;;;;; -1F6C4;BAGGAGE CLAIM;So;0;ON;;;;;N;;;;; -1F6C5;LEFT LUGGAGE;So;0;ON;;;;;N;;;;; -1F6C6;TRIANGLE WITH ROUNDED CORNERS;So;0;ON;;;;;N;;;;; -1F6C7;PROHIBITED SIGN;So;0;ON;;;;;N;;;;; -1F6C8;CIRCLED INFORMATION SOURCE;So;0;ON;;;;;N;;;;; -1F6C9;BOYS SYMBOL;So;0;ON;;;;;N;;;;; -1F6CA;GIRLS SYMBOL;So;0;ON;;;;;N;;;;; -1F6CB;COUCH AND LAMP;So;0;ON;;;;;N;;;;; -1F6CC;SLEEPING ACCOMMODATION;So;0;ON;;;;;N;;;;; -1F6CD;SHOPPING BAGS;So;0;ON;;;;;N;;;;; -1F6CE;BELLHOP BELL;So;0;ON;;;;;N;;;;; -1F6CF;BED;So;0;ON;;;;;N;;;;; -1F6D0;PLACE OF WORSHIP;So;0;ON;;;;;N;;;;; -1F6E0;HAMMER AND WRENCH;So;0;ON;;;;;N;;;;; -1F6E1;SHIELD;So;0;ON;;;;;N;;;;; -1F6E2;OIL DRUM;So;0;ON;;;;;N;;;;; -1F6E3;MOTORWAY;So;0;ON;;;;;N;;;;; -1F6E4;RAILWAY TRACK;So;0;ON;;;;;N;;;;; -1F6E5;MOTOR BOAT;So;0;ON;;;;;N;;;;; -1F6E6;UP-POINTING MILITARY AIRPLANE;So;0;ON;;;;;N;;;;; -1F6E7;UP-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; -1F6E8;UP-POINTING SMALL AIRPLANE;So;0;ON;;;;;N;;;;; -1F6E9;SMALL AIRPLANE;So;0;ON;;;;;N;;;;; -1F6EA;NORTHEAST-POINTING AIRPLANE;So;0;ON;;;;;N;;;;; -1F6EB;AIRPLANE DEPARTURE;So;0;ON;;;;;N;;;;; -1F6EC;AIRPLANE ARRIVING;So;0;ON;;;;;N;;;;; -1F6F0;SATELLITE;So;0;ON;;;;;N;;;;; -1F6F1;ONCOMING FIRE ENGINE;So;0;ON;;;;;N;;;;; -1F6F2;DIESEL LOCOMOTIVE;So;0;ON;;;;;N;;;;; -1F6F3;PASSENGER SHIP;So;0;ON;;;;;N;;;;; -1F700;ALCHEMICAL SYMBOL FOR QUINTESSENCE;So;0;ON;;;;;N;;;;; -1F701;ALCHEMICAL SYMBOL FOR AIR;So;0;ON;;;;;N;;;;; -1F702;ALCHEMICAL SYMBOL FOR FIRE;So;0;ON;;;;;N;;;;; -1F703;ALCHEMICAL SYMBOL FOR EARTH;So;0;ON;;;;;N;;;;; -1F704;ALCHEMICAL SYMBOL FOR WATER;So;0;ON;;;;;N;;;;; -1F705;ALCHEMICAL SYMBOL FOR AQUAFORTIS;So;0;ON;;;;;N;;;;; -1F706;ALCHEMICAL SYMBOL FOR AQUA REGIA;So;0;ON;;;;;N;;;;; -1F707;ALCHEMICAL SYMBOL FOR AQUA REGIA-2;So;0;ON;;;;;N;;;;; -1F708;ALCHEMICAL SYMBOL FOR AQUA VITAE;So;0;ON;;;;;N;;;;; -1F709;ALCHEMICAL SYMBOL FOR AQUA VITAE-2;So;0;ON;;;;;N;;;;; -1F70A;ALCHEMICAL SYMBOL FOR VINEGAR;So;0;ON;;;;;N;;;;; -1F70B;ALCHEMICAL SYMBOL FOR VINEGAR-2;So;0;ON;;;;;N;;;;; -1F70C;ALCHEMICAL SYMBOL FOR VINEGAR-3;So;0;ON;;;;;N;;;;; -1F70D;ALCHEMICAL SYMBOL FOR SULFUR;So;0;ON;;;;;N;;;;; -1F70E;ALCHEMICAL SYMBOL FOR PHILOSOPHERS SULFUR;So;0;ON;;;;;N;;;;; -1F70F;ALCHEMICAL SYMBOL FOR BLACK SULFUR;So;0;ON;;;;;N;;;;; -1F710;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE;So;0;ON;;;;;N;;;;; -1F711;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-2;So;0;ON;;;;;N;;;;; -1F712;ALCHEMICAL SYMBOL FOR MERCURY SUBLIMATE-3;So;0;ON;;;;;N;;;;; -1F713;ALCHEMICAL SYMBOL FOR CINNABAR;So;0;ON;;;;;N;;;;; -1F714;ALCHEMICAL SYMBOL FOR SALT;So;0;ON;;;;;N;;;;; -1F715;ALCHEMICAL SYMBOL FOR NITRE;So;0;ON;;;;;N;;;;; -1F716;ALCHEMICAL SYMBOL FOR VITRIOL;So;0;ON;;;;;N;;;;; -1F717;ALCHEMICAL SYMBOL FOR VITRIOL-2;So;0;ON;;;;;N;;;;; -1F718;ALCHEMICAL SYMBOL FOR ROCK SALT;So;0;ON;;;;;N;;;;; -1F719;ALCHEMICAL SYMBOL FOR ROCK SALT-2;So;0;ON;;;;;N;;;;; -1F71A;ALCHEMICAL SYMBOL FOR GOLD;So;0;ON;;;;;N;;;;; -1F71B;ALCHEMICAL SYMBOL FOR SILVER;So;0;ON;;;;;N;;;;; -1F71C;ALCHEMICAL SYMBOL FOR IRON ORE;So;0;ON;;;;;N;;;;; -1F71D;ALCHEMICAL SYMBOL FOR IRON ORE-2;So;0;ON;;;;;N;;;;; -1F71E;ALCHEMICAL SYMBOL FOR CROCUS OF IRON;So;0;ON;;;;;N;;;;; -1F71F;ALCHEMICAL SYMBOL FOR REGULUS OF IRON;So;0;ON;;;;;N;;;;; -1F720;ALCHEMICAL SYMBOL FOR COPPER ORE;So;0;ON;;;;;N;;;;; -1F721;ALCHEMICAL SYMBOL FOR IRON-COPPER ORE;So;0;ON;;;;;N;;;;; -1F722;ALCHEMICAL SYMBOL FOR SUBLIMATE OF COPPER;So;0;ON;;;;;N;;;;; -1F723;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER;So;0;ON;;;;;N;;;;; -1F724;ALCHEMICAL SYMBOL FOR CROCUS OF COPPER-2;So;0;ON;;;;;N;;;;; -1F725;ALCHEMICAL SYMBOL FOR COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; -1F726;ALCHEMICAL SYMBOL FOR SALT OF COPPER ANTIMONIATE;So;0;ON;;;;;N;;;;; -1F727;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF COPPER;So;0;ON;;;;;N;;;;; -1F728;ALCHEMICAL SYMBOL FOR VERDIGRIS;So;0;ON;;;;;N;;;;; -1F729;ALCHEMICAL SYMBOL FOR TIN ORE;So;0;ON;;;;;N;;;;; -1F72A;ALCHEMICAL SYMBOL FOR LEAD ORE;So;0;ON;;;;;N;;;;; -1F72B;ALCHEMICAL SYMBOL FOR ANTIMONY ORE;So;0;ON;;;;;N;;;;; -1F72C;ALCHEMICAL SYMBOL FOR SUBLIMATE OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F72D;ALCHEMICAL SYMBOL FOR SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F72E;ALCHEMICAL SYMBOL FOR SUBLIMATE OF SALT OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F72F;ALCHEMICAL SYMBOL FOR VINEGAR OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F730;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY;So;0;ON;;;;;N;;;;; -1F731;ALCHEMICAL SYMBOL FOR REGULUS OF ANTIMONY-2;So;0;ON;;;;;N;;;;; -1F732;ALCHEMICAL SYMBOL FOR REGULUS;So;0;ON;;;;;N;;;;; -1F733;ALCHEMICAL SYMBOL FOR REGULUS-2;So;0;ON;;;;;N;;;;; -1F734;ALCHEMICAL SYMBOL FOR REGULUS-3;So;0;ON;;;;;N;;;;; -1F735;ALCHEMICAL SYMBOL FOR REGULUS-4;So;0;ON;;;;;N;;;;; -1F736;ALCHEMICAL SYMBOL FOR ALKALI;So;0;ON;;;;;N;;;;; -1F737;ALCHEMICAL SYMBOL FOR ALKALI-2;So;0;ON;;;;;N;;;;; -1F738;ALCHEMICAL SYMBOL FOR MARCASITE;So;0;ON;;;;;N;;;;; -1F739;ALCHEMICAL SYMBOL FOR SAL-AMMONIAC;So;0;ON;;;;;N;;;;; -1F73A;ALCHEMICAL SYMBOL FOR ARSENIC;So;0;ON;;;;;N;;;;; -1F73B;ALCHEMICAL SYMBOL FOR REALGAR;So;0;ON;;;;;N;;;;; -1F73C;ALCHEMICAL SYMBOL FOR REALGAR-2;So;0;ON;;;;;N;;;;; -1F73D;ALCHEMICAL SYMBOL FOR AURIPIGMENT;So;0;ON;;;;;N;;;;; -1F73E;ALCHEMICAL SYMBOL FOR BISMUTH ORE;So;0;ON;;;;;N;;;;; -1F73F;ALCHEMICAL SYMBOL FOR TARTAR;So;0;ON;;;;;N;;;;; -1F740;ALCHEMICAL SYMBOL FOR TARTAR-2;So;0;ON;;;;;N;;;;; -1F741;ALCHEMICAL SYMBOL FOR QUICK LIME;So;0;ON;;;;;N;;;;; -1F742;ALCHEMICAL SYMBOL FOR BORAX;So;0;ON;;;;;N;;;;; -1F743;ALCHEMICAL SYMBOL FOR BORAX-2;So;0;ON;;;;;N;;;;; -1F744;ALCHEMICAL SYMBOL FOR BORAX-3;So;0;ON;;;;;N;;;;; -1F745;ALCHEMICAL SYMBOL FOR ALUM;So;0;ON;;;;;N;;;;; -1F746;ALCHEMICAL SYMBOL FOR OIL;So;0;ON;;;;;N;;;;; -1F747;ALCHEMICAL SYMBOL FOR SPIRIT;So;0;ON;;;;;N;;;;; -1F748;ALCHEMICAL SYMBOL FOR TINCTURE;So;0;ON;;;;;N;;;;; -1F749;ALCHEMICAL SYMBOL FOR GUM;So;0;ON;;;;;N;;;;; -1F74A;ALCHEMICAL SYMBOL FOR WAX;So;0;ON;;;;;N;;;;; -1F74B;ALCHEMICAL SYMBOL FOR POWDER;So;0;ON;;;;;N;;;;; -1F74C;ALCHEMICAL SYMBOL FOR CALX;So;0;ON;;;;;N;;;;; -1F74D;ALCHEMICAL SYMBOL FOR TUTTY;So;0;ON;;;;;N;;;;; -1F74E;ALCHEMICAL SYMBOL FOR CAPUT MORTUUM;So;0;ON;;;;;N;;;;; -1F74F;ALCHEMICAL SYMBOL FOR SCEPTER OF JOVE;So;0;ON;;;;;N;;;;; -1F750;ALCHEMICAL SYMBOL FOR CADUCEUS;So;0;ON;;;;;N;;;;; -1F751;ALCHEMICAL SYMBOL FOR TRIDENT;So;0;ON;;;;;N;;;;; -1F752;ALCHEMICAL SYMBOL FOR STARRED TRIDENT;So;0;ON;;;;;N;;;;; -1F753;ALCHEMICAL SYMBOL FOR LODESTONE;So;0;ON;;;;;N;;;;; -1F754;ALCHEMICAL SYMBOL FOR SOAP;So;0;ON;;;;;N;;;;; -1F755;ALCHEMICAL SYMBOL FOR URINE;So;0;ON;;;;;N;;;;; -1F756;ALCHEMICAL SYMBOL FOR HORSE DUNG;So;0;ON;;;;;N;;;;; -1F757;ALCHEMICAL SYMBOL FOR ASHES;So;0;ON;;;;;N;;;;; -1F758;ALCHEMICAL SYMBOL FOR POT ASHES;So;0;ON;;;;;N;;;;; -1F759;ALCHEMICAL SYMBOL FOR BRICK;So;0;ON;;;;;N;;;;; -1F75A;ALCHEMICAL SYMBOL FOR POWDERED BRICK;So;0;ON;;;;;N;;;;; -1F75B;ALCHEMICAL SYMBOL FOR AMALGAM;So;0;ON;;;;;N;;;;; -1F75C;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM;So;0;ON;;;;;N;;;;; -1F75D;ALCHEMICAL SYMBOL FOR STRATUM SUPER STRATUM-2;So;0;ON;;;;;N;;;;; -1F75E;ALCHEMICAL SYMBOL FOR SUBLIMATION;So;0;ON;;;;;N;;;;; -1F75F;ALCHEMICAL SYMBOL FOR PRECIPITATE;So;0;ON;;;;;N;;;;; -1F760;ALCHEMICAL SYMBOL FOR DISTILL;So;0;ON;;;;;N;;;;; -1F761;ALCHEMICAL SYMBOL FOR DISSOLVE;So;0;ON;;;;;N;;;;; -1F762;ALCHEMICAL SYMBOL FOR DISSOLVE-2;So;0;ON;;;;;N;;;;; -1F763;ALCHEMICAL SYMBOL FOR PURIFY;So;0;ON;;;;;N;;;;; -1F764;ALCHEMICAL SYMBOL FOR PUTREFACTION;So;0;ON;;;;;N;;;;; -1F765;ALCHEMICAL SYMBOL FOR CRUCIBLE;So;0;ON;;;;;N;;;;; -1F766;ALCHEMICAL SYMBOL FOR CRUCIBLE-2;So;0;ON;;;;;N;;;;; -1F767;ALCHEMICAL SYMBOL FOR CRUCIBLE-3;So;0;ON;;;;;N;;;;; -1F768;ALCHEMICAL SYMBOL FOR CRUCIBLE-4;So;0;ON;;;;;N;;;;; -1F769;ALCHEMICAL SYMBOL FOR CRUCIBLE-5;So;0;ON;;;;;N;;;;; -1F76A;ALCHEMICAL SYMBOL FOR ALEMBIC;So;0;ON;;;;;N;;;;; -1F76B;ALCHEMICAL SYMBOL FOR BATH OF MARY;So;0;ON;;;;;N;;;;; -1F76C;ALCHEMICAL SYMBOL FOR BATH OF VAPOURS;So;0;ON;;;;;N;;;;; -1F76D;ALCHEMICAL SYMBOL FOR RETORT;So;0;ON;;;;;N;;;;; -1F76E;ALCHEMICAL SYMBOL FOR HOUR;So;0;ON;;;;;N;;;;; -1F76F;ALCHEMICAL SYMBOL FOR NIGHT;So;0;ON;;;;;N;;;;; -1F770;ALCHEMICAL SYMBOL FOR DAY-NIGHT;So;0;ON;;;;;N;;;;; -1F771;ALCHEMICAL SYMBOL FOR MONTH;So;0;ON;;;;;N;;;;; -1F772;ALCHEMICAL SYMBOL FOR HALF DRAM;So;0;ON;;;;;N;;;;; -1F773;ALCHEMICAL SYMBOL FOR HALF OUNCE;So;0;ON;;;;;N;;;;; -1F780;BLACK LEFT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F781;BLACK UP-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F782;BLACK RIGHT-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F783;BLACK DOWN-POINTING ISOSCELES RIGHT TRIANGLE;So;0;ON;;;;;N;;;;; -1F784;BLACK SLIGHTLY SMALL CIRCLE;So;0;ON;;;;;N;;;;; -1F785;MEDIUM BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F786;BOLD WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F787;HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F788;VERY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F789;EXTREMELY HEAVY WHITE CIRCLE;So;0;ON;;;;;N;;;;; -1F78A;WHITE CIRCLE CONTAINING BLACK SMALL CIRCLE;So;0;ON;;;;;N;;;;; -1F78B;ROUND TARGET;So;0;ON;;;;;N;;;;; -1F78C;BLACK TINY SQUARE;So;0;ON;;;;;N;;;;; -1F78D;BLACK SLIGHTLY SMALL SQUARE;So;0;ON;;;;;N;;;;; -1F78E;LIGHT WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F78F;MEDIUM WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F790;BOLD WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F791;HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F792;VERY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F793;EXTREMELY HEAVY WHITE SQUARE;So;0;ON;;;;;N;;;;; -1F794;WHITE SQUARE CONTAINING BLACK VERY SMALL SQUARE;So;0;ON;;;;;N;;;;; -1F795;WHITE SQUARE CONTAINING BLACK MEDIUM SQUARE;So;0;ON;;;;;N;;;;; -1F796;SQUARE TARGET;So;0;ON;;;;;N;;;;; -1F797;BLACK TINY DIAMOND;So;0;ON;;;;;N;;;;; -1F798;BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; -1F799;BLACK MEDIUM SMALL DIAMOND;So;0;ON;;;;;N;;;;; -1F79A;WHITE DIAMOND CONTAINING BLACK VERY SMALL DIAMOND;So;0;ON;;;;;N;;;;; -1F79B;WHITE DIAMOND CONTAINING BLACK MEDIUM DIAMOND;So;0;ON;;;;;N;;;;; -1F79C;DIAMOND TARGET;So;0;ON;;;;;N;;;;; -1F79D;BLACK TINY LOZENGE;So;0;ON;;;;;N;;;;; -1F79E;BLACK VERY SMALL LOZENGE;So;0;ON;;;;;N;;;;; -1F79F;BLACK MEDIUM SMALL LOZENGE;So;0;ON;;;;;N;;;;; -1F7A0;WHITE LOZENGE CONTAINING BLACK SMALL LOZENGE;So;0;ON;;;;;N;;;;; -1F7A1;THIN GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A2;LIGHT GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A3;MEDIUM GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A4;BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A5;VERY BOLD GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A6;VERY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A7;EXTREMELY HEAVY GREEK CROSS;So;0;ON;;;;;N;;;;; -1F7A8;THIN SALTIRE;So;0;ON;;;;;N;;;;; -1F7A9;LIGHT SALTIRE;So;0;ON;;;;;N;;;;; -1F7AA;MEDIUM SALTIRE;So;0;ON;;;;;N;;;;; -1F7AB;BOLD SALTIRE;So;0;ON;;;;;N;;;;; -1F7AC;HEAVY SALTIRE;So;0;ON;;;;;N;;;;; -1F7AD;VERY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; -1F7AE;EXTREMELY HEAVY SALTIRE;So;0;ON;;;;;N;;;;; -1F7AF;LIGHT FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B0;MEDIUM FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B1;BOLD FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B2;HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B3;VERY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B4;EXTREMELY HEAVY FIVE SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B5;LIGHT SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B6;MEDIUM SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B7;BOLD SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B8;HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7B9;VERY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BA;EXTREMELY HEAVY SIX SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BB;LIGHT EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BC;MEDIUM EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BD;BOLD EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BE;HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7BF;VERY HEAVY EIGHT SPOKED ASTERISK;So;0;ON;;;;;N;;;;; -1F7C0;LIGHT THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C1;MEDIUM THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C2;THREE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C3;MEDIUM THREE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7C4;LIGHT FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C5;MEDIUM FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C6;FOUR POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7C7;MEDIUM FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7C8;REVERSE LIGHT FOUR POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7C9;LIGHT FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CA;HEAVY FIVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CB;MEDIUM SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CC;HEAVY SIX POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CD;SIX POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7CE;MEDIUM EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7CF;HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D0;VERY HEAVY EIGHT POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D1;HEAVY EIGHT POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F7D2;LIGHT TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D3;HEAVY TWELVE POINTED BLACK STAR;So;0;ON;;;;;N;;;;; -1F7D4;HEAVY TWELVE POINTED PINWHEEL STAR;So;0;ON;;;;;N;;;;; -1F800;LEFTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F801;UPWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F802;RIGHTWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F803;DOWNWARDS ARROW WITH SMALL TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F804;LEFTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F805;UPWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F806;RIGHTWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F807;DOWNWARDS ARROW WITH MEDIUM TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F808;LEFTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F809;UPWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F80A;RIGHTWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F80B;DOWNWARDS ARROW WITH LARGE TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F810;LEFTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F811;UPWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F812;RIGHTWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F813;DOWNWARDS ARROW WITH SMALL EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F814;LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F815;UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F816;RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F817;DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F818;HEAVY LEFTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F819;HEAVY UPWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81A;HEAVY RIGHTWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81B;HEAVY DOWNWARDS ARROW WITH EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81C;HEAVY LEFTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81D;HEAVY UPWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81E;HEAVY RIGHTWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F81F;HEAVY DOWNWARDS ARROW WITH LARGE EQUILATERAL ARROWHEAD;So;0;ON;;;;;N;;;;; -1F820;LEFTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F821;UPWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F822;RIGHTWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F823;DOWNWARDS TRIANGLE-HEADED ARROW WITH NARROW SHAFT;So;0;ON;;;;;N;;;;; -1F824;LEFTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F825;UPWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F826;RIGHTWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F827;DOWNWARDS TRIANGLE-HEADED ARROW WITH MEDIUM SHAFT;So;0;ON;;;;;N;;;;; -1F828;LEFTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F829;UPWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F82A;RIGHTWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F82B;DOWNWARDS TRIANGLE-HEADED ARROW WITH BOLD SHAFT;So;0;ON;;;;;N;;;;; -1F82C;LEFTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F82D;UPWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F82E;RIGHTWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F82F;DOWNWARDS TRIANGLE-HEADED ARROW WITH HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F830;LEFTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F831;UPWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F832;RIGHTWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F833;DOWNWARDS TRIANGLE-HEADED ARROW WITH VERY HEAVY SHAFT;So;0;ON;;;;;N;;;;; -1F834;LEFTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F835;UPWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F836;RIGHTWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F837;DOWNWARDS FINGER-POST ARROW;So;0;ON;;;;;N;;;;; -1F838;LEFTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F839;UPWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F83A;RIGHTWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F83B;DOWNWARDS SQUARED ARROW;So;0;ON;;;;;N;;;;; -1F83C;LEFTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F83D;UPWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F83E;RIGHTWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F83F;DOWNWARDS COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F840;LEFTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F841;UPWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F842;RIGHTWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F843;DOWNWARDS HEAVY COMPRESSED ARROW;So;0;ON;;;;;N;;;;; -1F844;LEFTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F845;UPWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F846;RIGHTWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F847;DOWNWARDS HEAVY ARROW;So;0;ON;;;;;N;;;;; -1F850;LEFTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F851;UPWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F852;RIGHTWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F853;DOWNWARDS SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F854;NORTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F855;NORTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F856;SOUTH EAST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F857;SOUTH WEST SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F858;LEFT RIGHT SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F859;UP DOWN SANS-SERIF ARROW;So;0;ON;;;;;N;;;;; -1F860;WIDE-HEADED LEFTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F861;WIDE-HEADED UPWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F862;WIDE-HEADED RIGHTWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F863;WIDE-HEADED DOWNWARDS LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F864;WIDE-HEADED NORTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F865;WIDE-HEADED NORTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F866;WIDE-HEADED SOUTH EAST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F867;WIDE-HEADED SOUTH WEST LIGHT BARB ARROW;So;0;ON;;;;;N;;;;; -1F868;WIDE-HEADED LEFTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F869;WIDE-HEADED UPWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F86A;WIDE-HEADED RIGHTWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F86B;WIDE-HEADED DOWNWARDS BARB ARROW;So;0;ON;;;;;N;;;;; -1F86C;WIDE-HEADED NORTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; -1F86D;WIDE-HEADED NORTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; -1F86E;WIDE-HEADED SOUTH EAST BARB ARROW;So;0;ON;;;;;N;;;;; -1F86F;WIDE-HEADED SOUTH WEST BARB ARROW;So;0;ON;;;;;N;;;;; -1F870;WIDE-HEADED LEFTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F871;WIDE-HEADED UPWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F872;WIDE-HEADED RIGHTWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F873;WIDE-HEADED DOWNWARDS MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F874;WIDE-HEADED NORTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F875;WIDE-HEADED NORTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F876;WIDE-HEADED SOUTH EAST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F877;WIDE-HEADED SOUTH WEST MEDIUM BARB ARROW;So;0;ON;;;;;N;;;;; -1F878;WIDE-HEADED LEFTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F879;WIDE-HEADED UPWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87A;WIDE-HEADED RIGHTWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87B;WIDE-HEADED DOWNWARDS HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87C;WIDE-HEADED NORTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87D;WIDE-HEADED NORTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87E;WIDE-HEADED SOUTH EAST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F87F;WIDE-HEADED SOUTH WEST HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F880;WIDE-HEADED LEFTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F881;WIDE-HEADED UPWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F882;WIDE-HEADED RIGHTWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F883;WIDE-HEADED DOWNWARDS VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F884;WIDE-HEADED NORTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F885;WIDE-HEADED NORTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F886;WIDE-HEADED SOUTH EAST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F887;WIDE-HEADED SOUTH WEST VERY HEAVY BARB ARROW;So;0;ON;;;;;N;;;;; -1F890;LEFTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F891;UPWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F892;RIGHTWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F893;DOWNWARDS TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F894;LEFTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F895;UPWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F896;RIGHTWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F897;DOWNWARDS WHITE ARROW WITHIN TRIANGLE ARROWHEAD;So;0;ON;;;;;N;;;;; -1F898;LEFTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F899;UPWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F89A;RIGHTWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F89B;DOWNWARDS ARROW WITH NOTCHED TAIL;So;0;ON;;;;;N;;;;; -1F89C;HEAVY ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; -1F89D;HEAVY ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; -1F89E;HEAVY ARROW SHAFT WIDTH ONE HALF;So;0;ON;;;;;N;;;;; -1F89F;HEAVY ARROW SHAFT WIDTH ONE THIRD;So;0;ON;;;;;N;;;;; -1F8A0;LEFTWARDS BOTTOM-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A1;RIGHTWARDS BOTTOM SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A2;LEFTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A3;RIGHTWARDS TOP SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A4;LEFTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A5;RIGHTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A6;LEFTWARDS RIGHT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A7;RIGHTWARDS LEFT-SHADED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A8;LEFTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8A9;RIGHTWARDS BACK-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8AA;LEFTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8AB;RIGHTWARDS FRONT-TILTED SHADOWED WHITE ARROW;So;0;ON;;;;;N;;;;; -1F8AC;WHITE ARROW SHAFT WIDTH ONE;So;0;ON;;;;;N;;;;; -1F8AD;WHITE ARROW SHAFT WIDTH TWO THIRDS;So;0;ON;;;;;N;;;;; -1F910;ZIPPER-MOUTH FACE;So;0;ON;;;;;N;;;;; -1F911;MONEY-MOUTH FACE;So;0;ON;;;;;N;;;;; -1F912;FACE WITH THERMOMETER;So;0;ON;;;;;N;;;;; -1F913;NERD FACE;So;0;ON;;;;;N;;;;; -1F914;THINKING FACE;So;0;ON;;;;;N;;;;; -1F915;FACE WITH HEAD-BANDAGE;So;0;ON;;;;;N;;;;; -1F916;ROBOT FACE;So;0;ON;;;;;N;;;;; -1F917;HUGGING FACE;So;0;ON;;;;;N;;;;; -1F918;SIGN OF THE HORNS;So;0;ON;;;;;N;;;;; -1F980;CRAB;So;0;ON;;;;;N;;;;; -1F981;LION FACE;So;0;ON;;;;;N;;;;; -1F982;SCORPION;So;0;ON;;;;;N;;;;; -1F983;TURKEY;So;0;ON;;;;;N;;;;; -1F984;UNICORN FACE;So;0;ON;;;;;N;;;;; -1F9C0;CHEESE WEDGE;So;0;ON;;;;;N;;;;; -20000;;Lo;0;L;;;;;N;;;;; -2A6D6;;Lo;0;L;;;;;N;;;;; -2A700;;Lo;0;L;;;;;N;;;;; -2B734;;Lo;0;L;;;;;N;;;;; -2B740;;Lo;0;L;;;;;N;;;;; -2B81D;;Lo;0;L;;;;;N;;;;; -2B820;;Lo;0;L;;;;;N;;;;; -2CEA1;;Lo;0;L;;;;;N;;;;; -2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;; -2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;; -2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;; -2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;; -2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;; -2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;; -2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;; -2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;; -2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;; -2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;; -2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;; -2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;; -2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;; -2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;; -2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;; -2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;; -2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;; -2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;; -2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;; -2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;; -2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;; -2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;; -2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;; -2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;; -2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;; -2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;; -2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;; -2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;; -2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;; -2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;; -2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;; -2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;; -2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;; -2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;; -2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;; -2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;; -2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;; -2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;; -2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;; -2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;; -2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;; -2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;; -2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;; -2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;; -2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;; -2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;; -2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;; -2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;; -2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;; -2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;; -2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;; -2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;; -2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;; -2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;; -2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;; -2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;; -2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;; -2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;; -2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;; -2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;; -2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;; -2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;; -2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;; -2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;; -2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;; -2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;; -2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;; -2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;; -2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;; -2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;; -2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;; -2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;; -2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;; -2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;; -2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;; -2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;; -2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;; -2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;; -2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;; -2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;; -2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;; -2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;; -2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;; -2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;; -2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;; -2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;; -2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;; -2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;; -2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;; -2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;; -2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;; -2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;; -2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;; -2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;; -2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;; -2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;; -2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;; -2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;; -2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;; -2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;; -2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;; -2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;; -2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;; -2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;; -2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;; -2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;; -2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;; -2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;; -2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;; -2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;; -2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;; -2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;; -2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;; -2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;; -2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;; -2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;; -2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;; -2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;; -2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;; -2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;; -2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;; -2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;; -2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;; -2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;; -2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;; -2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;; -2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;; -2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;; -2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;; -2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;; -2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;; -2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;; -2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;; -2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;; -2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;; -2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;; -2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;; -2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;; -2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;; -2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;; -2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;; -2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;; -2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;; -2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;; -2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;9;N;;;;; -2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;; -2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;; -2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;; -2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;; -2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;; -2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;; -2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;; -2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;; -2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;; -2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;; -2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;; -2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;; -2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;; -2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;; -2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;; -2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;; -2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;; -2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;; -2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;; -2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;; -2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;; -2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;; -2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;; -2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;; -2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;; -2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;; -2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;; -2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;; -2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;; -2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;; -2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;; -2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;; -2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;; -2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;; -2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;; -2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;; -2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;; -2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;; -2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;; -2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;; -2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;; -2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;; -2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;; -2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;; -2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;; -2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;; -2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;; -2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;; -2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;; -2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;; -2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;; -2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;; -2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;; -2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;; -2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;; -2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;; -2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;; -2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;; -2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;; -2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;; -2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;; -2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;; -2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;; -2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;; -2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;; -2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;; -2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;; -2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;; -2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;; -2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;; -2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;; -2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;; -2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;; -2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;; -2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;; -2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;; -2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;; -2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;; -2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;; -2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;; -2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;; -2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;; -2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;; -2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;; -2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;; -2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;; -2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;; -2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;; -2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;; -2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;; -2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;; -2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;; -2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;; -2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;; -2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;; -2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;; -2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;; -2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;; -2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;; -2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;; -2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;; -2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;; -2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;; -2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;; -2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;; -2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;; -2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;; -2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;; -2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;; -2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;; -2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;; -2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;; -2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;; -2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;; -2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;; -2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;; -2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;; -2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;; -2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;; -2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;; -2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;; -2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;; -2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;; -2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;; -2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;; -2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;; -2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;; -2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;; -2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;; -2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;; -2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;; -2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;; -2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;; -2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;; -2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;; -2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;; -2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;; -2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;; -2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;; -2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;; -2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;; -2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;; -2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;; -2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;; -2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;; -2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;; -2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;; -2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;; -2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;; -2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;; -2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;; -2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;; -2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;; -2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;; -2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;; -2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;; -2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;; -2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;; -2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;; -2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;; -2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;; -2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;; -2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;; -2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;; -2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;; -2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;; -2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;; -2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;; -2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;; -2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;; -2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;; -2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;; -2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;; -2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;; -2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;; -2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;; -2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;; -2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;; -2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;; -2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;; -2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;; -2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;; -2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;; -2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;; -2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;; -2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;; -2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;; -2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;; -2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;; -2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;; -2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;; -2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;; -2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;; -2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;; -2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;; -2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;; -2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;; -2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;; -2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;; -2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;; -2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;; -2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;; -2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;; -2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;; -2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;; -2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;; -2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;; -2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;; -2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;; -2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;; -2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;; -2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;; -2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;; -2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;; -2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;; -2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;; -2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;; -2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;; -2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;; -2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;; -2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;; -2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;; -2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;; -2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;; -2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;; -2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;; -2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;; -2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;; -2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;; -2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;; -2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;; -2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;; -2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;; -2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;; -2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;; -2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;; -2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;; -2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;; -2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;; -2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;; -2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;; -2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;; -2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;; -2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;; -2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;; -2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;; -2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;; -2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;; -2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;; -2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;; -2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;; -2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;; -2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;; -2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;; -2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;; -2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;; -2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;; -2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;; -2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;; -2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;; -2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;; -2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;; -2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;; -2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;; -2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;; -2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;; -2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;; -2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;; -2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;; -2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;; -2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;; -2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;; -2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;; -2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;; -2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;; -2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;; -2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;; -2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;; -2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;; -2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;; -2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;; -2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;; -2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;; -2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;; -2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;; -2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;; -2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;; -2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;; -2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;; -2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;; -2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;; -2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;; -2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;; -2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;; -2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;; -2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;; -2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;; -2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;; -2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;; -2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;; -2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;; -2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;; -2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;; -2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;; -2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;; -2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;; -2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;; -2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;; -2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;; -2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;; -2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;; -2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;; -2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;; -2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;; -2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;; -2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;; -2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;; -2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;; -2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;; -2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;; -2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;; -2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;; -2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;; -2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;; -2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;; -2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;; -2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;; -2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;; -2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;; -2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;; -2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;; -2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;; -2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;; -2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;; -2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;; -2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;; -2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;; -2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;; -2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;; -2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;; -2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;; -2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;; -2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;; -2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;; -2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;; -2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;; -2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;; -2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;; -2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;; -2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;; -2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;; -2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;; -2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;; -2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;; -2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;; -2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;; -2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;; -2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;; -2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;; -2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;; -2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;; -2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;; -2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;; -2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;; -2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;; -2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;; -2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;; -2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;; -2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;; -2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;; -2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;; -2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;; -2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;; -2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;; -2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;; -2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;; -2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;; -2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;; -2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;; -2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;; -2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;; -2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;; -2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;; -2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;; -2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;; -2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;; -2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;; -2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;; -2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;; -2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;; -2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;; -2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;; -2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;; -2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;; -2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;; -2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;; -2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;; -E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;; -E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;; -E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;; -E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;; -E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;; -E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;; -E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;; -E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;; -E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;; -E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;; -E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;; -E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;; -E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;; -E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;; -E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;; -E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;; -E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;; -E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;; -E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;; -E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;; -E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;; -E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;; -E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;; -E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;; -E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;; -E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;; -E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;; -E003A;TAG COLON;Cf;0;BN;;;;;N;;;;; -E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;; -E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;; -E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;; -E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;; -E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;; -E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;; -E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;; -E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;; -E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;; -E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;; -E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;; -E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;; -E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;; -E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;; -E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;; -E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;; -E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;; -E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;; -E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;; -E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;; -E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;; -E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;; -E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;; -E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;; -E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;; -E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;; -E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;; -E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;; -E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;; -E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;; -E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;; -E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;; -E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; -E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;; -E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;; -E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;; -E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;; -E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;; -E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;; -E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;; -E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;; -E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;; -E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;; -E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;; -E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;; -E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;; -E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;; -E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;; -E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;; -E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;; -E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;; -E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;; -E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;; -E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;; -E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;; -E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;; -E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;; -E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;; -E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;; -E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;; -E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;; -E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;; -E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;; -E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;; -E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; -E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;; -E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;; -E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;; -E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;; -E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;; -E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;; -E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;; -E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;; -E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;; -E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;; -E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;; -E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;; -E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;; -E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;; -E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;; -E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;; -E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;; -E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;; -E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;; -E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;; -E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;; -E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;; -E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;; -E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;; -E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;; -E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;; -E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;; -E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;; -E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;; -E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;; -E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;; -E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;; -E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;; -E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;; -E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;; -E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;; -E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;; -E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;; -E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;; -E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;; -E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;; -E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;; -E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;; -E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;; -E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;; -E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;; -E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;; -E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;; -E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;; -E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;; -E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;; -E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;; -E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;; -E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;; -E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;; -E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;; -E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;; -E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;; -E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;; -E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;; -E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;; -E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;; -E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;; -E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;; -E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;; -E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;; -E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;; -E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;; -E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;; -E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;; -E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;; -E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;; -E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;; -E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;; -E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;; -E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;; -E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;; -E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;; -E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;; -E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;; -E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;; -E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;; -E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;; -E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;; -E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;; -E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;; -E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;; -E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;; -E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;; -E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;; -E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;; -E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;; -E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;; -E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;; -E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;; -E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;; -E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;; -E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;; -E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;; -E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;; -E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;; -E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;; -E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;; -E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;; -E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;; -E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;; -E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;; -E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;; -E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;; -E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;; -E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;; -E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;; -E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;; -E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;; -E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;; -E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;; -E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;; -E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;; -E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;; -E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;; -E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;; -E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;; -E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;; -E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;; -E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;; -E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;; -E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;; -E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;; -E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;; -E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;; -E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;; -E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;; -E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;; -E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;; -E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;; -E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;; -E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;; -E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;; -E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;; -E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;; -E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;; -E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;; -E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;; -E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;; -E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;; -E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;; -E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;; -E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;; -E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;; -E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;; -E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;; -E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;; -E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;; -E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;; -E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;; -E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;; -E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;; -E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;; -E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;; -E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;; -E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;; -E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;; -E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;; -E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;; -E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;; -E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;; -E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;; -E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;; -E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;; -E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;; -E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;; -E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;; -E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;; -E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;; -E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;; -E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;; -E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;; -E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;; -E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;; -E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;; -E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;; -E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;; -E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;; -E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;; -E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;; -E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;; -E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;; -E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;; -E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;; -E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;; -E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;; -E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;; -E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;; -E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;; -E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;; -E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;; -E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;; -E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;; -E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;; -E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;; -E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;; -E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;; -E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;; -E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;; -E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;; -E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;; -E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;; -E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;; -E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;; -E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;; -E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;; -E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;; -E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;; -E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;; -E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;; -E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;; -E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;; -E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;; -E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;; -E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;; -E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;; -E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;; -E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;; -E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;; -E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;; -E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;; -E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;; -E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;; -E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;; -E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;; -E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;; -E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;; -E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;; -E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;; -E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;; -E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;; -E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;; -E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;; -E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;; -E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;; -E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;; -E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;; -E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;; -E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;N;;;;; -F0000;;Co;0;L;;;;;N;;;;; -FFFFD;;Co;0;L;;;;;N;;;;; -100000;;Co;0;L;;;;;N;;;;; -10FFFD;;Co;0;L;;;;;N;;;;; diff --git a/unicode/how-to-update.txt b/unicode/how-to-update.txt deleted file mode 100644 index 5014ea151b..0000000000 --- a/unicode/how-to-update.txt +++ /dev/null @@ -1,94 +0,0 @@ -This document contains instructions for updating the Unicode data set used by -the WebEncoders project. - -1) Download the latest UnicodeData.txt and Blocks.txt from the Unicode - Consortium web site. These files are normally found under - http://www.unicode.org/Public/X.Y.Z/ucd/, where X.Y.Z is the version of the - Unicode specification of interest. Replace the UnicodeData.txt and - Blocks.txt files in this folder with the files you downloaded. - -2) Update unicode-copyright.txt in this folder with the following information: - - The exact URLs where you downloaded UnicodeData.txt and Blocks.txt. - - The date on which you downloaded these two files. - - The Unicode copyright and permission notice, if it has changed. The latest - copyright and permission notice can be found at the bottom of - http://www.unicode.org/copyright.html. - -3) Open the Generators solution and run the DefinedCharListGenerator project. - Running this will drop a file unicode-defined-chars.bin into the output - folder. Move this file into the following directory, overwriting the - existing file in that directory: - src\Microsoft.Extensions.WebEncoders.Core\compiler\resources - -4) Open the Generators solution and run the UnicodeTablesGenerator project. - Running this will drop two files UnicodeRanges.generated.txt and - UnicodeRangesTests.generated.txt into the output folder. - -5) Open UnicodeRanges.generated.txt in your favorite text editor. You'll see - that the file contains all of the parsed Unicode block information in - ascending code point order. Manually REMOVE the following blocks from this - text file and re-save it. - - High Surrogates (U+D800..U+DB7F) - - High Private Use Surrogates (U+DB80..U+DBFF) - - Low Surrogates (U+DC00..U+DFFF) - - Private Use Area (U+E000..U+F8FF) - -6) Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.generated.cs in - your IDE. Delete everything within the partial class definition and replace - it with the contents of UnicodeRanges.generated.txt. (Remember to remove - the blocks mentioned in the previous step, otherwise unit tests will fail.) - - Open src\Microsoft.Extensions.WebEncoders.Core\UnicodeRanges.cs in your IDE. - Update the doc comment at the top of the class to reflect the appropriate - version of the Unicode specification. - -7) Open UnicodeRangesTests.generated.txt in your favorite text editor. Just - like in the previous .txt file, you'll need to remove the [InlineData] - lines which map to the Unicode blocks which were manually removed. - See step (5) for the list of which blocks must be removed. Then re-save - this file. - -8) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeRangesTests.cs in - your IDE. Delete all of the [InlineData] attributes on the Range_Unicode - test, then paste the contents of UnicodeRangesTests.generated.txt in - to restore the new [InlineData] list. - - IMPORTANT: Don't delete the [Theory] attribute on this method! - -9) Open test\Microsoft.Extensions.WebEncoders.Tests\UnicodeHelpersTests.cs in - your IDE. Scroll to the bottom of the ReadListOfDefinedCharacters method, - and you'll see a section where the test special-cases CJK Ideographs and - Hangul Syllables. As more characters are added to the Unicode specification - the list of valid CJK Ideographs and Hangul Syllables can grow, so make sure - these match up with the relevant lines in UnicodeData.txt. For instance, at - the time of this writing UnicodeData.txt lists the valid Hangul Syllable - character range as follows: - - AC00;;Lo;0;L;;;;;N;;;;; - D7A3;;Lo;0;L;;;;;N;;;;; - - If necessary, update the logic in the ReadListOfDefinedCharacters method to - account for any changes to these lines in UnicodeData.txt. - -That's it! Run the unit tests and everything should be good to go. If you find -any stray comments throughout the code base that reference a specific version -of the Unicode specification, go ahead and update them so that they correctly -reflect the version you just submitted. - -To recap, the files you should check in are: - -src\Microsoft.Extensions.WebEncoders.Core\compiler\resources\ - unicode-defined-chars.bin - -src\Microsoft.Extensions.WebEncoders.Core\ - UnicodeRanges.cs - UnicodeRanges.generated.cs - -test\Microsoft.Extensions.WebEncoders.Tests\ - UnicodeHelpersTests.cs (if necessary, see step 9) - UnicodeRangesTests.cs - -unicode\ - Blocks.txt - unicode-copyright.txt - UnicodeData.txt diff --git a/unicode/unicode-copyright.txt b/unicode/unicode-copyright.txt deleted file mode 100644 index 9a34a6b8b2..0000000000 --- a/unicode/unicode-copyright.txt +++ /dev/null @@ -1,47 +0,0 @@ -The files Blocks.txt and UnicodeData.txt in this directory were -retrieved from the following URLs on Saturday, September 5, 2015. - -http://www.unicode.org/Public/8.0.0/ucd/Blocks.txt -http://www.unicode.org/Public/8.0.0/ucd/UnicodeData.txt - -The below copyright notice applies to these files. - -======================================================================== - -COPYRIGHT AND PERMISSION NOTICE - -Copyright © 1991-2015 Unicode, Inc. All rights reserved. -Distributed under the Terms of Use in -http://www.unicode.org/copyright.html. - -Permission is hereby granted, free of charge, to any person obtaining -a copy of the Unicode data files and any associated documentation -(the "Data Files") or Unicode software and any associated documentation -(the "Software") to deal in the Data Files or Software -without restriction, including without limitation the rights to use, -copy, modify, merge, publish, distribute, and/or sell copies of -the Data Files or Software, and to permit persons to whom the Data Files -or Software are furnished to do so, provided that -(a) this copyright and permission notice appear with all copies -of the Data Files or Software, -(b) this copyright and permission notice appear in associated -documentation, and -(c) there is clear notice in each modified Data File or in the Software -as well as in the documentation associated with the Data File(s) or -Software that the data or software has been modified. - -THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF -ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE -WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT OF THIRD PARTY RIGHTS. -IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS -NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL -DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, -DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER -TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR -PERFORMANCE OF THE DATA FILES OR SOFTWARE. - -Except as contained in this notice, the name of a copyright holder -shall not be used in advertising or otherwise to promote the sale, -use or other dealings in these Data Files or Software without prior -written authorization of the copyright holder. \ No newline at end of file From 7b9e3adcf324908ef18a5c937b153d3c4347e3c5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:23:47 -0700 Subject: [PATCH 0857/1838] Remove deleted WebEncoders.Core package from NuGetPackageVerifier --- NuGetPackageVerifier.json | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index d465e3b553..d39dab5e26 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -18,7 +18,6 @@ "Microsoft.AspNet.WebUtilities": { }, "Microsoft.Extensions.BufferedHtmlContent.Sources": { }, "Microsoft.Extensions.WebEncoders": { }, - "Microsoft.Extensions.WebEncoders.Core": { }, "Microsoft.Net.Http.Headers": { } } }, From 21373740c7791f5384ed360f1b9df68afe376b48 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:39:39 -0700 Subject: [PATCH 0858/1838] React to WebEncoders change. --- src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index 8e15772526..1ffcf7a001 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -11,9 +11,9 @@ using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Text; +using System.Text.Encodings.Web; using Microsoft.Dnx.Compilation; using Microsoft.Extensions.PlatformAbstractions; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.AspNet.Hosting.Startup { @@ -411,7 +411,7 @@ namespace Microsoft.AspNet.Hosting.Startup return string.Join("
" + Environment.NewLine, input.Split(new[] { "\r\n" }, StringSplitOptions.None) .SelectMany(s => s.Split(new[] { '\r', '\n' }, StringSplitOptions.None)) - .Select(HtmlEncoder.Default.HtmlEncode)); + .Select(HtmlEncoder.Default.Encode)); } private static void WriteException(Exception ex, StringBuilder builder, ref bool wasFailingCallSiteSourceWritten) From 99aa148342d0606c6e8c6fc0c1cc05c3efe667e4 Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 30 Oct 2015 10:56:00 -0700 Subject: [PATCH 0859/1838] Remove un-used namespace. --- .../BufferedHtmlContent.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs index 302692338b..4ca8ba7be8 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs @@ -7,7 +7,6 @@ using System.Diagnostics; using System.IO; using System.Text.Encodings.Web; using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Extensions.WebEncoders; namespace Microsoft.Extensions.Internal { From c80946260a17f5ad046dc77728f5c291ddc235d4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 30 Oct 2015 00:13:10 -0700 Subject: [PATCH 0860/1838] Change the namespace of RequestDelegate - change it to Microsoft.AspNet.Http --- .../Extensions/RunExtensions.cs | 1 + src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs | 1 + src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs | 3 +-- src/Microsoft.AspNet.Http/ApplicationBuilder.cs | 1 + 4 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs index 8280b285ce..42c99925ad 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using Microsoft.AspNet.Http; namespace Microsoft.AspNet.Builder { diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs index 342b7b4f30..be0faecbc8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Builder diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs index 87d215ad6f..b34b6ed86d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs @@ -2,9 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading.Tasks; -using Microsoft.AspNet.Http; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNet.Http { /// /// A function that can process an HTTP request. diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs index 49ed18f3f0..e6164af576 100644 --- a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Http/ApplicationBuilder.cs @@ -5,6 +5,7 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; From 3933a1904e68e338b0f69c8cb6be5971cb4e29a4 Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 20 Oct 2015 15:43:01 -0700 Subject: [PATCH 0861/1838] Refactoring IServerFactory #395 --- .../IServer.cs | 26 +++++++ .../IServerFactory.cs | 14 ++-- .../project.json | 4 +- .../Internal/HostingEngine.cs | 36 +++++----- .../WebHostBuilder.cs | 22 +++++- .../ClientHandler.cs | 30 ++++++-- src/Microsoft.AspNet.TestHost/TestServer.cs | 39 +++++----- .../WebSocketClient.cs | 28 +++++--- .../HostingEngineTests.cs | 64 +++++++++++++---- .../WebHostBuilderTests.cs | 71 +++++++++---------- .../ClientHandlerTests.cs | 57 +++++++-------- 11 files changed, 240 insertions(+), 151 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs new file mode 100644 index 0000000000..c6909990d0 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Hosting.Server +{ + /// + /// Represents a server. + /// + public interface IServer : IDisposable + { + /// + /// A collection of HTTP features of the server. + /// + IFeatureCollection Features { get; } + + /// + /// Start the server with the given function that processes an HTTP request. + /// + /// A function that processes an HTTP request. + void Start(RequestDelegate requestDelegate); + } +} diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs index c685ff8570..163d39f1c0 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs @@ -1,16 +1,20 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting.Server { + /// + /// Represents a factory for creating servers. + /// public interface IServerFactory { - IFeatureCollection Initialize(IConfiguration configuration); - IDisposable Start(IFeatureCollection serverFeatures, Func application); + /// + /// Creates based on the given configuration. + /// + /// An instance of . + /// The created server. + IServer CreateServer(IConfiguration configuration); } } diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index a3ccdf94bb..315af28c3f 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -6,11 +6,11 @@ "url": "git://github.com/aspnet/hosting" }, "dependencies": { - "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" }, "frameworks": { "net451": {}, "dotnet5.4": {} } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 55e2cd589c..c504e6d0e3 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Only one of these should be set internal IServerFactory ServerFactory { get; set; } internal string ServerFactoryLocation { get; set; } - private IFeatureCollection _serverFeatures; + internal IServer Server { get; set; } public HostingEngine( IServiceCollection appServices, @@ -87,15 +87,13 @@ namespace Microsoft.AspNet.Hosting.Internal var application = BuildApplication(); var logger = _applicationServices.GetRequiredService>(); - var contextFactory = _applicationServices.GetRequiredService(); var diagnosticSource = _applicationServices.GetRequiredService(); logger.Starting(); - var server = ServerFactory.Start(_serverFeatures, - async features => + Server.Start( + async httpContext => { - var httpContext = contextFactory.Create(features); httpContext.ApplicationServices = _applicationServices; if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) @@ -135,11 +133,11 @@ namespace Microsoft.AspNet.Hosting.Internal _applicationLifetime.NotifyStarted(); logger.Started(); - return new Application(ApplicationServices, _serverFeatures, new Disposable(() => + return new Application(ApplicationServices, Server.Features, new Disposable(() => { logger.Shutdown(); _applicationLifetime.StopApplication(); - server.Dispose(); + Server.Dispose(); _applicationLifetime.NotifyStopped(); (_applicationServices as IDisposable)?.Dispose(); })); @@ -191,7 +189,7 @@ namespace Microsoft.AspNet.Hosting.Internal EnsureServer(); var builderFactory = _applicationServices.GetRequiredService(); - var builder = builderFactory.CreateBuilder(_serverFeatures); + var builder = builderFactory.CreateBuilder(Server.Features); builder.ApplicationServices = _applicationServices; var startupFilters = _applicationServices.GetService>(); @@ -246,21 +244,21 @@ namespace Microsoft.AspNet.Hosting.Internal private void EnsureServer() { - if (ServerFactory == null) + if (Server == null) { - // Blow up if we don't have a server set at this point - if (ServerFactoryLocation == null) + if (ServerFactory == null) { - throw new InvalidOperationException("IHostingBuilder.UseServer() is required for " + nameof(Start) + "()"); + // Blow up if we don't have a server set at this point + if (ServerFactoryLocation == null) + { + throw new InvalidOperationException("IHostingBuilder.UseServer() is required for " + nameof(Start) + "()"); + } + + ServerFactory = _applicationServices.GetRequiredService().LoadServerFactory(ServerFactoryLocation); } - ServerFactory = _applicationServices.GetRequiredService().LoadServerFactory(ServerFactoryLocation); - } - - if (_serverFeatures == null) - { - _serverFeatures = ServerFactory.Initialize(_config); - var addresses = _serverFeatures?.Get()?.Addresses; + Server = ServerFactory.CreateServer(_config); + var addresses = Server.Features?.Get()?.Addresses; if (addresses != null && !addresses.IsReadOnly) { var port = _config[ServerPort]; diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 8d5c5648e6..ddff824f21 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -42,6 +42,7 @@ namespace Microsoft.AspNet.Hosting // Only one of these should be set private string _serverFactoryLocation; private IServerFactory _serverFactory; + private IServer _server; public WebHostBuilder() : this(config: new ConfigurationBuilder().Build()) @@ -133,6 +134,7 @@ namespace Microsoft.AspNet.Hosting var engine = new HostingEngine(hostingServices, startupLoader, _config, _captureStartupErrors); // Only one of these should be set, but they are used in priority + engine.Server = _server; engine.ServerFactory = _serverFactory; engine.ServerFactoryLocation = _config[ServerKey] ?? _config[OldServerKey] ?? _serverFactoryLocation; @@ -161,7 +163,18 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebHostBuilder UseServer(string assemblyName) + public WebHostBuilder UseServer(IServer server) + { + if (server == null) + { + throw new ArgumentNullException(nameof(server)); + } + + _server = server; + return this; + } + + public WebHostBuilder UseServerFactory(string assemblyName) { if (assemblyName == null) { @@ -172,8 +185,13 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebHostBuilder UseServer(IServerFactory factory) + public WebHostBuilder UseServerFactory(IServerFactory factory) { + if (factory == null) + { + throw new ArgumentNullException(nameof(factory)); + } + _serverFactory = factory; return this; } diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index efcb5dc06e..78e3463bc6 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -23,21 +23,27 @@ namespace Microsoft.AspNet.TestHost /// public class ClientHandler : HttpMessageHandler { - private readonly Func _next; + private readonly RequestDelegate _next; private readonly PathString _pathBase; + private readonly IHttpContextFactory _factory; /// /// Create a new handler. /// /// The pipeline entry point. - public ClientHandler(Func next, PathString pathBase) + public ClientHandler(RequestDelegate next, PathString pathBase, IHttpContextFactory httpContextFactory) { if (next == null) { throw new ArgumentNullException(nameof(next)); } + if (httpContextFactory == null) + { + throw new ArgumentNullException(nameof(httpContextFactory)); + } _next = next; + _factory = httpContextFactory; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. if (pathBase.HasValue && pathBase.Value.EndsWith("/")) @@ -63,7 +69,7 @@ namespace Microsoft.AspNet.TestHost throw new ArgumentNullException(nameof(request)); } - var state = new RequestState(request, _pathBase); + var state = new RequestState(request, _pathBase, _factory); var requestContent = request.Content ?? new StreamContent(Stream.Null); var body = await requestContent.ReadAsStreamAsync(); if (body.CanSeek) @@ -79,7 +85,7 @@ namespace Microsoft.AspNet.TestHost { try { - await _next(state.HttpContext.Features); + await _next(state.HttpContext); state.CompleteResponse(); } catch (Exception ex) @@ -88,6 +94,7 @@ namespace Microsoft.AspNet.TestHost } finally { + state.ServerCleanup(); registration.Dispose(); } }); @@ -102,14 +109,16 @@ namespace Microsoft.AspNet.TestHost private ResponseStream _responseStream; private ResponseFeature _responseFeature; private CancellationTokenSource _requestAbortedSource; + private IHttpContextFactory _factory; private bool _pipelineFinished; - internal RequestState(HttpRequestMessage request, PathString pathBase) + internal RequestState(HttpRequestMessage request, PathString pathBase, IHttpContextFactory factory) { _request = request; _responseTcs = new TaskCompletionSource(); _requestAbortedSource = new CancellationTokenSource(); _pipelineFinished = false; + _factory = factory; if (request.RequestUri.IsDefaultPort) { @@ -120,7 +129,8 @@ namespace Microsoft.AspNet.TestHost request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); } - HttpContext = new DefaultHttpContext(); + HttpContext = _factory.Create(new FeatureCollection()); + HttpContext.Features.Set(new RequestFeature()); _responseFeature = new ResponseFeature(); HttpContext.Features.Set(_responseFeature); @@ -228,6 +238,14 @@ namespace Microsoft.AspNet.TestHost _responseStream.Abort(exception); _responseTcs.TrySetException(exception); } + + internal void ServerCleanup() + { + if (HttpContext != null) + { + _factory.Dispose(HttpContext); + } + } } } } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 176431060c..cd354c3eba 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -14,22 +14,26 @@ using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.TestHost { - public class TestServer : IServerFactory, IDisposable + public class TestServer : IServer { private const string DefaultEnvironmentName = "Development"; private const string ServerName = nameof(TestServer); - private static readonly IFeatureCollection ServerInfo = new FeatureCollection(); - private Func _appDelegate; + private RequestDelegate _appDelegate; private IDisposable _appInstance; private bool _disposed = false; + private IHttpContextFactory _httpContextFactory; public TestServer(WebHostBuilder builder) { - _appInstance = builder.UseServer(this).Build().Start(); + var hostingEngine = builder.UseServer(this).Build(); + _httpContextFactory = hostingEngine.ApplicationServices.GetService(); + _appInstance = hostingEngine.Start(); } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); + IFeatureCollection IServer.Features { get; } + public static TestServer Create() { return Create(config: null, configureApp: null, configureServices: null); @@ -95,7 +99,7 @@ namespace Microsoft.AspNet.TestHost public HttpMessageHandler CreateHandler() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); - return new ClientHandler(Invoke, pathBase); + return new ClientHandler(Invoke, pathBase, _httpContextFactory); } public HttpClient CreateClient() @@ -106,7 +110,7 @@ namespace Microsoft.AspNet.TestHost public WebSocketClient CreateWebSocketClient() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); - return new WebSocketClient(Invoke, pathBase); + return new WebSocketClient(Invoke, pathBase, _httpContextFactory); } /// @@ -119,25 +123,13 @@ namespace Microsoft.AspNet.TestHost return new RequestBuilder(this, path); } - public IFeatureCollection Initialize(IConfiguration configuration) - { - return ServerInfo; - } - - public IDisposable Start(IFeatureCollection serverInformation, Func application) - { - _appDelegate = application; - - return this; - } - - public Task Invoke(IFeatureCollection featureCollection) + public Task Invoke(HttpContext context) { if (_disposed) { throw new ObjectDisposedException(GetType().FullName); } - return _appDelegate(featureCollection); + return _appDelegate(context); } public void Dispose() @@ -145,5 +137,10 @@ namespace Microsoft.AspNet.TestHost _disposed = true; _appInstance.Dispose(); } + + void IServer.Start(RequestDelegate requestDelegate) + { + _appDelegate = requestDelegate; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs index 9946d5e4bd..320f43afe8 100644 --- a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs +++ b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs @@ -8,25 +8,31 @@ using System.Net.WebSockets; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.TestHost { public class WebSocketClient { - private readonly Func _next; + private readonly RequestDelegate _next; private readonly PathString _pathBase; + private readonly IHttpContextFactory _httpContextFactory; - internal WebSocketClient(Func next, PathString pathBase) + internal WebSocketClient(RequestDelegate next, PathString pathBase, IHttpContextFactory httpContextFactory) { if (next == null) { throw new ArgumentNullException(nameof(next)); } + if (httpContextFactory == null) + { + throw new ArgumentNullException(nameof(httpContextFactory)); + } _next = next; + _httpContextFactory = httpContextFactory; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. if (pathBase.HasValue && pathBase.Value.EndsWith("/")) @@ -52,7 +58,7 @@ namespace Microsoft.AspNet.TestHost public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken) { - var state = new RequestState(uri, _pathBase, cancellationToken); + var state = new RequestState(uri, _pathBase, cancellationToken, _httpContextFactory); if (ConfigureRequest != null) { @@ -64,7 +70,7 @@ namespace Microsoft.AspNet.TestHost { try { - await _next(state.FeatureCollection); + await _next(state.HttpContext); state.PipelineComplete(); } catch (Exception ex) @@ -84,18 +90,18 @@ namespace Microsoft.AspNet.TestHost { private TaskCompletionSource _clientWebSocketTcs; private WebSocket _serverWebSocket; + private IHttpContextFactory _factory; - public IFeatureCollection FeatureCollection { get; private set; } public HttpContext HttpContext { get; private set; } public Task WebSocketTask { get { return _clientWebSocketTcs.Task; } } - public RequestState(Uri uri, PathString pathBase, CancellationToken cancellationToken) + public RequestState(Uri uri, PathString pathBase, CancellationToken cancellationToken, IHttpContextFactory factory) { + _factory = factory; _clientWebSocketTcs = new TaskCompletionSource(); // HttpContext - FeatureCollection = new FeatureCollection(); - HttpContext = new DefaultHttpContext(FeatureCollection); + HttpContext = _factory.Create(new FeatureCollection()); // Request HttpContext.Features.Set(new RequestFeature()); @@ -147,6 +153,10 @@ namespace Microsoft.AspNet.TestHost public void Dispose() { + if (HttpContext != null) + { + _factory.Dispose(HttpContext); + } if (_serverWebSocket != null) { _serverWebSocket.Dispose(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 928cd5bb35..0e0655ecac 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -14,6 +14,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Configuration; @@ -26,10 +27,33 @@ using Xunit; namespace Microsoft.AspNet.Hosting { - public class HostingEngineTests : IServerFactory + public class HostingEngineTests : IServerFactory, IServer { private readonly IList _startInstances = new List(); private IFeatureCollection _featuresSupportedByThisHost = NewFeatureCollection(); + private IFeatureCollection _instanceFeaturesSupportedByThisHost; + + public IFeatureCollection Features { + get + { + var features = new FeatureCollection(); + + foreach (var feature in _featuresSupportedByThisHost) + { + features[feature.Key] = feature.Value; + } + + if (_instanceFeaturesSupportedByThisHost != null) + { + foreach (var feature in _instanceFeaturesSupportedByThisHost) + { + features[feature.Key] = feature.Value; + } + } + + return features; + } + } static IFeatureCollection NewFeatureCollection() { @@ -431,26 +455,36 @@ namespace Microsoft.AspNet.Hosting return new WebHostBuilder(config ?? new ConfigurationBuilder().Build()); } - public IFeatureCollection Initialize(IConfiguration configuration) + public void Start(RequestDelegate requestDelegate) { - var features = new FeatureCollection(); - features.Set(new ServerAddressesFeature()); - return features; - } - - public IDisposable Start(IFeatureCollection serverFeatures, Func application) - { - var startInstance = new StartInstance(application); + var startInstance = new StartInstance(requestDelegate); _startInstances.Add(startInstance); - application(_featuresSupportedByThisHost); - return startInstance; + requestDelegate(new DefaultHttpContext(Features)); } - public class StartInstance : IDisposable + public void Dispose() { - private readonly Func _application; + if (_startInstances != null) + { + foreach (var startInstance in _startInstances) + { + startInstance.Dispose(); + } + } + } - public StartInstance(Func application) + public IServer CreateServer(IConfiguration configuration) + { + _instanceFeaturesSupportedByThisHost = new FeatureCollection(); + _instanceFeaturesSupportedByThisHost.Set(new ServerAddressesFeature()); + return this; + } + + private class StartInstance : IDisposable + { + private readonly RequestDelegate _application; + + public StartInstance(RequestDelegate application) { _application = application; } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 988194f0a3..3ab61daf96 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -1,13 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; using Microsoft.Extensions.Configuration; @@ -42,11 +42,11 @@ namespace Microsoft.AspNet.Hosting public async Task StartupMissing_Fallback() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup("MissingStartupAssembly").Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup("MissingStartupAssembly").Build(); using (engine.Start()) { - await AssertResponseContains(serverFactory.Application, "MissingStartupAssembly"); + await AssertResponseContains(server.RequestDelegate, "MissingStartupAssembly"); } } @@ -54,11 +54,11 @@ namespace Microsoft.AspNet.Hosting public async Task StartupStaticCtorThrows_Fallback() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup().Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup().Build(); using (engine.Start()) { - await AssertResponseContains(serverFactory.Application, "Exception from static constructor"); + await AssertResponseContains(server.RequestDelegate, "Exception from static constructor"); } } @@ -66,11 +66,11 @@ namespace Microsoft.AspNet.Hosting public async Task StartupCtorThrows_Fallback() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup().Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup().Build(); using (engine.Start()) { - await AssertResponseContains(serverFactory.Application, "Exception from constructor"); + await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } } @@ -78,11 +78,11 @@ namespace Microsoft.AspNet.Hosting public async Task StartupCtorThrows_TypeLoadException() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup().Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup().Build(); using (engine.Start()) { - await AssertResponseContains(serverFactory.Application, "Message from the LoaderException"); + await AssertResponseContains(server.RequestDelegate, "Message from the LoaderException"); } } @@ -90,13 +90,13 @@ namespace Microsoft.AspNet.Hosting public async Task IApplicationLifetimeRegisteredEvenWhenStartupCtorThrows_Fallback() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup().Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup().Build(); using (engine.Start()) { - var service = engine.ApplicationServices.GetService(); + var service = engine.ApplicationServices.GetServices(); Assert.NotNull(service); - await AssertResponseContains(serverFactory.Application, "Exception from constructor"); + await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } } @@ -104,11 +104,11 @@ namespace Microsoft.AspNet.Hosting public async Task StartupConfigureServicesThrows_Fallback() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup().Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup().Build(); using (engine.Start()) { - await AssertResponseContains(serverFactory.Application, "Exception from ConfigureServices"); + await AssertResponseContains(server.RequestDelegate, "Exception from ConfigureServices"); } } @@ -116,11 +116,11 @@ namespace Microsoft.AspNet.Hosting public async Task StartupConfigureThrows_Fallback() { var builder = CreateWebHostBuilder(); - var serverFactory = new TestServerFactory(); - var engine = builder.UseServer(serverFactory).UseStartup().Build(); + var server = new TestServer(); + var engine = builder.UseServer(server).UseStartup().Build(); using (engine.Start()) { - await AssertResponseContains(serverFactory.Application, "Exception from Configure"); + await AssertResponseContains(server.RequestDelegate, "Exception from Configure"); } } @@ -137,36 +137,29 @@ namespace Microsoft.AspNet.Hosting return new WebHostBuilder(config, captureStartupErrors: true); } - private async Task AssertResponseContains(Func app, string expectedText) + private async Task AssertResponseContains(RequestDelegate app, string expectedText) { var httpContext = new DefaultHttpContext(); httpContext.Response.Body = new MemoryStream(); - await app(httpContext.Features); + await app(httpContext); httpContext.Response.Body.Seek(0, SeekOrigin.Begin); var bodyText = new StreamReader(httpContext.Response.Body).ReadToEnd(); Assert.Contains(expectedText, bodyText); } - private class TestServerFactory : IServerFactory + private class TestServer : IServer { - public Func Application { get; set; } + IFeatureCollection IServer.Features { get; } + public RequestDelegate RequestDelegate { get; private set; } - public IFeatureCollection Initialize(IConfiguration configuration) + public void Dispose() { - return new FeatureCollection(); + } - public IDisposable Start(IFeatureCollection serverFeatures, Func application) + public void Start(RequestDelegate requestDelegate) { - Application = application; - return new Disposable(); - } - - private class Disposable : IDisposable - { - public void Dispose() - { - } + RequestDelegate = requestDelegate; } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index ec7976d685..adacdd9d8e 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -17,13 +17,13 @@ namespace Microsoft.AspNet.TestHost { public class ClientHandlerTests { + private IHttpContextFactory _httpContextFactory = new HttpContextFactory(new HttpContextAccessor()); + [Fact] public Task ExpectedKeysAreAvailable() { - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { - var context = new DefaultHttpContext((IFeatureCollection)env); - // TODO: Assert.True(context.RequestAborted.CanBeCanceled); Assert.Equal("HTTP/1.1", context.Request.Protocol); Assert.Equal("GET", context.Request.Method); @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("example.com", context.Request.Host.Value); return Task.FromResult(0); - }, new PathString("/A/Path/")); + }, new PathString("/A/Path/"), _httpContextFactory); var httpClient = new HttpClient(handler); return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query"); } @@ -48,14 +48,13 @@ namespace Microsoft.AspNet.TestHost [Fact] public Task SingleSlashNotMovedToPathBase() { - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { - var context = new DefaultHttpContext((IFeatureCollection)env); Assert.Equal("", context.Request.PathBase.Value); Assert.Equal("/", context.Request.Path.Value); return Task.FromResult(0); - }, new PathString("")); + }, new PathString(""), _httpContextFactory); var httpClient = new HttpClient(handler); return httpClient.GetAsync("https://example.com/"); } @@ -64,15 +63,14 @@ namespace Microsoft.AspNet.TestHost public async Task ResubmitRequestWorks() { int requestCount = 1; - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { - var context = new DefaultHttpContext((IFeatureCollection)env); int read = context.Request.Body.Read(new byte[100], 0, 100); Assert.Equal(11, read); context.Response.Headers["TestHeader"] = "TestValue:" + requestCount++; return Task.FromResult(0); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); HttpMessageInvoker invoker = new HttpMessageInvoker(handler); HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/"); @@ -88,13 +86,11 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task MiddlewareOnlySetsHeaders() { - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { - var context = new DefaultHttpContext((IFeatureCollection)env); - context.Response.Headers["TestHeader"] = "TestValue"; return Task.FromResult(0); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/"); Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); @@ -104,11 +100,11 @@ namespace Microsoft.AspNet.TestHost public async Task BlockingMiddlewareShouldNotBlockClient() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { block.WaitOne(); return Task.FromResult(0); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); Task task = httpClient.GetAsync("https://example.com/"); Assert.False(task.IsCompleted); @@ -121,14 +117,13 @@ namespace Microsoft.AspNet.TestHost public async Task HeadersAvailableBeforeBodyFinished() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(async env => + var handler = new ClientHandler(async context => { - var context = new DefaultHttpContext((IFeatureCollection)env); context.Response.Headers["TestHeader"] = "TestValue"; await context.Response.WriteAsync("BodyStarted,"); block.WaitOne(); await context.Response.WriteAsync("BodyFinished"); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -141,14 +136,13 @@ namespace Microsoft.AspNet.TestHost public async Task FlushSendsHeaders() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(async env => + var handler = new ClientHandler(async context => { - var context = new DefaultHttpContext((IFeatureCollection)env); context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); block.WaitOne(); await context.Response.WriteAsync("BodyFinished"); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -161,14 +155,13 @@ namespace Microsoft.AspNet.TestHost public async Task ClientDisposalCloses() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { - var context = new DefaultHttpContext((IFeatureCollection)env); context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); block.WaitOne(); return Task.FromResult(0); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -187,14 +180,13 @@ namespace Microsoft.AspNet.TestHost public async Task ClientCancellationAborts() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { - var context = new DefaultHttpContext((IFeatureCollection)env); context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); block.WaitOne(); return Task.FromResult(0); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -213,10 +205,10 @@ namespace Microsoft.AspNet.TestHost [Fact] public Task ExceptionBeforeFirstWriteIsReported() { - var handler = new ClientHandler(env => + var handler = new ClientHandler(context => { throw new InvalidOperationException("Test Exception"); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); return Assert.ThrowsAsync(() => httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead)); @@ -227,14 +219,13 @@ namespace Microsoft.AspNet.TestHost public async Task ExceptionAfterFirstWriteIsReported() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(async env => + var handler = new ClientHandler(async context => { - var context = new DefaultHttpContext((IFeatureCollection)env); context.Response.Headers["TestHeader"] = "TestValue"; await context.Response.WriteAsync("BodyStarted"); block.WaitOne(); throw new InvalidOperationException("Test Exception"); - }, PathString.Empty); + }, PathString.Empty, _httpContextFactory); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); From e934f5e4ed0da9053ed5134bcb1cf3012fe9e90a Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Fri, 30 Oct 2015 15:36:55 -0700 Subject: [PATCH 0862/1838] Strong name everything. --- .../project.json | 3 ++- .../Properties/AssemblyInfo.cs | 2 +- .../project.json | 3 ++- src/Microsoft.AspNet.Http.Extensions/project.json | 3 ++- src/Microsoft.AspNet.Http.Features/project.json | 3 ++- src/Microsoft.AspNet.Http/project.json | 3 ++- src/Microsoft.AspNet.Owin/project.json | 3 ++- src/Microsoft.AspNet.WebUtilities/project.json | 3 ++- .../project.json | 4 ++++ .../Properties/AssemblyInfo.cs | 2 +- .../project.json | 3 ++- src/Microsoft.Extensions.WebEncoders/project.json | 3 ++- src/Microsoft.Net.Http.Headers/project.json | 3 ++- .../project.json | 4 ++++ .../project.json | 4 +++- tools/Key.snk | Bin 0 -> 596 bytes 16 files changed, 33 insertions(+), 13 deletions(-) create mode 100644 tools/Key.snk diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index 9fe9c36612..664782f78f 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.WebEncoders.Core": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs index 08ea154ce6..818ea5b97b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs @@ -6,5 +6,5 @@ using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 8c0d539da3..3626d4ebaa 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 5cc71ea727..f5cfa5790d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 0a3df94ed9..2b662e541a 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*" diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index cc8ecdc60c..d8dd30a2a6 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -7,7 +7,8 @@ }, "compilationOptions": { "warningsAsErrors": true, - "allowUnsafe": true + "allowUnsafe": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 545a5bcb92..f24cc304de 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*" diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 93b5d00c98..75ea152b3e 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json index a60d35fe5c..03c915b86b 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "shared": "*.cs", "dependencies": {}, "frameworks": { diff --git a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs index b781d6ca97..172583c8b7 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs +++ b/src/Microsoft.Extensions.WebEncoders.Core/Properties/AssemblyInfo.cs @@ -5,6 +5,6 @@ using System.Reflection; using System.Resources; using System.Runtime.CompilerServices; -[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests")] +[assembly: InternalsVisibleTo("Microsoft.Extensions.WebEncoders.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders.Core/project.json b/src/Microsoft.Extensions.WebEncoders.Core/project.json index 990b9a373b..c418ab88ea 100644 --- a/src/Microsoft.Extensions.WebEncoders.Core/project.json +++ b/src/Microsoft.Extensions.WebEncoders.Core/project.json @@ -7,7 +7,8 @@ }, "compilationOptions": { "allowUnsafe": true, - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index ecc7c0a3d1..5a75cd7144 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 853c52324c..07ce4c413b 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/httpabstractions" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "frameworks": { "net451": {}, diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json index 21eb7701ae..f3e064f81e 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json @@ -1,4 +1,8 @@ { + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json index 87d9e98e9c..d64e6f4db7 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -9,7 +9,9 @@ "test": "xunit.runner.aspnet" }, "compilationOptions": { - "allowUnsafe": true + "allowUnsafe": true, + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "frameworks": { "dnx451": { }, diff --git a/tools/Key.snk b/tools/Key.snk new file mode 100644 index 0000000000000000000000000000000000000000..e10e4889c125d3120cd9e81582243d70f7cbb806 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098=Iw=HCsnz~#iVhm& zj%TU(_THUee?3yHBjk$37ysB?i5#7WD$={H zV4B!OxRPrb|8)HPg~A}8P>^=#y<)56#=E&NzcjOtPK~<4n6GHt=K$ro*T(lhby_@U zEk(hLzk1H)0yXj{A_5>fk-TgNoP|q6(tP2xo8zt8i%212CWM#AeCd?`hS|4~L({h~Moo(~vy&3Z z1uI}`fd^*>o=rwbAGymj6RM^pZm(*Kfhs+Y1#`-2JPWZMK8@;ZWCk2+9bX4YP);~fj-BU*R zQPvWv$89!{Rl9wM+zR>_TSkn^voYxA?2G iKnV#iZ6Ah`K>b=@=IjYJXrxL124zR(38)nxe+&q_$QXwJ literal 0 HcmV?d00001 From 037196d5c7eff127d6dc7ef29e6ba029b8c129e6 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Fri, 30 Oct 2015 19:09:08 -0700 Subject: [PATCH 0863/1838] Restore `null` and `string.Empty` handling from `EncoderExtensions` - prior test encoders were never invoked for `null` or empty `string`s e.g. ``` c# public static void HtmlEncode(this IHtmlEncoder htmlEncoder, string value, TextWriter output) { ... if (!String.IsNullOrEmpty(value)) { htmlEncoder.HtmlEncode(value, 0, value.Length, output); } } ``` - add missing `null` checks and handle `string.Empty` in `TextWriter output, string value, ...` overloads - better match for the underlying `TextEncoder` behaviour - `EncoderExtensions` provided an API like `TextEncoder.Encode(TextWriter output, string value)` - that method calls `Encode(TextWriter output, string value, int startIndex, int characterCount)` --- .../Testing/HtmlTestEncoder.cs | 52 ++++++++++++++++++- .../Testing/JavaScriptTestEncoder.cs | 52 ++++++++++++++++++- .../Testing/UrlTestEncoder.cs | 52 ++++++++++++++++++- .../HtmlTestEncoderTest.cs | 26 ++++++++++ 4 files changed, 179 insertions(+), 3 deletions(-) create mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs index 7768d65bfa..162ce4f6c1 100644 --- a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text.Encodings.Web; @@ -18,11 +19,36 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override string Encode(string value) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value.Length == 0) + { + return string.Empty; + } + return $"HtmlEncode[[{value}]]"; } public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("HtmlEncode[["); output.Write(value, startIndex, characterCount); output.Write("]]"); @@ -30,6 +56,21 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("HtmlEncode[["); output.Write(value.Substring(startIndex, characterCount)); output.Write("]]"); @@ -45,8 +86,17 @@ namespace Microsoft.Extensions.WebEncoders.Testing return -1; } - public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + public override unsafe bool TryEncodeUnicodeScalar( + int unicodeScalar, + char* buffer, + int bufferLength, + out int numberOfCharactersWritten) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + numberOfCharactersWritten = 0; return false; } diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs index 4207e8a43f..bef4461676 100644 --- a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text.Encodings.Web; @@ -18,11 +19,36 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override string Encode(string value) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value.Length == 0) + { + return string.Empty; + } + return $"JavaScriptEncode[[{value}]]"; } public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("JavaScriptEncode[["); output.Write(value, startIndex, characterCount); output.Write("]]"); @@ -30,6 +56,21 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("JavaScriptEncode[["); output.Write(value.Substring(startIndex, characterCount)); output.Write("]]"); @@ -45,8 +86,17 @@ namespace Microsoft.Extensions.WebEncoders.Testing return -1; } - public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + public override unsafe bool TryEncodeUnicodeScalar( + int unicodeScalar, + char* buffer, + int bufferLength, + out int numberOfCharactersWritten) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + numberOfCharactersWritten = 0; return false; } diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs index d10ee75594..295bda63e8 100644 --- a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs +++ b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using System.Text.Encodings.Web; @@ -18,11 +19,36 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override string Encode(string value) { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (value.Length == 0) + { + return string.Empty; + } + return $"UrlEncode[[{value}]]"; } public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("UrlEncode[["); output.Write(value, startIndex, characterCount); output.Write("]]"); @@ -30,6 +56,21 @@ namespace Microsoft.Extensions.WebEncoders.Testing public override void Encode(TextWriter output, string value, int startIndex, int characterCount) { + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + if (characterCount == 0) + { + return; + } + output.Write("UrlEncode[["); output.Write(value.Substring(startIndex, characterCount)); output.Write("]]"); @@ -45,8 +86,17 @@ namespace Microsoft.Extensions.WebEncoders.Testing return -1; } - public override unsafe bool TryEncodeUnicodeScalar(int unicodeScalar, char* buffer, int bufferLength, out int numberOfCharactersWritten) + public override unsafe bool TryEncodeUnicodeScalar( + int unicodeScalar, + char* buffer, + int bufferLength, + out int numberOfCharactersWritten) { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + numberOfCharactersWritten = 0; return false; } diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs new file mode 100644 index 0000000000..baafedc4de --- /dev/null +++ b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; + +namespace Microsoft.Extensions.WebEncoders.Testing +{ + public class HtmlTestEncoderTest + { + [Theory] + [InlineData("", "")] + [InlineData("abcd", "HtmlEncode[[abcd]]")] + [InlineData("<<''\"\">>", "HtmlEncode[[<<''\"\">>]]")] + public void StringEncode_EncodesAsExpected(string input, string expectedOutput) + { + // Arrange + var encoder = new HtmlTestEncoder(); + + // Act + var output = encoder.Encode(input); + + // Assert + Assert.Equal(expectedOutput, output); + } + } +} From 3c2e2b9d982a78e9b1d920516625d2c433d7c246 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 22 Oct 2015 14:13:41 +0100 Subject: [PATCH 0864/1838] #426 Less alloc/wrapping/boxing for Query, Forms, Cookies --- .../FragmentString.cs | 2 +- .../HostString.cs | 10 +- .../HttpRequest.cs | 34 +- .../IFormCollection.cs | 86 +++- .../IFormFile.cs | 3 + .../IFormFileCollection.cs | 3 + .../IQueryCollection.cs | 88 ++++ .../IReadableStringCollection.cs | 39 -- .../IRequestCookieCollection.cs | 87 ++++ .../PathString.cs | 21 +- .../QueryString.cs | 2 +- .../HeaderDictionaryExtensions.cs | 2 +- .../HeaderDictionaryTypeExtensions.cs | 56 ++- .../Internal/HeaderSegment.cs | 7 +- .../Internal/HeaderSegmentCollection.cs | 5 +- .../Internal/ParsingHelpers.cs | 41 +- .../Internal/StringSegment.cs | 146 ------- .../RequestHeaders.cs | 16 +- .../ResponseHeaders.cs | 15 +- .../UriHelper.cs | 4 +- .../IHeaderDictionary.cs | 2 +- .../DefaultHttpRequest.cs | 6 +- .../DefaultHttpResponse.cs | 2 +- .../DefaultWebSocketManager.cs | 2 +- .../Features/FeatureHelpers.cs | 7 +- .../Features/FormFeature.cs | 83 +++- .../Features/FormFile.cs | 4 +- .../Features/HttpRequestLifetimeFeature.cs | 1 - .../Features/IQueryFeature.cs | 2 +- .../Features/IRequestCookiesFeature.cs | 2 +- .../Features/QueryFeature.cs | 35 +- .../Features/RequestCookiesFeature.cs | 37 +- .../Features/ResponseCookiesFeature.cs | 2 +- src/Microsoft.AspNet.Http/FormCollection.cs | 233 +++++++++- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 405 +++++++++++++----- src/Microsoft.AspNet.Http/ItemsDictionary.cs | 7 +- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 38 +- src/Microsoft.AspNet.Http/QueryCollection.cs | 227 ++++++++++ .../ReadableStringCollection.cs | 99 ----- .../ReferenceReadStream.cs | 2 +- .../RequestCookieCollection.cs | 235 ++++++++++ .../RequestCookiesCollection.cs | 105 ----- src/Microsoft.AspNet.Http/ResponseCookies.cs | 60 ++- .../BufferedReadStream.cs | 48 ++- .../FormReader.cs | 4 +- .../KeyValueAccumulator.cs | 32 +- .../MultipartReader.cs | 6 +- .../MultipartSection.cs | 6 +- .../QueryHelpers.cs | 38 +- .../DefaultHttpRequestTests.cs | 14 +- 50 files changed, 1635 insertions(+), 776 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs delete mode 100644 src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs delete mode 100644 src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs create mode 100644 src/Microsoft.AspNet.Http/QueryCollection.cs delete mode 100644 src/Microsoft.AspNet.Http/ReadableStringCollection.cs create mode 100644 src/Microsoft.AspNet.Http/RequestCookieCollection.cs delete mode 100644 src/Microsoft.AspNet.Http/RequestCookiesCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 87b22df243..41757d29fb 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -100,7 +100,7 @@ namespace Microsoft.AspNet.Http string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { - fragmentValue = "#" + fragmentValue; + fragmentValue = $"#{fragmentValue}"; } return new FragmentString(fragmentValue); } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index 59fb4f233d..b5debac327 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -70,18 +70,18 @@ namespace Microsoft.AspNet.Http && _value.IndexOf(':', index + 1) >= 0) { // IPv6 without brackets ::1 is the only type of host with 2 or more colons - return "[" + _value + "]"; + return $"[{_value}]"; } else if (index >= 0) { // Has a port string port = _value.Substring(index); - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); return mapping.GetAscii(_value, 0, index) + port; } else { - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); return mapping.GetAscii(_value); } } @@ -115,12 +115,12 @@ namespace Microsoft.AspNet.Http { // Has a port string port = uriComponent.Substring(index); - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); uriComponent = mapping.GetUnicode(uriComponent, 0, index) + port; } else { - IdnMapping mapping = new IdnMapping(); + var mapping = new IdnMapping(); uriComponent = mapping.GetUnicode(uriComponent); } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index 283eddf4b8..c0f52fd400 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -24,13 +24,13 @@ namespace Microsoft.AspNet.Http public abstract string Method { get; set; } /// - /// Gets or set the HTTP request scheme from owin.RequestScheme. + /// Gets or set the HTTP request scheme. /// - /// The HTTP request scheme from owin.RequestScheme. + /// The HTTP request scheme. public abstract string Scheme { get; set; } /// - /// Returns true if the owin.RequestScheme is https. + /// Returns true if the RequestScheme is https. /// /// true if this request is using https; otherwise, false. public abstract bool IsHttps { get; set; } @@ -42,33 +42,33 @@ namespace Microsoft.AspNet.Http public abstract HostString Host { get; set; } /// - /// Gets or set the owin.RequestPathBase. + /// Gets or set the RequestPathBase. /// - /// The owin.RequestPathBase. + /// The RequestPathBase. public abstract PathString PathBase { get; set; } /// - /// Gets or set the request path from owin.RequestPath. + /// Gets or set the request path from RequestPath. /// - /// The request path from owin.RequestPath. + /// The request path from RequestPath. public abstract PathString Path { get; set; } /// - /// Gets or set the query string from owin.RequestQueryString. + /// Gets or set the query string. /// - /// The query string from owin.RequestQueryString. + /// The query string. public abstract QueryString QueryString { get; set; } /// - /// Gets the query value collection parsed from owin.RequestQueryString. + /// Gets the query value collection parsed from RequestQueryString. /// - /// The query value collection parsed from owin.RequestQueryString. - public abstract IReadableStringCollection Query { get; set; } + /// The query value collection parsed from RequestQueryString. + public abstract IQueryCollection Query { get; set; } /// - /// Gets or set the owin.RequestProtocol. + /// Gets or set the RequestProtocol. /// - /// The owin.RequestProtocol. + /// The RequestProtocol. public abstract string Protocol { get; set; } /// @@ -81,7 +81,7 @@ namespace Microsoft.AspNet.Http /// Gets the collection of Cookies for this request. /// /// The collection of Cookies for this request. - public abstract IReadableStringCollection Cookies { get; set; } + public abstract IRequestCookieCollection Cookies { get; set; } /// /// Gets or sets the Content-Length header @@ -95,9 +95,9 @@ namespace Microsoft.AspNet.Http public abstract string ContentType { get; set; } /// - /// Gets or set the owin.RequestBody Stream. + /// Gets or set the RequestBody Stream. /// - /// The owin.RequestBody Stream. + /// The RequestBody Stream. public abstract Stream Body { get; set; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 68505962c2..03e8116852 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -1,13 +1,95 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + namespace Microsoft.AspNet.Http { /// - /// Contains the parsed form values. + /// Represents the parsed form values sent with the HttpRequest. /// - public interface IFormCollection : IReadableStringCollection + public interface IFormCollection : IEnumerable> { + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + /// + int Count { get; } + + /// + /// Gets an containing the keys of the + /// . + /// + /// + /// An containing the keys of the object + /// that implements . + /// + ICollection Keys { get; } + + /// + /// Determines whether the contains an element + /// with the specified key. + /// + /// + /// The key to locate in the . + /// + /// + /// true if the contains an element with + /// the key; otherwise, false. + /// + /// + /// key is null. + /// + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The key of the value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// + /// + /// true if the object that implements contains + /// an element with the specified key; otherwise, false. + /// + /// + /// key is null. + /// + bool TryGetValue(string key, out StringValues value); + + /// + /// Gets the value with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The element with the specified key, or .Empty if the key is not present. + /// + /// + /// key is null. + /// + /// + /// has a different indexer contract than + /// , as it will return StringValues.Empty for missing entries + /// rather than throwing an Exception. + /// + StringValues this[string key] { get; } + + /// + /// The file collection sent with the request. + /// + /// + /// The files included with the request. IFormFileCollection Files { get; } } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index e85ee75f7f..6f8fdaa2ad 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -5,6 +5,9 @@ using System.IO; namespace Microsoft.AspNet.Http { + /// + /// Represents a file sent with the HttpRequest. + /// public interface IFormFile { string ContentType { get; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs index 4950758b44..229b7bbb8e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs @@ -5,6 +5,9 @@ using System.Collections.Generic; namespace Microsoft.AspNet.Http { + /// + /// Represents the collection of files sent with the HttpRequest. + /// public interface IFormFileCollection : IReadOnlyList { IFormFile this[string name] { get; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs new file mode 100644 index 0000000000..4bed287e38 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs @@ -0,0 +1,88 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Http +{ + /// + /// Represents the HttpRequest query string collection + /// + public interface IQueryCollection : IEnumerable> + { + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + /// + int Count { get; } + + /// + /// Gets an containing the keys of the + /// . + /// + /// + /// An containing the keys of the object + /// that implements . + /// + ICollection Keys { get; } + + /// + /// Determines whether the contains an element + /// with the specified key. + /// + /// + /// The key to locate in the . + /// + /// + /// true if the contains an element with + /// the key; otherwise, false. + /// + /// + /// key is null. + /// + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The key of the value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// + /// + /// true if the object that implements contains + /// an element with the specified key; otherwise, false. + /// + /// + /// key is null. + /// + bool TryGetValue(string key, out StringValues value); + + /// + /// Gets the value with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The element with the specified key, or .Empty if the key is not present. + /// + /// + /// key is null. + /// + /// + /// has a different indexer contract than + /// , as it will return StringValues.Empty for missing entries + /// rather than throwing an Exception. + /// + StringValues this[string key] { get; } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs deleted file mode 100644 index 81c8408753..0000000000 --- a/src/Microsoft.AspNet.Http.Abstractions/IReadableStringCollection.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace Microsoft.AspNet.Http -{ - /// - /// Accessors for headers, query, forms, etc. - /// - public interface IReadableStringCollection : IEnumerable> - { - /// - /// Get the associated value from the collection. - /// Returns StringValues.Empty if the key is not present. - /// - /// - /// - StringValues this[string key] { get; } - - /// - /// Gets the number of elements contained in the collection. - /// - int Count { get; } - - /// - /// Gets a collection containing the keys. - /// - ICollection Keys { get; } - - /// - /// Determines whether the collection contains an element with the specified key. - /// - /// - /// - bool ContainsKey(string key); - } -} diff --git a/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs new file mode 100644 index 0000000000..5cc028b182 --- /dev/null +++ b/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs @@ -0,0 +1,87 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; + +namespace Microsoft.AspNet.Http +{ + /// + /// Represents the HttpRequest cookie collection + /// + public interface IRequestCookieCollection : IEnumerable> + { + /// + /// Gets the number of elements contained in the . + /// + /// + /// The number of elements contained in the . + /// + int Count { get; } + + /// + /// Gets an containing the keys of the + /// . + /// + /// + /// An containing the keys of the object + /// that implements . + /// + ICollection Keys { get; } + + /// + /// Determines whether the contains an element + /// with the specified key. + /// + /// + /// The key to locate in the . + /// + /// + /// true if the contains an element with + /// the key; otherwise, false. + /// + /// + /// key is null. + /// + bool ContainsKey(string key); + + /// + /// Gets the value associated with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The key of the value to get. + /// When this method returns, the value associated with the specified key, if the + /// key is found; otherwise, the default value for the type of the value parameter. + /// This parameter is passed uninitialized. + /// + /// + /// true if the object that implements contains + /// an element with the specified key; otherwise, false. + /// + /// + /// key is null. + /// + bool TryGetValue(string key, out string value); + + /// + /// Gets the value with the specified key. + /// + /// + /// The key of the value to get. + /// + /// + /// The element with the specified key, or .Empty if the key is not present. + /// + /// + /// key is null. + /// + /// + /// has a different indexer contract than + /// , as it will return String.Empty for missing entries + /// rather than throwing an Exception. + /// + string this[string key] { get; } + } +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index ebcc9b107e..8a76d8f548 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -12,6 +12,8 @@ namespace Microsoft.AspNet.Http /// public struct PathString : IEquatable { + private static readonly char[] splitChar = { '/' }; + /// /// Represents the empty path. This field is read-only. /// @@ -66,7 +68,24 @@ namespace Microsoft.AspNet.Http public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. - return HasValue ? string.Join("/", _value.Split('/').Select(UrlEncoder.Default.Encode)) : string.Empty; + if (!HasValue) + { + return string.Empty; + } + var values = _value.Split(splitChar); + var changed = false; + for (var i = 0; i < values.Length; i++) + { + var value = values[i]; + values[i] = UrlEncoder.Default.Encode(value); + + if (!changed && value != values[i]) + { + changed = true; + } + } + + return changed ? string.Join("/", values) : _value; } /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index af2feeedb5..088402b2a7 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -128,7 +128,7 @@ namespace Microsoft.AspNet.Http throw new ArgumentNullException(nameof(value)); } - return new QueryString("?" + UrlEncoder.Default.Encode(name) + '=' + UrlEncoder.Default.Encode(value)); + return new QueryString($"?{UrlEncoder.Default.Encode(name)}={UrlEncoder.Default.Encode(value)}"); } /// diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs index 6a8d909dba..fedf74ab09 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Http /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) { - return ParsingHelpers.GetHeaderSplit(headers, key); + return ParsingHelpers.GetHeaderSplit(headers, key).ToArray(); } /// diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index 5b1f70f471..c9ac784d40 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -78,9 +78,49 @@ namespace Microsoft.AspNet.Http { headers.Remove(name); } + else if (values.Count == 1) + { + headers[name] = new StringValues(values[0].ToString()); + } else { - headers[name] = values.Select(value => value.ToString()).ToArray(); + var newValues = new string[values.Count]; + for (var i = 0; i < values.Count; i++) + { + newValues[i] = values[i].ToString(); + } + headers[name] = new StringValues(newValues); + } + } + + public static void AppendList(this IHeaderDictionary Headers, string name, IList values) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (values == null) + { + throw new ArgumentNullException(nameof(values)); + } + + switch (values.Count) + { + case 0: + Headers.Append(name, StringValues.Empty); + break; + case 1: + Headers.Append(name, new StringValues(values[0].ToString())); + break; + default: + var newValues = new string[values.Count]; + for (var i = 0; i < values.Count; i++) + { + newValues[i] = values[i].ToString(); + } + Headers.Append(name, new StringValues(newValues)); + break; } } @@ -139,7 +179,7 @@ namespace Microsoft.AspNet.Http if (KnownParsers.TryGetValue(typeof(T), out temp)) { var func = (Func)temp; - return func(headers[name]); + return func(headers[name].ToString()); } var value = headers[name]; @@ -148,7 +188,7 @@ namespace Microsoft.AspNet.Http return default(T); } - return GetViaReflection(value); + return GetViaReflection(value.ToString()); } internal static IList GetList(this IHeaderDictionary headers, string name) @@ -162,7 +202,7 @@ namespace Microsoft.AspNet.Http if (KnownListParsers.TryGetValue(typeof(T), out temp)) { var func = (Func, IList>)temp; - return func(headers[name]); + return func(headers[name].ToArray()); } var values = headers[name]; @@ -179,7 +219,7 @@ namespace Microsoft.AspNet.Http // TODO: Cache the reflected type for later? Only if success? var type = typeof(T); var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(methodInfo => + .FirstOrDefault(methodInfo => { if (string.Equals("TryParse", methodInfo.Name, StringComparison.Ordinal) && methodInfo.ReturnParameter.ParameterType.Equals(typeof(bool))) @@ -191,7 +231,7 @@ namespace Microsoft.AspNet.Http && methodParams[1].ParameterType.Equals(type.MakeByRefType()); } return false; - }).FirstOrDefault(); + }); if (method == null) { @@ -213,7 +253,7 @@ namespace Microsoft.AspNet.Http // TODO: Cache the reflected type for later? Only if success? var type = typeof(T); var method = type.GetMethods(BindingFlags.Public | BindingFlags.Static) - .Where(methodInfo => + .FirstOrDefault(methodInfo => { if (string.Equals("TryParseList", methodInfo.Name, StringComparison.Ordinal) && methodInfo.ReturnParameter.ParameterType.Equals(typeof(Boolean))) @@ -225,7 +265,7 @@ namespace Microsoft.AspNet.Http && methodParams[1].ParameterType.Equals(typeof(IList).MakeByRefType()); } return false; - }).FirstOrDefault(); + }); if (method == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs index 72e94d3ef5..acd3a9ade1 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs @@ -1,4 +1,9 @@ -using System; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Extensions.Primitives; + namespace Microsoft.AspNet.Http.Internal { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs index 6806dbaab0..693bce0caf 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs @@ -1,3 +1,6 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System; using System.Collections; using System.Collections.Generic; @@ -16,7 +19,7 @@ namespace Microsoft.AspNet.Http.Internal public bool Equals(HeaderSegmentCollection other) { - return Equals(_headers, other._headers); + return StringValues.Equals(_headers, other._headers); } public override bool Equals(object obj) diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index f829eec939..8d1e5f83e3 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -10,13 +10,13 @@ namespace Microsoft.AspNet.Http.Internal { internal static class ParsingHelpers { - public static StringValues GetHeader(IDictionary headers, string key) + public static StringValues GetHeader(IHeaderDictionary headers, string key) { StringValues value; return headers.TryGetValue(key, out value) ? value : StringValues.Empty; } - public static StringValues GetHeaderSplit(IDictionary headers, string key) + public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key) { var values = GetHeaderUnmodified(headers, key); return new StringValues(GetHeaderSplitImplementation(values).ToArray()); @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified(IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key) { if (headers == null) { @@ -44,7 +44,7 @@ namespace Microsoft.AspNet.Http.Internal return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeaderJoined(IDictionary headers, string key, StringValues value) + public static void SetHeaderJoined(IHeaderDictionary headers, string key, StringValues value) { if (headers == null) { @@ -61,35 +61,26 @@ namespace Microsoft.AspNet.Http.Internal } else { - headers[key] = string.Join(",", value.Select(QuoteIfNeeded)); + headers[key] = string.Join(",", value.Select((s) => QuoteIfNeeded(s))); } } // Quote items that contain comas and are not already quoted. private static string QuoteIfNeeded(string value) { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore + if (!string.IsNullOrWhiteSpace(value) && + value.Contains(',') && + (value[0] != '"' || value[value.Length - 1] != '"')) + { + return $"\"{value}\""; } - else if (value.Contains(',')) - { - if (value[0] != '"' || value[value.Length - 1] != '"') - { - value = '"' + value + '"'; - } - } - return value; } private static string DeQuote(string value) { - if (string.IsNullOrWhiteSpace(value)) - { - // Ignore - } - else if (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"') + if (!string.IsNullOrWhiteSpace(value) && + (value.Length > 1 && value[0] == '"' && value[value.Length - 1] == '"')) { value = value.Substring(1, value.Length - 2); } @@ -97,7 +88,7 @@ namespace Microsoft.AspNet.Http.Internal return value; } - public static void SetHeaderUnmodified(IDictionary headers, string key, StringValues? values) + public static void SetHeaderUnmodified(IHeaderDictionary headers, string key, StringValues? values) { if (headers == null) { @@ -118,7 +109,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderJoined(IDictionary headers, string key, params string[] values) + public static void AppendHeaderJoined(IHeaderDictionary headers, string key, params string[] values) { if (headers == null) { @@ -135,7 +126,7 @@ namespace Microsoft.AspNet.Http.Internal return; } - string existing = GetHeader(headers, key); + string existing = GetHeader(headers, key).ToString(); if (existing == null) { SetHeaderJoined(headers, key, values); @@ -146,7 +137,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static void AppendHeaderUnmodified(IDictionary headers, string key, StringValues values) + public static void AppendHeaderUnmodified(IHeaderDictionary headers, string key, StringValues values) { if (headers == null) { diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs deleted file mode 100644 index 83c998421d..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/StringSegment.cs +++ /dev/null @@ -1,146 +0,0 @@ -using System; - -namespace Microsoft.AspNet.Http.Internal -{ - internal struct StringSegment : IEquatable - { - private readonly string _buffer; - private readonly int _offset; - private readonly int _count; - - // - // Initializes a new instance of the class. - // - public StringSegment(string buffer, int offset, int count) - { - _buffer = buffer; - _offset = offset; - _count = count; - } - - public string Buffer - { - get { return _buffer; } - } - - public int Offset - { - get { return _offset; } - } - - public int Count - { - get { return _count; } - } - - public string Value - { - get { return _offset == -1 ? null : _buffer.Substring(_offset, _count); } - } - - public bool HasValue - { - get { return _offset != -1 && _count != 0 && _buffer != null; } - } - - public bool Equals(StringSegment other) - { - return string.Equals(_buffer, other._buffer) && _offset == other._offset && _count == other._count; - } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - return obj is StringSegment && Equals((StringSegment)obj); - } - - public override int GetHashCode() - { - unchecked - { - int hashCode = (_buffer != null ? _buffer.GetHashCode() : 0); - hashCode = (hashCode * 397) ^ _offset; - hashCode = (hashCode * 397) ^ _count; - return hashCode; - } - } - - public static bool operator ==(StringSegment left, StringSegment right) - { - return left.Equals(right); - } - - public static bool operator !=(StringSegment left, StringSegment right) - { - return !left.Equals(right); - } - - public bool StartsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public bool EndsWith(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count < textLength) - { - return false; - } - - return string.Compare(_buffer, _offset + _count - textLength, text, 0, textLength, comparisonType) == 0; - } - - public bool Equals(string text, StringComparison comparisonType) - { - if (text == null) - { - throw new ArgumentNullException(nameof(text)); - } - - int textLength = text.Length; - if (!HasValue || _count != textLength) - { - return false; - } - - return string.Compare(_buffer, _offset, text, 0, textLength, comparisonType) == 0; - } - - public string Substring(int offset, int length) - { - return _buffer.Substring(_offset + offset, length); - } - - public StringSegment Subsegment(int offset, int length) - { - return new StringSegment(_buffer, _offset + offset, length); - } - - public override string ToString() - { - return Value ?? string.Empty; - } - } - -} diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index 4b31e30615..800c0def6d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,7 +3,7 @@ using System; using System.Collections.Generic; -using System.Linq; +using Microsoft.AspNet.Http.Extensions; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Http.Headers { get { - return HostString.FromUriComponent(Headers[HeaderNames.Host]); + return HostString.FromUriComponent(Headers[HeaderNames.Host].ToString()); } set { @@ -309,17 +309,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList(string name, IList values) { - if (name == null) - { - throw new ArgumentNullException(nameof(name)); - } - - if (values == null) - { - throw new ArgumentNullException(nameof(values)); - } - - Headers.Append(name, values.Select(value => value.ToString()).ToArray()); + Headers.AppendList(name, values); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index e7cb97ad3f..baad250f75 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Http.Extensions; using Microsoft.Net.Http.Headers; @@ -135,7 +134,7 @@ namespace Microsoft.AspNet.Http.Headers get { Uri uri; - if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) + if (Uri.TryCreate(Headers[HeaderNames.Location].ToString(), UriKind.RelativeOrAbsolute, out uri)) { return uri; } @@ -206,17 +205,7 @@ namespace Microsoft.AspNet.Http.Headers public void AppendList(string name, IList values) { - if (name == null) - { - throw new ArgumentNullException(nameof(name)); - } - - if (values == null) - { - throw new ArgumentNullException(nameof(values)); - } - - Headers.Append(name, values.Select(value => value.ToString()).ToArray()); + Headers.AppendList(name, values); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 84143af242..e0d07b6a5f 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return combinePath + query + fragment; + return $"{combinePath}{query.ToString()}{fragment.ToString()}"; } /// @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return scheme + "://" + host + combinePath + query + fragment; + return $"{scheme}://{host.ToString()}{combinePath}{query.ToString()}{fragment.ToString()}"; } /// diff --git a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs index 0c03c29d90..303ff36bcb 100644 --- a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs @@ -7,7 +7,7 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http { /// - /// Represents request and response headers + /// Represents HttpRequest and HttpResponse headers /// public interface IHeaderDictionary : IDictionary { diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index 99f39264ad..c39f01cb07 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -140,11 +140,11 @@ namespace Microsoft.AspNet.Http.Internal public override HostString Host { - get { return HostString.FromUriComponent(Headers["Host"]); } + get { return HostString.FromUriComponent(Headers["Host"].ToString()); } set { Headers["Host"] = value.ToUriComponent(); } } - public override IReadableStringCollection Query + public override IQueryCollection Query { get { return QueryFeature.Query; } set { QueryFeature.Query = value; } @@ -161,7 +161,7 @@ namespace Microsoft.AspNet.Http.Internal get { return HttpRequestFeature.Headers; } } - public override IReadableStringCollection Cookies + public override IRequestCookieCollection Cookies { get { return RequestCookiesFeature.Cookies; } set { RequestCookiesFeature.Cookies = value; } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index f239261b6a..3eade210ce 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return Headers[HeaderNames.ContentType]; + return Headers[HeaderNames.ContentType].ToString(); } set { diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 454b0fa61f..e7394a5384 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols); + return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols).ToArray(); } } diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs index fc59b00e6e..ca6d914ac1 100644 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -5,12 +5,13 @@ using System; namespace Microsoft.AspNet.Http.Features { - internal sealed class FeatureHelpers + internal static class FeatureHelpers { public static T GetAndCache( IFeatureCache cache, IFeatureCollection features, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); @@ -26,6 +27,7 @@ namespace Microsoft.AspNet.Http.Features public static T GetOrCreate( IFeatureCollection features, Func factory) + where T : class { T obj = features.Get(); if (obj == null) @@ -43,6 +45,7 @@ namespace Microsoft.AspNet.Http.Features IFeatureCollection features, Func factory, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); @@ -65,6 +68,7 @@ namespace Microsoft.AspNet.Http.Features IFeatureCollection features, Func factory, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); @@ -88,6 +92,7 @@ namespace Microsoft.AspNet.Http.Features HttpRequest request, Func factory, ref T cachedObject) + where T : class { cache.CheckFeaturesRevision(); diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index b5e71b8cab..f3ed68e34a 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -2,14 +2,12 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal @@ -17,6 +15,8 @@ namespace Microsoft.AspNet.Http.Features.Internal public class FormFeature : IFormFeature { private readonly HttpRequest _request; + private Task _parsedFormTask; + private IFormCollection _form; public FormFeature(IFormCollection form) { @@ -63,7 +63,15 @@ namespace Microsoft.AspNet.Http.Features.Internal } } - public IFormCollection Form { get; set; } + public IFormCollection Form + { + get { return _form; } + set + { + _parsedFormTask = null; + _form = value; + } + } public IFormCollection ReadForm() { @@ -77,17 +85,32 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); } + // TODO: Issue #456 Avoid Sync-over-Async http://blogs.msdn.com/b/pfxteam/archive/2012/04/13/10293638.aspx // TODO: How do we prevent thread exhaustion? - return ReadFormAsync(CancellationToken.None).GetAwaiter().GetResult(); + return ReadFormAsync().GetAwaiter().GetResult(); } - public async Task ReadFormAsync(CancellationToken cancellationToken) - { - if (Form != null) - { - return Form; - } + public Task ReadFormAsync() => ReadFormAsync(CancellationToken.None); + public Task ReadFormAsync(CancellationToken cancellationToken) + { + // Avoid state machine and task allocation for repeated reads + if (_parsedFormTask == null) + { + if (Form != null) + { + _parsedFormTask = Task.FromResult(Form); + } + else + { + _parsedFormTask = InnerReadFormAsync(cancellationToken); + } + } + return _parsedFormTask; + } + + private async Task InnerReadFormAsync(CancellationToken cancellationToken) + { if (!HasFormContentType) { throw new InvalidOperationException("Incorrect Content-Type: " + _request.ContentType); @@ -97,18 +120,18 @@ namespace Microsoft.AspNet.Http.Features.Internal _request.EnableRewind(); - IDictionary formFields = null; - var files = new FormFileCollection(); + FormCollection formFields = null; + FormFileCollection files = null; // Some of these code paths use StreamReader which does not support cancellation tokens. - using (cancellationToken.Register(_request.HttpContext.Abort)) + using (cancellationToken.Register((state) => ((HttpContext)state).Abort(), _request.HttpContext)) { var contentType = ContentType; // Check the content-type if (HasApplicationFormContentType(contentType)) { var encoding = FilterEncoding(contentType.Encoding); - formFields = await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken); + formFields = new FormCollection(await FormReader.ReadFormAsync(_request.Body, encoding, cancellationToken)); } else if (HasMultipartFormContentType(contentType)) { @@ -119,9 +142,8 @@ namespace Microsoft.AspNet.Http.Features.Internal var section = await multipartReader.ReadNextSectionAsync(cancellationToken); while (section != null) { - var headers = new HeaderDictionary(section.Headers); ContentDispositionHeaderValue contentDisposition; - ContentDispositionHeaderValue.TryParse(headers[HeaderNames.ContentDisposition], out contentDisposition); + ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out contentDisposition); if (HasFileContentDisposition(contentDisposition)) { // Find the end @@ -129,8 +151,12 @@ namespace Microsoft.AspNet.Http.Features.Internal var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) { - Headers = headers, + Headers = new HeaderDictionary(section.Headers), }; + if (files == null) + { + files = new FormFileCollection(); + } files.Add(file); } else if (HasFormDataContentDisposition(contentDisposition)) @@ -141,7 +167,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var key = HeaderUtilities.RemoveQuotes(contentDisposition.Name); MediaTypeHeaderValue mediaType; - MediaTypeHeaderValue.TryParse(headers[HeaderNames.ContentType], out mediaType); + MediaTypeHeaderValue.TryParse(section.ContentType, out mediaType); var encoding = FilterEncoding(mediaType?.Encoding); using (var reader = new StreamReader(section.Body, encoding, detectEncodingFromByteOrderMarks: true, bufferSize: 1024, leaveOpen: true)) { @@ -151,20 +177,35 @@ namespace Microsoft.AspNet.Http.Features.Internal } else { - System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + headers[HeaderNames.ContentDisposition]); + System.Diagnostics.Debug.Assert(false, "Unrecognized content-disposition for this section: " + section.ContentDisposition); } section = await multipartReader.ReadNextSectionAsync(cancellationToken); } - formFields = formAccumulator.GetResults(); + if (formAccumulator.HasValues) + { + formFields = new FormCollection(formAccumulator.GetResults(), files); + } } } // Rewind so later readers don't have to. _request.Body.Seek(0, SeekOrigin.Begin); - Form = new FormCollection(formFields, files); + if (formFields != null) + { + Form = formFields; + } + else if (files != null) + { + Form = new FormCollection(null, files); + } + else + { + Form = FormCollection.Empty; + } + return Form; } diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index 557dc9d518..d803cd212b 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -21,13 +21,13 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ContentDisposition { - get { return Headers["Content-Disposition"]; } + get { return Headers["Content-Disposition"].ToString(); } set { Headers["Content-Disposition"] = value; } } public string ContentType { - get { return Headers["Content-Type"]; } + get { return Headers["Content-Type"].ToString(); } set { Headers["Content-Type"] = value; } } diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs index 1b773b93f1..8a8e00f260 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http.Features.Internal { diff --git a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs index a814e38501..269e31babd 100644 --- a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IQueryFeature { - IReadableStringCollection Query { get; set; } + IQueryCollection Query { get; set; } } } diff --git a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs index 73f23d032d..b015b2d848 100644 --- a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs @@ -5,6 +5,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IRequestCookiesFeature { - IReadableStringCollection Cookies { get; set; } + IRequestCookieCollection Cookies { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index b2f59e00dc..e17e612533 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -2,10 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.WebUtilities; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Features.Internal { @@ -17,18 +15,9 @@ namespace Microsoft.AspNet.Http.Features.Internal private IHttpRequestFeature _request; private string _original; - private IReadableStringCollection _parsedValues; + private IQueryCollection _parsedValues; - public QueryFeature(IDictionary query) - : this(new ReadableStringCollection(query)) - { - if (query == null) - { - throw new ArgumentNullException(nameof(query)); - } - } - - public QueryFeature(IReadableStringCollection query) + public QueryFeature(IQueryCollection query) { if (query == null) { @@ -62,20 +51,34 @@ namespace Microsoft.AspNet.Http.Features.Internal get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } - public IReadableStringCollection Query + public IQueryCollection Query { get { if (_features == null) { - return _parsedValues ?? ReadableStringCollection.Empty; + if (_parsedValues == null) + { + _parsedValues = QueryCollection.Empty; + } + return _parsedValues; } var current = HttpRequestFeature.QueryString; if (_parsedValues == null || !string.Equals(_original, current, StringComparison.Ordinal)) { _original = current; - _parsedValues = new ReadableStringCollection(QueryHelpers.ParseQuery(current)); + + var result = QueryHelpers.ParseNullableQuery(current); + + if (result == null) + { + _parsedValues = QueryCollection.Empty; + } + else + { + _parsedValues = new QueryCollection(result); + } } return _parsedValues; } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 9eba2dc96c..e759f1d2c6 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Http.Internal; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; @@ -18,14 +17,9 @@ namespace Microsoft.AspNet.Http.Features.Internal private IHttpRequestFeature _request; private StringValues _original; - private IReadableStringCollection _parsedValues; - - public RequestCookiesFeature(IDictionary cookies) - : this(new ReadableStringCollection(cookies)) - { - } - - public RequestCookiesFeature(IReadableStringCollection cookies) + private IRequestCookieCollection _parsedValues; + + public RequestCookiesFeature(IRequestCookieCollection cookies) { if (cookies == null) { @@ -59,32 +53,30 @@ namespace Microsoft.AspNet.Http.Features.Internal get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } } - public IReadableStringCollection Cookies + public IRequestCookieCollection Cookies { get { if (_features == null) { - return _parsedValues ?? ReadableStringCollection.Empty; + if (_parsedValues == null) + { + _parsedValues = RequestCookieCollection.Empty; + } + return _parsedValues; } var headers = HttpRequestFeature.Headers; StringValues current; if (!headers.TryGetValue(HeaderNames.Cookie, out current)) { - current = StringValues.Empty; + current = string.Empty; } - if (_parsedValues == null || !Enumerable.SequenceEqual(_original, current, StringComparer.Ordinal)) + if (_parsedValues == null || _original != current) { _original = current; - var collectionParser = _parsedValues as RequestCookiesCollection; - if (collectionParser == null) - { - collectionParser = new RequestCookiesCollection(); - _parsedValues = collectionParser; - } - collectionParser.Reparse(current); + _parsedValues = RequestCookieCollection.Parse(current.ToArray()); } return _parsedValues; @@ -104,10 +96,7 @@ namespace Microsoft.AspNet.Http.Features.Internal var headers = new List(); foreach (var pair in _parsedValues) { - foreach (var cookieValue in pair.Value) - { - headers.Add(new CookieHeaderValue(pair.Key, cookieValue).ToString()); - } + headers.Add(new CookieHeaderValue(pair.Key, pair.Value).ToString()); } _original = headers.ToArray(); HttpRequestFeature.Headers[HeaderNames.Cookie] = _original; diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index d56ba114ef..dd7607a731 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cookiesCollection == null) { var headers = HttpResponseFeature.Headers; - _cookiesCollection = new ResponseCookies(new HeaderDictionary(headers)); + _cookiesCollection = new ResponseCookies(headers); } return _cookiesCollection; } diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index a0e7428567..7a7d67c26d 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; +using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; @@ -10,29 +10,226 @@ namespace Microsoft.AspNet.Http.Internal /// /// Contains the parsed form values. /// - public class FormCollection : ReadableStringCollection, IFormCollection + public class FormCollection : IFormCollection { - public FormCollection(IDictionary store) - : this(store, new FormFileCollection()) + public static readonly FormCollection Empty = new FormCollection(); +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); + private static readonly StringValues[] EmptyValues = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; + private static readonly StringValues[] EmptyValues = new StringValues[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + private static IFormFileCollection EmptyFiles = new FormFileCollection(); + + private IFormFileCollection _files; + + private FormCollection() { + // For static Empty } - public FormCollection(IDictionary store, IFormFileCollection files) - : base(store) + public FormCollection(Dictionary fields, IFormFileCollection files = null) { - if (store == null) - { - throw new ArgumentNullException(nameof(store)); - } - - if (files == null) - { - throw new ArgumentNullException(nameof(files)); - } - - Files = files; + // can be null + Store = fields; + _files = files; } - public IFormFileCollection Files { get; } + public IFormFileCollection Files + { + get + { + return _files ?? EmptyFiles; + } + private set { _files = value; } + } + + private Dictionary Store { get; set; } + + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. + public StringValues this[string key] + { + get + { + if (Store == null) + { + return StringValues.Empty; + } + + StringValues value; + if (TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } + } + + /// + /// Gets the number of elements contained in the ;. + /// + /// The number of elements contained in the . + public int Count + { + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + /// + /// Determines whether the contains a specific key. + /// + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out StringValues value) + { + if (Store == null) + { + value = default(StringValues); + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + // Non-boxed Enumerator + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + // Boxed Enumerator + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + // Boxed Enumerator + return Store.GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + return _dictionaryEnumerator.Current; + } + return default(KeyValuePair); + } + } + + public void Dispose() + { + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + void IEnumerator.Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } + } } } diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 2955cddec0..f1fde19a1d 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -9,64 +9,37 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Http.Internal { /// - /// Represents a wrapper for owin.RequestHeaders and owin.ResponseHeaders. + /// Represents a wrapper for RequestHeaders and ResponseHeaders. /// public class HeaderDictionary : IHeaderDictionary { - public HeaderDictionary() : this(new Dictionary(StringComparer.OrdinalIgnoreCase)) +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); + private static readonly StringValues[] EmptyValues = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; + private static readonly StringValues[] EmptyValues = new StringValues[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + public HeaderDictionary() { } - /// - /// Initializes a new instance of the class. - /// - /// The underlying data store. - public HeaderDictionary(IDictionary store) + public HeaderDictionary(Dictionary store) { - if (store == null) - { - throw new ArgumentNullException(nameof(store)); - } - Store = store; } - private IDictionary Store { get; set; } - - /// - /// Gets an that contains the keys in the ;. - /// - /// An that contains the keys in the . - public ICollection Keys + public HeaderDictionary(int capacity) { - get { return Store.Keys; } + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); } - /// - /// - /// - public ICollection Values - { - get { return Store.Values; } - } - - /// - /// Gets the number of elements contained in the ;. - /// - /// The number of elements contained in the . - public int Count - { - get { return Store.Count; } - } - - /// - /// Gets a value that indicates whether the is in read-only mode. - /// - /// true if the is in read-only mode; otherwise, false. - public bool IsReadOnly - { - get { return Store.IsReadOnly; } - } + private Dictionary Store { get; set; } /// /// Get or sets the associated value from the collection as a single string. @@ -75,8 +48,47 @@ namespace Microsoft.AspNet.Http.Internal /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. public StringValues this[string key] { - get { return ParsingHelpers.GetHeader(Store, key); } - set { ParsingHelpers.SetHeader(Store, key, value); } + get + { + if (Store == null) + { + return StringValues.Empty; + } + + StringValues value; + if (TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } + + set + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (StringValues.IsNullOrEmpty(value)) + { + if (Store == null) + { + return; + } + + Store.Remove(key); + } + else + { + if (Store == null) + { + Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); + } + + Store[key] = value; + } + } } /// @@ -87,25 +99,76 @@ namespace Microsoft.AspNet.Http.Internal StringValues IDictionary.this[string key] { get { return Store[key]; } - set { Store[key] = value; } + set { this[key] = value; } } /// - /// Returns an enumerator that iterates through a collection. + /// Gets the number of elements contained in the ;. /// - /// An object that can be used to iterate through the collection. - IEnumerator> IEnumerable>.GetEnumerator() + /// The number of elements contained in the . + public int Count { - return Store.GetEnumerator(); + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } } /// - /// Returns an enumerator that iterates through a collection. + /// Gets a value that indicates whether the is in read-only mode. /// - /// An object that can be used to iterate through the collection. - IEnumerator IEnumerable.GetEnumerator() + /// true if the is in read-only mode; otherwise, false. + public bool IsReadOnly { - return Store.GetEnumerator(); + get + { + return false; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + public ICollection Values + { + get + { + if (Store == null) + { + return EmptyValues; + } + return Store.Values; + } + } + + /// + /// Adds a new list of items to the collection. + /// + /// The item to add. + public void Add(KeyValuePair item) + { + if (item.Key == null) + { + throw new ArgumentNullException("The key is null"); + } + if (Store == null) + { + Store = new Dictionary(1, StringComparer.OrdinalIgnoreCase); + } + Store.Add(item.Key, item.Value); } /// @@ -115,54 +178,27 @@ namespace Microsoft.AspNet.Http.Internal /// The header values. public void Add(string key, StringValues value) { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (Store == null) + { + Store = new Dictionary(1); + } Store.Add(key, value); } - /// - /// Determines whether the contains a specific key. - /// - /// The key. - /// true if the contains a specific key; otherwise, false. - public bool ContainsKey(string key) - { - return Store.ContainsKey(key); - } - - /// - /// Removes the given header from the collection. - /// - /// The header name. - /// true if the specified object was removed from the collection; otherwise, false. - public bool Remove(string key) - { - return Store.Remove(key); - } - - /// - /// Retrieves a value from the dictionary. - /// - /// The header name. - /// The value. - /// true if the contains the key; otherwise, false. - public bool TryGetValue(string key, out StringValues value) - { - return Store.TryGetValue(key, out value); - } - - /// - /// Adds a new list of items to the collection. - /// - /// The item to add. - public void Add(KeyValuePair item) - { - Store.Add(item); - } - /// /// Clears the entire list of objects. /// public void Clear() { + if (Store == null) + { + return; + } Store.Clear(); } @@ -173,17 +209,47 @@ namespace Microsoft.AspNet.Http.Internal /// true if the specified object occurs within this collection; otherwise, false. public bool Contains(KeyValuePair item) { - return Store.Contains(item); + StringValues value; + if (Store == null || + !Store.TryGetValue(item.Key, out value) || + !StringValues.Equals(value, item.Value)) + { + return false; + } + return true; } /// - /// Copies the elements to a one-dimensional Array instance at the specified index. + /// Determines whether the contains a specific key. /// - /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + /// + /// Copies the elements to a one-dimensional Array instance at the specified index. + /// + /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. public void CopyTo(KeyValuePair[] array, int arrayIndex) { - Store.CopyTo(array, arrayIndex); + if (Store == null) + { + return; + } + + foreach (var item in Store) + { + array[arrayIndex] = item; + arrayIndex++; + } } /// @@ -193,7 +259,144 @@ namespace Microsoft.AspNet.Http.Internal /// true if the specified object was removed from the collection; otherwise, false. public bool Remove(KeyValuePair item) { - return Store.Remove(item); + if (Store == null) + { + return false; + } + + StringValues value; + + if (Store.TryGetValue(item.Key, out value) && StringValues.Equals(item.Value, value)) + { + return Store.Remove(item.Key); + } + return false; + } + + /// + /// Removes the given header from the collection. + /// + /// The header name. + /// true if the specified object was removed from the collection; otherwise, false. + public bool Remove(string key) + { + if (Store == null) + { + return false; + } + return Store.Remove(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out StringValues value) + { + if (Store == null) + { + value = default(StringValues); + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + return Store.GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + return _dictionaryEnumerator.Current; + } + return default(KeyValuePair); + } + } + + public void Dispose() + { + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + void IEnumerator.Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } } } } diff --git a/src/Microsoft.AspNet.Http/ItemsDictionary.cs b/src/Microsoft.AspNet.Http/ItemsDictionary.cs index 90e9cd3138..87a27b8b12 100644 --- a/src/Microsoft.AspNet.Http/ItemsDictionary.cs +++ b/src/Microsoft.AspNet.Http/ItemsDictionary.cs @@ -97,7 +97,12 @@ namespace Microsoft.AspNet.Http.Internal bool ICollection>.Remove(KeyValuePair item) { - return Items.Remove(item); + object value; + if (Items.TryGetValue(item.Key, out value) && Equals(item.Value, value)) + { + return Items.Remove(item.Key); + } + return false; } IEnumerator> IEnumerable>.GetEnumerator() diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 9f6feb3d75..8b575fd659 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Internal public bool Equals(HeaderSegmentCollection other) { - return Equals(_headers, other._headers); + return StringValues.Equals(_headers, other._headers); } public override bool Equals(object obj) @@ -363,13 +363,7 @@ namespace Microsoft.AspNet.Http.Internal internal static class ParsingHelpers { - public static StringValues GetHeader(IDictionary headers, string key) - { - StringValues value; - return headers.TryGetValue(key, out value) ? value : StringValues.Empty; - } - - public static StringValues GetHeaderSplit(IDictionary headers, string key) + public static StringValues GetHeaderSplit(IHeaderDictionary headers, string key) { var values = GetHeaderUnmodified(headers, key); return new StringValues(GetHeaderSplitImplementation(values).ToArray()); @@ -386,7 +380,7 @@ namespace Microsoft.AspNet.Http.Internal } } - public static StringValues GetHeaderUnmodified(IDictionary headers, string key) + public static StringValues GetHeaderUnmodified(IHeaderDictionary headers, string key) { if (headers == null) { @@ -397,32 +391,6 @@ namespace Microsoft.AspNet.Http.Internal return headers.TryGetValue(key, out values) ? values : StringValues.Empty; } - public static void SetHeader(IDictionary headers, string key, StringValues value) - { - if (headers == null) - { - throw new ArgumentNullException(nameof(headers)); - } - - if (key == null) - { - throw new ArgumentNullException(nameof(key)); - } - - if (string.IsNullOrWhiteSpace(key)) - { - throw new ArgumentNullException(nameof(key)); - } - if (StringValues.IsNullOrEmpty(value)) - { - headers.Remove(key); - } - else - { - headers[key] = value; - } - } - private static string DeQuote(string value) { if (string.IsNullOrWhiteSpace(value)) diff --git a/src/Microsoft.AspNet.Http/QueryCollection.cs b/src/Microsoft.AspNet.Http/QueryCollection.cs new file mode 100644 index 0000000000..2b9168d500 --- /dev/null +++ b/src/Microsoft.AspNet.Http/QueryCollection.cs @@ -0,0 +1,227 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Http.Internal +{ + /// + /// The HttpRequest query string collection + /// + public class QueryCollection : IQueryCollection + { + public static readonly QueryCollection Empty = new QueryCollection(); +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); + private static readonly StringValues[] EmptyValues = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; + private static readonly StringValues[] EmptyValues = new StringValues[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + private Dictionary Store { get; set; } + + public QueryCollection() + { + } + + public QueryCollection(Dictionary store) + { + Store = store; + } + + public QueryCollection(QueryCollection store) + { + Store = store.Store; + } + + public QueryCollection(int capacity) + { + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); + } + + /// + /// Get or sets the associated value from the collection as a single string. + /// + /// The header name. + /// the associated value from the collection as a StringValues or StringValues.Empty if the key is not present. + public StringValues this[string key] + { + get + { + if (Store == null) + { + return StringValues.Empty; + } + + StringValues value; + if (TryGetValue(key, out value)) + { + return value; + } + return StringValues.Empty; + } + } + + /// + /// Gets the number of elements contained in the ;. + /// + /// The number of elements contained in the . + public int Count + { + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + /// + /// Determines whether the contains a specific key. + /// + /// The key. + /// true if the contains a specific key; otherwise, false. + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + /// + /// Retrieves a value from the dictionary. + /// + /// The header name. + /// The value. + /// true if the contains the key; otherwise, false. + public bool TryGetValue(string key, out StringValues value) + { + if (Store == null) + { + value = default(StringValues); + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + return Store.GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + return Store.GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + return _dictionaryEnumerator.Current; + } + return default(KeyValuePair); + } + } + + public void Dispose() + { + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + void IEnumerator.Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs b/src/Microsoft.AspNet.Http/ReadableStringCollection.cs deleted file mode 100644 index 8239699e1b..0000000000 --- a/src/Microsoft.AspNet.Http/ReadableStringCollection.cs +++ /dev/null @@ -1,99 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; - -namespace Microsoft.AspNet.Http.Internal -{ - /// - /// Accessors for query, forms, etc. - /// - public class ReadableStringCollection : IReadableStringCollection - { - public static readonly IReadableStringCollection Empty = new ReadableStringCollection(new Dictionary(0)); - - /// - /// Create a new wrapper - /// - /// - public ReadableStringCollection(IDictionary store) - { - if (store == null) - { - throw new ArgumentNullException(nameof(store)); - } - - Store = store; - } - - private IDictionary Store { get; set; } - - /// - /// Gets the number of elements contained in the collection. - /// - public int Count - { - get { return Store.Count; } - } - - /// - /// Gets a collection containing the keys. - /// - public ICollection Keys - { - get { return Store.Keys; } - } - - - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns StringValues.Empty if the key is not present. - /// - /// - /// - public StringValues this[string key] - { - get - { - StringValues value; - if (Store.TryGetValue(key, out value)) - { - return value; - } - return StringValues.Empty; - } - } - - /// - /// Determines whether the collection contains an element with the specified key. - /// - /// - /// - public bool ContainsKey(string key) - { - return Store.ContainsKey(key); - } - - - /// - /// - /// - /// - public IEnumerator> GetEnumerator() - { - return Store.GetEnumerator(); - } - - /// - /// - /// - /// - IEnumerator System.Collections.IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs index 1a413d4271..2d6cfdac4e 100644 --- a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNet.Http/ReferenceReadStream.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Http.Internal ThrowIfDisposed(); if (value < 0 || value > Length) { - throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be within the length of the Stream: " + Length); + throw new ArgumentOutOfRangeException(nameof(value), value, "The Position must be within the length of the Stream: " + Length.ToString()); } VerifyPosition(); _position = value; diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs new file mode 100644 index 0000000000..363b69df80 --- /dev/null +++ b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs @@ -0,0 +1,235 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using Microsoft.Net.Http.Headers; + +namespace Microsoft.AspNet.Http.Internal +{ + public class RequestCookieCollection : IRequestCookieCollection + { + public static readonly RequestCookieCollection Empty = new RequestCookieCollection(); +#if DNXCORE50 + private static readonly string[] EmptyKeys = Array.Empty(); +#else + private static readonly string[] EmptyKeys = new string[0]; +#endif + private static readonly Enumerator EmptyEnumerator = new Enumerator(); + // Pre-box + private static readonly IEnumerator> EmptyIEnumeratorType = EmptyEnumerator; + private static readonly IEnumerator EmptyIEnumerator = EmptyEnumerator; + + private Dictionary Store { get; set; } + + public RequestCookieCollection() + { + } + + public RequestCookieCollection(Dictionary store) + { + Store = store; + } + + public RequestCookieCollection(int capacity) + { + Store = new Dictionary(capacity, StringComparer.OrdinalIgnoreCase); + } + + public string this[string key] + { + get + { + if (key == null) + { + throw new ArgumentNullException(nameof(key)); + } + + if (Store == null) + { + return string.Empty; + } + + string value; + if (TryGetValue(key, out value)) + { + return value; + } + return string.Empty; + } + } + + public static RequestCookieCollection Parse(IList values) + { + if (values.Count == 0) + { + return Empty; + } + + IList cookies; + if (CookieHeaderValue.TryParseList(values, out cookies)) + { + if (cookies.Count == 0) + { + return Empty; + } + + var store = new Dictionary(cookies.Count); + for (var i = 0; i < cookies.Count; i++) + { + var cookie = cookies[i]; + var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); + var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); + store[name] = value; + } + + return new RequestCookieCollection(store); + } + return Empty; + } + + public int Count + { + get + { + if (Store == null) + { + return 0; + } + return Store.Count; + } + } + + public ICollection Keys + { + get + { + if (Store == null) + { + return EmptyKeys; + } + return Store.Keys; + } + } + + public bool ContainsKey(string key) + { + if (Store == null) + { + return false; + } + return Store.ContainsKey(key); + } + + public bool TryGetValue(string key, out string value) + { + if (Store == null) + { + value = string.Empty; + return false; + } + return Store.TryGetValue(key, out value); + } + + /// + /// Returns an struct enumerator that iterates through a collection without boxing. + /// + /// An object that can be used to iterate through the collection. + public Enumerator GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyEnumerator; + } + // Non-boxed Enumerator + return new Enumerator(Store.GetEnumerator()); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator> IEnumerable>.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumeratorType; + } + // Boxed Enumerator + return GetEnumerator(); + } + + /// + /// Returns an enumerator that iterates through a collection, boxes in non-empty path. + /// + /// An object that can be used to iterate through the collection. + IEnumerator IEnumerable.GetEnumerator() + { + if (Store == null || Store.Count == 0) + { + // Non-boxed Enumerator + return EmptyIEnumerator; + } + // Boxed Enumerator + return GetEnumerator(); + } + + public struct Enumerator : IEnumerator> + { + // Do NOT make this readonly, or MoveNext will not work + private Dictionary.Enumerator _dictionaryEnumerator; + private bool _notEmpty; + + internal Enumerator(Dictionary.Enumerator dictionaryEnumerator) + { + _dictionaryEnumerator = dictionaryEnumerator; + _notEmpty = true; + } + + public bool MoveNext() + { + if (_notEmpty) + { + return _dictionaryEnumerator.MoveNext(); + } + return false; + } + + public KeyValuePair Current + { + get + { + if (_notEmpty) + { + var current = _dictionaryEnumerator.Current; + return new KeyValuePair(current.Key, current.Value); + } + return default(KeyValuePair); + } + } + + object IEnumerator.Current + { + get + { + return Current; + } + } + + public void Dispose() + { + } + + public void Reset() + { + if (_notEmpty) + { + ((IEnumerator)_dictionaryEnumerator).Reset(); + } + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs b/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs deleted file mode 100644 index d0001c1a5d..0000000000 --- a/src/Microsoft.AspNet.Http/RequestCookiesCollection.cs +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections; -using System.Collections.Generic; -using Microsoft.Extensions.Primitives; -using Microsoft.Net.Http.Headers; - -namespace Microsoft.AspNet.Http.Internal -{ - public class RequestCookiesCollection : IReadableStringCollection - { - private readonly IDictionary _dictionary; - - public RequestCookiesCollection() - { - _dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); - } - - public StringValues this[string key] - { - get { return Get(key); } - } - - /// - /// Gets the number of elements contained in the collection. - /// - public int Count - { - get { return _dictionary.Count; } - } - - /// - /// Gets a collection containing the keys. - /// - public ICollection Keys - { - get { return _dictionary.Keys; } - } - - /// - /// Determines whether the collection contains an element with the specified key. - /// - /// - /// - public bool ContainsKey(string key) - { - return _dictionary.ContainsKey(key); - } - - /// - /// Get the associated value from the collection. Multiple values will be merged. - /// Returns null if the key is not present. - /// - /// - /// - public string Get(string key) - { - string value; - return _dictionary.TryGetValue(key, out value) ? value : null; - } - - /// - /// Get the associated values from the collection in their original format. - /// Returns null if the key is not present. - /// - /// - /// - public IList GetValues(string key) - { - string value; - return _dictionary.TryGetValue(key, out value) ? new[] { value } : null; - } - - public void Reparse(IList values) - { - _dictionary.Clear(); - - IList cookies; - if (CookieHeaderValue.TryParseList(values, out cookies)) - { - foreach (var cookie in cookies) - { - var name = Uri.UnescapeDataString(cookie.Name.Replace('+', ' ')); - var value = Uri.UnescapeDataString(cookie.Value.Replace('+', ' ')); - _dictionary[name] = value; - } - } - } - - public IEnumerator> GetEnumerator() - { - foreach (var pair in _dictionary) - { - yield return new KeyValuePair(pair.Key, pair.Value); - } - } - - IEnumerator IEnumerable.GetEnumerator() - { - return GetEnumerator(); - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index 5075efb004..ed76dec862 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -2,8 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Linq; using System.Text.Encodings.Web; +using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; @@ -80,10 +80,10 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; - Func predicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); + var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; + Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - StringValues deleteCookies = encodedKeyPlusEquals + "; expires=Thu, 01-Jan-1970 00:00:00 GMT"; + StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; var existingValues = Headers[HeaderNames.SetCookie]; if (StringValues.IsNullOrEmpty(existingValues)) { @@ -91,7 +91,24 @@ namespace Microsoft.AspNet.Http.Internal } else { - Headers[HeaderNames.SetCookie] = existingValues.Where(value => !predicate(value)).Concat(deleteCookies).ToArray(); + var values = existingValues.ToArray(); + var newValues = new List(); + + for (var i = 0; i < values.Length; i++) + { + if (!predicate(values[i], encodedKeyPlusEquals)) + { + newValues.Add(values[i]); + } + } + + values = deleteCookies.ToArray(); + for (var i = 0; i < values.Length; i++) + { + newValues.Add(values[i]); + } + + Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); } } @@ -106,33 +123,44 @@ namespace Microsoft.AspNet.Http.Internal { throw new ArgumentNullException(nameof(options)); } - - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; + + var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); - Func rejectPredicate; + Func rejectPredicate; if (domainHasValue) { - rejectPredicate = value => - value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && - value.IndexOf("domain=" + options.Domain, StringComparison.OrdinalIgnoreCase) != -1; + rejectPredicate = (value, encKeyPlusEquals, opts) => + value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && + value.IndexOf($"domain={opts.Domain}", StringComparison.OrdinalIgnoreCase) != -1; } else if (pathHasValue) { - rejectPredicate = value => - value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && - value.IndexOf("path=" + options.Path, StringComparison.OrdinalIgnoreCase) != -1; + rejectPredicate = (value, encKeyPlusEquals, opts) => + value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase) && + value.IndexOf($"path={opts.Path}", StringComparison.OrdinalIgnoreCase) != -1; } else { - rejectPredicate = value => value.StartsWith(encodedKeyPlusEquals, StringComparison.OrdinalIgnoreCase); + rejectPredicate = (value, encKeyPlusEquals, opts) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); } var existingValues = Headers[HeaderNames.SetCookie]; if (!StringValues.IsNullOrEmpty(existingValues)) { - Headers[HeaderNames.SetCookie] = existingValues.Where(value => !rejectPredicate(value)).ToArray(); + var values = existingValues.ToArray(); + var newValues = new List(); + + for (var i = 0; i < values.Length; i++) + { + if (!rejectPredicate(values[i], encodedKeyPlusEquals, options)) + { + newValues.Add(values[i]); + } + } + + Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); } Append(key, string.Empty, new CookieOptions diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs index d78d3b34ce..ccb58d66bc 100644 --- a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs +++ b/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs @@ -262,7 +262,7 @@ namespace Microsoft.AspNet.WebUtilities { if (minCount > _buffer.Length) { - throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length.ToString()); } while (_bufferCount < minCount) { @@ -289,7 +289,7 @@ namespace Microsoft.AspNet.WebUtilities { if (minCount > _buffer.Length) { - throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length); + throw new ArgumentOutOfRangeException(nameof(minCount), minCount, "The value must be smaller than the buffer size: " + _buffer.Length.ToString()); } while (_bufferCount < minCount) { @@ -315,38 +315,42 @@ namespace Microsoft.AspNet.WebUtilities public string ReadLine(int lengthLimit) { CheckDisposed(); - var builder = new MemoryStream(200); - bool foundCR = false, foundCRLF = false; - - while (!foundCRLF && EnsureBuffered()) + using (var builder = new MemoryStream(200)) { - if (builder.Length > lengthLimit) - { - throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); - } - ProcessLineChar(builder, ref foundCR, ref foundCRLF); - } + bool foundCR = false, foundCRLF = false; - return DecodeLine(builder, foundCRLF); + while (!foundCRLF && EnsureBuffered()) + { + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit.ToString()); + } + ProcessLineChar(builder, ref foundCR, ref foundCRLF); + } + + return DecodeLine(builder, foundCRLF); + } } public async Task ReadLineAsync(int lengthLimit, CancellationToken cancellationToken) { CheckDisposed(); - var builder = new MemoryStream(200); - bool foundCR = false, foundCRLF = false; - - while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) + using (var builder = new MemoryStream(200)) { - if (builder.Length > lengthLimit) + bool foundCR = false, foundCRLF = false; + + while (!foundCRLF && await EnsureBufferedAsync(cancellationToken)) { - throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit); + if (builder.Length > lengthLimit) + { + throw new InvalidOperationException("Line length limit exceeded: " + lengthLimit.ToString()); + } + + ProcessLineChar(builder, ref foundCR, ref foundCRLF); } - ProcessLineChar(builder, ref foundCR, ref foundCRLF); + return DecodeLine(builder, foundCRLF); } - - return DecodeLine(builder, foundCRLF); } private void ProcessLineChar(MemoryStream builder, ref bool foundCR, ref bool foundCRLF) diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index e361bac1c4..554b86e7b6 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -185,7 +185,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) + public static Task> ReadFormAsync(Stream stream, CancellationToken cancellationToken = new CancellationToken()) { return ReadFormAsync(stream, Encoding.UTF8, cancellationToken); } @@ -195,7 +195,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) + public static async Task> ReadFormAsync(Stream stream, Encoding encoding, CancellationToken cancellationToken = new CancellationToken()) { var reader = new FormReader(stream, encoding); diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs index c0ecc8c45c..9e8f0555ca 100644 --- a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs @@ -7,17 +7,16 @@ using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.WebUtilities { - public class KeyValueAccumulator + public struct KeyValueAccumulator { private Dictionary> _accumulator; - public KeyValueAccumulator() - { - _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); - } - public void Append(string key, string value) { + if (_accumulator == null) + { + _accumulator = new Dictionary>(StringComparer.OrdinalIgnoreCase); + } List values; if (_accumulator.TryGetValue(key, out values)) { @@ -25,18 +24,29 @@ namespace Microsoft.AspNet.WebUtilities } else { - _accumulator[key] = new List(1) { value }; + values = new List(1); + values.Add(value); + _accumulator[key] = values; } } - public IDictionary GetResults() + public bool HasValues => _accumulator != null; + + public Dictionary GetResults() { - var results = new Dictionary(StringComparer.OrdinalIgnoreCase); + if (_accumulator == null) + { + return new Dictionary(StringComparer.OrdinalIgnoreCase); + } + + var results = new Dictionary(_accumulator.Count, StringComparer.OrdinalIgnoreCase); + foreach (var kv in _accumulator) { - results.Add(kv.Key, kv.Value.ToArray()); + results.Add(kv.Key, kv.Value.Count == 1 ? new StringValues(kv.Value[0]) : new StringValues(kv.Value.ToArray())); } + return results; } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index ef6f03a92f..e9e0aba912 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.WebUtilities return new MultipartSection() { Headers = headers, Body = _currentStream, BaseStreamOffset = baseStreamOffset }; } - private async Task> ReadHeadersAsync(CancellationToken cancellationToken) + private async Task> ReadHeadersAsync(CancellationToken cancellationToken) { int totalSize = 0; var accumulator = new KeyValueAccumulator(); @@ -84,10 +84,10 @@ namespace Microsoft.AspNet.WebUtilities totalSize += line.Length; if (totalSize > TotalHeaderSizeLimit) { - throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit); + throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit.ToString()); } int splitIndex = line.IndexOf(':'); - Debug.Assert(splitIndex > 0, "Invalid header line: " + line); + Debug.Assert(splitIndex > 0, $"Invalid header line: {line.ToString()}"); if (splitIndex >= 0) { var name = line.Substring(0, splitIndex); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index 29dfc49574..f3a6e5cc1c 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Type", out values)) { - return values; + return values.ToString(); } return null; } @@ -29,13 +29,13 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Disposition", out values)) { - return values; + return values.ToString(); } return null; } } - public IDictionary Headers { get; set; } + public Dictionary Headers { get; set; } public Stream Body { get; set; } diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 57ee90bc75..036ed55795 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -107,13 +107,39 @@ namespace Microsoft.AspNet.WebUtilities /// /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. - public static IDictionary ParseQuery(string queryString) + public static Dictionary ParseQuery(string queryString) { + var result = ParseNullableQuery(queryString); + + if (result == null) + { + return new Dictionary(); + } + + return result; + } + + + /// + /// Parse a query string into its component key and value parts. + /// + /// The raw query string value, with or without the leading '?'. + /// A collection of parsed keys and values, null if there are no entries. + public static Dictionary ParseNullableQuery(string queryString) + { + var accumulator = new KeyValueAccumulator(); + + if (string.IsNullOrEmpty(queryString) || queryString == "?") + { + return null; + } + + int scanIndex = 0; if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') { - queryString = queryString.Substring(1); + scanIndex = 1; } - var accumulator = new KeyValueAccumulator(); + int textLength = queryString.Length; int equalIndex = queryString.IndexOf('='); @@ -121,7 +147,6 @@ namespace Microsoft.AspNet.WebUtilities { equalIndex = textLength; } - int scanIndex = 0; while (scanIndex < textLength) { int delimiterIndex = queryString.IndexOf('&', scanIndex); @@ -149,6 +174,11 @@ namespace Microsoft.AspNet.WebUtilities scanIndex = delimiterIndex + 1; } + if (!accumulator.HasValues) + { + return null; + } + return accumulator.GetResults(); } } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index e020da61fa..586b8ca183 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -150,7 +150,7 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal("value0", query1["name0"]); Assert.Equal("value1", query1["name1"]); - var query2 = new ReadableStringCollection(new Dictionary() + var query2 = new QueryCollection( new Dictionary() { { "name2", "value2" } }); @@ -170,19 +170,23 @@ namespace Microsoft.AspNet.Http.Internal var cookies0 = request.Cookies; Assert.Equal(0, cookies0.Count); - request.Headers["Cookie"] = new[] { "name0=value0", "name1=value1" }; + var newCookies = new[] { "name0=value0", "name1=value1" }; + request.Headers["Cookie"] = newCookies; + + cookies0 = RequestCookieCollection.Parse(newCookies); var cookies1 = request.Cookies; - Assert.Same(cookies0, cookies1); + Assert.Equal(cookies0, cookies1); Assert.Equal(2, cookies1.Count); Assert.Equal("value0", cookies1["name0"]); Assert.Equal("value1", cookies1["name1"]); + Assert.Equal(newCookies, request.Headers["Cookie"]); - var cookies2 = new ReadableStringCollection(new Dictionary() + var cookies2 = new RequestCookieCollection(new Dictionary() { { "name2", "value2" } }); request.Cookies = cookies2; - Assert.Same(cookies2, request.Cookies); + Assert.Equal(cookies2, request.Cookies); Assert.Equal("value2", request.Cookies["name2"]); cookieHeaders = request.Headers["Cookie"]; Assert.Equal(new[] { "name2=value2" }, cookieHeaders); From 2ed9ae8586c1c33d6e5927ef20347dc33897f705 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Mon, 2 Nov 2015 15:24:06 -0800 Subject: [PATCH 0865/1838] Rename Microsoft.Dnx.Compilation.Abstractions to Microsoft.Extensions.Compilation.Abstractions --- src/Microsoft.AspNet.Hosting/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index edd34b5469..72350a67ae 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -20,7 +20,7 @@ "Microsoft.Extensions.Configuration.Json": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "Microsoft.Extensions.Logging": "1.0.0-*", - "Microsoft.Dnx.Compilation.Abstractions": "1.0.0-*", + "Microsoft.Extensions.Compilation.Abstractions": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" }, From 201e3d325a24f8e7d08af41b7637db785023fe54 Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Mon, 2 Nov 2015 15:50:03 -0800 Subject: [PATCH 0866/1838] Strong name everything. --- .../project.json | 4 ++++ .../project.json | 4 ++++ .../Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 3 ++- src/Microsoft.AspNet.Server.Testing/project.json | 4 ++++ test/Microsoft.AspNet.Hosting.Tests/project.json | 4 ++++ tools/Key.snk | Bin 0 -> 596 bytes 7 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 tools/Key.snk diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index 0bc206ff72..d8764590da 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "description": "ASP.NET 5 Hosting abstractions.", "repository": { "type": "git", diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json index a3ccdf94bb..be15de9ea4 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "description": "ASP.NET 5 Hosting server abstractions.", "repository": { "type": "git", diff --git a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs index 1ee4059c80..4f51e0868a 100644 --- a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs @@ -6,5 +6,5 @@ using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Hosting.Tests")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Hosting.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index edd34b5469..8bfda6e2d9 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -6,7 +6,8 @@ "url": "git://github.com/aspnet/hosting" }, "compilationOptions": { - "warningsAsErrors": true + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" }, "dependencies": { "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 66ee97d55c..833e0f0a62 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "description": "ASP.NET 5 helpers to deploy applications to IIS Express, IIS, WebListener and Kestrel for testing.", "repository": { "type": "git", diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 504a10b0b4..f00e2281e0 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,4 +1,8 @@ { + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "dependencies": { "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", diff --git a/tools/Key.snk b/tools/Key.snk new file mode 100644 index 0000000000000000000000000000000000000000..e10e4889c125d3120cd9e81582243d70f7cbb806 GIT binary patch literal 596 zcmV-a0;~N80ssI2Bme+XQ$aES1ONa50098=Iw=HCsnz~#iVhm& zj%TU(_THUee?3yHBjk$37ysB?i5#7WD$={H zV4B!OxRPrb|8)HPg~A}8P>^=#y<)56#=E&NzcjOtPK~<4n6GHt=K$ro*T(lhby_@U zEk(hLzk1H)0yXj{A_5>fk-TgNoP|q6(tP2xo8zt8i%212CWM#AeCd?`hS|4~L({h~Moo(~vy&3Z z1uI}`fd^*>o=rwbAGymj6RM^pZm(*Kfhs+Y1#`-2JPWZMK8@;ZWCk2+9bX4YP);~fj-BU*R zQPvWv$89!{Rl9wM+zR>_TSkn^voYxA?2G iKnV#iZ6Ah`K>b=@=IjYJXrxL124zR(38)nxe+&q_$QXwJ literal 0 HcmV?d00001 From 7e573631f7144dbe0655a8e247cbd553e27045a5 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 2 Nov 2015 15:56:06 -0800 Subject: [PATCH 0867/1838] Make other FormReader.ReadForm return Dictionary. --- src/Microsoft.AspNet.WebUtilities/FormReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNet.WebUtilities/FormReader.cs index 554b86e7b6..fe86ee56aa 100644 --- a/src/Microsoft.AspNet.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/FormReader.cs @@ -165,7 +165,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// The HTTP form body to parse. /// The collection containing the parsed HTTP form body. - public static IDictionary ReadForm(string text) + public static Dictionary ReadForm(string text) { var reader = new FormReader(text); From bacf76098efba66d66afe680d63f9758047dd38f Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Tue, 3 Nov 2015 06:55:13 -0500 Subject: [PATCH 0868/1838] Performance improvements This adds additional performance improvements (namely string.Concat overloads) on top of #411. --- src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs | 2 +- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 2 +- src/Microsoft.AspNet.Http/ResponseCookies.cs | 4 ++-- src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs index 41757d29fb..87b22df243 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs @@ -100,7 +100,7 @@ namespace Microsoft.AspNet.Http string fragmentValue = uri.GetComponents(UriComponents.Fragment, UriFormat.UriEscaped); if (!string.IsNullOrEmpty(fragmentValue)) { - fragmentValue = $"#{fragmentValue}"; + fragmentValue = "#" + fragmentValue; } return new FragmentString(fragmentValue); } diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index e0d07b6a5f..28d89de253 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return $"{combinePath}{query.ToString()}{fragment.ToString()}"; + return combinePath + query.ToString() + fragment.ToString(); } /// diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index ed76dec862..cd6b9c6ee9 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -80,7 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; @@ -124,7 +124,7 @@ namespace Microsoft.AspNet.Http.Internal throw new ArgumentNullException(nameof(options)); } - var encodedKeyPlusEquals = $"{UrlEncoder.Default.Encode(key)}="; + var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; bool domainHasValue = !string.IsNullOrEmpty(options.Domain); bool pathHasValue = !string.IsNullOrEmpty(options.Path); diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs index 036ed55795..6b0fd267ac 100644 --- a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs @@ -105,7 +105,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// Parse a query string into its component key and value parts. /// - /// The raw query string value, with or without the leading '?'. + /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values. public static Dictionary ParseQuery(string queryString) { @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.WebUtilities /// /// Parse a query string into its component key and value parts. /// - /// The raw query string value, with or without the leading '?'. + /// The raw query string value, with or without the leading '?'. /// A collection of parsed keys and values, null if there are no entries. public static Dictionary ParseNullableQuery(string queryString) { @@ -135,7 +135,7 @@ namespace Microsoft.AspNet.WebUtilities } int scanIndex = 0; - if (!string.IsNullOrEmpty(queryString) && queryString[0] == '?') + if (queryString[0] == '?') { scanIndex = 1; } From 79eed1807ee4edae574dc4d60b93be438ff544bc Mon Sep 17 00:00:00 2001 From: Cesar Blum Silveira Date: Tue, 3 Nov 2015 12:42:26 -0800 Subject: [PATCH 0869/1838] Strong name Microsoft.AspNet.TestHost. --- src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs | 2 +- src/Microsoft.AspNet.TestHost/project.json | 4 ++++ test/Microsoft.AspNet.TestHost.Tests/project.json | 4 ++++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs index 726e557599..23d1e15e16 100644 --- a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs @@ -36,7 +36,7 @@ using System.Runtime.InteropServices; // The following GUID is for the ID of the typelib if this project is exposed to COM [assembly: Guid("12A3EDBB-65B6-4D47-98FC-2B80CEC71E51")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.TestHost.Tests")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.TestHost.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: AssemblyMetadata("Serviceable", "True")] [assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 20bd0b4016..7f32b07622 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -1,5 +1,9 @@ { "version": "1.0.0-*", + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "description": "ASP.NET 5 web server for writing and running tests.", "repository": { "type": "git", diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index ef4d4de144..661f7c8602 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,4 +1,8 @@ { + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "dependencies": { "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.AspNet.TestHost": "1.0.0-*", From c1311f903e2ed948e15acc6a65142ad2516303b2 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 3 Nov 2015 12:52:01 -0800 Subject: [PATCH 0870/1838] Rename Microsoft.Dnx.Compilation.Abstractions to Microsoft.Extensions.Compilation.Abstractions --- src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index 1ffcf7a001..f80b1d99fc 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -12,7 +12,7 @@ using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Text; using System.Text.Encodings.Web; -using Microsoft.Dnx.Compilation; +using Microsoft.Extensions.Compilation; using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index ddff824f21..01434eaa10 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -10,7 +10,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; -using Microsoft.Dnx.Compilation; +using Microsoft.Extensions.Compilation; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; From f050e09283be468998a7bcb7868beea7a484aff2 Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 4 Nov 2015 16:03:36 -0800 Subject: [PATCH 0871/1838] Revert use of explicit converters that prevent APIs from returning null. --- .../HeaderDictionaryExtensions.cs | 2 +- .../HeaderDictionaryTypeExtensions.cs | 4 +- .../Internal/ParsingHelpers.cs | 2 +- .../RequestHeaders.cs | 2 +- .../ResponseHeaders.cs | 2 +- .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 2 +- .../DefaultWebSocketManager.cs | 2 +- .../Features/FormFile.cs | 4 +- .../RequestCookieCollection.cs | 6 +- .../MultipartReader.cs | 2 +- .../MultipartSection.cs | 4 +- .../DefaultHttpRequestTests.cs | 2 + .../DefaultHttpResponseTests.cs | 90 +++++++++++++++++++ 14 files changed, 109 insertions(+), 17 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs index fedf74ab09..6a8d909dba 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Http /// the associated values from the collection separated into individual values, or StringValues.Empty if the key is not present. public static string[] GetCommaSeparatedValues(this IHeaderDictionary headers, string key) { - return ParsingHelpers.GetHeaderSplit(headers, key).ToArray(); + return ParsingHelpers.GetHeaderSplit(headers, key); } /// diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs index c9ac784d40..cd8d26ca25 100644 --- a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -179,7 +179,7 @@ namespace Microsoft.AspNet.Http if (KnownParsers.TryGetValue(typeof(T), out temp)) { var func = (Func)temp; - return func(headers[name].ToString()); + return func(headers[name]); } var value = headers[name]; @@ -202,7 +202,7 @@ namespace Microsoft.AspNet.Http if (KnownListParsers.TryGetValue(typeof(T), out temp)) { var func = (Func, IList>)temp; - return func(headers[name].ToArray()); + return func(headers[name]); } var values = headers[name]; diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs index 8d1e5f83e3..78b7fcd769 100644 --- a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.Http.Internal return; } - string existing = GetHeader(headers, key).ToString(); + string existing = GetHeader(headers, key); if (existing == null) { SetHeaderJoined(headers, key, values); diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index 800c0def6d..dbfff55411 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -170,7 +170,7 @@ namespace Microsoft.AspNet.Http.Headers { get { - return HostString.FromUriComponent(Headers[HeaderNames.Host].ToString()); + return HostString.FromUriComponent(Headers[HeaderNames.Host]); } set { diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs index baad250f75..931b2d931d 100644 --- a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs @@ -134,7 +134,7 @@ namespace Microsoft.AspNet.Http.Headers get { Uri uri; - if (Uri.TryCreate(Headers[HeaderNames.Location].ToString(), UriKind.RelativeOrAbsolute, out uri)) + if (Uri.TryCreate(Headers[HeaderNames.Location], UriKind.RelativeOrAbsolute, out uri)) { return uri; } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index c39f01cb07..d11e75bc03 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -140,7 +140,7 @@ namespace Microsoft.AspNet.Http.Internal public override HostString Host { - get { return HostString.FromUriComponent(Headers["Host"].ToString()); } + get { return HostString.FromUriComponent(Headers["Host"]); } set { Headers["Host"] = value.ToUriComponent(); } } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 3eade210ce..f239261b6a 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return Headers[HeaderNames.ContentType].ToString(); + return Headers[HeaderNames.ContentType]; } set { diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index e7394a5384..454b0fa61f 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols).ToArray(); + return ParsingHelpers.GetHeaderSplit(HttpRequestFeature.Headers, HeaderNames.WebSocketSubProtocols); } } diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index d803cd212b..557dc9d518 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -21,13 +21,13 @@ namespace Microsoft.AspNet.Http.Features.Internal public string ContentDisposition { - get { return Headers["Content-Disposition"].ToString(); } + get { return Headers["Content-Disposition"]; } set { Headers["Content-Disposition"] = value; } } public string ContentType { - get { return Headers["Content-Type"].ToString(); } + get { return Headers["Content-Type"]; } set { Headers["Content-Type"] = value; } } diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs index 363b69df80..8b2a44239c 100644 --- a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs @@ -48,7 +48,7 @@ namespace Microsoft.AspNet.Http.Internal if (Store == null) { - return string.Empty; + return null; } string value; @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Http.Internal { return value; } - return string.Empty; + return null; } } @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.Http.Internal { if (Store == null) { - value = string.Empty; + value = null; return false; } return Store.TryGetValue(key, out value); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs index e9e0aba912..2af2a444f1 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.WebUtilities throw new InvalidOperationException("Total header size limit exceeded: " + TotalHeaderSizeLimit.ToString()); } int splitIndex = line.IndexOf(':'); - Debug.Assert(splitIndex > 0, $"Invalid header line: {line.ToString()}"); + Debug.Assert(splitIndex > 0, $"Invalid header line: {line}"); if (splitIndex >= 0) { var name = line.Substring(0, splitIndex); diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs index f3a6e5cc1c..196cf424ca 100644 --- a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Type", out values)) { - return values.ToString(); + return values; } return null; } @@ -29,7 +29,7 @@ namespace Microsoft.AspNet.WebUtilities StringValues values; if (Headers.TryGetValue("Content-Disposition", out values)) { - return values.ToString(); + return values; } return null; } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs index 586b8ca183..6defe395f4 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs @@ -169,6 +169,8 @@ namespace Microsoft.AspNet.Http.Internal Assert.Equal(0, cookieHeaders.Count); var cookies0 = request.Cookies; Assert.Equal(0, cookies0.Count); + Assert.Null(cookies0["key0"]); + Assert.False(cookies0.ContainsKey("key0")); var newCookies = new[] { "name0=value0", "name1=value1" }; request.Headers["Cookie"] = newCookies; diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs new file mode 100644 index 0000000000..6fcbcedce1 --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs @@ -0,0 +1,90 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Globalization; +using Microsoft.AspNet.Http.Features; +using Microsoft.Extensions.Primitives; +using Xunit; + +namespace Microsoft.AspNet.Http.Internal +{ + public class DefaultHttpResponseTests + { + [Theory] + [InlineData(0)] + [InlineData(9001)] + [InlineData(65535)] + public void GetContentLength_ReturnsParsedHeader(long value) + { + // Arrange + var response = GetResponseWithContentLength(value.ToString(CultureInfo.InvariantCulture)); + + // Act and Assert + Assert.Equal(value, response.ContentLength); + } + + [Fact] + public void GetContentLength_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var response = GetResponseWithContentLength(contentLength: null); + + // Act and Assert + Assert.Null(response.ContentLength); + } + + [Theory] + [InlineData("cant-parse-this")] + [InlineData("-1000")] + [InlineData("1000.00")] + [InlineData("100/5")] + public void GetContentLength_ReturnsNullIfHeaderCannotBeParsed(string contentLength) + { + // Arrange + var response = GetResponseWithContentLength(contentLength); + + // Act and Assert + Assert.Null(response.ContentLength); + } + + [Fact] + public void GetContentType_ReturnsNullIfHeaderDoesNotExist() + { + // Arrange + var response = GetResponseWithContentType(contentType: null); + + // Act and Assert + Assert.Null(response.ContentType); + } + + private static HttpResponse CreateResponse(IHeaderDictionary headers) + { + var context = new DefaultHttpContext(); + context.Features.Get().Headers = headers; + return context.Response; + } + + private static HttpResponse GetResponseWithContentLength(string contentLength = null) + { + return GetResponseWithHeader("Content-Length", contentLength); + } + + private static HttpResponse GetResponseWithContentType(string contentType = null) + { + return GetResponseWithHeader("Content-Type", contentType); + } + + private static HttpResponse GetResponseWithHeader(string headerName, string headerValue) + { + var headers = new HeaderDictionary(); + if (headerValue != null) + { + headers.Add(headerName, headerValue); + } + + return CreateResponse(headers); + } + } +} From 5bb737b6ad24edb8d9f77aa3b48b17b24b4dfc0d Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 6 Nov 2015 15:10:11 -0800 Subject: [PATCH 0872/1838] Make Compilation Abstractions naming consistent with Platform Abstractions --- src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index f80b1d99fc..1419c5d427 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -12,7 +12,7 @@ using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Text; using System.Text.Encodings.Web; -using Microsoft.Extensions.Compilation; +using Microsoft.Extensions.CompilationAbstractions; using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Startup diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 01434eaa10..26f5938eba 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -10,7 +10,7 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; -using Microsoft.Extensions.Compilation; +using Microsoft.Extensions.CompilationAbstractions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 0db69b3e7c..823b1cc372 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -21,7 +21,7 @@ "Microsoft.Extensions.Configuration.Json": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "Microsoft.Extensions.Logging": "1.0.0-*", - "Microsoft.Extensions.Compilation.Abstractions": "1.0.0-*", + "Microsoft.Extensions.CompilationAbstractions": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" }, From 308dd109a0ad077e820d1c137fd37d31d2f43886 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Thu, 5 Nov 2015 19:02:59 -0800 Subject: [PATCH 0873/1838] Reduce allocations on Conneg hotpath --- .../CacheControlHeaderValue.cs | 4 +- .../ContentDispositionHeaderValue.cs | 4 +- .../HeaderUtilities.cs | 4 +- .../MediaTypeHeaderValue.cs | 44 +++++++++---- .../NameValueHeaderValue.cs | 21 ++++--- .../ObjectCollection.cs | 63 +++++++++---------- .../MediaTypeHeaderValueTest.cs | 6 +- 7 files changed, 83 insertions(+), 63 deletions(-) diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index b8b6d2726c..94793efbea 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -49,7 +49,7 @@ namespace Microsoft.Net.Http.Headers private ICollection _privateHeaders; private bool _mustRevalidate; private bool _proxyRevalidate; - private ICollection _extensions; + private IList _extensions; public CacheControlHeaderValue() { @@ -158,7 +158,7 @@ namespace Microsoft.Net.Http.Headers set { _proxyRevalidate = value; } } - public ICollection Extensions + public IList Extensions { get { diff --git a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs index 25fe03cd9a..6a3cb271c9 100644 --- a/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/ContentDispositionHeaderValue.cs @@ -24,7 +24,7 @@ namespace Microsoft.Net.Http.Headers = new GenericHeaderParser(false, GetDispositionTypeLength); // Use list instead of dictionary since we may have multiple parameters with the same name. - private ICollection _parameters; + private ObjectCollection _parameters; private string _dispositionType; private ContentDispositionHeaderValue() @@ -48,7 +48,7 @@ namespace Microsoft.Net.Http.Headers } } - public ICollection Parameters + public IList Parameters { get { diff --git a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs index 3885477aa1..eee2ea9c7d 100644 --- a/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs +++ b/src/Microsoft.Net.Http.Headers/HeaderUtilities.cs @@ -13,7 +13,7 @@ namespace Microsoft.Net.Http.Headers private const string QualityName = "q"; internal const string BytesUnit = "bytes"; - internal static void SetQuality(ICollection parameters, double? value) + internal static void SetQuality(IList parameters, double? value) { Contract.Requires(parameters != null); @@ -50,7 +50,7 @@ namespace Microsoft.Net.Http.Headers } } - internal static double? GetQuality(ICollection parameters) + internal static double? GetQuality(IList parameters) { Contract.Requires(parameters != null); diff --git a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs index 23ed8b0cec..b8b7c09e9e 100644 --- a/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/MediaTypeHeaderValue.cs @@ -59,7 +59,7 @@ namespace Microsoft.Net.Http.Headers // Remove charset parameter if (charsetParameter != null) { - _parameters.Remove(charsetParameter); + Parameters.Remove(charsetParameter); } } else @@ -123,7 +123,7 @@ namespace Microsoft.Net.Http.Headers // Remove charset parameter if (boundaryParameter != null) { - _parameters.Remove(boundaryParameter); + Parameters.Remove(boundaryParameter); } } else @@ -140,7 +140,7 @@ namespace Microsoft.Net.Http.Headers } } - public ICollection Parameters + public IList Parameters { get { @@ -161,8 +161,12 @@ namespace Microsoft.Net.Http.Headers public double? Quality { - get { return HeaderUtilities.GetQuality(Parameters); } - set { HeaderUtilities.SetQuality(Parameters, value); } + get { return HeaderUtilities.GetQuality(_parameters); } + set + { + HeaderUtilities.ThrowIfReadOnly(IsReadOnly); + HeaderUtilities.SetQuality(Parameters, value); + } } public string MediaType @@ -210,7 +214,7 @@ namespace Microsoft.Net.Http.Headers { get { - return SubType.Equals("*", StringComparison.Ordinal); + return string.Compare(_mediaType, _mediaType.IndexOf('/') + 1, "*", 0, 1, StringComparison.Ordinal) == 0; } } @@ -241,15 +245,31 @@ namespace Microsoft.Net.Http.Headers return false; } + // PERF: Avoid doing anything here that allocates a substring, this is a very hot path + // for content-negotiation. + var indexOfSlash = _mediaType.IndexOf('/'); + // "text/plain" is a subset of "text/plain", "text/*" and "*/*". "*/*" is a subset only of "*/*". - if (!Type.Equals(otherMediaType.Type, StringComparison.OrdinalIgnoreCase)) + if (string.Compare( + strA: _mediaType, + indexA: 0, + strB: otherMediaType._mediaType, + indexB: 0, + length: indexOfSlash, + comparisonType: StringComparison.OrdinalIgnoreCase) != 0) { if (!otherMediaType.MatchesAllTypes) { return false; } } - else if (!SubType.Equals(otherMediaType.SubType, StringComparison.OrdinalIgnoreCase)) + else if (string.Compare( + strA: MediaType, + indexA: indexOfSlash + 1, + strB: otherMediaType._mediaType, + indexB: indexOfSlash + 1, // We know the Type is equal, so the index of '/' is the same in both strings. + length: _mediaType.Length - indexOfSlash, + comparisonType: StringComparison.OrdinalIgnoreCase) != 0) { if (!otherMediaType.MatchesAllSubTypes) { @@ -457,17 +477,17 @@ namespace Microsoft.Net.Http.Headers // If there is no whitespace between and in / get the media type using // one Substring call. Otherwise get substrings for and and combine them. - var mediatTypeLength = current + subtypeLength - startIndex; - if (typeLength + subtypeLength + 1 == mediatTypeLength) + var mediaTypeLength = current + subtypeLength - startIndex; + if (typeLength + subtypeLength + 1 == mediaTypeLength) { - mediaType = input.Substring(startIndex, mediatTypeLength); + mediaType = input.Substring(startIndex, mediaTypeLength); } else { mediaType = input.Substring(startIndex, typeLength) + "/" + input.Substring(current, subtypeLength); } - return mediatTypeLength; + return mediaTypeLength; } private static void CheckMediaTypeFormat(string mediaType, string parameterName) diff --git a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs index 3031d877c0..fed6261a4d 100644 --- a/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/NameValueHeaderValue.cs @@ -173,7 +173,7 @@ namespace Microsoft.Net.Http.Headers } internal static void ToString( - ICollection values, + IList values, char separator, bool leadingSeparator, StringBuilder destination) @@ -185,18 +185,18 @@ namespace Microsoft.Net.Http.Headers return; } - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { if (leadingSeparator || (destination.Length > 0)) { destination.Append(separator); destination.Append(' '); } - destination.Append(value.ToString()); + destination.Append(values[i].ToString()); } } - internal static string ToString(ICollection values, char separator, bool leadingSeparator) + internal static string ToString(IList values, char separator, bool leadingSeparator) { if ((values == null) || (values.Count == 0)) { @@ -210,7 +210,7 @@ namespace Microsoft.Net.Http.Headers return sb.ToString(); } - internal static int GetHashCode(ICollection values) + internal static int GetHashCode(IList values) { if ((values == null) || (values.Count == 0)) { @@ -218,9 +218,9 @@ namespace Microsoft.Net.Http.Headers } var result = 0; - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { - result = result ^ value.GetHashCode(); + result = result ^ values[i].GetHashCode(); } return result; } @@ -282,7 +282,7 @@ namespace Microsoft.Net.Http.Headers string input, int startIndex, char delimiter, - ICollection nameValueCollection) + IList nameValueCollection) { Contract.Requires(nameValueCollection != null); Contract.Requires(startIndex >= 0); @@ -320,7 +320,7 @@ namespace Microsoft.Net.Http.Headers } } - public static NameValueHeaderValue Find(ICollection values, string name) + public static NameValueHeaderValue Find(IList values, string name) { Contract.Requires((name != null) && (name.Length > 0)); @@ -329,8 +329,9 @@ namespace Microsoft.Net.Http.Headers return null; } - foreach (var value in values) + for (var i = 0; i < values.Count; i++) { + var value = values[i]; if (string.Compare(value.Name, name, StringComparison.OrdinalIgnoreCase) == 0) { return value; diff --git a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs index 24237b6ff1..f6d91e1508 100644 --- a/src/Microsoft.Net.Http.Headers/ObjectCollection.cs +++ b/src/Microsoft.Net.Http.Headers/ObjectCollection.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Collections.ObjectModel; @@ -12,15 +11,28 @@ namespace Microsoft.Net.Http.Headers // type to throw if 'null' gets added. Collection internally uses List which comes at some cost. In addition // Collection.Add() calls List.InsertItem() which is an O(n) operation (compared to O(1) for List.Add()). // This type is only used for very small collections (1-2 items) to keep the impact of using Collection small. - internal class ObjectCollection : ICollection where T : class + internal class ObjectCollection : Collection where T : class { internal static readonly Action DefaultValidator = CheckNotNull; internal static readonly ObjectCollection EmptyReadOnlyCollection = new ObjectCollection(DefaultValidator, isReadOnly: true); - private readonly Collection _collection = new Collection(); private readonly Action _validator; - private readonly bool _isReadOnly; + + // We need to create a 'read-only' inner list for Collection to do the right + // thing. + private static IList CreateInnerList(bool isReadOnly, IEnumerable other = null) + { + var list = other == null ? new List() : new List(other); + if (isReadOnly) + { + return new ReadOnlyCollection(list); + } + else + { + return list; + } + } public ObjectCollection() : this(DefaultValidator) @@ -28,58 +40,45 @@ namespace Microsoft.Net.Http.Headers } public ObjectCollection(Action validator, bool isReadOnly = false) + : base(CreateInnerList(isReadOnly)) { _validator = validator; - _isReadOnly = isReadOnly; } public ObjectCollection(IEnumerable other, bool isReadOnly = false) + : base(CreateInnerList(isReadOnly, other)) { _validator = DefaultValidator; - foreach (T item in other) + foreach (T item in Items) { - Add(item); + _validator(item); } - _isReadOnly = isReadOnly; } - public int Count + public bool IsReadOnly => ((ICollection)this).IsReadOnly; + + protected override void ClearItems() { - get { return _collection.Count; } + base.ClearItems(); } - public bool IsReadOnly + protected override void InsertItem(int index, T item) { - get { return _isReadOnly; } - } - - public void Add(T item) - { - HeaderUtilities.ThrowIfReadOnly(IsReadOnly); _validator(item); - _collection.Add(item); + base.InsertItem(index, item); } - public bool Remove(T item) + protected override void RemoveItem(int index) { - HeaderUtilities.ThrowIfReadOnly(IsReadOnly); - return _collection.Remove(item); + base.RemoveItem(index); } - public void Clear() + protected override void SetItem(int index, T item) { - HeaderUtilities.ThrowIfReadOnly(IsReadOnly); - _collection.Clear(); + _validator(item); + base.SetItem(index, item); } - public bool Contains(T item) => _collection.Contains(item); - - public void CopyTo(T[] array, int arrayIndex) => _collection.CopyTo(array, arrayIndex); - - public IEnumerator GetEnumerator() => _collection.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() => _collection.GetEnumerator(); - private static void CheckNotNull(T item) { // null values cannot be added to the collection. diff --git a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs index 48a4bfab12..ba3a31b7d2 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/MediaTypeHeaderValueTest.cs @@ -122,9 +122,9 @@ namespace Microsoft.Net.Http.Headers Assert.False(mediaType0.Parameters.IsReadOnly); Assert.True(mediaType1.Parameters.IsReadOnly); Assert.Equal(mediaType0.Parameters.Count, mediaType1.Parameters.Count); - Assert.Throws(() => mediaType1.Parameters.Add(new NameValueHeaderValue("name"))); - Assert.Throws(() => mediaType1.Parameters.Remove(new NameValueHeaderValue("name"))); - Assert.Throws(() => mediaType1.Parameters.Clear()); + Assert.Throws(() => mediaType1.Parameters.Add(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Remove(new NameValueHeaderValue("name"))); + Assert.Throws(() => mediaType1.Parameters.Clear()); var pair0 = mediaType0.Parameters.First(); var pair1 = mediaType1.Parameters.First(); From 660f1cad10b7c3e08e9267b7f5967fbcdbd6c18f Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Mon, 9 Nov 2015 10:54:15 -0800 Subject: [PATCH 0874/1838] Make hosting configuration consistent --- .../HostingEnvironmentExtensions.cs | 17 ++--- .../Internal/HostingEngine.cs | 8 +-- .../WebApplication.cs | 17 +++-- .../WebHostBuilder.cs | 16 ++--- .../WebHostOptions.cs | 47 ++++++++++++++ .../HostingEngineTests.cs | 12 ++-- .../WebHostBuilderTests.cs | 2 +- .../WebHostConfigurationsTests.cs | 63 +++++++++++++++++++ 8 files changed, 148 insertions(+), 34 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/WebHostOptions.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index 74cf50ec74..b6e5e8071a 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using Microsoft.AspNet.FileProviders; using Microsoft.Extensions.Configuration; @@ -9,14 +10,14 @@ namespace Microsoft.AspNet.Hosting { public static class HostingEnvironmentExtensions { - private const string OldEnvironmentKey = "ASPNET_ENV"; - private const string EnvironmentKey = "Hosting:Environment"; - - private const string WebRootKey = "webroot"; - - public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, IConfiguration config) + public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebHostOptions options) { - var webRoot = config?[WebRootKey]; + if (options == null) + { + throw new ArgumentNullException(nameof(options)); + } + + var webRoot = options.WebRoot; if (webRoot == null) { // Default to /wwwroot if it exists. @@ -43,7 +44,7 @@ namespace Microsoft.AspNet.Hosting } hostingEnvironment.WebRootFileProvider = new PhysicalFileProvider(hostingEnvironment.WebRootPath); - var environmentName = config?[EnvironmentKey] ?? config?[OldEnvironmentKey]; + var environmentName = options.Environment; hostingEnvironment.EnvironmentName = environmentName ?? hostingEnvironment.EnvironmentName; } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index c504e6d0e3..4b304c152a 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -24,11 +24,11 @@ namespace Microsoft.AspNet.Hosting.Internal { // This is defined by IIS's HttpPlatformHandler. private static readonly string ServerPort = "HTTP_PLATFORM_PORT"; - private static readonly string DetailedErrors = "Hosting:DetailedErrors"; private readonly IServiceCollection _applicationServiceCollection; private readonly IStartupLoader _startupLoader; private readonly ApplicationLifetime _applicationLifetime; + private readonly WebHostOptions _options; private readonly IConfiguration _config; private readonly bool _captureStartupErrors; @@ -47,6 +47,7 @@ namespace Microsoft.AspNet.Hosting.Internal public HostingEngine( IServiceCollection appServices, IStartupLoader startupLoader, + WebHostOptions options, IConfiguration config, bool captureStartupErrors) { @@ -66,6 +67,7 @@ namespace Microsoft.AspNet.Hosting.Internal } _config = config; + _options = options; _applicationServiceCollection = appServices; _startupLoader = startupLoader; _captureStartupErrors = captureStartupErrors; @@ -226,9 +228,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Generate an HTML error page. var runtimeEnv = _applicationServices.GetRequiredService(); var hostingEnv = _applicationServices.GetRequiredService(); - var showDetailedErrors = hostingEnv.IsDevelopment() - || string.Equals("true", _config[DetailedErrors], StringComparison.OrdinalIgnoreCase) - || string.Equals("1", _config[DetailedErrors], StringComparison.OrdinalIgnoreCase); + var showDetailedErrors = hostingEnv.IsDevelopment() || _options.DetailedErrors; var errorBytes = StartupExceptionPage.GenerateErrorHtml(showDetailedErrors, runtimeEnv, ex); return context => diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index 7d77a911db..33a834b183 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -12,6 +12,7 @@ namespace Microsoft.AspNet.Hosting public class WebApplication { private const string HostingJsonFile = "hosting.json"; + private const string EnvironmentVariablesPrefix = "ASPNET_"; private const string ConfigFileKey = "config"; public static void Run(string[] args) @@ -40,12 +41,7 @@ namespace Microsoft.AspNet.Hosting var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); var tempConfig = tempBuilder.Build(); var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; - - var config = new ConfigurationBuilder() - .AddJsonFile(configFilePath, optional: true) - .AddEnvironmentVariables() - .AddCommandLine(args) - .Build(); + var config = LoadHostingConfiguration(configFilePath, args); var hostBuilder = new WebHostBuilder(config, captureStartupErrors: true); if (startupType != null) @@ -81,5 +77,14 @@ namespace Microsoft.AspNet.Hosting appLifetime.ApplicationStopping.WaitHandle.WaitOne(); } } + + internal static IConfiguration LoadHostingConfiguration(string configJsonPath, string[] args) + { + return new ConfigurationBuilder() + .AddJsonFile(configJsonPath, optional: true) + .AddEnvironmentVariables(prefix: EnvironmentVariablesPrefix) + .AddCommandLine(args) + .Build(); + } } } diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 26f5938eba..a26796412f 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -21,15 +21,10 @@ namespace Microsoft.AspNet.Hosting { public class WebHostBuilder { - public const string OldApplicationKey = "app"; - public const string ApplicationKey = "Hosting:Application"; - - public const string OldServerKey = "server"; - public const string ServerKey = "Hosting:Server"; - private readonly IHostingEnvironment _hostingEnvironment; private readonly ILoggerFactory _loggerFactory; private readonly IConfiguration _config; + private readonly WebHostOptions _options; private Action _configureServices; @@ -64,6 +59,7 @@ namespace Microsoft.AspNet.Hosting _hostingEnvironment = new HostingEnvironment(); _loggerFactory = new LoggerFactory(); _config = config; + _options = new WebHostOptions(config); _captureStartupErrors = captureStartupErrors; } @@ -130,18 +126,18 @@ namespace Microsoft.AspNet.Hosting var appEnvironment = hostingContainer.GetRequiredService(); var startupLoader = hostingContainer.GetRequiredService(); - _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _config); - var engine = new HostingEngine(hostingServices, startupLoader, _config, _captureStartupErrors); + _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options); + var engine = new HostingEngine(hostingServices, startupLoader, _options, _config, _captureStartupErrors); // Only one of these should be set, but they are used in priority engine.Server = _server; engine.ServerFactory = _serverFactory; - engine.ServerFactoryLocation = _config[ServerKey] ?? _config[OldServerKey] ?? _serverFactoryLocation; + engine.ServerFactoryLocation = _options.Server ?? _serverFactoryLocation; // Only one of these should be set, but they are used in priority engine.Startup = _startup; engine.StartupType = _startupType; - engine.StartupAssemblyName = _startupAssemblyName ?? _config[ApplicationKey] ?? _config[OldApplicationKey] ?? appEnvironment.ApplicationName; + engine.StartupAssemblyName = _startupAssemblyName ?? _options.Application ?? appEnvironment.ApplicationName; return engine; } diff --git a/src/Microsoft.AspNet.Hosting/WebHostOptions.cs b/src/Microsoft.AspNet.Hosting/WebHostOptions.cs new file mode 100644 index 0000000000..89a0aad6bc --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebHostOptions.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Extensions.Configuration; + +namespace Microsoft.AspNet.Hosting +{ + public class WebHostOptions + { + private const string ApplicationKey = "app"; + private const string DetailedErrorsKey = "detailedErrors"; + private const string EnvironmentKey = "environment"; + private const string ServerKey = "server"; + private const string WebRootKey = "webroot"; + private const string OldEnvironmentKey = "ENV"; + + public WebHostOptions() + { + } + + public WebHostOptions(IConfiguration configuration) + { + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + + Application = configuration[ApplicationKey]; + DetailedErrors = string.Equals("true", configuration[DetailedErrorsKey], StringComparison.OrdinalIgnoreCase) + || string.Equals("1", configuration[DetailedErrorsKey], StringComparison.OrdinalIgnoreCase); + Environment = configuration[EnvironmentKey] ?? configuration[OldEnvironmentKey]; + Server = configuration[ServerKey]; + WebRoot = configuration[WebRootKey]; + } + + public string Application { get; set; } + + public bool DetailedErrors { get; set; } + + public string Environment { get; set; } + + public string Server { get; set; } + + public string WebRoot { get; set; } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 0e0655ecac..a31fbd5d43 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -98,7 +98,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" } + { "Server", "Microsoft.AspNet.Hosting.Tests" } }; var builder = new ConfigurationBuilder() @@ -114,7 +114,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" }, + { "Server", "Microsoft.AspNet.Hosting.Tests" }, { "HTTP_PLATFORM_PORT", "abc123" } }; @@ -132,7 +132,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - { "Hosting:Server", "Microsoft.AspNet.Hosting.Tests" } + { "Server", "Microsoft.AspNet.Hosting.Tests" } }; var builder = new ConfigurationBuilder() @@ -250,7 +250,9 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - { "ASPNET_ENV", "Staging" } + // Old key is actualy ASPNET_ENV but WebHostConfiguration expects environment + // variable names stripped from ASPNET_ prefix so using just ENV here + { "ENV", "Staging" } }; var builder = new ConfigurationBuilder() @@ -267,7 +269,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - { "Hosting:Environment", "Staging" } + { "Environment", "Staging" } }; var builder = new ConfigurationBuilder() diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 3ab61daf96..db801c2f4d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -129,7 +129,7 @@ namespace Microsoft.AspNet.Hosting var vals = new Dictionary { { "server", "Microsoft.AspNet.Hosting.Tests" }, - { "Hosting:DetailedErrors", "true" }, + { "DetailedErrors", "true" }, }; var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs new file mode 100644 index 0000000000..ea3b314bbd --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs @@ -0,0 +1,63 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using System.Reflection; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Builder.Internal; +using Microsoft.AspNet.Hosting.Fakes; +using Microsoft.AspNet.Hosting.Startup; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.OptionsModel; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class WebHostConfigurationTests + { + [Fact] + public void ReadsParametersCorrectly() + { + var parameters = new Dictionary() + { + {"webroot", "wwwroot"}, + {"server", "Microsoft.AspNet.Server.Kestrel"}, + {"app", "MyProjectReference"}, + {"environment", "Development"}, + {"detailederrors", "true"}, + }; + + var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + + Assert.Equal("wwwroot", config.WebRoot); + Assert.Equal("Microsoft.AspNet.Server.Kestrel", config.Server); + Assert.Equal("MyProjectReference", config.Application); + Assert.Equal("Development", config.Environment); + Assert.Equal(true, config.DetailedErrors); + } + + [Fact] + public void ReadsOldEnvKey() + { + var parameters = new Dictionary() { { "ENV", "Development" } }; + var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + + Assert.Equal("Development", config.Environment); + } + + [Theory] + [InlineData("1", true)] + [InlineData("0", false)] + public void AllowsNumberForDetailedErrors(string value, bool expected) + { + var parameters = new Dictionary() { { "detailedErrors", value } }; + var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + + Assert.Equal(expected, config.DetailedErrors); + } + } +} From 663c7917d04a3bfdab464896b38a6657956178eb Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 10:26:06 +0100 Subject: [PATCH 0875/1838] Changed string.Format to StringBuilder --- .../UriHelper.cs | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 28d89de253..02a3356c38 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Text; namespace Microsoft.AspNet.Http.Extensions { @@ -10,6 +11,8 @@ namespace Microsoft.AspNet.Http.Extensions /// public static class UriHelper { + private const string SchemeDelimiter = "://"; + /// /// Combines the given URI components into a string that is properly encoded for use in HTTP headers. /// @@ -48,7 +51,15 @@ namespace Microsoft.AspNet.Http.Extensions FragmentString fragment = new FragmentString()) { string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return $"{scheme}://{host.ToString()}{combinePath}{query.ToString()}{fragment.ToString()}"; + + return new StringBuilder() + .Append(scheme) + .Append(SchemeDelimiter) + .Append(host.ToString()) + .Append(combinePath) + .Append(query.ToString()) + .Append(fragment.ToString()) + .ToString(); } /// @@ -93,7 +104,14 @@ namespace Microsoft.AspNet.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - return request.Scheme + "://" + request.Host.Value + request.PathBase.Value + request.Path.Value + request.QueryString.Value; + return new StringBuilder() + .Append(request.Scheme) + .Append(SchemeDelimiter) + .Append(request.Host.Value) + .Append(request.PathBase.Value) + .Append(request.Path.Value) + .Append(request.QueryString.Value) + .ToString(); } } } \ No newline at end of file From 7b35b2e1b98bc750ddd6353890421d0213ef22ab Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 11:03:51 +0100 Subject: [PATCH 0876/1838] Pass length to StringBuilder --- .../UriHelper.cs | 37 +++++++++++++------ 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 02a3356c38..4e1d8f7687 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -50,15 +50,22 @@ namespace Microsoft.AspNet.Http.Extensions QueryString query = new QueryString(), FragmentString fragment = new FragmentString()) { - string combinePath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; + var combinedPath = (pathBase.HasValue || path.HasValue) ? (pathBase + path).ToString() : "/"; - return new StringBuilder() + var encodedHost = host.ToString(); + var encodedQuery = query.ToString(); + var encodedFragment = fragment.ToString(); + + var length = scheme.Length + SchemeDelimiter.Length + encodedHost.Length + + combinedPath.Length + encodedQuery.Length + encodedFragment.Length; + + return new StringBuilder(length) .Append(scheme) .Append(SchemeDelimiter) - .Append(host.ToString()) - .Append(combinePath) - .Append(query.ToString()) - .Append(fragment.ToString()) + .Append(encodedHost) + .Append(combinedPath) + .Append(encodedQuery) + .Append(encodedFragment) .ToString(); } @@ -104,13 +111,21 @@ namespace Microsoft.AspNet.Http.Extensions /// public static string GetDisplayUrl(this HttpRequest request) { - return new StringBuilder() + var host = request.Host.Value; + var pathBase = request.PathBase.Value; + var path = request.Path.Value; + var queryString = request.QueryString.Value; + + var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + + pathBase.Length + path.Length + queryString.Length; + + return new StringBuilder(length) .Append(request.Scheme) .Append(SchemeDelimiter) - .Append(request.Host.Value) - .Append(request.PathBase.Value) - .Append(request.Path.Value) - .Append(request.QueryString.Value) + .Append(host) + .Append(pathBase) + .Append(path) + .Append(queryString) .ToString(); } } From e5a32850900e95f06cc9a50877f5ed175e971af6 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 10 Nov 2015 15:05:29 +0000 Subject: [PATCH 0877/1838] Lazily initialize DefaultHttpContext Lazily initialize sub objects of DefaultHttpContext Resolves #470 --- .../DefaultHttpContext.cs | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index ffc6acc670..0c95f04dc4 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -18,8 +18,8 @@ namespace Microsoft.AspNet.Http.Internal { private readonly HttpRequest _request; private readonly HttpResponse _response; - private readonly ConnectionInfo _connection; - private readonly AuthenticationManager _authenticationManager; + private ConnectionInfo _connection; + private AuthenticationManager _authenticationManager; private IItemsFeature _items; private IServiceProvidersFeature _serviceProviders; @@ -43,8 +43,6 @@ namespace Microsoft.AspNet.Http.Internal _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); - _connection = new DefaultConnectionInfo(features); - _authenticationManager = new DefaultAuthenticationManager(features); } void IFeatureCache.CheckFeaturesRevision() @@ -133,9 +131,29 @@ namespace Microsoft.AspNet.Http.Internal public override HttpResponse Response { get { return _response; } } - public override ConnectionInfo Connection { get { return _connection; } } + public override ConnectionInfo Connection + { + get + { + if (_connection == null) + { + _connection = new DefaultConnectionInfo(_features); + } + return _connection; + } + } - public override AuthenticationManager Authentication { get { return _authenticationManager; } } + public override AuthenticationManager Authentication + { + get + { + if (_authenticationManager == null) + { + _authenticationManager = new DefaultAuthenticationManager(_features); + } + return _authenticationManager; + } + } public override ClaimsPrincipal User { From 6874b87f1353c30bb24cd70cf8f7a8ed7968b482 Mon Sep 17 00:00:00 2001 From: Nick Craver Date: Tue, 3 Nov 2015 07:11:43 -0500 Subject: [PATCH 0878/1838] C#6 Cleanup & Optimizations The main intent is cleanup using C# 6 operators and normalization of type aliases. While there are no intended functional changes here, it does eliminate a few tight race conditions as a bonus (not a real-win since this isn't thread-safe all over, simply noting). --- .../IFormCollection.cs | 1 - .../PathString.cs | 3 +-- .../QueryString.cs | 6 +++--- .../RequestHeaders.cs | 1 - src/Microsoft.AspNet.Http/FormCollection.cs | 6 +----- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 19 +++---------------- .../HttpContextAccessor.cs | 2 +- .../OwinFeatureCollection.cs | 12 ++++-------- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 2 +- .../WebEncoders.cs | 2 +- .../BaseHeaderParser.cs | 2 +- .../CacheControlHeaderValue.cs | 2 +- .../HttpHeaderParser.cs | 7 +++---- .../StringWithQualityHeaderValueComparer.cs | 6 +++--- .../CookieHeaderValueTest.cs | 2 +- .../SetCookieHeaderValueTest.cs | 2 +- 16 files changed, 25 insertions(+), 50 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs index 03e8116852..55d4a578bc 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs @@ -88,7 +88,6 @@ namespace Microsoft.AspNet.Http /// /// The file collection sent with the request. /// - /// /// The files included with the request. IFormFileCollection Files { get; } } diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 8a76d8f548..ef6e1bb39e 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Linq; using System.Text.Encodings.Web; namespace Microsoft.AspNet.Http @@ -17,7 +16,7 @@ namespace Microsoft.AspNet.Http /// /// Represents the empty path. This field is read-only. /// - public static readonly PathString Empty = new PathString(String.Empty); + public static readonly PathString Empty = new PathString(string.Empty); private readonly string _value; diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index 088402b2a7..d400375ea8 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Http /// /// Represents the empty query string. This field is read-only. /// - public static readonly QueryString Empty = new QueryString(String.Empty); + public static readonly QueryString Empty = new QueryString(string.Empty); private readonly string _value; @@ -84,7 +84,7 @@ namespace Microsoft.AspNet.Http [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Delimiter characters ? and # must be escaped by this method instead of truncating the value")] public static QueryString FromUriComponent(string uriComponent) { - if (String.IsNullOrEmpty(uriComponent)) + if (string.IsNullOrEmpty(uriComponent)) { return new QueryString(string.Empty); } @@ -231,7 +231,7 @@ namespace Microsoft.AspNet.Http public override int GetHashCode() { - return (_value != null ? _value.GetHashCode() : 0); + return _value?.GetHashCode() ?? 0; } public static bool operator ==(QueryString left, QueryString right) diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs index dbfff55411..59265fbf08 100644 --- a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Extensions; using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Headers diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index 7a7d67c26d..fbc3b88a38 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -83,11 +83,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - if (Store == null) - { - return 0; - } - return Store.Count; + return Store?.Count ?? 0; } } diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index f1fde19a1d..530c5f31e0 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -72,12 +72,7 @@ namespace Microsoft.AspNet.Http.Internal if (StringValues.IsNullOrEmpty(value)) { - if (Store == null) - { - return; - } - - Store.Remove(key); + Store?.Remove(key); } else { @@ -110,11 +105,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - if (Store == null) - { - return 0; - } - return Store.Count; + return Store?.Count ?? 0; } } @@ -195,11 +186,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Clear() { - if (Store == null) - { - return; - } - Store.Clear(); + Store?.Clear(); } /// diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs index 83b558161d..04784d714a 100644 --- a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNet.Http/HttpContextAccessor.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNet.Http.Internal get { var handle = CallContext.LogicalGetData(LogicalDataKey) as ObjectHandle; - return handle != null ? handle.Unwrap() as HttpContext : null; + return handle?.Unwrap() as HttpContext; } set { diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 6d955194fa..acf3e2215c 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -17,7 +17,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Owin { @@ -45,14 +44,11 @@ namespace Microsoft.AspNet.Owin SupportsWebSockets = true; var register = Prop, object>>(OwinConstants.CommonKeys.OnSendingHeaders); - if (register != null) + register?.Invoke(state => { - register(state => - { - var collection = (OwinFeatureCollection)state; - collection._headersSent = true; - }, this); - } + var collection = (OwinFeatureCollection)state; + collection._headersSent = true; + }, this); } T Prop(string key) diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index a36e9377f3..87b3cf6ffa 100644 --- a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Owin options = acceptContext.Options; _subProtocol = acceptContext.SubProtocol; } - else if (context != null && context.SubProtocol != null) + else if (context?.SubProtocol != null) { options = new Dictionary(1) { diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs index 751ad43c21..4142039f8f 100644 --- a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs @@ -121,7 +121,7 @@ namespace Microsoft.AspNet.WebUtilities // Special-case empty input if (count == 0) { - return String.Empty; + return string.Empty; } // We're going to use base64url encoding with no padding characters. diff --git a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs index dbd18b82d6..1b4038d21b 100644 --- a/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/BaseHeaderParser.cs @@ -44,7 +44,7 @@ namespace Microsoft.Net.Http.Headers return SupportsMultipleValues; } - T result = default(T); + T result; var length = GetParsedValueLength(value, current, out result); if (length == 0) diff --git a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs index 94793efbea..7ad65ac3bc 100644 --- a/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs +++ b/src/Microsoft.Net.Http.Headers/CacheControlHeaderValue.cs @@ -369,7 +369,7 @@ namespace Microsoft.Net.Http.Headers return 0; } - nameValueList.Add(nameValue as NameValueHeaderValue); + nameValueList.Add(nameValue); } // If we get here, we were able to successfully parse the string as list of name/value pairs. Now analyze diff --git a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs index 2c05296a98..a12edbf3e0 100644 --- a/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs +++ b/src/Microsoft.Net.Http.Headers/HttpHeaderParser.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections; using System.Collections.Generic; using System.Diagnostics.Contracts; using System.Globalization; @@ -37,11 +36,11 @@ namespace Microsoft.Net.Http.Headers // If a parser returns 'null', it means there was no value, but that's valid (e.g. "Accept: "). The caller // can ignore the value. - T result = default(T); + T result; if (!TryParseValue(value, ref index, out result)) { throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid value '{0}'.", - value == null ? "" : value.Substring(index))); + value?.Substring(index) ?? "")); } return result; } @@ -114,7 +113,7 @@ namespace Microsoft.Net.Http.Headers else { throw new FormatException(string.Format(CultureInfo.InvariantCulture, "Invalid values '{0}'.", - values == null ? "" : value.Substring(index))); + value.Substring(index))); } } } diff --git a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs index 6dc3d0758a..0d092ec19d 100644 --- a/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs +++ b/src/Microsoft.Net.Http.Headers/StringWithQualityHeaderValueComparer.cs @@ -64,13 +64,13 @@ namespace Microsoft.Net.Http.Headers return 1; } - if (!String.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) + if (!string.Equals(stringWithQuality1.Value, stringWithQuality2.Value, StringComparison.OrdinalIgnoreCase)) { - if (String.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) + if (string.Equals(stringWithQuality1.Value, "*", StringComparison.Ordinal)) { return -1; } - else if (String.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) + else if (string.Equals(stringWithQuality2.Value, "*", StringComparison.Ordinal)) { return 1; } diff --git a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs index f649cce09e..3644ed1df0 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/CookieHeaderValueTest.cs @@ -154,7 +154,7 @@ namespace Microsoft.Net.Http.Headers public void CookieHeaderValue_Value() { var cookie = new CookieHeaderValue("name"); - Assert.Equal(String.Empty, cookie.Value); + Assert.Equal(string.Empty, cookie.Value); cookie.Value = "value1"; Assert.Equal("value1", cookie.Value); diff --git a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs index e21fb4e089..f98886521d 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs +++ b/test/Microsoft.Net.Http.Headers.Tests/SetCookieHeaderValueTest.cs @@ -184,7 +184,7 @@ namespace Microsoft.Net.Http.Headers public void SetCookieHeaderValue_Value() { var cookie = new SetCookieHeaderValue("name"); - Assert.Equal(String.Empty, cookie.Value); + Assert.Equal(string.Empty, cookie.Value); cookie.Value = "value1"; Assert.Equal("value1", cookie.Value); From f726b7b5913233f525f7aaf7899e31400446df6a Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Tue, 10 Nov 2015 19:55:14 +0100 Subject: [PATCH 0879/1838] Added PERF comment --- src/Microsoft.AspNet.Http.Extensions/UriHelper.cs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs index 4e1d8f7687..f121ffa1d6 100644 --- a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs @@ -56,6 +56,7 @@ namespace Microsoft.AspNet.Http.Extensions var encodedQuery = query.ToString(); var encodedFragment = fragment.ToString(); + // PERF: Calculate string length to allocate correct buffer size for StringBuilder. var length = scheme.Length + SchemeDelimiter.Length + encodedHost.Length + combinedPath.Length + encodedQuery.Length + encodedFragment.Length; @@ -116,6 +117,7 @@ namespace Microsoft.AspNet.Http.Extensions var path = request.Path.Value; var queryString = request.QueryString.Value; + // PERF: Calculate string length to allocate correct buffer size for StringBuilder. var length = request.Scheme.Length + SchemeDelimiter.Length + host.Length + pathBase.Length + path.Length + queryString.Length; @@ -129,4 +131,4 @@ namespace Microsoft.AspNet.Http.Extensions .ToString(); } } -} \ No newline at end of file +} From b2edb0d4848c53ffe1ebf568ee9f997d42f493d6 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 10 Nov 2015 12:12:06 -0800 Subject: [PATCH 0880/1838] Fix environment variable loading in hosting #470 --- src/Microsoft.AspNet.Hosting/WebApplication.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs index 33a834b183..f819fcec7a 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplication.cs @@ -80,8 +80,11 @@ namespace Microsoft.AspNet.Hosting internal static IConfiguration LoadHostingConfiguration(string configJsonPath, string[] args) { + // We are adding all environment variables first and then adding the ASPNET_ ones + // with the prefix removed to unify with the command line and config file formats return new ConfigurationBuilder() .AddJsonFile(configJsonPath, optional: true) + .AddEnvironmentVariables() .AddEnvironmentVariables(prefix: EnvironmentVariablesPrefix) .AddCommandLine(args) .Build(); From ecb7e697d15033918147e286dc198865261beefc Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 10 Nov 2015 16:48:16 -0800 Subject: [PATCH 0881/1838] Fix bug with environment name beeng overwritten After being set using UseEnvironment --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 7 ++++++- .../WebHostBuilderTests.cs | 17 +++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index a26796412f..f60c32fb32 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -27,6 +27,7 @@ namespace Microsoft.AspNet.Hosting private readonly WebHostOptions _options; private Action _configureServices; + private string _environmentName; // Only one of these should be set private StartupMethods _startup; @@ -127,6 +128,10 @@ namespace Microsoft.AspNet.Hosting var startupLoader = hostingContainer.GetRequiredService(); _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options); + if (!string.IsNullOrEmpty(_environmentName)) + { + _hostingEnvironment.EnvironmentName = _environmentName; + } var engine = new HostingEngine(hostingServices, startupLoader, _options, _config, _captureStartupErrors); // Only one of these should be set, but they are used in priority @@ -155,7 +160,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(environment)); } - _hostingEnvironment.EnvironmentName = environment; + _environmentName = environment; return this; } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index db801c2f4d..7b3bdf7f82 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -124,6 +124,23 @@ namespace Microsoft.AspNet.Hosting } } + [Fact] + public void UseEnvironmentIsNotOverriden() + { + var vals = new Dictionary + { + { "ENV", "Dev" }, + }; + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + + var expected = "MY_TEST_ENVIRONMENT"; + var webHost = new WebHostBuilder(config, captureStartupErrors: true).UseEnvironment(expected).Build(); + + Assert.Equal(expected, webHost.ApplicationServices.GetService().EnvironmentName); + } + private WebHostBuilder CreateWebHostBuilder() { var vals = new Dictionary From bb8141710d5de697bba29fef8facb750b2a88314 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 12 Nov 2015 12:23:07 -0800 Subject: [PATCH 0882/1838] Remove System beta tag in project.json for coreclr packages. --- .../project.json | 6 ++-- .../project.json | 34 +++++++++---------- .../project.json | 6 ++-- .../project.json | 18 +++++----- src/Microsoft.AspNet.Http/project.json | 8 ++--- src/Microsoft.AspNet.Owin/project.json | 30 ++++++++-------- .../project.json | 16 ++++----- .../project.json | 6 ++-- .../project.json | 4 +-- src/Microsoft.Net.Http.Headers/project.json | 16 ++++----- .../project.json | 2 +- 11 files changed, 73 insertions(+), 73 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index d90e54919e..cc263ffbe0 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -21,8 +21,8 @@ }, "dotnet5.4": { "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*" + "System.Resources.ResourceManager": "4.0.1-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index cd18c2aa74..1316a95118 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -15,7 +15,7 @@ "type": "build", "version": "1.0.0-*" }, - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -26,22 +26,22 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Tools": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.Globalization.Extensions": "4.0.1-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Linq.Expressions": "4.0.11-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Net.WebSockets": "4.0.0-beta-*", - "System.Reflection.TypeExtensions": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.InteropServices": "4.0.21-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*", - "System.Threading.Tasks": "4.0.11-beta-*" + "System.Collections": "4.0.11-*", + "System.ComponentModel": "4.0.1-*", + "System.Diagnostics.Tools": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.Globalization.Extensions": "4.0.1-*", + "System.Linq": "4.0.1-*", + "System.Linq.Expressions": "4.0.11-*", + "System.Net.Primitives": "4.0.11-*", + "System.Net.WebSockets": "4.0.0-*", + "System.Reflection.TypeExtensions": "4.0.1-*", + "System.Runtime": "4.0.21-*", + "System.Runtime.InteropServices": "4.0.21-*", + "System.Security.Claims": "4.0.1-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Principal": "4.0.1-*", + "System.Threading.Tasks": "4.0.11-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index bb136ef733..1dff3fe5c1 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -17,9 +17,9 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Resources.ResourceManager": "4.0.1-beta-*" + "System.IO.FileSystem": "4.0.1-*", + "System.Runtime": "4.0.21-*", + "System.Resources.ResourceManager": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 2b662e541a..0f9fb1a9f2 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -16,15 +16,15 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Net.WebSockets": "4.0.0-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*" + "System.Collections": "4.0.11-*", + "System.Linq": "4.0.1-*", + "System.Net.Primitives": "4.0.11-*", + "System.Net.WebSockets": "4.0.0-*", + "System.Runtime.Extensions": "4.0.11-*", + "System.Security.Claims": "4.0.1-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Principal": "4.0.1-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 3b3b9d6c3a..88f2039436 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -19,10 +19,10 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.Text.Encoding": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*" + "System.Diagnostics.Debug": "4.0.11-*", + "System.Text.Encoding": "4.0.11-*", + "System.Threading": "4.0.11-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index f24cc304de..886ba4d554 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -16,21 +16,21 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.ComponentModel": "4.0.1-beta-*", - "System.Diagnostics.Tools": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Runtime.InteropServices": "4.0.21-beta-*", - "System.Security.Claims": "4.0.1-beta-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-beta-*", - "System.Security.Principal": "4.0.1-beta-*", - "System.Threading.Tasks": "4.0.11-beta-*" + "System.Collections": "4.0.11-*", + "System.ComponentModel": "4.0.1-*", + "System.Diagnostics.Tools": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.IO": "4.0.11-*", + "System.Linq": "4.0.1-*", + "System.Net.Primitives": "4.0.11-*", + "System.Runtime": "4.0.21-*", + "System.Runtime.Extensions": "4.0.11-*", + "System.Runtime.InteropServices": "4.0.21-*", + "System.Security.Claims": "4.0.1-*", + "System.Security.Cryptography.X509Certificates": "4.0.0-*", + "System.Security.Principal": "4.0.1-*", + "System.Threading.Tasks": "4.0.11-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index c302399a15..41c996a830 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -11,7 +11,7 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -21,13 +21,13 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Debug": "4.0.11-beta-*", - "System.IO": "4.0.11-beta-*", - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*" + "System.Collections": "4.0.11-*", + "System.Diagnostics.Debug": "4.0.11-*", + "System.IO": "4.0.11-*", + "System.IO.FileSystem": "4.0.1-*", + "System.Runtime": "4.0.21-*", + "System.Runtime.Extensions": "4.0.11-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json index 03c915b86b..273702a80e 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json @@ -10,9 +10,9 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Resources.ResourceManager": "4.0.1-beta-*", - "System.Runtime": "4.0.21-beta-*" + "System.Resources.ResourceManager": "4.0.1-*", + "System.Runtime": "4.0.21-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index 47ccb1a89e..d020a87412 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -13,7 +13,7 @@ "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Extensions.OptionsModel": "1.0.0-*", - "System.Text.Encodings.Web": "4.0.0-beta-*" + "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { "net451": { @@ -24,4 +24,4 @@ }, "dotnet5.4": {} } -} \ No newline at end of file +} diff --git a/src/Microsoft.Net.Http.Headers/project.json b/src/Microsoft.Net.Http.Headers/project.json index 07ce4c413b..311e571a11 100644 --- a/src/Microsoft.Net.Http.Headers/project.json +++ b/src/Microsoft.Net.Http.Headers/project.json @@ -13,14 +13,14 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-beta-*", - "System.Diagnostics.Contracts": "4.0.1-beta-*", - "System.Globalization": "4.0.11-beta-*", - "System.Globalization.Extensions": "4.0.1-beta-*", - "System.Linq": "4.0.1-beta-*", - "System.Text.Encoding": "4.0.11-beta-*", - "System.Runtime": "4.0.21-beta-*" + "System.Collections": "4.0.11-*", + "System.Diagnostics.Contracts": "4.0.1-*", + "System.Globalization": "4.0.11-*", + "System.Globalization.Extensions": "4.0.1-*", + "System.Linq": "4.0.1-*", + "System.Text.Encoding": "4.0.11-*", + "System.Runtime": "4.0.21-*" } } } -} \ No newline at end of file +} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json index 140e0146d4..4d81779a7c 100644 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ b/test/Microsoft.Extensions.WebEncoders.Tests/project.json @@ -17,7 +17,7 @@ "dnx451": { }, "dnxcore50": { "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-beta-*" + "System.Text.Encoding.Extensions": "4.0.11-*" } } } From 0692ebe628b8089bfc18dabef42697bc8b362c20 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Thu, 12 Nov 2015 12:23:29 -0800 Subject: [PATCH 0883/1838] Remove System beta tag in project.json for coreclr packages. --- src/Microsoft.AspNet.Hosting/project.json | 14 +++++++------- src/Microsoft.AspNet.Server.Testing/project.json | 16 ++++++++-------- src/Microsoft.AspNet.TestHost/project.json | 6 +++--- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 823b1cc372..c34f9fd752 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -23,7 +23,7 @@ "Microsoft.Extensions.Logging": "1.0.0-*", "Microsoft.Extensions.CompilationAbstractions": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", - "System.Diagnostics.DiagnosticSource": "4.0.0-beta-*" + "System.Diagnostics.DiagnosticSource": "4.0.0-*" }, "frameworks": { "dnx451": { @@ -38,16 +38,16 @@ }, "dnxcore50": { "dependencies": { - "System.Console": "4.0.0-beta-*", - "System.Diagnostics.StackTrace": "4.0.1-beta-*", - "System.Reflection.Extensions": "4.0.1-beta-*" + "System.Console": "4.0.0-*", + "System.Diagnostics.StackTrace": "4.0.1-*", + "System.Reflection.Extensions": "4.0.1-*" } }, "dotnet5.4": { "dependencies": { - "System.Console": "4.0.0-beta-*", - "System.Diagnostics.StackTrace": "4.0.1-beta-*", - "System.Reflection.Extensions": "4.0.1-beta-*" + "System.Console": "4.0.0-*", + "System.Diagnostics.StackTrace": "4.0.1-*", + "System.Reflection.Extensions": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 833e0f0a62..77079ef4f8 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -26,15 +26,15 @@ }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Process": "4.0.0-beta-*", - "System.IO.FileSystem": "4.0.1-beta-*", - "System.Net.Http": "4.0.1-beta-*", - "System.Net.Primitives": "4.0.11-beta-*", - "System.Runtime.Extensions": "4.0.11-beta-*", - "System.Text.RegularExpressions": "4.0.11-beta-*", - "System.Threading": "4.0.11-beta-*", + "System.Diagnostics.Process": "4.0.0-*", + "System.IO.FileSystem": "4.0.1-*", + "System.Net.Http": "4.0.1-*", + "System.Net.Primitives": "4.0.11-*", + "System.Runtime.Extensions": "4.0.11-*", + "System.Text.RegularExpressions": "4.0.11-*", + "System.Threading": "4.0.11-*", "System.Threading.Thread": "4.0.0-*" } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNet.TestHost/project.json index 7f32b07622..bdadfda68b 100644 --- a/src/Microsoft.AspNet.TestHost/project.json +++ b/src/Microsoft.AspNet.TestHost/project.json @@ -20,9 +20,9 @@ }, "dotnet5.4": { "dependencies": { - "System.Diagnostics.Contracts": "4.0.1-beta-*", - "System.Net.Http": "4.0.1-beta-*" + "System.Diagnostics.Contracts": "4.0.1-*", + "System.Net.Http": "4.0.1-*" } } } -} \ No newline at end of file +} From 8341c6a944326c95485670f72e4de52423721eac Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 13 Nov 2015 11:04:43 -0800 Subject: [PATCH 0884/1838] Reacting to DependencyInjection changes --- src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs | 2 +- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 8 ++++---- .../StartupManagerTests.cs | 10 +++++----- .../Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 4b304c152a..2a5ef5f534 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -72,7 +72,7 @@ namespace Microsoft.AspNet.Hosting.Internal _startupLoader = startupLoader; _captureStartupErrors = captureStartupErrors; _applicationLifetime = new ApplicationLifetime(); - _applicationServiceCollection.AddInstance(_applicationLifetime); + _applicationServiceCollection.AddSingleton(_applicationLifetime); } public IServiceProvider ApplicationServices diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index f60c32fb32..ca52616b35 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -67,8 +67,8 @@ namespace Microsoft.AspNet.Hosting private IServiceCollection BuildHostingServices() { var services = new ServiceCollection(); - services.AddInstance(_hostingEnvironment); - services.AddInstance(_loggerFactory); + services.AddSingleton(_hostingEnvironment); + services.AddSingleton(_loggerFactory); services.AddTransient(); @@ -79,8 +79,8 @@ namespace Microsoft.AspNet.Hosting services.AddLogging(); var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); - services.AddInstance(diagnosticSource); - services.AddInstance(diagnosticSource); + services.AddSingleton(diagnosticSource); + services.AddSingleton(diagnosticSource); // Conjure up a RequestServices services.AddTransient(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index f7d835cd87..0272e66a81 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -22,7 +22,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupClassMayHaveHostingServicesInjected() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance(this); + serviceCollection.AddSingleton(this); var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); @@ -71,7 +71,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupWithNoConfigureThrows() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance(this); + serviceCollection.AddSingleton(this); var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); @@ -87,7 +87,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupWithTwoConfiguresThrows() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance(this); + serviceCollection.AddSingleton(this); var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); @@ -103,7 +103,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupWithPrivateConfiguresThrows() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance(this); + serviceCollection.AddSingleton(this); var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void StartupWithTwoConfigureServicesThrows() { var serviceCollection = new ServiceCollection(); - serviceCollection.AddInstance(this); + serviceCollection.AddSingleton(this); var services = serviceCollection.BuildServiceProvider(); var diagnosticMessages = new List(); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index a422818802..06c21fc3f8 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -203,7 +203,7 @@ namespace Microsoft.AspNet.TestHost return context.Response.WriteAsync("Success"); }); }, - services => services.AddInstance(new ReplaceServiceProvidersFeatureFilter(appServices, appServices))); + services => services.AddSingleton(new ReplaceServiceProvidersFeatureFilter(appServices, appServices))); var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); } From 88c356f645e438ba0518d488182cde6a61fd0e21 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Fri, 13 Nov 2015 15:12:11 -0800 Subject: [PATCH 0885/1838] Add HtmlContentBuilder and HtmlTextWriter Remove BufferedHtmlContent --- HttpAbstractions.sln | 32 +---- .../HtmlContentBuilder.cs} | 117 ++++++++++-------- .../HtmlContentBuilderExtensions.cs | 27 ---- .../HtmlEncodedString.cs | 49 ++++++++ .../HtmlTextWriter.cs | 49 ++++++++ .../Properties/AssemblyInfo.cs | 4 +- .../project.json | 1 + ...tensions.BufferedHtmlContent.Sources.xproj | 19 --- .../Properties/AssemblyInfo.cs | 8 -- .../project.json | 18 --- .../HtmlContentBuilderTest.cs} | 16 +-- .../project.json | 4 + ....Extensions.BufferedHtmlContent.Test.xproj | 21 ---- .../project.json | 21 ---- 14 files changed, 179 insertions(+), 207 deletions(-) rename src/{Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs => Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs} (52%) create mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs create mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs delete mode 100644 src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj delete mode 100644 src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json rename test/{Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs => Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs} (90%) delete mode 100644 test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj delete mode 100644 test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 289cdf8dcb..b2884f66ab 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.24711.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885A-452A-A731-B0173DDBD913}" EndProject @@ -46,10 +46,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\Sample EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Sources", "src\Microsoft.Extensions.BufferedHtmlContent.Sources\Microsoft.Extensions.BufferedHtmlContent.Sources.xproj", "{B1B2B906-24AE-4C57-AAC5-19B734014504}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.BufferedHtmlContent.Test", "test\Microsoft.Extensions.BufferedHtmlContent.Test\Microsoft.Extensions.BufferedHtmlContent.Test.xproj", "{3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -264,30 +260,6 @@ Global {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Any CPU.Build.0 = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.ActiveCfg = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Debug|x86.Build.0 = Debug|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.ActiveCfg = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Any CPU.Build.0 = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.ActiveCfg = Release|Any CPU - {B1B2B906-24AE-4C57-AAC5-19B734014504}.Release|x86.Build.0 = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.ActiveCfg = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Debug|x86.Build.0 = Debug|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Any CPU.Build.0 = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.ActiveCfg = Release|Any CPU - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -312,7 +284,5 @@ Global {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {B1B2B906-24AE-4C57-AAC5-19B734014504} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {3E5311E2-A73E-40CC-A58C-5A62CEAD43AE} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs similarity index 52% rename from src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs rename to src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs index 4ca8ba7be8..0f6fbabc4c 100644 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/BufferedHtmlContent.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs @@ -1,62 +1,95 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Text.Encodings.Web; -using Microsoft.AspNet.Html.Abstractions; -namespace Microsoft.Extensions.Internal +namespace Microsoft.AspNet.Html.Abstractions { /// - /// Enumerable object collection which knows how to write itself. + /// An implementation using an in memory list. /// - [DebuggerDisplay("{DebuggerToString()}")] - internal class BufferedHtmlContent : IHtmlContentBuilder + public class HtmlContentBuilder : IHtmlContentBuilder { - // This is not List because that would lead to wrapping all strings to IHtmlContent - // which is not space performant. - // internal for testing. - internal List Entries { get; } = new List(); - /// - /// Appends the to the collection. + /// Creates a new . /// - /// The string to be appended. - /// A reference to this instance after the Append operation has completed. - public IHtmlContentBuilder Append(string unencoded) + public HtmlContentBuilder() + : this(new List()) { - Entries.Add(unencoded); - return this; } /// - /// Appends a to the collection. + /// Creates a new with the given initial capacity. /// - /// The to be appended. - /// A reference to this instance after the Append operation has completed. + /// The initial capacity of the backing store. + public HtmlContentBuilder(int capacity) + : this(new List(capacity)) + { + } + + /// + /// Creates a new with the given list of entries. + /// + /// + /// The list of entries. The will use this list without making a copy. + /// + public HtmlContentBuilder(List entries) + { + if (entries == null) + { + throw new ArgumentNullException(nameof(entries)); + } + + Entries = entries; + } + + // This is not List because that would lead to wrapping all strings to IHtmlContent + // which is not space performant. + // + // In general unencoded strings are added here. We're optimizing for that case, and allocating + // a wrapper when encoded strings are used. + // + // internal for testing. + internal List Entries { get; } + + /// + public IHtmlContentBuilder Append(string unencoded) + { + if (!string.IsNullOrEmpty(unencoded)) + { + Entries.Add(unencoded); + } + + return this; + } + + /// public IHtmlContentBuilder Append(IHtmlContent htmlContent) { + if (htmlContent == null) + { + return this; + } + Entries.Add(htmlContent); return this; } - /// - /// Appends the HTML encoded to the collection. - /// - /// The HTML encoded string to be appended. - /// A reference to this instance after the Append operation has completed. + /// public IHtmlContentBuilder AppendHtml(string encoded) { - Entries.Add(new HtmlEncodedString(encoded)); + if (!string.IsNullOrEmpty(encoded)) + { + Entries.Add(new HtmlEncodedString(encoded)); + } + return this; } - /// - /// Removes all the entries from the collection. - /// - /// A reference to this instance after the Clear operation has completed. + + /// public IHtmlContentBuilder Clear() { Entries.Clear(); @@ -78,11 +111,6 @@ namespace Microsoft.Extensions.Internal foreach (var entry in Entries) { - if (entry == null) - { - continue; - } - var entryAsString = entry as string; if (entryAsString != null) { @@ -104,22 +132,5 @@ namespace Microsoft.Extensions.Internal return writer.ToString(); } } - - private class HtmlEncodedString : IHtmlContent - { - public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); - - private readonly string _value; - - public HtmlEncodedString(string value) - { - _value = value; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(_value); - } - } } } diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs index 5b1164b438..63c311c6e0 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs @@ -185,33 +185,6 @@ namespace Microsoft.AspNet.Html.Abstractions return builder; } - [DebuggerDisplay("{DebuggerToString()}")] - private class HtmlEncodedString : IHtmlContent - { - public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); - - private readonly string _value; - - public HtmlEncodedString(string value) - { - _value = value; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(_value); - } - - private string DebuggerToString() - { - using (var writer = new StringWriter()) - { - WriteTo(writer, HtmlEncoder.Default); - return writer.ToString(); - } - } - } - [DebuggerDisplay("{DebuggerToString()}")] private class HtmlFormatString : IHtmlContent { diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs new file mode 100644 index 0000000000..ccf417054e --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Text.Encodings.Web; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// An impelementation that wraps an HTML encoded . + /// + [DebuggerDisplay("{DebuggerToString()}")] + public class HtmlEncodedString : IHtmlContent + { + /// + /// An instance for . + /// + public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); + + private readonly string _value; + + /// + /// Creates a new . + /// + /// The HTML encoded value. + public HtmlEncodedString(string value) + { + if (value == null) + { + throw new ArgumentNullException(nameof(value)); + } + + _value = value; + } + + /// + public void WriteTo(TextWriter writer, HtmlEncoder encoder) + { + writer.Write(_value); + } + + private string DebuggerToString() + { + return _value; + } + } +} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs new file mode 100644 index 0000000000..143d97f206 --- /dev/null +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; + +namespace Microsoft.AspNet.Html.Abstractions +{ + /// + /// A which supports special processing of . + /// + public abstract class HtmlTextWriter : TextWriter + { + /// + /// Writes an value. + /// + /// The value. + public abstract void Write(IHtmlContent value); + + /// + public override void Write(object value) + { + var htmlContent = value as IHtmlContent; + if (htmlContent == null) + { + base.Write(value); + } + else + { + Write(htmlContent); + } + } + + /// + public override void WriteLine(object value) + { + var htmlContent = value as IHtmlContent; + if (htmlContent == null) + { + base.Write(value); + } + else + { + Write(htmlContent); + } + + base.WriteLine(); + } + } +} diff --git a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs index b2437d9ad6..d310306c25 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs @@ -3,6 +3,8 @@ using System.Reflection; using System.Resources; +using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file +[assembly: NeutralResourcesLanguage("en-us")] +[assembly: InternalsVisibleTo("Microsoft.AspNet.Html.Abstractions.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json index cc263ffbe0..c654bcde77 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ b/src/Microsoft.AspNet.Html.Abstractions/project.json @@ -21,6 +21,7 @@ }, "dotnet5.4": { "dependencies": { + "System.Collections": "4.0.11-*", "System.Resources.ResourceManager": "4.0.1-*" } } diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj deleted file mode 100644 index 6d93971523..0000000000 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Microsoft.Extensions.BufferedHtmlContent.Sources.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - b1b2b906-24ae-4c57-aac5-19b734014504 - Microsoft.Extensions.BufferedHtmlContent.Sources - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs deleted file mode 100644 index b2437d9ad6..0000000000 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json b/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json deleted file mode 100644 index 273702a80e..0000000000 --- a/src/Microsoft.Extensions.BufferedHtmlContent.Sources/project.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "version": "1.0.0-*", - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "shared": "*.cs", - "dependencies": {}, - "frameworks": { - "net451": {}, - "dotnet5.4": { - "dependencies": { - "System.Resources.ResourceManager": "4.0.1-*", - "System.Runtime": "4.0.21-*" - } - } - } -} diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs similarity index 90% rename from test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs rename to test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs index f65cb4eaaf..4c2c3177cb 100644 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/BufferedHtmlContentTest.cs +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs @@ -9,13 +9,13 @@ using Xunit; namespace Microsoft.Extensions.Internal { - public class BufferedHtmlContentTest + public class HtmlContentBuilderTest { [Fact] public void AppendString_AppendsAString() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); // Act content.Append("Hello"); @@ -29,7 +29,7 @@ namespace Microsoft.Extensions.Internal public void AppendString_WrittenAsEncoded() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); content.Append("Hello"); var writer = new StringWriter(); @@ -45,7 +45,7 @@ namespace Microsoft.Extensions.Internal public void AppendHtml_DoesNotGetWrittenAsEncoded() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); content.AppendHtml("Hello"); var writer = new StringWriter(); @@ -61,7 +61,7 @@ namespace Microsoft.Extensions.Internal public void AppendIHtmlContent_AppendsAsIs() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); var writer = new StringWriter(); // Act @@ -78,7 +78,7 @@ namespace Microsoft.Extensions.Internal public void CanAppendMultipleItems() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); // Act content.Append(new TestHtmlContent("hello")); @@ -94,7 +94,7 @@ namespace Microsoft.Extensions.Internal public void Clear_DeletesAllItems() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); content.Append(new TestHtmlContent("hello")); content.Append("Test"); @@ -109,7 +109,7 @@ namespace Microsoft.Extensions.Internal public void WriteTo_WritesAllItems() { // Arrange - var content = new BufferedHtmlContent(); + var content = new HtmlContentBuilder(); var writer = new StringWriter(); content.Append(new TestHtmlContent("Hello")); content.Append("Test"); diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json index 06a8d06a2c..b8e9656f15 100644 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json @@ -1,4 +1,8 @@ { + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, "dependencies": { "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj b/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj deleted file mode 100644 index f0c4c7f35a..0000000000 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/Microsoft.Extensions.BufferedHtmlContent.Test.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 3e5311e2-a73e-40cc-a58c-5a62cead43ae - Microsoft.Extensions.BufferedHtmlContent.Test - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json b/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json deleted file mode 100644 index 8ed950043b..0000000000 --- a/test/Microsoft.Extensions.BufferedHtmlContent.Test/project.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "compilationOptions": { - "warningsAsErrors": true - }, - "dependencies": { - "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.Extensions.BufferedHtmlContent.Sources": { - "type": "build", - "version": "1.0.0-*" - }, - "Microsoft.Extensions.WebEncoders.Tests" : "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} From d25c25c4b258a8a60f21ea70db5dc566164924e0 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 16 Nov 2015 08:55:10 -0800 Subject: [PATCH 0886/1838] Remove old package from nuget verifier --- NuGetPackageVerifier.json | 1 - 1 file changed, 1 deletion(-) diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index d39dab5e26..f2111a1802 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -16,7 +16,6 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, - "Microsoft.Extensions.BufferedHtmlContent.Sources": { }, "Microsoft.Extensions.WebEncoders": { }, "Microsoft.Net.Http.Headers": { } } From d4d04d2c96d9050742e45ebb7006cd0ea4af3dcc Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 13 Nov 2015 17:32:48 -0800 Subject: [PATCH 0887/1838] Adding exception message for paths not starting with / #251 --- src/Microsoft.AspNet.Http.Abstractions/PathString.cs | 3 ++- .../Properties/Resources.Designer.cs | 8 ++++++++ src/Microsoft.AspNet.Http.Abstractions/Resources.resx | 3 +++ .../PathStringTests.cs | 2 +- 4 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index ef6e1bb39e..78c01cdcc1 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -3,6 +3,7 @@ using System; using System.Text.Encodings.Web; +using Microsoft.AspNet.Http.Abstractions; namespace Microsoft.AspNet.Http { @@ -29,7 +30,7 @@ namespace Microsoft.AspNet.Http { if (!string.IsNullOrEmpty(value) && value[0] != '/') { - throw new ArgumentException(""/*Resources.Exception_PathMustStartWithSlash*/, nameof(value)); + throw new ArgumentException(Resources.FormatException_PathMustStartWithSlash(nameof(value)), nameof(value)); } _value = value; } diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs index 9fb86a30c6..82505c66e0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs @@ -10,6 +10,14 @@ namespace Microsoft.AspNet.Http.Abstractions private static readonly ResourceManager _resourceManager = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); + /// + /// '{0}' is not available. + /// + internal static string FormatException_PathMustStartWithSlash(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); + } + /// /// '{0}' is not available. /// diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx index bdd74fd6de..1c947c352b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx @@ -132,4 +132,7 @@ Multiple public '{0}' methods are available. + + The path in '{0}' must start with '/'. + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs index 48d403a9ee..3eb5673d60 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http public void CtorThrows_IfPathDoesNotHaveLeadingSlash() { // Act and Assert - ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", ""); + ExceptionAssert.ThrowsArgument(() => new PathString("hello"), "value", "The path in 'value' must start with '/'."); } [Theory] From cb3e9b1218c8c946764e3b029944e522c4c4c661 Mon Sep 17 00:00:00 2001 From: Ryan Nowak Date: Mon, 16 Nov 2015 10:51:30 -0800 Subject: [PATCH 0888/1838] Change List to IList --- .../HtmlContentBuilder.cs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs index 0f6fbabc4c..198cd0fb38 100644 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs +++ b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Html.Abstractions /// /// The list of entries. The will use this list without making a copy. /// - public HtmlContentBuilder(List entries) + public HtmlContentBuilder(IList entries) { if (entries == null) { @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.Html.Abstractions // a wrapper when encoded strings are used. // // internal for testing. - internal List Entries { get; } + internal IList Entries { get; } /// public IHtmlContentBuilder Append(string unencoded) @@ -109,8 +109,10 @@ namespace Microsoft.AspNet.Html.Abstractions throw new ArgumentNullException(nameof(encoder)); } - foreach (var entry in Entries) + for (var i = 0; i < Entries.Count; i++) { + var entry = Entries[i]; + var entryAsString = entry as string; if (entryAsString != null) { From 690e5a66e54acb76da3ca347dfa6cfcf209063ba Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 13 Nov 2015 10:55:16 -0800 Subject: [PATCH 0889/1838] Set default path=/ when removing cookie --- src/Microsoft.AspNet.Http/ResponseCookies.cs | 31 +------------ .../ResponseCookiesTest.cs | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 30 deletions(-) create mode 100644 test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNet.Http/ResponseCookies.cs index cd6b9c6ee9..185540eb50 100644 --- a/src/Microsoft.AspNet.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNet.Http/ResponseCookies.cs @@ -80,36 +80,7 @@ namespace Microsoft.AspNet.Http.Internal /// public void Delete(string key) { - var encodedKeyPlusEquals = UrlEncoder.Default.Encode(key) + "="; - Func predicate = (value, encKeyPlusEquals) => value.StartsWith(encKeyPlusEquals, StringComparison.OrdinalIgnoreCase); - - StringValues deleteCookies = $"{encodedKeyPlusEquals}; expires=Thu, 01-Jan-1970 00:00:00 GMT"; - var existingValues = Headers[HeaderNames.SetCookie]; - if (StringValues.IsNullOrEmpty(existingValues)) - { - Headers[HeaderNames.SetCookie] = deleteCookies; - } - else - { - var values = existingValues.ToArray(); - var newValues = new List(); - - for (var i = 0; i < values.Length; i++) - { - if (!predicate(values[i], encodedKeyPlusEquals)) - { - newValues.Add(values[i]); - } - } - - values = deleteCookies.ToArray(); - for (var i = 0; i < values.Length; i++) - { - newValues.Add(values[i]); - } - - Headers[HeaderNames.SetCookie] = new StringValues(newValues.ToArray()); - } + Delete(key, new CookieOptions() { Path = "/" }); } /// diff --git a/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs new file mode 100644 index 0000000000..e22d4f338a --- /dev/null +++ b/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs @@ -0,0 +1,46 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Xunit; +using Microsoft.Net.Http.Headers; +using Microsoft.AspNet.Http.Internal; + +namespace Microsoft.AspNet.Http.Tests +{ + public class ResponseCookiesTest + { + [Fact] + public void DeleteCookieShouldSetDefaultPath() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + var testcookie = "TestCookie"; + + cookies.Delete(testcookie); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + } + + [Fact] + public void NoParamsDeleteRemovesCookieCreatedByAdd() + { + var headers = new HeaderDictionary(); + var cookies = new ResponseCookies(headers); + var testcookie = "TestCookie"; + + cookies.Append(testcookie, testcookie); + cookies.Delete(testcookie); + + var cookieHeaderValues = headers[HeaderNames.SetCookie]; + Assert.Equal(1, cookieHeaderValues.Count); + Assert.StartsWith(testcookie, cookieHeaderValues[0]); + Assert.Contains("path=/", cookieHeaderValues[0]); + Assert.Contains("expires=Thu, 01 Jan 1970 00:00:00 GMT", cookieHeaderValues[0]); + } + + } +} From 861b8b75e8bbeda02bb675bcd74ac48106719a0f Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 17 Nov 2015 10:59:38 -0800 Subject: [PATCH 0890/1838] Explicitly choose Mono 4.0.5 - avoids future problems related to aspnet/External#48 - e.g. when Travis updates default Mono version in `csharp` bundle --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 947bf868ee..dc44c0f660 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: csharp sudo: false +mono: + - 4.0.5 script: - ./build.sh --quiet verify \ No newline at end of file From 9e5ba94804da75816aba9f9a019882474207d8ff Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 17 Nov 2015 11:00:20 -0800 Subject: [PATCH 0891/1838] Explicitly choose Mono 4.0.5 - avoids future problems related to aspnet/External#48 - e.g. when Travis updates default Mono version in `csharp` bundle --- .travis.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.travis.yml b/.travis.yml index 947bf868ee..dc44c0f660 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: csharp sudo: false +mono: + - 4.0.5 script: - ./build.sh --quiet verify \ No newline at end of file From fbec068f5c4ca438842dc72508c525b2a8e74830 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 9 Nov 2015 10:07:35 -0800 Subject: [PATCH 0892/1838] Adding option to configure services when exposing the ASP.NET 5 pipeline via OWIN #398 --- src/Microsoft.AspNet.Owin/OwinExtensions.cs | 21 +++-- .../OwinExtensionTests.cs | 87 +++++++++++++++++++ .../OwinFeatureCollectionTests.cs | 1 - test/Microsoft.AspNet.Owin.Tests/project.json | 1 + 4 files changed, 104 insertions(+), 6 deletions(-) create mode 100644 test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 3f31ce5923..3f6882653f 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -66,22 +66,27 @@ namespace Microsoft.AspNet.Builder } public static IApplicationBuilder UseBuilder(this AddMiddleware app) + { + return app.UseBuilder(serviceProvider: null); + } + + public static IApplicationBuilder UseBuilder(this AddMiddleware app, IServiceProvider serviceProvider) { // Adapt WebSockets by default. app(OwinWebSocketAcceptAdapter.AdaptWebSockets); - var builder = new ApplicationBuilder(serviceProvider: null); + var builder = new ApplicationBuilder(serviceProvider: serviceProvider); - CreateMiddleware middleware = CreateMiddlewareFactory(exit => + var middleware = CreateMiddlewareFactory(exit => { builder.Use(ignored => exit); return builder.Build(); - }); + }, builder.ApplicationServices); app(middleware); return builder; } - private static CreateMiddleware CreateMiddlewareFactory(Func middleware) + private static CreateMiddleware CreateMiddlewareFactory(Func middleware, IServiceProvider applicationServices) { return next => { @@ -105,6 +110,7 @@ namespace Microsoft.AspNet.Builder context = new DefaultHttpContext( new FeatureCollection( new OwinFeatureCollection(env))); + context.ApplicationServices = applicationServices; } return app.Invoke(context); @@ -114,7 +120,12 @@ namespace Microsoft.AspNet.Builder public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline) { - var builder = app.UseBuilder(); + return app.UseBuilder(pipeline, serviceProvider: null); + } + + public static AddMiddleware UseBuilder(this AddMiddleware app, Action pipeline, IServiceProvider serviceProvider) + { + var builder = app.UseBuilder(serviceProvider); pipeline(builder); return app; } diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs new file mode 100644 index 0000000000..d7d0a398d1 --- /dev/null +++ b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs @@ -0,0 +1,87 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNet.Owin +{ + using AppFunc = Func, Task>; + using CreateMiddleware = Func< + Func, Task>, + Func, Task> + >; + using AddMiddleware = Action, Task>, + Func, Task> + >>; + + public class OwinExtensionTests + { + static AppFunc notFound = env => new Task(() => { env["owin.ResponseStatusCode"] = 404; }); + + [Fact] + public void OwinConfigureServiceProviderAddsServices() + { + var list = new List(); + AddMiddleware build = list.Add; + IServiceProvider serviceProvider = null; + FakeService fakeService = null; + + var builder = build.UseBuilder(applicationBuilder => + { + serviceProvider = applicationBuilder.ApplicationServices; + applicationBuilder.Run(async context => + { + fakeService = context.ApplicationServices.GetService(); + }); + }, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider()); + + list.Reverse(); + list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary()); + + Assert.NotNull(fakeService); + Assert.NotNull(serviceProvider.GetService()); + } + + [Fact] + public void OwinDefaultNoServices() + { + var list = new List(); + AddMiddleware build = list.Add; + IServiceProvider serviceProvider = null; + FakeService fakeService = null; + bool builderExecuted = false; + bool applicationExecuted = false; + + var builder = build.UseBuilder(applicationBuilder => + { + builderExecuted = true; + serviceProvider = applicationBuilder.ApplicationServices; + applicationBuilder.Run(async context => + { + applicationExecuted = true; + fakeService = context.ApplicationServices.GetService(); + }); + }); + + list.Reverse(); + list.Aggregate(notFound, (next, middleware) => middleware(next)).Invoke(new Dictionary()); + + Assert.True(builderExecuted); + Assert.Null(fakeService); + Assert.True(applicationExecuted); + Assert.Null(serviceProvider); + } + + private class FakeService + { + + } + } +} diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs index b4958629f7..b945af4734 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using System.Linq; using Microsoft.AspNet.Http.Features; using Xunit; diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 05c31c8a00..9fc7f68ba0 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -2,6 +2,7 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "commands": { From d867d2555b98995f332a8fe74c58f48d009c7461 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 17 Nov 2015 12:44:12 -0800 Subject: [PATCH 0893/1838] Move Travis to supported Linux distribution - use Ubuntu 14.04 (Trusty) - Travis support for Trusty is in Beta and currently requires `sudo` - run `dnu restore` with DNX Core since aspnet/External#49 is not fixed in Mono versions we can use - add required dependencies for DNX Core to `.travis.yml` - addresses part of aspnet/Universe#290 --- .travis.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc44c0f660..2fc624899f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,18 @@ language: csharp -sudo: false +sudo: required +dist: trusty +addons: + apt: + packages: + - gettext + - libcurl4-openssl-dev + - libicu-dev + - libssl-dev + - libunwind8 + - zlib1g +env: + - KOREBUILD_DNU_RESTORE_CORECLR=true mono: - 4.0.5 script: - - ./build.sh --quiet verify \ No newline at end of file + - ./build.sh --quiet verify From 4efc40d8b1d328952635f18b873509627cdb7e19 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 17 Nov 2015 12:46:36 -0800 Subject: [PATCH 0894/1838] Move Travis to supported Linux distribution - use Ubuntu 14.04 (Trusty) - Travis support for Trusty is in Beta and currently requires `sudo` - run `dnu restore` with DNX Core since aspnet/External#49 is not fixed in Mono versions we can use - add required dependencies for DNX Core to `.travis.yml` - addresses part of aspnet/Universe#290 --- .travis.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index dc44c0f660..2fc624899f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,6 +1,18 @@ language: csharp -sudo: false +sudo: required +dist: trusty +addons: + apt: + packages: + - gettext + - libcurl4-openssl-dev + - libicu-dev + - libssl-dev + - libunwind8 + - zlib1g +env: + - KOREBUILD_DNU_RESTORE_CORECLR=true mono: - 4.0.5 script: - - ./build.sh --quiet verify \ No newline at end of file + - ./build.sh --quiet verify From 681533e06c5737293747322a48da8c55603031e8 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 11 Nov 2015 11:29:32 -0800 Subject: [PATCH 0895/1838] Set IHttpContextAccessor only if DI provides it --- src/Microsoft.AspNet.Http/HttpContextFactory.cs | 14 ++++++++++++-- .../HttpContextFactoryTests.cs | 11 +++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNet.Http/HttpContextFactory.cs index 9c98fd1594..0f6546cd36 100644 --- a/src/Microsoft.AspNet.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNet.Http/HttpContextFactory.cs @@ -9,6 +9,10 @@ namespace Microsoft.AspNet.Http.Internal { private IHttpContextAccessor _httpContextAccessor; + public HttpContextFactory() : this(httpContextAccessor: null) + { + } + public HttpContextFactory(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; @@ -17,13 +21,19 @@ namespace Microsoft.AspNet.Http.Internal public HttpContext Create(IFeatureCollection featureCollection) { var httpContext = new DefaultHttpContext(featureCollection); - _httpContextAccessor.HttpContext = httpContext; + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = httpContext; + } return httpContext; } public void Dispose(HttpContext httpContext) { - _httpContextAccessor.HttpContext = null; + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = null; + } } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs index 1fcdcab423..b0d800de38 100644 --- a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs @@ -21,5 +21,16 @@ namespace Microsoft.AspNet.Http.Internal // Assert Assert.True(ReferenceEquals(context, accessor.HttpContext)); } + + [Fact] + public void AllowsCreatingContextWithoutSettingAccessor() + { + // Arrange + var contextFactory = new HttpContextFactory(); + + // Act & Assert + var context = contextFactory.Create(new FeatureCollection()); + contextFactory.Dispose(context); + } } } \ No newline at end of file From 3c1b7597504b39b0c0bcbf9915e60adfa7bee853 Mon Sep 17 00:00:00 2001 From: Master T Date: Tue, 17 Nov 2015 20:26:41 +0100 Subject: [PATCH 0896/1838] Merge pull request #485 from tmds:dev Convert Environment Ticks to TimeSpan Ticks --- .../Internal/HostingLoggerExtensions.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs index a92eac1444..67f9f114ff 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -10,6 +10,8 @@ namespace Microsoft.AspNet.Hosting.Internal { internal static class HostingLoggerExtensions { + private const long TicksPerMillisecond = 10000; + public static IDisposable RequestScope(this ILogger logger, HttpContext httpContext) { return logger.BeginScopeImpl(new HostingLogScope(httpContext)); @@ -32,7 +34,7 @@ namespace Microsoft.AspNet.Hosting.Internal { if (logger.IsEnabled(LogLevel.Information)) { - var elapsed = new TimeSpan(Environment.TickCount - startTimeInTicks); + var elapsed = new TimeSpan(TicksPerMillisecond * (Environment.TickCount - startTimeInTicks)); logger.Log( logLevel: LogLevel.Information, eventId: LoggerEventIds.RequestFinished, @@ -46,7 +48,7 @@ namespace Microsoft.AspNet.Hosting.Internal { if (logger.IsEnabled(LogLevel.Information)) { - var elapsed = new TimeSpan(Environment.TickCount - startTimeInTicks); + var elapsed = new TimeSpan(TicksPerMillisecond * (Environment.TickCount - startTimeInTicks)); logger.Log( logLevel: LogLevel.Information, eventId: LoggerEventIds.RequestFailed, From 78e90d7f0424361749520f3f60dd643c8733f9d9 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 17 Nov 2015 18:59:46 -0800 Subject: [PATCH 0897/1838] Update ifdefs from DNXCORE50 to DOTNET5_4 Fixes #467 --- src/Microsoft.AspNet.Http/FormCollection.cs | 3 ++- src/Microsoft.AspNet.Http/HeaderDictionary.cs | 2 +- src/Microsoft.AspNet.Http/QueryCollection.cs | 2 +- src/Microsoft.AspNet.Http/RequestCookieCollection.cs | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNet.Http/FormCollection.cs index fbc3b88a38..b8e13fb315 100644 --- a/src/Microsoft.AspNet.Http/FormCollection.cs +++ b/src/Microsoft.AspNet.Http/FormCollection.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; @@ -13,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal public class FormCollection : IFormCollection { public static readonly FormCollection Empty = new FormCollection(); -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNet.Http/HeaderDictionary.cs index 530c5f31e0..181c938ca1 100644 --- a/src/Microsoft.AspNet.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNet.Http/HeaderDictionary.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Internal /// public class HeaderDictionary : IHeaderDictionary { -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNet.Http/QueryCollection.cs b/src/Microsoft.AspNet.Http/QueryCollection.cs index 2b9168d500..6ea9c379ac 100644 --- a/src/Microsoft.AspNet.Http/QueryCollection.cs +++ b/src/Microsoft.AspNet.Http/QueryCollection.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal public class QueryCollection : IQueryCollection { public static readonly QueryCollection Empty = new QueryCollection(); -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); private static readonly StringValues[] EmptyValues = Array.Empty(); #else diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs index 8b2a44239c..9751eee486 100644 --- a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNet.Http/RequestCookieCollection.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Http.Internal public class RequestCookieCollection : IRequestCookieCollection { public static readonly RequestCookieCollection Empty = new RequestCookieCollection(); -#if DNXCORE50 +#if DOTNET5_4 private static readonly string[] EmptyKeys = Array.Empty(); #else private static readonly string[] EmptyKeys = new string[0]; From 2f2ca234a56b8d7367049f11b9a8d4a815177fea Mon Sep 17 00:00:00 2001 From: Chris R Date: Wed, 18 Nov 2015 12:44:08 -0800 Subject: [PATCH 0898/1838] Enable detailed startup errors by default. --- .../Common/DeploymentParameters.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs index 842e65b70f..f4b64df53f 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs @@ -39,6 +39,7 @@ namespace Microsoft.AspNet.Server.Testing ServerType = serverType; RuntimeFlavor = runtimeFlavor; RuntimeArchitecture = runtimeArchitecture; + EnvironmentVariables.Add(new KeyValuePair("ASPNET_DETAILEDERRORS", "true")); } public ServerType ServerType { get; private set; } From 7c8b37bcc726895d12724ba2d7f657c8400c6c4d Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 11 Nov 2015 14:23:59 -0800 Subject: [PATCH 0899/1838] Do not add IHttpContextAccessor to DI by default --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 1 - .../TestServerTests.cs | 15 ++++++++++++--- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index ca52616b35..9ad73e964a 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -75,7 +75,6 @@ namespace Microsoft.AspNet.Hosting services.AddTransient(); services.AddTransient(); services.AddTransient(); - services.AddSingleton(); services.AddLogging(); var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 06c21fc3f8..d34bc4f447 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -289,6 +290,10 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanAccessHttpContext() { + Action configureServices = services => + { + services.AddSingleton(); + }; TestServer server = TestServer.Create(app => { app.Run(context => @@ -296,7 +301,7 @@ namespace Microsoft.AspNet.TestHost var accessor = app.ApplicationServices.GetRequiredService(); return context.Response.WriteAsync("HasContext:"+(accessor.HttpContext != null)); }); - }); + }, configureServices); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -315,6 +320,11 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task CanAddNewHostServices() { + Action configureServices = services => + { + services.AddSingleton(); + services.AddSingleton(); + }; TestServer server = TestServer.Create(app => { app.Run(context => @@ -322,8 +332,7 @@ namespace Microsoft.AspNet.TestHost var accessor = app.ApplicationServices.GetRequiredService(); return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); }); - }, - services => services.AddSingleton()); + }, configureServices); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); From 67aa2546a87f0617005e6f5571ed7fed8ab2f088 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 19 Nov 2015 09:34:38 -0800 Subject: [PATCH 0900/1838] Removing ApplicationServices from HttpContext #466 --- .../Extensions/UseMiddlewareExtensions.cs | 2 +- src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs | 5 ----- src/Microsoft.AspNet.Http/DefaultHttpContext.cs | 6 ------ .../Features/IServiceProvidersFeature.cs | 1 - .../Features/ServiceProvidersFeature.cs | 1 - src/Microsoft.AspNet.Owin/OwinExtensions.cs | 4 ++-- test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs | 4 ++-- 7 files changed, 5 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index fe13dab8c8..42dbc1cc5a 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -74,7 +74,7 @@ namespace Microsoft.AspNet.Builder return context => { - var serviceProvider = context.RequestServices ?? context.ApplicationServices ?? applicationServices; + var serviceProvider = context.RequestServices ?? applicationServices; if (serviceProvider == null) { throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs index 162f3c582d..f639a4dd9d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs @@ -55,11 +55,6 @@ namespace Microsoft.AspNet.Http /// public abstract IDictionary Items { get; set; } - /// - /// Gets or sets the that provides access to the application's service container. - /// - public abstract IServiceProvider ApplicationServices { get; set; } - /// /// Gets or sets the that provides access to the request's service container. /// diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 0c95f04dc4..f4c60fb951 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -176,12 +176,6 @@ namespace Microsoft.AspNet.Http.Internal set { ItemsFeature.Items = value; } } - public override IServiceProvider ApplicationServices - { - get { return ServiceProvidersFeature.ApplicationServices; } - set { ServiceProvidersFeature.ApplicationServices = value; } - } - public override IServiceProvider RequestServices { get { return ServiceProvidersFeature.RequestServices; } diff --git a/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs index b5d192c503..30b9b63b96 100644 --- a/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs @@ -7,7 +7,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public interface IServiceProvidersFeature { - IServiceProvider ApplicationServices { get; set; } IServiceProvider RequestServices { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs index d9082df7a2..194c3b3f36 100644 --- a/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs @@ -7,7 +7,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class ServiceProvidersFeature : IServiceProvidersFeature { - public IServiceProvider ApplicationServices { get; set; } public IServiceProvider RequestServices { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNet.Owin/OwinExtensions.cs index 3f6882653f..5ae81a6260 100644 --- a/src/Microsoft.AspNet.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNet.Owin/OwinExtensions.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Builder return builder; } - private static CreateMiddleware CreateMiddlewareFactory(Func middleware, IServiceProvider applicationServices) + private static CreateMiddleware CreateMiddlewareFactory(Func middleware, IServiceProvider services) { return next => { @@ -110,7 +110,7 @@ namespace Microsoft.AspNet.Builder context = new DefaultHttpContext( new FeatureCollection( new OwinFeatureCollection(env))); - context.ApplicationServices = applicationServices; + context.RequestServices = services; } return app.Invoke(context); diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs index d7d0a398d1..8d719f66c0 100644 --- a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs +++ b/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.Owin serviceProvider = applicationBuilder.ApplicationServices; applicationBuilder.Run(async context => { - fakeService = context.ApplicationServices.GetService(); + fakeService = context.RequestServices.GetService(); }); }, new ServiceCollection().AddSingleton(new FakeService()).BuildServiceProvider()); @@ -66,7 +66,7 @@ namespace Microsoft.AspNet.Owin applicationBuilder.Run(async context => { applicationExecuted = true; - fakeService = context.ApplicationServices.GetService(); + fakeService = context.RequestServices.GetService(); }); }); From 04c30c8bb769aa5aea9fc7e63b0f8d47b81bdb72 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 19 Nov 2015 10:43:08 -0800 Subject: [PATCH 0901/1838] Flow configuration via IHostingEnvironment --- .../IHostingEnvironment.cs | 6 ++++++ .../project.json | 3 ++- .../HostingEnvironment.cs | 4 +++- .../HostingEnvironmentExtensions.cs | 4 +++- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 2 +- .../HostingEngineTests.cs | 18 ++++++++++++++++++ 6 files changed, 33 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs index 6f357d3ca2..cfc96be02f 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; +using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting { @@ -28,5 +29,10 @@ namespace Microsoft.AspNet.Hosting /// // This must be settable! IFileProvider WebRootFileProvider { get; set; } + + /// + /// Gets or sets the configuration object used by hosting environment. + /// + IConfiguration Configuration { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index d8764590da..087bc75058 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -11,7 +11,8 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*" + "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", + "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs index 57617c2893..e7254247a2 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs @@ -2,7 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Microsoft.AspNet.FileProviders; -using Microsoft.AspNet.Hosting.Internal; +using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting { @@ -13,5 +13,7 @@ namespace Microsoft.AspNet.Hosting public string WebRootPath { get; set; } public IFileProvider WebRootFileProvider { get; set; } + + public IConfiguration Configuration { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index b6e5e8071a..6b1fd8c346 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -10,7 +10,7 @@ namespace Microsoft.AspNet.Hosting { public static class HostingEnvironmentExtensions { - public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebHostOptions options) + public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebHostOptions options, IConfiguration configuration) { if (options == null) { @@ -46,6 +46,8 @@ namespace Microsoft.AspNet.Hosting var environmentName = options.Environment; hostingEnvironment.EnvironmentName = environmentName ?? hostingEnvironment.EnvironmentName; + + hostingEnvironment.Configuration = configuration; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 9ad73e964a..bc7e0c7883 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -126,7 +126,7 @@ namespace Microsoft.AspNet.Hosting var appEnvironment = hostingContainer.GetRequiredService(); var startupLoader = hostingContainer.GetRequiredService(); - _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options); + _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options, _config); if (!string.IsNullOrEmpty(_environmentName)) { _hostingEnvironment.EnvironmentName = _environmentName; diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index a31fbd5d43..1268e981fe 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -144,6 +144,24 @@ namespace Microsoft.AspNet.Hosting Assert.Equal("http://localhost:5000", app.ServerFeatures.Get().Addresses.First()); } + [Fact] + public void FlowsConfig() + { + var vals = new Dictionary + { + { "Server", "Microsoft.AspNet.Hosting.Tests" } + }; + + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + var host = CreateBuilder(config).Build(); + var app = host.Start(); + var hostingEnvironment = host.ApplicationServices.GetRequiredService(); + Assert.NotNull(hostingEnvironment.Configuration); + Assert.Equal("Microsoft.AspNet.Hosting.Tests", hostingEnvironment.Configuration["Server"]); + } + [Fact] public void HostingEngineCanBeStarted() { From 73fd257844b6177680f1ccb3dcf3317caf813632 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 19 Nov 2015 09:35:23 -0800 Subject: [PATCH 0902/1838] Reacting to ApplicationServices removal from HttpContext --- .../Internal/HostingEngine.cs | 2 - .../RequestServicesContainerFeature.cs | 20 +------ .../TestServerTests.cs | 58 ++----------------- 3 files changed, 7 insertions(+), 73 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 2a5ef5f534..4a796b6e6f 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -96,8 +96,6 @@ namespace Microsoft.AspNet.Hosting.Internal Server.Start( async httpContext => { - httpContext.ApplicationServices = _applicationServices; - if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) { diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs index 0de3d46ac6..455be554b4 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs @@ -21,23 +21,7 @@ namespace Microsoft.AspNet.Hosting.Internal throw new ArgumentNullException(nameof(applicationServices)); } - ApplicationServices = applicationServices; - } - - public IServiceProvider ApplicationServices - { - get - { - return _appServices; - } - set - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - _appServices = value; - } + _appServices = applicationServices; } public IServiceProvider RequestServices @@ -46,7 +30,7 @@ namespace Microsoft.AspNet.Hosting.Internal { if (!_requestServicesSet) { - _scope = ApplicationServices.GetRequiredService().CreateScope(); + _scope = _appServices.GetRequiredService().CreateScope(); _requestServices = _scope.ServiceProvider; _requestServicesSet = true; } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index d34bc4f447..3116e549fa 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -15,7 +15,6 @@ using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Testing.xunit; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.DiagnosticAdapter; @@ -59,16 +58,17 @@ namespace Microsoft.AspNet.TestHost public void Configure(IApplicationBuilder app) { + var applicationServices = app.ApplicationServices; app.Run(async context => { - await context.Response.WriteAsync("ApplicationServicesEqual:" + (context.ApplicationServices == Services)); + await context.Response.WriteAsync("ApplicationServicesEqual:" + (applicationServices == Services)); }); } } [Fact] - public async Task CustomServiceProviderReplacesApplicationServices() + public async Task CustomServiceProviderSetsApplicationServices() { var server = new TestServer(TestServer.CreateBuilder().UseStartup()); string result = await server.CreateClient().GetStringAsync("/path"); @@ -124,22 +124,6 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Found:True", result); } - [Fact] - public async Task SettingApplicationServicesOnFeatureToNullThrows() - { - var server = TestServer.Create(app => - { - app.Run(context => - { - var feature = context.Features.Get(); - Assert.Throws(() => feature.ApplicationServices = null); - return context.Response.WriteAsync("Success"); - }); - }); - string result = await server.CreateClient().GetStringAsync("/path"); - Assert.Equal("Success", result); - } - [Fact] public async Task CanSetCustomServiceProvider() { @@ -147,16 +131,11 @@ namespace Microsoft.AspNet.TestHost { app.Run(context => { - context.ApplicationServices = new ServiceCollection() - .AddTransient() - .BuildServiceProvider(); - context.RequestServices = new ServiceCollection() .AddTransient() .BuildServiceProvider(); - - var s1 = context.ApplicationServices.GetRequiredService(); - var s2 = context.RequestServices.GetRequiredService(); + + var s = context.RequestServices.GetRequiredService(); return context.Response.WriteAsync("Success"); }); @@ -199,7 +178,6 @@ namespace Microsoft.AspNet.TestHost { app.Run(context => { - Assert.Equal(appServices, context.ApplicationServices); Assert.Equal(appServices, context.RequestServices); return context.Response.WriteAsync("Success"); }); @@ -236,7 +214,6 @@ namespace Microsoft.AspNet.TestHost { app.Run(context => { - Assert.NotNull(context.ApplicationServices); Assert.NotNull(context.RequestServices); return context.Response.WriteAsync("Success"); }); @@ -246,31 +223,6 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Success", result); } - - public class EnsureApplicationServicesFilter : IStartupFilter - { - public Action Configure(Action next) - { - return builder => - { - builder.Run(context => { - Assert.NotNull(context.ApplicationServices); - return context.Response.WriteAsync("Done"); - }); - }; - } - } - - [Fact] - public async Task ApplicationServicesShouldSetBeforeStatupFilters() - { - var server = TestServer.Create(app => { }, - services => services.AddTransient()); - string result = await server.CreateClient().GetStringAsync("/path"); - Assert.Equal("Done", result); - } - - [Fact] public async Task CanAccessLogger() { From 6a719ab95d292b55a7d5713de322c2097e818752 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 20 Nov 2015 09:30:00 -0800 Subject: [PATCH 0903/1838] Remove webroot fallback to approot --- .../HostingEnvironmentExtensions.cs | 5 +- .../HostingEnvironmentExtensions.cs | 23 +++--- .../Internal/NullFileProvider.cs | 82 +++++++++++++++++++ .../HostingEngineTests.cs | 3 + .../HostingEnvironmentExtensionsTests.cs | 71 ++++++++++++++++ .../testroot/wwwroot/README | 1 + .../TestServerTests.cs | 10 --- 7 files changed, 173 insertions(+), 22 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs create mode 100644 test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index c8bc3993a7..d42b40e644 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -91,7 +91,10 @@ namespace Microsoft.AspNet.Hosting { throw new ArgumentNullException(nameof(hostingEnvironment)); } - + if (string.IsNullOrEmpty(hostingEnvironment.WebRootPath)) + { + throw new InvalidOperationException("Can not map path because webroot path is not set"); + } if (virtualPath == null) { return hostingEnvironment.WebRootPath; diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs index 6b1fd8c346..6b46ba7214 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs @@ -4,6 +4,7 @@ using System; using System.IO; using Microsoft.AspNet.FileProviders; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting @@ -26,24 +27,24 @@ namespace Microsoft.AspNet.Hosting { hostingEnvironment.WebRootPath = wwwroot; } - else - { - hostingEnvironment.WebRootPath = applicationBasePath; - } } else { hostingEnvironment.WebRootPath = Path.Combine(applicationBasePath, webRoot); } - - hostingEnvironment.WebRootPath = Path.GetFullPath(hostingEnvironment.WebRootPath); - - if (!Directory.Exists(hostingEnvironment.WebRootPath)) + if (!string.IsNullOrEmpty(hostingEnvironment.WebRootPath)) { - Directory.CreateDirectory(hostingEnvironment.WebRootPath); + hostingEnvironment.WebRootPath = Path.GetFullPath(hostingEnvironment.WebRootPath); + if (!Directory.Exists(hostingEnvironment.WebRootPath)) + { + Directory.CreateDirectory(hostingEnvironment.WebRootPath); + } + hostingEnvironment.WebRootFileProvider = new PhysicalFileProvider(hostingEnvironment.WebRootPath); + } + else + { + hostingEnvironment.WebRootFileProvider = new NullFileProvider(); } - hostingEnvironment.WebRootFileProvider = new PhysicalFileProvider(hostingEnvironment.WebRootPath); - var environmentName = options.Environment; hostingEnvironment.EnvironmentName = environmentName ?? hostingEnvironment.EnvironmentName; diff --git a/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs b/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs new file mode 100644 index 0000000000..73f0bebc93 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs @@ -0,0 +1,82 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.IO; +using Microsoft.AspNet.FileProviders; +using Microsoft.Extensions.Primitives; + +namespace Microsoft.AspNet.Hosting.Internal +{ + internal class NullFileProvider : IFileProvider + { + public IDirectoryContents GetDirectoryContents(string subpath) + { + return new NullDirectoryContents(); + } + + public IFileInfo GetFileInfo(string subpath) + { + return new NullFileInfo(subpath); + } + + public IChangeToken Watch(string filter) + { + return new NullChangeToken(); + } + + private class NullDirectoryContents : IDirectoryContents + { + public bool Exists => false; + + public IEnumerator GetEnumerator() + { + yield break; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } + + internal class NullFileInfo : IFileInfo + { + public NullFileInfo(string name) + { + Name = name; + } + + public bool Exists => false; + + public bool IsDirectory => false; + + public DateTimeOffset LastModified => DateTimeOffset.MinValue; + + public long Length => -1; + + public string Name { get; } + + public string PhysicalPath => null; + + public Stream CreateReadStream() + { + throw new FileNotFoundException(string.Format($"{nameof(NullFileProvider)} does not support reading files.", Name)); + } + } + + private class NullChangeToken : IChangeToken + { + public bool HasChanged => false; + + public bool ActiveChangeCallbacks => false; + + public IDisposable RegisterChangeCallback(Action callback, object state) + { + throw new NotSupportedException($"{nameof(NullFileProvider)} does not support registering change notifications."); + } + } + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 1268e981fe..2017193a16 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -464,6 +464,9 @@ namespace Microsoft.AspNet.Hosting using (engine.Start()) { var env = engine.ApplicationServices.GetRequiredService(); + // MapPath requires webroot to be set, we don't care + // about file provider so just set it here + env.WebRootPath = ""; var mappedPath = env.MapPath(virtualPath); expectedSuffix = expectedSuffix.Replace('/', Path.DirectorySeparatorChar); Assert.Equal(Path.Combine(env.WebRootPath, expectedSuffix), mappedPath); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs new file mode 100644 index 0000000000..44ab8996e2 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs @@ -0,0 +1,71 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using Microsoft.AspNet.FileProviders; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.Extensions.Configuration; +using Xunit; + +namespace Microsoft.AspNet.Hosting.Tests +{ + public class HostingEnvironmentExtensionsTests + { + [Fact] + public void SetsFullPathToWwwroot() + { + var env = new HostingEnvironment(); + + env.Initialize(".", new WebHostOptions() {WebRoot = "testroot"}, null); + + Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); + Assert.IsAssignableFrom(env.WebRootFileProvider); + } + + [Fact] + public void DefaultsToWwwrootSubdir() + { + var env = new HostingEnvironment(); + + env.Initialize("testroot", new WebHostOptions(), null); + + Assert.Equal(Path.GetFullPath(Path.Combine("testroot","wwwroot")), env.WebRootPath); + Assert.IsAssignableFrom(env.WebRootFileProvider); + } + + [Fact] + public void DefaultsToNullFileProvider() + { + var env = new HostingEnvironment(); + + env.Initialize(Path.Combine("testroot", "wwwroot"), new WebHostOptions(), null); + + Assert.Null(env.WebRootPath); + Assert.IsAssignableFrom(env.WebRootFileProvider); + } + + [Fact] + public void SetsConfiguration() + { + var config = new ConfigurationBuilder().Build(); + var env = new HostingEnvironment(); + + env.Initialize(".", new WebHostOptions(), config); + + Assert.Same(config, env.Configuration); + } + + [Fact] + public void OverridesEnvironmentFromConfig() + { + var env = new HostingEnvironment(); + env.EnvironmentName = "SomeName"; + + env.Initialize(".", new WebHostOptions() { Environment = "NewName" }, null); + + Assert.Equal("NewName", env.EnvironmentName); + } + + } +} diff --git a/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README b/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README new file mode 100644 index 0000000000..4b906ff4a8 --- /dev/null +++ b/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README @@ -0,0 +1 @@ +This file is here to keep directories needed by tests. Do no remove it. \ No newline at end of file diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 3116e549fa..9ca048c9e0 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -305,16 +305,6 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("CreateInvokesApp", result); } - [Fact] - public void WebRootCanBeResolvedWhenNotInTheConfig() - { - TestServer server = TestServer.Create(app => - { - var env = app.ApplicationServices.GetRequiredService(); - Assert.Equal(Directory.GetCurrentDirectory(), env.WebRootPath); - }); - } - [Fact] public async Task DisposeStreamIgnored() { From 6ee745f7f5f0c5c663717bfc250a546d00079298 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 20 Nov 2015 13:59:05 -0800 Subject: [PATCH 0904/1838] Fix tests --- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 2017193a16..13921ba022 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -466,7 +466,7 @@ namespace Microsoft.AspNet.Hosting var env = engine.ApplicationServices.GetRequiredService(); // MapPath requires webroot to be set, we don't care // about file provider so just set it here - env.WebRootPath = ""; + env.WebRootPath = "."; var mappedPath = env.MapPath(virtualPath); expectedSuffix = expectedSuffix.Replace('/', Path.DirectorySeparatorChar); Assert.Equal(Path.Combine(env.WebRootPath, expectedSuffix), mappedPath); From 9d19a27b6b988abbd225688f1e808565a766824d Mon Sep 17 00:00:00 2001 From: Chris R Date: Fri, 20 Nov 2015 15:44:51 -0800 Subject: [PATCH 0905/1838] #481 Add the DNX runtime to the path when lanching test processes. --- .../Deployers/ApplicationDeployer.cs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 477348f7af..df1d0bcbe3 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -2,8 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Diagnostics; -using System.Linq; using System.IO; using System.Text; using System.Text.RegularExpressions; @@ -137,6 +137,10 @@ namespace Microsoft.AspNet.Server.Testing Logger.LogInformation($"Chosen runtime path is {ChosenRuntimePath}"); + // Work around win7 search path issues. + var newPath = ChosenRuntimePath + Path.PathSeparator + Environment.GetEnvironmentVariable("PATH"); + DeploymentParameters.EnvironmentVariables.Add(new KeyValuePair("PATH", newPath)); + return ChosenRuntimeName; } From d01c8bb1cf1433faf42f3aec61fb7cb5758e376f Mon Sep 17 00:00:00 2001 From: Chris R Date: Sat, 21 Nov 2015 21:56:34 -0800 Subject: [PATCH 0906/1838] #318 Move IStartupFilter to Hosting.Abstractions. --- .../IStartupFilter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/{Microsoft.AspNet.Hosting/Startup => Microsoft.AspNet.Hosting.Abstractions}/IStartupFilter.cs (89%) diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IStartupFilter.cs similarity index 89% rename from src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IStartupFilter.cs index 79bf34401e..f89fba525c 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/IStartupFilter.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IStartupFilter.cs @@ -4,7 +4,7 @@ using System; using Microsoft.AspNet.Builder; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNet.Hosting { public interface IStartupFilter { From 82ed1a4eeede502b76c59e2f6a1e999332b99db7 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Mon, 23 Nov 2015 14:20:16 -0800 Subject: [PATCH 0907/1838] Remove single moq usage --- test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs | 8 ++++++-- test/Microsoft.AspNet.Hosting.Tests/project.json | 4 ++-- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 13921ba022..18640d122d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -22,7 +22,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.OptionsModel; using Microsoft.Extensions.Primitives; -using Moq; using Xunit; namespace Microsoft.AspNet.Hosting @@ -382,7 +381,7 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var requestIdentifierFeature = new Mock().Object; + var requestIdentifierFeature = new StubHttpRequestIdentifierFeature(); _featuresSupportedByThisHost[typeof(IHttpRequestIdentifierFeature)] = requestIdentifierFeature; var hostingEngine = CreateHostingEngine(requestDelegate); @@ -666,5 +665,10 @@ namespace Microsoft.AspNet.Hosting IEnumerator IEnumerable.GetEnumerator() => null; } + + private class StubHttpRequestIdentifierFeature : IHttpRequestIdentifierFeature + { + public string TraceIdentifier { get; set; } + } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index f00e2281e0..07b3452630 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -9,11 +9,11 @@ "Microsoft.AspNet.Testing": "1.0.0-*", "Microsoft.Extensions.OptionsModel": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", - "Moq": "4.2.1312.1622", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, "frameworks": { - "dnx451": {} + "dnx451": { }, + "dnxcore50": { } }, "commands": { "test": "xunit.runner.aspnet" From f600604140e048df7671fa6e196791492ecacbe1 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Mon, 30 Nov 2015 10:49:59 -0800 Subject: [PATCH 0908/1838] Add tests for map path without wwwroot, and typos --- .../HostingEnvironmentExtensions.cs | 2 +- .../HostingEnvironmentExtensionsTests.cs | 11 +++++++++++ .../testroot/wwwroot/README | 2 +- 3 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs index d42b40e644..05cf2c9ceb 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -93,7 +93,7 @@ namespace Microsoft.AspNet.Hosting } if (string.IsNullOrEmpty(hostingEnvironment.WebRootPath)) { - throw new InvalidOperationException("Can not map path because webroot path is not set"); + throw new InvalidOperationException("Cannot map path because webroot path is not set"); } if (virtualPath == null) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs index 44ab8996e2..727130ded8 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.IO; using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Hosting; @@ -67,5 +68,15 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.Equal("NewName", env.EnvironmentName); } + [Fact] + public void MapPathThrowsWithNoWwwroot() + { + var env = new HostingEnvironment(); + + env.Initialize(".", new WebHostOptions(), null); + + Assert.Throws(() => env.MapPath("file.txt")); + } + } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README b/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README index 4b906ff4a8..d3415c9f70 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README +++ b/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README @@ -1 +1 @@ -This file is here to keep directories needed by tests. Do no remove it. \ No newline at end of file +This file is here to keep directories needed by tests. Do not remove it. \ No newline at end of file From 8c256a0d8718a1adccc2e6af283a232b4b6bcfc5 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 2 Nov 2015 13:55:44 -0800 Subject: [PATCH 0909/1838] New IServer design with IHttpApplication added #395 --- .../IHttpApplication.cs | 35 +++++++ .../IServer.cs | 7 +- .../Internal/HostingApplication.cs | 91 +++++++++++++++++++ .../Internal/HostingEngine.cs | 39 +------- .../Internal/HostingLoggerExtensions.cs | 63 +------------ .../Internal/LoggerEventIds.cs | 9 +- .../WebHostBuilder.cs | 1 - .../ClientHandler.cs | 69 +++++++------- src/Microsoft.AspNet.TestHost/TestServer.cs | 56 ++++++++---- .../WebSocketClient.cs | 63 +++++++------ .../HostingEngineTests.cs | 24 ++--- .../WebHostBuilderTests.cs | 18 +++- .../ClientHandlerTests.cs | 78 +++++++++++----- .../TestServerTests.cs | 9 +- 14 files changed, 332 insertions(+), 230 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting.Server.Abstractions/IHttpApplication.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IHttpApplication.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IHttpApplication.cs new file mode 100644 index 0000000000..07cbe53f82 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IHttpApplication.cs @@ -0,0 +1,35 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading.Tasks; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Hosting.Server +{ + /// + /// Represents an HttpApplication. + /// + public interface IHttpApplication + { + /// + /// Create a TContext given a collection of HTTP features. + /// + /// A collection of HTTP features to be used for creating the TContext. + /// The created TContext. + TContext CreateContext(IFeatureCollection contextFeatures); + + /// + /// Asynchronously processes an TContext. + /// + /// The TContext that the operation will process. + Task ProcessRequestAsync(TContext context); + + /// + /// Dispose a given TContext. + /// + /// The TContext to be disposed. + /// The Exception thrown when processing did not complete successfully, otherwise null. + void DisposeContext(TContext context, Exception exception); + } +} diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs index c6909990d0..cc1a88d519 100644 --- a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs +++ b/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Hosting.Server @@ -18,9 +17,9 @@ namespace Microsoft.AspNet.Hosting.Server IFeatureCollection Features { get; } /// - /// Start the server with the given function that processes an HTTP request. + /// Start the server with an HttpApplication. /// - /// A function that processes an HTTP request. - void Start(RequestDelegate requestDelegate); + /// An instance of . + void Start(IHttpApplication application); } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs new file mode 100644 index 0000000000..c5b74dca72 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs @@ -0,0 +1,91 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Threading.Tasks; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.Extensions.Logging; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class HostingApplication : IHttpApplication + { + private readonly RequestDelegate _application; + private readonly ILogger _logger; + private readonly DiagnosticSource _diagnosticSource; + private readonly IHttpContextFactory _httpContextFactory; + + public HostingApplication( + RequestDelegate application, + ILogger logger, + DiagnosticSource diagnosticSource, + IHttpContextFactory httpContextFactory) + { + _application = application; + _logger = logger; + _diagnosticSource = diagnosticSource; + _httpContextFactory = httpContextFactory; + } + + public Context CreateContext(IFeatureCollection contextFeatures) + { + var httpContext = _httpContextFactory.Create(contextFeatures); + var startTick = Environment.TickCount; + + var scope = _logger.RequestScope(httpContext); + _logger.RequestStarting(httpContext); + if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) + { + _diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext, tickCount = startTick }); + } + + return new Context + { + HttpContext = httpContext, + Scope = scope, + StartTick = startTick, + }; + } + + public void DisposeContext(Context context, Exception exception) + { + var httpContext = context.HttpContext; + var currentTick = Environment.TickCount; + _logger.RequestFinished(httpContext, context.StartTick, currentTick); + + if (exception == null) + { + if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) + { + _diagnosticSource.Write("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext, tickCount = currentTick }); + } + } + else + { + if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) + { + _diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, tickCount = currentTick, exception = exception }); + } + } + + context.Scope.Dispose(); + + _httpContextFactory.Dispose(httpContext); + } + + public async Task ProcessRequestAsync(Context context) + { + await _application(context.HttpContext); + } + + public struct Context + { + public HttpContext HttpContext { get; set; } + public IDisposable Scope { get; set; } + public int StartTick { get; set; } + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 4a796b6e6f..2d232995ee 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -6,7 +6,6 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; -using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; @@ -90,45 +89,11 @@ namespace Microsoft.AspNet.Hosting.Internal var logger = _applicationServices.GetRequiredService>(); var diagnosticSource = _applicationServices.GetRequiredService(); + var httpContextFactory = _applicationServices.GetRequiredService(); logger.Starting(); - Server.Start( - async httpContext => - { - if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) - { - diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext }); - } - - using (logger.RequestScope(httpContext)) - { - int startTime = 0; - try - { - logger.RequestStarting(httpContext); - - startTime = Environment.TickCount; - await application(httpContext); - - logger.RequestFinished(httpContext, startTime); - } - catch (Exception ex) - { - logger.RequestFailed(httpContext, startTime); - - if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) - { - diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, exception = ex }); - } - throw; - } - } - if (diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) - { - diagnosticSource.Write("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext }); - } - }); + Server.Start(new HostingApplication(application, logger, diagnosticSource, httpContextFactory)); _applicationLifetime.NotifyStarted(); logger.Started(); diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs index 67f9f114ff..3730736d0b 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -30,11 +30,14 @@ namespace Microsoft.AspNet.Hosting.Internal } } - public static void RequestFinished(this ILogger logger, HttpContext httpContext, int startTimeInTicks) + public static void RequestFinished(this ILogger logger, HttpContext httpContext, int startTimeInTicks, int currentTick) { if (logger.IsEnabled(LogLevel.Information)) { - var elapsed = new TimeSpan(TicksPerMillisecond * (Environment.TickCount - startTimeInTicks)); + var elapsed = new TimeSpan(TicksPerMillisecond * (currentTick < startTimeInTicks ? + (int.MaxValue - startTimeInTicks) + (currentTick - int.MinValue) : + currentTick - startTimeInTicks)); + logger.Log( logLevel: LogLevel.Information, eventId: LoggerEventIds.RequestFinished, @@ -44,20 +47,6 @@ namespace Microsoft.AspNet.Hosting.Internal } } - public static void RequestFailed(this ILogger logger, HttpContext httpContext, int startTimeInTicks) - { - if (logger.IsEnabled(LogLevel.Information)) - { - var elapsed = new TimeSpan(TicksPerMillisecond * (Environment.TickCount - startTimeInTicks)); - logger.Log( - logLevel: LogLevel.Information, - eventId: LoggerEventIds.RequestFailed, - state: new HostingRequestFailed(httpContext, elapsed), - exception: null, - formatter: HostingRequestFailed.Callback); - } - } - public static void ApplicationError(this ILogger logger, Exception exception) { logger.LogError( @@ -221,48 +210,6 @@ namespace Microsoft.AspNet.Hosting.Internal return _cachedGetValues; } } - - private class HostingRequestFailed - { - internal static readonly Func Callback = (state, exception) => ((HostingRequestFailed)state).ToString(); - - private readonly HttpContext _httpContext; - private readonly TimeSpan _elapsed; - - private IEnumerable> _cachedGetValues; - private string _cachedToString; - - public HostingRequestFailed(HttpContext httpContext, TimeSpan elapsed) - { - _httpContext = httpContext; - _elapsed = elapsed; - } - - public override string ToString() - { - if (_cachedToString == null) - { - _cachedToString = $"Request finished in {_elapsed.TotalMilliseconds}ms 500"; - } - - return _cachedToString; - } - - public IEnumerable> GetValues() - { - if (_cachedGetValues == null) - { - _cachedGetValues = new[] - { - new KeyValuePair("ElapsedMilliseconds", _elapsed.TotalMilliseconds), - new KeyValuePair("StatusCode", 500), - new KeyValuePair("ContentType", null), - }; - } - - return _cachedGetValues; - } - } } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs b/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs index 9bc4a4affe..0b23c81e2a 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs @@ -7,10 +7,9 @@ namespace Microsoft.AspNet.Hosting.Internal { public const int RequestStarting = 1; public const int RequestFinished = 2; - public const int RequestFailed = 3; - public const int Starting = 4; - public const int Started = 5; - public const int Shutdown = 6; - public const int ApplicationStartupException = 7; + public const int Starting = 3; + public const int Started = 4; + public const int Shutdown = 5; + public const int ApplicationStartupException = 6; } } diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index bc7e0c7883..309d9eff71 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -10,7 +10,6 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; -using Microsoft.Extensions.CompilationAbstractions; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 78e3463bc6..200dc5db9a 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -11,9 +11,10 @@ using System.Net; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Context = Microsoft.AspNet.Hosting.Internal.HostingApplication.Context; namespace Microsoft.AspNet.TestHost { @@ -23,27 +24,21 @@ namespace Microsoft.AspNet.TestHost /// public class ClientHandler : HttpMessageHandler { - private readonly RequestDelegate _next; + private readonly IHttpApplication _application; private readonly PathString _pathBase; - private readonly IHttpContextFactory _factory; /// /// Create a new handler. /// /// The pipeline entry point. - public ClientHandler(RequestDelegate next, PathString pathBase, IHttpContextFactory httpContextFactory) + public ClientHandler(PathString pathBase, IHttpApplication application) { - if (next == null) + if (application == null) { - throw new ArgumentNullException(nameof(next)); + throw new ArgumentNullException(nameof(application)); } - if (httpContextFactory == null) - { - throw new ArgumentNullException(nameof(httpContextFactory)); - } - - _next = next; - _factory = httpContextFactory; + + _application = application; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. if (pathBase.HasValue && pathBase.Value.EndsWith("/")) @@ -69,7 +64,7 @@ namespace Microsoft.AspNet.TestHost throw new ArgumentNullException(nameof(request)); } - var state = new RequestState(request, _pathBase, _factory); + var state = new RequestState(request, _pathBase, _application); var requestContent = request.Content ?? new StreamContent(Stream.Null); var body = await requestContent.ReadAsStreamAsync(); if (body.CanSeek) @@ -77,7 +72,7 @@ namespace Microsoft.AspNet.TestHost // This body may have been consumed before, rewind it. body.Seek(0, SeekOrigin.Begin); } - state.HttpContext.Request.Body = body; + state.Context.HttpContext.Request.Body = body; var registration = cancellationToken.Register(state.AbortRequest); // Async offload, don't let the test code block the caller. @@ -85,16 +80,17 @@ namespace Microsoft.AspNet.TestHost { try { - await _next(state.HttpContext); + await _application.ProcessRequestAsync(state.Context); state.CompleteResponse(); + state.ServerCleanup(exception: null); } catch (Exception ex) { state.Abort(ex); + state.ServerCleanup(ex); } finally { - state.ServerCleanup(); registration.Dispose(); } }); @@ -105,20 +101,20 @@ namespace Microsoft.AspNet.TestHost private class RequestState { private readonly HttpRequestMessage _request; + private readonly IHttpApplication _application; private TaskCompletionSource _responseTcs; private ResponseStream _responseStream; private ResponseFeature _responseFeature; private CancellationTokenSource _requestAbortedSource; - private IHttpContextFactory _factory; private bool _pipelineFinished; - internal RequestState(HttpRequestMessage request, PathString pathBase, IHttpContextFactory factory) + internal RequestState(HttpRequestMessage request, PathString pathBase, IHttpApplication application) { _request = request; + _application = application; _responseTcs = new TaskCompletionSource(); _requestAbortedSource = new CancellationTokenSource(); _pipelineFinished = false; - _factory = factory; if (request.RequestUri.IsDefaultPort) { @@ -129,12 +125,13 @@ namespace Microsoft.AspNet.TestHost request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); } - HttpContext = _factory.Create(new FeatureCollection()); - - HttpContext.Features.Set(new RequestFeature()); + Context = application.CreateContext(new FeatureCollection()); + var httpContext = Context.HttpContext; + + httpContext.Features.Set(new RequestFeature()); _responseFeature = new ResponseFeature(); - HttpContext.Features.Set(_responseFeature); - var serverRequest = HttpContext.Request; + httpContext.Features.Set(_responseFeature); + var serverRequest = httpContext.Request; serverRequest.Protocol = "HTTP/" + request.Version.ToString(2); serverRequest.Scheme = request.RequestUri.Scheme; serverRequest.Method = request.Method.ToString(); @@ -168,12 +165,12 @@ namespace Microsoft.AspNet.TestHost } _responseStream = new ResponseStream(ReturnResponseMessage, AbortRequest); - HttpContext.Response.Body = _responseStream; - HttpContext.Response.StatusCode = 200; - HttpContext.RequestAborted = _requestAbortedSource.Token; + httpContext.Response.Body = _responseStream; + httpContext.Response.StatusCode = 200; + httpContext.RequestAborted = _requestAbortedSource.Token; } - public HttpContext HttpContext { get; private set; } + public Context Context { get; private set; } public Task ResponseTask { @@ -212,16 +209,17 @@ namespace Microsoft.AspNet.TestHost private HttpResponseMessage GenerateResponse() { _responseFeature.FireOnSendingHeaders(); + var httpContext = Context.HttpContext; var response = new HttpResponseMessage(); - response.StatusCode = (HttpStatusCode)HttpContext.Response.StatusCode; - response.ReasonPhrase = HttpContext.Features.Get().ReasonPhrase; + response.StatusCode = (HttpStatusCode)httpContext.Response.StatusCode; + response.ReasonPhrase = httpContext.Features.Get().ReasonPhrase; response.RequestMessage = _request; // response.Version = owinResponse.Protocol; response.Content = new StreamContent(_responseStream); - foreach (var header in HttpContext.Response.Headers) + foreach (var header in httpContext.Response.Headers) { if (!response.Headers.TryAddWithoutValidation(header.Key, (IEnumerable)header.Value)) { @@ -239,12 +237,9 @@ namespace Microsoft.AspNet.TestHost _responseTcs.TrySetException(exception); } - internal void ServerCleanup() + internal void ServerCleanup(Exception exception) { - if (HttpContext != null) - { - _factory.Dispose(HttpContext); - } + _application.DisposeContext(Context, exception); } } } diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index cd354c3eba..efeefac128 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -11,6 +11,7 @@ using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Context = Microsoft.AspNet.Hosting.Internal.HostingApplication.Context; namespace Microsoft.AspNet.TestHost { @@ -18,15 +19,13 @@ namespace Microsoft.AspNet.TestHost { private const string DefaultEnvironmentName = "Development"; private const string ServerName = nameof(TestServer); - private RequestDelegate _appDelegate; private IDisposable _appInstance; private bool _disposed = false; - private IHttpContextFactory _httpContextFactory; + private IHttpApplication _application; public TestServer(WebHostBuilder builder) { var hostingEngine = builder.UseServer(this).Build(); - _httpContextFactory = hostingEngine.ApplicationServices.GetService(); _appInstance = hostingEngine.Start(); } @@ -99,7 +98,7 @@ namespace Microsoft.AspNet.TestHost public HttpMessageHandler CreateHandler() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); - return new ClientHandler(Invoke, pathBase, _httpContextFactory); + return new ClientHandler(pathBase, _application); } public HttpClient CreateClient() @@ -110,7 +109,7 @@ namespace Microsoft.AspNet.TestHost public WebSocketClient CreateWebSocketClient() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); - return new WebSocketClient(Invoke, pathBase, _httpContextFactory); + return new WebSocketClient(pathBase, _application); } /// @@ -123,24 +122,49 @@ namespace Microsoft.AspNet.TestHost return new RequestBuilder(this, path); } - public Task Invoke(HttpContext context) - { - if (_disposed) - { - throw new ObjectDisposedException(GetType().FullName); - } - return _appDelegate(context); - } - public void Dispose() { _disposed = true; _appInstance.Dispose(); } - void IServer.Start(RequestDelegate requestDelegate) + void IServer.Start(IHttpApplication application) { - _appDelegate = requestDelegate; + _application = new ApplicationWrapper((IHttpApplication)application, () => + { + if (_disposed) + { + throw new ObjectDisposedException(GetType().FullName); + } + }); + } + + private class ApplicationWrapper : IHttpApplication + { + IHttpApplication _application; + Action _preProcessRequestAsync; + + public ApplicationWrapper(IHttpApplication application, Action preProcessRequestAsync) + { + _application = application; + _preProcessRequestAsync = preProcessRequestAsync; + } + + public TContext CreateContext(IFeatureCollection contextFeatures) + { + return _application.CreateContext(contextFeatures); + } + + public void DisposeContext(TContext context, Exception exception) + { + _application.DisposeContext(context, exception); + } + + public Task ProcessRequestAsync(TContext context) + { + _preProcessRequestAsync(); + return _application.ProcessRequestAsync(context); + } } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs index 320f43afe8..8c9da7e11b 100644 --- a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs +++ b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs @@ -8,31 +8,26 @@ using System.Net.WebSockets; using System.Security.Cryptography; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Context = Microsoft.AspNet.Hosting.Internal.HostingApplication.Context; namespace Microsoft.AspNet.TestHost { public class WebSocketClient { - private readonly RequestDelegate _next; + private readonly IHttpApplication _application; private readonly PathString _pathBase; - private readonly IHttpContextFactory _httpContextFactory; - internal WebSocketClient(RequestDelegate next, PathString pathBase, IHttpContextFactory httpContextFactory) + internal WebSocketClient(PathString pathBase, IHttpApplication application) { - if (next == null) + if (application == null) { - throw new ArgumentNullException(nameof(next)); + throw new ArgumentNullException(nameof(application)); } - if (httpContextFactory == null) - { - throw new ArgumentNullException(nameof(httpContextFactory)); - } - - _next = next; - _httpContextFactory = httpContextFactory; + + _application = application; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. if (pathBase.HasValue && pathBase.Value.EndsWith("/")) @@ -58,11 +53,11 @@ namespace Microsoft.AspNet.TestHost public async Task ConnectAsync(Uri uri, CancellationToken cancellationToken) { - var state = new RequestState(uri, _pathBase, cancellationToken, _httpContextFactory); + var state = new RequestState(uri, _pathBase, cancellationToken, _application); if (ConfigureRequest != null) { - ConfigureRequest(state.HttpContext.Request); + ConfigureRequest(state.Context.HttpContext.Request); } // Async offload, don't let the test code block the caller. @@ -70,12 +65,14 @@ namespace Microsoft.AspNet.TestHost { try { - await _next(state.HttpContext); + await _application.ProcessRequestAsync(state.Context); state.PipelineComplete(); + state.ServerCleanup(exception: null); } catch (Exception ex) { state.PipelineFailed(ex); + state.ServerCleanup(ex); } finally { @@ -88,24 +85,25 @@ namespace Microsoft.AspNet.TestHost private class RequestState : IDisposable, IHttpWebSocketFeature { + private readonly IHttpApplication _application; private TaskCompletionSource _clientWebSocketTcs; private WebSocket _serverWebSocket; - private IHttpContextFactory _factory; - public HttpContext HttpContext { get; private set; } + public Context Context { get; private set; } public Task WebSocketTask { get { return _clientWebSocketTcs.Task; } } - public RequestState(Uri uri, PathString pathBase, CancellationToken cancellationToken, IHttpContextFactory factory) + public RequestState(Uri uri, PathString pathBase, CancellationToken cancellationToken, IHttpApplication application) { - _factory = factory; _clientWebSocketTcs = new TaskCompletionSource(); + _application = application; // HttpContext - HttpContext = _factory.Create(new FeatureCollection()); + Context = _application.CreateContext(new FeatureCollection()); + var httpContext = Context.HttpContext; // Request - HttpContext.Features.Set(new RequestFeature()); - var request = HttpContext.Request; + httpContext.Features.Set(new RequestFeature()); + var request = httpContext.Request; request.Protocol = "HTTP/1.1"; var scheme = uri.Scheme; scheme = (scheme == "ws") ? "http" : scheme; @@ -132,18 +130,18 @@ namespace Microsoft.AspNet.TestHost request.Body = Stream.Null; // Response - HttpContext.Features.Set(new ResponseFeature()); - var response = HttpContext.Response; + httpContext.Features.Set(new ResponseFeature()); + var response = httpContext.Response; response.Body = Stream.Null; response.StatusCode = 200; // WebSocket - HttpContext.Features.Set(this); + httpContext.Features.Set(this); } public void PipelineComplete() { - PipelineFailed(new InvalidOperationException("Incomplete handshake, status code: " + HttpContext.Response.StatusCode)); + PipelineFailed(new InvalidOperationException("Incomplete handshake, status code: " + Context.HttpContext.Response.StatusCode)); } public void PipelineFailed(Exception ex) @@ -153,16 +151,17 @@ namespace Microsoft.AspNet.TestHost public void Dispose() { - if (HttpContext != null) - { - _factory.Dispose(HttpContext); - } if (_serverWebSocket != null) { _serverWebSocket.Dispose(); } } + internal void ServerCleanup(Exception exception) + { + _application.DisposeContext(Context, exception); + } + private string CreateRequestKey() { byte[] data = new byte[16]; @@ -181,7 +180,7 @@ namespace Microsoft.AspNet.TestHost Task IHttpWebSocketFeature.AcceptAsync(WebSocketAcceptContext context) { - HttpContext.Response.StatusCode = 101; // Switching Protocols + Context.HttpContext.Response.StatusCode = 101; // Switching Protocols var websockets = TestWebSocket.CreatePair(context.SubProtocol); _clientWebSocketTcs.SetResult(websockets.Item1); diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs index 18640d122d..da2dd15336 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs @@ -14,7 +14,6 @@ using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Server.Features; using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Configuration; @@ -477,11 +476,21 @@ namespace Microsoft.AspNet.Hosting return new WebHostBuilder(config ?? new ConfigurationBuilder().Build()); } - public void Start(RequestDelegate requestDelegate) + public void Start(IHttpApplication application) { - var startInstance = new StartInstance(requestDelegate); + var startInstance = new StartInstance(); _startInstances.Add(startInstance); - requestDelegate(new DefaultHttpContext(Features)); + var context = application.CreateContext(Features); + try + { + application.ProcessRequestAsync(context); + } + catch (Exception ex) + { + application.DisposeContext(context, ex); + throw; + } + application.DisposeContext(context, null); } public void Dispose() @@ -504,13 +513,6 @@ namespace Microsoft.AspNet.Hosting private class StartInstance : IDisposable { - private readonly RequestDelegate _application; - - public StartInstance(RequestDelegate application) - { - _application = application; - } - public int DisposeCalls { get; set; } public void Dispose() diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index 7b3bdf7f82..cd7c1ee3b4 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; @@ -174,9 +175,22 @@ namespace Microsoft.AspNet.Hosting } - public void Start(RequestDelegate requestDelegate) + public void Start(IHttpApplication application) { - RequestDelegate = requestDelegate; + RequestDelegate = async ctx => + { + var httpContext = application.CreateContext(ctx.Features); + try + { + await application.ProcessRequestAsync(httpContext); + } + catch (Exception ex) + { + application.DisposeContext(httpContext, ex); + throw; + } + application.DisposeContext(httpContext, null); + }; } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index adacdd9d8e..3108810ff9 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -7,22 +7,22 @@ using System.Linq; using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Testing.xunit; using Xunit; +using Context = Microsoft.AspNet.Hosting.Internal.HostingApplication.Context; namespace Microsoft.AspNet.TestHost { public class ClientHandlerTests { - private IHttpContextFactory _httpContextFactory = new HttpContextFactory(new HttpContextAccessor()); - [Fact] public Task ExpectedKeysAreAvailable() { - var handler = new ClientHandler(context => + var handler = new ClientHandler(new PathString("/A/Path/"), new DummyApplication(context => { // TODO: Assert.True(context.RequestAborted.CanBeCanceled); Assert.Equal("HTTP/1.1", context.Request.Protocol); @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("example.com", context.Request.Host.Value); return Task.FromResult(0); - }, new PathString("/A/Path/"), _httpContextFactory); + })); var httpClient = new HttpClient(handler); return httpClient.GetAsync("https://example.com/A/Path/and/file.txt?and=query"); } @@ -48,13 +48,13 @@ namespace Microsoft.AspNet.TestHost [Fact] public Task SingleSlashNotMovedToPathBase() { - var handler = new ClientHandler(context => + var handler = new ClientHandler(new PathString(""), new DummyApplication(context => { Assert.Equal("", context.Request.PathBase.Value); Assert.Equal("/", context.Request.Path.Value); return Task.FromResult(0); - }, new PathString(""), _httpContextFactory); + })); var httpClient = new HttpClient(handler); return httpClient.GetAsync("https://example.com/"); } @@ -63,14 +63,14 @@ namespace Microsoft.AspNet.TestHost public async Task ResubmitRequestWorks() { int requestCount = 1; - var handler = new ClientHandler(context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { int read = context.Request.Body.Read(new byte[100], 0, 100); Assert.Equal(11, read); context.Response.Headers["TestHeader"] = "TestValue:" + requestCount++; return Task.FromResult(0); - }, PathString.Empty, _httpContextFactory); + })); HttpMessageInvoker invoker = new HttpMessageInvoker(handler); HttpRequestMessage message = new HttpRequestMessage(HttpMethod.Post, "https://example.com/"); @@ -86,11 +86,11 @@ namespace Microsoft.AspNet.TestHost [Fact] public async Task MiddlewareOnlySetsHeaders() { - var handler = new ClientHandler(context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { context.Response.Headers["TestHeader"] = "TestValue"; return Task.FromResult(0); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/"); Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); @@ -100,11 +100,11 @@ namespace Microsoft.AspNet.TestHost public async Task BlockingMiddlewareShouldNotBlockClient() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { block.WaitOne(); return Task.FromResult(0); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); Task task = httpClient.GetAsync("https://example.com/"); Assert.False(task.IsCompleted); @@ -117,13 +117,13 @@ namespace Microsoft.AspNet.TestHost public async Task HeadersAvailableBeforeBodyFinished() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(async context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context => { context.Response.Headers["TestHeader"] = "TestValue"; await context.Response.WriteAsync("BodyStarted,"); block.WaitOne(); await context.Response.WriteAsync("BodyFinished"); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -136,13 +136,13 @@ namespace Microsoft.AspNet.TestHost public async Task FlushSendsHeaders() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(async context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context => { context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); block.WaitOne(); await context.Response.WriteAsync("BodyFinished"); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -155,13 +155,13 @@ namespace Microsoft.AspNet.TestHost public async Task ClientDisposalCloses() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); block.WaitOne(); return Task.FromResult(0); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -180,13 +180,13 @@ namespace Microsoft.AspNet.TestHost public async Task ClientCancellationAborts() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { context.Response.Headers["TestHeader"] = "TestValue"; context.Response.Body.Flush(); block.WaitOne(); return Task.FromResult(0); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -205,10 +205,10 @@ namespace Microsoft.AspNet.TestHost [Fact] public Task ExceptionBeforeFirstWriteIsReported() { - var handler = new ClientHandler(context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => { throw new InvalidOperationException("Test Exception"); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); return Assert.ThrowsAsync(() => httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead)); @@ -219,13 +219,13 @@ namespace Microsoft.AspNet.TestHost public async Task ExceptionAfterFirstWriteIsReported() { ManualResetEvent block = new ManualResetEvent(false); - var handler = new ClientHandler(async context => + var handler = new ClientHandler(PathString.Empty, new DummyApplication(async context => { context.Response.Headers["TestHeader"] = "TestValue"; await context.Response.WriteAsync("BodyStarted"); block.WaitOne(); throw new InvalidOperationException("Test Exception"); - }, PathString.Empty, _httpContextFactory); + })); var httpClient = new HttpClient(handler); HttpResponseMessage response = await httpClient.GetAsync("https://example.com/", HttpCompletionOption.ResponseHeadersRead); @@ -234,5 +234,33 @@ namespace Microsoft.AspNet.TestHost var ex = await Assert.ThrowsAsync(() => response.Content.ReadAsStringAsync()); Assert.IsType(ex.GetBaseException()); } + + private class DummyApplication : IHttpApplication + { + RequestDelegate _application; + + public DummyApplication(RequestDelegate application) + { + _application = application; + } + + public Context CreateContext(IFeatureCollection contextFeatures) + { + return new Context() + { + HttpContext = new DefaultHttpContext(contextFeatures) + }; + } + + public void DisposeContext(Context context, Exception exception) + { + + } + + public Task ProcessRequestAsync(Context context) + { + return _application(context.HttpContext); + } + } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 9ca048c9e0..ad55d2ee69 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -3,13 +3,12 @@ using System; using System.Diagnostics; -using System.IO; using System.Net; using System.Net.Http; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; @@ -393,6 +392,9 @@ namespace Microsoft.AspNet.TestHost diagnosticListener.SubscribeWithAdapter(listener); var result = await server.CreateClient().GetStringAsync("/path"); + // This ensures that all diagnostics are completely written to the diagnostic listener + Thread.Sleep(1000); + Assert.Equal("Hello World", result); Assert.NotNull(listener.BeginRequest?.HttpContext); Assert.NotNull(listener.EndRequest?.HttpContext); @@ -414,6 +416,9 @@ namespace Microsoft.AspNet.TestHost var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); await Assert.ThrowsAsync(() => server.CreateClient().GetAsync("/path")); + + // This ensures that all diagnostics are completely written to the diagnostic listener + Thread.Sleep(1000); Assert.NotNull(listener.BeginRequest?.HttpContext); Assert.Null(listener.EndRequest?.HttpContext); From a0a1c38e4425df163f1f92b64f4e186d40b7dc7b Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 1 Dec 2015 15:40:47 -0800 Subject: [PATCH 0910/1838] Moving Microsoft.AspNet.Html.Abstractions to a HtmlAbstractions repo Fixes #418 --- HttpAbstractions.sln | 30 -- NuGetPackageVerifier.json | 1 - .../HtmlContentBuilder.cs | 138 ------ .../HtmlContentBuilderExtensions.cs | 324 ------------- .../HtmlEncodedString.cs | 49 -- .../HtmlTextWriter.cs | 49 -- .../IHtmlContent.cs | 22 - .../IHtmlContentBuilder.cs | 40 -- .../Microsoft.AspNet.Html.Abstractions.xproj | 19 - .../Properties/AssemblyInfo.cs | 10 - .../project.json | 29 -- .../HtmlContentBuilderExtensionsTest.cs | 436 ------------------ .../HtmlContentBuilderTest.cs | 145 ------ ...rosoft.AspNet.Html.Abstractions.Test.xproj | 21 - .../project.json | 19 - 15 files changed, 1332 deletions(-) delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.AspNet.Html.Abstractions/project.json delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj delete mode 100644 test/Microsoft.AspNet.Html.Abstractions.Test/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index b2884f66ab..9e07d734d8 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -38,14 +38,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEnc EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions", "src\Microsoft.AspNet.Html.Abstractions\Microsoft.AspNet.Html.Abstractions.xproj", "{68A28E4A-3ADE-4187-9625-4FF185887CB3}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Html.Abstractions.Test", "test\Microsoft.AspNet.Html.Abstractions.Test\Microsoft.AspNet.Html.Abstractions.Test.xproj", "{2D187B88-94BD-4A39-AC97-F8F8B9363301}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -224,18 +220,6 @@ Global {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.ActiveCfg = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Debug|x86.Build.0 = Debug|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Any CPU.Build.0 = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.ActiveCfg = Release|Any CPU - {68A28E4A-3ADE-4187-9625-4FF185887CB3}.Release|x86.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -248,18 +232,6 @@ Global {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|Mixed Platforms.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.ActiveCfg = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Release|x86.Build.0 = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Any CPU.Build.0 = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.ActiveCfg = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Debug|x86.Build.0 = Debug|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.ActiveCfg = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Any CPU.Build.0 = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.ActiveCfg = Release|Any CPU - {2D187B88-94BD-4A39-AC97-F8F8B9363301}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -281,8 +253,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {68A28E4A-3ADE-4187-9625-4FF185887CB3} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} - {2D187B88-94BD-4A39-AC97-F8F8B9363301} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} EndGlobalSection EndGlobal diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index f2111a1802..406f44c6a3 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -9,7 +9,6 @@ "StrictSemanticVersionValidationRule" ], "packages": { - "Microsoft.AspNet.Html.Abstractions": { }, "Microsoft.AspNet.Http": { }, "Microsoft.AspNet.Http.Abstractions": { }, "Microsoft.AspNet.Http.Extensions": { }, diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs deleted file mode 100644 index 198cd0fb38..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilder.cs +++ /dev/null @@ -1,138 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// An implementation using an in memory list. - /// - public class HtmlContentBuilder : IHtmlContentBuilder - { - /// - /// Creates a new . - /// - public HtmlContentBuilder() - : this(new List()) - { - } - - /// - /// Creates a new with the given initial capacity. - /// - /// The initial capacity of the backing store. - public HtmlContentBuilder(int capacity) - : this(new List(capacity)) - { - } - - /// - /// Creates a new with the given list of entries. - /// - /// - /// The list of entries. The will use this list without making a copy. - /// - public HtmlContentBuilder(IList entries) - { - if (entries == null) - { - throw new ArgumentNullException(nameof(entries)); - } - - Entries = entries; - } - - // This is not List because that would lead to wrapping all strings to IHtmlContent - // which is not space performant. - // - // In general unencoded strings are added here. We're optimizing for that case, and allocating - // a wrapper when encoded strings are used. - // - // internal for testing. - internal IList Entries { get; } - - /// - public IHtmlContentBuilder Append(string unencoded) - { - if (!string.IsNullOrEmpty(unencoded)) - { - Entries.Add(unencoded); - } - - return this; - } - - /// - public IHtmlContentBuilder Append(IHtmlContent htmlContent) - { - if (htmlContent == null) - { - return this; - } - - Entries.Add(htmlContent); - return this; - } - - /// - public IHtmlContentBuilder AppendHtml(string encoded) - { - if (!string.IsNullOrEmpty(encoded)) - { - Entries.Add(new HtmlEncodedString(encoded)); - } - - return this; - } - - /// - public IHtmlContentBuilder Clear() - { - Entries.Clear(); - return this; - } - - /// - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - - if (encoder == null) - { - throw new ArgumentNullException(nameof(encoder)); - } - - for (var i = 0; i < Entries.Count; i++) - { - var entry = Entries[i]; - - var entryAsString = entry as string; - if (entryAsString != null) - { - encoder.Encode(writer, entryAsString); - } - else - { - // Only string, IHtmlContent values can be added to the buffer. - ((IHtmlContent)entry).WriteTo(writer, encoder); - } - } - } - - private string DebuggerToString() - { - using (var writer = new StringWriter()) - { - WriteTo(writer, HtmlEncoder.Default); - return writer.ToString(); - } - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs deleted file mode 100644 index 63c311c6e0..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlContentBuilderExtensions.cs +++ /dev/null @@ -1,324 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.Globalization; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// Extension methods for . - /// - public static class HtmlContentBuilderExtensions - { - /// - /// Appends the specified to the existing content after replacing each format - /// item with the HTML encoded representation of the corresponding item in the - /// array. - /// - /// The . - /// - /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). - /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. - /// - /// - /// The object array to format. Each element in the array will be formatted and then HTML encoded. - /// - /// A reference to this instance after the append operation has completed. - public static IHtmlContentBuilder AppendFormat( - this IHtmlContentBuilder builder, - string format, - params object[] args) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (format == null) - { - throw new ArgumentNullException(nameof(format)); - } - - if (args == null) - { - throw new ArgumentNullException(nameof(args)); - } - - builder.Append(new HtmlFormatString(format, args)); - return builder; - } - - /// - /// Appends the specified to the existing content with information from the - /// after replacing each format item with the HTML encoded - /// representation of the corresponding item in the array. - /// - /// The . - /// An object that supplies culture-specific formatting information. - /// - /// The composite format (see http://msdn.microsoft.com/en-us/library/txafckwd.aspx). - /// The format string is assumed to be HTML encoded as-provided, and no further encoding will be performed. - /// - /// - /// The object array to format. Each element in the array will be formatted and then HTML encoded. - /// - /// A reference to this instance after the append operation has completed. - public static IHtmlContentBuilder AppendFormat( - this IHtmlContentBuilder builder, - IFormatProvider formatProvider, - string format, - params object[] args) - { - if (builder == null) - { - throw new ArgumentNullException(nameof(builder)); - } - - if (format == null) - { - throw new ArgumentNullException(nameof(format)); - } - - if (args == null) - { - throw new ArgumentNullException(nameof(args)); - } - - builder.Append(new HtmlFormatString(formatProvider, format, args)); - return builder; - } - - /// - /// Appends an . - /// - /// The . - /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder) - { - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Appends an after appending the value. - /// The value is treated as unencoded as-provided, and will be HTML encoded before writing to output. - /// - /// The . - /// The to append. - /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, string unencoded) - { - builder.Append(unencoded); - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Appends an after appending the value. - /// - /// The . - /// The to append. - /// The . - public static IHtmlContentBuilder AppendLine(this IHtmlContentBuilder builder, IHtmlContent content) - { - builder.Append(content); - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Appends an after appending the value. - /// The value is treated as HTML encoded as-provided, and no further encoding will be performed. - /// - /// The . - /// The HTML encoded to append. - /// The . - public static IHtmlContentBuilder AppendHtmlLine(this IHtmlContentBuilder builder, string encoded) - { - builder.AppendHtml(encoded); - builder.Append(HtmlEncodedString.NewLine); - return builder; - } - - /// - /// Sets the content to the value. The value is treated as unencoded as-provided, - /// and will be HTML encoded before writing to output. - /// - /// The . - /// The value that replaces the content. - /// The . - public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, string unencoded) - { - builder.Clear(); - builder.Append(unencoded); - return builder; - } - - /// - /// Sets the content to the value. - /// - /// The . - /// The value that replaces the content. - /// The . - public static IHtmlContentBuilder SetContent(this IHtmlContentBuilder builder, IHtmlContent content) - { - builder.Clear(); - builder.Append(content); - return builder; - } - - /// - /// Sets the content to the value. The value is treated as HTML encoded as-provided, and - /// no further encoding will be performed. - /// - /// The . - /// The HTML encoded that replaces the content. - /// The . - public static IHtmlContentBuilder SetHtmlContent(this IHtmlContentBuilder builder, string encoded) - { - builder.Clear(); - builder.AppendHtml(encoded); - return builder; - } - - [DebuggerDisplay("{DebuggerToString()}")] - private class HtmlFormatString : IHtmlContent - { - private readonly IFormatProvider _formatProvider; - private readonly string _format; - private readonly object[] _args; - - public HtmlFormatString(string format, object[] args) - : this(null, format, args) - { - } - - public HtmlFormatString(IFormatProvider formatProvider, string format, object[] args) - { - Debug.Assert(format != null); - Debug.Assert(args != null); - - _formatProvider = formatProvider ?? CultureInfo.CurrentCulture; - _format = format; - _args = args; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - if (writer == null) - { - throw new ArgumentNullException(nameof(writer)); - } - - if (encoder == null) - { - throw new ArgumentNullException(nameof(encoder)); - } - - var formatProvider = new EncodingFormatProvider(_formatProvider, encoder); - writer.Write(string.Format(formatProvider, _format, _args)); - } - - private string DebuggerToString() - { - using (var writer = new StringWriter()) - { - WriteTo(writer, HtmlEncoder.Default); - return writer.ToString(); - } - } - } - - // This class implements Html encoding via an ICustomFormatter. Passing an instance of this - // class into a string.Format method or anything similar will evaluate arguments implementing - // IHtmlContent without HTML encoding them, and will give other arguments the standard - // composite format string treatment, and then HTML encode the result. - // - // Plenty of examples of ICustomFormatter and the interactions with string.Format here: - // https://msdn.microsoft.com/en-us/library/system.string.format(v=vs.110).aspx#Format6_Example - private class EncodingFormatProvider : IFormatProvider, ICustomFormatter - { - private readonly HtmlEncoder _encoder; - private readonly IFormatProvider _formatProvider; - - public EncodingFormatProvider(IFormatProvider formatProvider, HtmlEncoder encoder) - { - Debug.Assert(formatProvider != null); - Debug.Assert(encoder != null); - - _formatProvider = formatProvider; - _encoder = encoder; - } - - public string Format(string format, object arg, IFormatProvider formatProvider) - { - // This is the case we need to special case. We trust the IHtmlContent instance to do the - // right thing with encoding. - var htmlContent = arg as IHtmlContent; - if (htmlContent != null) - { - using (var writer = new StringWriter()) - { - htmlContent.WriteTo(writer, _encoder); - return writer.ToString(); - } - } - - // If we get here then 'arg' is not an IHtmlContent, and we want to handle it the way a normal - // string.Format would work, but then HTML encode the result. - // - // First check for an ICustomFormatter - if the IFormatProvider is a CultureInfo, then it's likely - // that ICustomFormatter will be null. - var customFormatter = (ICustomFormatter)_formatProvider.GetFormat(typeof(ICustomFormatter)); - if (customFormatter != null) - { - var result = customFormatter.Format(format, arg, _formatProvider); - if (result != null) - { - return _encoder.Encode(result); - } - } - - // Next check if 'arg' is an IFormattable (DateTime is an example). - // - // An IFormattable will likely call back into the IFormatterProvider and ask for more information - // about how to format itself. This is the typical case when IFormatterProvider is a CultureInfo. - var formattable = arg as IFormattable; - if (formattable != null) - { - var result = formattable.ToString(format, _formatProvider); - if (result != null) - { - return _encoder.Encode(result); - } - } - - // If we get here then there's nothing really smart left to try. - if (arg != null) - { - var result = arg.ToString(); - if (result != null) - { - return _encoder.Encode(result); - } - } - - return string.Empty; - } - - public object GetFormat(Type formatType) - { - if (formatType == typeof(ICustomFormatter)) - { - return this; - } - - return null; - } - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs deleted file mode 100644 index ccf417054e..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlEncodedString.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// An impelementation that wraps an HTML encoded . - /// - [DebuggerDisplay("{DebuggerToString()}")] - public class HtmlEncodedString : IHtmlContent - { - /// - /// An instance for . - /// - public static readonly IHtmlContent NewLine = new HtmlEncodedString(Environment.NewLine); - - private readonly string _value; - - /// - /// Creates a new . - /// - /// The HTML encoded value. - public HtmlEncodedString(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - _value = value; - } - - /// - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(_value); - } - - private string DebuggerToString() - { - return _value; - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs b/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs deleted file mode 100644 index 143d97f206..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/HtmlTextWriter.cs +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// A which supports special processing of . - /// - public abstract class HtmlTextWriter : TextWriter - { - /// - /// Writes an value. - /// - /// The value. - public abstract void Write(IHtmlContent value); - - /// - public override void Write(object value) - { - var htmlContent = value as IHtmlContent; - if (htmlContent == null) - { - base.Write(value); - } - else - { - Write(htmlContent); - } - } - - /// - public override void WriteLine(object value) - { - var htmlContent = value as IHtmlContent; - if (htmlContent == null) - { - base.Write(value); - } - else - { - Write(htmlContent); - } - - base.WriteLine(); - } - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs deleted file mode 100644 index d9b7099710..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContent.cs +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// HTML content which can be written to a TextWriter. - /// - public interface IHtmlContent - { - /// - /// Writes the content by encoding it with the specified - /// to the specified . - /// - /// The to which the content is written. - /// The which encodes the content to be written. - void WriteTo(TextWriter writer, HtmlEncoder encoder); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs b/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs deleted file mode 100644 index e55cec3530..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/IHtmlContentBuilder.cs +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Html.Abstractions -{ - /// - /// A builder for HTML content. - /// - public interface IHtmlContentBuilder : IHtmlContent - { - /// - /// Appends an instance. - /// - /// The to append. - /// The . - IHtmlContentBuilder Append(IHtmlContent content); - - /// - /// Appends a value. The value is treated as unencoded as-provided, and will be HTML - /// encoded before writing to output. - /// - /// The to append. - /// The . - IHtmlContentBuilder Append(string unencoded); - - /// - /// Appends an HTML encoded value. The value is treated as HTML encoded as-provided, and - /// no further encoding will be performed. - /// - /// The HTML encoded to append. - /// The . - IHtmlContentBuilder AppendHtml(string encoded); - - /// - /// Clears the content. - /// - /// The . - IHtmlContentBuilder Clear(); - } -} diff --git a/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj b/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj deleted file mode 100644 index 564c800504..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/Microsoft.AspNet.Html.Abstractions.xproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 68a28e4a-3ade-4187-9625-4ff185887cb3 - Microsoft.AspNet.Html.Abstractions - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs deleted file mode 100644 index d310306c25..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; -using System.Runtime.CompilerServices; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Html.Abstractions.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] \ No newline at end of file diff --git a/src/Microsoft.AspNet.Html.Abstractions/project.json b/src/Microsoft.AspNet.Html.Abstractions/project.json deleted file mode 100644 index c654bcde77..0000000000 --- a/src/Microsoft.AspNet.Html.Abstractions/project.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 HTML content interface.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "System.Text.Encodings.Web": "4.0.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.IO": "", - "System.Runtime": "" - } - }, - "dotnet5.4": { - "dependencies": { - "System.Collections": "4.0.11-*", - "System.Resources.ResourceManager": "4.0.1-*" - } - } - } -} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs deleted file mode 100644 index 1641f92caf..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderExtensionsTest.cs +++ /dev/null @@ -1,436 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Globalization; -using System.IO; -using System.Text.Encodings.Web; -using Microsoft.AspNet.Testing; -using Microsoft.Extensions.WebEncoders.Testing; -using Xunit; - -namespace Microsoft.AspNet.Html.Abstractions.Test -{ - public class HtmlContentBuilderExtensionsTest - { - [Fact] - public void Builder_AppendLine_Empty() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendLine(); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_AppendLine_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendLine("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value), - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_AppendLine_IHtmlContent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - var content = new OtherHtmlContent("Hi"); - - // Act - builder.AppendLine(content); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Same(content, entry), - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_AppendHtmlLine_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendHtmlLine("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value), - entry => Assert.Equal(Environment.NewLine, HtmlContentToString(entry))); - } - - [Fact] - public void Builder_SetContent_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - builder.Append("Existing Content. Will be Cleared."); - - // Act - builder.SetContent("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); - } - - [Fact] - public void Builder_SetContent_IHtmlContent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - builder.Append("Existing Content. Will be Cleared."); - - var content = new OtherHtmlContent("Hi"); - - // Act - builder.SetContent(content); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Same(content, entry)); - } - - [Fact] - public void Builder_SetHtmlContent_String() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - builder.Append("Existing Content. Will be Cleared."); - - // Act - builder.SetHtmlContent("Hi"); - - // Assert - Assert.Collection( - builder.Entries, - entry => Assert.Equal("Hi", Assert.IsType(entry).Value)); - } - - [Fact] - public void Builder_AppendFormat() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("{0} {1} {2} {3}!", "First", "Second", "Third", "Fourth"); - - // Assert - Assert.Equal( - "HtmlEncode[[First]] HtmlEncode[[Second]] HtmlEncode[[Third]] HtmlEncode[[Fourth]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_HtmlContent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("{0}!", new EncodedString("First")); - - // Assert - Assert.Equal( - "First!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormatContent_With1Argument() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X} - hex equivalent for 50.", 50); - - // Assert - Assert.Equal( - "0xHtmlEncode[[32]] - hex equivalent for 50.", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormatContent_With2Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X} - hex equivalent for {1}.", 50, 50); - - // Assert - Assert.Equal( - "0xHtmlEncode[[32]] - hex equivalent for HtmlEncode[[50]].", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormatContent_With3Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X} - {1} equivalent for {2}.", 50, "hex", 50); - - // Assert - Assert.Equal( - "0xHtmlEncode[[32]] - HtmlEncode[[hex]] equivalent for HtmlEncode[[50]].", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithAlignmentComponent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("{0, -25} World!", "Hello"); - - // Assert - Assert.Equal( - "HtmlEncode[[Hello]] World!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithFormatStringComponent() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat("0x{0:X}", 50); - - // Assert - Assert.Equal("0xHtmlEncode[[32]]", HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0, -5:N} {1} {2} {3}!", - 1.1, - 2.98, - 145.82, - 32.86); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] " + - "HtmlEncode[[145.82]] HtmlEncode[[32.86]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture_1Argument() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0:N}!", - 1.1); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture_2Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0:N} {1}!", - 1.1, - 2.98); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithCulture_3Arguments() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat( - CultureInfo.InvariantCulture, - "Numbers in InvariantCulture - {0:N} {1} {2}!", - 1.1, - 2.98, - 3.12); - - // Assert - Assert.Equal( - "Numbers in InvariantCulture - HtmlEncode[[1.10]] HtmlEncode[[2.98]] HtmlEncode[[3.12]]!", - HtmlContentToString(builder)); - } - - [Fact] - public void Builder_AppendFormat_WithDifferentCulture() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - var culture = new CultureInfo("fr-FR"); - - // Act - builder.AppendFormat(culture, "{0} in french!", 1.21); - - // Assert - Assert.Equal( - "HtmlEncode[[1,21]] in french!", - HtmlContentToString(builder)); - } - - [Fact] - [ReplaceCulture("de-DE", "de-DE")] - public void Builder_AppendFormat_WithDifferentCurrentCulture() - { - // Arrange - var builder = new TestHtmlContentBuilder(); - - // Act - builder.AppendFormat(CultureInfo.CurrentCulture, "{0:D}", DateTime.Parse("01/02/2015")); - - // Assert - Assert.Equal( - "HtmlEncode[[Sonntag, 1. Februar 2015]]", - HtmlContentToString(builder)); - } - - private static string HtmlContentToString(IHtmlContent content) - { - using (var writer = new StringWriter()) - { - content.WriteTo(writer, new HtmlTestEncoder()); - return writer.ToString(); - } - } - - private class TestHtmlContentBuilder : IHtmlContentBuilder - { - public List Entries { get; } = new List(); - - public IHtmlContentBuilder Append(string unencoded) - { - Entries.Add(new UnencodedString(unencoded)); - return this; - } - - public IHtmlContentBuilder Append(IHtmlContent content) - { - Entries.Add(content); - return this; - } - - public IHtmlContentBuilder AppendHtml(string encoded) - { - Entries.Add(new EncodedString(encoded)); - return this; - } - - public IHtmlContentBuilder Clear() - { - Entries.Clear(); - return this; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - foreach (var entry in Entries) - { - entry.WriteTo(writer, encoder); - } - } - } - - private class EncodedString : IHtmlContent - { - public EncodedString(string value) - { - Value = value; - } - - public string Value { get; } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(Value); - } - } - - private class UnencodedString : IHtmlContent - { - public UnencodedString(string value) - { - Value = value; - } - - public string Value { get; } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - encoder.Encode(writer, Value); - } - } - - private class OtherHtmlContent : IHtmlContent - { - public OtherHtmlContent(string value) - { - Value = value; - } - - public string Value { get; } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - throw new NotImplementedException(); - } - } - } -} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs b/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs deleted file mode 100644 index 4c2c3177cb..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/HtmlContentBuilderTest.cs +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.IO; -using System.Text.Encodings.Web; -using Microsoft.AspNet.Html.Abstractions; -using Microsoft.Extensions.WebEncoders.Testing; -using Xunit; - -namespace Microsoft.Extensions.Internal -{ - public class HtmlContentBuilderTest - { - [Fact] - public void AppendString_AppendsAString() - { - // Arrange - var content = new HtmlContentBuilder(); - - // Act - content.Append("Hello"); - - // Assert - var result = Assert.Single(content.Entries); - Assert.IsType(result); - } - - [Fact] - public void AppendString_WrittenAsEncoded() - { - // Arrange - var content = new HtmlContentBuilder(); - content.Append("Hello"); - - var writer = new StringWriter(); - - // Act - content.WriteTo(writer, new HtmlTestEncoder()); - - // Assert - Assert.Equal("HtmlEncode[[Hello]]", writer.ToString()); - } - - [Fact] - public void AppendHtml_DoesNotGetWrittenAsEncoded() - { - // Arrange - var content = new HtmlContentBuilder(); - content.AppendHtml("Hello"); - - var writer = new StringWriter(); - - // Act - content.WriteTo(writer, new HtmlTestEncoder()); - - // Assert - Assert.Equal("Hello", writer.ToString()); - } - - [Fact] - public void AppendIHtmlContent_AppendsAsIs() - { - // Arrange - var content = new HtmlContentBuilder(); - var writer = new StringWriter(); - - // Act - content.Append(new TestHtmlContent("Hello")); - - // Assert - var result = Assert.Single(content.Entries); - var testHtmlContent = Assert.IsType(result); - testHtmlContent.WriteTo(writer, new HtmlTestEncoder()); - Assert.Equal("Written from TestHtmlContent: Hello", writer.ToString()); - } - - [Fact] - public void CanAppendMultipleItems() - { - // Arrange - var content = new HtmlContentBuilder(); - - // Act - content.Append(new TestHtmlContent("hello")); - content.Append("Test"); - - // Assert - Assert.Equal(2, content.Entries.Count); - Assert.Equal("Written from TestHtmlContent: hello", content.Entries[0].ToString()); - Assert.Equal("Test", content.Entries[1]); - } - - [Fact] - public void Clear_DeletesAllItems() - { - // Arrange - var content = new HtmlContentBuilder(); - content.Append(new TestHtmlContent("hello")); - content.Append("Test"); - - // Act - content.Clear(); - - // Assert - Assert.Equal(0, content.Entries.Count); - } - - [Fact] - public void WriteTo_WritesAllItems() - { - // Arrange - var content = new HtmlContentBuilder(); - var writer = new StringWriter(); - content.Append(new TestHtmlContent("Hello")); - content.Append("Test"); - - // Act - content.WriteTo(writer, new HtmlTestEncoder()); - - // Assert - Assert.Equal(2, content.Entries.Count); - Assert.Equal("Written from TestHtmlContent: HelloHtmlEncode[[Test]]", writer.ToString()); - } - - private class TestHtmlContent : IHtmlContent - { - private string _content; - - public TestHtmlContent(string content) - { - _content = content; - } - - public void WriteTo(TextWriter writer, HtmlEncoder encoder) - { - writer.Write(ToString()); - } - - public override string ToString() - { - return "Written from TestHtmlContent: " + _content; - } - } - } -} diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj b/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj deleted file mode 100644 index 4a03567677..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/Microsoft.AspNet.Html.Abstractions.Test.xproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 2d187b88-94bd-4a39-ac97-f8f8b9363301 - Microsoft.AspNet.Html.Abstractions.Test - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json b/test/Microsoft.AspNet.Html.Abstractions.Test/project.json deleted file mode 100644 index b8e9656f15..0000000000 --- a/test/Microsoft.AspNet.Html.Abstractions.Test/project.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "Microsoft.AspNet.Html.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Extensions.WebEncoders": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - } -} From 5b175beea877cb6896e50db12060580bfe7e7940 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 2 Dec 2015 21:29:38 -0800 Subject: [PATCH 0911/1838] Change SendFileAsync to use a fallback implementation instead of throwing - If the user wants to use the SendFile API directly then they can access the feature explicitly. - Removed SupportsSendFile - Don't check for existence, let FileStream throw - Updated Doc comments - Pass the buffer into StreamCopyOperation - Using a real using instead of try finally. --- .../project.json | 1 + .../Properties/Resources.Designer.cs | 46 ------- .../Resources.resx | 123 ------------------ .../SendFileResponseExtensions.cs | 61 ++++++--- .../StreamCopyOperation.cs | 57 ++++++++ .../SendFileResponseExtensionsTests.cs | 15 +-- 6 files changed, 103 insertions(+), 200 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs delete mode 100644 src/Microsoft.AspNet.Http.Extensions/Resources.resx create mode 100644 src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index 1316a95118..d76ed1ff90 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -36,6 +36,7 @@ "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", "System.Reflection.TypeExtensions": "4.0.1-*", + "System.IO": "4.0.11-*", "System.Runtime": "4.0.21-*", "System.Runtime.InteropServices": "4.0.21-*", "System.Security.Claims": "4.0.1-*", diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs deleted file mode 100644 index a0d5a215a3..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/Properties/Resources.Designer.cs +++ /dev/null @@ -1,46 +0,0 @@ -// -namespace Microsoft.AspNet.Http.Extensions -{ - using System.Globalization; - using System.Reflection; - using System.Resources; - - internal static class Resources - { - private static readonly ResourceManager _resourceManager - = new ResourceManager("Microsoft.AspNet.Http.Extensions.Resources", typeof(Resources).GetTypeInfo().Assembly); - - /// - /// This server does not support the sendfile.SendAsync extension. - /// - internal static string Exception_SendFileNotSupported - { - get { return GetString("Exception_SendFileNotSupported"); } - } - - /// - /// This server does not support the sendfile.SendAsync extension. - /// - internal static string FormatException_SendFileNotSupported() - { - return GetString("Exception_SendFileNotSupported"); - } - - private static string GetString(string name, params string[] formatterNames) - { - var value = _resourceManager.GetString(name); - - System.Diagnostics.Debug.Assert(value != null); - - if (formatterNames != null) - { - for (var i = 0; i < formatterNames.Length; i++) - { - value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); - } - } - - return value; - } - } -} diff --git a/src/Microsoft.AspNet.Http.Extensions/Resources.resx b/src/Microsoft.AspNet.Http.Extensions/Resources.resx deleted file mode 100644 index 2059135d60..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/Resources.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 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 - - - This server does not support the sendfile.SendAsync extension. - - \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 680c77e62c..7218adde73 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Extensions; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http @@ -14,26 +14,11 @@ namespace Microsoft.AspNet.Http /// public static class SendFileResponseExtensions { - /// - /// Checks if the SendFile extension is supported. - /// - /// - /// True if sendfile feature exists in the response. - public static bool SupportsSendFile(this HttpResponse response) - { - if (response == null) - { - throw new ArgumentNullException(nameof(response)); - } - - return response.HttpContext.Features.Get() != null; - } - /// /// Sends the given file using the SendFile extension. /// /// - /// + /// The full to the file. /// public static Task SendFileAsync(this HttpResponse response, string fileName) { @@ -54,7 +39,7 @@ namespace Microsoft.AspNet.Http /// Sends the given file using the SendFile extension. /// /// - /// The full or relative path to the file. + /// The full to the file. /// The offset in the file. /// The number of types to send, or null to send the remainder of the file. /// @@ -74,10 +59,48 @@ namespace Microsoft.AspNet.Http var sendFile = response.HttpContext.Features.Get(); if (sendFile == null) { - throw new NotSupportedException(Resources.Exception_SendFileNotSupported); + return SendFileAsync(response.Body, fileName, offset, count, cancellationToken); } return sendFile.SendFileAsync(fileName, offset, count, cancellationToken); } + + // Not safe for overlapped writes. + private static async Task SendFileAsync(Stream outputStream, string fileName, long offset, long? length, CancellationToken cancel) + { + cancel.ThrowIfCancellationRequested(); + + var fileInfo = new FileInfo(fileName); + if (offset < 0 || offset > fileInfo.Length) + { + throw new ArgumentOutOfRangeException(nameof(offset), offset, string.Empty); + } + + if (length.HasValue && + (length.Value < 0 || length.Value > fileInfo.Length - offset)) + { + throw new ArgumentOutOfRangeException(nameof(length), length, string.Empty); + } + + int bufferSize = 1024 * 16; + + var fileStream = new FileStream( + fileName, + FileMode.Open, + FileAccess.Read, + FileShare.ReadWrite, + bufferSize: bufferSize, + options: FileOptions.Asynchronous | FileOptions.SequentialScan); + + using (fileStream) + { + fileStream.Seek(offset, SeekOrigin.Begin); + + // TODO: Use buffer pool + var buffer = new byte[bufferSize]; + + await StreamCopyOperation.CopyToAsync(fileStream, buffer, outputStream, length, cancel); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs new file mode 100644 index 0000000000..f7e6734c9c --- /dev/null +++ b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs @@ -0,0 +1,57 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.IO; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.Http +{ + // FYI: In most cases the source will be a FileStream and the destination will be to the network. + internal static class StreamCopyOperation + { + internal static async Task CopyToAsync(Stream source, byte[] buffer, Stream destination, long? length, CancellationToken cancel) + { + long? bytesRemaining = length; + Debug.Assert(source != null); + Debug.Assert(destination != null); + Debug.Assert(!bytesRemaining.HasValue || bytesRemaining.Value >= 0); + Debug.Assert(buffer != null); + + while (true) + { + // The natural end of the range. + if (bytesRemaining.HasValue && bytesRemaining.Value <= 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + int readLength = buffer.Length; + if (bytesRemaining.HasValue) + { + readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); + } + int count = await source.ReadAsync(buffer, 0, readLength, cancel); + + if (bytesRemaining.HasValue) + { + bytesRemaining -= count; + } + + // End of the source stream. + if (count == 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + await destination.WriteAsync(buffer, 0, count, cancel); + } + } + } +} \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index cd16acb06d..53c8051774 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. See License.txt in the project root for license information. using System; +using System.IO; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Http.Features; @@ -12,20 +13,10 @@ namespace Microsoft.AspNet.Http.Extensions.Tests public class SendFileResponseExtensionsTests { [Fact] - public void SendFileSupport() - { - var context = new DefaultHttpContext(); - var response = context.Response; - Assert.False(response.SupportsSendFile()); - context.Features.Set(new FakeSendFileFeature()); - Assert.True(response.SupportsSendFile()); - } - - [Fact] - public Task SendFileWhenNotSupported() + public Task SendFileWhenFileNotFoundThrows() { var response = new DefaultHttpContext().Response; - return Assert.ThrowsAsync(() => response.SendFileAsync("foo")); + return Assert.ThrowsAsync(() => response.SendFileAsync("foo")); } [Fact] From 6055e25d19d1f7c21cccb6a5029915b06aa0569b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 2 Dec 2015 22:51:48 -0800 Subject: [PATCH 0912/1838] Fixed typo in doc comment --- .../SendFileResponseExtensions.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index 7218adde73..bb236b7dd0 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -18,7 +18,7 @@ namespace Microsoft.AspNet.Http /// Sends the given file using the SendFile extension. /// /// - /// The full to the file. + /// The full path to the file. /// public static Task SendFileAsync(this HttpResponse response, string fileName) { @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Http /// Sends the given file using the SendFile extension. /// /// - /// The full to the file. + /// The full path to the file. /// The offset in the file. /// The number of types to send, or null to send the remainder of the file. /// From 9887fe0dee49bd0b15aad907c235abe33c98ba6b Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 2 Dec 2015 23:58:16 -0800 Subject: [PATCH 0913/1838] Move the header extensions to Http.Abstractions --- .../Extensions}/HeaderDictionaryExtensions.cs | 0 .../Internal/HeaderSegment.cs | 0 .../Internal/HeaderSegmentCollection.cs | 0 .../Internal/ParsingHelpers.cs | 0 4 files changed, 0 insertions(+), 0 deletions(-) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions/Extensions}/HeaderDictionaryExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions}/Internal/HeaderSegment.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions}/Internal/HeaderSegmentCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNet.Http.Abstractions}/Internal/ParsingHelpers.cs (100%) diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryExtensions.cs rename to src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs b/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegment.cs rename to src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Internal/HeaderSegmentCollection.cs rename to src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Internal/ParsingHelpers.cs rename to src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs From bae9771a811b958fc408f21ba7a11661e55b6663 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 3 Dec 2015 11:03:13 -0800 Subject: [PATCH 0914/1838] Diabling async TestHost.Tests on Mono #507 --- .../ClientHandlerTests.cs | 23 +++++--- .../TestClientTests.cs | 29 +++++++---- .../TestServerTests.cs | 52 ++++++++++++------- 3 files changed, 68 insertions(+), 36 deletions(-) diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 3108810ff9..820f98d1fb 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -59,7 +59,8 @@ namespace Microsoft.AspNet.TestHost return httpClient.GetAsync("https://example.com/"); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ResubmitRequestWorks() { int requestCount = 1; @@ -83,7 +84,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("TestValue:2", response.Headers.GetValues("TestHeader").First()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task MiddlewareOnlySetsHeaders() { var handler = new ClientHandler(PathString.Empty, new DummyApplication(context => @@ -96,7 +98,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("TestValue", response.Headers.GetValues("TestHeader").First()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task BlockingMiddlewareShouldNotBlockClient() { ManualResetEvent block = new ManualResetEvent(false); @@ -113,7 +116,8 @@ namespace Microsoft.AspNet.TestHost HttpResponseMessage response = await task; } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task HeadersAvailableBeforeBodyFinished() { ManualResetEvent block = new ManualResetEvent(false); @@ -132,7 +136,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("BodyStarted,BodyFinished", await response.Content.ReadAsStringAsync()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task FlushSendsHeaders() { ManualResetEvent block = new ManualResetEvent(false); @@ -151,7 +156,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("BodyFinished", await response.Content.ReadAsStringAsync()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ClientDisposalCloses() { ManualResetEvent block = new ManualResetEvent(false); @@ -176,7 +182,8 @@ namespace Microsoft.AspNet.TestHost block.Set(); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ClientCancellationAborts() { ManualResetEvent block = new ManualResetEvent(false); @@ -215,7 +222,7 @@ namespace Microsoft.AspNet.TestHost } [ConditionalFact] - [OSSkipCondition(OperatingSystems.Linux, SkipReason = "Hangs randomly (issue #422).")] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ExceptionAfterFirstWriteIsReported() { ManualResetEvent block = new ManualResetEvent(false); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 0d19dd88ef..61e0f2b9d7 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -25,7 +25,8 @@ namespace Microsoft.AspNet.TestHost _server = TestServer.Create(app => app.Run(ctx => Task.FromResult(0))); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task GetAsyncWorks() { // Arrange @@ -42,7 +43,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal(expected, actual); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task NoTrailingSlash_NoPathBase() { // Arrange @@ -63,7 +65,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal(expected, actual); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task SingleTrailingSlash_NoPathBase() { // Arrange @@ -84,7 +87,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal(expected, actual); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task PutAsyncWorks() { // Arrange @@ -101,7 +105,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Hello world PUT Response", await response.Content.ReadAsStringAsync()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task PostAsyncWorks() { // Arrange @@ -118,7 +123,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Hello world POST Response", await response.Content.ReadAsStringAsync()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WebSocketWorks() { // Arrange @@ -179,7 +185,8 @@ namespace Microsoft.AspNet.TestHost clientSocket.Dispose(); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WebSocketDisposalThrowsOnPeer() { // Arrange @@ -205,7 +212,8 @@ namespace Microsoft.AspNet.TestHost clientSocket.Dispose(); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WebSocketTinyReceiveGeneratesEndOfMessage() { // Arrange @@ -248,7 +256,8 @@ namespace Microsoft.AspNet.TestHost clientSocket.Dispose(); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ClientDisposalAbortsRequest() { // Arrange @@ -282,7 +291,7 @@ namespace Microsoft.AspNet.TestHost } [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.CoreCLR, SkipReason = "Hangs randomly (issue #422).")] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ClientCancellationAbortsRequest() { // Arrange diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index ad55d2ee69..80e0e44f0f 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -31,7 +31,8 @@ namespace Microsoft.AspNet.TestHost TestServer.Create(app => { }); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task RequestServicesAutoCreated() { var server = TestServer.Create(app => @@ -66,7 +67,8 @@ namespace Microsoft.AspNet.TestHost } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CustomServiceProviderSetsApplicationServices() { var server = new TestServer(TestServer.CreateBuilder().UseStartup()); @@ -107,7 +109,8 @@ namespace Microsoft.AspNet.TestHost } } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ExistingRequestServicesWillNotBeReplaced() { var server = TestServer.Create(app => @@ -123,7 +126,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Found:True", result); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanSetCustomServiceProvider() { var server = TestServer.Create(app => @@ -169,7 +173,8 @@ namespace Microsoft.AspNet.TestHost } } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ExistingServiceProviderFeatureWillNotBeReplaced() { var appServices = new ServiceCollection().BuildServiceProvider(); @@ -206,7 +211,8 @@ namespace Microsoft.AspNet.TestHost } } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() { var server = TestServer.Create(app => @@ -222,7 +228,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Success", result); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAccessLogger() { var server = TestServer.Create(app => @@ -238,7 +245,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("FoundLogger:True", result); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAccessHttpContext() { Action configureServices = services => @@ -268,7 +276,8 @@ namespace Microsoft.AspNet.TestHost public IHttpContextAccessor Accessor { get; set; } } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAddNewHostServices() { Action configureServices = services => @@ -289,7 +298,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("HasContext:True", result); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CreateInvokesApp() { TestServer server = TestServer.Create(app => @@ -304,7 +314,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("CreateInvokesApp", result); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task DisposeStreamIgnored() { TestServer server = TestServer.Create(app => @@ -321,7 +332,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("Response", await result.Content.ReadAsStringAsync()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task DisposedServerThrows() { TestServer server = TestServer.Create(app => @@ -340,7 +352,7 @@ namespace Microsoft.AspNet.TestHost } [ConditionalFact] - [FrameworkSkipCondition(RuntimeFrameworks.CoreCLR, SkipReason = "Hangs randomly (issue #422).")] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public void CancelAborts() { TestServer server = TestServer.Create(app => @@ -356,7 +368,8 @@ namespace Microsoft.AspNet.TestHost Assert.Throws(() => { string result = server.CreateClient().GetStringAsync("/path").Result; }); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanCreateViaStartupType() { TestServer server = new TestServer(TestServer.CreateBuilder().UseStartup()); @@ -365,7 +378,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("FoundService:True", await result.Content.ReadAsStringAsync()); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanCreateViaStartupTypeAndSpecifyEnv() { TestServer server = new TestServer(TestServer.CreateBuilder() @@ -375,8 +389,9 @@ namespace Microsoft.AspNet.TestHost Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); } - - [Fact] + + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task BeginEndDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; @@ -401,7 +416,8 @@ namespace Microsoft.AspNet.TestHost Assert.Null(listener.UnhandledException); } - [Fact] + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ExceptionDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; From c2e7618d9a7448493b96f5a301b3a7ccf1dc7fe7 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Fri, 4 Dec 2015 12:20:15 +0100 Subject: [PATCH 0915/1838] Added Name and FileName to IFormFile This commits also gets rid of the name closure in FormFileCollection by interating over the files in the collection instead of using Find and FindAll. Closes #352 and #499 --- .../IFormFile.cs | 4 +++ .../Features/FormFeature.cs | 5 ++- .../Features/FormFile.cs | 22 ++++++------ .../FormFileCollection.cs | 35 +++++++++++-------- .../FormFeatureTests.cs | 2 ++ 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index 6f8fdaa2ad..b5e44904b4 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -18,6 +18,10 @@ namespace Microsoft.AspNet.Http long Length { get; } + string Name { get; } + + string FileName { get; } + Stream OpenReadStream(); } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNet.Http/Features/FormFeature.cs index f3ed68e34a..198924ba06 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFeature.cs @@ -149,7 +149,10 @@ namespace Microsoft.AspNet.Http.Features.Internal // Find the end await section.Body.DrainAsync(cancellationToken); - var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length) + var name = HeaderUtilities.RemoveQuotes(contentDisposition.Name) ?? string.Empty; + var fileName = HeaderUtilities.RemoveQuotes(contentDisposition.FileName) ?? string.Empty; + + var file = new FormFile(_request.Body, section.BaseStreamOffset.Value, section.Body.Length, name, fileName) { Headers = new HeaderDictionary(section.Headers), }; diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index 557dc9d518..3fc5113633 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -8,15 +8,16 @@ namespace Microsoft.AspNet.Http.Features.Internal { public class FormFile : IFormFile { - private Stream _baseStream; - private long _baseStreamOffset; - private long _length; + private readonly Stream _baseStream; + private readonly long _baseStreamOffset; - public FormFile(Stream baseStream, long baseStreamOffset, long length) + public FormFile(Stream baseStream, long baseStreamOffset, long length, string name, string fileName) { _baseStream = baseStream; _baseStreamOffset = baseStreamOffset; - _length = length; + Length = length; + Name = name; + FileName = fileName; } public string ContentDisposition @@ -33,14 +34,15 @@ namespace Microsoft.AspNet.Http.Features.Internal public IHeaderDictionary Headers { get; set; } - public long Length - { - get { return _length; } - } + public long Length { get; } + + public string Name { get; } + + public string FileName { get; } public Stream OpenReadStream() { - return new ReferenceReadStream(_baseStream, _baseStreamOffset, _length); + return new ReferenceReadStream(_baseStream, _baseStreamOffset, Length); } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/FormFileCollection.cs b/src/Microsoft.AspNet.Http/FormFileCollection.cs index 43dbf0cb12..b7b3ee8ebd 100644 --- a/src/Microsoft.AspNet.Http/FormFileCollection.cs +++ b/src/Microsoft.AspNet.Http/FormFileCollection.cs @@ -1,34 +1,41 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using System; using System.Collections.Generic; -using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { public class FormFileCollection : List, IFormFileCollection { - public IFormFile this[string name] - { - get { return GetFile(name); } - } + public IFormFile this[string name] => GetFile(name); public IFormFile GetFile(string name) { - return Find(file => string.Equals(name, GetName(file.ContentDisposition))); + foreach (var file in this) + { + if (string.Equals(name, file.Name, StringComparison.OrdinalIgnoreCase)) + { + return file; + } + } + + return null; } public IReadOnlyList GetFiles(string name) { - return FindAll(file => string.Equals(name, GetName(file.ContentDisposition))); - } + var files = new List(); - private static string GetName(string contentDisposition) - { - // Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg" - ContentDispositionHeaderValue cd; - ContentDispositionHeaderValue.TryParse(contentDisposition, out cd); - return HeaderUtilities.RemoveQuotes(cd?.Name); + foreach (var file in this) + { + if (string.Equals(name, file.Name, StringComparison.OrdinalIgnoreCase)) + { + files.Add(file); + } + } + + return files; } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs index 4580ac9e97..7d7cafc542 100644 --- a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs @@ -215,6 +215,8 @@ namespace Microsoft.AspNet.Http.Features.Internal Assert.Equal(1, formCollection.Files.Count); var file = formCollection.Files["myfile1"]; + Assert.Equal("myfile1", file.Name); + Assert.Equal("temp.html", file.FileName); Assert.Equal("text/html", file.ContentType); Assert.Equal(@"form-data; name=""myfile1""; filename=""temp.html""", file.ContentDisposition); var body = file.OpenReadStream(); From 0f0999161d5dfb12feba90f26bbc05795fdf00b3 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 2 Dec 2015 17:20:28 -0800 Subject: [PATCH 0916/1838] Reacting to verbose rename --- .../Internal/HostingLoggerExtensions.cs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs index 3730736d0b..4f149d5b44 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -57,9 +57,9 @@ namespace Microsoft.AspNet.Hosting.Internal public static void Starting(this ILogger logger) { - if (logger.IsEnabled(LogLevel.Verbose)) + if (logger.IsEnabled(LogLevel.Debug)) { - logger.LogVerbose( + logger.LogDebug( eventId: LoggerEventIds.Starting, data: "Hosting starting"); } @@ -67,9 +67,9 @@ namespace Microsoft.AspNet.Hosting.Internal public static void Started(this ILogger logger) { - if (logger.IsEnabled(LogLevel.Verbose)) + if (logger.IsEnabled(LogLevel.Debug)) { - logger.LogVerbose( + logger.LogDebug( eventId: LoggerEventIds.Started, data: "Hosting started"); } @@ -77,9 +77,9 @@ namespace Microsoft.AspNet.Hosting.Internal public static void Shutdown(this ILogger logger) { - if (logger.IsEnabled(LogLevel.Verbose)) + if (logger.IsEnabled(LogLevel.Debug)) { - logger.LogVerbose( + logger.LogDebug( eventId: LoggerEventIds.Shutdown, data: "Hosting shutdown"); } From 5231683aae4d771908205adc4c24040733dd9ace Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 7 Dec 2015 19:22:53 -0800 Subject: [PATCH 0917/1838] * Removing unused dependencies from code * Cleaning up usage of CodeAnalysis. --- .../AuthenticationProperties.cs | 2 -- .../HostString.cs | 3 --- .../PathString.cs | 4 ---- .../QueryString.cs | 2 -- .../project.json | 14 ++------------ .../project.json | 4 +--- src/Microsoft.AspNet.Http/ParsingHelpers.cs | 1 - src/Microsoft.AspNet.Http/project.json | 2 -- src/Microsoft.AspNet.Owin/project.json | 19 +------------------ .../project.json | 5 +---- 10 files changed, 5 insertions(+), 51 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs index 5c815ba37b..b4d327914f 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Globalization; namespace Microsoft.AspNet.Http.Authentication @@ -70,7 +69,6 @@ namespace Microsoft.AspNet.Http.Authentication /// /// Gets or sets the full path or absolute URI to be used as an http redirect response value. /// - [SuppressMessage("Microsoft.Design", "CA1056:UriPropertiesShouldNotBeStrings", Justification = "By design")] public string RedirectUri { get diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs index b5debac327..75b56092fc 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HostString.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics.CodeAnalysis; using System.Globalization; namespace Microsoft.AspNet.Http @@ -52,7 +51,6 @@ namespace Microsoft.AspNet.Http /// Any Unicode is converted to punycode. IPv6 addresses will have brackets added if they are missing. /// /// - [SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Only the host segment of a URI is returned.")] public string ToUriComponent() { int index; @@ -92,7 +90,6 @@ namespace Microsoft.AspNet.Http /// /// /// - [SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Only the host segment of a URI is provided.")] public static HostString FromUriComponent(string uriComponent) { if (!string.IsNullOrEmpty(uriComponent)) diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs index 78c01cdcc1..123fba4f48 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/PathString.cs @@ -64,7 +64,6 @@ namespace Microsoft.AspNet.Http /// Provides the path string escaped in a way which is correct for combining into the URI representation. /// /// The escaped path value - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] public string ToUriComponent() { // TODO: Measure the cost of this escaping and consider optimizing. @@ -94,7 +93,6 @@ namespace Microsoft.AspNet.Http /// /// The escaped path as it appears in the URI format. /// The resulting PathString - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Requirements not compatible with URI processing")] public static PathString FromUriComponent(string uriComponent) { // REVIEW: what is the exactly correct thing to do? @@ -152,7 +150,6 @@ namespace Microsoft.AspNet.Http /// The to compare. /// The remaining segments after the match. /// true if value matches the beginning of this string; otherwise, false. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] public bool StartsWithSegments(PathString other, out PathString remaining) { return StartsWithSegments(other, StringComparison.OrdinalIgnoreCase, out remaining); @@ -166,7 +163,6 @@ namespace Microsoft.AspNet.Http /// One of the enumeration values that determines how this and value are compared. /// The remaining segments after the match. /// true if value matches the beginning of this string; otherwise, false. - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1021:AvoidOutParameters", MessageId = "1#", Justification = "Secondary information needed after boolean result obtained")] public bool StartsWithSegments(PathString other, StringComparison comparisonType, out PathString remaining) { var value1 = Value ?? string.Empty; diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs index d400375ea8..336266e5aa 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs @@ -68,7 +68,6 @@ namespace Microsoft.AspNet.Http /// dangerous are escaped. /// /// The query string value - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1055:UriReturnValuesShouldNotBeStrings", Justification = "Purpose of the method is to return a string")] public string ToUriComponent() { // Escape things properly so System.Uri doesn't mis-interpret the data. @@ -81,7 +80,6 @@ namespace Microsoft.AspNet.Http /// /// The escaped query as it appears in the URI format. /// The resulting QueryString - [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1057:StringUriOverloadsCallSystemUriOverloads", Justification = "Delimiter characters ? and # must be escaped by this method instead of truncating the value")] public static QueryString FromUriComponent(string uriComponent) { if (string.IsNullOrEmpty(uriComponent)) diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNet.Http.Abstractions/project.json index d76ed1ff90..cf571cfed3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/project.json +++ b/src/Microsoft.AspNet.Http.Abstractions/project.json @@ -26,23 +26,13 @@ }, "dotnet5.4": { "dependencies": { - "System.Collections": "4.0.11-*", "System.ComponentModel": "4.0.1-*", - "System.Diagnostics.Tools": "4.0.1-*", - "System.Globalization": "4.0.11-*", "System.Globalization.Extensions": "4.0.1-*", - "System.Linq": "4.0.1-*", "System.Linq.Expressions": "4.0.11-*", - "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", - "System.Reflection.TypeExtensions": "4.0.1-*", - "System.IO": "4.0.11-*", - "System.Runtime": "4.0.21-*", + "System.Reflection.TypeExtensions": "4.1.0-*", "System.Runtime.InteropServices": "4.0.21-*", - "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*", - "System.Security.Principal": "4.0.1-*", - "System.Threading.Tasks": "4.0.11-*" + "System.Security.Cryptography.X509Certificates": "4.0.0-*" } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 1dff3fe5c1..747d08ca80 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -17,9 +17,7 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.IO.FileSystem": "4.0.1-*", - "System.Runtime": "4.0.21-*", - "System.Resources.ResourceManager": "4.0.1-*" + "System.IO.FileSystem": "4.0.1-*" } } } diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNet.Http/ParsingHelpers.cs index 8b575fd659..e2da6489a3 100644 --- a/src/Microsoft.AspNet.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNet.Http/ParsingHelpers.cs @@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Http.Internal #endregion } - [System.CodeDom.Compiler.GeneratedCode("App_Packages", "")] internal struct HeaderSegmentCollection : IEnumerable, IEquatable { private readonly StringValues _headers; diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNet.Http/project.json index 88f2039436..530c34e71e 100644 --- a/src/Microsoft.AspNet.Http/project.json +++ b/src/Microsoft.AspNet.Http/project.json @@ -19,8 +19,6 @@ "net451": {}, "dotnet5.4": { "dependencies": { - "System.Diagnostics.Debug": "4.0.11-*", - "System.Text.Encoding": "4.0.11-*", "System.Threading": "4.0.11-*" } } diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNet.Owin/project.json index 886ba4d554..a168017154 100644 --- a/src/Microsoft.AspNet.Owin/project.json +++ b/src/Microsoft.AspNet.Owin/project.json @@ -14,23 +14,6 @@ }, "frameworks": { "net451": {}, - "dotnet5.4": { - "dependencies": { - "System.Collections": "4.0.11-*", - "System.ComponentModel": "4.0.1-*", - "System.Diagnostics.Tools": "4.0.1-*", - "System.Globalization": "4.0.11-*", - "System.IO": "4.0.11-*", - "System.Linq": "4.0.1-*", - "System.Net.Primitives": "4.0.11-*", - "System.Runtime": "4.0.21-*", - "System.Runtime.Extensions": "4.0.11-*", - "System.Runtime.InteropServices": "4.0.21-*", - "System.Security.Claims": "4.0.1-*", - "System.Security.Cryptography.X509Certificates": "4.0.0-*", - "System.Security.Principal": "4.0.1-*", - "System.Threading.Tasks": "4.0.11-*" - } - } + "dotnet5.4": {} } } diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 41c996a830..82efa6d0d5 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -22,11 +22,8 @@ "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-*", - "System.Diagnostics.Debug": "4.0.11-*", "System.IO": "4.0.11-*", - "System.IO.FileSystem": "4.0.1-*", - "System.Runtime": "4.0.21-*", - "System.Runtime.Extensions": "4.0.11-*" + "System.IO.FileSystem": "4.0.1-*" } } } From 3f9c23a6eeca10cfd31db0fba47bb0408ce0453e Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Mon, 7 Dec 2015 20:15:37 -0800 Subject: [PATCH 0918/1838] Remove `[SuppressMessage]`s - build break --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 5 +---- src/Microsoft.AspNet.TestHost/RequestBuilder.cs | 5 ----- src/Microsoft.AspNet.TestHost/ResponseStream.cs | 3 --- 3 files changed, 1 insertion(+), 12 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 200dc5db9a..30a48d38aa 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Generic; -using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using System.IO; using System.Linq; @@ -37,7 +36,7 @@ namespace Microsoft.AspNet.TestHost { throw new ArgumentNullException(nameof(application)); } - + _application = application; // PathString.StartsWithSegments that we use below requires the base path to not end in a slash. @@ -204,8 +203,6 @@ namespace Microsoft.AspNet.TestHost } } - [SuppressMessage("Microsoft.Reliability", "CA2000:DisposeObjectsBeforeLosingScope", - Justification = "HttpResposneMessage must be returned to the caller.")] private HttpResponseMessage GenerateResponse() { _responseFeature.FireOnSendingHeaders(); diff --git a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs index 2de21ead03..51b93fade0 100644 --- a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs +++ b/src/Microsoft.AspNet.TestHost/RequestBuilder.cs @@ -2,7 +2,6 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Diagnostics.CodeAnalysis; using System.IO; using System.Net.Http; using System.Threading.Tasks; @@ -12,8 +11,6 @@ namespace Microsoft.AspNet.TestHost /// /// Used to construct a HttpRequestMessage object. /// - [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable", - Justification = "HttpRequestMessage is disposed by HttpClient in SendAsync")] public class RequestBuilder { private readonly TestServer _server; @@ -24,7 +21,6 @@ namespace Microsoft.AspNet.TestHost /// /// /// - [SuppressMessage("Microsoft.Usage", "CA2234:PassSystemUriObjectsInsteadOfStrings", Justification = "Not a full URI")] public RequestBuilder(TestServer server, string path) { if (server == null) @@ -90,7 +86,6 @@ namespace Microsoft.AspNet.TestHost /// Set the request method to GET and start processing the request. /// /// - [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "GET is an HTTP verb.")] public Task GetAsync() { _req.Method = HttpMethod.Get; diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNet.TestHost/ResponseStream.cs index 314bbec048..55b318309a 100644 --- a/src/Microsoft.AspNet.TestHost/ResponseStream.cs +++ b/src/Microsoft.AspNet.TestHost/ResponseStream.cs @@ -3,7 +3,6 @@ using System; using System.Collections.Concurrent; -using System.Diagnostics.CodeAnalysis; using System.Diagnostics.Contracts; using System.IO; using System.Threading; @@ -370,8 +369,6 @@ namespace Microsoft.AspNet.TestHost } } - [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "_writeLock", Justification = "ODEs from the locks would mask IOEs from abort.")] - [SuppressMessage("Microsoft.Usage", "CA2213:DisposableFieldsShouldBeDisposed", MessageId = "_readLock", Justification = "Data can still be read unless we get aborted.")] protected override void Dispose(bool disposing) { if (disposing) From 29a4f302d893cc87b79bba7c5426cc00438e009f Mon Sep 17 00:00:00 2001 From: David Fowler Date: Sun, 6 Dec 2015 01:51:38 -0800 Subject: [PATCH 0919/1838] Remove non-essential platform services - Remove services that can be registered by the application itself. - These services use to come from the DNX but now they are stand alone implementations that can be registered by applications if they choose. #501 --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 15 --------------- 1 file changed, 15 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 309d9eff71..5c96962fb2 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -98,21 +98,6 @@ namespace Microsoft.AspNet.Hosting services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); } - if (PlatformServices.Default?.AssemblyLoadContextAccessor != null) - { - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoadContextAccessor)); - } - - if (PlatformServices.Default?.AssemblyLoaderContainer != null) - { - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.AssemblyLoaderContainer)); - } - - if (PlatformServices.Default?.LibraryManager != null) - { - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.LibraryManager)); - } - return services; } From 5e42d26fd536ea7fbca7e3b30eb593fe876e462b Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 8 Dec 2015 10:27:08 -0800 Subject: [PATCH 0920/1838] Implement GetHashCode --- src/Microsoft.AspNet.Http.Features/FeatureCollection.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index eacad01a72..246af4d183 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -102,7 +102,7 @@ namespace Microsoft.AspNet.Http.Features public int GetHashCode(KeyValuePair obj) { - throw new NotImplementedException(); + return obj.Key.GetHashCode(); } } } From b966ed0ba3021e1c4b3a2cfac1dc43a104fcc04c Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 8 Dec 2015 17:15:40 -0800 Subject: [PATCH 0921/1838] Fixing CoreCLR package versions --- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index 77079ef4f8..e6af8b13d7 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -26,7 +26,7 @@ }, "dnxcore50": { "dependencies": { - "System.Diagnostics.Process": "4.0.0-*", + "System.Diagnostics.Process": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*", "System.Net.Http": "4.0.1-*", "System.Net.Primitives": "4.0.11-*", From e3b7db6bb7425414aee69d93e371cb34fe880a6c Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Wed, 9 Dec 2015 13:43:06 +0100 Subject: [PATCH 0922/1838] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8ed5ec4edc..c05401f3ce 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,13 @@ HttpAbstractions ================ -AppVeyor: [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) -Travis: [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) +| AppVeyor | Travis | +| ---- | ---- +| [![AppVeyor](https://ci.appveyor.com/api/projects/status/8civi9t457oc7rf8/branch/dev?svg=true)](https://ci.appveyor.com/project/aspnetci/HttpAbstractions/branch/dev) | [![Travis](https://travis-ci.org/aspnet/HttpAbstractions.svg?branch=dev)](https://travis-ci.org/aspnet/HttpAbstractions) | -Contains HTTP abstractions for ASP.NET 5 such as HttpRequest, HttpResponse. Also contains IBuilder and types to create your application's hosting pipeline. +Contains HTTP abstractions for ASP.NET 5 such as `HttpContext`, `HttpRequest`, `HttpResponse` and `RequestDelegate`. + +It also contains `IApplicationBuilder` and extensions to create and compose your application's pipeline. This project is part of ASP.NET 5. You can find samples, documentation and getting started instructions for ASP.NET 5 at the [Home](https://github.com/aspnet/home) repo. From a83c556bb7694d6d47a04094784b10fae9a76cb2 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 9 Dec 2015 16:20:27 -0800 Subject: [PATCH 0923/1838] Remove compilation error support from Startup error page Fixes #510 --- .../Internal/HostingEngine.cs | 7 +- .../Startup/StartupExceptionPage.cs | 168 ++---------------- .../resources/Compilation_Exception.html | 6 - .../compiler/resources/GenericError.html | 5 - src/Microsoft.AspNet.Hosting/project.json | 1 - 5 files changed, 17 insertions(+), 170 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs index 2d232995ee..6236fa2e8c 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs @@ -168,13 +168,8 @@ namespace Microsoft.AspNet.Hosting.Internal return builder.Build(); } - catch (Exception ex) + catch (Exception ex) when (_captureStartupErrors) { - if (!_captureStartupErrors) - { - throw; - } - // EnsureApplicationServices may have failed due to a missing or throwing Startup class. if (_applicationServices == null) { diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index 1419c5d427..a5f9dc1dbc 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -12,72 +12,38 @@ using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Text; using System.Text.Encodings.Web; -using Microsoft.Extensions.CompilationAbstractions; using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Startup { internal static class StartupExceptionPage { - private const int MaxCompilationErrorsToShow = 20; - private static readonly string _errorPageFormatString = GetResourceString("GenericError.html", escapeBraces: true); private static readonly string _errorMessageFormatString = GetResourceString("GenericError_Message.html"); private static readonly string _errorExceptionFormatString = GetResourceString("GenericError_Exception.html"); private static readonly string _errorFooterFormatString = GetResourceString("GenericError_Footer.html"); - private static readonly string _compilationExceptionFormatString = GetResourceString("Compilation_Exception.html"); - public static byte[] GenerateErrorHtml(bool showDetails, IRuntimeEnvironment runtimeEnvironment, params object[] errorDetails) + public static byte[] GenerateErrorHtml(bool showDetails, IRuntimeEnvironment runtimeEnvironment, Exception exception) { - if (!showDetails) - { - errorDetails = new[] { "An error occurred while starting the application." }; - } - // Build the message for each error - var wasSourceCodeWrittenOntoPage = false; var builder = new StringBuilder(); var rawExceptionDetails = new StringBuilder(); - foreach (object error in errorDetails ?? new object[0]) + if (!showDetails) { - var ex = error as Exception; - if (ex == null && error is ExceptionDispatchInfo) + WriteMessage("An error occurred while starting the application.", builder); + } + else + { + Debug.Assert(exception != null); + var wasSourceCodeWrittenOntoPage = false; + var flattenedExceptions = FlattenAndReverseExceptionTree(exception); + foreach (var innerEx in flattenedExceptions) { - ex = ((ExceptionDispatchInfo)error).SourceException; + WriteException(innerEx, builder, ref wasSourceCodeWrittenOntoPage); } - if (ex != null) - { - var flattenedExceptions = FlattenAndReverseExceptionTree(ex); - - var compilationException = flattenedExceptions.OfType() - .FirstOrDefault(); - if (compilationException != null) - { - WriteException(compilationException, builder, ref wasSourceCodeWrittenOntoPage); - - var compilationErrorMessages = compilationException.CompilationFailures - .SelectMany(f => f.Messages.Select(m => m.FormattedMessage)) - .Take(MaxCompilationErrorsToShow); - - WriteRawExceptionDetails("Show raw compilation error details", compilationErrorMessages, rawExceptionDetails); - } - else - { - foreach (var innerEx in flattenedExceptions) - { - WriteException(innerEx, builder, ref wasSourceCodeWrittenOntoPage); - } - - WriteRawExceptionDetails("Show raw exception details", new[] { ex.ToString() }, rawExceptionDetails); - } - } - else - { - var message = Convert.ToString(error, CultureInfo.InvariantCulture); - WriteMessage(message, builder); - } + WriteRawExceptionDetails("Show raw exception details", exception.ToString(), rawExceptionDetails); } // Generate the footer @@ -171,84 +137,13 @@ namespace Microsoft.AspNet.Hosting.Startup private static string BuildMethodParametersUnescaped(MethodBase method) { - return "(" + string.Join(", ", method.GetParameters().Select(p => { + return "(" + string.Join(", ", method.GetParameters().Select(p => + { Type parameterType = p.ParameterType; return ((parameterType != null) ? PrettyPrintTypeName(parameterType) : "?") + " " + p.Name; })) + ")"; } - private static void BuildCodeSnippetDiv(CompilationFailure failure, - StringBuilder builder, - ref int totalErrorsShown) - { - const int NumContextLines = 3; - var fileName = failure.SourceFilePath; - if (totalErrorsShown < MaxCompilationErrorsToShow && - !string.IsNullOrEmpty(fileName)) - { - builder.Append(@"
") - .AppendFormat(@"
{0}
", HtmlEncodeAndReplaceLineBreaks(fileName)) - .AppendLine(); - - IEnumerable fileContent; - if (string.IsNullOrEmpty(failure.SourceFileContent)) - { - fileContent = File.ReadLines(fileName); - } - else - { - fileContent = failure.SourceFileContent.Split(new[] { Environment.NewLine }, StringSplitOptions.None); - } - foreach (var message in failure.Messages) - { - if (totalErrorsShown++ > MaxCompilationErrorsToShow) - { - break; - } - - if (totalErrorsShown > 1) - { - builder.AppendLine("
"); - } - - builder.Append(@"
") - .Append(HtmlEncodeAndReplaceLineBreaks(message.Message)) - .Append("
"); - - // StartLine and EndLine are 1-based - var startLine = message.StartLine - 1; - var endLine = message.EndLine - 1; - var preContextIndex = Math.Max(startLine - NumContextLines, 0); - var index = preContextIndex + 1; - foreach (var line in fileContent.Skip(preContextIndex).Take(startLine - preContextIndex)) - { - builder.Append(@"
") - .AppendFormat(@"{0}", index++) - .Append(HtmlEncodeAndReplaceLineBreaks(line)) - .AppendLine("
"); - } - - var numErrorLines = 1 + Math.Max(0, endLine - startLine); - foreach (var line in fileContent.Skip(startLine).Take(numErrorLines)) - { - builder.Append(@"
") - .AppendFormat(@"{0}", index++) - .Append(HtmlEncodeAndReplaceLineBreaks(line)) - .AppendLine("
"); - } - foreach (var line in fileContent.Skip(message.EndLine).Take(NumContextLines)) - { - builder.Append(@"
") - .AppendFormat(@"{0}", index++) - .Append(HtmlEncodeAndReplaceLineBreaks(line)) - .AppendLine("
"); - } - } - - builder.AppendLine("
"); // Close codeSnippet div - } - } - private static string GetResourceString(string name, bool escapeBraces = false) { // '{' and '}' are special in CSS, so we use "[[[0]]]" instead for {0} (and so on). @@ -451,7 +346,7 @@ namespace Microsoft.AspNet.Hosting.Startup stackTraceBuilder); } - private static void WriteRawExceptionDetails(string linkText, IEnumerable lines, StringBuilder rawExceptionDetails) + private static void WriteRawExceptionDetails(string linkText, string line, StringBuilder rawExceptionDetails) { rawExceptionDetails .AppendLine("
") @@ -460,10 +355,7 @@ namespace Microsoft.AspNet.Hosting.Startup .AppendLine("
") .Append("
");
 
-            foreach (var line in lines)
-            {
-                rawExceptionDetails.AppendLine(line);
-            }
+            rawExceptionDetails.AppendLine(line);
 
             rawExceptionDetails
                 .AppendLine("
") @@ -471,34 +363,6 @@ namespace Microsoft.AspNet.Hosting.Startup .AppendLine("
"); } - private static void WriteException(ICompilationException compilationException, - StringBuilder builder, - ref bool wasSourceCodeWrittenOntoPage) - { - var totalErrorsShown = 0; - var inlineSourceDiv = new StringBuilder(); - var firstStackFrame = true; - foreach (var failure in compilationException.CompilationFailures) - { - if (firstStackFrame) - { - firstStackFrame = false; - } - else - { - inlineSourceDiv.AppendLine("
"); - } - - BuildCodeSnippetDiv(failure, inlineSourceDiv, ref totalErrorsShown); - } - - wasSourceCodeWrittenOntoPage = totalErrorsShown > 0; - - builder.AppendFormat(CultureInfo.InvariantCulture, - _compilationExceptionFormatString, - inlineSourceDiv); - } - private static void WriteMessage(string message, StringBuilder builder) { // Build the
diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html b/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html deleted file mode 100644 index 76f56157ba..0000000000 --- a/src/Microsoft.AspNet.Hosting/compiler/resources/Compilation_Exception.html +++ /dev/null @@ -1,6 +0,0 @@ -
- One or more compilation errors occurred:
-
- {0} -
-
diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html index e7b4dc1bbd..c6b24c57e8 100644 --- a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html +++ b/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html @@ -75,11 +75,6 @@ background-color: #f6f6f6; } - .codeSnippet .error-message { - color: red; - font-weight: normal; - } - .codeSnippet div.filename { font-weight: bold; background-color: white; diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index c34f9fd752..4054e9c8a8 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -21,7 +21,6 @@ "Microsoft.Extensions.Configuration.Json": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "Microsoft.Extensions.Logging": "1.0.0-*", - "Microsoft.Extensions.CompilationAbstractions": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", "System.Diagnostics.DiagnosticSource": "4.0.0-*" }, From 8aa3fd6e9c0b4c307497b64be48241194d48cb19 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 9 Dec 2015 16:31:25 -0800 Subject: [PATCH 0924/1838] Use TypeNameHelper for pretty printing names --- .../Startup/StartupExceptionPage.cs | 47 ++----------------- src/Microsoft.AspNet.Hosting/project.json | 4 ++ 2 files changed, 7 insertions(+), 44 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs index a5f9dc1dbc..bed39a6241 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs @@ -12,6 +12,7 @@ using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; using System.Text; using System.Text.Encodings.Web; +using Microsoft.Extensions.Internal; using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Startup @@ -139,7 +140,7 @@ namespace Microsoft.AspNet.Hosting.Startup { return "(" + string.Join(", ", method.GetParameters().Select(p => { - Type parameterType = p.ParameterType; + var parameterType = p.ParameterType; return ((parameterType != null) ? PrettyPrintTypeName(parameterType) : "?") + " " + p.Name; })) + ")"; } @@ -215,50 +216,8 @@ namespace Microsoft.AspNet.Hosting.Startup return (didReadFailingLine) ? errorSubContents : null; } - private static string PrettyPrintTypeName(Type t) - { - try - { - RuntimeHelpers.EnsureSufficientExecutionStack(); + private static string PrettyPrintTypeName(Type type) => TypeNameHelper.GetTypeDisplayName(type, fullName: false); - var name = t.Name; - - // Degenerate case - if (string.IsNullOrEmpty(name)) - { - name = "?"; - } - - // Handle generic types - if (t.GetTypeInfo().IsGenericType) - { - // strip off the CLR generic type marker if it exists - var indexOfGenericTypeMarker = name.LastIndexOf('`'); - if (indexOfGenericTypeMarker >= 0) - { - name = name.Substring(0, indexOfGenericTypeMarker); - name += "<" + string.Join(", ", t.GetGenericArguments().Select(PrettyPrintTypeName)) + ">"; - } - } - - // Handle nested types - if (!t.IsGenericParameter) - { - var containerType = t.DeclaringType; - if (containerType != null) - { - name = PrettyPrintTypeName(containerType) + "." + name; - } - } - - return name; - } - catch - { - // If anything at all goes wrong, fall back to the full type name so that we don't crash the server. - return t.FullName; - } - } private static void SplitTypeIntoPrefixAndFriendlyName(Type type, out string prefix, out string friendlyName) { diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 4054e9c8a8..81c7525f8e 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -22,6 +22,10 @@ "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "Microsoft.Extensions.Logging": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", + "Microsoft.Extensions.TypeNameHelper.Sources": { + "version": "1.0.0-*", + "type": "build" + }, "System.Diagnostics.DiagnosticSource": "4.0.0-*" }, "frameworks": { From 5a8f1281e8e4137cf4befe4032747af8a3ccc767 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 11 Dec 2015 12:22:33 -0800 Subject: [PATCH 0925/1838] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From a4fec4943cbbaf88b675ad6319a19e7fb21263cd Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 11 Dec 2015 12:23:06 -0800 Subject: [PATCH 0926/1838] Updating to release NuGet.config. --- NuGet.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/NuGet.config b/NuGet.config index 03704957e8..9db87a421e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,7 +1,7 @@ - + - + \ No newline at end of file From 3325bfc653583c1e1bb76929dad9cdd003fd4ff2 Mon Sep 17 00:00:00 2001 From: Kiran Challa Date: Sat, 12 Dec 2015 22:12:01 -0800 Subject: [PATCH 0927/1838] Fix how we chose target runtime in deployers --- .../Deployers/ApplicationDeployer.cs | 23 ++-- .../Deployers/ApplicationDeployerFactory.cs | 5 - .../Deployers/MonoDeployer.cs | 128 ------------------ 3 files changed, 11 insertions(+), 145 deletions(-) delete mode 100644 src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index df1d0bcbe3..643c2d8310 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -103,27 +103,26 @@ namespace Microsoft.AspNet.Server.Testing string currentRuntimeBinPath = PlatformServices.Default.Runtime.RuntimePath; Logger.LogInformation($"Current runtime path is : {currentRuntimeBinPath}"); - var targetRuntimeName = new StringBuilder() + string targetRuntimeName; + if (DeploymentParameters.RuntimeFlavor == RuntimeFlavor.Mono) + { + targetRuntimeName = "dnx-mono"; + } + else + { + targetRuntimeName = new StringBuilder() .Append("dnx") .Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr") .Append($"-{OSPrefix}") .Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64") .ToString(); - - string targetRuntimeBinPath; - // Ex: When current runtime is Mono and the tests are being run for CoreClr - if (currentRuntimeBinPath.Contains("dnx-mono")) - { - targetRuntimeBinPath = currentRuntimeBinPath.Replace("dnx-mono", targetRuntimeName); } - else - { - targetRuntimeBinPath = Regex.Replace( + + var targetRuntimeBinPath = Regex.Replace( currentRuntimeBinPath, - "dnx-(clr|coreclr)-(win|linux|darwin)-(x86|x64)", + "dnx-(mono|((clr|coreclr)-(win|linux|darwin)-(x86|x64)))", targetRuntimeName, RegexOptions.IgnoreCase); - } var targetRuntimeBinDir = new DirectoryInfo(targetRuntimeBinPath); if (targetRuntimeBinDir == null || !targetRuntimeBinDir.Exists) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs index 2ceaa03eed..4e4ae9d1e0 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -29,11 +29,6 @@ namespace Microsoft.AspNet.Server.Testing throw new ArgumentNullException(nameof(logger)); } - if (deploymentParameters.RuntimeFlavor == RuntimeFlavor.Mono) - { - return new MonoDeployer(deploymentParameters, logger); - } - switch (deploymentParameters.ServerType) { case ServerType.IISExpress: diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs deleted file mode 100644 index 00e1d9b999..0000000000 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/MonoDeployer.cs +++ /dev/null @@ -1,128 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using Microsoft.Extensions.Logging; - -namespace Microsoft.AspNet.Server.Testing -{ - /// - /// Deployer for Kestrel on Mono. - /// - public class MonoDeployer : ApplicationDeployer - { - private Process _hostProcess; - - public MonoDeployer(DeploymentParameters deploymentParameters, ILogger logger) - : base(deploymentParameters, logger) - { - } - - public override DeploymentResult Deploy() - { - // Start timer - StartTimer(); - - var path = Environment.GetEnvironmentVariable("PATH"); - var runtimeBin = path.Split(new char[] { ':' }, StringSplitOptions.RemoveEmptyEntries). - Where(c => c.Contains("dnx-mono")).FirstOrDefault(); - - if (string.IsNullOrWhiteSpace(runtimeBin)) - { - throw new Exception("Runtime not detected on the machine."); - } - - var runtimeBinDir = new DirectoryInfo(runtimeBin); - ChosenRuntimePath = runtimeBinDir.FullName; - ChosenRuntimeName = runtimeBinDir.Parent.Name; - DeploymentParameters.DnxRuntime = ChosenRuntimeName; - - if (DeploymentParameters.PublishApplicationBeforeDeployment) - { - // We use full path to runtime to pack. - DnuPublish(); - } - - DeploymentParameters.EnvironmentVariables - .Add(new KeyValuePair("DNX_APPBASE", DeploymentParameters.ApplicationPath)); - - // Launch the host process. - var hostExitToken = StartMonoHost(); - - return new DeploymentResult - { - WebRootLocation = DeploymentParameters.ApplicationPath, - DeploymentParameters = DeploymentParameters, - ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint, - HostShutdownToken = hostExitToken - }; - } - - private CancellationToken StartMonoHost() - { - if (DeploymentParameters.ServerType != ServerType.Kestrel) - { - throw new InvalidOperationException("kestrel is the only valid ServerType for Mono"); - } - - var dnxPath = Path.Combine(ChosenRuntimePath, DnxCommandName); - var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" kestrel --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; - Logger.LogInformation($"Executing command {dnxPath} {dnxArgs}"); - - var startInfo = new ProcessStartInfo - { - FileName = dnxPath, - Arguments = dnxArgs, - UseShellExecute = false, - CreateNoWindow = true, - RedirectStandardError = true, - RedirectStandardOutput = true, - // Trying a work around for https://github.com/aspnet/Hosting/issues/140. - RedirectStandardInput = true - }; - - AddEnvironmentVariablesToProcess(startInfo); - - _hostProcess = new Process() { StartInfo = startInfo }; - _hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data ?? string.Empty); }; - _hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data ?? string.Empty); }; - _hostProcess.EnableRaisingEvents = true; - var hostExitTokenSource = new CancellationTokenSource(); - _hostProcess.Exited += (sender, e) => - { - TriggerHostShutdown(hostExitTokenSource); - }; - _hostProcess.Start(); - _hostProcess.BeginErrorReadLine(); - _hostProcess.BeginOutputReadLine(); - - if (_hostProcess.HasExited) - { - Logger.LogError("Host process {processName} exited with code {exitCode} or failed to start.", startInfo.FileName, _hostProcess.ExitCode); - throw new Exception("Failed to start host"); - } - - Logger.LogInformation("Started {fileName}. Process Id : {processId}", startInfo.FileName, _hostProcess.Id); - return hostExitTokenSource.Token; - } - - public override void Dispose() - { - ShutDownIfAnyHostProcess(_hostProcess); - - if (DeploymentParameters.PublishApplicationBeforeDeployment) - { - CleanPublishedOutput(); - } - - InvokeUserApplicationCleanup(); - - StopTimer(); - } - } -} \ No newline at end of file From 59b32934e322660983322ceccf37dfc48da56a7f Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 14 Dec 2015 08:27:59 -0800 Subject: [PATCH 0928/1838] Change Expires to DateTimeOffset --- src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs index d2785db947..5cf29be6a2 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Http /// Gets or sets the expiration date and time for the cookie. /// /// The expiration date and time for the cookie. - public DateTime? Expires { get; set; } + public DateTimeOffset? Expires { get; set; } /// /// Gets or sets a value that indicates whether to transmit the cookie using Secure Sockets Layer (SSL)�that is, over HTTPS only. From 455d86594828b471028db08976c03db2357ba3f2 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 14 Dec 2015 10:02:27 -0800 Subject: [PATCH 0929/1838] Fixing deadlock hang in test when running in single threaded environment --- src/Microsoft.AspNet.TestHost/ClientHandler.cs | 2 +- test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 30a48d38aa..0dac9f0546 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.TestHost } }); - return await state.ResponseTask; + return await state.ResponseTask.ConfigureAwait(false); } private class RequestState diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 80e0e44f0f..b923a10826 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -353,7 +353,7 @@ namespace Microsoft.AspNet.TestHost [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] - public void CancelAborts() + public async Task CancelAborts() { TestServer server = TestServer.Create(app => { @@ -365,7 +365,7 @@ namespace Microsoft.AspNet.TestHost }); }); - Assert.Throws(() => { string result = server.CreateClient().GetStringAsync("/path").Result; }); + await Assert.ThrowsAsync(async () => { string result = await server.CreateClient().GetStringAsync("/path"); }); } [ConditionalFact] From 5e837b4eef82a26e74b9ad1d0edddacea560a9ab Mon Sep 17 00:00:00 2001 From: Martin Johns Date: Mon, 7 Dec 2015 09:57:49 +0100 Subject: [PATCH 0930/1838] Reduce overuse of null-conditional operator --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 5c96962fb2..4157a831d5 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -88,14 +88,18 @@ namespace Microsoft.AspNet.Hosting _configureServices(services); } - if (PlatformServices.Default?.Application != null) + var defaultPlatformServices = PlatformServices.Default; + if (defaultPlatformServices != null) { - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Application)); - } + if (defaultPlatformServices.Application != null) + { + services.TryAdd(ServiceDescriptor.Instance(defaultPlatformServices.Application)); + } - if (PlatformServices.Default?.Runtime != null) - { - services.TryAdd(ServiceDescriptor.Instance(PlatformServices.Default.Runtime)); + if (defaultPlatformServices.Runtime != null) + { + services.TryAdd(ServiceDescriptor.Instance(defaultPlatformServices.Runtime)); + } } return services; From c41be75796d9c81d9dde079c45958a2d54c31a63 Mon Sep 17 00:00:00 2001 From: Brennan Date: Mon, 14 Dec 2015 13:22:42 -0800 Subject: [PATCH 0931/1838] Wrap Branch in try finally --- .../Extensions/MapMiddleware.cs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs index 2b2c80b06f..1c66aea8e0 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs @@ -57,10 +57,15 @@ namespace Microsoft.AspNet.Builder.Extensions context.Request.PathBase = pathBase + _options.PathMatch; context.Request.Path = remainingPath; - await _options.Branch(context); - - context.Request.PathBase = pathBase; - context.Request.Path = path; + try + { + await _options.Branch(context); + } + finally + { + context.Request.PathBase = pathBase; + context.Request.Path = path; + } } else { From 67c5ec29b3d31779cbebdbd1e9501b3b3d1db9c4 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Sun, 6 Dec 2015 23:18:41 +0000 Subject: [PATCH 0932/1838] Allow feature cache to be updated+invalidated --- .../DefaultAuthenticationManager.cs | 31 ++-- .../DefaultConnectionInfo.cs | 26 ++- .../DefaultHttpContext.cs | 49 ++++-- .../DefaultHttpRequest.cs | 30 +++- .../DefaultHttpResponse.cs | 26 ++- .../DefaultWebSocketManager.cs | 24 ++- .../Features/FeatureHelpers.cs | 15 +- .../Features/IFeatureCache.cs | 1 + .../Features/QueryFeature.cs | 8 +- .../Features/RequestCookiesFeature.cs | 8 +- .../Features/ResponseCookiesFeature.cs | 8 +- .../DefaultHttpContextTests.cs | 151 ++++++++++++++++++ 12 files changed, 330 insertions(+), 47 deletions(-) diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index 545f3d03d5..ba239a6c47 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -14,27 +14,43 @@ namespace Microsoft.AspNet.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache { - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpAuthenticationFeature _authentication; - private IHttpResponseFeature _response; public DefaultAuthenticationManager(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _authentication = null; - _response = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _authentication = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpAuthenticationFeature HttpAuthenticationFeature { get @@ -47,11 +63,6 @@ namespace Microsoft.AspNet.Http.Authentication.Internal } } - private IHttpResponseFeature HttpResponseFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } - } - public override IEnumerable GetAuthenticationSchemes() { var handler = HttpAuthenticationFeature.Handler; diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index c0fd423478..66fdbbe9b1 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -12,7 +12,7 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache { - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpConnectionFeature _connection; @@ -21,18 +21,36 @@ namespace Microsoft.AspNet.Http.Internal public DefaultConnectionInfo(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _connection = null; - _tlsConnection = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _connection = null; + _tlsConnection = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpConnectionFeature HttpConnectionFeature { get diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index f4c60fb951..9fcfd9685d 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -16,17 +16,18 @@ namespace Microsoft.AspNet.Http.Internal { public class DefaultHttpContext : HttpContext, IFeatureCache { - private readonly HttpRequest _request; - private readonly HttpResponse _response; - private ConnectionInfo _connection; - private AuthenticationManager _authenticationManager; + private readonly DefaultHttpRequest _request; + private readonly DefaultHttpResponse _response; + + private DefaultAuthenticationManager _authenticationManager; + private DefaultConnectionInfo _connection; + private DefaultWebSocketManager _websockets; private IItemsFeature _items; private IServiceProvidersFeature _serviceProviders; private IHttpAuthenticationFeature _authentication; private IHttpRequestLifetimeFeature _lifetime; private ISessionFeature _session; - private WebSocketManager _websockets; private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; @@ -36,6 +37,7 @@ namespace Microsoft.AspNet.Http.Internal { _features.Set(new HttpRequestFeature()); _features.Set(new HttpResponseFeature()); + ((IFeatureCache)this).SetFeaturesRevision(); } public DefaultHttpContext(IFeatureCollection features) @@ -43,21 +45,46 @@ namespace Microsoft.AspNet.Http.Internal _features = features; _request = new DefaultHttpRequest(this, features); _response = new DefaultHttpResponse(this, features); + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision !=_features.Revision) { - _items = null; - _serviceProviders = null; - _authentication = null; - _lifetime = null; - _session = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + + _request.UpdateFeatures(features); + _response.UpdateFeatures(features); + + _authenticationManager?.UpdateFeatures(features); + _connection?.UpdateFeatures(features); + _websockets?.UpdateFeatures(features); + } + + private void ResetFeatures() + { + _items = null; + _serviceProviders = null; + _authentication = null; + _lifetime = null; + _session = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + IItemsFeature ItemsFeature { get diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index d11e75bc03..caa34099e4 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.Http.Internal public class DefaultHttpRequest : HttpRequest, IFeatureCache { private readonly DefaultHttpContext _context; - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpRequestFeature _request; @@ -26,20 +26,38 @@ namespace Microsoft.AspNet.Http.Internal { _context = context; _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _request = null; - _query = null; - _form = null; - _cookies = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _request = null; + _query = null; + _form = null; + _cookies = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index f239261b6a..99783ce77d 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -13,7 +13,7 @@ namespace Microsoft.AspNet.Http.Internal public class DefaultHttpResponse : HttpResponse, IFeatureCache { private readonly DefaultHttpContext _context; - private readonly IFeatureCollection _features; + private IFeatureCollection _features; private int _cachedFeaturesRevision = -1; private IHttpResponseFeature _response; @@ -23,18 +23,36 @@ namespace Microsoft.AspNet.Http.Internal { _context = context; _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _response = null; - _cookies = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _response = null; + _cookies = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpResponseFeature HttpResponseFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index 454b0fa61f..d7b388fb62 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -21,18 +21,36 @@ namespace Microsoft.AspNet.Http.Internal public DefaultWebSocketManager(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() { if (_cachedFeaturesRevision != _features.Revision) { - _request = null; - _webSockets = null; - _cachedFeaturesRevision = _features.Revision; + ResetFeatures(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + + public void UpdateFeatures(IFeatureCollection features) + { + _features = features; + ResetFeatures(); + } + + private void ResetFeatures() + { + _request = null; + _webSockets = null; + + ((IFeatureCache)this).SetFeaturesRevision(); + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs index ca6d914ac1..86b033fd6b 100644 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs @@ -56,9 +56,10 @@ namespace Microsoft.AspNet.Http.Features if (obj == null) { obj = factory(); - cachedObject = obj; - features.Set(obj); } + cachedObject = obj; + features.Set(obj); + cache.SetFeaturesRevision(); } return obj; } @@ -79,9 +80,10 @@ namespace Microsoft.AspNet.Http.Features if (obj == null) { obj = factory(features); - cachedObject = obj; - features.Set(obj); } + cachedObject = obj; + features.Set(obj); + cache.SetFeaturesRevision(); } return obj; } @@ -103,9 +105,10 @@ namespace Microsoft.AspNet.Http.Features if (obj == null) { obj = factory(request); - cachedObject = obj; - features.Set(obj); } + cachedObject = obj; + features.Set(obj); + cache.SetFeaturesRevision(); } return obj; } diff --git a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs index 80db1ee3c8..14a220d8d5 100644 --- a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs +++ b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs @@ -6,5 +6,6 @@ namespace Microsoft.AspNet.Http.Features internal interface IFeatureCache { void CheckFeaturesRevision(); + void SetFeaturesRevision(); } } diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index e17e612533..6d404a54ae 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -35,6 +35,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() @@ -42,10 +43,15 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cachedFeaturesRevision != _features.Revision) { _request = null; - _cachedFeaturesRevision = _features.Revision; + ((IFeatureCache)this).SetFeaturesRevision(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index e759f1d2c6..811b3e836c 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -37,6 +37,7 @@ namespace Microsoft.AspNet.Http.Features.Internal } _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() @@ -44,10 +45,15 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cachedFeaturesRevision != _features.Revision) { _request = null; - _cachedFeaturesRevision = _features.Revision; + ((IFeatureCache)this).SetFeaturesRevision(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + private IHttpRequestFeature HttpRequestFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index dd7607a731..caea7e4ec0 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -16,6 +16,7 @@ namespace Microsoft.AspNet.Http.Features.Internal public ResponseCookiesFeature(IFeatureCollection features) { _features = features; + ((IFeatureCache)this).SetFeaturesRevision(); } void IFeatureCache.CheckFeaturesRevision() @@ -23,10 +24,15 @@ namespace Microsoft.AspNet.Http.Features.Internal if (_cachedFeaturesRevision != _features.Revision) { _response = null; - _cachedFeaturesRevision = _features.Revision; + ((IFeatureCache)this).SetFeaturesRevision(); } } + void IFeatureCache.SetFeaturesRevision() + { + _cachedFeaturesRevision = _features.Revision; + } + private IHttpResponseFeature HttpResponseFeature { get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 3d7305b89d..01fbd73d67 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -4,8 +4,11 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Net.WebSockets; +using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Authentication.Internal; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Xunit; @@ -146,6 +149,138 @@ namespace Microsoft.AspNet.Http.Internal items["foo"] = item; Assert.Same(item, context.Items["foo"]); } + + [Fact] + public void UpdateFeatures_ClearsCachedFeatures() + { + var features = new FeatureCollection(); + + var context = new DefaultHttpContext(features); + + var request = (DefaultHttpRequest)context.Request; + var response = (DefaultHttpResponse)context.Response; + + var authentication = (DefaultAuthenticationManager)context.Authentication; + var connection = (DefaultConnectionInfo)context.Connection; + var websockets = (DefaultWebSocketManager)context.WebSockets; + + Assert.Equal(0, features.Count()); + + TestCachedFeaturesAreNull(context.GetType(), context, features); + TestCachedFeaturesAreNull(request.GetType(), request, features); + TestCachedFeaturesAreNull(response.GetType(), response, features); + TestCachedFeaturesAreNull(authentication.GetType(), authentication, features); + TestCachedFeaturesAreNull(connection.GetType(), connection, features); + TestCachedFeaturesAreNull(websockets.GetType(), websockets, features); + + context.Session = new TestSession(); + features.Set(new HttpRequestFeature()); + features.Set(new HttpResponseFeature()); + features.Set(new TestHttpWebSocketFeature()); + + TestCachedFeaturesAreSet(context.GetType(), context, features); + TestCachedFeaturesAreSet(request.GetType(), request, features); + TestCachedFeaturesAreSet(response.GetType(), response, features); + TestCachedFeaturesAreSet(authentication.GetType(), authentication, features); + TestCachedFeaturesAreSet(connection.GetType(), connection, features); + TestCachedFeaturesAreSet(websockets.GetType(), websockets, features); + + Assert.NotEqual(0, features.Count()); + + var newFeatures = new FeatureCollection(); + context.UpdateFeatures(newFeatures); + + Assert.Equal(0, newFeatures.Count()); + + TestCachedFeaturesAreNull(context.GetType(), context, newFeatures); + TestCachedFeaturesAreNull(request.GetType(), request, newFeatures); + TestCachedFeaturesAreNull(response.GetType(), response, newFeatures); + TestCachedFeaturesAreNull(authentication.GetType(), authentication, newFeatures); + TestCachedFeaturesAreNull(connection.GetType(), connection, newFeatures); + TestCachedFeaturesAreNull(websockets.GetType(), websockets, newFeatures); + + context.Session = new TestSession(); + newFeatures.Set(new HttpRequestFeature()); + newFeatures.Set(new HttpResponseFeature()); + newFeatures.Set(new TestHttpWebSocketFeature()); + + TestCachedFeaturesAreSet(context.GetType(), context, newFeatures); + TestCachedFeaturesAreSet(request.GetType(), request, newFeatures); + TestCachedFeaturesAreSet(response.GetType(), response, newFeatures); + TestCachedFeaturesAreSet(authentication.GetType(), authentication, newFeatures); + TestCachedFeaturesAreSet(connection.GetType(), connection, newFeatures); + TestCachedFeaturesAreSet(websockets.GetType(), websockets, newFeatures); + + Assert.NotEqual(0, newFeatures.Count()); + } + + void TestCachedFeaturesAreNull(Type type, object value, IFeatureCollection features) + { + + var fields = type + .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) + .Where(f => f.FieldType.GetTypeInfo().IsInterface); + + foreach (var field in fields) + { + if (field.FieldType == typeof(IFeatureCollection)) + { + Assert.Same(features, field.GetValue(value)); + } + else + { + Assert.Null(field.GetValue(value)); + } + } + } + + void TestCachedFeaturesAreSet(Type type, object value, IFeatureCollection features) + { + var properties = type + .GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance) + .Where(p => p.PropertyType.GetTypeInfo().IsInterface); + + TestFeatureProperties(value, features, properties); + + var fields = type + .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) + .Where(f => f.FieldType.GetTypeInfo().IsInterface); + + foreach (var field in fields) + { + if (field.FieldType == typeof(IFeatureCollection)) + { + Assert.Same(features, field.GetValue(value)); + } + else + { + var v = field.GetValue(value); + Assert.Same(features[field.FieldType], v); + Assert.NotNull(v); + } + } + + } + + private static void TestFeatureProperties(object value, IFeatureCollection features, IEnumerable properties) + { + foreach (var property in properties) + { + if (property.PropertyType == typeof(IFeatureCollection)) + { + Assert.Same(features, property.GetValue(value)); + } + else + { + if (property.Name.Contains("Feature")) + { + var v = property.GetValue(value); + Assert.Same(features[property.PropertyType], v); + Assert.NotNull(v); + } + } + } + } private HttpContext CreateContext() { @@ -195,5 +330,21 @@ namespace Microsoft.AspNet.Http.Internal { public ISession Session { get; set; } } + + private class TestHttpWebSocketFeature : IHttpWebSocketFeature + { + public bool IsWebSocketRequest + { + get + { + throw new NotImplementedException(); + } + } + + public Task AcceptAsync(WebSocketAcceptContext context) + { + throw new NotImplementedException(); + } + } } } \ No newline at end of file From 0e3fe7493e098f2940630fd24adf4157e461efd4 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 20:01:55 -0800 Subject: [PATCH 0933/1838] Streamlining feature cache and object re-initialiation code paths Shouldn't increase object size, but does improve maintainability --- .../FeatureReferences.cs | 57 ++++ .../DefaultAuthenticationManager.cs | 47 +--- .../DefaultConnectionInfo.cs | 68 ++--- .../DefaultHttpContext.cs | 248 +++++++----------- .../DefaultHttpRequest.cs | 105 ++------ .../DefaultHttpResponse.cs | 71 ++--- .../DefaultWebSocketManager.cs | 54 ++-- .../Features/FeatureHelpers.cs | 116 -------- .../Features/IFeatureCache.cs | 11 - .../Features/QueryFeature.cs | 34 +-- .../Features/RequestCookiesFeature.cs | 35 +-- .../Features/ResponseCookiesFeature.cs | 30 +-- .../DefaultHttpContextTests.cs | 94 ++++--- 13 files changed, 309 insertions(+), 661 deletions(-) create mode 100644 src/Microsoft.AspNet.Http.Features/FeatureReferences.cs delete mode 100644 src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs delete mode 100644 src/Microsoft.AspNet.Http/Features/IFeatureCache.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs new file mode 100644 index 0000000000..75fcacc0db --- /dev/null +++ b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs @@ -0,0 +1,57 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.AspNet.Http.Features +{ + public struct FeatureReferences + { + public FeatureReferences(IFeatureCollection collection) + { + Collection = collection; + Cache = default(TCache); + Revision = collection.Revision; + } + + public readonly IFeatureCollection Collection; + public int Revision; + public TCache Cache; + + public TFeature Fetch( + ref TFeature cached, + TState state, + Func factory) + { + var cleared = false; + if (Revision != Collection.Revision) + { + cleared = true; + Cache = default(TCache); + Revision = Collection.Revision; + } + + var feature = cached; + if (feature == null) + { + feature = Collection.Get(); + if (feature == null) + { + feature = factory(state); + + Collection.Set(feature); + if (!cleared) + { + Cache = default(TCache); + } + Revision = Collection.Revision; + } + cached = feature; + } + return feature; + } + + public TFeature Fetch(ref TFeature cached, Func factory) => + Fetch(ref cached, Collection, factory); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs index ba239a6c47..0c8db87453 100644 --- a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs @@ -12,56 +12,27 @@ using Microsoft.AspNet.Http.Features.Authentication.Internal; namespace Microsoft.AspNet.Http.Authentication.Internal { - public class DefaultAuthenticationManager : AuthenticationManager, IFeatureCache + public class DefaultAuthenticationManager : AuthenticationManager { - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpAuthenticationFeature _authentication; + private FeatureReferences _features; public DefaultAuthenticationManager(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize(IFeatureCollection features) { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _features = new FeatureReferences(features); } - void IFeatureCache.SetFeaturesRevision() + public virtual void Uninitialize() { - _cachedFeaturesRevision = _features.Revision; + _features = default(FeatureReferences); } - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } - - private void ResetFeatures() - { - _authentication = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpAuthenticationFeature HttpAuthenticationFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpAuthenticationFeature(), - ref _authentication); - } - } + private IHttpAuthenticationFeature HttpAuthenticationFeature => + _features.Fetch(ref _features.Cache, f => new HttpAuthenticationFeature()); public override IEnumerable GetAuthenticationSchemes() { diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index 66fdbbe9b1..dd19f7d286 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -10,70 +10,30 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultConnectionInfo : ConnectionInfo, IFeatureCache + public class DefaultConnectionInfo : ConnectionInfo { - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpConnectionFeature _connection; - private ITlsConnectionFeature _tlsConnection; + private FeatureReferences _features; public DefaultConnectionInfo(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize( IFeatureCollection features) { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _features = new FeatureReferences(features); } - void IFeatureCache.SetFeaturesRevision() + public virtual void Uninitialize() { - _cachedFeaturesRevision = _features.Revision; + _features = default(FeatureReferences); } - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } + private IHttpConnectionFeature HttpConnectionFeature => + _features.Fetch(ref _features.Cache.Connection, f => new HttpConnectionFeature()); - private void ResetFeatures() - { - _connection = null; - _tlsConnection = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpConnectionFeature HttpConnectionFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpConnectionFeature(), - ref _connection); - } - } - - private ITlsConnectionFeature TlsConnectionFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new TlsConnectionFeature(), - ref _tlsConnection); - } - } + private ITlsConnectionFeature TlsConnectionFeature=> + _features.Fetch(ref _features.Cache.TlsConnection, f => new TlsConnectionFeature()); public override IPAddress RemoteIpAddress { @@ -115,5 +75,11 @@ namespace Microsoft.AspNet.Http.Internal { return TlsConnectionFeature.GetClientCertificateAsync(cancellationToken); } + + struct FeatureInterfaces + { + public IHttpConnectionFeature Connection; + public ITlsConnectionFeature TlsConnection; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs index 9fcfd9685d..9cc4211c9f 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpContext.cs @@ -14,173 +14,99 @@ using Microsoft.AspNet.Http.Features.Internal; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpContext : HttpContext, IFeatureCache + public class DefaultHttpContext : HttpContext { - private readonly DefaultHttpRequest _request; - private readonly DefaultHttpResponse _response; + private FeatureReferences _features; - private DefaultAuthenticationManager _authenticationManager; - private DefaultConnectionInfo _connection; - private DefaultWebSocketManager _websockets; - - private IItemsFeature _items; - private IServiceProvidersFeature _serviceProviders; - private IHttpAuthenticationFeature _authentication; - private IHttpRequestLifetimeFeature _lifetime; - private ISessionFeature _session; - - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; + private HttpRequest _request; + private HttpResponse _response; + private AuthenticationManager _authenticationManager; + private ConnectionInfo _connection; + private WebSocketManager _websockets; public DefaultHttpContext() : this(new FeatureCollection()) { - _features.Set(new HttpRequestFeature()); - _features.Set(new HttpResponseFeature()); - ((IFeatureCache)this).SetFeaturesRevision(); + Features.Set(new HttpRequestFeature()); + Features.Set(new HttpResponseFeature()); } public DefaultHttpContext(IFeatureCollection features) { - _features = features; - _request = new DefaultHttpRequest(this, features); - _response = new DefaultHttpResponse(this, features); - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize(IFeatureCollection features) { - if (_cachedFeaturesRevision !=_features.Revision) + _features = new FeatureReferences(features); + _request = InitializeHttpRequest(); + _response = InitializeHttpResponse(); + } + + public virtual void Uninitialize() + { + _features = default(FeatureReferences); + if (_request != null) { - ResetFeatures(); + UninitializeHttpRequest(_request); + _request = null; } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - - _request.UpdateFeatures(features); - _response.UpdateFeatures(features); - - _authenticationManager?.UpdateFeatures(features); - _connection?.UpdateFeatures(features); - _websockets?.UpdateFeatures(features); - } - - private void ResetFeatures() - { - _items = null; - _serviceProviders = null; - _authentication = null; - _lifetime = null; - _session = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - IItemsFeature ItemsFeature - { - get + if (_response != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new ItemsFeature(), - ref _items); + UninitializeHttpResponse(_response); + _response = null; } - } - - IServiceProvidersFeature ServiceProvidersFeature - { - get + if (_authenticationManager != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new ServiceProvidersFeature(), - ref _serviceProviders); + UninitializeAuthenticationManager(_authenticationManager); + _authenticationManager = null; } - } - - private IHttpAuthenticationFeature HttpAuthenticationFeature - { - get + if (_connection != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpAuthenticationFeature(), - ref _authentication); + UninitializeConnectionInfo(_connection); + _connection = null; } - } - - private IHttpRequestLifetimeFeature LifetimeFeature - { - get + if (_websockets != null) { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - () => new HttpRequestLifetimeFeature(), - ref _lifetime); + UninitializeWebSocketManager(_websockets); + _websockets = null; } } + + private IItemsFeature ItemsFeature => + _features.Fetch(ref _features.Cache.Items, f => new ItemsFeature()); - private ISessionFeature SessionFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _session); } - set - { - _features.Set(value); - _session = value; - } - } + private IServiceProvidersFeature ServiceProvidersFeature => + _features.Fetch(ref _features.Cache.ServiceProviders, f => new ServiceProvidersFeature()); - private IHttpRequestIdentifierFeature RequestIdentifierFeature - { - get { - return FeatureHelpers.GetOrCreate( - _features, - () => new HttpRequestIdentifierFeature()); - } - } + private IHttpAuthenticationFeature HttpAuthenticationFeature => + _features.Fetch(ref _features.Cache.Authentication, f => new HttpAuthenticationFeature()); - public override IFeatureCollection Features { get { return _features; } } + private IHttpRequestLifetimeFeature LifetimeFeature => + _features.Fetch(ref _features.Cache.Lifetime, f => new HttpRequestLifetimeFeature()); - public override HttpRequest Request { get { return _request; } } + private ISessionFeature SessionFeature => + _features.Fetch(ref _features.Cache.Session, f => new DefaultSessionFeature()); - public override HttpResponse Response { get { return _response; } } + private ISessionFeature SessionFeatureOrNull => + _features.Fetch(ref _features.Cache.Session, f => null); - public override ConnectionInfo Connection - { - get - { - if (_connection == null) - { - _connection = new DefaultConnectionInfo(_features); - } - return _connection; - } - } - public override AuthenticationManager Authentication - { - get - { - if (_authenticationManager == null) - { - _authenticationManager = new DefaultAuthenticationManager(_features); - } - return _authenticationManager; - } - } + private IHttpRequestIdentifierFeature RequestIdentifierFeature => + _features.Fetch(ref _features.Cache.RequestIdentifier, f => new HttpRequestIdentifierFeature()); + + public override IFeatureCollection Features => _features.Collection; + + public override HttpRequest Request => _request; + + public override HttpResponse Response => _response; + + public override ConnectionInfo Connection => _connection ?? (_connection = InitializeConnectionInfo()); + + public override AuthenticationManager Authentication => _authenticationManager ?? (_authenticationManager = InitializeAuthenticationManager()); + + public override WebSocketManager WebSockets => _websockets ?? (_websockets = InitializeWebSocketManager()); + public override ClaimsPrincipal User { @@ -225,7 +151,7 @@ namespace Microsoft.AspNet.Http.Internal { get { - var feature = SessionFeature; + var feature = SessionFeatureOrNull; if (feature == null) { throw new InvalidOperationException("Session has not been configured for this application " + @@ -235,31 +161,41 @@ namespace Microsoft.AspNet.Http.Internal } set { - var feature = SessionFeature; - if (feature == null) - { - feature = new DefaultSessionFeature(); - SessionFeature = feature; - } - feature.Session = value; + SessionFeature.Session = value; } } - public override WebSocketManager WebSockets - { - get - { - if (_websockets == null) - { - _websockets = new DefaultWebSocketManager(_features); - } - return _websockets; - } - } + public override void Abort() { LifetimeFeature.Abort(); } + + + protected virtual HttpRequest InitializeHttpRequest() => new DefaultHttpRequest(this, Features); + protected virtual void UninitializeHttpRequest(HttpRequest instance) { } + + protected virtual HttpResponse InitializeHttpResponse() => new DefaultHttpResponse(this, Features); + protected virtual void UninitializeHttpResponse(HttpResponse instance) { } + + protected virtual ConnectionInfo InitializeConnectionInfo() => new DefaultConnectionInfo(Features); + protected virtual void UninitializeConnectionInfo(ConnectionInfo instance) { } + + protected virtual AuthenticationManager InitializeAuthenticationManager() => new DefaultAuthenticationManager(Features); + protected virtual void UninitializeAuthenticationManager(AuthenticationManager instance) { } + + protected virtual WebSocketManager InitializeWebSocketManager() => new DefaultWebSocketManager(Features); + protected virtual void UninitializeWebSocketManager(WebSocketManager instance) { } + + struct FeatureInterfaces + { + public IItemsFeature Items; + public IServiceProvidersFeature ServiceProviders; + public IHttpAuthenticationFeature Authentication; + public IHttpRequestLifetimeFeature Lifetime; + public ISessionFeature Session; + public IHttpRequestIdentifierFeature RequestIdentifier; + } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index caa34099e4..e03f93c83c 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -11,96 +11,41 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpRequest : HttpRequest, IFeatureCache + public class DefaultHttpRequest : HttpRequest { - private readonly DefaultHttpContext _context; - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; - private IQueryFeature _query; - private IFormFeature _form; - private IRequestCookiesFeature _cookies; + private HttpContext _context; + private FeatureReferences _features; public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) + { + Initialize(context, features); + } + + public virtual void Initialize(HttpContext context, IFeatureCollection features) { _context = context; - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Uninitialize() { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _context = null; + _features = default(FeatureReferences); } - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } + public override HttpContext HttpContext => _context; - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache.Request, f => null); - private void ResetFeatures() - { - _request = null; - _query = null; - _form = null; - _cookies = null; + private IQueryFeature QueryFeature => + _features.Fetch(ref _features.Cache.Query, f => new QueryFeature(f)); - ((IFeatureCache)this).SetFeaturesRevision(); - } + private IFormFeature FormFeature => + _features.Fetch(ref _features.Cache.Form, this, self => new FormFeature(self)); - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } - - private IQueryFeature QueryFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - (f) => new QueryFeature(f), - ref _query); - } - } - - private IFormFeature FormFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - this, - (r) => new FormFeature(r), - ref _form); - } - } - - private IRequestCookiesFeature RequestCookiesFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - (f) => new RequestCookiesFeature(f), - ref _cookies); - } - } - - public override HttpContext HttpContext { get { return _context; } } + private IRequestCookiesFeature RequestCookiesFeature => + _features.Fetch(ref _features.Cache.Cookies, f => new RequestCookiesFeature(f)); public override PathString PathBase { @@ -206,5 +151,13 @@ namespace Microsoft.AspNet.Http.Internal { return FormFeature.ReadFormAsync(cancellationToken); } + + struct FeatureInterfaces + { + public IHttpRequestFeature Request; + public IQueryFeature Query; + public IFormFeature Form; + public IRequestCookiesFeature Cookies; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 99783ce77d..901e17cbfe 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -10,65 +10,34 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultHttpResponse : HttpResponse, IFeatureCache + public class DefaultHttpResponse : HttpResponse { - private readonly DefaultHttpContext _context; - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpResponseFeature _response; - private IResponseCookiesFeature _cookies; + private HttpContext _context; + private FeatureReferences _features; public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) + { + Initialize(context, features); + } + + public virtual void Initialize(HttpContext context, IFeatureCollection features) { _context = context; - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Uninitialize() { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _context = null; + _features = default(FeatureReferences); } - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } + private IHttpResponseFeature HttpResponseFeature => + _features.Fetch(ref _features.Cache.Response, f => null); - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } - - private void ResetFeatures() - { - _response = null; - _cookies = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpResponseFeature HttpResponseFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } - } - - private IResponseCookiesFeature ResponseCookiesFeature - { - get - { - return FeatureHelpers.GetOrCreateAndCache( - this, - _features, - (f) => new ResponseCookiesFeature(f), - ref _cookies); - } - } + private IResponseCookiesFeature ResponseCookiesFeature => + _features.Fetch(ref _features.Cache.Cookies, f => new ResponseCookiesFeature(f)); + public override HttpContext HttpContext { get { return _context; } } @@ -163,5 +132,11 @@ namespace Microsoft.AspNet.Http.Internal Headers[HeaderNames.Location] = location; } + + struct FeatureInterfaces + { + public IHttpResponseFeature Response; + public IResponseCookiesFeature Cookies; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs index d7b388fb62..8beff4db9a 100644 --- a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs @@ -10,56 +10,30 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Internal { - public class DefaultWebSocketManager : WebSocketManager, IFeatureCache + public class DefaultWebSocketManager : WebSocketManager { - private IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; - private IHttpWebSocketFeature _webSockets; + private FeatureReferences _features; public DefaultWebSocketManager(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + Initialize(features); } - void IFeatureCache.CheckFeaturesRevision() + public virtual void Initialize(IFeatureCollection features) { - if (_cachedFeaturesRevision != _features.Revision) - { - ResetFeatures(); - } + _features = new FeatureReferences(features); } - void IFeatureCache.SetFeaturesRevision() + public virtual void Uninitialize() { - _cachedFeaturesRevision = _features.Revision; + _features = default(FeatureReferences); } - public void UpdateFeatures(IFeatureCollection features) - { - _features = features; - ResetFeatures(); - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache.Request, f => null); - private void ResetFeatures() - { - _request = null; - _webSockets = null; - - ((IFeatureCache)this).SetFeaturesRevision(); - } - - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } - - private IHttpWebSocketFeature WebSocketFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _webSockets); } - } + private IHttpWebSocketFeature WebSocketFeature => + _features.Fetch(ref _features.Cache.WebSockets, f => null); public override bool IsWebSocketRequest { @@ -85,5 +59,11 @@ namespace Microsoft.AspNet.Http.Internal } return WebSocketFeature.AcceptAsync(new WebSocketAcceptContext() { SubProtocol = subProtocol }); } + + struct FeatureInterfaces + { + public IHttpRequestFeature Request; + public IHttpWebSocketFeature WebSockets; + } } } diff --git a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs b/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs deleted file mode 100644 index 86b033fd6b..0000000000 --- a/src/Microsoft.AspNet.Http/Features/FeatureHelpers.cs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Http.Features -{ - internal static class FeatureHelpers - { - public static T GetAndCache( - IFeatureCache cache, - IFeatureCollection features, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - cachedObject = obj; - } - return obj; - } - - public static T GetOrCreate( - IFeatureCollection features, - Func factory) - where T : class - { - T obj = features.Get(); - if (obj == null) - { - obj = factory(); - features.Set(obj); - } - - return obj; - } - - - public static T GetOrCreateAndCache( - IFeatureCache cache, - IFeatureCollection features, - Func factory, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - if (obj == null) - { - obj = factory(); - } - cachedObject = obj; - features.Set(obj); - cache.SetFeaturesRevision(); - } - return obj; - } - - public static T GetOrCreateAndCache( - IFeatureCache cache, - IFeatureCollection features, - Func factory, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - if (obj == null) - { - obj = factory(features); - } - cachedObject = obj; - features.Set(obj); - cache.SetFeaturesRevision(); - } - return obj; - } - - public static T GetOrCreateAndCache( - IFeatureCache cache, - IFeatureCollection features, - HttpRequest request, - Func factory, - ref T cachedObject) - where T : class - { - cache.CheckFeaturesRevision(); - - T obj = cachedObject; - if (obj == null) - { - obj = features.Get(); - if (obj == null) - { - obj = factory(request); - } - cachedObject = obj; - features.Set(obj); - cache.SetFeaturesRevision(); - } - return obj; - } - } -} diff --git a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs b/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs deleted file mode 100644 index 14a220d8d5..0000000000 --- a/src/Microsoft.AspNet.Http/Features/IFeatureCache.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http.Features -{ - internal interface IFeatureCache - { - void CheckFeaturesRevision(); - void SetFeaturesRevision(); - } -} diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs index 6d404a54ae..73450ad58f 100644 --- a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/QueryFeature.cs @@ -7,12 +7,9 @@ using Microsoft.AspNet.WebUtilities; namespace Microsoft.AspNet.Http.Features.Internal { - public class QueryFeature : IQueryFeature, IFeatureCache + public class QueryFeature : IQueryFeature { - private readonly IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; + private FeatureReferences _features; private string _original; private IQueryCollection _parsedValues; @@ -34,34 +31,17 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new ArgumentNullException(nameof(features)); } - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() - { - if (_cachedFeaturesRevision != _features.Revision) - { - _request = null; - ((IFeatureCache)this).SetFeaturesRevision(); - } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache, f => null); public IQueryCollection Query { get { - if (_features == null) + if (_features.Collection == null) { if (_parsedValues == null) { @@ -91,7 +71,7 @@ namespace Microsoft.AspNet.Http.Features.Internal set { _parsedValues = value; - if (_features != null) + if (_features.Collection != null) { if (value == null) { diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs index 811b3e836c..4fb087e9ab 100644 --- a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs @@ -9,13 +9,9 @@ using Microsoft.Net.Http.Headers; namespace Microsoft.AspNet.Http.Features.Internal { - public class RequestCookiesFeature : IRequestCookiesFeature, IFeatureCache + public class RequestCookiesFeature : IRequestCookiesFeature { - private readonly IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpRequestFeature _request; - + private FeatureReferences _features; private StringValues _original; private IRequestCookieCollection _parsedValues; @@ -36,34 +32,17 @@ namespace Microsoft.AspNet.Http.Features.Internal throw new ArgumentNullException(nameof(features)); } - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() - { - if (_cachedFeaturesRevision != _features.Revision) - { - _request = null; - ((IFeatureCache)this).SetFeaturesRevision(); - } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - private IHttpRequestFeature HttpRequestFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _request); } - } + private IHttpRequestFeature HttpRequestFeature => + _features.Fetch(ref _features.Cache, f => null); public IRequestCookieCollection Cookies { get { - if (_features == null) + if (_features.Collection == null) { if (_parsedValues == null) { @@ -91,7 +70,7 @@ namespace Microsoft.AspNet.Http.Features.Internal { _parsedValues = value; _original = StringValues.Empty; - if (_features != null) + if (_features.Collection != null) { if (_parsedValues == null || _parsedValues.Count == 0) { diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs index caea7e4ec0..0c87dc2833 100644 --- a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs @@ -5,38 +5,18 @@ using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { - public class ResponseCookiesFeature : IResponseCookiesFeature, IFeatureCache + public class ResponseCookiesFeature : IResponseCookiesFeature { - private readonly IFeatureCollection _features; - private int _cachedFeaturesRevision = -1; - - private IHttpResponseFeature _response; + private FeatureReferences _features; private IResponseCookies _cookiesCollection; public ResponseCookiesFeature(IFeatureCollection features) { - _features = features; - ((IFeatureCache)this).SetFeaturesRevision(); + _features = new FeatureReferences(features); } - void IFeatureCache.CheckFeaturesRevision() - { - if (_cachedFeaturesRevision != _features.Revision) - { - _response = null; - ((IFeatureCache)this).SetFeaturesRevision(); - } - } - - void IFeatureCache.SetFeaturesRevision() - { - _cachedFeaturesRevision = _features.Revision; - } - - private IHttpResponseFeature HttpResponseFeature - { - get { return FeatureHelpers.GetAndCache(this, _features, ref _response); } - } + private IHttpResponseFeature HttpResponseFeature => + _features.Fetch(ref _features.Cache, f => null); public IResponseCookies Cookies { diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index 01fbd73d67..a3239619a2 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -154,68 +154,63 @@ namespace Microsoft.AspNet.Http.Internal public void UpdateFeatures_ClearsCachedFeatures() { var features = new FeatureCollection(); - - var context = new DefaultHttpContext(features); - - var request = (DefaultHttpRequest)context.Request; - var response = (DefaultHttpResponse)context.Response; - - var authentication = (DefaultAuthenticationManager)context.Authentication; - var connection = (DefaultConnectionInfo)context.Connection; - var websockets = (DefaultWebSocketManager)context.WebSockets; - - Assert.Equal(0, features.Count()); - - TestCachedFeaturesAreNull(context.GetType(), context, features); - TestCachedFeaturesAreNull(request.GetType(), request, features); - TestCachedFeaturesAreNull(response.GetType(), response, features); - TestCachedFeaturesAreNull(authentication.GetType(), authentication, features); - TestCachedFeaturesAreNull(connection.GetType(), connection, features); - TestCachedFeaturesAreNull(websockets.GetType(), websockets, features); - - context.Session = new TestSession(); features.Set(new HttpRequestFeature()); features.Set(new HttpResponseFeature()); features.Set(new TestHttpWebSocketFeature()); - TestCachedFeaturesAreSet(context.GetType(), context, features); - TestCachedFeaturesAreSet(request.GetType(), request, features); - TestCachedFeaturesAreSet(response.GetType(), response, features); - TestCachedFeaturesAreSet(authentication.GetType(), authentication, features); - TestCachedFeaturesAreSet(connection.GetType(), connection, features); - TestCachedFeaturesAreSet(websockets.GetType(), websockets, features); + var context = new DefaultHttpContext(features); - Assert.NotEqual(0, features.Count()); - - var newFeatures = new FeatureCollection(); - context.UpdateFeatures(newFeatures); - - Assert.Equal(0, newFeatures.Count()); - - TestCachedFeaturesAreNull(context.GetType(), context, newFeatures); - TestCachedFeaturesAreNull(request.GetType(), request, newFeatures); - TestCachedFeaturesAreNull(response.GetType(), response, newFeatures); - TestCachedFeaturesAreNull(authentication.GetType(), authentication, newFeatures); - TestCachedFeaturesAreNull(connection.GetType(), connection, newFeatures); - TestCachedFeaturesAreNull(websockets.GetType(), websockets, newFeatures); + Assert.Equal(3, features.Count()); + TestCachedFeaturesAreNull(context, features); + TestCachedFeaturesAreNull(context.Request, features); + TestCachedFeaturesAreNull(context.Response, features); + TestCachedFeaturesAreNull(context.Authentication, features); + TestCachedFeaturesAreNull(context.Connection, features); + TestCachedFeaturesAreNull(context.WebSockets, features); + context.Session = new TestSession(); + + TestCachedFeaturesAreSet(context, features); + TestCachedFeaturesAreSet(context.Request, features); + TestCachedFeaturesAreSet(context.Response, features); + TestCachedFeaturesAreSet(context.Authentication, features); + TestCachedFeaturesAreSet(context.Connection, features); + TestCachedFeaturesAreSet(context.WebSockets, features); + + Assert.NotEqual(3, features.Count()); + + context.Uninitialize(); + var newFeatures = new FeatureCollection(); newFeatures.Set(new HttpRequestFeature()); newFeatures.Set(new HttpResponseFeature()); newFeatures.Set(new TestHttpWebSocketFeature()); + context.Initialize(newFeatures); - TestCachedFeaturesAreSet(context.GetType(), context, newFeatures); - TestCachedFeaturesAreSet(request.GetType(), request, newFeatures); - TestCachedFeaturesAreSet(response.GetType(), response, newFeatures); - TestCachedFeaturesAreSet(authentication.GetType(), authentication, newFeatures); - TestCachedFeaturesAreSet(connection.GetType(), connection, newFeatures); - TestCachedFeaturesAreSet(websockets.GetType(), websockets, newFeatures); + Assert.Equal(3, newFeatures.Count()); - Assert.NotEqual(0, newFeatures.Count()); + TestCachedFeaturesAreNull(context, newFeatures); + TestCachedFeaturesAreNull(context.Request, newFeatures); + TestCachedFeaturesAreNull(context.Response, newFeatures); + TestCachedFeaturesAreNull(context.Authentication, newFeatures); + TestCachedFeaturesAreNull(context.Connection, newFeatures); + TestCachedFeaturesAreNull(context.WebSockets, newFeatures); + + context.Session = new TestSession(); + + TestCachedFeaturesAreSet(context, newFeatures); + TestCachedFeaturesAreSet(context.Request, newFeatures); + TestCachedFeaturesAreSet(context.Response, newFeatures); + TestCachedFeaturesAreSet(context.Authentication, newFeatures); + TestCachedFeaturesAreSet(context.Connection, newFeatures); + TestCachedFeaturesAreSet(context.WebSockets, newFeatures); + + Assert.NotEqual(3, newFeatures.Count()); } - void TestCachedFeaturesAreNull(Type type, object value, IFeatureCollection features) + void TestCachedFeaturesAreNull(object value, IFeatureCollection features) { + var type = value.GetType(); var fields = type .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) @@ -234,8 +229,10 @@ namespace Microsoft.AspNet.Http.Internal } } - void TestCachedFeaturesAreSet(Type type, object value, IFeatureCollection features) + void TestCachedFeaturesAreSet(object value, IFeatureCollection features) { + var type = value.GetType(); + var properties = type .GetProperties(BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance) .Where(p => p.PropertyType.GetTypeInfo().IsInterface); @@ -274,6 +271,7 @@ namespace Microsoft.AspNet.Http.Internal { if (property.Name.Contains("Feature")) { + Console.WriteLine($"{value.GetType().Name} {property.Name}"); var v = property.GetValue(value); Assert.Same(features[property.PropertyType], v); Assert.NotNull(v); From c05c203c289ebc38dfbb7496199b6baad7d1bb75 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:02:05 -0800 Subject: [PATCH 0934/1838] Adding example of what http context pooling might look like --- samples/SampleApp/PooledHttpContext.cs | 54 +++++++++++++++ samples/SampleApp/PooledHttpContextFactory.cs | 65 +++++++++++++++++++ .../DefaultHttpRequest.cs | 2 +- .../DefaultHttpResponse.cs | 2 +- 4 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 samples/SampleApp/PooledHttpContext.cs create mode 100644 samples/SampleApp/PooledHttpContextFactory.cs diff --git a/samples/SampleApp/PooledHttpContext.cs b/samples/SampleApp/PooledHttpContext.cs new file mode 100644 index 0000000000..7736085eac --- /dev/null +++ b/samples/SampleApp/PooledHttpContext.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Http.Internal; + +namespace SampleApp +{ + public class PooledHttpContext : DefaultHttpContext + { + DefaultHttpRequest _pooledHttpRequest; + DefaultHttpResponse _pooledHttpResponse; + + public PooledHttpContext(IFeatureCollection featureCollection) : + base(featureCollection) + { + } + + protected override HttpRequest InitializeHttpRequest() + { + if (_pooledHttpRequest != null) + { + _pooledHttpRequest.Initialize(this, Features); + return _pooledHttpRequest; + } + + return new DefaultHttpRequest(this, Features); + } + + protected override void UninitializeHttpRequest(HttpRequest instance) + { + _pooledHttpRequest = instance as DefaultHttpRequest; + _pooledHttpRequest?.Uninitialize(); + } + + protected override HttpResponse InitializeHttpResponse() + { + if (_pooledHttpResponse != null) + { + _pooledHttpResponse.Initialize(this, Features); + return _pooledHttpResponse; + } + + return new DefaultHttpResponse(this, Features); + } + + protected override void UninitializeHttpResponse(HttpResponse instance) + { + _pooledHttpResponse = instance as DefaultHttpResponse; + _pooledHttpResponse?.Uninitialize(); + } + } +} \ No newline at end of file diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs new file mode 100644 index 0000000000..62955d90f8 --- /dev/null +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -0,0 +1,65 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Http.Features; + +namespace SampleApp +{ + public class PooledHttpContextFactory : IHttpContextFactory + { + private readonly IHttpContextAccessor _httpContextAccessor; + private readonly Stack _pool = new Stack(); + + public PooledHttpContextFactory(IHttpContextAccessor httpContextAccessor) + { + _httpContextAccessor = httpContextAccessor; + } + + public HttpContext Create(IFeatureCollection featureCollection) + { + PooledHttpContext httpContext = null; + lock (_pool) + { + if (_pool.Count != 0) + { + httpContext = _pool.Pop(); + } + } + + if (httpContext == null) + { + httpContext = new PooledHttpContext(featureCollection); + } + else + { + httpContext.Initialize(featureCollection); + } + + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = httpContext; + } + return httpContext; + } + + public void Dispose(HttpContext httpContext) + { + if (_httpContextAccessor != null) + { + _httpContextAccessor.HttpContext = null; + } + + var pooled = httpContext as PooledHttpContext; + if (pooled != null) + { + pooled.Uninitialize(); + lock (_pool) + { + _pool.Push(pooled); + } + } + } + } +} diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index e03f93c83c..f8890e7345 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Http.Internal private HttpContext _context; private FeatureReferences _features; - public DefaultHttpRequest(DefaultHttpContext context, IFeatureCollection features) + public DefaultHttpRequest(HttpContext context, IFeatureCollection features) { Initialize(context, features); } diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs index 901e17cbfe..a9cb49cbdf 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs @@ -15,7 +15,7 @@ namespace Microsoft.AspNet.Http.Internal private HttpContext _context; private FeatureReferences _features; - public DefaultHttpResponse(DefaultHttpContext context, IFeatureCollection features) + public DefaultHttpResponse(HttpContext context, IFeatureCollection features) { Initialize(context, features); } From 4265855652a365f6e350f080a985cf3544441a55 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:35:41 -0800 Subject: [PATCH 0935/1838] PR feedback Adding comment about reason for public field --- .../FeatureReferences.cs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs index 75fcacc0db..30d7c3638f 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs @@ -14,9 +14,14 @@ namespace Microsoft.AspNet.Http.Features Revision = collection.Revision; } - public readonly IFeatureCollection Collection; - public int Revision; - public TCache Cache; + public IFeatureCollection Collection { get; private set; } + public int Revision { get; private set; } + + // cache is a public field because the code calling Fetch must + // be able to pass ref values that "dot through" the TCache struct memory, + // if it was a Property then that getter would return a copy of the memory + // preventing the use of "ref" + public TCache Cache; public TFeature Fetch( ref TFeature cached, From 290ff2a26829bf33750eb111e4558539de9077a8 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:37:07 -0800 Subject: [PATCH 0936/1838] PR feedback --- src/Microsoft.AspNet.Http/DefaultHttpRequest.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs index f8890e7345..5d3a2875f5 100644 --- a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs @@ -42,7 +42,7 @@ namespace Microsoft.AspNet.Http.Internal _features.Fetch(ref _features.Cache.Query, f => new QueryFeature(f)); private IFormFeature FormFeature => - _features.Fetch(ref _features.Cache.Form, this, self => new FormFeature(self)); + _features.Fetch(ref _features.Cache.Form, this, f => new FormFeature(f)); private IRequestCookiesFeature RequestCookiesFeature => _features.Fetch(ref _features.Cache.Cookies, f => new RequestCookiesFeature(f)); From 35d71068d4e08edd5b13303f29ba6d98e62a9871 Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Wed, 16 Dec 2015 22:46:20 -0800 Subject: [PATCH 0937/1838] PR feedback --- test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index a3239619a2..a529c7fb08 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -271,7 +271,6 @@ namespace Microsoft.AspNet.Http.Internal { if (property.Name.Contains("Feature")) { - Console.WriteLine($"{value.GetType().Name} {property.Name}"); var v = property.GetValue(value); Assert.Same(features[property.PropertyType], v); Assert.NotNull(v); From c95d816c1dca5ad8e4db8da17fa0ea4ad148822c Mon Sep 17 00:00:00 2001 From: Louis DeJardin Date: Thu, 17 Dec 2015 11:18:44 -0800 Subject: [PATCH 0938/1838] Updating unit test to probe _features cache field state --- .../DefaultHttpContextTests.cs | 104 +++++++++--------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs index a529c7fb08..74bda1a613 100644 --- a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs @@ -149,7 +149,7 @@ namespace Microsoft.AspNet.Http.Internal items["foo"] = item; Assert.Same(item, context.Items["foo"]); } - + [Fact] public void UpdateFeatures_ClearsCachedFeatures() { @@ -158,75 +158,73 @@ namespace Microsoft.AspNet.Http.Internal features.Set(new HttpResponseFeature()); features.Set(new TestHttpWebSocketFeature()); + // featurecollection is set. all cached interfaces are null. var context = new DefaultHttpContext(features); - + TestAllCachedFeaturesAreNull(context, features); Assert.Equal(3, features.Count()); + // getting feature properties populates feature collection with defaults + TestAllCachedFeaturesAreSet(context, features); + Assert.NotEqual(3, features.Count()); + + // featurecollection is null. and all cached interfaces are null. + // only top level is tested because child objects are inaccessible. + context.Uninitialize(); + TestCachedFeaturesAreNull(context, null); + + + var newFeatures = new FeatureCollection(); + newFeatures.Set(new HttpRequestFeature()); + newFeatures.Set(new HttpResponseFeature()); + newFeatures.Set(new TestHttpWebSocketFeature()); + + // featurecollection is set to newFeatures. all cached interfaces are null. + context.Initialize(newFeatures); + TestAllCachedFeaturesAreNull(context, newFeatures); + Assert.Equal(3, newFeatures.Count()); + + // getting feature properties populates new feature collection with defaults + TestAllCachedFeaturesAreSet(context, newFeatures); + Assert.NotEqual(3, newFeatures.Count()); + } + + void TestAllCachedFeaturesAreNull(HttpContext context, IFeatureCollection features) + { TestCachedFeaturesAreNull(context, features); TestCachedFeaturesAreNull(context.Request, features); TestCachedFeaturesAreNull(context.Response, features); TestCachedFeaturesAreNull(context.Authentication, features); TestCachedFeaturesAreNull(context.Connection, features); TestCachedFeaturesAreNull(context.WebSockets, features); - - context.Session = new TestSession(); - - TestCachedFeaturesAreSet(context, features); - TestCachedFeaturesAreSet(context.Request, features); - TestCachedFeaturesAreSet(context.Response, features); - TestCachedFeaturesAreSet(context.Authentication, features); - TestCachedFeaturesAreSet(context.Connection, features); - TestCachedFeaturesAreSet(context.WebSockets, features); - - Assert.NotEqual(3, features.Count()); - - context.Uninitialize(); - var newFeatures = new FeatureCollection(); - newFeatures.Set(new HttpRequestFeature()); - newFeatures.Set(new HttpResponseFeature()); - newFeatures.Set(new TestHttpWebSocketFeature()); - context.Initialize(newFeatures); - - Assert.Equal(3, newFeatures.Count()); - - TestCachedFeaturesAreNull(context, newFeatures); - TestCachedFeaturesAreNull(context.Request, newFeatures); - TestCachedFeaturesAreNull(context.Response, newFeatures); - TestCachedFeaturesAreNull(context.Authentication, newFeatures); - TestCachedFeaturesAreNull(context.Connection, newFeatures); - TestCachedFeaturesAreNull(context.WebSockets, newFeatures); - - context.Session = new TestSession(); - - TestCachedFeaturesAreSet(context, newFeatures); - TestCachedFeaturesAreSet(context.Request, newFeatures); - TestCachedFeaturesAreSet(context.Response, newFeatures); - TestCachedFeaturesAreSet(context.Authentication, newFeatures); - TestCachedFeaturesAreSet(context.Connection, newFeatures); - TestCachedFeaturesAreSet(context.WebSockets, newFeatures); - - Assert.NotEqual(3, newFeatures.Count()); } void TestCachedFeaturesAreNull(object value, IFeatureCollection features) { var type = value.GetType(); - var fields = type + var field = type .GetFields(BindingFlags.NonPublic | BindingFlags.Instance) - .Where(f => f.FieldType.GetTypeInfo().IsInterface); + .Single(f => + f.FieldType.GetTypeInfo().IsGenericType && + f.FieldType.GetGenericTypeDefinition() == typeof(FeatureReferences<>)); - foreach (var field in fields) - { - if (field.FieldType == typeof(IFeatureCollection)) - { - Assert.Same(features, field.GetValue(value)); - } - else - { - Assert.Null(field.GetValue(value)); - } - } + var boxedExpectedStruct = features == null ? + Activator.CreateInstance(field.FieldType) : + Activator.CreateInstance(field.FieldType, features); + + var boxedActualStruct = field.GetValue(value); + + Assert.Equal(boxedExpectedStruct, boxedActualStruct); + } + + void TestAllCachedFeaturesAreSet(HttpContext context, IFeatureCollection features) + { + TestCachedFeaturesAreSet(context, features); + TestCachedFeaturesAreSet(context.Request, features); + TestCachedFeaturesAreSet(context.Response, features); + TestCachedFeaturesAreSet(context.Authentication, features); + TestCachedFeaturesAreSet(context.Connection, features); + TestCachedFeaturesAreSet(context.WebSockets, features); } void TestCachedFeaturesAreSet(object value, IFeatureCollection features) From 35f9de5ae146b00bad4cce3f53093a0cb1bff6de Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 17 Dec 2015 11:45:48 -0800 Subject: [PATCH 0939/1838] Reacting to DI and PlatformAbstraction changes --- src/Microsoft.AspNet.Hosting/WebHostBuilder.cs | 4 ++-- .../Fakes/RuntimeEnvironment.cs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 4157a831d5..5f4d3a1dd1 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -93,12 +93,12 @@ namespace Microsoft.AspNet.Hosting { if (defaultPlatformServices.Application != null) { - services.TryAdd(ServiceDescriptor.Instance(defaultPlatformServices.Application)); + services.TryAddSingleton(defaultPlatformServices.Application); } if (defaultPlatformServices.Runtime != null) { - services.TryAdd(ServiceDescriptor.Instance(defaultPlatformServices.Runtime)); + services.TryAddSingleton(defaultPlatformServices.Runtime); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs index ee180c4f01..c7cdd3f997 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs @@ -18,5 +18,7 @@ namespace Microsoft.AspNet.Hosting.Fakes public string RuntimeVersion { get; } = "TestRuntimeVersion"; public string RuntimePath { get; } = "TestRuntimePath"; + + public Platform OperatingSystemPlatform => Platform.Unknown; } } From 1c70ff4d139f7992457368467e9986b7af3a0200 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 11 Dec 2015 13:03:43 -0800 Subject: [PATCH 0940/1838] API changes to Hosting and TestServer #525 --- Hosting.sln | 19 +- samples/SampleStartups/SampleStartups.xproj | 25 ++ .../SampleStartups/StartupBlockingOnStart.cs | 44 +++ .../StartupConfigureAddresses.cs | 44 +++ .../StartupExternallyControlled.cs | 56 +++ samples/SampleStartups/StartupFullControl.cs | 68 ++++ samples/SampleStartups/StartupHelloWorld.cs | 40 +++ samples/SampleStartups/project.json | 10 + .../IWebApplication.cs | 30 ++ .../Internal/Application.cs | 37 -- .../{ => Internal}/ApplicationLifetime.cs | 2 +- .../{ => Internal}/HostingEnvironment.cs | 2 +- .../HostingEnvironmentExtensions.cs | 4 +- .../Internal/IApplication.cs | 15 - .../Internal/IHostingEngine.cs | 15 - .../{HostingEngine.cs => WebApplication.cs} | 60 ++-- .../Internal/WebApplicationOptions.cs | 50 +++ src/Microsoft.AspNet.Hosting/Program.cs | 13 - .../WebApplication.cs | 93 ----- ...ostBuilder.cs => WebApplicationBuilder.cs} | 333 +++++++++--------- .../WebApplicationConfiguration.cs | 40 +++ .../WebApplicationExtensions.cs | 60 ++++ .../WebHostOptions.cs | 47 --- src/Microsoft.AspNet.TestHost/TestServer.cs | 75 +--- .../HostingEnvironmentExtensionsTests.cs | 13 +- .../StartupManagerTests.cs | 1 + ...Tests.cs => WebApplicationBuilderTests.cs} | 77 ++-- ...s => WebApplicationConfigurationsTests.cs} | 25 +- ...gEngineTests.cs => WebApplicationTests.cs} | 172 ++++----- .../RequestBuilderTests.cs | 7 +- .../TestClientTests.cs | 33 +- .../TestServerTests.cs | 147 +++++--- 32 files changed, 948 insertions(+), 709 deletions(-) create mode 100644 samples/SampleStartups/SampleStartups.xproj create mode 100644 samples/SampleStartups/StartupBlockingOnStart.cs create mode 100644 samples/SampleStartups/StartupConfigureAddresses.cs create mode 100644 samples/SampleStartups/StartupExternallyControlled.cs create mode 100644 samples/SampleStartups/StartupFullControl.cs create mode 100644 samples/SampleStartups/StartupHelloWorld.cs create mode 100644 samples/SampleStartups/project.json create mode 100644 src/Microsoft.AspNet.Hosting/IWebApplication.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/Application.cs rename src/Microsoft.AspNet.Hosting/{ => Internal}/ApplicationLifetime.cs (98%) rename src/Microsoft.AspNet.Hosting/{ => Internal}/HostingEnvironment.cs (93%) rename src/Microsoft.AspNet.Hosting/{ => Internal}/HostingEnvironmentExtensions.cs (92%) delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/IApplication.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs rename src/Microsoft.AspNet.Hosting/Internal/{HostingEngine.cs => WebApplication.cs} (87%) create mode 100644 src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs delete mode 100644 src/Microsoft.AspNet.Hosting/Program.cs delete mode 100644 src/Microsoft.AspNet.Hosting/WebApplication.cs rename src/Microsoft.AspNet.Hosting/{WebHostBuilder.cs => WebApplicationBuilder.cs} (65%) create mode 100644 src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs create mode 100644 src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs delete mode 100644 src/Microsoft.AspNet.Hosting/WebHostOptions.cs rename test/Microsoft.AspNet.Hosting.Tests/{WebHostBuilderTests.cs => WebApplicationBuilderTests.cs} (66%) rename test/Microsoft.AspNet.Hosting.Tests/{WebHostConfigurationsTests.cs => WebApplicationConfigurationsTests.cs} (66%) rename test/Microsoft.AspNet.Hosting.Tests/{HostingEngineTests.cs => WebApplicationTests.cs} (77%) diff --git a/Hosting.sln b/Hosting.sln index 0c93390a49..a04fd5e533 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.22803.0 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -26,6 +26,10 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Se EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Testing", "src\Microsoft.AspNet.Server.Testing\Microsoft.AspNet.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9C7520A0-F2EB-411C-8BB2-80B39C937217}" +EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleStartups", "samples\SampleStartups\SampleStartups.xproj", "{485B6745-7648-400A-A969-F68FCF194E46}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -112,6 +116,18 @@ Global {3DA89347-6731-4366-80C4-548F24E8607B}.Release|Mixed Platforms.Build.0 = Release|Any CPU {3DA89347-6731-4366-80C4-548F24E8607B}.Release|x86.ActiveCfg = Release|Any CPU {3DA89347-6731-4366-80C4-548F24E8607B}.Release|x86.Build.0 = Release|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Debug|Any CPU.Build.0 = Debug|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Debug|x86.ActiveCfg = Debug|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Debug|x86.Build.0 = Debug|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Release|Any CPU.ActiveCfg = Release|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Release|Any CPU.Build.0 = Release|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.ActiveCfg = Release|Any CPU + {485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -124,5 +140,6 @@ Global {BB780FBB-7842-4759-8DE7-96FA2E5571C1} = {E0497F39-AFFB-4819-A116-E39E361915AB} {FDBBA081-5248-4FC0-9E08-B46BEF3FA438} = {E0497F39-AFFB-4819-A116-E39E361915AB} {3DA89347-6731-4366-80C4-548F24E8607B} = {E0497F39-AFFB-4819-A116-E39E361915AB} + {485B6745-7648-400A-A969-F68FCF194E46} = {9C7520A0-F2EB-411C-8BB2-80B39C937217} EndGlobalSection EndGlobal diff --git a/samples/SampleStartups/SampleStartups.xproj b/samples/SampleStartups/SampleStartups.xproj new file mode 100644 index 0000000000..c22f75c6a2 --- /dev/null +++ b/samples/SampleStartups/SampleStartups.xproj @@ -0,0 +1,25 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + + 485b6745-7648-400a-a969-f68fcf194e46 + SampleStartups + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + + 2.0 + + + + + + + + diff --git a/samples/SampleStartups/StartupBlockingOnStart.cs b/samples/SampleStartups/StartupBlockingOnStart.cs new file mode 100644 index 0000000000..39db2830c4 --- /dev/null +++ b/samples/SampleStartups/StartupBlockingOnStart.cs @@ -0,0 +1,44 @@ +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; +using Microsoft.Extensions.DependencyInjection; + +// Note that this sample will not run. It is only here to illustrate usage patterns. + +namespace SampleStartups +{ + public class StartupBlockingOnStart + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app) + { + app.Run(async (context) => + { + await context.Response.WriteAsync("Hello World!"); + }); + } + + // Entry point for the application. + public static void Main(string[] args) + { + var config = WebApplicationConfiguration.GetDefault(args); + + var application = new WebApplicationBuilder() + .UseConfiguration(config) + .UseStartup() + .Build(); + + using (application.Start()) + { + Console.ReadLine(); + } + } + } +} diff --git a/samples/SampleStartups/StartupConfigureAddresses.cs b/samples/SampleStartups/StartupConfigureAddresses.cs new file mode 100644 index 0000000000..0fff30e2f8 --- /dev/null +++ b/samples/SampleStartups/StartupConfigureAddresses.cs @@ -0,0 +1,44 @@ +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; +using Microsoft.Extensions.DependencyInjection; + +// Note that this sample will not run. It is only here to illustrate usage patterns. + +namespace SampleStartups +{ + public class StartupConfigureAddresses + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app) + { + app.Run(async (context) => + { + await context.Response.WriteAsync("Hello World!"); + }); + } + + // Entry point for the application. + public static void Main(string[] args) + { + var config = WebApplicationConfiguration.GetDefault(args); + + var application = new WebApplicationBuilder() + .UseConfiguration(config) + .UseStartup() + .Build(); + + var addresses = application.GetAddresses(); + addresses.Add("http://localhost:5000"); + addresses.Add("http://localhost:5001"); + + application.Run(); + } + } +} diff --git a/samples/SampleStartups/StartupExternallyControlled.cs b/samples/SampleStartups/StartupExternallyControlled.cs new file mode 100644 index 0000000000..dc7ce9d8b4 --- /dev/null +++ b/samples/SampleStartups/StartupExternallyControlled.cs @@ -0,0 +1,56 @@ +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; +using Microsoft.Extensions.DependencyInjection; + +// Note that this sample will not run. It is only here to illustrate usage patterns. + +namespace SampleStartups +{ + public class StartupExternallyControlled + { + private readonly IWebApplication _host; + private IDisposable _application; + + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app) + { + app.Run(async (context) => + { + await context.Response.WriteAsync("Hello World!"); + }); + } + + public StartupExternallyControlled() + { + _host = new WebApplicationBuilder().UseStartup().Build(); + + // Clear all configured addresses + _host.GetAddresses().Clear(); + } + + public void Start() + { + _application = _host.Start(); + } + + public void Stop() + { + _application.Dispose(); + } + + public void AddUrl(string url) + { + var addresses = _host.GetAddresses(); + + addresses.Add(url); + } + } +} diff --git a/samples/SampleStartups/StartupFullControl.cs b/samples/SampleStartups/StartupFullControl.cs new file mode 100644 index 0000000000..34a00a5a46 --- /dev/null +++ b/samples/SampleStartups/StartupFullControl.cs @@ -0,0 +1,68 @@ +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +// Note that this sample will not run. It is only here to illustrate usage patterns. + +namespace SampleStartups +{ + public class StartupFullControl + { + public static void Main(string[] args) + { + var application = new WebApplicationBuilder() + .UseServerFactory("Microsoft.AspNet.Server.Kestrel") // Set the server manually + .UseEnvironment("Development") + .UseWebRoot("public") + .ConfigureLogging(loggerFactory => + { + loggerFactory.AddProvider(new MyHostLoggerProvider()); + }) + .ConfigureServices(services => + { + // Configure services that the application can see + services.AddSingleton(); + }) + .Configure(app => + { + // Write the application inline, this won't call any startup class in the assembly + + app.Use(next => context => + { + return next(context); + }); + }) + .Build(); + + application.Run(); + } + } + + public class MyHostLoggerProvider : ILoggerProvider + { + public ILogger CreateLogger(string categoryName) + { + throw new NotImplementedException(); + } + + public void Dispose() + { + throw new NotImplementedException(); + } + } + + public interface IMyCustomService + { + void Go(); + } + + public class MyCustomService : IMyCustomService + { + public void Go() + { + throw new NotImplementedException(); + } + } +} diff --git a/samples/SampleStartups/StartupHelloWorld.cs b/samples/SampleStartups/StartupHelloWorld.cs new file mode 100644 index 0000000000..4ee08e2f16 --- /dev/null +++ b/samples/SampleStartups/StartupHelloWorld.cs @@ -0,0 +1,40 @@ +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Http; +using Microsoft.Extensions.DependencyInjection; + +// Note that this sample will not run. It is only here to illustrate usage patterns. + +namespace SampleStartups +{ + public class StartupHelloWorld + { + // This method gets called by the runtime. Use this method to add services to the container. + // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 + public void ConfigureServices(IServiceCollection services) + { + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app) + { + app.Run(async (context) => + { + await context.Response.WriteAsync("Hello World!"); + }); + } + + // Entry point for the application. + public static void Main(string[] args) + { + var config = WebApplicationConfiguration.GetDefault(args); + + var application = new WebApplicationBuilder() + .UseConfiguration(config) + .UseStartup() + .Build(); + + application.Run(); + } + } +} diff --git a/samples/SampleStartups/project.json b/samples/SampleStartups/project.json new file mode 100644 index 0000000000..4fb88a1477 --- /dev/null +++ b/samples/SampleStartups/project.json @@ -0,0 +1,10 @@ +{ + "version": "1.0.0-*", + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { } + } +} diff --git a/src/Microsoft.AspNet.Hosting/IWebApplication.cs b/src/Microsoft.AspNet.Hosting/IWebApplication.cs new file mode 100644 index 0000000000..0db082a45f --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/IWebApplication.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Http.Features; + +namespace Microsoft.AspNet.Hosting +{ + /// + /// Represents a configured web application + /// + public interface IWebApplication + { + /// + /// The exposed by the configured server. + /// + IFeatureCollection ServerFeatures { get; } + + /// + /// The for the application. + /// + IServiceProvider Services { get; } + + /// + /// Starts listening on the configured addresses. + /// + /// + IDisposable Start(); + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/Application.cs b/src/Microsoft.AspNet.Hosting/Internal/Application.cs deleted file mode 100644 index ecbb916a6e..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/Application.cs +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public class Application : IApplication - { - private readonly IDisposable _stop; - private readonly IServiceProvider _services; - private readonly IFeatureCollection _server; - - public Application(IServiceProvider services, IFeatureCollection server, IDisposable stop) - { - _services = services; - _server = server; - _stop = stop; - } - - public IFeatureCollection ServerFeatures - { - get { return _server; } - } - - public IServiceProvider Services - { - get { return _services; } - } - - public void Dispose() - { - _stop.Dispose(); - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs b/src/Microsoft.AspNet.Hosting/Internal/ApplicationLifetime.cs similarity index 98% rename from src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs rename to src/Microsoft.AspNet.Hosting/Internal/ApplicationLifetime.cs index 230b4fd4e3..8955cf8d1e 100644 --- a/src/Microsoft.AspNet.Hosting/ApplicationLifetime.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/ApplicationLifetime.cs @@ -4,7 +4,7 @@ using System; using System.Threading; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNet.Hosting.Internal { /// /// Allows consumers to perform cleanup during a graceful shutdown. diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs similarity index 93% rename from src/Microsoft.AspNet.Hosting/HostingEnvironment.cs rename to src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs index e7254247a2..0428ce490b 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs @@ -4,7 +4,7 @@ using Microsoft.AspNet.FileProviders; using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNet.Hosting.Internal { public class HostingEnvironment : IHostingEnvironment { diff --git a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs similarity index 92% rename from src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs rename to src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs index 6b46ba7214..cf4e1303bc 100644 --- a/src/Microsoft.AspNet.Hosting/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs @@ -7,11 +7,11 @@ using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Hosting.Internal; using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNet.Hosting.Internal { public static class HostingEnvironmentExtensions { - public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebHostOptions options, IConfiguration configuration) + public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebApplicationOptions options, IConfiguration configuration) { if (options == null) { diff --git a/src/Microsoft.AspNet.Hosting/Internal/IApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/IApplication.cs deleted file mode 100644 index 99f807e10c..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/IApplication.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http.Features; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public interface IApplication : IDisposable - { - IFeatureCollection ServerFeatures { get; } - - IServiceProvider Services { get; } - } -} diff --git a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs deleted file mode 100644 index 4b8789a9ca..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/IHostingEngine.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; - -namespace Microsoft.AspNet.Hosting.Internal -{ - public interface IHostingEngine - { - IApplication Start(); - - // Accessing this will block Use methods - IServiceProvider ApplicationServices { get; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs similarity index 87% rename from src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs rename to src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs index 6236fa2e8c..0014537a7b 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEngine.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs @@ -19,7 +19,7 @@ using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Internal { - public class HostingEngine : IHostingEngine + public class WebApplication : IWebApplication { // This is defined by IIS's HttpPlatformHandler. private static readonly string ServerPort = "HTTP_PLATFORM_PORT"; @@ -27,11 +27,11 @@ namespace Microsoft.AspNet.Hosting.Internal private readonly IServiceCollection _applicationServiceCollection; private readonly IStartupLoader _startupLoader; private readonly ApplicationLifetime _applicationLifetime; - private readonly WebHostOptions _options; + private readonly WebApplicationOptions _options; private readonly IConfiguration _config; - private readonly bool _captureStartupErrors; private IServiceProvider _applicationServices; + private RequestDelegate _application; // Only one of these should be set internal string StartupAssemblyName { get; set; } @@ -43,12 +43,11 @@ namespace Microsoft.AspNet.Hosting.Internal internal string ServerFactoryLocation { get; set; } internal IServer Server { get; set; } - public HostingEngine( + public WebApplication( IServiceCollection appServices, IStartupLoader startupLoader, - WebHostOptions options, - IConfiguration config, - bool captureStartupErrors) + WebApplicationOptions options, + IConfiguration config) { if (appServices == null) { @@ -69,12 +68,11 @@ namespace Microsoft.AspNet.Hosting.Internal _options = options; _applicationServiceCollection = appServices; _startupLoader = startupLoader; - _captureStartupErrors = captureStartupErrors; _applicationLifetime = new ApplicationLifetime(); _applicationServiceCollection.AddSingleton(_applicationLifetime); } - public IServiceProvider ApplicationServices + public IServiceProvider Services { get { @@ -83,29 +81,45 @@ namespace Microsoft.AspNet.Hosting.Internal } } - public virtual IApplication Start() + public IFeatureCollection ServerFeatures { - var application = BuildApplication(); + get + { + return Server?.Features; + } + } - var logger = _applicationServices.GetRequiredService>(); + public void Initialize() + { + if (_application == null) + { + _application = BuildApplication(); + } + } + + public virtual IDisposable Start() + { + Initialize(); + + var logger = _applicationServices.GetRequiredService>(); var diagnosticSource = _applicationServices.GetRequiredService(); var httpContextFactory = _applicationServices.GetRequiredService(); logger.Starting(); - Server.Start(new HostingApplication(application, logger, diagnosticSource, httpContextFactory)); + Server.Start(new HostingApplication(_application, logger, diagnosticSource, httpContextFactory)); _applicationLifetime.NotifyStarted(); logger.Started(); - return new Application(ApplicationServices, Server.Features, new Disposable(() => - { - logger.Shutdown(); - _applicationLifetime.StopApplication(); - Server.Dispose(); - _applicationLifetime.NotifyStopped(); - (_applicationServices as IDisposable)?.Dispose(); - })); + return new Disposable(() => + { + logger.Shutdown(); + _applicationLifetime.StopApplication(); + Server.Dispose(); + _applicationLifetime.NotifyStopped(); + (_applicationServices as IDisposable)?.Dispose(); + }); } private void EnsureApplicationServices() @@ -168,7 +182,7 @@ namespace Microsoft.AspNet.Hosting.Internal return builder.Build(); } - catch (Exception ex) when (_captureStartupErrors) + catch (Exception ex) when (_options.CaptureStartupErrors) { // EnsureApplicationServices may have failed due to a missing or throwing Startup class. if (_applicationServices == null) @@ -180,7 +194,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Write errors to standard out so they can be retrieved when not in development mode. Console.Out.WriteLine("Application startup exception: " + ex.ToString()); - var logger = _applicationServices.GetRequiredService>(); + var logger = _applicationServices.GetRequiredService>(); logger.ApplicationError(ex); // Generate an HTML error page. diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs new file mode 100644 index 0000000000..ef76bcdb8f --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs @@ -0,0 +1,50 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Extensions.Configuration; + +namespace Microsoft.AspNet.Hosting.Internal +{ + public class WebApplicationOptions + { + private const string OldEnvironmentKey = "ENV"; + + public WebApplicationOptions() + { + } + + public WebApplicationOptions(IConfiguration configuration) + { + if (configuration == null) + { + throw new ArgumentNullException(nameof(configuration)); + } + + Application = configuration[WebApplicationConfiguration.ApplicationKey]; + DetailedErrors = ParseBool(configuration, WebApplicationConfiguration.DetailedErrorsKey); + CaptureStartupErrors = ParseBool(configuration, WebApplicationConfiguration.CaptureStartupErrorsKey); + Environment = configuration[WebApplicationConfiguration.EnvironmentKey] ?? configuration[OldEnvironmentKey]; + ServerFactoryLocation = configuration[WebApplicationConfiguration.ServerKey]; + WebRoot = configuration[WebApplicationConfiguration.WebRootKey]; + } + + public string Application { get; set; } + + public bool DetailedErrors { get; set; } + + public bool CaptureStartupErrors { get; set; } + + public string Environment { get; set; } + + public string ServerFactoryLocation { get; set; } + + public string WebRoot { get; set; } + + private static bool ParseBool(IConfiguration configuration, string key) + { + return string.Equals("true", configuration[key], StringComparison.OrdinalIgnoreCase) + || string.Equals("1", configuration[key], StringComparison.OrdinalIgnoreCase); + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/Program.cs b/src/Microsoft.AspNet.Hosting/Program.cs deleted file mode 100644 index 80fa43f73f..0000000000 --- a/src/Microsoft.AspNet.Hosting/Program.cs +++ /dev/null @@ -1,13 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Hosting -{ - public class Program - { - public static void Main(string[] args) - { - WebApplication.Run(args); - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/WebApplication.cs b/src/Microsoft.AspNet.Hosting/WebApplication.cs deleted file mode 100644 index f819fcec7a..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebApplication.cs +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Server.Features; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.AspNet.Hosting -{ - public class WebApplication - { - private const string HostingJsonFile = "hosting.json"; - private const string EnvironmentVariablesPrefix = "ASPNET_"; - private const string ConfigFileKey = "config"; - - public static void Run(string[] args) - { - Run(startupType: null, args: args); - } - - public static void Run() - { - Run(typeof(TStartup), null); - } - - public static void Run(string[] args) - { - Run(typeof(TStartup), args); - } - - public static void Run(Type startupType) - { - Run(startupType, null); - } - - public static void Run(Type startupType, string[] args) - { - // Allow the location of the json file to be specified via a --config command line arg - var tempBuilder = new ConfigurationBuilder().AddCommandLine(args); - var tempConfig = tempBuilder.Build(); - var configFilePath = tempConfig[ConfigFileKey] ?? HostingJsonFile; - var config = LoadHostingConfiguration(configFilePath, args); - - var hostBuilder = new WebHostBuilder(config, captureStartupErrors: true); - if (startupType != null) - { - hostBuilder.UseStartup(startupType); - } - var host = hostBuilder.Build(); - using (var app = host.Start()) - { - var hostingEnv = app.Services.GetRequiredService(); - Console.WriteLine("Hosting environment: " + hostingEnv.EnvironmentName); - - var serverAddresses = app.ServerFeatures.Get(); - if (serverAddresses != null) - { - foreach (var address in serverAddresses.Addresses) - { - Console.WriteLine("Now listening on: " + address); - } - } - - Console.WriteLine("Application started. Press Ctrl+C to shut down."); - - var appLifetime = app.Services.GetRequiredService(); - - Console.CancelKeyPress += (sender, eventArgs) => - { - appLifetime.StopApplication(); - // Don't terminate the process immediately, wait for the Main thread to exit gracefully. - eventArgs.Cancel = true; - }; - - appLifetime.ApplicationStopping.WaitHandle.WaitOne(); - } - } - - internal static IConfiguration LoadHostingConfiguration(string configJsonPath, string[] args) - { - // We are adding all environment variables first and then adding the ASPNET_ ones - // with the prefix removed to unify with the command line and config file formats - return new ConfigurationBuilder() - .AddJsonFile(configJsonPath, optional: true) - .AddEnvironmentVariables() - .AddEnvironmentVariables(prefix: EnvironmentVariablesPrefix) - .AddCommandLine(args) - .Build(); - } - } -} diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs similarity index 65% rename from src/Microsoft.AspNet.Hosting/WebHostBuilder.cs rename to src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs index 5f4d3a1dd1..4350a2b35b 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs @@ -18,49 +18,180 @@ using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting { - public class WebHostBuilder + public class WebApplicationBuilder { private readonly IHostingEnvironment _hostingEnvironment; private readonly ILoggerFactory _loggerFactory; - private readonly IConfiguration _config; - private readonly WebHostOptions _options; + + private IConfiguration _config; + private WebApplicationOptions _options; private Action _configureServices; private string _environmentName; + private string _webRoot; // Only one of these should be set private StartupMethods _startup; private Type _startupType; private string _startupAssemblyName; - private readonly bool _captureStartupErrors; // Only one of these should be set private string _serverFactoryLocation; private IServerFactory _serverFactory; private IServer _server; - public WebHostBuilder() - : this(config: new ConfigurationBuilder().Build()) + public WebApplicationBuilder() { - } - - public WebHostBuilder(IConfiguration config) - : this(config: config, captureStartupErrors: false) - { - } - - public WebHostBuilder(IConfiguration config, bool captureStartupErrors) - { - if (config == null) - { - throw new ArgumentNullException(nameof(config)); - } - _hostingEnvironment = new HostingEnvironment(); _loggerFactory = new LoggerFactory(); - _config = config; - _options = new WebHostOptions(config); - _captureStartupErrors = captureStartupErrors; + } + + public WebApplicationBuilder UseConfiguration(IConfiguration configuration) + { + _config = configuration; + return this; + } + + public WebApplicationBuilder UseEnvironment(string environment) + { + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + + _environmentName = environment; + return this; + } + + public WebApplicationBuilder UseWebRoot(string webRoot) + { + if (webRoot == null) + { + throw new ArgumentNullException(nameof(webRoot)); + } + _webRoot = webRoot; + return this; + } + + public WebApplicationBuilder UseServer(IServer server) + { + if (server == null) + { + throw new ArgumentNullException(nameof(server)); + } + + _server = server; + return this; + } + + public WebApplicationBuilder UseServerFactory(string assemblyName) + { + if (assemblyName == null) + { + throw new ArgumentNullException(nameof(assemblyName)); + } + + _serverFactoryLocation = assemblyName; + return this; + } + + public WebApplicationBuilder UseServerFactory(IServerFactory factory) + { + if (factory == null) + { + throw new ArgumentNullException(nameof(factory)); + } + + _serverFactory = factory; + return this; + } + + public WebApplicationBuilder UseStartup(string startupAssemblyName) + { + if (startupAssemblyName == null) + { + throw new ArgumentNullException(nameof(startupAssemblyName)); + } + + _startupAssemblyName = startupAssemblyName; + return this; + } + + public WebApplicationBuilder UseStartup(Type startupType) + { + if (startupType == null) + { + throw new ArgumentNullException(nameof(startupType)); + } + + _startupType = startupType; + return this; + } + + public WebApplicationBuilder UseStartup() where TStartup : class + { + return UseStartup(typeof(TStartup)); + } + + public WebApplicationBuilder ConfigureServices(Action configureServices) + { + _configureServices = configureServices; + return this; + } + + public WebApplicationBuilder Configure(Action configureApp) + { + if (configureApp == null) + { + throw new ArgumentNullException(nameof(configureApp)); + } + + _startup = new StartupMethods(configureApp); + return this; + } + + public WebApplicationBuilder ConfigureLogging(Action configureLogging) + { + configureLogging(_loggerFactory); + return this; + } + + public IWebApplication Build() + { + var hostingServices = BuildHostingServices(); + + var hostingContainer = hostingServices.BuildServiceProvider(); + + var appEnvironment = hostingContainer.GetRequiredService(); + var startupLoader = hostingContainer.GetRequiredService(); + + _config = _config ?? WebApplicationConfiguration.GetDefault(); + _options = new WebApplicationOptions(_config); + + // Initialize the hosting environment + _options.WebRoot = _webRoot ?? _options.WebRoot; + _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options, _config); + + if (!string.IsNullOrEmpty(_environmentName)) + { + _hostingEnvironment.EnvironmentName = _environmentName; + } + + var application = new WebApplication(hostingServices, startupLoader, _options, _config); + + // Only one of these should be set, but they are used in priority + application.Server = _server; + application.ServerFactory = _serverFactory; + application.ServerFactoryLocation = _options.ServerFactoryLocation ?? _serverFactoryLocation; + + // Only one of these should be set, but they are used in priority + application.Startup = _startup; + application.StartupType = _startupType; + application.StartupAssemblyName = _startupAssemblyName ?? _options.Application; + + application.Initialize(); + + return application; } private IServiceCollection BuildHostingServices() @@ -83,11 +214,6 @@ namespace Microsoft.AspNet.Hosting // Conjure up a RequestServices services.AddTransient(); - if (_configureServices != null) - { - _configureServices(services); - } - var defaultPlatformServices = PlatformServices.Default; if (defaultPlatformServices != null) { @@ -102,153 +228,12 @@ namespace Microsoft.AspNet.Hosting } } + if (_configureServices != null) + { + _configureServices(services); + } + return services; } - - public IHostingEngine Build() - { - var hostingServices = BuildHostingServices(); - - var hostingContainer = hostingServices.BuildServiceProvider(); - - var appEnvironment = hostingContainer.GetRequiredService(); - var startupLoader = hostingContainer.GetRequiredService(); - - _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options, _config); - if (!string.IsNullOrEmpty(_environmentName)) - { - _hostingEnvironment.EnvironmentName = _environmentName; - } - var engine = new HostingEngine(hostingServices, startupLoader, _options, _config, _captureStartupErrors); - - // Only one of these should be set, but they are used in priority - engine.Server = _server; - engine.ServerFactory = _serverFactory; - engine.ServerFactoryLocation = _options.Server ?? _serverFactoryLocation; - - // Only one of these should be set, but they are used in priority - engine.Startup = _startup; - engine.StartupType = _startupType; - engine.StartupAssemblyName = _startupAssemblyName ?? _options.Application ?? appEnvironment.ApplicationName; - - return engine; - } - - public WebHostBuilder UseServices(Action configureServices) - { - _configureServices = configureServices; - return this; - } - - public WebHostBuilder UseEnvironment(string environment) - { - if (environment == null) - { - throw new ArgumentNullException(nameof(environment)); - } - - _environmentName = environment; - return this; - } - - public WebHostBuilder UseServer(IServer server) - { - if (server == null) - { - throw new ArgumentNullException(nameof(server)); - } - - _server = server; - return this; - } - - public WebHostBuilder UseServerFactory(string assemblyName) - { - if (assemblyName == null) - { - throw new ArgumentNullException(nameof(assemblyName)); - } - - _serverFactoryLocation = assemblyName; - return this; - } - - public WebHostBuilder UseServerFactory(IServerFactory factory) - { - if (factory == null) - { - throw new ArgumentNullException(nameof(factory)); - } - - _serverFactory = factory; - return this; - } - - public WebHostBuilder UseStartup(string startupAssemblyName) - { - if (startupAssemblyName == null) - { - throw new ArgumentNullException(nameof(startupAssemblyName)); - } - - _startupAssemblyName = startupAssemblyName; - return this; - } - - public WebHostBuilder UseStartup(Type startupType) - { - if (startupType == null) - { - throw new ArgumentNullException(nameof(startupType)); - } - - _startupType = startupType; - return this; - } - - public WebHostBuilder UseStartup() where TStartup : class - { - return UseStartup(typeof(TStartup)); - } - - public WebHostBuilder UseStartup(Action configureApp) - { - if (configureApp == null) - { - throw new ArgumentNullException(nameof(configureApp)); - } - - return UseStartup(configureApp, configureServices: null); - } - - public WebHostBuilder UseStartup(Action configureApp, Func configureServices) - { - if (configureApp == null) - { - throw new ArgumentNullException(nameof(configureApp)); - } - - _startup = new StartupMethods(configureApp, configureServices); - return this; - } - - public WebHostBuilder UseStartup(Action configureApp, Action configureServices) - { - if (configureApp == null) - { - throw new ArgumentNullException(nameof(configureApp)); - } - - _startup = new StartupMethods(configureApp, - services => - { - if (configureServices != null) - { - configureServices(services); - } - return services.BuildServiceProvider(); - }); - return this; - } } } diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs new file mode 100644 index 0000000000..0d71dafc2d --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs @@ -0,0 +1,40 @@ +using Microsoft.Extensions.Configuration; + +namespace Microsoft.AspNet.Hosting +{ + public class WebApplicationConfiguration + { + public static readonly string ApplicationKey = "app"; + public static readonly string DetailedErrorsKey = "detailedErrors"; + public static readonly string EnvironmentKey = "environment"; + public static readonly string ServerKey = "server"; + public static readonly string WebRootKey = "webroot"; + public static readonly string CaptureStartupErrorsKey = "captureStartupErrors"; + + public static readonly string HostingJsonFile = "hosting.json"; + public static readonly string EnvironmentVariablesPrefix = "ASPNET_"; + + public static IConfiguration GetDefault() + { + return GetDefault(args: null); + } + + public static IConfiguration GetDefault(string[] args) + { + // We are adding all environment variables first and then adding the ASPNET_ ones + // with the prefix removed to unify with the command line and config file formats + var configBuilder = new ConfigurationBuilder() + .AddJsonFile(HostingJsonFile, optional: true) + .AddEnvironmentVariables() + .AddEnvironmentVariables(prefix: EnvironmentVariablesPrefix); + + if (args != null) + { + configBuilder.AddCommandLine(args); + } + + return configBuilder.Build(); + } + } + +} diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs new file mode 100644 index 0000000000..a0b0f0b3f6 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs @@ -0,0 +1,60 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Http.Features; +using Microsoft.AspNet.Server.Features; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public static class WebApplicationExtensions + { + /// + /// Retruns the server addresses the web application is going to listen on. + /// + /// + /// An which the addresses the server will listen to + public static ICollection GetAddresses(this IWebApplication application) + { + return application.ServerFeatures.Get()?.Addresses; + } + + /// + /// Runs a web application and block the calling thread until host shutdown. + /// + /// + public static void Run(this IWebApplication application) + { + using (application.Start()) + { + var hostingEnvironment = application.Services.GetService(); + var applicationLifetime = application.Services.GetService(); + + Console.WriteLine("Hosting environment: " + hostingEnvironment.EnvironmentName); + + var serverAddresses = application.GetAddresses(); + if (serverAddresses != null) + { + foreach (var address in serverAddresses) + { + Console.WriteLine("Now listening on: " + address); + } + } + + Console.WriteLine("Application started. Press Ctrl+C to shut down."); + + Console.CancelKeyPress += (sender, eventArgs) => + { + applicationLifetime.StopApplication(); + + // Don't terminate the process immediately, wait for the Main thread to exit gracefully. + eventArgs.Cancel = true; + }; + + applicationLifetime.ApplicationStopping.WaitHandle.WaitOne(); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebHostOptions.cs b/src/Microsoft.AspNet.Hosting/WebHostOptions.cs deleted file mode 100644 index 89a0aad6bc..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebHostOptions.cs +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.AspNet.Hosting -{ - public class WebHostOptions - { - private const string ApplicationKey = "app"; - private const string DetailedErrorsKey = "detailedErrors"; - private const string EnvironmentKey = "environment"; - private const string ServerKey = "server"; - private const string WebRootKey = "webroot"; - private const string OldEnvironmentKey = "ENV"; - - public WebHostOptions() - { - } - - public WebHostOptions(IConfiguration configuration) - { - if (configuration == null) - { - throw new ArgumentNullException(nameof(configuration)); - } - - Application = configuration[ApplicationKey]; - DetailedErrors = string.Equals("true", configuration[DetailedErrorsKey], StringComparison.OrdinalIgnoreCase) - || string.Equals("1", configuration[DetailedErrorsKey], StringComparison.OrdinalIgnoreCase); - Environment = configuration[EnvironmentKey] ?? configuration[OldEnvironmentKey]; - Server = configuration[ServerKey]; - WebRoot = configuration[WebRootKey]; - } - - public string Application { get; set; } - - public bool DetailedErrors { get; set; } - - public string Environment { get; set; } - - public string Server { get; set; } - - public string WebRoot { get; set; } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index efeefac128..51980617cf 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -4,13 +4,10 @@ using System; using System.Net.Http; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Features; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; using Context = Microsoft.AspNet.Hosting.Internal.HostingApplication.Context; namespace Microsoft.AspNet.TestHost @@ -23,78 +20,16 @@ namespace Microsoft.AspNet.TestHost private bool _disposed = false; private IHttpApplication _application; - public TestServer(WebHostBuilder builder) + public TestServer(WebApplicationBuilder builder) { - var hostingEngine = builder.UseServer(this).Build(); - _appInstance = hostingEngine.Start(); + var application = builder.UseServer(this).Build(); + _appInstance = application.Start(); } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); IFeatureCollection IServer.Features { get; } - public static TestServer Create() - { - return Create(config: null, configureApp: null, configureServices: null); - } - - public static TestServer Create(Action configureApp) - { - return Create(config: null, configureApp: configureApp, configureServices: null); - } - - public static TestServer Create(Action configureApp, Action configureServices) - { - return Create(config: null, configureApp: configureApp, configureServices: configureServices); - } - - public static TestServer Create(Action configureApp, Func configureServices) - { - return new TestServer(CreateBuilder(config: null, configureApp: configureApp, configureServices: configureServices, configureHostServices: null)); - } - public static TestServer Create(Action configureApp, Func configureServices, Action configureHostServices) - { - return new TestServer(CreateBuilder(config: null, configureApp: configureApp, configureServices: configureServices, configureHostServices: configureHostServices)); - } - - public static TestServer Create(IConfiguration config, Action configureApp, Action configureServices) - { - return new TestServer(CreateBuilder(config, configureApp, configureServices)); - } - - public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Action configureServices) - { - return CreateBuilder(config, configureApp, - s => - { - if (configureServices != null) - { - configureServices(s); - } - return s.BuildServiceProvider(); - }, null); - } - public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Func configureServices) - { - return CreateBuilder(config, configureApp, configureServices, null); - } - - public static WebHostBuilder CreateBuilder(IConfiguration config, Action configureApp, Func configureServices, Action configureHostServices) - { - return CreateBuilder(config).UseStartup(configureApp, configureServices).UseServices(configureHostServices); - } - - public static WebHostBuilder CreateBuilder(IConfiguration config) - { - return new WebHostBuilder( - config ?? new ConfigurationBuilder().Build()); - } - - public static WebHostBuilder CreateBuilder() - { - return CreateBuilder(config: null); - } - public HttpMessageHandler CreateHandler() { var pathBase = BaseAddress == null ? PathString.Empty : PathString.FromUriComponent(BaseAddress); @@ -141,8 +76,8 @@ namespace Microsoft.AspNet.TestHost private class ApplicationWrapper : IHttpApplication { - IHttpApplication _application; - Action _preProcessRequestAsync; + private readonly IHttpApplication _application; + private readonly Action _preProcessRequestAsync; public ApplicationWrapper(IHttpApplication application, Action preProcessRequestAsync) { diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs index 727130ded8..be2072bf9a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs @@ -4,7 +4,6 @@ using System; using System.IO; using Microsoft.AspNet.FileProviders; -using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Hosting.Internal; using Microsoft.Extensions.Configuration; using Xunit; @@ -18,7 +17,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize(".", new WebHostOptions() {WebRoot = "testroot"}, null); + env.Initialize(".", new WebApplicationOptions() {WebRoot = "testroot"}, null); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.IsAssignableFrom(env.WebRootFileProvider); @@ -29,7 +28,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize("testroot", new WebHostOptions(), null); + env.Initialize("testroot", new WebApplicationOptions(), null); Assert.Equal(Path.GetFullPath(Path.Combine("testroot","wwwroot")), env.WebRootPath); Assert.IsAssignableFrom(env.WebRootFileProvider); @@ -40,7 +39,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize(Path.Combine("testroot", "wwwroot"), new WebHostOptions(), null); + env.Initialize(Path.Combine("testroot", "wwwroot"), new WebApplicationOptions(), null); Assert.Null(env.WebRootPath); Assert.IsAssignableFrom(env.WebRootFileProvider); @@ -52,7 +51,7 @@ namespace Microsoft.AspNet.Hosting.Tests var config = new ConfigurationBuilder().Build(); var env = new HostingEnvironment(); - env.Initialize(".", new WebHostOptions(), config); + env.Initialize(".", new WebApplicationOptions(), config); Assert.Same(config, env.Configuration); } @@ -63,7 +62,7 @@ namespace Microsoft.AspNet.Hosting.Tests var env = new HostingEnvironment(); env.EnvironmentName = "SomeName"; - env.Initialize(".", new WebHostOptions() { Environment = "NewName" }, null); + env.Initialize(".", new WebApplicationOptions() { Environment = "NewName" }, null); Assert.Equal("NewName", env.EnvironmentName); } @@ -73,7 +72,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize(".", new WebHostOptions(), null); + env.Initialize(".", new WebApplicationOptions(), null); Assert.Throws(() => env.MapPath("file.txt")); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 0272e66a81..8b0c67652d 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -7,6 +7,7 @@ using System.Reflection; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Hosting.Fakes; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.OptionsModel; diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs similarity index 66% rename from test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs rename to test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs index cd7c1ee3b4..edeaffb499 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs @@ -17,35 +17,25 @@ using Xunit; namespace Microsoft.AspNet.Hosting { - public class WebHostBuilderTests + public class WebApplicationBuilderTests { - [Fact] - public void Build_uses_application_for_startup_assembly_by_default() - { - var builder = CreateWebHostBuilder(); - - var engine = (HostingEngine)builder.Build(); - - Assert.Equal("Microsoft.AspNet.Hosting.Tests", engine.StartupAssemblyName); - } - [Fact] public void Build_honors_UseStartup_with_string() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder().UseServer(new TestServer()); - var engine = (HostingEngine)builder.UseStartup("MyStartupAssembly").Build(); + var application = (WebApplication)builder.UseStartup("MyStartupAssembly").Build(); - Assert.Equal("MyStartupAssembly", engine.StartupAssemblyName); + Assert.Equal("MyStartupAssembly", application.StartupAssemblyName); } [Fact] public async Task StartupMissing_Fallback() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup("MissingStartupAssembly").Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup("MissingStartupAssembly").Build(); + using (application.Start()) { await AssertResponseContains(server.RequestDelegate, "MissingStartupAssembly"); } @@ -54,10 +44,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupStaticCtorThrows_Fallback() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup().Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup().Build(); + using (application.Start()) { await AssertResponseContains(server.RequestDelegate, "Exception from static constructor"); } @@ -66,10 +56,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupCtorThrows_Fallback() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup().Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup().Build(); + using (application.Start()) { await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } @@ -78,10 +68,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupCtorThrows_TypeLoadException() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup().Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup().Build(); + using (application.Start()) { await AssertResponseContains(server.RequestDelegate, "Message from the LoaderException"); } @@ -90,12 +80,12 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task IApplicationLifetimeRegisteredEvenWhenStartupCtorThrows_Fallback() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup().Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup().Build(); + using (application.Start()) { - var service = engine.ApplicationServices.GetServices(); + var service = application.Services.GetServices(); Assert.NotNull(service); await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } @@ -104,10 +94,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupConfigureServicesThrows_Fallback() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup().Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup().Build(); + using (application.Start()) { await AssertResponseContains(server.RequestDelegate, "Exception from ConfigureServices"); } @@ -116,10 +106,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupConfigureThrows_Fallback() { - var builder = CreateWebHostBuilder(); + var builder = CreateWebApplicationBuilder(); var server = new TestServer(); - var engine = builder.UseServer(server).UseStartup().Build(); - using (engine.Start()) + var application = builder.UseServer(server).UseStartup().Build(); + using (application.Start()) { await AssertResponseContains(server.RequestDelegate, "Exception from Configure"); } @@ -137,22 +127,27 @@ namespace Microsoft.AspNet.Hosting var config = builder.Build(); var expected = "MY_TEST_ENVIRONMENT"; - var webHost = new WebHostBuilder(config, captureStartupErrors: true).UseEnvironment(expected).Build(); + var application = new WebApplicationBuilder() + .UseConfiguration(config) + .UseEnvironment(expected) + .UseServer(new TestServer()) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build(); - Assert.Equal(expected, webHost.ApplicationServices.GetService().EnvironmentName); + Assert.Equal(expected, application.Services.GetService().EnvironmentName); } - private WebHostBuilder CreateWebHostBuilder() + private WebApplicationBuilder CreateWebApplicationBuilder() { var vals = new Dictionary { - { "server", "Microsoft.AspNet.Hosting.Tests" }, { "DetailedErrors", "true" }, + { "captureStartupErrors", "true" } }; var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - return new WebHostBuilder(config, captureStartupErrors: true); + return new WebApplicationBuilder().UseConfiguration(config); } private async Task AssertResponseContains(RequestDelegate app, string expectedText) diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs similarity index 66% rename from test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs rename to test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs index ea3b314bbd..3e935c68cd 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs @@ -1,23 +1,14 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; -using System.Collections; using System.Collections.Generic; -using System.IO; -using System.Reflection; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Hosting.Fakes; -using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.OptionsModel; using Xunit; namespace Microsoft.AspNet.Hosting.Tests { - public class WebHostConfigurationTests + public class WebApplicationConfigurationTests { [Fact] public void ReadsParametersCorrectly() @@ -29,22 +20,24 @@ namespace Microsoft.AspNet.Hosting.Tests {"app", "MyProjectReference"}, {"environment", "Development"}, {"detailederrors", "true"}, + { "captureStartupErrors", "true" } }; - var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + var config = new WebApplicationOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); Assert.Equal("wwwroot", config.WebRoot); - Assert.Equal("Microsoft.AspNet.Server.Kestrel", config.Server); + Assert.Equal("Microsoft.AspNet.Server.Kestrel", config.ServerFactoryLocation); Assert.Equal("MyProjectReference", config.Application); Assert.Equal("Development", config.Environment); - Assert.Equal(true, config.DetailedErrors); + Assert.True(config.CaptureStartupErrors); + Assert.True(config.DetailedErrors); } [Fact] public void ReadsOldEnvKey() { var parameters = new Dictionary() { { "ENV", "Development" } }; - var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + var config = new WebApplicationOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); Assert.Equal("Development", config.Environment); } @@ -55,7 +48,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void AllowsNumberForDetailedErrors(string value, bool expected) { var parameters = new Dictionary() { { "detailedErrors", value } }; - var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + var config = new WebApplicationOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); Assert.Equal(expected, config.DetailedErrors); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs similarity index 77% rename from test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs rename to test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index da2dd15336..d66419639f 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEngineTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -9,7 +9,6 @@ using System.Linq; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; -using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Hosting.Startup; using Microsoft.AspNet.Http; @@ -25,7 +24,7 @@ using Xunit; namespace Microsoft.AspNet.Hosting { - public class HostingEngineTests : IServerFactory, IServer + public class WebApplicationTests : IServerFactory, IServer { private readonly IList _startInstances = new List(); private IFeatureCollection _featuresSupportedByThisHost = NewFeatureCollection(); @@ -63,7 +62,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void HostingEngineThrowsWithNoServer() + public void WebApplicationThrowsWithNoServer() { var ex = Assert.Throws(() => CreateBuilder().Build().Start()); Assert.True(ex.Message.Contains("UseServer()")); @@ -86,9 +85,9 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var host = CreateBuilder(config).Build(); - host.Start(); - Assert.NotNull(host.ApplicationServices.GetRequiredService()); + var application = CreateBuilder(config).Build(); + application.Start(); + Assert.NotNull(application.Services.GetService()); } [Fact] @@ -102,9 +101,9 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var host = CreateBuilder(config).Build(); - host.Start(); - Assert.NotNull(host.ApplicationServices.GetRequiredService()); + var application = CreateBuilder(config).Build(); + application.Start(); + Assert.NotNull(application.Services.GetService()); } [Fact] @@ -119,10 +118,10 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var host = CreateBuilder(config).Build(); - var app = host.Start(); - Assert.NotNull(host.ApplicationServices.GetRequiredService()); - Assert.Equal("http://localhost:abc123", app.ServerFeatures.Get().Addresses.First()); + var application = CreateBuilder(config).Build(); + var app = application.Start(); + Assert.NotNull(application.Services.GetService()); + Assert.Equal("http://localhost:abc123", application.ServerFeatures.Get().Addresses.First()); } [Fact] @@ -136,10 +135,10 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var host = CreateBuilder(config).Build(); - var app = host.Start(); - Assert.NotNull(host.ApplicationServices.GetRequiredService()); - Assert.Equal("http://localhost:5000", app.ServerFeatures.Get().Addresses.First()); + var application = CreateBuilder(config).Build(); + var app = application.Start(); + Assert.NotNull(application.Services.GetService()); + Assert.Equal("http://localhost:5000", application.GetAddresses().First()); } [Fact] @@ -153,84 +152,85 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var host = CreateBuilder(config).Build(); - var app = host.Start(); - var hostingEnvironment = host.ApplicationServices.GetRequiredService(); + var application = CreateBuilder(config).Build(); + var app = application.Start(); + var hostingEnvironment = application.Services.GetService(); Assert.NotNull(hostingEnvironment.Configuration); Assert.Equal("Microsoft.AspNet.Hosting.Tests", hostingEnvironment.Configuration["Server"]); } [Fact] - public void HostingEngineCanBeStarted() + public void WebApplicationCanBeStarted() { - var engine = CreateBuilder() + var app = CreateBuilder() .UseServer(this) .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build() .Start(); - Assert.NotNull(engine); + Assert.NotNull(app); Assert.Equal(1, _startInstances.Count); Assert.Equal(0, _startInstances[0].DisposeCalls); - engine.Dispose(); + app.Dispose(); Assert.Equal(1, _startInstances[0].DisposeCalls); } [Fact] - public void HostingEngineDisposesServiceProvider() + public void WebApplicationDisposesServiceProvider() { - var engine = CreateBuilder() + var application = CreateBuilder() .UseServer(this) - .UseServices(s => + .ConfigureServices(s => { s.AddTransient(); s.AddSingleton(); }) .UseStartup("Microsoft.AspNet.Hosting.Tests") - .Build() - .Start(); + .Build(); - var singleton = (FakeService)engine.Services.GetService(); - var transient = (FakeService)engine.Services.GetService(); + var app = application.Start(); + + var singleton = (FakeService)application.Services.GetService(); + var transient = (FakeService)application.Services.GetService(); Assert.False(singleton.Disposed); Assert.False(transient.Disposed); - engine.Dispose(); + app.Dispose(); Assert.True(singleton.Disposed); Assert.True(transient.Disposed); } [Fact] - public void HostingEngineNotifiesApplicationStarted() + public void WebApplicationNotifiesApplicationStarted() { - var host = CreateBuilder() + var application = CreateBuilder() .UseServer(this) .Build(); - var applicationLifetime = host.ApplicationServices.GetRequiredService(); + var applicationLifetime = application.Services.GetService(); Assert.False(applicationLifetime.ApplicationStarted.IsCancellationRequested); - using (host.Start()) + using (application.Start()) { Assert.True(applicationLifetime.ApplicationStarted.IsCancellationRequested); } } [Fact] - public void HostingEngineInjectsHostingEnvironment() + public void WebApplicationInjectsHostingEnvironment() { - var engine = CreateBuilder() + var application = CreateBuilder() .UseServer(this) .UseStartup("Microsoft.AspNet.Hosting.Tests") .UseEnvironment("WithHostingEnvironment") .Build(); - using (var server = engine.Start()) + using (application.Start()) { - var env = engine.ApplicationServices.GetRequiredService(); + var env = application.Services.GetService(); Assert.Equal("Changed", env.EnvironmentName); } } @@ -238,26 +238,29 @@ namespace Microsoft.AspNet.Hosting [Fact] public void CanReplaceStartupLoader() { - var engine = CreateBuilder().UseServices(services => services.AddTransient()) + var builder = CreateBuilder() + .ConfigureServices(services => + { + services.AddTransient(); + }) .UseServer(this) - .UseStartup("Microsoft.AspNet.Hosting.Tests") - .Build(); + .UseStartup("Microsoft.AspNet.Hosting.Tests"); - Assert.Throws(() => engine.Start()); + Assert.Throws(() => builder.Build()); } [Fact] public void CanCreateApplicationServicesWithAddedServices() { - var host = CreateBuilder().UseServices(services => services.AddOptions()).Build(); - Assert.NotNull(host.ApplicationServices.GetRequiredService>()); + var application = CreateBuilder().UseServer(this).ConfigureServices(services => services.AddOptions()).Build(); + Assert.NotNull(application.Services.GetRequiredService>()); } [Fact] public void EnvDefaultsToProductionIfNoConfig() { - var engine = CreateBuilder().Build(); - var env = engine.ApplicationServices.GetRequiredService(); + var application = CreateBuilder().UseServer(this).Build(); + var env = application.Services.GetService(); Assert.Equal(EnvironmentName.Production, env.EnvironmentName); } @@ -266,7 +269,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - // Old key is actualy ASPNET_ENV but WebHostConfiguration expects environment + // Old key is actualy ASPNET_ENV but WebApplicationConfiguration expects environment // variable names stripped from ASPNET_ prefix so using just ENV here { "ENV", "Staging" } }; @@ -275,8 +278,8 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var engine = CreateBuilder(config).Build(); - var env = engine.ApplicationServices.GetRequiredService(); + var application = CreateBuilder(config).UseServer(this).Build(); + var env = application.Services.GetService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -292,8 +295,8 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var engine = CreateBuilder(config).Build(); - var env = engine.ApplicationServices.GetRequiredService(); + var application = CreateBuilder(config).UseServer(this).Build(); + var env = application.Services.GetService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -309,8 +312,8 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var engine = CreateBuilder(config).UseServer(this).Build(); - var env = engine.ApplicationServices.GetRequiredService(); + var application = CreateBuilder(config).UseServer(this).Build(); + var env = application.Services.GetService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } @@ -318,10 +321,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public void IsEnvironment_Extension_Is_Case_Insensitive() { - var engine = CreateBuilder().UseServer(this).Build(); - using (engine.Start()) + var application = CreateBuilder().UseServer(this).Build(); + using (application.Start()) { - var env = engine.ApplicationServices.GetRequiredService(); + var env = application.Services.GetRequiredService(); Assert.True(env.IsEnvironment(EnvironmentName.Production)); Assert.True(env.IsEnvironment("producTion")); } @@ -349,7 +352,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void HostingEngine_CreatesDefaultRequestIdentifierFeature_IfNotPresent() + public void WebApplication_CreatesDefaultRequestIdentifierFeature_IfNotPresent() { // Arrange HttpContext httpContext = null; @@ -358,10 +361,10 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var hostingEngine = CreateHostingEngine(requestDelegate); + var application = CreateApplication(requestDelegate); // Act - var disposable = hostingEngine.Start(); + var disposable = application.Start(); // Assert Assert.NotNull(httpContext); @@ -371,7 +374,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void HostingEngine_DoesNot_CreateDefaultRequestIdentifierFeature_IfPresent() + public void WebApplication_DoesNot_CreateDefaultRequestIdentifierFeature_IfPresent() { // Arrange HttpContext httpContext = null; @@ -382,10 +385,10 @@ namespace Microsoft.AspNet.Hosting }); var requestIdentifierFeature = new StubHttpRequestIdentifierFeature(); _featuresSupportedByThisHost[typeof(IHttpRequestIdentifierFeature)] = requestIdentifierFeature; - var hostingEngine = CreateHostingEngine(requestDelegate); + var application = CreateApplication(requestDelegate); // Act - var disposable = hostingEngine.Start(); + var disposable = application.Start(); // Assert Assert.NotNull(httpContext); @@ -393,16 +396,16 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void HostingEngine_InvokesConfigureMethodsOnlyOnce() + public void WebApplication_InvokesConfigureMethodsOnlyOnce() { - var engine = CreateBuilder() + var application = CreateBuilder() .UseServer(this) .UseStartup() .Build(); - using (engine.Start()) + using (application.Start()) { - var services = engine.ApplicationServices; - var services2 = engine.ApplicationServices; + var services = application.Services; + var services2 = application.Services; Assert.Equal(1, CountStartup.ConfigureCount); Assert.Equal(1, CountStartup.ConfigureServicesCount); } @@ -425,13 +428,13 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void HostingEngine_ThrowsForBadConfigureServiceSignature() + public void WebApplication_ThrowsForBadConfigureServiceSignature() { - var engine = CreateBuilder() + var builder = CreateBuilder() .UseServer(this) - .UseStartup() - .Build(); - var ex = Assert.Throws(() => engine.Start()); + .UseStartup(); + + var ex = Assert.Throws(() => builder.Build()); Assert.True(ex.Message.Contains("ConfigureServices")); } @@ -441,27 +444,26 @@ namespace Microsoft.AspNet.Hosting public void Configure(IApplicationBuilder app) { } } - private IHostingEngine CreateHostingEngine(RequestDelegate requestDelegate) + private IWebApplication CreateApplication(RequestDelegate requestDelegate) { - var host = CreateBuilder() + var builder = CreateBuilder() .UseServer(this) - .UseStartup( + .Configure( appBuilder => { appBuilder.ApplicationServices.GetRequiredService().AddProvider(new AllMessagesAreNeeded()); appBuilder.Run(requestDelegate); - }, - configureServices => configureServices.BuildServiceProvider()); - return host.Build(); + }); + return builder.Build(); } private void RunMapPath(string virtualPath, string expectedSuffix) { - var engine = CreateBuilder().UseServer(this).Build(); + var application = CreateBuilder().UseServer(this).Build(); - using (engine.Start()) + using (application.Start()) { - var env = engine.ApplicationServices.GetRequiredService(); + var env = application.Services.GetRequiredService(); // MapPath requires webroot to be set, we don't care // about file provider so just set it here env.WebRootPath = "."; @@ -471,9 +473,9 @@ namespace Microsoft.AspNet.Hosting } } - private WebHostBuilder CreateBuilder(IConfiguration config = null) + private WebApplicationBuilder CreateBuilder(IConfiguration config = null) { - return new WebHostBuilder(config ?? new ConfigurationBuilder().Build()); + return new WebApplicationBuilder().UseConfiguration(config ?? new ConfigurationBuilder().Build()).UseStartup("Microsoft.AspNet.Hosting.Tests"); } public void Start(IHttpApplication application) diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs index bcc4c79707..a47cf1f00c 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs @@ -1,6 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Testing.xunit; using Xunit; @@ -13,7 +14,8 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono)] public void AddRequestHeader() { - var server = TestServer.Create(app => { }); + var builder = new WebApplicationBuilder().Configure(app => { }); + var server = new TestServer(builder); server.CreateRequest("/") .AddHeader("Host", "MyHost:90") .And(request => @@ -25,7 +27,8 @@ namespace Microsoft.AspNet.TestHost [Fact] public void AddContentHeaders() { - var server = TestServer.Create(app => { }); + var builder = new WebApplicationBuilder().Configure(app => { }); + var server = new TestServer(builder); server.CreateRequest("/") .AddHeader("Content-Type", "Test/Value") .And(request => diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 61e0f2b9d7..a453aaa564 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -10,6 +10,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; using Microsoft.AspNet.Testing.xunit; using Xunit; @@ -22,7 +23,7 @@ namespace Microsoft.AspNet.TestHost public TestClientTests() { - _server = TestServer.Create(app => app.Run(ctx => Task.FromResult(0))); + _server = new TestServer(new WebApplicationBuilder().Configure(app => app.Run(ctx => Task.FromResult(0)))); } [ConditionalFact] @@ -33,7 +34,8 @@ namespace Microsoft.AspNet.TestHost var expected = "GET Response"; RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(expected); - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); // Act @@ -55,7 +57,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); // Act @@ -77,7 +80,8 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); // Act @@ -94,7 +98,8 @@ namespace Microsoft.AspNet.TestHost // Arrange RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " PUT Response"); - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); // Act @@ -112,7 +117,8 @@ namespace Microsoft.AspNet.TestHost // Arrange RequestDelegate appDelegate = async ctx => await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " POST Response"); - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); // Act @@ -150,10 +156,11 @@ namespace Microsoft.AspNet.TestHost } } }; - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(appDelegate); }); + var server = new TestServer(builder); // Act var client = server.CreateWebSocketClient(); @@ -198,10 +205,11 @@ namespace Microsoft.AspNet.TestHost websocket.Dispose(); } }; - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(appDelegate); }); + var server = new TestServer(builder); // Act var client = server.CreateWebSocketClient(); @@ -231,10 +239,11 @@ namespace Microsoft.AspNet.TestHost } } }; - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(appDelegate); }); + var server = new TestServer(builder); // Act var client = server.CreateWebSocketClient(); @@ -279,7 +288,8 @@ namespace Microsoft.AspNet.TestHost }; // Act - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead); @@ -310,7 +320,8 @@ namespace Microsoft.AspNet.TestHost }; // Act - var server = TestServer.Create(app => app.Run(appDelegate)); + var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var server = new TestServer(builder); var client = server.CreateClient(); var cts = new CancellationTokenSource(); cts.CancelAfter(500); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index b923a10826..92fdc85fb8 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -28,20 +28,21 @@ namespace Microsoft.AspNet.TestHost { // Arrange // Act & Assert (Does not throw) - TestServer.Create(app => { }); + new TestServer(new WebApplicationBuilder().Configure(app => { })); } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task RequestServicesAutoCreated() { - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { return context.Response.WriteAsync("RequestServices:" + (context.RequestServices != null)); }); }); + var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("RequestServices:True", result); @@ -71,7 +72,8 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CustomServiceProviderSetsApplicationServices() { - var server = new TestServer(TestServer.CreateBuilder().UseStartup()); + var builder = new WebApplicationBuilder().UseStartup(); + var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("ApplicationServicesEqual:True", result); } @@ -113,15 +115,20 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ExistingRequestServicesWillNotBeReplaced() { - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { var service = context.RequestServices.GetService(); return context.Response.WriteAsync("Found:" + (service != null)); }); - }, - services => services.AddTransient()); + }) + .ConfigureServices(services => + { + services.AddTransient(); + }); + var server = new TestServer(builder); + string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Found:True", result); } @@ -130,19 +137,21 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanSetCustomServiceProvider() { - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { context.RequestServices = new ServiceCollection() .AddTransient() .BuildServiceProvider(); - + var s = context.RequestServices.GetRequiredService(); return context.Response.WriteAsync("Success"); }); }); + var server = new TestServer(builder); + string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); } @@ -178,15 +187,20 @@ namespace Microsoft.AspNet.TestHost public async Task ExistingServiceProviderFeatureWillNotBeReplaced() { var appServices = new ServiceCollection().BuildServiceProvider(); - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { Assert.Equal(appServices, context.RequestServices); return context.Response.WriteAsync("Success"); }); - }, - services => services.AddSingleton(new ReplaceServiceProvidersFeatureFilter(appServices, appServices))); + }) + .ConfigureServices(services => + { + services.AddSingleton(new ReplaceServiceProvidersFeatureFilter(appServices, appServices)); + }); + var server = new TestServer(builder); + var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); } @@ -215,15 +229,20 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() { - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { Assert.NotNull(context.RequestServices); return context.Response.WriteAsync("Success"); }); - }, - services => services.AddTransient()); + }) + .ConfigureServices(services => + { + services.AddTransient(); + }); + var server = new TestServer(builder); + var result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("Success", result); } @@ -232,7 +251,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAccessLogger() { - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { @@ -240,6 +259,7 @@ namespace Microsoft.AspNet.TestHost return context.Response.WriteAsync("FoundLogger:" + (logger != null)); }); }); + var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("FoundLogger:True", result); @@ -249,18 +269,19 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAccessHttpContext() { - Action configureServices = services => - { - services.AddSingleton(); - }; - TestServer server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { var accessor = app.ApplicationServices.GetRequiredService(); - return context.Response.WriteAsync("HasContext:"+(accessor.HttpContext != null)); + return context.Response.WriteAsync("HasContext:" + (accessor.HttpContext != null)); }); - }, configureServices); + }) + .ConfigureServices(services => + { + services.AddSingleton(); + }); + var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -280,19 +301,20 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAddNewHostServices() { - Action configureServices = services => - { - services.AddSingleton(); - services.AddSingleton(); - }; - TestServer server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { var accessor = app.ApplicationServices.GetRequiredService(); return context.Response.WriteAsync("HasContext:" + (accessor.Accessor.HttpContext != null)); }); - }, configureServices); + }) + .ConfigureServices(services => + { + services.AddSingleton(); + services.AddSingleton(); + }); + var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("HasContext:True", result); @@ -302,13 +324,14 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CreateInvokesApp() { - TestServer server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(context => { return context.Response.WriteAsync("CreateInvokesApp"); }); }); + var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("CreateInvokesApp", result); @@ -318,7 +341,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task DisposeStreamIgnored() { - TestServer server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(async context => { @@ -326,6 +349,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Body.Dispose(); }); }); + var server = new TestServer(builder); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); @@ -336,7 +360,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task DisposedServerThrows() { - TestServer server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { app.Run(async context => { @@ -344,6 +368,7 @@ namespace Microsoft.AspNet.TestHost context.Response.Body.Dispose(); }); }); + var server = new TestServer(builder); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); @@ -355,15 +380,17 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CancelAborts() { - TestServer server = TestServer.Create(app => - { - app.Run(context => - { - TaskCompletionSource tcs = new TaskCompletionSource(); - tcs.SetCanceled(); - return tcs.Task; - }); - }); + var builder = new WebApplicationBuilder() + .Configure(app => + { + app.Run(context => + { + TaskCompletionSource tcs = new TaskCompletionSource(); + tcs.SetCanceled(); + return tcs.Task; + }); + }); + var server = new TestServer(builder); await Assert.ThrowsAsync(async () => { string result = await server.CreateClient().GetStringAsync("/path"); }); } @@ -372,7 +399,9 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanCreateViaStartupType() { - TestServer server = new TestServer(TestServer.CreateBuilder().UseStartup()); + var builder = new WebApplicationBuilder() + .UseStartup(); + var server = new TestServer(builder); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundService:True", await result.Content.ReadAsStringAsync()); @@ -382,9 +411,11 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanCreateViaStartupTypeAndSpecifyEnv() { - TestServer server = new TestServer(TestServer.CreateBuilder() - .UseStartup() - .UseEnvironment("Foo")); + var builder = new WebApplicationBuilder() + .UseStartup() + .UseEnvironment("Foo"); + var server = new TestServer(builder); + HttpResponseMessage result = await server.CreateClient().GetAsync("/"); Assert.Equal(HttpStatusCode.OK, result.StatusCode); Assert.Equal("FoundFoo:False", await result.Content.ReadAsStringAsync()); @@ -395,14 +426,18 @@ namespace Microsoft.AspNet.TestHost public async Task BeginEndDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; - var server = TestServer.Create(app => - { - diagnosticListener = app.ApplicationServices.GetRequiredService(); - app.Run(context => - { - return context.Response.WriteAsync("Hello World"); - }); - }); + + var builder = new WebApplicationBuilder() + .Configure(app => + { + diagnosticListener = app.ApplicationServices.GetRequiredService(); + app.Run(context => + { + return context.Response.WriteAsync("Hello World"); + }); + }); + var server = new TestServer(builder); + var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); var result = await server.CreateClient().GetStringAsync("/path"); @@ -421,7 +456,7 @@ namespace Microsoft.AspNet.TestHost public async Task ExceptionDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; - var server = TestServer.Create(app => + var builder = new WebApplicationBuilder().Configure(app => { diagnosticListener = app.ApplicationServices.GetRequiredService(); app.Run(context => @@ -429,10 +464,12 @@ namespace Microsoft.AspNet.TestHost throw new Exception("Test exception"); }); }); + var server = new TestServer(builder); + var listener = new TestDiagnosticListener(); diagnosticListener.SubscribeWithAdapter(listener); await Assert.ThrowsAsync(() => server.CreateClient().GetAsync("/path")); - + // This ensures that all diagnostics are completely written to the diagnostic listener Thread.Sleep(1000); From 94bf7bf2d5646f85b9bf6748e8c814106d3781e4 Mon Sep 17 00:00:00 2001 From: Chris R Date: Mon, 21 Dec 2015 10:17:50 -0800 Subject: [PATCH 0941/1838] Dont select an architecture specific version of IIS Express. --- .../Deployers/IISExpressDeployer.cs | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 96f69b2b7f..c60bf11b37 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -126,20 +126,11 @@ namespace Microsoft.AspNet.Server.Testing private string GetIISExpressPath() { // Get path to program files - var iisExpressPath = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles(x86)"), "IIS Express", "iisexpress.exe"); - - // Get path to 64 bit of IIS Express - if (DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x64) - { - iisExpressPath = Path.Combine(Environment.GetEnvironmentVariable("ProgramFiles"), "IIS Express", "iisexpress.exe"); - - // If process is 32 bit, the path points to x86. Replace path to point to x64 - iisExpressPath = IntPtr.Size == 8 ? iisExpressPath : iisExpressPath.Replace(" (x86)", ""); - } + var iisExpressPath = Path.Combine(Environment.GetEnvironmentVariable("SystemDrive") + "\\", "Program Files", "IIS Express", "iisexpress.exe"); if (!File.Exists(iisExpressPath)) { - throw new Exception("Unable to find IISExpress on the machine"); + throw new Exception("Unable to find IISExpress on the machine: " + iisExpressPath); } return iisExpressPath; From 7b43502817950107cd7e23d10530288e39e9a320 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 21 Dec 2015 14:37:04 -0800 Subject: [PATCH 0942/1838] Update selfhost to specify server via command line --- .../Deployers/SelfHostDeployer.cs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 1d2c2b1ed7..e1fdc509b0 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading; @@ -51,10 +52,14 @@ namespace Microsoft.AspNet.Server.Testing var commandName = DeploymentParameters.Command; if (string.IsNullOrEmpty(commandName)) { - commandName = DeploymentParameters.ServerType == ServerType.WebListener ? "weblistener" : "kestrel"; + commandName = "run"; } + var dnxPath = Path.Combine(ChosenRuntimePath, DnxCommandName); - var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" {commandName} --server.urls {DeploymentParameters.ApplicationBaseUriHint}"; + var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" {commandName} " + + $"--server.urls {DeploymentParameters.ApplicationBaseUriHint} " + + $"--server {(DeploymentParameters.ServerType == ServerType.WebListener ? "Microsoft.AspNet.Server.WebListener" : "Microsoft.AspNet.Server.Kestrel")}"; + Logger.LogInformation($"Executing {dnxPath} {dnxArgs}"); var startInfo = new ProcessStartInfo From 0e2fa1711df2fc7ec68c401f03a27560ab51cef7 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 21 Dec 2015 14:53:01 -0800 Subject: [PATCH 0943/1838] React to OptionsModel => Options --- test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs | 2 +- test/Microsoft.AspNet.Hosting.Tests/project.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs index 8b0c67652d..6c7f3dd5fc 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs @@ -10,7 +10,7 @@ using Microsoft.AspNet.Hosting.Fakes; using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Startup; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.Options; using Xunit; namespace Microsoft.AspNet.Hosting.Tests diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index d66419639f..74621076fe 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -18,7 +18,7 @@ using Microsoft.AspNet.Testing.xunit; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.Options; using Microsoft.Extensions.Primitives; using Xunit; diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 07b3452630..1a974b1eea 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -7,7 +7,7 @@ "Microsoft.AspNet.Hosting": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.Options": "1.0.0-*", "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", "xunit.runner.aspnet": "2.0.0-aspnet-*" }, From 1a485fadb0941ed71393f30a105789208e6ee811 Mon Sep 17 00:00:00 2001 From: Hao Kung Date: Mon, 21 Dec 2015 15:04:10 -0800 Subject: [PATCH 0944/1838] OptionsModel => Options --- .../EncoderServiceCollectionExtensions.cs | 2 +- src/Microsoft.Extensions.WebEncoders/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs index c2327d330d..7ef6fe8fe9 100644 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs +++ b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs @@ -4,7 +4,7 @@ using System; using System.Text.Encodings.Web; using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.OptionsModel; +using Microsoft.Extensions.Options; using Microsoft.Extensions.WebEncoders; namespace Microsoft.Extensions.DependencyInjection diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json index d020a87412..0facfeeb8c 100644 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ b/src/Microsoft.Extensions.WebEncoders/project.json @@ -12,7 +12,7 @@ }, "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.OptionsModel": "1.0.0-*", + "Microsoft.Extensions.Options": "1.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { From 45a1981e3b7f727412a8094ef02e329673b2b564 Mon Sep 17 00:00:00 2001 From: Henk Mollema Date: Tue, 22 Dec 2015 08:50:31 +0100 Subject: [PATCH 0945/1838] Remove dnx451 and dnxcore50 TFM's --- src/Microsoft.AspNet.Hosting/project.json | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 81c7525f8e..a44b68f284 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -29,23 +29,11 @@ "System.Diagnostics.DiagnosticSource": "4.0.0-*" }, "frameworks": { - "dnx451": { - "frameworkAssemblies": { - "System.Runtime": "" - } - }, "net451": { "frameworkAssemblies": { "System.Runtime": { "type": "build" } } }, - "dnxcore50": { - "dependencies": { - "System.Console": "4.0.0-*", - "System.Diagnostics.StackTrace": "4.0.1-*", - "System.Reflection.Extensions": "4.0.1-*" - } - }, "dotnet5.4": { "dependencies": { "System.Console": "4.0.0-*", From 216fe7843c3f295b6dc5799fcb0dc4e69f73f75c Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Tue, 22 Dec 2015 13:44:57 +0000 Subject: [PATCH 0946/1838] Remove unnecessary state machine --- src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs index c5b74dca72..5ed245354a 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs @@ -76,9 +76,9 @@ namespace Microsoft.AspNet.Hosting.Internal _httpContextFactory.Dispose(httpContext); } - public async Task ProcessRequestAsync(Context context) + public Task ProcessRequestAsync(Context context) { - await _application(context.HttpContext); + return _application(context.HttpContext); } public struct Context From f5a866ff3cb84b44499c90c1ca9ed2a57860de07 Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 22 Dec 2015 15:12:28 -0800 Subject: [PATCH 0947/1838] Using new PlatformServices API --- .../Deployers/ApplicationDeployer.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 643c2d8310..f2a07b24fd 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -39,15 +39,15 @@ namespace Microsoft.AspNet.Server.Testing { get { - if (TestPlatformHelper.IsLinux) + if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Linux) { return "linux"; } - else if (TestPlatformHelper.IsMac) + else if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Darwin) { return "darwin"; } - else if (TestPlatformHelper.IsWindows) + else if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Windows) { return "win"; } From ee804e58412278c9d34dc114957ca17c1b248111 Mon Sep 17 00:00:00 2001 From: Brennan Date: Tue, 22 Dec 2015 16:01:31 -0800 Subject: [PATCH 0948/1838] Register FileBufferingReadStream for disposal --- src/Microsoft.AspNet.Http/BufferingHelper.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNet.Http/BufferingHelper.cs index e56d73e5cf..03c3db188f 100644 --- a/src/Microsoft.AspNet.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNet.Http/BufferingHelper.cs @@ -48,9 +48,9 @@ namespace Microsoft.AspNet.Http.Internal var body = request.Body; if (!body.CanSeek) { - // TODO: Register this buffer for disposal at the end of the request to ensure the temp file is deleted. - // Otherwise it won't get deleted until GC closes the stream. - request.Body = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + var fileStream = new FileBufferingReadStream(body, bufferThreshold, _getTempDirectory); + request.Body = fileStream; + request.HttpContext.Response.RegisterForDispose(fileStream); } return request; } From 83c8816eb79ca42158fe8fc7684f5013c9d529c8 Mon Sep 17 00:00:00 2001 From: Erez Testiler Date: Tue, 22 Dec 2015 09:39:50 -0500 Subject: [PATCH 0949/1838] Add support for hosting within a Windows service. --- Hosting.sln | 17 +++- ...osoft.AspNet.Hosting.WindowsServices.xproj | 19 +++++ .../WebApplicationExtensions.cs | 39 +++++++++ .../WebApplicationService.cs | 80 +++++++++++++++++++ .../project.json | 22 +++++ 5 files changed, 176 insertions(+), 1 deletion(-) create mode 100644 src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj create mode 100644 src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs create mode 100644 src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs create mode 100644 src/Microsoft.AspNet.Hosting.WindowsServices/project.json diff --git a/Hosting.sln b/Hosting.sln index a04fd5e533..ea81db18f9 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 -VisualStudioVersion = 14.0.23107.0 +VisualStudioVersion = 14.0.24720.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFFB-4819-A116-E39E361915AB}" EndProject @@ -30,6 +30,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9C75 EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleStartups", "samples\SampleStartups\SampleStartups.xproj", "{485B6745-7648-400A-A969-F68FCF194E46}" EndProject +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.WindowsServices", "src\Microsoft.AspNet.Hosting.WindowsServices\Microsoft.AspNet.Hosting.WindowsServices.xproj", "{03148731-EA95-40A2-BAE8-A12315EA1748}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -128,6 +130,18 @@ Global {485B6745-7648-400A-A969-F68FCF194E46}.Release|Mixed Platforms.Build.0 = Release|Any CPU {485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.ActiveCfg = Release|Any CPU {485B6745-7648-400A-A969-F68FCF194E46}.Release|x86.Build.0 = Release|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|x86.ActiveCfg = Debug|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Debug|x86.Build.0 = Debug|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Any CPU.Build.0 = Release|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Release|x86.ActiveCfg = Release|Any CPU + {03148731-EA95-40A2-BAE8-A12315EA1748}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -141,5 +155,6 @@ Global {FDBBA081-5248-4FC0-9E08-B46BEF3FA438} = {E0497F39-AFFB-4819-A116-E39E361915AB} {3DA89347-6731-4366-80C4-548F24E8607B} = {E0497F39-AFFB-4819-A116-E39E361915AB} {485B6745-7648-400A-A969-F68FCF194E46} = {9C7520A0-F2EB-411C-8BB2-80B39C937217} + {03148731-EA95-40A2-BAE8-A12315EA1748} = {E0497F39-AFFB-4819-A116-E39E361915AB} EndGlobalSection EndGlobal diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj b/src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj new file mode 100644 index 0000000000..39ccb16031 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj @@ -0,0 +1,19 @@ + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 03148731-ea95-40a2-bae8-a12315ea1748 + Microsoft.AspNet.Hosting.WindowsServices + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs new file mode 100644 index 0000000000..4eb008faa9 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs @@ -0,0 +1,39 @@ +using System.ServiceProcess; + +namespace Microsoft.AspNet.Hosting.WindowsServices +{ + /// + /// Extensions to + /// + public static class WebApplicationExtensions + { + /// + /// Runs the specified web application inside a Windows service and blocks until the service is stopped. + /// + /// An instance of the to host in the Windows service. + /// + /// This example shows how to use . + /// + /// public class Program + /// { + /// public static void Main(string[] args) + /// { + /// var config = WebApplicationConfiguration.GetDefault(args); + /// + /// var application = new WebApplicationBuilder() + /// .UseConfiguration(config) + /// .Build(); + /// + /// // This call will block until the service is stopped. + /// application.RunAsService(); + /// } + /// } + /// + /// + public static void RunAsService(this IWebApplication application) + { + var webApplicationService = new WebApplicationService(application); + ServiceBase.Run(webApplicationService); + } + } +} diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs new file mode 100644 index 0000000000..11819d3411 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs @@ -0,0 +1,80 @@ +using Microsoft.AspNet.Hosting.Internal; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using System; +using System.ServiceProcess; + +namespace Microsoft.AspNet.Hosting.WindowsServices +{ + /// + /// Provides an implementation of a Windows service that hosts ASP.NET. + /// + public class WebApplicationService : ServiceBase + { + private const string HostingJsonFile = "hosting.json"; + private const string EnvironmentVariablesPrefix = "ASPNET_"; + private const string ConfigFileKey = "config"; + private IWebApplication _application; + private IDisposable _applicationShutdown; + private bool _stopRequestedByWindows; + + /// + /// Creates an instance of WebApplicationService which hosts the specified web application. + /// + /// The web application to host in the Windows service. + public WebApplicationService(IWebApplication application) + { + _application = application; + } + + protected sealed override void OnStart(string[] args) + { + OnStarting(args); + + _application + .Services + .GetRequiredService() + .ApplicationStopped + .Register(() => + { + if (!_stopRequestedByWindows) + { + Stop(); + } + }); + + _applicationShutdown = _application.Start(); + + OnStarted(); + } + + protected sealed override void OnStop() + { + _stopRequestedByWindows = true; + OnStopping(); + _applicationShutdown?.Dispose(); + OnStopped(); + } + + /// + /// Executes before ASP.NET starts. + /// + /// The command line arguments passed to the service. + protected virtual void OnStarting(string[] args) { } + + /// + /// Executes after ASP.NET starts. + /// + protected virtual void OnStarted() { } + + /// + /// Executes before ASP.NET shuts down. + /// + protected virtual void OnStopping() { } + + /// + /// Executes after ASP.NET shuts down. + /// + protected virtual void OnStopped() { } + } +} diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/project.json b/src/Microsoft.AspNet.Hosting.WindowsServices/project.json new file mode 100644 index 0000000000..3da4890272 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/project.json @@ -0,0 +1,22 @@ +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications running within a Windows service.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*" + }, + "frameworks": { + "net451": { + "frameworkAssemblies": { + "System.ServiceProcess": "" + } + } + } +} From 4ec36de602cd9775088fa4d6125ea8ef04e22e4c Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 22 Dec 2015 16:56:32 -0800 Subject: [PATCH 0950/1838] Minor cleanup of WindowsServices --- .../WebApplicationExtensions.cs | 5 ++++- .../WebApplicationService.cs | 10 ++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs index 4eb008faa9..41f3e0548f 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs @@ -1,4 +1,7 @@ -using System.ServiceProcess; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.ServiceProcess; namespace Microsoft.AspNet.Hosting.WindowsServices { diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs index 11819d3411..a50d0d76a7 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs @@ -1,8 +1,9 @@ -using Microsoft.AspNet.Hosting.Internal; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + using System; using System.ServiceProcess; +using Microsoft.Extensions.DependencyInjection; namespace Microsoft.AspNet.Hosting.WindowsServices { @@ -11,9 +12,6 @@ namespace Microsoft.AspNet.Hosting.WindowsServices /// public class WebApplicationService : ServiceBase { - private const string HostingJsonFile = "hosting.json"; - private const string EnvironmentVariablesPrefix = "ASPNET_"; - private const string ConfigFileKey = "config"; private IWebApplication _application; private IDisposable _applicationShutdown; private bool _stopRequestedByWindows; From d07a07228771ebdc1a06835d0ee67d50d61ec126 Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 22 Dec 2015 19:58:51 -0800 Subject: [PATCH 0951/1838] Adding AssemblyInfo for WindowsServices --- .../Properties/AssemblyInfo.cs | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 src/Microsoft.AspNet.Hosting.WindowsServices/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/Properties/AssemblyInfo.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..b16f6dfb0a --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/Properties/AssemblyInfo.cs @@ -0,0 +1,8 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Reflection; +using System.Resources; + +[assembly: AssemblyMetadata("Serviceable", "True")] +[assembly: NeutralResourcesLanguage("en-us")] From 161d6ca5c0a70abf50b6ebbc0bca7a04b1d56b6d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Tue, 22 Dec 2015 15:25:45 -0800 Subject: [PATCH 0952/1838] Move Microsoft.Extensions.WebEncoders to HtmlAbstractions Fixes #512 --- HttpAbstractions.sln | 30 ----- NuGetPackageVerifier.json | 1 - .../EncoderServiceCollectionExtensions.cs | 63 ----------- .../EncoderServiceProviderExtensions.cs | 50 --------- .../Microsoft.Extensions.WebEncoders.xproj | 17 --- .../Properties/AssemblyInfo.cs | 8 -- .../Testing/HtmlTestEncoder.cs | 104 ------------------ .../Testing/JavaScriptTestEncoder.cs | 104 ------------------ .../Testing/UrlTestEncoder.cs | 104 ------------------ .../WebEncoderOptions.cs | 21 ---- .../project.json | 27 ----- .../project.json | 29 +++-- ...EncoderServiceCollectionExtensionsTests.cs | 90 --------------- .../EncoderServiceProviderExtensionsTests.cs | 103 ----------------- .../HtmlTestEncoderTest.cs | 26 ----- ...crosoft.Extensions.WebEncoders.Tests.xproj | 20 ---- .../project.json | 24 ---- 17 files changed, 17 insertions(+), 804 deletions(-) delete mode 100644 src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj delete mode 100644 src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs delete mode 100644 src/Microsoft.Extensions.WebEncoders/project.json delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj delete mode 100644 test/Microsoft.Extensions.WebEncoders.Tests/project.json diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index 9e07d734d8..e510c8c96e 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -34,10 +34,6 @@ Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers.Tests", "test\Microsoft.Net.Http.Headers.Tests\Microsoft.Net.Http.Headers.Tests.xproj", "{E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders", "src\Microsoft.Extensions.WebEncoders\Microsoft.Extensions.WebEncoders.xproj", "{DD2CE416-765E-4000-A03E-C2FF165DA1B6}" -EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Extensions.WebEncoders.Tests", "test\Microsoft.Extensions.WebEncoders.Tests\Microsoft.Extensions.WebEncoders.Tests.xproj", "{7AE2731D-43CD-4CF8-850A-4914DE2CE930}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{982F09D8-621E-4872-BA7B-BBDEA47D1EFD}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleApp", "samples\SampleApp\SampleApp.xproj", "{1D0764B4-1DEB-4232-A714-D4B7E846918A}" @@ -196,30 +192,6 @@ Global {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|Mixed Platforms.Build.0 = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.ActiveCfg = Release|Any CPU {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1}.Release|x86.Build.0 = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.ActiveCfg = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Debug|x86.Build.0 = Debug|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Any CPU.Build.0 = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.ActiveCfg = Release|Any CPU - {DD2CE416-765E-4000-A03E-C2FF165DA1B6}.Release|x86.Build.0 = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.ActiveCfg = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Debug|x86.Build.0 = Debug|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Any CPU.Build.0 = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|Mixed Platforms.Build.0 = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.ActiveCfg = Release|Any CPU - {7AE2731D-43CD-4CF8-850A-4914DE2CE930}.Release|x86.Build.0 = Release|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Any CPU.Build.0 = Debug|Any CPU {1D0764B4-1DEB-4232-A714-D4B7E846918A}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU @@ -251,8 +223,6 @@ Global {93C10E50-BCBB-4D8E-9492-D46E1396225B} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {60AA2FDB-8121-4826-8D00-9A143FEFAF66} = {A5A15F1C-885A-452A-A731-B0173DDBD913} {E6BB7AD1-BD10-4A23-B780-F4A86ADF00D1} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} - {DD2CE416-765E-4000-A03E-C2FF165DA1B6} = {A5A15F1C-885A-452A-A731-B0173DDBD913} - {7AE2731D-43CD-4CF8-850A-4914DE2CE930} = {F31FF137-390C-49BF-A3BD-7C6ED3597C21} {1D0764B4-1DEB-4232-A714-D4B7E846918A} = {982F09D8-621E-4872-BA7B-BBDEA47D1EFD} EndGlobalSection EndGlobal diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index 406f44c6a3..adea61d7de 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -15,7 +15,6 @@ "Microsoft.AspNet.Http.Features": { }, "Microsoft.AspNet.Owin": { }, "Microsoft.AspNet.WebUtilities": { }, - "Microsoft.Extensions.WebEncoders": { }, "Microsoft.Net.Http.Headers": { } } }, diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs deleted file mode 100644 index 7ef6fe8fe9..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceCollectionExtensions.cs +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text.Encodings.Web; -using Microsoft.Extensions.DependencyInjection.Extensions; -using Microsoft.Extensions.Options; -using Microsoft.Extensions.WebEncoders; - -namespace Microsoft.Extensions.DependencyInjection -{ - public static class EncoderServiceCollectionExtensions - { - public static IServiceCollection AddWebEncoders(this IServiceCollection services) - { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - - return AddWebEncoders(services, configureOptions: null); - } - - public static IServiceCollection AddWebEncoders(this IServiceCollection services, Action configureOptions) - { - if (services == null) - { - throw new ArgumentNullException(nameof(services)); - } - - services.AddOptions(); - - // Register the default encoders - // We want to call the 'Default' property getters lazily since they perform static caching - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => HtmlEncoder.Default, settings => HtmlEncoder.Create(settings)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => JavaScriptEncoder.Default, settings => JavaScriptEncoder.Create(settings)))); - services.TryAdd(ServiceDescriptor.Singleton( - CreateFactory(() => UrlEncoder.Default, settings => UrlEncoder.Create(settings)))); - - if (configureOptions != null) - { - services.Configure(configureOptions); - } - - return services; - } - - private static Func CreateFactory( - Func defaultFactory, - Func customSettingsFactory) - { - return serviceProvider => - { - var settings = serviceProvider?.GetService>()? - .Value? - .TextEncoderSettings; - return (settings != null) ? customSettingsFactory(settings) : defaultFactory(); - }; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs b/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs deleted file mode 100644 index 8d9d2da4e8..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/EncoderServiceProviderExtensions.cs +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Contains extension methods for fetching encoders from an . - /// - public static class EncoderServiceProviderExtensions - { - /// - /// Retrieves an from an . - /// - /// - /// This method is guaranteed never to return null. - /// It will return a default encoder instance if does not contain one or is null. - /// - public static HtmlEncoder GetHtmlEncoder(this IServiceProvider serviceProvider) - { - return (HtmlEncoder)serviceProvider?.GetService(typeof(HtmlEncoder)) ?? HtmlEncoder.Default; - } - - /// - /// Retrieves an from an . - /// - /// - /// This method is guaranteed never to return null. - /// It will return a default encoder instance if does not contain one or is null. - /// - public static JavaScriptEncoder GetJavaScriptEncoder(this IServiceProvider serviceProvider) - { - return (JavaScriptEncoder)serviceProvider?.GetService(typeof(JavaScriptEncoder)) ?? JavaScriptEncoder.Default; - } - - /// - /// Retrieves an from an . - /// - /// - /// This method is guaranteed never to return null. - /// It will return a default encoder instance if does not contain one or is null. - /// - public static UrlEncoder GetUrlEncoder(this IServiceProvider serviceProvider) - { - return (UrlEncoder)serviceProvider?.GetService(typeof(UrlEncoder)) ?? UrlEncoder.Default; - } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj b/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj deleted file mode 100644 index 084e7901ea..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Microsoft.Extensions.WebEncoders.xproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - dd2ce416-765e-4000-a03e-c2ff165da1b6 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs b/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs deleted file mode 100644 index b2437d9ad6..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Reflection; -using System.Resources; - -[assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs deleted file mode 100644 index 162ce4f6c1..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Testing/HtmlTestEncoder.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - /// - /// Encoder used for unit testing. - /// - public sealed class HtmlTestEncoder : HtmlEncoder - { - public override int MaxOutputCharactersPerInputCharacter - { - get { return 1; } - } - - public override string Encode(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (value.Length == 0) - { - return string.Empty; - } - - return $"HtmlEncode[[{value}]]"; - } - - public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("HtmlEncode[["); - output.Write(value, startIndex, characterCount); - output.Write("]]"); - } - - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("HtmlEncode[["); - output.Write(value.Substring(startIndex, characterCount)); - output.Write("]]"); - } - - public override bool WillEncode(int unicodeScalar) - { - return false; - } - - public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) - { - return -1; - } - - public override unsafe bool TryEncodeUnicodeScalar( - int unicodeScalar, - char* buffer, - int bufferLength, - out int numberOfCharactersWritten) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - numberOfCharactersWritten = 0; - return false; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs deleted file mode 100644 index bef4461676..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Testing/JavaScriptTestEncoder.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - /// - /// Encoder used for unit testing. - /// - public class JavaScriptTestEncoder : JavaScriptEncoder - { - public override int MaxOutputCharactersPerInputCharacter - { - get { return 1; } - } - - public override string Encode(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (value.Length == 0) - { - return string.Empty; - } - - return $"JavaScriptEncode[[{value}]]"; - } - - public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("JavaScriptEncode[["); - output.Write(value, startIndex, characterCount); - output.Write("]]"); - } - - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("JavaScriptEncode[["); - output.Write(value.Substring(startIndex, characterCount)); - output.Write("]]"); - } - - public override bool WillEncode(int unicodeScalar) - { - return false; - } - - public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) - { - return -1; - } - - public override unsafe bool TryEncodeUnicodeScalar( - int unicodeScalar, - char* buffer, - int bufferLength, - out int numberOfCharactersWritten) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - numberOfCharactersWritten = 0; - return false; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs b/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs deleted file mode 100644 index 295bda63e8..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/Testing/UrlTestEncoder.cs +++ /dev/null @@ -1,104 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - /// - /// Encoder used for unit testing. - /// - public class UrlTestEncoder : UrlEncoder - { - public override int MaxOutputCharactersPerInputCharacter - { - get { return 1; } - } - - public override string Encode(string value) - { - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (value.Length == 0) - { - return string.Empty; - } - - return $"UrlEncode[[{value}]]"; - } - - public override void Encode(TextWriter output, char[] value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("UrlEncode[["); - output.Write(value, startIndex, characterCount); - output.Write("]]"); - } - - public override void Encode(TextWriter output, string value, int startIndex, int characterCount) - { - if (output == null) - { - throw new ArgumentNullException(nameof(output)); - } - - if (value == null) - { - throw new ArgumentNullException(nameof(value)); - } - - if (characterCount == 0) - { - return; - } - - output.Write("UrlEncode[["); - output.Write(value.Substring(startIndex, characterCount)); - output.Write("]]"); - } - - public override bool WillEncode(int unicodeScalar) - { - return false; - } - - public override unsafe int FindFirstCharacterToEncode(char* text, int textLength) - { - return -1; - } - - public override unsafe bool TryEncodeUnicodeScalar( - int unicodeScalar, - char* buffer, - int bufferLength, - out int numberOfCharactersWritten) - { - if (buffer == null) - { - throw new ArgumentNullException(nameof(buffer)); - } - - numberOfCharactersWritten = 0; - return false; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs b/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs deleted file mode 100644 index 2f5e770a0c..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/WebEncoderOptions.cs +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Text.Encodings.Web; - -namespace Microsoft.Extensions.WebEncoders -{ - /// - /// Specifies options common to all three encoders (HtmlEncode, JavaScriptEncode, UrlEncode). - /// - public sealed class WebEncoderOptions - { - /// - /// Specifies which code points are allowed to be represented unescaped by the encoders. - /// - /// - /// If this property is null, then the encoders will use their default allow lists. - /// - public TextEncoderSettings TextEncoderSettings { get; set; } - } -} diff --git a/src/Microsoft.Extensions.WebEncoders/project.json b/src/Microsoft.Extensions.WebEncoders/project.json deleted file mode 100644 index 0facfeeb8c..0000000000 --- a/src/Microsoft.Extensions.WebEncoders/project.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "version": "1.0.0-*", - "description": "Contains registration and configuration APIs for the core framework encoders.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/httpabstractions" - }, - "compilationOptions": { - "warningsAsErrors": true, - "allowUnsafe": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", - "Microsoft.Extensions.Options": "1.0.0-*", - "System.Text.Encodings.Web": "4.0.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.IO": "", - "System.Runtime": "" - } - }, - "dotnet5.4": {} - } -} diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index 29994be207..b56d4034ca 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,15 +1,20 @@ { - "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "Microsoft.AspNet.Http.Core": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dependencies": { + "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" + }, + "compilationOptions": { + "warningsAsErrors": true + }, + "commands": { + "test": "xunit.runner.aspnet" + }, + "frameworks": { + "dnx451": { }, + "dnxcore50": { + "dependencies": { + "System.Text.Encoding.Extensions": "4.0.11-*" + } } + } } diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs deleted file mode 100644 index 8e060102bb..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceCollectionExtensionsTests.cs +++ /dev/null @@ -1,90 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System.Text.Encodings.Web; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.WebEncoders.Testing; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderServiceCollectionExtensionsTests - { - [Fact] - public void AddWebEncoders_WithoutOptions_RegistersDefaultEncoders() - { - // Arrange - var serviceCollection = new ServiceCollection(); - - // Act - serviceCollection.AddWebEncoders(); - - // Assert - var serviceProvider = serviceCollection.BuildServiceProvider(); - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(HtmlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(JavaScriptEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // default encoder - Assert.Same(UrlEncoder.Default, serviceProvider.GetRequiredService()); // as singleton instance - } - - [Fact] - public void AddWebEncoders_WithOptions_RegistersEncodersWithCustomCodeFilter() - { - // Arrange - var serviceCollection = new ServiceCollection(); - - // Act - serviceCollection.AddWebEncoders(options => - { - options.TextEncoderSettings = new TextEncoderSettings(); - options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed - }); - - // Assert - var serviceProvider = serviceCollection.BuildServiceProvider(); - - var htmlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("abcde", htmlEncoder.Encode("abcde")); - Assert.Same(htmlEncoder, serviceProvider.GetRequiredService()); // as singleton instance - - var javaScriptEncoder = serviceProvider.GetRequiredService(); - Assert.Equal(@"a\u0062c\u0064e", javaScriptEncoder.Encode("abcde")); - Assert.Same(javaScriptEncoder, serviceProvider.GetRequiredService()); // as singleton instance - - var urlEncoder = serviceProvider.GetRequiredService(); - Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); - Assert.Same(urlEncoder, serviceProvider.GetRequiredService()); // as singleton instance - } - - [Fact] - public void AddWebEncoders_DoesNotOverrideExistingRegisteredEncoders() - { - // Arrange - var serviceCollection = new ServiceCollection(); - - // Act - serviceCollection.AddSingleton(); - serviceCollection.AddSingleton(); - // we don't register an existing URL encoder - serviceCollection.AddWebEncoders(options => - { - options.TextEncoderSettings = new TextEncoderSettings(); - options.TextEncoderSettings.AllowCharacters("ace".ToCharArray()); // only these three chars are allowed - }); - - // Assert - var serviceProvider = serviceCollection.BuildServiceProvider(); - - var htmlEncoder = serviceProvider.GetHtmlEncoder(); - Assert.Equal("HtmlEncode[[abcde]]", htmlEncoder.Encode("abcde")); - - var javaScriptEncoder = serviceProvider.GetJavaScriptEncoder(); - Assert.Equal("JavaScriptEncode[[abcde]]", javaScriptEncoder.Encode("abcde")); - - var urlEncoder = serviceProvider.GetUrlEncoder(); - Assert.Equal("a%62c%64e", urlEncoder.Encode("abcde")); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs b/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs deleted file mode 100644 index 01492e759e..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/EncoderServiceProviderExtensionsTests.cs +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Text.Encodings.Web; -using Xunit; - -namespace Microsoft.Extensions.WebEncoders -{ - public class EncoderServiceProviderExtensionsTests - { - [Fact] - public void GetHtmlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() - { - // Arrange - var serviceProvider = new TestServiceProvider(); - - // Act - var retVal = serviceProvider.GetHtmlEncoder(); - - // Assert - Assert.Same(HtmlEncoder.Default, retVal); - } - - [Fact] - public void GetHtmlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() - { - // Arrange - var expectedEncoder = HtmlEncoder.Default; - var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; - - // Act - var retVal = serviceProvider.GetHtmlEncoder(); - - // Assert - Assert.Same(expectedEncoder, retVal); - } - - [Fact] - public void GetJavaScriptEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() - { - // Arrange - var serviceProvider = new TestServiceProvider(); - - // Act - var retVal = serviceProvider.GetJavaScriptEncoder(); - - // Assert - Assert.Same(JavaScriptEncoder.Default, retVal); - } - - [Fact] - public void GetJavaScriptEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() - { - // Arrange - var expectedEncoder = JavaScriptEncoder.Default; - var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; - - // Act - var retVal = serviceProvider.GetJavaScriptEncoder(); - - // Assert - Assert.Same(expectedEncoder, retVal); - } - - [Fact] - public void GetUrlEncoder_ServiceProviderDoesNotHaveEncoder_UsesDefault() - { - // Arrange - var serviceProvider = new TestServiceProvider(); - - // Act - var retVal = serviceProvider.GetUrlEncoder(); - - // Assert - Assert.Same(UrlEncoder.Default, retVal); - } - - [Fact] - public void GetUrlEncoder_ServiceProviderHasEncoder_ReturnsRegisteredInstance() - { - // Arrange - var expectedEncoder = UrlEncoder.Default; - var serviceProvider = new TestServiceProvider() { Service = expectedEncoder }; - - // Act - var retVal = serviceProvider.GetUrlEncoder(); - - // Assert - Assert.Same(expectedEncoder, retVal); - } - - private class TestServiceProvider : IServiceProvider - { - public object Service { get; set; } - - public object GetService(Type serviceType) - { - return Service; - } - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs b/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs deleted file mode 100644 index baafedc4de..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/HtmlTestEncoderTest.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Xunit; - -namespace Microsoft.Extensions.WebEncoders.Testing -{ - public class HtmlTestEncoderTest - { - [Theory] - [InlineData("", "")] - [InlineData("abcd", "HtmlEncode[[abcd]]")] - [InlineData("<<''\"\">>", "HtmlEncode[[<<''\"\">>]]")] - public void StringEncode_EncodesAsExpected(string input, string expectedOutput) - { - // Arrange - var encoder = new HtmlTestEncoder(); - - // Act - var output = encoder.Encode(input); - - // Assert - Assert.Equal(expectedOutput, output); - } - } -} diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj b/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj deleted file mode 100644 index 9b0698e3cc..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/Microsoft.Extensions.WebEncoders.Tests.xproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 7ae2731d-43cd-4cf8-850a-4914de2ce930 - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - - - - \ No newline at end of file diff --git a/test/Microsoft.Extensions.WebEncoders.Tests/project.json b/test/Microsoft.Extensions.WebEncoders.Tests/project.json deleted file mode 100644 index 4d81779a7c..0000000000 --- a/test/Microsoft.Extensions.WebEncoders.Tests/project.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "Microsoft.Extensions.WebEncoders": "1.0.0-*", - "Newtonsoft.Json": "6.0.6", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "compilationOptions": { - "allowUnsafe": true, - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { - "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-*" - } - } - } -} From 62ec29b6af32e229c64f2f1410215109d8d2b8a0 Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Thu, 31 Dec 2015 20:18:24 +0000 Subject: [PATCH 0953/1838] Move generic Get/Set into Interface --- .../FeatureCollection.cs | 10 +++++++ .../FeatureCollectionExtensions.cs | 30 ------------------- .../IFeatureCollection.cs | 14 +++++++++ .../OwinFeatureCollection.cs | 10 +++++++ 4 files changed, 34 insertions(+), 30 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs index 246af4d183..79e6916752 100644 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs @@ -93,6 +93,16 @@ namespace Microsoft.AspNet.Http.Features } } + public TFeature Get() + { + return (TFeature)this[typeof(TFeature)]; + } + + public void Set(TFeature instance) + { + this[typeof(TFeature)] = instance; + } + private class KeyComparer : IEqualityComparer> { public bool Equals(KeyValuePair x, KeyValuePair y) diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs b/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs deleted file mode 100644 index 86681fde3f..0000000000 --- a/src/Microsoft.AspNet.Http.Features/FeatureCollectionExtensions.cs +++ /dev/null @@ -1,30 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace Microsoft.AspNet.Http.Features -{ - public static class FeatureCollectionExtensions - { - /// - /// Retrieves the requested feature from the collection. - /// - /// The feature key. - /// The collection. - /// The requested feature, or null if it is not present. - public static TFeature Get(this IFeatureCollection features) - { - return (TFeature)features[typeof(TFeature)]; - } - - /// - /// Sets the given feature in the collection. - /// - /// The feature key. - /// The collection. - /// The feature value. - public static void Set(this IFeatureCollection features, TFeature instance) - { - features[typeof(TFeature)] = instance; - } - } -} diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs index c7ad165c66..454cafa3dc 100644 --- a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs @@ -27,5 +27,19 @@ namespace Microsoft.AspNet.Http.Features /// /// The requested feature, or null if it is not present. object this[Type key] { get; set; } + + /// + /// Retrieves the requested feature from the collection. + /// + /// The feature key. + /// The requested feature, or null if it is not present. + TFeature Get(); + + /// + /// Sets the given feature in the collection. + /// + /// The feature key. + /// The feature value. + void Set(TFeature instance); } } diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index acf3e2215c..1a1b5b183d 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -358,6 +358,16 @@ namespace Microsoft.AspNet.Owin throw new NotSupportedException(); } + public TFeature Get() + { + return (TFeature)this[typeof(TFeature)]; + } + + public void Set(TFeature instance) + { + this[typeof(TFeature)] = instance; + } + IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); From e4e40033b113e27f6f95a3886019275abe7c0c1e Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 31 Dec 2015 13:39:39 -0800 Subject: [PATCH 0954/1838] React to HttpAbstractions changes --- .../WebApplicationTests.cs | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index 74621076fe..9278d7ad17 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -558,11 +558,21 @@ namespace Microsoft.AspNet.Hosting { } + public TFeature Get() + { + return default(TFeature); + } + public IEnumerator> GetEnumerator() { yield break; } + public void Set(TFeature instance) + { + throw new NotSupportedException(); + } + IEnumerator IEnumerable.GetEnumerator() { yield break; From d8a20521f1bf799df362d32fd35c6a0bb280aad0 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 4 Jan 2016 16:38:23 -0800 Subject: [PATCH 0955/1838] Add Options to the default set of services #547 --- src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs | 1 + src/Microsoft.AspNet.Hosting/project.json | 1 + 2 files changed, 2 insertions(+) diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs index 4350a2b35b..12e595c50d 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs @@ -206,6 +206,7 @@ namespace Microsoft.AspNet.Hosting services.AddTransient(); services.AddTransient(); services.AddLogging(); + services.AddOptions(); var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); services.AddSingleton(diagnosticSource); diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index a44b68f284..302aa0ba37 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -15,6 +15,7 @@ "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.Extensions.Options": "1.0.0-*", "Microsoft.Extensions.Configuration": "1.0.0-*", "Microsoft.Extensions.Configuration.CommandLine": "1.0.0-*", "Microsoft.Extensions.Configuration.EnvironmentVariables": "1.0.0-*", From 46e3e25ec7c5212029b64a25efbe1f11cba2afc5 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Mon, 4 Jan 2016 17:43:23 -0800 Subject: [PATCH 0956/1838] Add the ability to set the IApplicationEnvironment.ApplicationBasePath - Added UseApplicationBasePath which sets the base path (used for views and static files) --- samples/SampleStartups/StartupFullControl.cs | 2 ++ .../WebApplicationBuilder.cs | 36 ++++++++++++++++++- .../WebApplicationBuilderTests.cs | 22 ++++++++++++ 3 files changed, 59 insertions(+), 1 deletion(-) diff --git a/samples/SampleStartups/StartupFullControl.cs b/samples/SampleStartups/StartupFullControl.cs index 34a00a5a46..82c32791d6 100644 --- a/samples/SampleStartups/StartupFullControl.cs +++ b/samples/SampleStartups/StartupFullControl.cs @@ -1,4 +1,5 @@ using System; +using System.IO; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.Extensions.DependencyInjection; @@ -14,6 +15,7 @@ namespace SampleStartups { var application = new WebApplicationBuilder() .UseServerFactory("Microsoft.AspNet.Server.Kestrel") // Set the server manually + .UseApplicationBasePath(Directory.GetCurrentDirectory()) // Override the application base with the current directory .UseEnvironment("Development") .UseWebRoot("public") .ConfigureLogging(loggerFactory => diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs index 12e595c50d..bec3ee4381 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs @@ -3,6 +3,7 @@ using System; using System.Diagnostics; +using System.Runtime.Versioning; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Builder; using Microsoft.AspNet.Hosting.Internal; @@ -29,6 +30,7 @@ namespace Microsoft.AspNet.Hosting private Action _configureServices; private string _environmentName; private string _webRoot; + private string _applicationBasePath; // Only one of these should be set private StartupMethods _startup; @@ -52,6 +54,12 @@ namespace Microsoft.AspNet.Hosting return this; } + public WebApplicationBuilder UseApplicationBasePath(string applicationBasePath) + { + _applicationBasePath = applicationBasePath; + return this; + } + public WebApplicationBuilder UseEnvironment(string environment) { if (environment == null) @@ -216,11 +224,18 @@ namespace Microsoft.AspNet.Hosting services.AddTransient(); var defaultPlatformServices = PlatformServices.Default; + if (defaultPlatformServices != null) { if (defaultPlatformServices.Application != null) { - services.TryAddSingleton(defaultPlatformServices.Application); + var appEnv = defaultPlatformServices.Application; + if (!string.IsNullOrEmpty(_applicationBasePath)) + { + appEnv = new WrappedApplicationEnvironment(_applicationBasePath, appEnv); + } + + services.TryAddSingleton(appEnv); } if (defaultPlatformServices.Runtime != null) @@ -236,5 +251,24 @@ namespace Microsoft.AspNet.Hosting return services; } + + private class WrappedApplicationEnvironment : IApplicationEnvironment + { + public WrappedApplicationEnvironment(string applicationBasePath, IApplicationEnvironment env) + { + ApplicationBasePath = applicationBasePath; + ApplicationName = env.ApplicationName; + ApplicationVersion = env.ApplicationVersion; + RuntimeFramework = env.RuntimeFramework; + } + + public string ApplicationBasePath { get; } + + public string ApplicationName { get; } + + public string ApplicationVersion { get; } + + public FrameworkName RuntimeFramework { get; } + } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs index edeaffb499..06f912ac17 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs @@ -13,6 +13,7 @@ using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.PlatformAbstractions; using Xunit; namespace Microsoft.AspNet.Hosting @@ -137,6 +138,27 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(expected, application.Services.GetService().EnvironmentName); } + [Fact] + public void UseBasePathConfiguresBasePath() + { + var vals = new Dictionary + { + { "ENV", "Dev" }, + }; + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + + var application = new WebApplicationBuilder() + .UseConfiguration(config) + .UseApplicationBasePath("/foo/bar") + .UseServer(new TestServer()) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build(); + + Assert.Equal("/foo/bar", application.Services.GetService().ApplicationBasePath); + } + private WebApplicationBuilder CreateWebApplicationBuilder() { var vals = new Dictionary From e72924796e7bc84f2e71c93b178f0f8846576ea4 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 6 Jan 2016 18:08:57 -0800 Subject: [PATCH 0957/1838] More hosting API changes - Added IWebApplicationBuilder and moved it to Hosting.Abstractions as a target for others to extend the web application builder. - Made methods extension methods where possible - Added UseUrls --- .../SampleStartups/StartupBlockingOnStart.cs | 3 +- .../StartupConfigureAddresses.cs | 5 +- .../StartupExternallyControlled.cs | 17 +- samples/SampleStartups/StartupFullControl.cs | 7 +- .../IWebApplication.cs | 4 +- .../IWebApplicationBuilder.cs | 28 ++++ .../project.json | 4 +- .../WebApplicationService.cs | 5 +- .../Internal/IncludedConfigurationProvider.cs | 39 +++++ .../Internal/WebApplication.cs | 31 ++-- .../Internal/WebApplicationOptions.cs | 3 + .../WebApplicationBuilder.cs | 124 ++++----------- .../WebApplicationBuilderExtensions.cs | 148 ++++++++++++++++++ .../WebApplicationConfiguration.cs | 4 +- .../WebApplicationExtensions.cs | 60 ------- src/Microsoft.AspNet.TestHost/TestServer.cs | 14 +- .../WebApplicationBuilderTests.cs | 45 +++++- .../WebApplicationConfigurationsTests.cs | 10 +- .../WebApplicationTests.cs | 64 ++++---- 19 files changed, 373 insertions(+), 242 deletions(-) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNet.Hosting.Abstractions}/IWebApplication.cs (91%) create mode 100644 src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs create mode 100644 src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs create mode 100644 src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs delete mode 100644 src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs diff --git a/samples/SampleStartups/StartupBlockingOnStart.cs b/samples/SampleStartups/StartupBlockingOnStart.cs index 39db2830c4..fdbc094d1b 100644 --- a/samples/SampleStartups/StartupBlockingOnStart.cs +++ b/samples/SampleStartups/StartupBlockingOnStart.cs @@ -35,8 +35,9 @@ namespace SampleStartups .UseStartup() .Build(); - using (application.Start()) + using (application) { + application.Start(); Console.ReadLine(); } } diff --git a/samples/SampleStartups/StartupConfigureAddresses.cs b/samples/SampleStartups/StartupConfigureAddresses.cs index 0fff30e2f8..00df99135b 100644 --- a/samples/SampleStartups/StartupConfigureAddresses.cs +++ b/samples/SampleStartups/StartupConfigureAddresses.cs @@ -32,12 +32,9 @@ namespace SampleStartups var application = new WebApplicationBuilder() .UseConfiguration(config) .UseStartup() + .UseUrls("http://localhost:5000", "http://localhost:5001") .Build(); - var addresses = application.GetAddresses(); - addresses.Add("http://localhost:5000"); - addresses.Add("http://localhost:5001"); - application.Run(); } } diff --git a/samples/SampleStartups/StartupExternallyControlled.cs b/samples/SampleStartups/StartupExternallyControlled.cs index dc7ce9d8b4..538e97decd 100644 --- a/samples/SampleStartups/StartupExternallyControlled.cs +++ b/samples/SampleStartups/StartupExternallyControlled.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; @@ -10,8 +11,8 @@ namespace SampleStartups { public class StartupExternallyControlled { - private readonly IWebApplication _host; - private IDisposable _application; + private IWebApplication _application; + private readonly List _urls = new List(); // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit http://go.microsoft.com/fwlink/?LinkID=398940 @@ -30,15 +31,13 @@ namespace SampleStartups public StartupExternallyControlled() { - _host = new WebApplicationBuilder().UseStartup().Build(); - - // Clear all configured addresses - _host.GetAddresses().Clear(); } public void Start() { - _application = _host.Start(); + _application = new WebApplicationBuilder() + .UseStartup() + .Start(_urls.ToArray()); } public void Stop() @@ -48,9 +47,7 @@ namespace SampleStartups public void AddUrl(string url) { - var addresses = _host.GetAddresses(); - - addresses.Add(url); + _urls.Add(url); } } } diff --git a/samples/SampleStartups/StartupFullControl.cs b/samples/SampleStartups/StartupFullControl.cs index 82c32791d6..1279bfb1a0 100644 --- a/samples/SampleStartups/StartupFullControl.cs +++ b/samples/SampleStartups/StartupFullControl.cs @@ -14,14 +14,11 @@ namespace SampleStartups public static void Main(string[] args) { var application = new WebApplicationBuilder() - .UseServerFactory("Microsoft.AspNet.Server.Kestrel") // Set the server manually + .UseServer("Microsoft.AspNet.Server.Kestrel") // Set the server manually .UseApplicationBasePath(Directory.GetCurrentDirectory()) // Override the application base with the current directory + .UseUrls("http://*:1000", "https://*:902") .UseEnvironment("Development") .UseWebRoot("public") - .ConfigureLogging(loggerFactory => - { - loggerFactory.AddProvider(new MyHostLoggerProvider()); - }) .ConfigureServices(services => { // Configure services that the application can see diff --git a/src/Microsoft.AspNet.Hosting/IWebApplication.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplication.cs similarity index 91% rename from src/Microsoft.AspNet.Hosting/IWebApplication.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IWebApplication.cs index 0db082a45f..cfafc97ee5 100644 --- a/src/Microsoft.AspNet.Hosting/IWebApplication.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplication.cs @@ -9,7 +9,7 @@ namespace Microsoft.AspNet.Hosting /// /// Represents a configured web application /// - public interface IWebApplication + public interface IWebApplication : IDisposable { /// /// The exposed by the configured server. @@ -25,6 +25,6 @@ namespace Microsoft.AspNet.Hosting /// Starts listening on the configured addresses. /// /// - IDisposable Start(); + void Start(); } } diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs new file mode 100644 index 0000000000..e92288a572 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs @@ -0,0 +1,28 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public interface IWebApplicationBuilder + { + IWebApplication Build(); + + IWebApplicationBuilder UseConfiguration(IConfiguration configuration); + + IWebApplicationBuilder UseServer(IServerFactory factory); + + IWebApplicationBuilder UseStartup(Type startupType); + + IWebApplicationBuilder ConfigureServices(Action configureServices); + + IWebApplicationBuilder Configure(Action configureApplication); + + IWebApplicationBuilder UseSetting(string key, string value); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index 087bc75058..f6a665e878 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -12,7 +12,9 @@ "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", - "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" + "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", + "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*", + "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs index a50d0d76a7..4cecc5705a 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs @@ -13,7 +13,6 @@ namespace Microsoft.AspNet.Hosting.WindowsServices public class WebApplicationService : ServiceBase { private IWebApplication _application; - private IDisposable _applicationShutdown; private bool _stopRequestedByWindows; /// @@ -41,7 +40,7 @@ namespace Microsoft.AspNet.Hosting.WindowsServices } }); - _applicationShutdown = _application.Start(); + _application.Start(); OnStarted(); } @@ -50,7 +49,7 @@ namespace Microsoft.AspNet.Hosting.WindowsServices { _stopRequestedByWindows = true; OnStopping(); - _applicationShutdown?.Dispose(); + _application?.Dispose(); OnStopped(); } diff --git a/src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs b/src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs new file mode 100644 index 0000000000..5feb23e761 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs @@ -0,0 +1,39 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.Extensions.Configuration; + +namespace Microsoft.AspNet.Hosting.Internal +{ + // TODO: Remove this once https://github.com/aspnet/Configuration/pull/349 gets merged + internal class IncludedConfigurationProvider : ConfigurationProvider + { + public IncludedConfigurationProvider(IConfiguration source) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + int pathStart = 0; + var section = source as IConfigurationSection; + if (section != null) + { + pathStart = section.Path.Length + 1; + } + foreach (var child in source.GetChildren()) + { + AddSection(child, pathStart); + } + } + + private void AddSection(IConfigurationSection section, int pathStart) + { + Data.Add(section.Path.Substring(pathStart), section.Value); + foreach (var child in section.GetChildren()) + { + AddSection(child, pathStart); + } + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs index 0014537a7b..170a7f26cd 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs @@ -32,6 +32,7 @@ namespace Microsoft.AspNet.Hosting.Internal private IServiceProvider _applicationServices; private RequestDelegate _application; + private ILogger _logger; // Only one of these should be set internal string StartupAssemblyName { get; set; } @@ -41,7 +42,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Only one of these should be set internal IServerFactory ServerFactory { get; set; } internal string ServerFactoryLocation { get; set; } - internal IServer Server { get; set; } + private IServer Server { get; set; } public WebApplication( IServiceCollection appServices, @@ -97,29 +98,20 @@ namespace Microsoft.AspNet.Hosting.Internal } } - public virtual IDisposable Start() + public virtual void Start() { Initialize(); - var logger = _applicationServices.GetRequiredService>(); + _logger = _applicationServices.GetRequiredService>(); var diagnosticSource = _applicationServices.GetRequiredService(); var httpContextFactory = _applicationServices.GetRequiredService(); - logger.Starting(); + _logger.Starting(); - Server.Start(new HostingApplication(_application, logger, diagnosticSource, httpContextFactory)); + Server.Start(new HostingApplication(_application, _logger, diagnosticSource, httpContextFactory)); _applicationLifetime.NotifyStarted(); - logger.Started(); - - return new Disposable(() => - { - logger.Shutdown(); - _applicationLifetime.StopApplication(); - Server.Dispose(); - _applicationLifetime.NotifyStopped(); - (_applicationServices as IDisposable)?.Dispose(); - }); + _logger.Started(); } private void EnsureApplicationServices() @@ -248,6 +240,15 @@ namespace Microsoft.AspNet.Hosting.Internal } } + public void Dispose() + { + _logger?.Shutdown(); + _applicationLifetime.StopApplication(); + Server?.Dispose(); + _applicationLifetime.NotifyStopped(); + (_applicationServices as IDisposable)?.Dispose(); + } + private class Disposable : IDisposable { private Action _dispose; diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs index ef76bcdb8f..1019c866ec 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs @@ -27,6 +27,7 @@ namespace Microsoft.AspNet.Hosting.Internal Environment = configuration[WebApplicationConfiguration.EnvironmentKey] ?? configuration[OldEnvironmentKey]; ServerFactoryLocation = configuration[WebApplicationConfiguration.ServerKey]; WebRoot = configuration[WebApplicationConfiguration.WebRootKey]; + ApplicationBasePath = configuration[WebApplicationConfiguration.ApplicationBaseKey]; } public string Application { get; set; } @@ -41,6 +42,8 @@ namespace Microsoft.AspNet.Hosting.Internal public string WebRoot { get; set; } + public string ApplicationBasePath { get; set; } + private static bool ParseBool(IConfiguration configuration, string key) { return string.Equals("true", configuration[key], StringComparison.OrdinalIgnoreCase) diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs index bec3ee4381..236b5c8392 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using System.Diagnostics; using System.Runtime.Versioning; using Microsoft.AspNet.Builder; @@ -16,10 +17,11 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.PlatformAbstractions; +using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Hosting { - public class WebApplicationBuilder + public class WebApplicationBuilder : IWebApplicationBuilder { private readonly IHostingEnvironment _hostingEnvironment; private readonly ILoggerFactory _loggerFactory; @@ -28,19 +30,15 @@ namespace Microsoft.AspNet.Hosting private WebApplicationOptions _options; private Action _configureServices; - private string _environmentName; - private string _webRoot; - private string _applicationBasePath; // Only one of these should be set private StartupMethods _startup; private Type _startupType; - private string _startupAssemblyName; // Only one of these should be set - private string _serverFactoryLocation; private IServerFactory _serverFactory; - private IServer _server; + + private Dictionary _settings = new Dictionary(StringComparer.OrdinalIgnoreCase); public WebApplicationBuilder() { @@ -48,62 +46,19 @@ namespace Microsoft.AspNet.Hosting _loggerFactory = new LoggerFactory(); } - public WebApplicationBuilder UseConfiguration(IConfiguration configuration) + public IWebApplicationBuilder UseSetting(string key, string value) + { + _settings[key] = value; + return this; + } + + public IWebApplicationBuilder UseConfiguration(IConfiguration configuration) { _config = configuration; return this; } - public WebApplicationBuilder UseApplicationBasePath(string applicationBasePath) - { - _applicationBasePath = applicationBasePath; - return this; - } - - public WebApplicationBuilder UseEnvironment(string environment) - { - if (environment == null) - { - throw new ArgumentNullException(nameof(environment)); - } - - _environmentName = environment; - return this; - } - - public WebApplicationBuilder UseWebRoot(string webRoot) - { - if (webRoot == null) - { - throw new ArgumentNullException(nameof(webRoot)); - } - _webRoot = webRoot; - return this; - } - - public WebApplicationBuilder UseServer(IServer server) - { - if (server == null) - { - throw new ArgumentNullException(nameof(server)); - } - - _server = server; - return this; - } - - public WebApplicationBuilder UseServerFactory(string assemblyName) - { - if (assemblyName == null) - { - throw new ArgumentNullException(nameof(assemblyName)); - } - - _serverFactoryLocation = assemblyName; - return this; - } - - public WebApplicationBuilder UseServerFactory(IServerFactory factory) + public IWebApplicationBuilder UseServer(IServerFactory factory) { if (factory == null) { @@ -114,18 +69,7 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebApplicationBuilder UseStartup(string startupAssemblyName) - { - if (startupAssemblyName == null) - { - throw new ArgumentNullException(nameof(startupAssemblyName)); - } - - _startupAssemblyName = startupAssemblyName; - return this; - } - - public WebApplicationBuilder UseStartup(Type startupType) + public IWebApplicationBuilder UseStartup(Type startupType) { if (startupType == null) { @@ -136,18 +80,13 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebApplicationBuilder UseStartup() where TStartup : class - { - return UseStartup(typeof(TStartup)); - } - - public WebApplicationBuilder ConfigureServices(Action configureServices) + public IWebApplicationBuilder ConfigureServices(Action configureServices) { _configureServices = configureServices; return this; } - public WebApplicationBuilder Configure(Action configureApp) + public IWebApplicationBuilder Configure(Action configureApp) { if (configureApp == null) { @@ -158,7 +97,7 @@ namespace Microsoft.AspNet.Hosting return this; } - public WebApplicationBuilder ConfigureLogging(Action configureLogging) + public IWebApplicationBuilder ConfigureLogging(Action configureLogging) { configureLogging(_loggerFactory); return this; @@ -173,29 +112,19 @@ namespace Microsoft.AspNet.Hosting var appEnvironment = hostingContainer.GetRequiredService(); var startupLoader = hostingContainer.GetRequiredService(); - _config = _config ?? WebApplicationConfiguration.GetDefault(); - _options = new WebApplicationOptions(_config); - // Initialize the hosting environment - _options.WebRoot = _webRoot ?? _options.WebRoot; _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options, _config); - if (!string.IsNullOrEmpty(_environmentName)) - { - _hostingEnvironment.EnvironmentName = _environmentName; - } - var application = new WebApplication(hostingServices, startupLoader, _options, _config); // Only one of these should be set, but they are used in priority - application.Server = _server; application.ServerFactory = _serverFactory; - application.ServerFactoryLocation = _options.ServerFactoryLocation ?? _serverFactoryLocation; + application.ServerFactoryLocation = _options.ServerFactoryLocation; // Only one of these should be set, but they are used in priority application.Startup = _startup; application.StartupType = _startupType; - application.StartupAssemblyName = _startupAssemblyName ?? _options.Application; + application.StartupAssemblyName = _options.Application; application.Initialize(); @@ -204,6 +133,17 @@ namespace Microsoft.AspNet.Hosting private IServiceCollection BuildHostingServices() { + // Apply the configuration settings + var configuration = _config ?? WebApplicationConfiguration.GetDefault(); + + var mergedConfiguration = new ConfigurationBuilder() + .Add(new IncludedConfigurationProvider(configuration)) + .AddInMemoryCollection(_settings) + .Build(); + + _config = mergedConfiguration; + _options = new WebApplicationOptions(_config); + var services = new ServiceCollection(); services.AddSingleton(_hostingEnvironment); services.AddSingleton(_loggerFactory); @@ -230,9 +170,9 @@ namespace Microsoft.AspNet.Hosting if (defaultPlatformServices.Application != null) { var appEnv = defaultPlatformServices.Application; - if (!string.IsNullOrEmpty(_applicationBasePath)) + if (!string.IsNullOrEmpty(_options.ApplicationBasePath)) { - appEnv = new WrappedApplicationEnvironment(_applicationBasePath, appEnv); + appEnv = new WrappedApplicationEnvironment(_options.ApplicationBasePath, appEnv); } services.TryAddSingleton(appEnv); diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs new file mode 100644 index 0000000000..e49ba7f4ed --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs @@ -0,0 +1,148 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNet.Server.Features; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public static class WebApplicationBuilderExtensions + { + private static readonly string ServerUrlsSeparator = ";"; + + public static IWebApplicationBuilder UseStartup(this IWebApplicationBuilder applicationBuilder) where TStartup : class + { + return applicationBuilder.UseStartup(typeof(TStartup)); + } + + public static IWebApplicationBuilder UseServer(this IWebApplicationBuilder applicationBuilder, string assemblyName) + { + if (assemblyName == null) + { + throw new ArgumentNullException(nameof(assemblyName)); + } + + return applicationBuilder.UseSetting(WebApplicationConfiguration.ServerKey, assemblyName); + } + + public static IWebApplicationBuilder UseServer(this IWebApplicationBuilder applicationBuilder, IServer server) + { + if (server == null) + { + throw new ArgumentNullException(nameof(server)); + } + + return applicationBuilder.UseServer(new ServerFactory(server)); + } + + public static IWebApplicationBuilder UseApplicationBasePath(this IWebApplicationBuilder applicationBuilder, string applicationBasePath) + { + if (applicationBasePath == null) + { + throw new ArgumentNullException(nameof(applicationBasePath)); + } + + return applicationBuilder.UseSetting(WebApplicationConfiguration.ApplicationBaseKey, applicationBasePath); + } + + public static IWebApplicationBuilder UseEnvironment(this IWebApplicationBuilder applicationBuilder, string environment) + { + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + + return applicationBuilder.UseSetting(WebApplicationConfiguration.EnvironmentKey, environment); + } + + public static IWebApplicationBuilder UseWebRoot(this IWebApplicationBuilder applicationBuilder, string webRoot) + { + if (webRoot == null) + { + throw new ArgumentNullException(nameof(webRoot)); + } + + return applicationBuilder.UseSetting(WebApplicationConfiguration.WebRootKey, webRoot); + } + + public static IWebApplicationBuilder UseUrls(this IWebApplicationBuilder applicationBuilder, params string[] urls) + { + if (urls == null) + { + throw new ArgumentNullException(nameof(urls)); + } + + return applicationBuilder.UseSetting(WebApplicationConfiguration.ServerUrlsKey, string.Join(ServerUrlsSeparator, urls)); + } + + public static IWebApplicationBuilder UseStartup(this IWebApplicationBuilder applicationBuilder, string startupAssemblyName) + { + if (startupAssemblyName == null) + { + throw new ArgumentNullException(nameof(startupAssemblyName)); + } + + return applicationBuilder.UseSetting(WebApplicationConfiguration.ApplicationKey, startupAssemblyName); + } + + public static IWebApplication Start(this IWebApplicationBuilder applicationBuilder, params string[] urls) + { + var application = applicationBuilder.UseUrls(urls).Build(); + application.Start(); + return application; + } + + /// + /// Runs a web application and block the calling thread until host shutdown. + /// + /// + public static void Run(this IWebApplication application) + { + using (application) + { + application.Start(); + + var hostingEnvironment = application.Services.GetService(); + var applicationLifetime = application.Services.GetService(); + + Console.WriteLine("Hosting environment: " + hostingEnvironment.EnvironmentName); + + var serverAddresses = application.ServerFeatures.Get()?.Addresses; + if (serverAddresses != null) + { + foreach (var address in serverAddresses) + { + Console.WriteLine("Now listening on: " + address); + } + } + + Console.WriteLine("Application started. Press Ctrl+C to shut down."); + + Console.CancelKeyPress += (sender, eventArgs) => + { + applicationLifetime.StopApplication(); + + // Don't terminate the process immediately, wait for the Main thread to exit gracefully. + eventArgs.Cancel = true; + }; + + applicationLifetime.ApplicationStopping.WaitHandle.WaitOne(); + } + } + + private class ServerFactory : IServerFactory + { + private readonly IServer _server; + + public ServerFactory(IServer server) + { + _server = server; + } + + public IServer CreateServer(IConfiguration configuration) => _server; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs index 0d71dafc2d..49eff15003 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs @@ -4,12 +4,14 @@ namespace Microsoft.AspNet.Hosting { public class WebApplicationConfiguration { - public static readonly string ApplicationKey = "app"; + public static readonly string ApplicationKey = "application"; public static readonly string DetailedErrorsKey = "detailedErrors"; public static readonly string EnvironmentKey = "environment"; public static readonly string ServerKey = "server"; public static readonly string WebRootKey = "webroot"; public static readonly string CaptureStartupErrorsKey = "captureStartupErrors"; + public static readonly string ServerUrlsKey = "server.urls"; + public static readonly string ApplicationBaseKey = "applicationBase"; public static readonly string HostingJsonFile = "hosting.json"; public static readonly string EnvironmentVariablesPrefix = "ASPNET_"; diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs deleted file mode 100644 index a0b0f0b3f6..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebApplicationExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Server.Features; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.AspNet.Hosting -{ - public static class WebApplicationExtensions - { - /// - /// Retruns the server addresses the web application is going to listen on. - /// - /// - /// An which the addresses the server will listen to - public static ICollection GetAddresses(this IWebApplication application) - { - return application.ServerFeatures.Get()?.Addresses; - } - - /// - /// Runs a web application and block the calling thread until host shutdown. - /// - /// - public static void Run(this IWebApplication application) - { - using (application.Start()) - { - var hostingEnvironment = application.Services.GetService(); - var applicationLifetime = application.Services.GetService(); - - Console.WriteLine("Hosting environment: " + hostingEnvironment.EnvironmentName); - - var serverAddresses = application.GetAddresses(); - if (serverAddresses != null) - { - foreach (var address in serverAddresses) - { - Console.WriteLine("Now listening on: " + address); - } - } - - Console.WriteLine("Application started. Press Ctrl+C to shut down."); - - Console.CancelKeyPress += (sender, eventArgs) => - { - applicationLifetime.StopApplication(); - - // Don't terminate the process immediately, wait for the Main thread to exit gracefully. - eventArgs.Cancel = true; - }; - - applicationLifetime.ApplicationStopping.WaitHandle.WaitOne(); - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 51980617cf..38da4fd213 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -16,14 +16,15 @@ namespace Microsoft.AspNet.TestHost { private const string DefaultEnvironmentName = "Development"; private const string ServerName = nameof(TestServer); - private IDisposable _appInstance; + private IWebApplication _appInstance; private bool _disposed = false; private IHttpApplication _application; - public TestServer(WebApplicationBuilder builder) + public TestServer(IWebApplicationBuilder builder) { var application = builder.UseServer(this).Build(); - _appInstance = application.Start(); + application.Start(); + _appInstance = application; } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); @@ -59,8 +60,11 @@ namespace Microsoft.AspNet.TestHost public void Dispose() { - _disposed = true; - _appInstance.Dispose(); + if (!_disposed) + { + _disposed = true; + _appInstance.Dispose(); + } } void IServer.Start(IHttpApplication application) diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs index 06f912ac17..a71b92bbae 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs @@ -36,8 +36,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup("MissingStartupAssembly").Build(); - using (application.Start()) + using (application) { + application.Start(); await AssertResponseContains(server.RequestDelegate, "MissingStartupAssembly"); } } @@ -48,8 +49,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup().Build(); - using (application.Start()) + using (application) { + application.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from static constructor"); } } @@ -60,8 +62,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup().Build(); - using (application.Start()) + using (application) { + application.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } } @@ -72,8 +75,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup().Build(); - using (application.Start()) + using (application) { + application.Start(); await AssertResponseContains(server.RequestDelegate, "Message from the LoaderException"); } } @@ -84,8 +88,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup().Build(); - using (application.Start()) + using (application) { + application.Start(); var service = application.Services.GetServices(); Assert.NotNull(service); await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); @@ -98,8 +103,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup().Build(); - using (application.Start()) + using (application) { + application.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from ConfigureServices"); } } @@ -110,8 +116,9 @@ namespace Microsoft.AspNet.Hosting var builder = CreateWebApplicationBuilder(); var server = new TestServer(); var application = builder.UseServer(server).UseStartup().Build(); - using (application.Start()) + using (application) { + application.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from Configure"); } } @@ -138,6 +145,28 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(expected, application.Services.GetService().EnvironmentName); } + [Fact] + public void BuildAndDispose() + { + var vals = new Dictionary + { + { "ENV", "Dev" }, + }; + var builder = new ConfigurationBuilder() + .AddInMemoryCollection(vals); + var config = builder.Build(); + + var expected = "MY_TEST_ENVIRONMENT"; + var application = new WebApplicationBuilder() + .UseConfiguration(config) + .UseEnvironment(expected) + .UseServer(new TestServer()) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build(); + + application.Dispose(); + } + [Fact] public void UseBasePathConfiguresBasePath() { @@ -159,7 +188,7 @@ namespace Microsoft.AspNet.Hosting Assert.Equal("/foo/bar", application.Services.GetService().ApplicationBasePath); } - private WebApplicationBuilder CreateWebApplicationBuilder() + private IWebApplicationBuilder CreateWebApplicationBuilder() { var vals = new Dictionary { diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs index 3e935c68cd..cd7dbdd569 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs @@ -15,11 +15,11 @@ namespace Microsoft.AspNet.Hosting.Tests { var parameters = new Dictionary() { - {"webroot", "wwwroot"}, - {"server", "Microsoft.AspNet.Server.Kestrel"}, - {"app", "MyProjectReference"}, - {"environment", "Development"}, - {"detailederrors", "true"}, + { "webroot", "wwwroot"}, + { "server", "Microsoft.AspNet.Server.Kestrel"}, + { "application", "MyProjectReference"}, + { "environment", "Development"}, + { "detailederrors", "true"}, { "captureStartupErrors", "true" } }; diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index 9278d7ad17..d20f85b16e 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); var application = CreateBuilder(config).Build(); - var app = application.Start(); + application.Start(); Assert.NotNull(application.Services.GetService()); Assert.Equal("http://localhost:abc123", application.ServerFeatures.Get().Addresses.First()); } @@ -136,9 +136,9 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); var application = CreateBuilder(config).Build(); - var app = application.Start(); + application.Start(); Assert.NotNull(application.Services.GetService()); - Assert.Equal("http://localhost:5000", application.GetAddresses().First()); + Assert.Equal("http://localhost:5000", application.ServerFeatures.Get().Addresses.First()); } [Fact] @@ -153,7 +153,7 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); var application = CreateBuilder(config).Build(); - var app = application.Start(); + application.Start(); var hostingEnvironment = application.Services.GetService(); Assert.NotNull(hostingEnvironment.Configuration); Assert.Equal("Microsoft.AspNet.Hosting.Tests", hostingEnvironment.Configuration["Server"]); @@ -163,9 +163,8 @@ namespace Microsoft.AspNet.Hosting public void WebApplicationCanBeStarted() { var app = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .UseStartup("Microsoft.AspNet.Hosting.Tests") - .Build() .Start(); Assert.NotNull(app); @@ -181,7 +180,7 @@ namespace Microsoft.AspNet.Hosting public void WebApplicationDisposesServiceProvider() { var application = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .ConfigureServices(s => { s.AddTransient(); @@ -190,7 +189,7 @@ namespace Microsoft.AspNet.Hosting .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build(); - var app = application.Start(); + application.Start(); var singleton = (FakeService)application.Services.GetService(); var transient = (FakeService)application.Services.GetService(); @@ -198,7 +197,7 @@ namespace Microsoft.AspNet.Hosting Assert.False(singleton.Disposed); Assert.False(transient.Disposed); - app.Dispose(); + application.Dispose(); Assert.True(singleton.Disposed); Assert.True(transient.Disposed); @@ -208,13 +207,14 @@ namespace Microsoft.AspNet.Hosting public void WebApplicationNotifiesApplicationStarted() { var application = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .Build(); var applicationLifetime = application.Services.GetService(); Assert.False(applicationLifetime.ApplicationStarted.IsCancellationRequested); - using (application.Start()) + using (application) { + application.Start(); Assert.True(applicationLifetime.ApplicationStarted.IsCancellationRequested); } } @@ -223,13 +223,14 @@ namespace Microsoft.AspNet.Hosting public void WebApplicationInjectsHostingEnvironment() { var application = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .UseStartup("Microsoft.AspNet.Hosting.Tests") .UseEnvironment("WithHostingEnvironment") .Build(); - using (application.Start()) + using (application) { + application.Start(); var env = application.Services.GetService(); Assert.Equal("Changed", env.EnvironmentName); } @@ -243,7 +244,7 @@ namespace Microsoft.AspNet.Hosting { services.AddTransient(); }) - .UseServer(this) + .UseServer((IServerFactory)this) .UseStartup("Microsoft.AspNet.Hosting.Tests"); Assert.Throws(() => builder.Build()); @@ -252,14 +253,14 @@ namespace Microsoft.AspNet.Hosting [Fact] public void CanCreateApplicationServicesWithAddedServices() { - var application = CreateBuilder().UseServer(this).ConfigureServices(services => services.AddOptions()).Build(); + var application = CreateBuilder().UseServer((IServerFactory)this).ConfigureServices(services => services.AddOptions()).Build(); Assert.NotNull(application.Services.GetRequiredService>()); } [Fact] public void EnvDefaultsToProductionIfNoConfig() { - var application = CreateBuilder().UseServer(this).Build(); + var application = CreateBuilder().UseServer((IServerFactory)this).Build(); var env = application.Services.GetService(); Assert.Equal(EnvironmentName.Production, env.EnvironmentName); } @@ -278,7 +279,7 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).UseServer(this).Build(); + var application = CreateBuilder(config).UseServer((IServerFactory)this).Build(); var env = application.Services.GetService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -295,7 +296,7 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).UseServer(this).Build(); + var application = CreateBuilder(config).UseServer((IServerFactory)this).Build(); var env = application.Services.GetService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -312,7 +313,7 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).UseServer(this).Build(); + var application = CreateBuilder(config).UseServer((IServerFactory)this).Build(); var env = application.Services.GetService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); @@ -321,9 +322,10 @@ namespace Microsoft.AspNet.Hosting [Fact] public void IsEnvironment_Extension_Is_Case_Insensitive() { - var application = CreateBuilder().UseServer(this).Build(); - using (application.Start()) + var application = CreateBuilder().UseServer((IServerFactory)this).Build(); + using (application) { + application.Start(); var env = application.Services.GetRequiredService(); Assert.True(env.IsEnvironment(EnvironmentName.Production)); Assert.True(env.IsEnvironment("producTion")); @@ -364,7 +366,7 @@ namespace Microsoft.AspNet.Hosting var application = CreateApplication(requestDelegate); // Act - var disposable = application.Start(); + application.Start(); // Assert Assert.NotNull(httpContext); @@ -388,7 +390,7 @@ namespace Microsoft.AspNet.Hosting var application = CreateApplication(requestDelegate); // Act - var disposable = application.Start(); + application.Start(); // Assert Assert.NotNull(httpContext); @@ -399,11 +401,12 @@ namespace Microsoft.AspNet.Hosting public void WebApplication_InvokesConfigureMethodsOnlyOnce() { var application = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .UseStartup() .Build(); - using (application.Start()) + using (application) { + application.Start(); var services = application.Services; var services2 = application.Services; Assert.Equal(1, CountStartup.ConfigureCount); @@ -431,7 +434,7 @@ namespace Microsoft.AspNet.Hosting public void WebApplication_ThrowsForBadConfigureServiceSignature() { var builder = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .UseStartup(); var ex = Assert.Throws(() => builder.Build()); @@ -447,7 +450,7 @@ namespace Microsoft.AspNet.Hosting private IWebApplication CreateApplication(RequestDelegate requestDelegate) { var builder = CreateBuilder() - .UseServer(this) + .UseServer((IServerFactory)this) .Configure( appBuilder => { @@ -459,10 +462,11 @@ namespace Microsoft.AspNet.Hosting private void RunMapPath(string virtualPath, string expectedSuffix) { - var application = CreateBuilder().UseServer(this).Build(); + var application = CreateBuilder().UseServer((IServerFactory)this).Build(); - using (application.Start()) + using (application) { + application.Start(); var env = application.Services.GetRequiredService(); // MapPath requires webroot to be set, we don't care // about file provider so just set it here @@ -473,7 +477,7 @@ namespace Microsoft.AspNet.Hosting } } - private WebApplicationBuilder CreateBuilder(IConfiguration config = null) + private IWebApplicationBuilder CreateBuilder(IConfiguration config = null) { return new WebApplicationBuilder().UseConfiguration(config ?? new ConfigurationBuilder().Build()).UseStartup("Microsoft.AspNet.Hosting.Tests"); } From 294e16732f3ffdb8dd15041c6beb3cdafaf37ee6 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 7 Jan 2016 07:49:29 -0800 Subject: [PATCH 0958/1838] Move default config to Hosting.Abstractions --- .../WebApplicationDefaults.cs | 20 +++++++++++++++++++ .../Internal/WebApplicationOptions.cs | 14 ++++++------- .../WebApplicationBuilderExtensions.cs | 12 +++++------ .../WebApplicationConfiguration.cs | 16 ++------------- 4 files changed, 35 insertions(+), 27 deletions(-) create mode 100644 src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs b/src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs new file mode 100644 index 0000000000..3efa2561ad --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNet.Hosting +{ + public static class WebApplicationDefaults + { + public static readonly string ApplicationKey = "application"; + public static readonly string DetailedErrorsKey = "detailedErrors"; + public static readonly string EnvironmentKey = "environment"; + public static readonly string ServerKey = "server"; + public static readonly string WebRootKey = "webroot"; + public static readonly string CaptureStartupErrorsKey = "captureStartupErrors"; + public static readonly string ServerUrlsKey = "server.urls"; + public static readonly string ApplicationBaseKey = "applicationBase"; + + public static readonly string HostingJsonFile = "hosting.json"; + public static readonly string EnvironmentVariablesPrefix = "ASPNET_"; + } +} diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs index 1019c866ec..dd4ef59750 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs @@ -21,13 +21,13 @@ namespace Microsoft.AspNet.Hosting.Internal throw new ArgumentNullException(nameof(configuration)); } - Application = configuration[WebApplicationConfiguration.ApplicationKey]; - DetailedErrors = ParseBool(configuration, WebApplicationConfiguration.DetailedErrorsKey); - CaptureStartupErrors = ParseBool(configuration, WebApplicationConfiguration.CaptureStartupErrorsKey); - Environment = configuration[WebApplicationConfiguration.EnvironmentKey] ?? configuration[OldEnvironmentKey]; - ServerFactoryLocation = configuration[WebApplicationConfiguration.ServerKey]; - WebRoot = configuration[WebApplicationConfiguration.WebRootKey]; - ApplicationBasePath = configuration[WebApplicationConfiguration.ApplicationBaseKey]; + Application = configuration[WebApplicationDefaults.ApplicationKey]; + DetailedErrors = ParseBool(configuration, WebApplicationDefaults.DetailedErrorsKey); + CaptureStartupErrors = ParseBool(configuration, WebApplicationDefaults.CaptureStartupErrorsKey); + Environment = configuration[WebApplicationDefaults.EnvironmentKey] ?? configuration[OldEnvironmentKey]; + ServerFactoryLocation = configuration[WebApplicationDefaults.ServerKey]; + WebRoot = configuration[WebApplicationDefaults.WebRootKey]; + ApplicationBasePath = configuration[WebApplicationDefaults.ApplicationBaseKey]; } public string Application { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs index e49ba7f4ed..555c087bd3 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs @@ -25,7 +25,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(assemblyName)); } - return applicationBuilder.UseSetting(WebApplicationConfiguration.ServerKey, assemblyName); + return applicationBuilder.UseSetting(WebApplicationDefaults.ServerKey, assemblyName); } public static IWebApplicationBuilder UseServer(this IWebApplicationBuilder applicationBuilder, IServer server) @@ -45,7 +45,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(applicationBasePath)); } - return applicationBuilder.UseSetting(WebApplicationConfiguration.ApplicationBaseKey, applicationBasePath); + return applicationBuilder.UseSetting(WebApplicationDefaults.ApplicationBaseKey, applicationBasePath); } public static IWebApplicationBuilder UseEnvironment(this IWebApplicationBuilder applicationBuilder, string environment) @@ -55,7 +55,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(environment)); } - return applicationBuilder.UseSetting(WebApplicationConfiguration.EnvironmentKey, environment); + return applicationBuilder.UseSetting(WebApplicationDefaults.EnvironmentKey, environment); } public static IWebApplicationBuilder UseWebRoot(this IWebApplicationBuilder applicationBuilder, string webRoot) @@ -65,7 +65,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(webRoot)); } - return applicationBuilder.UseSetting(WebApplicationConfiguration.WebRootKey, webRoot); + return applicationBuilder.UseSetting(WebApplicationDefaults.WebRootKey, webRoot); } public static IWebApplicationBuilder UseUrls(this IWebApplicationBuilder applicationBuilder, params string[] urls) @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(urls)); } - return applicationBuilder.UseSetting(WebApplicationConfiguration.ServerUrlsKey, string.Join(ServerUrlsSeparator, urls)); + return applicationBuilder.UseSetting(WebApplicationDefaults.ServerUrlsKey, string.Join(ServerUrlsSeparator, urls)); } public static IWebApplicationBuilder UseStartup(this IWebApplicationBuilder applicationBuilder, string startupAssemblyName) @@ -85,7 +85,7 @@ namespace Microsoft.AspNet.Hosting throw new ArgumentNullException(nameof(startupAssemblyName)); } - return applicationBuilder.UseSetting(WebApplicationConfiguration.ApplicationKey, startupAssemblyName); + return applicationBuilder.UseSetting(WebApplicationDefaults.ApplicationKey, startupAssemblyName); } public static IWebApplication Start(this IWebApplicationBuilder applicationBuilder, params string[] urls) diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs index 49eff15003..3bc3013858 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs @@ -4,18 +4,6 @@ namespace Microsoft.AspNet.Hosting { public class WebApplicationConfiguration { - public static readonly string ApplicationKey = "application"; - public static readonly string DetailedErrorsKey = "detailedErrors"; - public static readonly string EnvironmentKey = "environment"; - public static readonly string ServerKey = "server"; - public static readonly string WebRootKey = "webroot"; - public static readonly string CaptureStartupErrorsKey = "captureStartupErrors"; - public static readonly string ServerUrlsKey = "server.urls"; - public static readonly string ApplicationBaseKey = "applicationBase"; - - public static readonly string HostingJsonFile = "hosting.json"; - public static readonly string EnvironmentVariablesPrefix = "ASPNET_"; - public static IConfiguration GetDefault() { return GetDefault(args: null); @@ -26,9 +14,9 @@ namespace Microsoft.AspNet.Hosting // We are adding all environment variables first and then adding the ASPNET_ ones // with the prefix removed to unify with the command line and config file formats var configBuilder = new ConfigurationBuilder() - .AddJsonFile(HostingJsonFile, optional: true) + .AddJsonFile(WebApplicationDefaults.HostingJsonFile, optional: true) .AddEnvironmentVariables() - .AddEnvironmentVariables(prefix: EnvironmentVariablesPrefix); + .AddEnvironmentVariables(prefix: WebApplicationDefaults.EnvironmentVariablesPrefix); if (args != null) { From e7bf0e71bb2ee6e08dca82d8d7485fc89e98d0b7 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Wed, 6 Jan 2016 15:41:21 -0800 Subject: [PATCH 0959/1838] Build with dotnet --- .gitattributes | 2 + .gitignore | 2 + .travis.yml | 8 ++- build.cmd | 68 +++++++++---------- build.sh | 47 +++++++------ .../project.json | 25 +++++-- .../project.json | 25 +++++-- .../project.json | 25 +++++-- test/Microsoft.AspNet.Http.Tests/project.json | 25 +++++-- test/Microsoft.AspNet.Owin.Tests/project.json | 25 +++++-- .../project.json | 16 ++++- .../project.json | 33 ++++++--- 12 files changed, 200 insertions(+), 101 deletions(-) diff --git a/.gitattributes b/.gitattributes index bdaa5ba982..c2f0f84273 100644 --- a/.gitattributes +++ b/.gitattributes @@ -48,3 +48,5 @@ *.fsproj text=auto *.dbproj text=auto *.sln text=auto eol=crlf + +*.sh eol=lf \ No newline at end of file diff --git a/.gitignore b/.gitignore index ac82da7568..a2eb01c895 100644 --- a/.gitignore +++ b/.gitignore @@ -25,3 +25,5 @@ nuget.exe *.ipch *.sln.ide project.lock.json +.build/ +.testPublish/ diff --git a/.travis.yml b/.travis.yml index 2fc624899f..e8f77f0f14 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,9 +10,11 @@ addons: - libssl-dev - libunwind8 - zlib1g -env: - - KOREBUILD_DNU_RESTORE_CORECLR=true mono: - 4.0.5 +os: + - linux + - osx +osx_image: xcode7.1 script: - - ./build.sh --quiet verify + - ./build.sh --quiet verify \ No newline at end of file diff --git a/build.cmd b/build.cmd index 553e3929a0..65fb3e3353 100644 --- a/build.cmd +++ b/build.cmd @@ -1,40 +1,40 @@ -@echo off -cd %~dp0 - +@ECHO off SETLOCAL + +SET REPO_FOLDER=%~dp0 +CD "%REPO_FOLDER%" + +SET BUILD_FOLDER=.build +SET KOREBUILD_FOLDER=%BUILD_FOLDER%\KoreBuild-dotnet +SET KOREBUILD_VERSION= + +SET NUGET_PATH=%BUILD_FOLDER%\NuGet.exe SET NUGET_VERSION=latest SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe -SET BUILDCMD_KOREBUILD_VERSION= -SET BUILDCMD_DNX_VERSION= -IF EXIST %CACHED_NUGET% goto copynuget -echo Downloading latest version of NuGet.exe... -IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" - -:copynuget -IF EXIST .nuget\nuget.exe goto restore -md .nuget -copy %CACHED_NUGET% .nuget\nuget.exe > nul - -:restore -IF EXIST packages\Sake goto getdnx -IF "%BUILDCMD_KOREBUILD_VERSION%"=="" ( - .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre -) ELSE ( - .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre -) -.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages - -:getdnx -IF "%BUILDCMD_DNX_VERSION%"=="" ( - SET BUILDCMD_DNX_VERSION=latest -) -IF "%SKIP_DNX_INSTALL%"=="" ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default - CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default -) ELSE ( - CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 +IF NOT EXIST %BUILD_FOLDER% ( + md %BUILD_FOLDER% ) -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* +IF NOT EXIST %NUGET_PATH% ( + IF NOT EXIST %CACHED_NUGET% ( + echo Downloading latest version of NuGet.exe... + IF NOT EXIST %LocalAppData%\NuGet ( + md %LocalAppData%\NuGet + ) + @powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" + ) + + copy %CACHED_NUGET% %NUGET_PATH% > nul +) + +IF NOT EXIST %KOREBUILD_FOLDER% ( + SET KOREBUILD_DOWNLOAD_ARGS= + IF NOT "%KOREBUILD_VERSION%"=="" ( + SET KOREBUILD_DOWNLOAD_ARGS=-version %KOREBUILD_VERSION% + ) + + %BUILD_FOLDER%\nuget.exe install KoreBuild-dotnet -ExcludeVersion -o %BUILD_FOLDER% -nocache -pre %KOREBUILD_DOWNLOAD_ARGS% +) + +"%KOREBUILD_FOLDER%\build\KoreBuild.cmd" %* diff --git a/build.sh b/build.sh index da4e3fcd1c..7b5e25e3a8 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,18 @@ #!/usr/bin/env bash +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +repoFolder="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +buildFolder=.build +koreBuildFolder=$buildFolder/KoreBuild-dotnet + +nugetPath=$buildFolder/nuget.exe + if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else @@ -11,33 +24,25 @@ else fi mkdir -p $cachedir nugetVersion=latest -cachePath=$cachedir/nuget.$nugetVersion.exe +cacheNuget=$cachedir/nuget.$nugetVersion.exe -url=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe +nugetUrl=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe -if test ! -f $cachePath; then - wget -O $cachePath $url 2>/dev/null || curl -o $cachePath --location $url /dev/null +if test ! -d $buildFolder; then + mkdir $buildFolder fi -if test ! -e .nuget; then - mkdir .nuget - cp $cachePath .nuget/nuget.exe +if test ! -f $nugetPath; then + if test ! -f $cacheNuget; then + wget -O $cacheNuget $nugetUrl 2>/dev/null || curl -o $cacheNuget --location $nugetUrl /dev/null + fi + + cp $cacheNuget $nugetPath fi -if test ! -d packages/Sake; then - mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages +if test ! -d $koreBuildFolder; then + mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre fi -if ! type dnvm > /dev/null 2>&1; then - source packages/KoreBuild/build/dnvm.sh -fi +source $koreBuildFolder/build/KoreBuild.sh -if ! type dnx > /dev/null 2>&1 || [ -z "$SKIP_DNX_INSTALL" ]; then - dnvm install latest -runtime coreclr -alias default - dnvm install default -runtime mono -alias default -else - dnvm use default -runtime mono -fi - -mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json index f3e064f81e..59a67065bd 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json @@ -6,13 +6,26 @@ "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Testing": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json index 2b7a5ed450..0cd3b99df0 100644 --- a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Extensions.Tests/project.json @@ -3,13 +3,26 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Http.Features.Tests/project.json b/test/Microsoft.AspNet.Http.Features.Tests/project.json index 12e00145bc..64e3c2dc66 100644 --- a/test/Microsoft.AspNet.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Features.Tests/project.json @@ -1,13 +1,26 @@ { "dependencies": { "Microsoft.AspNet.Http.Features": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNet.Http.Tests/project.json index cde6b4f819..e67bbdfc3a 100644 --- a/test/Microsoft.AspNet.Http.Tests/project.json +++ b/test/Microsoft.AspNet.Http.Tests/project.json @@ -1,13 +1,26 @@ { "dependencies": { "Microsoft.AspNet.Http": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNet.Owin.Tests/project.json index 9fc7f68ba0..4132c72275 100644 --- a/test/Microsoft.AspNet.Owin.Tests/project.json +++ b/test/Microsoft.AspNet.Owin.Tests/project.json @@ -3,13 +3,26 @@ "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" + "xunit": "2.1.0" }, "frameworks": { - "dnx451": { }, - "dnxcore50": { } + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { + "xunit.runner.aspnet": "2.0.0-aspnet-*" + } + } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" } } diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNet.WebUtilities.Tests/project.json index b56d4034ca..7fe1a5eec4 100644 --- a/test/Microsoft.AspNet.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNet.WebUtilities.Tests/project.json @@ -1,19 +1,29 @@ { "dependencies": { "Microsoft.AspNet.WebUtilities": "1.0.0-*", - "xunit.runner.aspnet": "2.0.0-aspnet-*" + "xunit": "2.1.0" }, "compilationOptions": { "warningsAsErrors": true }, + "testRunner": "xunit", "commands": { "test": "xunit.runner.aspnet" }, "frameworks": { - "dnx451": { }, + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, "dnxcore50": { "dependencies": { - "System.Text.Encoding.Extensions": "4.0.11-*" + "System.Text.Encoding.Extensions": "4.0.11-*", + "xunit.runner.aspnet": "2.0.0-aspnet-*" } } } diff --git a/test/Microsoft.Net.Http.Headers.Tests/project.json b/test/Microsoft.Net.Http.Headers.Tests/project.json index 4859085a96..59cea6aca6 100644 --- a/test/Microsoft.Net.Http.Headers.Tests/project.json +++ b/test/Microsoft.Net.Http.Headers.Tests/project.json @@ -1,14 +1,27 @@ { - "version": "1.0.0-*", - "dependencies": { - "Microsoft.Net.Http.Headers": "1.0.0-*", + "version": "1.0.0-*", + "dependencies": { + "Microsoft.Net.Http.Headers": "1.0.0-*", + "xunit": "2.1.0" + }, + "frameworks": { + "dnx451": { + "frameworkAssemblies": { + "System.Runtime": "", + "System.Threading.Tasks": "" + }, + "dependencies": { + "xunit.runner.console": "2.1.0" + } + }, + "dnxcore50": { + "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } + } } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" + } } From 2c7f0ff35d4ff1be7d4839410aefa7fac658b096 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 7 Jan 2016 15:19:41 -0800 Subject: [PATCH 0960/1838] Remove IncludedConfigurationProvider since it's been added to Configuration repo --- .../Internal/IncludedConfigurationProvider.cs | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs b/src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs deleted file mode 100644 index 5feb23e761..0000000000 --- a/src/Microsoft.AspNet.Hosting/Internal/IncludedConfigurationProvider.cs +++ /dev/null @@ -1,39 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using Microsoft.Extensions.Configuration; - -namespace Microsoft.AspNet.Hosting.Internal -{ - // TODO: Remove this once https://github.com/aspnet/Configuration/pull/349 gets merged - internal class IncludedConfigurationProvider : ConfigurationProvider - { - public IncludedConfigurationProvider(IConfiguration source) - { - if (source == null) - { - throw new ArgumentNullException(nameof(source)); - } - int pathStart = 0; - var section = source as IConfigurationSection; - if (section != null) - { - pathStart = section.Path.Length + 1; - } - foreach (var child in source.GetChildren()) - { - AddSection(child, pathStart); - } - } - - private void AddSection(IConfigurationSection section, int pathStart) - { - Data.Add(section.Path.Substring(pathStart), section.Value); - foreach (var child in section.GetChildren()) - { - AddSection(child, pathStart); - } - } - } -} From ca8136b73c1d2c840a56708616a9b377d35e6580 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 7 Jan 2016 10:27:36 -0800 Subject: [PATCH 0961/1838] Compile middleware invoke method when extra args are provided - Improves the performance when accessing scoped services in middleware --- .../Extensions/UseMiddlewareExtensions.cs | 117 +++++++++++++++--- .../Properties/Resources.Designer.cs | 56 +++++++-- .../Resources.resx | 6 + .../UseMiddlewareTest.cs | 79 +++++++++++- 4 files changed, 231 insertions(+), 27 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 42dbc1cc5a..6cb4c1b004 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -3,6 +3,7 @@ using System; using System.Linq; +using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; using Microsoft.AspNet.Http; @@ -16,7 +17,9 @@ namespace Microsoft.AspNet.Builder /// public static class UseMiddlewareExtensions { - const string InvokeMethodName = "Invoke"; + private const string InvokeMethodName = "Invoke"; + + private static readonly MethodInfo GetServiceInfo = typeof(UseMiddlewareExtensions).GetMethod(nameof(GetService), BindingFlags.NonPublic | BindingFlags.Static); /// /// Adds a middleware type to the application's request pipeline. @@ -49,7 +52,7 @@ namespace Microsoft.AspNet.Builder throw new InvalidOperationException(Resources.FormatException_UseMiddleMutlipleInvokes(InvokeMethodName)); } - if (invokeMethods.Length == 0) + if (invokeMethods.Length == 0) { throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoInvokeMethod(InvokeMethodName)); } @@ -63,15 +66,20 @@ namespace Microsoft.AspNet.Builder var parameters = methodinfo.GetParameters(); if (parameters.Length == 0 || parameters[0].ParameterType != typeof(HttpContext)) { - throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName,nameof(HttpContext))); + throw new InvalidOperationException(Resources.FormatException_UseMiddlewareNoParameters(InvokeMethodName, nameof(HttpContext))); } - var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, new[] { next }.Concat(args).ToArray()); + var ctorArgs = new object[args.Length + 1]; + ctorArgs[0] = next; + Array.Copy(args, 0, ctorArgs, 1, args.Length); + var instance = ActivatorUtilities.CreateInstance(app.ApplicationServices, middleware, ctorArgs); if (parameters.Length == 1) { return (RequestDelegate)methodinfo.CreateDelegate(typeof(RequestDelegate), instance); } + var factory = Compile(methodinfo, parameters); + return context => { var serviceProvider = context.RequestServices ?? applicationServices; @@ -80,20 +88,97 @@ namespace Microsoft.AspNet.Builder throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); } - var arguments = new object[parameters.Length]; - arguments[0] = context; - for(var index = 1; index != parameters.Length; ++index) - { - var serviceType = parameters[index].ParameterType; - arguments[index] = serviceProvider.GetService(serviceType); - if (arguments[index] == null) - { - throw new Exception(string.Format("No service for type '{0}' has been registered.", serviceType)); - } - } - return (Task)methodinfo.Invoke(instance, arguments); + return factory(instance, context, serviceProvider); }; }); } + + private static Func Compile(MethodInfo methodinfo, ParameterInfo[] parameters) + { + + // If we call something like + // + // public class Middleware + // { + // public Task Invoke(HttpContext context, ILoggerFactory loggeryFactory) + // { + // + // } + // } + // + + // We'll end up with something like this: + // Generic version: + // + // Task Invoke(Middleware instance, HttpContext httpContext, IServiceprovider provider) + // { + // return instance.Invoke(httpContext, (ILoggerFactory)UseMiddlewareExtensions.GetService(provider, typeof(ILoggerFactory)); + // } + + // Non generic version: + // + // Task Invoke(object instance, HttpContext httpContext, IServiceprovider provider) + // { + // return ((Middleware)instance).Invoke(httpContext, (ILoggerFactory)UseMiddlewareExtensions.GetService(provider, typeof(ILoggerFactory)); + // } + + // context => + // { + // var serviceProvider = context.RequestServices ?? applicationServices; + // if (serviceProvider == null) + // { + // throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); + // } + // + // return Invoke(httpContext, serviceProvider); + // } + + var middleware = typeof(T); + + var httpContextArg = Expression.Parameter(typeof(HttpContext), "httpContext"); + var providerArg = Expression.Parameter(typeof(IServiceProvider), "serviceProvider"); + var instanceArg = Expression.Parameter(middleware, "middleware"); + + var methodArguments = new Expression[parameters.Length]; + methodArguments[0] = httpContextArg; + for (int i = 1; i < parameters.Length; i++) + { + var parameterType = parameters[i].ParameterType; + if (parameterType.IsByRef) + { + throw new NotSupportedException(Resources.FormatException_InvokeDoesNotSupportRefOrOutParams(InvokeMethodName)); + } + + var parameterTypeExpression = new Expression[] { + providerArg, + Expression.Constant(parameterType, typeof(Type)), + Expression.Constant(methodinfo.DeclaringType, typeof(Type)) + }; + methodArguments[i] = Expression.Convert(Expression.Call(GetServiceInfo, parameterTypeExpression), parameterType); + } + + Expression middlewareInstanceArg = instanceArg; + if (methodinfo.DeclaringType != typeof(T)) + { + middlewareInstanceArg = Expression.Convert(middlewareInstanceArg, methodinfo.DeclaringType); + } + + var body = Expression.Call(middlewareInstanceArg, methodinfo, methodArguments); + + var lambda = Expression.Lambda>(body, instanceArg, httpContextArg, providerArg); + + return lambda.Compile(); + } + + private static object GetService(IServiceProvider sp, Type type, Type middleware) + { + var service = sp.GetService(type); + if (service == null) + { + throw new InvalidOperationException(Resources.FormatException_InvokeMiddlewareNoService(type, middleware)); + } + + return service; + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs index 82505c66e0..99f5b6bea3 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs @@ -10,14 +10,6 @@ namespace Microsoft.AspNet.Http.Abstractions private static readonly ResourceManager _resourceManager = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); - /// - /// '{0}' is not available. - /// - internal static string FormatException_PathMustStartWithSlash(object p0) - { - return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); - } - /// /// '{0}' is not available. /// @@ -98,6 +90,54 @@ namespace Microsoft.AspNet.Http.Abstractions return string.Format(CultureInfo.CurrentCulture, GetString("Exception_UseMiddleMutlipleInvokes"), p0); } + /// + /// The path in '{0}' must start with '/'. + /// + internal static string Exception_PathMustStartWithSlash + { + get { return GetString("Exception_PathMustStartWithSlash"); } + } + + /// + /// The path in '{0}' must start with '/'. + /// + internal static string FormatException_PathMustStartWithSlash(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_PathMustStartWithSlash"), p0); + } + + /// + /// Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. + /// + internal static string Exception_InvokeMiddlewareNoService + { + get { return GetString("Exception_InvokeMiddlewareNoService"); } + } + + /// + /// Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. + /// + internal static string FormatException_InvokeMiddlewareNoService(object p0, object p1) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeMiddlewareNoService"), p0, p1); + } + + /// + /// The '{0}' method must not have ref or out parameters. + /// + internal static string Exception_InvokeDoesNotSupportRefOrOutParams + { + get { return GetString("Exception_InvokeDoesNotSupportRefOrOutParams"); } + } + + /// + /// The '{0}' method must not have ref or out parameters. + /// + internal static string FormatException_InvokeDoesNotSupportRefOrOutParams(object p0) + { + return string.Format(CultureInfo.CurrentCulture, GetString("Exception_InvokeDoesNotSupportRefOrOutParams"), p0); + } + private static string GetString(string name, params string[] formatterNames) { var value = _resourceManager.GetString(name); diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx index 1c947c352b..414bad847d 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx +++ b/src/Microsoft.AspNet.Http.Abstractions/Resources.resx @@ -135,4 +135,10 @@ The path in '{0}' must start with '/'. + + Unable to resolve service for type '{0}' while attempting to Invoke middleware '{1}'. + + + The '{0}' method must not have ref or out parameters. + \ No newline at end of file diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs index 1839631d61..ee407d35f8 100644 --- a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Builder.Internal; using Microsoft.AspNet.Http.Abstractions; +using Microsoft.AspNet.Http.Internal; using Xunit; namespace Microsoft.AspNet.Http @@ -20,7 +21,7 @@ namespace Microsoft.AspNet.Http builder.UseMiddleware(typeof(MiddlewareNoParametersStub)); var exception = Assert.Throws(() => builder.Build()); - Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke",nameof(HttpContext)), exception.Message); + Assert.Equal(Resources.FormatException_UseMiddlewareNoParameters("Invoke", nameof(HttpContext)), exception.Message); } [Fact] @@ -35,7 +36,7 @@ namespace Microsoft.AspNet.Http [Fact] public void UseMiddleware_NoInvokeMethod_ThrowsException() - { + { var mockServiceProvider = new DummyServiceProvider(); var builder = new ApplicationBuilder(mockServiceProvider); builder.UseMiddleware(typeof(MiddlewareNoInvokeStub)); @@ -53,14 +54,86 @@ namespace Microsoft.AspNet.Http Assert.Equal(Resources.FormatException_UseMiddleMutlipleInvokes("Invoke"), exception.Message); } + [Fact] + public async Task UseMiddleware_ThrowsIfArgCantBeResolvedFromContainer() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareInjectInvokeNoService)); + var app = builder.Build(); + var exception = await Assert.ThrowsAsync(() => app(new DefaultHttpContext())); + Assert.Equal(Resources.FormatException_InvokeMiddlewareNoService(typeof(object), typeof(MiddlewareInjectInvokeNoService)), exception.Message); + } + + [Fact] + public void UseMiddlewareWithInvokeArg() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareInjectInvoke)); + var app = builder.Build(); + app(new DefaultHttpContext()); + } + + [Fact] + public void UseMiddlewareWithIvokeWithOutAndRefThrows() + { + var mockServiceProvider = new DummyServiceProvider(); + var builder = new ApplicationBuilder(mockServiceProvider); + builder.UseMiddleware(typeof(MiddlewareInjectWithOutAndRefParams)); + var exception = Assert.Throws(() => builder.Build()); + } + private class DummyServiceProvider : IServiceProvider { public object GetService(Type serviceType) { + if (serviceType == typeof(IServiceProvider)) + { + return this; + } return null; } } + public class MiddlewareInjectWithOutAndRefParams + { + public MiddlewareInjectWithOutAndRefParams(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context, ref IServiceProvider sp1, out IServiceProvider sp2) + { + sp1 = null; + sp2 = null; + return Task.FromResult(0); + } + } + + private class MiddlewareInjectInvokeNoService + { + public MiddlewareInjectInvokeNoService(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context, object value) + { + return Task.FromResult(0); + } + } + + private class MiddlewareInjectInvoke + { + public MiddlewareInjectInvoke(RequestDelegate next) + { + } + + public Task Invoke(HttpContext context, IServiceProvider provider) + { + return Task.FromResult(0); + } + } + private class MiddlewareNoParametersStub { public MiddlewareNoParametersStub(RequestDelegate next) @@ -84,7 +157,7 @@ namespace Microsoft.AspNet.Http return 0; } } - + private class MiddlewareNoInvokeStub { public MiddlewareNoInvokeStub(RequestDelegate next) From 6bc8384ea95a2bf8b1a6a42a2b35306f17fefb00 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Thu, 7 Jan 2016 20:52:54 -0800 Subject: [PATCH 0962/1838] Small style cleanup --- .../Extensions/UseMiddlewareExtensions.cs | 27 +++++++------------ 1 file changed, 9 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 6cb4c1b004..628b0365e6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -95,7 +95,6 @@ namespace Microsoft.AspNet.Builder private static Func Compile(MethodInfo methodinfo, ParameterInfo[] parameters) { - // If we call something like // // public class Middleware @@ -122,17 +121,6 @@ namespace Microsoft.AspNet.Builder // return ((Middleware)instance).Invoke(httpContext, (ILoggerFactory)UseMiddlewareExtensions.GetService(provider, typeof(ILoggerFactory)); // } - // context => - // { - // var serviceProvider = context.RequestServices ?? applicationServices; - // if (serviceProvider == null) - // { - // throw new InvalidOperationException(Resources.FormatException_UseMiddlewareIServiceProviderNotAvailable(nameof(IServiceProvider))); - // } - // - // return Invoke(httpContext, serviceProvider); - // } - var middleware = typeof(T); var httpContextArg = Expression.Parameter(typeof(HttpContext), "httpContext"); @@ -149,12 +137,15 @@ namespace Microsoft.AspNet.Builder throw new NotSupportedException(Resources.FormatException_InvokeDoesNotSupportRefOrOutParams(InvokeMethodName)); } - var parameterTypeExpression = new Expression[] { - providerArg, - Expression.Constant(parameterType, typeof(Type)), - Expression.Constant(methodinfo.DeclaringType, typeof(Type)) - }; - methodArguments[i] = Expression.Convert(Expression.Call(GetServiceInfo, parameterTypeExpression), parameterType); + var parameterTypeExpression = new Expression[] + { + providerArg, + Expression.Constant(parameterType, typeof(Type)), + Expression.Constant(methodinfo.DeclaringType, typeof(Type)) + }; + + var getServiceCall = Expression.Call(GetServiceInfo, parameterTypeExpression); + methodArguments[i] = Expression.Convert(getServiceCall, parameterType); } Expression middlewareInstanceArg = instanceArg; From fa8c5cbb3a8eca81223c34eb90fa3a81107b093e Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 8 Jan 2016 19:28:34 -0800 Subject: [PATCH 0963/1838] Updating QueryString doc comment --- src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs index c0f52fd400..a13a78e600 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs @@ -54,15 +54,15 @@ namespace Microsoft.AspNet.Http public abstract PathString Path { get; set; } /// - /// Gets or set the query string. + /// Gets or set the raw query string used to create the query collection in Request.Query. /// - /// The query string. + /// The raw query string. public abstract QueryString QueryString { get; set; } /// - /// Gets the query value collection parsed from RequestQueryString. + /// Gets the query value collection parsed from Request.QueryString. /// - /// The query value collection parsed from RequestQueryString. + /// The query value collection parsed from Request.QueryString. public abstract IQueryCollection Query { get; set; } /// From 6ff83dddfee9d9b44d01b6645df5cf6b70a1caa6 Mon Sep 17 00:00:00 2001 From: Victor Hurdugaci Date: Thu, 7 Jan 2016 14:37:04 -0800 Subject: [PATCH 0964/1838] Build with dotnet --- .gitignore | 2 + .travis.yml | 8 ++- appveyor.yml | 2 +- build.cmd | 68 +++++++++---------- build.sh | 47 +++++++------ .../HostingEnvironmentExtensionsTests.cs | 2 +- .../WebApplicationTests.cs | 2 +- .../project.json | 44 +++++++----- .../project.json | 37 ++++++---- 9 files changed, 121 insertions(+), 91 deletions(-) diff --git a/.gitignore b/.gitignore index 58ebbb8fa3..718941ca08 100644 --- a/.gitignore +++ b/.gitignore @@ -26,3 +26,5 @@ nuget.exe *.sln.ide project.lock.json /.vs/ +.build/ +.testPublish/ \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 2fc624899f..bf811dc26a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -10,9 +10,11 @@ addons: - libssl-dev - libunwind8 - zlib1g -env: - - KOREBUILD_DNU_RESTORE_CORECLR=true mono: - 4.0.5 +os: + - linux + - osx +osx_image: xcode7.1 script: - - ./build.sh --quiet verify + - ./build.sh verify \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml index 636a7618d3..3fab83e134 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,7 +1,7 @@ init: - git config --global core.autocrlf true build_script: - - build.cmd --quiet verify + - build.cmd verify clone_depth: 1 test: off deploy: off \ No newline at end of file diff --git a/build.cmd b/build.cmd index 553e3929a0..ebb619e737 100644 --- a/build.cmd +++ b/build.cmd @@ -1,40 +1,40 @@ -@echo off -cd %~dp0 - +@ECHO off SETLOCAL + +SET REPO_FOLDER=%~dp0 +CD %REPO_FOLDER% + +SET BUILD_FOLDER=.build +SET KOREBUILD_FOLDER=%BUILD_FOLDER%\KoreBuild-dotnet +SET KOREBUILD_VERSION= + +SET NUGET_PATH=%BUILD_FOLDER%\NuGet.exe SET NUGET_VERSION=latest SET CACHED_NUGET=%LocalAppData%\NuGet\nuget.%NUGET_VERSION%.exe -SET BUILDCMD_KOREBUILD_VERSION= -SET BUILDCMD_DNX_VERSION= -IF EXIST %CACHED_NUGET% goto copynuget -echo Downloading latest version of NuGet.exe... -IF NOT EXIST %LocalAppData%\NuGet md %LocalAppData%\NuGet -@powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" - -:copynuget -IF EXIST .nuget\nuget.exe goto restore -md .nuget -copy %CACHED_NUGET% .nuget\nuget.exe > nul - -:restore -IF EXIST packages\Sake goto getdnx -IF "%BUILDCMD_KOREBUILD_VERSION%"=="" ( - .nuget\nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre -) ELSE ( - .nuget\nuget.exe install KoreBuild -version %BUILDCMD_KOREBUILD_VERSION% -ExcludeVersion -o packages -nocache -pre -) -.nuget\NuGet.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages - -:getdnx -IF "%BUILDCMD_DNX_VERSION%"=="" ( - SET BUILDCMD_DNX_VERSION=latest -) -IF "%SKIP_DNX_INSTALL%"=="" ( - CALL packages\KoreBuild\build\dnvm install %BUILDCMD_DNX_VERSION% -runtime CoreCLR -arch x86 -alias default - CALL packages\KoreBuild\build\dnvm install default -runtime CLR -arch x86 -alias default -) ELSE ( - CALL packages\KoreBuild\build\dnvm use default -runtime CLR -arch x86 +IF NOT EXIST %BUILD_FOLDER% ( + md %BUILD_FOLDER% ) -packages\Sake\tools\Sake.exe -I packages\KoreBuild\build -f makefile.shade %* +IF NOT EXIST %NUGET_PATH% ( + IF NOT EXIST %CACHED_NUGET% ( + echo Downloading latest version of NuGet.exe... + IF NOT EXIST %LocalAppData%\NuGet ( + md %LocalAppData%\NuGet + ) + @powershell -NoProfile -ExecutionPolicy unrestricted -Command "$ProgressPreference = 'SilentlyContinue'; Invoke-WebRequest 'https://dist.nuget.org/win-x86-commandline/%NUGET_VERSION%/nuget.exe' -OutFile '%CACHED_NUGET%'" + ) + + copy %CACHED_NUGET% %NUGET_PATH% > nul +) + +IF NOT EXIST %KOREBUILD_FOLDER% ( + SET KOREBUILD_DOWNLOAD_ARGS= + IF NOT "%KOREBUILD_VERSION%"=="" ( + SET KOREBUILD_DOWNLOAD_ARGS=-version %KOREBUILD_VERSION% + ) + + %BUILD_FOLDER%\nuget.exe install KoreBuild-dotnet -ExcludeVersion -o %BUILD_FOLDER% -nocache -pre %KOREBUILD_DOWNLOAD_ARGS% +) + +"%KOREBUILD_FOLDER%\build\KoreBuild.cmd" %* diff --git a/build.sh b/build.sh index da4e3fcd1c..7b5e25e3a8 100755 --- a/build.sh +++ b/build.sh @@ -1,5 +1,18 @@ #!/usr/bin/env bash +SOURCE="${BASH_SOURCE[0]}" +while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink + DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + SOURCE="$(readlink "$SOURCE")" + [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located +done +repoFolder="$( cd -P "$( dirname "$SOURCE" )" && pwd )" + +buildFolder=.build +koreBuildFolder=$buildFolder/KoreBuild-dotnet + +nugetPath=$buildFolder/nuget.exe + if test `uname` = Darwin; then cachedir=~/Library/Caches/KBuild else @@ -11,33 +24,25 @@ else fi mkdir -p $cachedir nugetVersion=latest -cachePath=$cachedir/nuget.$nugetVersion.exe +cacheNuget=$cachedir/nuget.$nugetVersion.exe -url=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe +nugetUrl=https://dist.nuget.org/win-x86-commandline/$nugetVersion/nuget.exe -if test ! -f $cachePath; then - wget -O $cachePath $url 2>/dev/null || curl -o $cachePath --location $url /dev/null +if test ! -d $buildFolder; then + mkdir $buildFolder fi -if test ! -e .nuget; then - mkdir .nuget - cp $cachePath .nuget/nuget.exe +if test ! -f $nugetPath; then + if test ! -f $cacheNuget; then + wget -O $cacheNuget $nugetUrl 2>/dev/null || curl -o $cacheNuget --location $nugetUrl /dev/null + fi + + cp $cacheNuget $nugetPath fi -if test ! -d packages/Sake; then - mono .nuget/nuget.exe install KoreBuild -ExcludeVersion -o packages -nocache -pre - mono .nuget/nuget.exe install Sake -ExcludeVersion -Source https://www.nuget.org/api/v2/ -Out packages +if test ! -d $koreBuildFolder; then + mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre fi -if ! type dnvm > /dev/null 2>&1; then - source packages/KoreBuild/build/dnvm.sh -fi +source $koreBuildFolder/build/KoreBuild.sh -if ! type dnx > /dev/null 2>&1 || [ -z "$SKIP_DNX_INSTALL" ]; then - dnvm install latest -runtime coreclr -alias default - dnvm install default -runtime mono -alias default -else - dnvm use default -runtime mono -fi - -mono packages/Sake/tools/Sake.exe -I packages/KoreBuild/build -f makefile.shade "$@" diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs index be2072bf9a..dd60adc4b5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs @@ -23,7 +23,7 @@ namespace Microsoft.AspNet.Hosting.Tests Assert.IsAssignableFrom(env.WebRootFileProvider); } - [Fact] + [Fact(Skip = "Missing content publish property")] public void DefaultsToWwwrootSubdir() { var env = new HostingEnvironment(); diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index d20f85b16e..fcbb01736a 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -301,7 +301,7 @@ namespace Microsoft.AspNet.Hosting Assert.Equal("Staging", env.EnvironmentName); } - [Fact] + [Fact(Skip = "Missing content publish property")] public void WebRootCanBeResolvedFromTheConfig() { var vals = new Dictionary diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNet.Hosting.Tests/project.json index 1a974b1eea..99ea348770 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/project.json +++ b/test/Microsoft.AspNet.Hosting.Tests/project.json @@ -1,21 +1,33 @@ { - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, + "content": [ + "testroot/**/*" + ], + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*", + "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.Extensions.Options": "1.0.0-*", + "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", + "xunit": "2.1.0" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "xunit.runner.console": "2.1.0" + } }, - "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*", - "Microsoft.AspNet.Owin": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.Extensions.Options": "1.0.0-*", - "Microsoft.Extensions.PlatformAbstractions": "1.0.0-*", + "dnxcore50": { + "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } - }, - "commands": { - "test": "xunit.runner.aspnet" + } } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" + } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNet.TestHost.Tests/project.json index 661f7c8602..58a862cb86 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/project.json +++ b/test/Microsoft.AspNet.TestHost.Tests/project.json @@ -1,19 +1,28 @@ { - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, + "dependencies": { + "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.AspNet.TestHost": "1.0.0-*", + "Microsoft.Extensions.DiagnosticAdapter": "1.0.0-*", + "xunit": "2.1.0" + }, + "frameworks": { + "dnx451": { + "dependencies": { + "xunit.runner.console": "2.1.0" + } }, - "dependencies": { - "Microsoft.AspNet.Testing": "1.0.0-*", - "Microsoft.AspNet.TestHost": "1.0.0-*", - "Microsoft.Extensions.DiagnosticAdapter": "1.0.0-*", + "dnxcore50": { + "dependencies": { "xunit.runner.aspnet": "2.0.0-aspnet-*" - }, - "commands": { - "test": "xunit.runner.aspnet" - }, - "frameworks": { - "dnx451": { }, - "dnxcore50": { } + } } + }, + "testRunner": "xunit", + "commands": { + "test": "xunit.runner.aspnet" + } } From 48451bdabcf0fcabd24cc4863b5d5b0c89637273 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 11 Jan 2016 13:28:48 -0800 Subject: [PATCH 0965/1838] Making application available from TestServer #519 --- src/Microsoft.AspNet.TestHost/TestServer.cs | 8 ++++++++ .../TestServerTests.cs | 15 +++++++++++++++ 2 files changed, 23 insertions(+) diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 38da4fd213..6d6d4ef4c9 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -29,6 +29,14 @@ namespace Microsoft.AspNet.TestHost public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); + public IWebApplication Application + { + get + { + return _appInstance; + } + } + IFeatureCollection IServer.Features { get; } public HttpMessageHandler CreateHandler() diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 92fdc85fb8..02a56de542 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -31,6 +31,21 @@ namespace Microsoft.AspNet.TestHost new TestServer(new WebApplicationBuilder().Configure(app => { })); } + [Fact] + public void ApplicationServicesAvailableFromTestServer() + { + var testService = new TestService(); + var builder = new WebApplicationBuilder() + .Configure(app => { }) + .ConfigureServices(services => + { + services.AddSingleton(testService); + }); + var server = new TestServer(builder); + + Assert.Equal(testService, server.Application.Services.GetRequiredService()); + } + [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task RequestServicesAutoCreated() From ccde3309789a49bd2fb2b09c38ab90630a1f70c3 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Mon, 11 Jan 2016 00:58:40 -0800 Subject: [PATCH 0966/1838] Update IISDeployer and its base class --- .../Common/DeploymentParameters.cs | 8 +- .../Deployers/ApplicationDeployer.cs | 183 +++++++----------- .../Deployers/ApplicationDeployerFactory.cs | 4 +- .../Deployers/IISDeployer.cs | 132 ++++++------- .../Deployers/IISExpressDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 6 +- 6 files changed, 135 insertions(+), 200 deletions(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs index f4b64df53f..83dfa962e0 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs @@ -42,11 +42,11 @@ namespace Microsoft.AspNet.Server.Testing EnvironmentVariables.Add(new KeyValuePair("ASPNET_DETAILEDERRORS", "true")); } - public ServerType ServerType { get; private set; } + public ServerType ServerType { get; } - public RuntimeFlavor RuntimeFlavor { get; private set; } + public RuntimeFlavor RuntimeFlavor { get; } - public RuntimeArchitecture RuntimeArchitecture { get; private set; } + public RuntimeArchitecture RuntimeArchitecture { get; } /// /// Suggested base url for the deployed application. The final deployed url could be @@ -77,8 +77,6 @@ namespace Microsoft.AspNet.Server.Testing /// public bool PublishWithNoSource { get; set; } - public string DnxRuntime { get; set; } - /// /// Environment variables to be set before starting the host. /// Not applicable for IIS Scenarios. diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index f2a07b24fd..8901e08f0d 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -5,8 +5,6 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; -using System.Text; -using System.Text.RegularExpressions; using System.Threading; using Microsoft.AspNet.Testing; using Microsoft.Extensions.Logging; @@ -19,128 +17,78 @@ namespace Microsoft.AspNet.Server.Testing /// public abstract class ApplicationDeployer : IApplicationDeployer { - /// - /// Example: runtimes/dnx-coreclr-win-x64.1.0.0-rc1-15844/bin - /// - protected string ChosenRuntimePath { get; set; } + private readonly Stopwatch _stopwatch = new Stopwatch(); - /// - /// Examples: dnx-coreclr-win-x64.1.0.0-rc1-15844, dnx-mono.1.0.0-rc1-15844 - /// - protected string ChosenRuntimeName { get; set; } - - protected DeploymentParameters DeploymentParameters { get; private set; } - - protected ILogger Logger { get; private set; } - - protected Stopwatch StopWatch { get; private set; } = new Stopwatch(); - - protected string OSPrefix - { - get - { - if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Linux) - { - return "linux"; - } - else if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Darwin) - { - return "darwin"; - } - else if (PlatformServices.Default.Runtime.OperatingSystemPlatform == Platform.Windows) - { - return "win"; - } - else - { - throw new InvalidOperationException("Unrecognized operating system"); - } - } - } - - protected string DnuCommandName - { - get - { - if (TestPlatformHelper.IsWindows) - { - return "dnu.cmd"; - } - else - { - return "dnu"; - } - } - } - - protected string DnxCommandName - { - get - { - if (TestPlatformHelper.IsWindows) - { - return "dnx.exe"; - } - else - { - return "dnx"; - } - } - } - - public abstract DeploymentResult Deploy(); - - public ApplicationDeployer( - DeploymentParameters deploymentParameters, - ILogger logger) + public ApplicationDeployer(DeploymentParameters deploymentParameters, ILogger logger) { DeploymentParameters = deploymentParameters; Logger = logger; + DnuCommandName = TestPlatformHelper.IsWindows ? "dnu.cmd" : "dnu"; + DnxCommandName = TestPlatformHelper.IsWindows ? "dnx.exe" : "dnx"; } - protected string PopulateChosenRuntimeInformation() + protected DeploymentParameters DeploymentParameters { get; } + + protected ILogger Logger { get; } + + protected string DnuCommandName { get; } + + protected string DnxCommandName { get; } + + protected string TargetRuntimeName { get; private set; } + + protected string TargetRuntimeBinPath { get; private set; } + + protected string ToolingRuntimeBinPath { get; private set; } + + public abstract DeploymentResult Deploy(); + + protected void PickRuntime() { - string currentRuntimeBinPath = PlatformServices.Default.Runtime.RuntimePath; + var currentRuntimeBinPath = PlatformServices.Default.Runtime.RuntimePath; Logger.LogInformation($"Current runtime path is : {currentRuntimeBinPath}"); - string targetRuntimeName; + var currentRuntimeFullName = new DirectoryInfo(currentRuntimeBinPath).Parent.Name; + var currentRuntimeVersionParts = currentRuntimeFullName.Split(new char[] { '.' }, 2); + if (currentRuntimeVersionParts.Length < 2) + { + throw new ArgumentNullException($"The current runtime bin path points to a runtime name doesn't indicate a version: {currentRuntimeBinPath}."); + } + var currentRuntimeVersion = currentRuntimeVersionParts[1]; + + var runtimeHome = new DirectoryInfo(currentRuntimeBinPath).Parent.Parent.FullName; + Logger.LogInformation($"Runtime home folder: {runtimeHome}"); + if (DeploymentParameters.RuntimeFlavor == RuntimeFlavor.Mono) { - targetRuntimeName = "dnx-mono"; + // TODO: review on mono + TargetRuntimeName = $"dnx-mono.{currentRuntimeVersion}"; + TargetRuntimeBinPath = Path.Combine(runtimeHome, TargetRuntimeName, "bin"); + ToolingRuntimeBinPath = TargetRuntimeBinPath; } else { - targetRuntimeName = new StringBuilder() - .Append("dnx") - .Append((DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr) ? "-coreclr" : "-clr") - .Append($"-{OSPrefix}") - .Append((DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86) ? "-x86" : "-x64") - .ToString(); + var flavor = DeploymentParameters.RuntimeFlavor == RuntimeFlavor.CoreClr ? "coreclr" : "clr"; + var architecture = DeploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86 ? "x86" : "x64"; + + // tooling runtime will stick to coreclr so as to prevent long path issue during publishing + ToolingRuntimeBinPath = Path.Combine(runtimeHome, $"dnx-coreclr-{GetOSPrefix()}-{architecture}.{currentRuntimeVersion}", "bin"); + + TargetRuntimeName = $"dnx-{flavor}-{GetOSPrefix()}-{architecture}.{currentRuntimeVersion}"; + TargetRuntimeBinPath = Path.Combine(runtimeHome, TargetRuntimeName, "bin"); } - var targetRuntimeBinPath = Regex.Replace( - currentRuntimeBinPath, - "dnx-(mono|((clr|coreclr)-(win|linux|darwin)-(x86|x64)))", - targetRuntimeName, - RegexOptions.IgnoreCase); - - var targetRuntimeBinDir = new DirectoryInfo(targetRuntimeBinPath); - if (targetRuntimeBinDir == null || !targetRuntimeBinDir.Exists) + if (!Directory.Exists(ToolingRuntimeBinPath) || !Directory.Exists(TargetRuntimeBinPath)) { - throw new Exception($"Requested runtime at location '{targetRuntimeBinPath}' does not exist.Please make sure it is installed before running test."); + throw new Exception($"Requested runtime '{ToolingRuntimeBinPath}' or '{TargetRuntimeBinPath}; does not exist. Please make sure it is installed before running test."); } - ChosenRuntimePath = targetRuntimeBinDir.FullName; - ChosenRuntimeName = targetRuntimeBinDir.Parent.Name; - DeploymentParameters.DnxRuntime = ChosenRuntimeName; - - Logger.LogInformation($"Chosen runtime path is {ChosenRuntimePath}"); + Logger.LogInformation($"Pick target runtime {TargetRuntimeBinPath}"); + Logger.LogInformation($"Pick tooling runtime {ToolingRuntimeBinPath}"); // Work around win7 search path issues. - var newPath = ChosenRuntimePath + Path.PathSeparator + Environment.GetEnvironmentVariable("PATH"); + var newPath = TargetRuntimeBinPath + Path.PathSeparator + Environment.GetEnvironmentVariable("PATH"); DeploymentParameters.EnvironmentVariables.Add(new KeyValuePair("PATH", newPath)); - - return ChosenRuntimeName; } protected void DnuPublish(string publishRoot = null) @@ -150,9 +98,9 @@ namespace Microsoft.AspNet.Server.Testing var noSource = DeploymentParameters.PublishWithNoSource ? "--no-source" : string.Empty; var command = DeploymentParameters.Command ?? "web"; var parameters = $"publish {DeploymentParameters.ApplicationPath} -o {DeploymentParameters.PublishedApplicationRootPath}" - + $" --runtime {DeploymentParameters.DnxRuntime} {noSource} --iis-command {command}"; + + $" --runtime {TargetRuntimeName} {noSource} --iis-command {command}"; - var dnuPath = Path.Combine(ChosenRuntimePath, DnuCommandName); + var dnuPath = Path.Combine(ToolingRuntimeBinPath, DnuCommandName); Logger.LogInformation($"Executing command {dnuPath} {parameters}"); var startInfo = new ProcessStartInfo @@ -166,8 +114,8 @@ namespace Microsoft.AspNet.Server.Testing }; var hostProcess = new Process() { StartInfo = startInfo }; - hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogError(dataArgs.Data ?? string.Empty); }; - hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogInformation(dataArgs.Data ?? string.Empty); }; + hostProcess.ErrorDataReceived += (sender, dataArgs) => { Logger.LogWarning(dataArgs.Data ?? string.Empty); }; + hostProcess.OutputDataReceived += (sender, dataArgs) => { Logger.LogTrace(dataArgs.Data ?? string.Empty); }; hostProcess.Start(); hostProcess.BeginErrorReadLine(); hostProcess.BeginOutputReadLine(); @@ -180,10 +128,9 @@ namespace Microsoft.AspNet.Server.Testing DeploymentParameters.ApplicationPath = (DeploymentParameters.ServerType == ServerType.IISExpress || - DeploymentParameters.ServerType == ServerType.IIS) ? + DeploymentParameters.ServerType == ServerType.IIS) ? Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "wwwroot") : - Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "approot", "src", - new DirectoryInfo(DeploymentParameters.ApplicationPath).Name); + Path.Combine(DeploymentParameters.PublishedApplicationRootPath, "approot", "src", new DirectoryInfo(DeploymentParameters.ApplicationPath).Name); Logger.LogInformation($"dnu publish finished with exit code : {hostProcess.ExitCode}"); } @@ -299,15 +246,27 @@ namespace Microsoft.AspNet.Server.Testing protected void StartTimer() { Logger.LogInformation($"Deploying {DeploymentParameters.ToString()}"); - StopWatch.Start(); + _stopwatch.Start(); } protected void StopTimer() { - StopWatch.Stop(); - Logger.LogInformation("[Time]: Total time taken for this test variation '{t}' seconds", StopWatch.Elapsed.TotalSeconds); + _stopwatch.Stop(); + Logger.LogInformation("[Time]: Total time taken for this test variation '{t}' seconds", _stopwatch.Elapsed.TotalSeconds); } public abstract void Dispose(); + + protected static string GetOSPrefix() + { + switch (PlatformServices.Default.Runtime.OperatingSystemPlatform) + { + case Platform.Linux: return "linux"; + case Platform.Darwin: return "darwin"; + case Platform.Windows: return "win"; + default: + throw new InvalidOperationException("Unrecognized operating system"); + } + } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs index 4e4ae9d1e0..0b5776b8b4 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs @@ -33,7 +33,7 @@ namespace Microsoft.AspNet.Server.Testing { case ServerType.IISExpress: return new IISExpressDeployer(deploymentParameters, logger); -#if NET451 +#if DNX451 case ServerType.IIS: return new IISDeployer(deploymentParameters, logger); #endif @@ -48,4 +48,4 @@ namespace Microsoft.AspNet.Server.Testing } } } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index 5403dbc1df..3ba827af7c 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -1,12 +1,13 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -#if NET451 +#if DNX451 + using System; -using System.IO; using System.Linq; +using System.Net; +using System.Net.Sockets; using System.Threading; -using System.Xml; using Microsoft.Extensions.Logging; using Microsoft.Web.Administration; @@ -36,10 +37,10 @@ namespace Microsoft.AspNet.Server.Testing _application = new IISApplication(DeploymentParameters, Logger); - DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + PickRuntime(); // Publish to IIS root\application folder. - DnuPublish(publishRoot: _application.WebSiteRootFolder); + DnuPublish(); // Drop a json file instead of setting environment variable. SetAspEnvironmentWithJson(); @@ -59,19 +60,11 @@ namespace Microsoft.AspNet.Server.Testing WebRootLocation = DeploymentParameters.ApplicationPath, DeploymentParameters = DeploymentParameters, // Accomodate the vdir name. - ApplicationBaseUri = new UriBuilder(Uri.UriSchemeHttp, "localhost", IISApplication.Port, _application.VirtualDirectoryName).Uri.AbsoluteUri + "/", + ApplicationBaseUri = new UriBuilder(Uri.UriSchemeHttp, "localhost", _application.Port).Uri.AbsoluteUri + "/", HostShutdownToken = _hostShutdownToken.Token }; } - private void SetAspEnvironmentWithJson() - { - // Drop a hosting.json with Hosting:Environment information. - Logger.LogInformation("Creating hosting.json file with Hosting:Environment."); - var jsonFile = Path.Combine(DeploymentParameters.ApplicationPath, "hosting.json"); - File.WriteAllText(jsonFile, string.Format("{ \"Hosting:Environment\":\"{0}\" }", DeploymentParameters.EnvironmentName)); - } - public override void Dispose() { if (_application != null) @@ -83,6 +76,8 @@ namespace Microsoft.AspNet.Server.Testing } TriggerHostShutdown(_hostShutdownToken); + + Thread.Sleep(TimeSpan.FromSeconds(3)); } CleanPublishedOutput(); @@ -91,94 +86,79 @@ namespace Microsoft.AspNet.Server.Testing StopTimer(); } + private void SetAspEnvironmentWithJson() + { + ////S Drop a hosting.json with Hosting:Environment information. + // Logger.LogInformation("Creating hosting.json file with Hosting:Environment."); + // var jsonFile = Path.Combine(DeploymentParameters.ApplicationPath, "hosting.json"); + // File.WriteAllText(jsonFile, string.Format("{ \"Hosting:Environment\":\"{0}\" }", DeploymentParameters.EnvironmentName)); + } + private class IISApplication { - private const string WebSiteName = "ASPNETTESTRUNS"; - private readonly ServerManager _serverManager = new ServerManager(); private readonly DeploymentParameters _deploymentParameters; private readonly ILogger _logger; - private ApplicationPool _applicationPool; - private Application _application; - private Site _website; - - public string VirtualDirectoryName { get; set; } - - // Always create website with the same port. - public const int Port = 5100; - - public string WebSiteRootFolder - { - get - { - return Path.Combine( - Environment.GetEnvironmentVariable("SystemDrive") + @"\", - "inetpub", - WebSiteName); - } - } public IISApplication(DeploymentParameters deploymentParameters, ILogger logger) { _deploymentParameters = deploymentParameters; _logger = logger; + + WebSiteName = CreateTestSiteName(); + Port = FindFreePort(); } + public int Port { get; } + + public string WebSiteName { get; } + + public string WebSiteRootFolder => $"{Environment.GetEnvironmentVariable("SystemDrive")}\\inetpub\\{WebSiteName}"; + public void Deploy() { - VirtualDirectoryName = new DirectoryInfo(_deploymentParameters.ApplicationPath).Parent.Name; - _applicationPool = CreateAppPool(VirtualDirectoryName); - _application = Website.Applications.Add("/" + VirtualDirectoryName, _deploymentParameters.ApplicationPath); - _application.ApplicationPoolName = _applicationPool.Name; + _serverManager.Sites.Add(WebSiteName, _deploymentParameters.ApplicationPath, Port); _serverManager.CommitChanges(); } - private Site Website - { - get - { - _website = _serverManager.Sites.Where(s => s.Name == WebSiteName).FirstOrDefault(); - if (_website == null) - { - _website = _serverManager.Sites.Add(WebSiteName, WebSiteRootFolder, Port); - } - - return _website; - } - } - - private ApplicationPool CreateAppPool(string appPoolName) - { - var applicationPool = _serverManager.ApplicationPools.Add(appPoolName); - applicationPool.ManagedRuntimeVersion = string.Empty; - - applicationPool.Enable32BitAppOnWin64 = (_deploymentParameters.RuntimeArchitecture == RuntimeArchitecture.x86); - _logger.LogInformation("Created {bit} application pool '{name}' with runtime version {runtime}.", - _deploymentParameters.RuntimeArchitecture, applicationPool.Name, - string.IsNullOrEmpty(applicationPool.ManagedRuntimeVersion) ? "that is default" : applicationPool.ManagedRuntimeVersion); - return applicationPool; - } - public void StopAndDeleteAppPool() { - _logger.LogInformation("Stopping application pool '{name}' and deleting application.", _applicationPool.Name); - - if (_applicationPool != null) + if (string.IsNullOrEmpty(WebSiteName)) { - _applicationPool.Stop(); + return; } - // Remove the application from website. - if (_application != null) + var siteToRemove = _serverManager.Sites.FirstOrDefault(site => site.Name == WebSiteName); + if (siteToRemove != null) { - _application = Website.Applications.Where(a => a.Path == _application.Path).FirstOrDefault(); - Website.Applications.Remove(_application); - _serverManager.ApplicationPools.Remove(_serverManager.ApplicationPools[_applicationPool.Name]); + siteToRemove.Stop(); + _serverManager.Sites.Remove(siteToRemove); _serverManager.CommitChanges(); - _logger.LogInformation("Successfully stopped application pool '{name}' and deleted application from IIS.", _applicationPool.Name); + } + } + + private static int FindFreePort() + { + using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) + { + socket.Bind(new IPEndPoint(IPAddress.Loopback, 0)); + return ((IPEndPoint)socket.LocalEndPoint).Port; + } + } + + private string CreateTestSiteName() + { + if (!string.IsNullOrEmpty(_deploymentParameters.SiteName)) + { + return $"{_deploymentParameters.SiteName}{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + } + else + { + return $"testsite{DateTime.Now.ToString("yyyyMMddHHmmss")}"; } } } } } -#endif \ No newline at end of file + +#endif diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index c60bf11b37..d3911ac925 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Server.Testing // Start timer StartTimer(); - DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + PickRuntime(); // For now we always auto-publish. Otherwise we'll have to write our own local web.config for the HttpPlatformHandler DeploymentParameters.PublishApplicationBeforeDeployment = true; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index e1fdc509b0..c018f0dac7 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -2,11 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Threading; -using Microsoft.AspNet.Testing; using Microsoft.Extensions.Logging; namespace Microsoft.AspNet.Server.Testing @@ -28,7 +26,7 @@ namespace Microsoft.AspNet.Server.Testing // Start timer StartTimer(); - DeploymentParameters.DnxRuntime = PopulateChosenRuntimeInformation(); + PickRuntime(); if (DeploymentParameters.PublishApplicationBeforeDeployment) { @@ -55,7 +53,7 @@ namespace Microsoft.AspNet.Server.Testing commandName = "run"; } - var dnxPath = Path.Combine(ChosenRuntimePath, DnxCommandName); + var dnxPath = Path.Combine(TargetRuntimeBinPath, DnxCommandName); var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" {commandName} " + $"--server.urls {DeploymentParameters.ApplicationBaseUriHint} " + $"--server {(DeploymentParameters.ServerType == ServerType.WebListener ? "Microsoft.AspNet.Server.WebListener" : "Microsoft.AspNet.Server.Kestrel")}"; From 1b05fb442ecb6ea0ba48beff035e78bd151fe9e2 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 11 Jan 2016 20:50:34 -0800 Subject: [PATCH 0967/1838] Add extension to configure capture startup errors setting which defaults to true #552 --- .../WebApplicationBuilderExtensions.cs | 5 ++++ .../WebApplicationConfiguration.cs | 12 +++++++++- .../WebApplicationBuilderTests.cs | 23 +++++++++++++++++++ .../WebApplicationConfigurationsTests.cs | 8 +++++++ 4 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs index 555c087bd3..e4fd487507 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs @@ -13,6 +13,11 @@ namespace Microsoft.AspNet.Hosting { private static readonly string ServerUrlsSeparator = ";"; + public static IWebApplicationBuilder UseCaptureStartupErrors(this IWebApplicationBuilder applicationBuilder, bool captureStartupError) + { + return applicationBuilder.UseSetting(WebApplicationDefaults.CaptureStartupErrorsKey, captureStartupError ? "true" : "false"); + } + public static IWebApplicationBuilder UseStartup(this IWebApplicationBuilder applicationBuilder) where TStartup : class { return applicationBuilder.UseStartup(typeof(TStartup)); diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs index 3bc3013858..e08549b8c8 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs @@ -1,4 +1,8 @@ -using Microsoft.Extensions.Configuration; +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting { @@ -11,9 +15,15 @@ namespace Microsoft.AspNet.Hosting public static IConfiguration GetDefault(string[] args) { + var defaultSettings = new Dictionary + { + { WebApplicationDefaults.CaptureStartupErrorsKey, "true" } + }; + // We are adding all environment variables first and then adding the ASPNET_ ones // with the prefix removed to unify with the command line and config file formats var configBuilder = new ConfigurationBuilder() + .AddInMemoryCollection(defaultSettings) .AddJsonFile(WebApplicationDefaults.HostingJsonFile, optional: true) .AddEnvironmentVariables() .AddEnvironmentVariables(prefix: WebApplicationDefaults.EnvironmentVariablesPrefix); diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs index a71b92bbae..d316a3b460 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs @@ -123,6 +123,29 @@ namespace Microsoft.AspNet.Hosting } } + [Fact] + public void CaptureStartupErrorsByDefault() + { + var applicationBuilder = new WebApplicationBuilder() + .UseServer(new TestServer()) + .UseStartup(); + + // This should not throw + applicationBuilder.Build(); + } + + [Fact] + public void UseCaptureStartupErrorsHonored() + { + var applicationBuilder = new WebApplicationBuilder() + .UseCaptureStartupErrors(false) + .UseServer(new TestServer()) + .UseStartup(); + + var exception = Assert.Throws(() => applicationBuilder.Build()); + Assert.Equal("A public method named 'ConfigureProduction' or 'Configure' could not be found in the 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' type.", exception.Message); + } + [Fact] public void UseEnvironmentIsNotOverriden() { diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs index cd7dbdd569..8c27409f1c 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs @@ -10,6 +10,14 @@ namespace Microsoft.AspNet.Hosting.Tests { public class WebApplicationConfigurationTests { + [Fact] + public void DefaultCapturesStartupErrors() + { + var config = new WebApplicationOptions(WebApplicationConfiguration.GetDefault()); + + Assert.True(config.CaptureStartupErrors); + } + [Fact] public void ReadsParametersCorrectly() { From eb617eb9a9c75cfa80b01292107fc57700237474 Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Tue, 12 Jan 2016 11:34:14 -0800 Subject: [PATCH 0968/1838] Publish to inetpub --- src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index 3ba827af7c..7edbea1491 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -40,7 +40,7 @@ namespace Microsoft.AspNet.Server.Testing PickRuntime(); // Publish to IIS root\application folder. - DnuPublish(); + DnuPublish(publishRoot: _application.WebSiteRootFolder); // Drop a json file instead of setting environment variable. SetAspEnvironmentWithJson(); From 317c9d0e80994a9aeaa1decafc62fa1e4f91b60e Mon Sep 17 00:00:00 2001 From: Chris R Date: Tue, 12 Jan 2016 11:42:36 -0800 Subject: [PATCH 0969/1838] Remove HttpPlatformHandler port detection. --- .../Internal/WebApplication.cs | 16 ++-------------- .../WebApplicationTests.cs | 18 ------------------ 2 files changed, 2 insertions(+), 32 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs index 170a7f26cd..74e95c4bc5 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs @@ -21,9 +21,6 @@ namespace Microsoft.AspNet.Hosting.Internal { public class WebApplication : IWebApplication { - // This is defined by IIS's HttpPlatformHandler. - private static readonly string ServerPort = "HTTP_PLATFORM_PORT"; - private readonly IServiceCollection _applicationServiceCollection; private readonly IStartupLoader _startupLoader; private readonly ApplicationLifetime _applicationLifetime; @@ -223,19 +220,10 @@ namespace Microsoft.AspNet.Hosting.Internal Server = ServerFactory.CreateServer(_config); var addresses = Server.Features?.Get()?.Addresses; - if (addresses != null && !addresses.IsReadOnly) + if (addresses != null && !addresses.IsReadOnly && addresses.Count == 0) { - var port = _config[ServerPort]; - if (!string.IsNullOrEmpty(port)) - { - addresses.Add("http://localhost:" + port); - } - // Provide a default address if there aren't any configured. - if (addresses.Count == 0) - { - addresses.Add("http://localhost:5000"); - } + addresses.Add("http://localhost:5000"); } } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index fcbb01736a..a83818a9cf 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -106,24 +106,6 @@ namespace Microsoft.AspNet.Hosting Assert.NotNull(application.Services.GetService()); } - [Fact] - public void CanSpecifyPortConfig() - { - var vals = new Dictionary - { - { "Server", "Microsoft.AspNet.Hosting.Tests" }, - { "HTTP_PLATFORM_PORT", "abc123" } - }; - - var builder = new ConfigurationBuilder() - .AddInMemoryCollection(vals); - var config = builder.Build(); - var application = CreateBuilder(config).Build(); - application.Start(); - Assert.NotNull(application.Services.GetService()); - Assert.Equal("http://localhost:abc123", application.ServerFeatures.Get().Addresses.First()); - } - [Fact] public void CanDefaultAddresseIfNotConfigured() { From d422201e016f2836b8e226683e541c1d8270351c Mon Sep 17 00:00:00 2001 From: John Luo Date: Tue, 12 Jan 2016 00:47:18 -0800 Subject: [PATCH 0970/1838] Elaborating error message when no startup is specified --- src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs index 1898dd818a..c77cbced34 100644 --- a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs @@ -43,7 +43,10 @@ namespace Microsoft.AspNet.Hosting.Startup var environmentName = _hostingEnv.EnvironmentName; if (string.IsNullOrEmpty(startupAssemblyName)) { - throw new ArgumentException("Value cannot be null or empty.", nameof(startupAssemblyName)); + throw new ArgumentException( + string.Format("A startup method, startup type or startup assembly is required. If specifying an assembly, '{0}' cannot be null or empty.", + nameof(startupAssemblyName)), + nameof(startupAssemblyName)); } var assembly = Assembly.Load(new AssemblyName(startupAssemblyName)); From 4b64d187c2d9ba5f57cbb7935a24091edf0d0014 Mon Sep 17 00:00:00 2001 From: Kristian Hellang Date: Wed, 13 Jan 2016 12:34:00 +0100 Subject: [PATCH 0971/1838] Promote IFormFile extension methods to IFormFile --- .../IFormFile.cs | 38 +++++++++++- .../FormFileExtensions.cs | 60 ------------------- .../Features/FormFile.cs | 55 ++++++++++++++++- 3 files changed, 91 insertions(+), 62 deletions(-) delete mode 100644 src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs index b5e44904b4..eca4d6a20b 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs @@ -2,6 +2,8 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Threading; +using System.Threading.Tasks; namespace Microsoft.AspNet.Http { @@ -10,18 +12,52 @@ namespace Microsoft.AspNet.Http /// public interface IFormFile { + /// + /// Gets the raw Content-Type header of the uploaded file. + /// string ContentType { get; } + /// + /// Gets the raw Content-Disposition header of the uploaded file. + /// string ContentDisposition { get; } + /// + /// Gets the header dictionary of the uploaded file. + /// IHeaderDictionary Headers { get; } + /// + /// Gets the file length in bytes. + /// long Length { get; } + /// + /// Gets the name from the Content-Disposition header. + /// string Name { get; } + /// + /// Gets the file name from the Content-Disposition header. + /// string FileName { get; } + /// + /// Opens the request stream for reading the uploaded file. + /// Stream OpenReadStream(); + + /// + /// Saves the contents of the uploaded file. + /// + /// The path of the file to create. + void SaveAs(string path); + + /// + /// Asynchronously saves the contents of the uploaded file. + /// + /// The path of the file to create. + /// + Task SaveAsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)); } -} \ No newline at end of file +} diff --git a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs deleted file mode 100644 index fa68ae340a..0000000000 --- a/src/Microsoft.AspNet.Http.Extensions/FormFileExtensions.cs +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Threading; -using System.Threading.Tasks; - -namespace Microsoft.AspNet.Http -{ - /// - /// Extension methods for . - /// - public static class FormFileExtensions - { - // Stream.CopyTo method uses 80KB as the default buffer size. - private static int DefaultBufferSize = 80 * 1024; - - /// - /// Saves the contents of an uploaded file. - /// - /// The . - /// The name of the file to create. - public static void SaveAs(this IFormFile formFile, string filename) - { - if (formFile == null) - { - throw new ArgumentNullException(nameof(formFile)); - } - - using (var fileStream = new FileStream(filename, FileMode.Create)) - { - var inputStream = formFile.OpenReadStream(); - inputStream.CopyTo(fileStream); - } - } - - /// - /// Asynchronously saves the contents of an uploaded file. - /// - /// The . - /// The name of the file to create. - public async static Task SaveAsAsync( - this IFormFile formFile, - string filename, - CancellationToken cancellationToken = default(CancellationToken)) - { - if (formFile == null) - { - throw new ArgumentNullException(nameof(formFile)); - } - - using (var fileStream = new FileStream(filename, FileMode.Create)) - { - var inputStream = formFile.OpenReadStream(); - await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); - } - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNet.Http/Features/FormFile.cs index 3fc5113633..f9e4bfc539 100644 --- a/src/Microsoft.AspNet.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNet.Http/Features/FormFile.cs @@ -2,12 +2,17 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Threading; +using System.Threading.Tasks; using Microsoft.AspNet.Http.Internal; namespace Microsoft.AspNet.Http.Features.Internal { public class FormFile : IFormFile { + // Stream.CopyTo method uses 80KB as the default buffer size. + private const int DefaultBufferSize = 80 * 1024; + private readonly Stream _baseStream; private readonly long _baseStreamOffset; @@ -20,29 +25,77 @@ namespace Microsoft.AspNet.Http.Features.Internal FileName = fileName; } + /// + /// Gets the raw Content-Disposition header of the uploaded file. + /// public string ContentDisposition { get { return Headers["Content-Disposition"]; } set { Headers["Content-Disposition"] = value; } } + /// + /// Gets the raw Content-Type header of the uploaded file. + /// public string ContentType { get { return Headers["Content-Type"]; } set { Headers["Content-Type"] = value; } } + /// + /// Gets the header dictionary of the uploaded file. + /// public IHeaderDictionary Headers { get; set; } + /// + /// Gets the file length in bytes. + /// public long Length { get; } + /// + /// Gets the name from the Content-Disposition header. + /// public string Name { get; } + /// + /// Gets the file name from the Content-Disposition header. + /// public string FileName { get; } + /// + /// Opens the request stream for reading the uploaded file. + /// public Stream OpenReadStream() { return new ReferenceReadStream(_baseStream, _baseStreamOffset, Length); } + + /// + /// Saves the contents of the uploaded file. + /// + /// The path of the file to create. + public void SaveAs(string path) + { + using (var fileStream = File.Create(path, DefaultBufferSize)) + { + var inputStream = OpenReadStream(); + inputStream.CopyTo(fileStream, DefaultBufferSize); + } + } + + /// + /// Asynchronously saves the contents of the uploaded file. + /// + /// The path of the file to create. + /// + public async Task SaveAsAsync(string path, CancellationToken cancellationToken = default(CancellationToken)) + { + using (var fileStream = File.Create(path, DefaultBufferSize, FileOptions.Asynchronous)) + { + var inputStream = OpenReadStream(); + await inputStream.CopyToAsync(fileStream, DefaultBufferSize, cancellationToken); + } + } } -} \ No newline at end of file +} From fa72fdeaedd9629a64a74124a82632fcc425f22a Mon Sep 17 00:00:00 2001 From: Ben Adams Date: Fri, 1 Jan 2016 20:14:01 +0000 Subject: [PATCH 0972/1838] Higher accuracy in timings --- .../Internal/HostingApplication.cs | 31 ++++++++++++------- .../Internal/HostingLoggerExtensions.cs | 14 ++++----- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs index 5ed245354a..7b77757e7f 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs @@ -33,41 +33,50 @@ namespace Microsoft.AspNet.Hosting.Internal public Context CreateContext(IFeatureCollection contextFeatures) { var httpContext = _httpContextFactory.Create(contextFeatures); - var startTick = Environment.TickCount; + var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest"); + var startTimestamp = (diagnoticsEnabled || _logger.IsEnabled(LogLevel.Information)) ? Stopwatch.GetTimestamp() : 0; var scope = _logger.RequestScope(httpContext); _logger.RequestStarting(httpContext); - if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest")) + if (diagnoticsEnabled) { - _diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext, tickCount = startTick }); + _diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext, timestamp = startTimestamp }); } return new Context { HttpContext = httpContext, Scope = scope, - StartTick = startTick, + StartTimestamp = startTimestamp, }; } public void DisposeContext(Context context, Exception exception) { var httpContext = context.HttpContext; - var currentTick = Environment.TickCount; - _logger.RequestFinished(httpContext, context.StartTick, currentTick); if (exception == null) { - if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest")) + var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest"); + var currentTimestamp = (diagnoticsEnabled || context.StartTimestamp != 0) ? Stopwatch.GetTimestamp() : 0; + + _logger.RequestFinished(httpContext, context.StartTimestamp, currentTimestamp); + + if (diagnoticsEnabled) { - _diagnosticSource.Write("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext, tickCount = currentTick }); + _diagnosticSource.Write("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext, timestamp = currentTimestamp }); } } else { - if (_diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException")) + var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException"); + var currentTimestamp = (diagnoticsEnabled || context.StartTimestamp != 0) ? Stopwatch.GetTimestamp() : 0; + + _logger.RequestFinished(httpContext, context.StartTimestamp, currentTimestamp); + + if (diagnoticsEnabled) { - _diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, tickCount = currentTick, exception = exception }); + _diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, timestamp = currentTimestamp, exception = exception }); } } @@ -85,7 +94,7 @@ namespace Microsoft.AspNet.Hosting.Internal { public HttpContext HttpContext { get; set; } public IDisposable Scope { get; set; } - public int StartTick { get; set; } + public long StartTimestamp { get; set; } } } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs index 4f149d5b44..0fdf122848 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Diagnostics; using System.Collections.Generic; using Microsoft.AspNet.Http; using Microsoft.Extensions.Logging; @@ -10,8 +11,8 @@ namespace Microsoft.AspNet.Hosting.Internal { internal static class HostingLoggerExtensions { - private const long TicksPerMillisecond = 10000; - + private static readonly double TimestampToTicks = TimeSpan.TicksPerSecond / (double)Stopwatch.Frequency; + public static IDisposable RequestScope(this ILogger logger, HttpContext httpContext) { return logger.BeginScopeImpl(new HostingLogScope(httpContext)); @@ -30,13 +31,12 @@ namespace Microsoft.AspNet.Hosting.Internal } } - public static void RequestFinished(this ILogger logger, HttpContext httpContext, int startTimeInTicks, int currentTick) + public static void RequestFinished(this ILogger logger, HttpContext httpContext, long startTimestamp, long currentTimestamp) { - if (logger.IsEnabled(LogLevel.Information)) + // Don't log if Information logging wasn't enabled at start or end of request as time will be wildly wrong. + if (startTimestamp != 0) { - var elapsed = new TimeSpan(TicksPerMillisecond * (currentTick < startTimeInTicks ? - (int.MaxValue - startTimeInTicks) + (currentTick - int.MinValue) : - currentTick - startTimeInTicks)); + var elapsed = new TimeSpan((long)(TimestampToTicks * (currentTimestamp - startTimestamp))); logger.Log( logLevel: LogLevel.Information, From f7be1fb80e485c96102cd134fd64d4f063814c16 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 11 Jan 2016 16:57:59 -0800 Subject: [PATCH 0973/1838] Fixing logger nullref when context created with no feature #532 --- .../ClientHandler.cs | 9 ++-- .../WebSocketClient.cs | 7 +-- .../ClientHandlerTests.cs | 48 +++++++++++++++++++ .../TestClientTests.cs | 44 ++++++++++++----- .../TestServerTests.cs | 1 - 5 files changed, 90 insertions(+), 19 deletions(-) diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNet.TestHost/ClientHandler.cs index 0dac9f0546..9f3a9f0fbb 100644 --- a/src/Microsoft.AspNet.TestHost/ClientHandler.cs +++ b/src/Microsoft.AspNet.TestHost/ClientHandler.cs @@ -124,12 +124,13 @@ namespace Microsoft.AspNet.TestHost request.Headers.Host = request.RequestUri.GetComponents(UriComponents.HostAndPort, UriFormat.UriEscaped); } - Context = application.CreateContext(new FeatureCollection()); + var contextFeatures = new FeatureCollection(); + contextFeatures.Set(new RequestFeature()); + _responseFeature = new ResponseFeature(); + contextFeatures.Set(_responseFeature); + Context = application.CreateContext(contextFeatures); var httpContext = Context.HttpContext; - httpContext.Features.Set(new RequestFeature()); - _responseFeature = new ResponseFeature(); - httpContext.Features.Set(_responseFeature); var serverRequest = httpContext.Request; serverRequest.Protocol = "HTTP/" + request.Version.ToString(2); serverRequest.Scheme = request.RequestUri.Scheme; diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs index 8c9da7e11b..b26a1a4223 100644 --- a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs +++ b/src/Microsoft.AspNet.TestHost/WebSocketClient.cs @@ -98,11 +98,13 @@ namespace Microsoft.AspNet.TestHost _application = application; // HttpContext - Context = _application.CreateContext(new FeatureCollection()); + var contextFeatures = new FeatureCollection(); + contextFeatures.Set(new RequestFeature()); + contextFeatures.Set(new ResponseFeature()); + Context = _application.CreateContext(contextFeatures); var httpContext = Context.HttpContext; // Request - httpContext.Features.Set(new RequestFeature()); var request = httpContext.Request; request.Protocol = "HTTP/1.1"; var scheme = uri.Scheme; @@ -130,7 +132,6 @@ namespace Microsoft.AspNet.TestHost request.Body = Stream.Null; // Response - httpContext.Features.Set(new ResponseFeature()); var response = httpContext.Response; response.Body = Stream.Null; response.StatusCode = 200; diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index 820f98d1fb..b439df01bd 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -5,13 +5,19 @@ using System; using System.IO; using System.Linq; using System.Net.Http; +using System.Text; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Http; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Testing.xunit; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Xunit; using Context = Microsoft.AspNet.Hosting.Internal.HostingApplication.Context; @@ -269,5 +275,47 @@ namespace Microsoft.AspNet.TestHost return _application(context.HttpContext); } } + + + [ConditionalFact] + [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] + public async Task ClientHandlerCreateContextWithDefaultRequestParameters() + { + // This logger will attempt to access information from HttpRequest once the HttpContext is created + var logger = new VerifierLogger(); + var builder = new WebApplicationBuilder() + .ConfigureServices(services => + { + services.AddSingleton>(logger); + }) + .Configure(app => + { + app.Run(context => + { + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + // The HttpContext will be created and the logger will make sure that the HttpRequest exists and contains reasonable values + var result = await server.CreateClient().GetStringAsync("/"); + } + + private class VerifierLogger : ILogger + { + public IDisposable BeginScopeImpl(object state) => new NoopDispoasble(); + + public bool IsEnabled(LogLevel logLevel) => true; + + // This call verifies that fields of HttpRequest are accessed and valid + public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func formatter) => formatter(state, exception); + + class NoopDispoasble : IDisposable + { + public void Dispose() + { + } + } + } } } diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index a453aaa564..42a1a7752f 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -11,21 +11,17 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; +using Microsoft.AspNet.Hosting.Internal; using Microsoft.AspNet.Http; using Microsoft.AspNet.Testing.xunit; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Xunit; namespace Microsoft.AspNet.TestHost { public class TestClientTests { - private readonly TestServer _server; - - public TestClientTests() - { - _server = new TestServer(new WebApplicationBuilder().Configure(app => app.Run(ctx => Task.FromResult(0)))); - } - [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task GetAsyncWorks() @@ -134,6 +130,8 @@ namespace Microsoft.AspNet.TestHost public async Task WebSocketWorks() { // Arrange + // This logger will attempt to access information from HttpRequest once the HttpContext is createds + var logger = new VerifierLogger(); RequestDelegate appDelegate = async ctx => { if (ctx.WebSockets.IsWebSocketRequest) @@ -156,14 +154,20 @@ namespace Microsoft.AspNet.TestHost } } }; - var builder = new WebApplicationBuilder().Configure(app => - { - app.Run(appDelegate); - }); + var builder = new WebApplicationBuilder() + .ConfigureServices(services => + { + services.AddSingleton>(logger); + }) + .Configure(app => + { + app.Run(appDelegate); + }); var server = new TestServer(builder); // Act var client = server.CreateWebSocketClient(); + // The HttpContext will be created and the logger will make sure that the HttpRequest exists and contains reasonable values var clientSocket = await client.ConnectAsync(new System.Uri("http://localhost"), CancellationToken.None); var hello = Encoding.UTF8.GetBytes("hello"); await clientSocket.SendAsync(new System.ArraySegment(hello), WebSocketMessageType.Text, true, CancellationToken.None); @@ -192,6 +196,24 @@ namespace Microsoft.AspNet.TestHost clientSocket.Dispose(); } + + private class VerifierLogger : ILogger + { + public IDisposable BeginScopeImpl(object state) => new NoopDispoasble(); + + public bool IsEnabled(LogLevel logLevel) => true; + + // This call verifies that fields of HttpRequest are accessed and valid + public void Log(LogLevel logLevel, int eventId, object state, Exception exception, Func formatter) => formatter(state, exception); + + class NoopDispoasble : IDisposable + { + public void Dispose() + { + } + } + } + [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WebSocketDisposalThrowsOnPeer() diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 02a56de542..8d55816777 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -10,7 +10,6 @@ using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting; using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; using Microsoft.AspNet.Http.Features.Internal; using Microsoft.AspNet.Http.Internal; using Microsoft.AspNet.Testing.xunit; From c747ce630d03388714137b918c490e16198a9323 Mon Sep 17 00:00:00 2001 From: John Luo Date: Wed, 13 Jan 2016 10:59:29 -0800 Subject: [PATCH 0974/1838] TestServer should not capture startup errors by default --- .../IWebApplicationBuilder.cs | 3 ++ .../WebApplicationBuilder.cs | 11 ++++++-- src/Microsoft.AspNet.TestHost/TestServer.cs | 5 ++++ .../TestServerTests.cs | 28 +++++++++++++++++++ 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs index e92288a572..d4953e3af4 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Collections.Generic; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Server; using Microsoft.Extensions.Configuration; @@ -13,6 +14,8 @@ namespace Microsoft.AspNet.Hosting { IWebApplication Build(); + IDictionary Settings { get; } + IWebApplicationBuilder UseConfiguration(IConfiguration configuration); IWebApplicationBuilder UseServer(IServerFactory factory); diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs index 236b5c8392..4ec45e9c61 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs @@ -17,7 +17,6 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.PlatformAbstractions; -using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Hosting { @@ -38,7 +37,7 @@ namespace Microsoft.AspNet.Hosting // Only one of these should be set private IServerFactory _serverFactory; - private Dictionary _settings = new Dictionary(StringComparer.OrdinalIgnoreCase); + private IDictionary _settings = new Dictionary(StringComparer.OrdinalIgnoreCase); public WebApplicationBuilder() { @@ -46,6 +45,14 @@ namespace Microsoft.AspNet.Hosting _loggerFactory = new LoggerFactory(); } + public IDictionary Settings + { + get + { + return _settings; + } + } + public IWebApplicationBuilder UseSetting(string key, string value) { _settings[key] = value; diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 6d6d4ef4c9..57a1cefd7c 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -22,6 +22,11 @@ namespace Microsoft.AspNet.TestHost public TestServer(IWebApplicationBuilder builder) { + if (!builder.Settings.ContainsKey(WebApplicationDefaults.CaptureStartupErrorsKey)) + { + builder.UseCaptureStartupErrors(false); + } + var application = builder.UseServer(this).Build(); application.Start(); _appInstance = application; diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 8d55816777..2919f940ba 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -30,6 +30,34 @@ namespace Microsoft.AspNet.TestHost new TestServer(new WebApplicationBuilder().Configure(app => { })); } + + [Fact] + public void DoesNotCaptureStartupErrorsByDefault() + { + var builder = new WebApplicationBuilder() + .Configure(app => + { + throw new InvalidOperationException(); + }); + + Assert.Throws(() => new TestServer(builder)); + } + + + [Fact] + public void CaptureStartupErrorsSettingPreserved() + { + var builder = new WebApplicationBuilder() + .UseCaptureStartupErrors(true) + .Configure(app => + { + throw new InvalidOperationException(); + }); + + // Does not throw + new TestServer(builder); + } + [Fact] public void ApplicationServicesAvailableFromTestServer() { From 3c79b425f1eafea3c177797ae1ed1354c6ee904e Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 13 Jan 2016 13:48:38 -0800 Subject: [PATCH 0975/1838] Use dynamic ports for all deployers --- .../Common/FreePortHelper.cs | 38 +++++++++++++++++++ .../Deployers/ApplicationDeployer.cs | 2 +- .../Deployers/IISDeployer.cs | 29 +++++--------- .../Deployers/IISExpressDeployer.cs | 12 +++--- .../Deployers/SelfHostDeployer.cs | 10 +++-- 5 files changed, 61 insertions(+), 30 deletions(-) create mode 100644 src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs new file mode 100644 index 0000000000..f21ae3d001 --- /dev/null +++ b/src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Net; +using System.Net.Sockets; + +namespace Microsoft.AspNet.Server.Testing.Common +{ + public static class FreePortHelper + { + public static Uri FindFreeUrl(string urlHint) + { + var uriHint = new Uri(urlHint); + var builder = new UriBuilder(uriHint) + { + Port = FindFreePort(uriHint.Port) + }; + return builder.Uri; + } + + public static int FindFreePort(int initialPort) + { + using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) + { + try + { + socket.Bind(new IPEndPoint(IPAddress.Loopback, initialPort)); + } + catch (SocketException) + { + socket.Bind(new IPEndPoint(IPAddress.Loopback, 0)); + } + return ((IPEndPoint)socket.LocalEndPoint).Port; + } + } + } +} diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs index 8901e08f0d..868f3a6e60 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs @@ -93,7 +93,7 @@ namespace Microsoft.AspNet.Server.Testing protected void DnuPublish(string publishRoot = null) { - DeploymentParameters.PublishedApplicationRootPath = Path.Combine(publishRoot ?? Path.GetTempPath(), Guid.NewGuid().ToString()); + DeploymentParameters.PublishedApplicationRootPath = publishRoot ?? Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); var noSource = DeploymentParameters.PublishWithNoSource ? "--no-source" : string.Empty; var command = DeploymentParameters.Command ?? "web"; diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index 7edbea1491..f292252842 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Net; using System.Net.Sockets; using System.Threading; +using Microsoft.AspNet.Server.Testing.Common; using Microsoft.Extensions.Logging; using Microsoft.Web.Administration; @@ -45,10 +46,12 @@ namespace Microsoft.AspNet.Server.Testing // Drop a json file instead of setting environment variable. SetAspEnvironmentWithJson(); + var uri = FreePortHelper.FindFreeUrl(DeploymentParameters.ApplicationBaseUriHint); + lock (_syncObject) { // To prevent modifying the IIS setup concurrently. - _application.Deploy(); + _application.Deploy(uri); } // Warm up time for IIS setup. @@ -60,7 +63,7 @@ namespace Microsoft.AspNet.Server.Testing WebRootLocation = DeploymentParameters.ApplicationPath, DeploymentParameters = DeploymentParameters, // Accomodate the vdir name. - ApplicationBaseUri = new UriBuilder(Uri.UriSchemeHttp, "localhost", _application.Port).Uri.AbsoluteUri + "/", + ApplicationBaseUri = uri.ToString(), HostShutdownToken = _hostShutdownToken.Token }; } @@ -104,20 +107,16 @@ namespace Microsoft.AspNet.Server.Testing { _deploymentParameters = deploymentParameters; _logger = logger; - WebSiteName = CreateTestSiteName(); - Port = FindFreePort(); } - public int Port { get; } - public string WebSiteName { get; } public string WebSiteRootFolder => $"{Environment.GetEnvironmentVariable("SystemDrive")}\\inetpub\\{WebSiteName}"; - public void Deploy() + public void Deploy(Uri uri) { - _serverManager.Sites.Add(WebSiteName, _deploymentParameters.ApplicationPath, Port); + _serverManager.Sites.Add(WebSiteName, _deploymentParameters.ApplicationPath, uri.Port); _serverManager.CommitChanges(); } @@ -136,25 +135,15 @@ namespace Microsoft.AspNet.Server.Testing _serverManager.CommitChanges(); } } - - private static int FindFreePort() - { - using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) - { - socket.Bind(new IPEndPoint(IPAddress.Loopback, 0)); - return ((IPEndPoint)socket.LocalEndPoint).Port; - } - } - private string CreateTestSiteName() { if (!string.IsNullOrEmpty(_deploymentParameters.SiteName)) { - return $"{_deploymentParameters.SiteName}{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + return $"{_deploymentParameters.SiteName}{DateTime.Now.ToString("yyyyMMddHHmmss")}"; } else { - return $"testsite{DateTime.Now.ToString("yyyyMMddHHmmss")}"; + return $"testsite{DateTime.Now.ToString("yyyyMMddHHmmss")}"; } } } diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index d3911ac925..7146908c0c 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; using Microsoft.Extensions.Logging; +using Microsoft.AspNet.Server.Testing.Common; namespace Microsoft.AspNet.Server.Testing { @@ -35,20 +36,21 @@ namespace Microsoft.AspNet.Server.Testing DnuPublish(); } + var uri = FreePortHelper.FindFreeUrl(DeploymentParameters.ApplicationBaseUriHint); // Launch the host process. - var hostExitToken = StartIISExpress(); + var hostExitToken = StartIISExpress(uri); return new DeploymentResult { WebRootLocation = DeploymentParameters.ApplicationPath, DeploymentParameters = DeploymentParameters, // Right now this works only for urls like http://localhost:5001/. Does not work for http://localhost:5001/subpath. - ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint, + ApplicationBaseUri = uri.ToString(), HostShutdownToken = hostExitToken }; } - private CancellationToken StartIISExpress() + private CancellationToken StartIISExpress(Uri uri) { if (!string.IsNullOrWhiteSpace(DeploymentParameters.ApplicationHostConfigTemplateContent)) { @@ -58,7 +60,7 @@ namespace Microsoft.AspNet.Server.Testing DeploymentParameters.ApplicationHostConfigTemplateContent = DeploymentParameters.ApplicationHostConfigTemplateContent .Replace("[ApplicationPhysicalPath]", DeploymentParameters.ApplicationPath) - .Replace("[PORT]", new Uri(DeploymentParameters.ApplicationBaseUriHint).Port.ToString()); + .Replace("[PORT]", uri.Port.ToString()); DeploymentParameters.ApplicationHostConfigLocation = Path.GetTempFileName(); @@ -72,7 +74,7 @@ namespace Microsoft.AspNet.Server.Testing } var parameters = string.IsNullOrWhiteSpace(DeploymentParameters.ApplicationHostConfigLocation) ? - string.Format("/port:{0} /path:\"{1}\" /trace:error", new Uri(DeploymentParameters.ApplicationBaseUriHint).Port, webroot) : + string.Format("/port:{0} /path:\"{1}\" /trace:error", uri.Port, webroot) : string.Format("/site:{0} /config:{1} /trace:error", DeploymentParameters.SiteName, DeploymentParameters.ApplicationHostConfigLocation); var iisExpressPath = GetIISExpressPath(); diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index c018f0dac7..4c502189d7 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -6,6 +6,7 @@ using System.Diagnostics; using System.IO; using System.Threading; using Microsoft.Extensions.Logging; +using Microsoft.AspNet.Server.Testing.Common; namespace Microsoft.AspNet.Server.Testing { @@ -33,19 +34,20 @@ namespace Microsoft.AspNet.Server.Testing DnuPublish(); } + var uri = FreePortHelper.FindFreeUrl(DeploymentParameters.ApplicationBaseUriHint); // Launch the host process. - var hostExitToken = StartSelfHost(); + var hostExitToken = StartSelfHost(uri); return new DeploymentResult { WebRootLocation = DeploymentParameters.ApplicationPath, DeploymentParameters = DeploymentParameters, - ApplicationBaseUri = DeploymentParameters.ApplicationBaseUriHint, + ApplicationBaseUri = uri.ToString(), HostShutdownToken = hostExitToken }; } - private CancellationToken StartSelfHost() + private CancellationToken StartSelfHost(Uri uri) { var commandName = DeploymentParameters.Command; if (string.IsNullOrEmpty(commandName)) @@ -55,7 +57,7 @@ namespace Microsoft.AspNet.Server.Testing var dnxPath = Path.Combine(TargetRuntimeBinPath, DnxCommandName); var dnxArgs = $"-p \"{DeploymentParameters.ApplicationPath}\" {commandName} " + - $"--server.urls {DeploymentParameters.ApplicationBaseUriHint} " + + $"--server.urls {uri} " + $"--server {(DeploymentParameters.ServerType == ServerType.WebListener ? "Microsoft.AspNet.Server.WebListener" : "Microsoft.AspNet.Server.Kestrel")}"; Logger.LogInformation($"Executing {dnxPath} {dnxArgs}"); From 80bc8bbbe1de75ef4ca322504f7c433ab589148b Mon Sep 17 00:00:00 2001 From: Troy Dai Date: Thu, 14 Jan 2016 14:47:15 -0800 Subject: [PATCH 0976/1838] Fix test break caused by null ApplicationBaseUrlHint In addtion to the fix here are the changes to improve the helper: 1. Rename the helper to better represent its function; 2. Add overload to generate free port without hint; 3. Add overload to generate local test url; --- .../{FreePortHelper.cs => TestUriHelper.cs} | 28 ++++++++++++++----- .../Deployers/IISDeployer.cs | 4 +-- .../Deployers/IISExpressDeployer.cs | 2 +- .../Deployers/SelfHostDeployer.cs | 2 +- 4 files changed, 24 insertions(+), 12 deletions(-) rename src/Microsoft.AspNet.Server.Testing/Common/{FreePortHelper.cs => TestUriHelper.cs} (59%) diff --git a/src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs b/src/Microsoft.AspNet.Server.Testing/Common/TestUriHelper.cs similarity index 59% rename from src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs rename to src/Microsoft.AspNet.Server.Testing/Common/TestUriHelper.cs index f21ae3d001..d64101f713 100644 --- a/src/Microsoft.AspNet.Server.Testing/Common/FreePortHelper.cs +++ b/src/Microsoft.AspNet.Server.Testing/Common/TestUriHelper.cs @@ -7,16 +7,29 @@ using System.Net.Sockets; namespace Microsoft.AspNet.Server.Testing.Common { - public static class FreePortHelper + public static class TestUriHelper { - public static Uri FindFreeUrl(string urlHint) + public static Uri BuildTestUri() { - var uriHint = new Uri(urlHint); - var builder = new UriBuilder(uriHint) + return new UriBuilder("http", "localhost", FindFreePort()).Uri; + } + + public static Uri BuildTestUri(string hint) + { + if (string.IsNullOrEmpty(hint)) { - Port = FindFreePort(uriHint.Port) - }; - return builder.Uri; + return BuildTestUri(); + } + else + { + var uriHint = new Uri(hint); + return new UriBuilder(uriHint) { Port = FindFreePort(uriHint.Port) }.Uri; + } + } + + public static int FindFreePort() + { + return FindFreePort(0); } public static int FindFreePort(int initialPort) @@ -31,6 +44,7 @@ namespace Microsoft.AspNet.Server.Testing.Common { socket.Bind(new IPEndPoint(IPAddress.Loopback, 0)); } + return ((IPEndPoint)socket.LocalEndPoint).Port; } } diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs index f292252842..0c167587a5 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs @@ -5,8 +5,6 @@ using System; using System.Linq; -using System.Net; -using System.Net.Sockets; using System.Threading; using Microsoft.AspNet.Server.Testing.Common; using Microsoft.Extensions.Logging; @@ -46,7 +44,7 @@ namespace Microsoft.AspNet.Server.Testing // Drop a json file instead of setting environment variable. SetAspEnvironmentWithJson(); - var uri = FreePortHelper.FindFreeUrl(DeploymentParameters.ApplicationBaseUriHint); + var uri = TestUriHelper.BuildTestUri(); lock (_syncObject) { diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs index 7146908c0c..f7441bf9e0 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs @@ -36,7 +36,7 @@ namespace Microsoft.AspNet.Server.Testing DnuPublish(); } - var uri = FreePortHelper.FindFreeUrl(DeploymentParameters.ApplicationBaseUriHint); + var uri = TestUriHelper.BuildTestUri(DeploymentParameters.ApplicationBaseUriHint); // Launch the host process. var hostExitToken = StartIISExpress(uri); diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs index 4c502189d7..144a9b3a8a 100644 --- a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs +++ b/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs @@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Server.Testing DnuPublish(); } - var uri = FreePortHelper.FindFreeUrl(DeploymentParameters.ApplicationBaseUriHint); + var uri = TestUriHelper.BuildTestUri(DeploymentParameters.ApplicationBaseUriHint); // Launch the host process. var hostExitToken = StartSelfHost(uri); From 8349419c7f360843599efd04d90e9401f60ba901 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 14 Jan 2016 16:41:14 -0800 Subject: [PATCH 0977/1838] Updating build script --- build.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index 7b5e25e3a8..263fb667a8 100755 --- a/build.sh +++ b/build.sh @@ -1,13 +1,5 @@ #!/usr/bin/env bash -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -repoFolder="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - buildFolder=.build koreBuildFolder=$buildFolder/KoreBuild-dotnet @@ -42,7 +34,12 @@ fi if test ! -d $koreBuildFolder; then mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre + chmod +x $koreBuildFolder/build/KoreBuild.sh fi -source $koreBuildFolder/build/KoreBuild.sh +makeFile=makefile.shade +if [ ! -e $makeFile ]; then + makeFile=$koreBuildFolder/build/makefile.shade +fi +./$koreBuildFolder/build/KoreBuild.sh -n $nugetPath -m $makeFile "$@" From 7a44cf4da9aafda0399bd246334ba4363c28910a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 14 Jan 2016 16:41:15 -0800 Subject: [PATCH 0978/1838] Updating build script --- build.sh | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/build.sh b/build.sh index 7b5e25e3a8..263fb667a8 100755 --- a/build.sh +++ b/build.sh @@ -1,13 +1,5 @@ #!/usr/bin/env bash -SOURCE="${BASH_SOURCE[0]}" -while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink - DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located -done -repoFolder="$( cd -P "$( dirname "$SOURCE" )" && pwd )" - buildFolder=.build koreBuildFolder=$buildFolder/KoreBuild-dotnet @@ -42,7 +34,12 @@ fi if test ! -d $koreBuildFolder; then mono $nugetPath install KoreBuild-dotnet -ExcludeVersion -o $buildFolder -nocache -pre + chmod +x $koreBuildFolder/build/KoreBuild.sh fi -source $koreBuildFolder/build/KoreBuild.sh +makeFile=makefile.shade +if [ ! -e $makeFile ]; then + makeFile=$koreBuildFolder/build/makefile.shade +fi +./$koreBuildFolder/build/KoreBuild.sh -n $nugetPath -m $makeFile "$@" From 0673acedc4de48fc86192ffbbb59d2a6b86bc3c3 Mon Sep 17 00:00:00 2001 From: David Fowler Date: Fri, 15 Jan 2016 11:20:57 +0000 Subject: [PATCH 0979/1838] Added overload of Run that triggers shutdown on a cancellation token - Added test - Changed NotifyStopped() after all work has been done --- .../Internal/WebApplication.cs | 2 +- .../WebApplicationBuilderExtensions.cs | 42 +++++++++++++++---- .../WebApplicationTests.cs | 32 +++++++++++++- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs index 74e95c4bc5..066ec19253 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs @@ -233,8 +233,8 @@ namespace Microsoft.AspNet.Hosting.Internal _logger?.Shutdown(); _applicationLifetime.StopApplication(); Server?.Dispose(); - _applicationLifetime.NotifyStopped(); (_applicationServices as IDisposable)?.Dispose(); + _applicationLifetime.NotifyStopped(); } private class Disposable : IDisposable diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs index e4fd487507..abc9da77a3 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Threading; using Microsoft.AspNet.Hosting.Server; using Microsoft.AspNet.Server.Features; using Microsoft.Extensions.Configuration; @@ -105,6 +106,32 @@ namespace Microsoft.AspNet.Hosting /// /// public static void Run(this IWebApplication application) + { + using (var cts = new CancellationTokenSource()) + { + Console.CancelKeyPress += (sender, eventArgs) => + { + cts.Cancel(); + + // Don't terminate the process immediately, wait for the Main thread to exit gracefully. + eventArgs.Cancel = true; + }; + + application.Run(cts.Token, "Application started. Press Ctrl+C to shut down."); + } + } + + /// + /// Runs a web application and block the calling thread until token is triggered or shutdown is triggered + /// + /// + /// The token to trigger shutdown + public static void Run(this IWebApplication application, CancellationToken token) + { + application.Run(token, shutdownMessage: null); + } + + private static void Run(this IWebApplication application, CancellationToken token, string shutdownMessage) { using (application) { @@ -124,15 +151,16 @@ namespace Microsoft.AspNet.Hosting } } - Console.WriteLine("Application started. Press Ctrl+C to shut down."); - - Console.CancelKeyPress += (sender, eventArgs) => + if (!string.IsNullOrEmpty(shutdownMessage)) { - applicationLifetime.StopApplication(); + Console.WriteLine(shutdownMessage); + } - // Don't terminate the process immediately, wait for the Main thread to exit gracefully. - eventArgs.Cancel = true; - }; + token.Register(state => + { + ((IApplicationLifetime)state).StopApplication(); + }, + applicationLifetime); applicationLifetime.ApplicationStopping.WaitHandle.WaitOne(); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs index a83818a9cf..a759535009 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs @@ -6,6 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; +using System.Threading; using System.Threading.Tasks; using Microsoft.AspNet.Builder; using Microsoft.AspNet.Hosting.Fakes; @@ -30,7 +31,8 @@ namespace Microsoft.AspNet.Hosting private IFeatureCollection _featuresSupportedByThisHost = NewFeatureCollection(); private IFeatureCollection _instanceFeaturesSupportedByThisHost; - public IFeatureCollection Features { + public IFeatureCollection Features + { get { var features = new FeatureCollection(); @@ -158,6 +160,34 @@ namespace Microsoft.AspNet.Hosting Assert.Equal(1, _startInstances[0].DisposeCalls); } + [Fact] + public void WebApplicationShutsDownWhenTokenTriggers() + { + var app = CreateBuilder() + .UseServer((IServerFactory)this) + .UseStartup("Microsoft.AspNet.Hosting.Tests") + .Build(); + + var lifetime = app.Services.GetRequiredService(); + + var cts = new CancellationTokenSource(); + + Task.Run(() => app.Run(cts.Token)); + + // Wait on the app to be started + lifetime.ApplicationStarted.WaitHandle.WaitOne(); + + Assert.Equal(1, _startInstances.Count); + Assert.Equal(0, _startInstances[0].DisposeCalls); + + cts.Cancel(); + + // Wait on the app to shutdown + lifetime.ApplicationStopped.WaitHandle.WaitOne(); + + Assert.Equal(1, _startInstances[0].DisposeCalls); + } + [Fact] public void WebApplicationDisposesServiceProvider() { From cad9ea1df7e78c52c99346de17b6fc3c2bc2c67e Mon Sep 17 00:00:00 2001 From: John Luo Date: Sat, 16 Jan 2016 23:11:41 -0800 Subject: [PATCH 0980/1838] Rename WebApplication to WebHost --- .../SampleStartups/StartupBlockingOnStart.cs | 10 +- .../StartupConfigureAddresses.cs | 8 +- .../StartupExternallyControlled.cs | 6 +- samples/SampleStartups/StartupFullControl.cs | 4 +- samples/SampleStartups/StartupHelloWorld.cs | 8 +- .../IHostingEnvironment.cs | 2 +- .../IWebApplicationBuilder.cs | 31 --- .../{IWebApplication.cs => IWebHost.cs} | 6 +- .../IWebHostBuilder.cs | 73 +++++++ ...licationDefaults.cs => WebHostDefaults.cs} | 2 +- ...pplicationService.cs => WebHostService.cs} | 19 +- ....cs => WebHostWindowsServiceExtensions.cs} | 20 +- .../Internal/HostingEnvironmentExtensions.cs | 2 +- .../{WebApplication.cs => WebHost.cs} | 14 +- ...pplicationOptions.cs => WebHostOptions.cs} | 20 +- .../WebApplicationBuilderExtensions.cs | 181 ------------------ ...pplicationBuilder.cs => WebHostBuilder.cs} | 89 +++++++-- .../WebHostBuilderExtensions.cs | 123 ++++++++++++ ...nfiguration.cs => WebHostConfiguration.cs} | 8 +- .../WebHostExtensions.cs | 78 ++++++++ src/Microsoft.AspNet.TestHost/TestServer.cs | 18 +- .../HostingEnvironmentExtensionsTests.cs | 12 +- ...BuilderTests.cs => WebHostBuilderTests.cs} | 90 ++++----- ...Tests.cs => WebHostConfigurationsTests.cs} | 10 +- ...WebApplicationTests.cs => WebHostTests.cs} | 152 +++++++-------- .../ClientHandlerTests.cs | 6 +- .../RequestBuilderTests.cs | 4 +- .../TestClientTests.cs | 24 +-- .../TestServerTests.cs | 44 ++--- 29 files changed, 583 insertions(+), 481 deletions(-) delete mode 100644 src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs rename src/Microsoft.AspNet.Hosting.Abstractions/{IWebApplication.cs => IWebHost.cs} (81%) create mode 100644 src/Microsoft.AspNet.Hosting.Abstractions/IWebHostBuilder.cs rename src/Microsoft.AspNet.Hosting.Abstractions/{WebApplicationDefaults.cs => WebHostDefaults.cs} (95%) rename src/Microsoft.AspNet.Hosting.WindowsServices/{WebApplicationService.cs => WebHostService.cs} (77%) rename src/Microsoft.AspNet.Hosting.WindowsServices/{WebApplicationExtensions.cs => WebHostWindowsServiceExtensions.cs} (56%) rename src/Microsoft.AspNet.Hosting/Internal/{WebApplication.cs => WebHost.cs} (96%) rename src/Microsoft.AspNet.Hosting/Internal/{WebApplicationOptions.cs => WebHostOptions.cs} (59%) delete mode 100644 src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs rename src/Microsoft.AspNet.Hosting/{WebApplicationBuilder.cs => WebHostBuilder.cs} (61%) create mode 100644 src/Microsoft.AspNet.Hosting/WebHostBuilderExtensions.cs rename src/Microsoft.AspNet.Hosting/{WebApplicationConfiguration.cs => WebHostConfiguration.cs} (78%) create mode 100644 src/Microsoft.AspNet.Hosting/WebHostExtensions.cs rename test/Microsoft.AspNet.Hosting.Tests/{WebApplicationBuilderTests.cs => WebHostBuilderTests.cs} (71%) rename test/Microsoft.AspNet.Hosting.Tests/{WebApplicationConfigurationsTests.cs => WebHostConfigurationsTests.cs} (78%) rename test/Microsoft.AspNet.Hosting.Tests/{WebApplicationTests.cs => WebHostTests.cs} (79%) diff --git a/samples/SampleStartups/StartupBlockingOnStart.cs b/samples/SampleStartups/StartupBlockingOnStart.cs index fdbc094d1b..40d914f379 100644 --- a/samples/SampleStartups/StartupBlockingOnStart.cs +++ b/samples/SampleStartups/StartupBlockingOnStart.cs @@ -28,16 +28,14 @@ namespace SampleStartups // Entry point for the application. public static void Main(string[] args) { - var config = WebApplicationConfiguration.GetDefault(args); - - var application = new WebApplicationBuilder() - .UseConfiguration(config) + var host = new WebHostBuilder() + .UseDefaultConfiguration(args) .UseStartup() .Build(); - using (application) + using (host) { - application.Start(); + host.Start(); Console.ReadLine(); } } diff --git a/samples/SampleStartups/StartupConfigureAddresses.cs b/samples/SampleStartups/StartupConfigureAddresses.cs index 00df99135b..31a9a38a43 100644 --- a/samples/SampleStartups/StartupConfigureAddresses.cs +++ b/samples/SampleStartups/StartupConfigureAddresses.cs @@ -27,15 +27,13 @@ namespace SampleStartups // Entry point for the application. public static void Main(string[] args) { - var config = WebApplicationConfiguration.GetDefault(args); - - var application = new WebApplicationBuilder() - .UseConfiguration(config) + var host = new WebHostBuilder() + .UseDefaultConfiguration(args) .UseStartup() .UseUrls("http://localhost:5000", "http://localhost:5001") .Build(); - application.Run(); + host.Run(); } } } diff --git a/samples/SampleStartups/StartupExternallyControlled.cs b/samples/SampleStartups/StartupExternallyControlled.cs index 538e97decd..b024ede322 100644 --- a/samples/SampleStartups/StartupExternallyControlled.cs +++ b/samples/SampleStartups/StartupExternallyControlled.cs @@ -11,7 +11,7 @@ namespace SampleStartups { public class StartupExternallyControlled { - private IWebApplication _application; + private IWebHost _host; private readonly List _urls = new List(); // This method gets called by the runtime. Use this method to add services to the container. @@ -35,14 +35,14 @@ namespace SampleStartups public void Start() { - _application = new WebApplicationBuilder() + _host = new WebHostBuilder() .UseStartup() .Start(_urls.ToArray()); } public void Stop() { - _application.Dispose(); + _host.Dispose(); } public void AddUrl(string url) diff --git a/samples/SampleStartups/StartupFullControl.cs b/samples/SampleStartups/StartupFullControl.cs index 1279bfb1a0..6445a77bc4 100644 --- a/samples/SampleStartups/StartupFullControl.cs +++ b/samples/SampleStartups/StartupFullControl.cs @@ -13,7 +13,7 @@ namespace SampleStartups { public static void Main(string[] args) { - var application = new WebApplicationBuilder() + var host = new WebHostBuilder() .UseServer("Microsoft.AspNet.Server.Kestrel") // Set the server manually .UseApplicationBasePath(Directory.GetCurrentDirectory()) // Override the application base with the current directory .UseUrls("http://*:1000", "https://*:902") @@ -35,7 +35,7 @@ namespace SampleStartups }) .Build(); - application.Run(); + host.Run(); } } diff --git a/samples/SampleStartups/StartupHelloWorld.cs b/samples/SampleStartups/StartupHelloWorld.cs index 4ee08e2f16..7a76ca4563 100644 --- a/samples/SampleStartups/StartupHelloWorld.cs +++ b/samples/SampleStartups/StartupHelloWorld.cs @@ -27,14 +27,12 @@ namespace SampleStartups // Entry point for the application. public static void Main(string[] args) { - var config = WebApplicationConfiguration.GetDefault(args); - - var application = new WebApplicationBuilder() - .UseConfiguration(config) + var host = new WebHostBuilder() + .UseDefaultConfiguration(args) .UseStartup() .Build(); - application.Run(); + host.Run(); } } } diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs index cfc96be02f..6c9ddf464b 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs @@ -16,7 +16,7 @@ namespace Microsoft.AspNet.Hosting /// of the "Hosting:Environment" (on Windows) or "Hosting__Environment" (on Linux & OS X) environment variable. /// // This must be settable! - string EnvironmentName { get; set; } + string EnvironmentName { get; set; } /// /// Gets or sets the absolute path to the directory that contains the web-servable application content files. diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs deleted file mode 100644 index d4953e3af4..0000000000 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplicationBuilder.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.AspNet.Hosting -{ - public interface IWebApplicationBuilder - { - IWebApplication Build(); - - IDictionary Settings { get; } - - IWebApplicationBuilder UseConfiguration(IConfiguration configuration); - - IWebApplicationBuilder UseServer(IServerFactory factory); - - IWebApplicationBuilder UseStartup(Type startupType); - - IWebApplicationBuilder ConfigureServices(Action configureServices); - - IWebApplicationBuilder Configure(Action configureApplication); - - IWebApplicationBuilder UseSetting(string key, string value); - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplication.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IWebHost.cs similarity index 81% rename from src/Microsoft.AspNet.Hosting.Abstractions/IWebApplication.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/IWebHost.cs index cfafc97ee5..45522b6b4c 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IWebApplication.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IWebHost.cs @@ -7,9 +7,9 @@ using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Hosting { /// - /// Represents a configured web application + /// Represents a configured web host /// - public interface IWebApplication : IDisposable + public interface IWebHost : IDisposable { /// /// The exposed by the configured server. @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting IFeatureCollection ServerFeatures { get; } /// - /// The for the application. + /// The for the host. /// IServiceProvider Services { get; } diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebHostBuilder.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IWebHostBuilder.cs new file mode 100644 index 0000000000..60017adb17 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IWebHostBuilder.cs @@ -0,0 +1,73 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Microsoft.AspNet.Builder; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + /// + /// A builder for + /// + public interface IWebHostBuilder + { + /// + /// Builds an which hosts a web application. + /// + IWebHost Build(); + + /// + /// Gets the raw settings to be used by the web host. Values specified here will override + /// the configuration set by . + /// + IDictionary Settings { get; } + + /// + /// Specify the to be used by the web host. If no configuration is + /// provided to the builder, the default configuration will be used. + /// + /// The to be used. + /// The . + IWebHostBuilder UseConfiguration(IConfiguration configuration); + + /// + /// Specify the to be used by the web host. + /// + /// The to be used. + /// The . + IWebHostBuilder UseServer(IServerFactory factory); + + /// + /// Specify the startup type to be used by the web host. + /// + /// The to be used. + /// The . + IWebHostBuilder UseStartup(Type startupType); + + /// + /// Specify the delegate that is used to configure the services of the web application. + /// + /// The delegate that configures the . + /// The . + IWebHostBuilder ConfigureServices(Action configureServices); + + /// + /// Specify the startup method to be used to configure the web application. + /// + /// The delegate that configures the . + /// The . + IWebHostBuilder Configure(Action configureApplication); + + /// + /// Add or replace a setting in . + /// + /// The key of the setting to add or replace. + /// The value of the setting to add or replace. + /// The . + IWebHostBuilder UseSetting(string key, string value); + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs b/src/Microsoft.AspNet.Hosting.Abstractions/WebHostDefaults.cs similarity index 95% rename from src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs rename to src/Microsoft.AspNet.Hosting.Abstractions/WebHostDefaults.cs index 3efa2561ad..c87cff6476 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/WebApplicationDefaults.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/WebHostDefaults.cs @@ -3,7 +3,7 @@ namespace Microsoft.AspNet.Hosting { - public static class WebApplicationDefaults + public static class WebHostDefaults { public static readonly string ApplicationKey = "application"; public static readonly string DetailedErrorsKey = "detailedErrors"; diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebHostService.cs similarity index 77% rename from src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs rename to src/Microsoft.AspNet.Hosting.WindowsServices/WebHostService.cs index 4cecc5705a..590f54cc63 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationService.cs +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebHostService.cs @@ -1,7 +1,6 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.ServiceProcess; using Microsoft.Extensions.DependencyInjection; @@ -10,25 +9,25 @@ namespace Microsoft.AspNet.Hosting.WindowsServices /// /// Provides an implementation of a Windows service that hosts ASP.NET. /// - public class WebApplicationService : ServiceBase + public class WebHostService : ServiceBase { - private IWebApplication _application; + private IWebHost _host; private bool _stopRequestedByWindows; /// - /// Creates an instance of WebApplicationService which hosts the specified web application. + /// Creates an instance of WebHostService which hosts the specified web application. /// - /// The web application to host in the Windows service. - public WebApplicationService(IWebApplication application) + /// The configured web host containing the web application to host in the Windows service. + public WebHostService(IWebHost host) { - _application = application; + _host = host; } protected sealed override void OnStart(string[] args) { OnStarting(args); - _application + _host .Services .GetRequiredService() .ApplicationStopped @@ -40,7 +39,7 @@ namespace Microsoft.AspNet.Hosting.WindowsServices } }); - _application.Start(); + _host.Start(); OnStarted(); } @@ -49,7 +48,7 @@ namespace Microsoft.AspNet.Hosting.WindowsServices { _stopRequestedByWindows = true; OnStopping(); - _application?.Dispose(); + _host?.Dispose(); OnStopped(); } diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs b/src/Microsoft.AspNet.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs similarity index 56% rename from src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs rename to src/Microsoft.AspNet.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs index 41f3e0548f..4034c5976f 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/WebApplicationExtensions.cs +++ b/src/Microsoft.AspNet.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs @@ -6,37 +6,37 @@ using System.ServiceProcess; namespace Microsoft.AspNet.Hosting.WindowsServices { /// - /// Extensions to + /// Extensions to /// - public static class WebApplicationExtensions + public static class WebHostWindowsServiceExtensions { /// /// Runs the specified web application inside a Windows service and blocks until the service is stopped. /// - /// An instance of the to host in the Windows service. + /// An instance of the to host in the Windows service. /// - /// This example shows how to use . + /// This example shows how to use . /// /// public class Program /// { /// public static void Main(string[] args) /// { - /// var config = WebApplicationConfiguration.GetDefault(args); + /// var config = WebHostConfiguration.GetDefault(args); /// - /// var application = new WebApplicationBuilder() + /// var host = new WebHostBuilder() /// .UseConfiguration(config) /// .Build(); /// /// // This call will block until the service is stopped. - /// application.RunAsService(); + /// host.RunAsService(); /// } /// } /// /// - public static void RunAsService(this IWebApplication application) + public static void RunAsService(this IWebHost host) { - var webApplicationService = new WebApplicationService(application); - ServiceBase.Run(webApplicationService); + var webHostService = new WebHostService(host); + ServiceBase.Run(webHostService); } } } diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs index cf4e1303bc..36f8c9bb41 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs @@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Hosting.Internal { public static class HostingEnvironmentExtensions { - public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebApplicationOptions options, IConfiguration configuration) + public static void Initialize(this IHostingEnvironment hostingEnvironment, string applicationBasePath, WebHostOptions options, IConfiguration configuration) { if (options == null) { diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs b/src/Microsoft.AspNet.Hosting/Internal/WebHost.cs similarity index 96% rename from src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs rename to src/Microsoft.AspNet.Hosting/Internal/WebHost.cs index 066ec19253..d68d6604b7 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplication.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebHost.cs @@ -19,17 +19,17 @@ using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting.Internal { - public class WebApplication : IWebApplication + public class WebHost : IWebHost { private readonly IServiceCollection _applicationServiceCollection; private readonly IStartupLoader _startupLoader; private readonly ApplicationLifetime _applicationLifetime; - private readonly WebApplicationOptions _options; + private readonly WebHostOptions _options; private readonly IConfiguration _config; private IServiceProvider _applicationServices; private RequestDelegate _application; - private ILogger _logger; + private ILogger _logger; // Only one of these should be set internal string StartupAssemblyName { get; set; } @@ -41,10 +41,10 @@ namespace Microsoft.AspNet.Hosting.Internal internal string ServerFactoryLocation { get; set; } private IServer Server { get; set; } - public WebApplication( + public WebHost( IServiceCollection appServices, IStartupLoader startupLoader, - WebApplicationOptions options, + WebHostOptions options, IConfiguration config) { if (appServices == null) @@ -99,7 +99,7 @@ namespace Microsoft.AspNet.Hosting.Internal { Initialize(); - _logger = _applicationServices.GetRequiredService>(); + _logger = _applicationServices.GetRequiredService>(); var diagnosticSource = _applicationServices.GetRequiredService(); var httpContextFactory = _applicationServices.GetRequiredService(); @@ -183,7 +183,7 @@ namespace Microsoft.AspNet.Hosting.Internal // Write errors to standard out so they can be retrieved when not in development mode. Console.Out.WriteLine("Application startup exception: " + ex.ToString()); - var logger = _applicationServices.GetRequiredService>(); + var logger = _applicationServices.GetRequiredService>(); logger.ApplicationError(ex); // Generate an HTML error page. diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs b/src/Microsoft.AspNet.Hosting/Internal/WebHostOptions.cs similarity index 59% rename from src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs rename to src/Microsoft.AspNet.Hosting/Internal/WebHostOptions.cs index dd4ef59750..a5e6ffeec3 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/WebApplicationOptions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/WebHostOptions.cs @@ -6,28 +6,28 @@ using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting.Internal { - public class WebApplicationOptions + public class WebHostOptions { private const string OldEnvironmentKey = "ENV"; - public WebApplicationOptions() + public WebHostOptions() { } - public WebApplicationOptions(IConfiguration configuration) + public WebHostOptions(IConfiguration configuration) { if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } - Application = configuration[WebApplicationDefaults.ApplicationKey]; - DetailedErrors = ParseBool(configuration, WebApplicationDefaults.DetailedErrorsKey); - CaptureStartupErrors = ParseBool(configuration, WebApplicationDefaults.CaptureStartupErrorsKey); - Environment = configuration[WebApplicationDefaults.EnvironmentKey] ?? configuration[OldEnvironmentKey]; - ServerFactoryLocation = configuration[WebApplicationDefaults.ServerKey]; - WebRoot = configuration[WebApplicationDefaults.WebRootKey]; - ApplicationBasePath = configuration[WebApplicationDefaults.ApplicationBaseKey]; + Application = configuration[WebHostDefaults.ApplicationKey]; + DetailedErrors = ParseBool(configuration, WebHostDefaults.DetailedErrorsKey); + CaptureStartupErrors = ParseBool(configuration, WebHostDefaults.CaptureStartupErrorsKey); + Environment = configuration[WebHostDefaults.EnvironmentKey] ?? configuration[OldEnvironmentKey]; + ServerFactoryLocation = configuration[WebHostDefaults.ServerKey]; + WebRoot = configuration[WebHostDefaults.WebRootKey]; + ApplicationBasePath = configuration[WebHostDefaults.ApplicationBaseKey]; } public string Application { get; set; } diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs b/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs deleted file mode 100644 index abc9da77a3..0000000000 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilderExtensions.cs +++ /dev/null @@ -1,181 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Server.Features; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; - -namespace Microsoft.AspNet.Hosting -{ - public static class WebApplicationBuilderExtensions - { - private static readonly string ServerUrlsSeparator = ";"; - - public static IWebApplicationBuilder UseCaptureStartupErrors(this IWebApplicationBuilder applicationBuilder, bool captureStartupError) - { - return applicationBuilder.UseSetting(WebApplicationDefaults.CaptureStartupErrorsKey, captureStartupError ? "true" : "false"); - } - - public static IWebApplicationBuilder UseStartup(this IWebApplicationBuilder applicationBuilder) where TStartup : class - { - return applicationBuilder.UseStartup(typeof(TStartup)); - } - - public static IWebApplicationBuilder UseServer(this IWebApplicationBuilder applicationBuilder, string assemblyName) - { - if (assemblyName == null) - { - throw new ArgumentNullException(nameof(assemblyName)); - } - - return applicationBuilder.UseSetting(WebApplicationDefaults.ServerKey, assemblyName); - } - - public static IWebApplicationBuilder UseServer(this IWebApplicationBuilder applicationBuilder, IServer server) - { - if (server == null) - { - throw new ArgumentNullException(nameof(server)); - } - - return applicationBuilder.UseServer(new ServerFactory(server)); - } - - public static IWebApplicationBuilder UseApplicationBasePath(this IWebApplicationBuilder applicationBuilder, string applicationBasePath) - { - if (applicationBasePath == null) - { - throw new ArgumentNullException(nameof(applicationBasePath)); - } - - return applicationBuilder.UseSetting(WebApplicationDefaults.ApplicationBaseKey, applicationBasePath); - } - - public static IWebApplicationBuilder UseEnvironment(this IWebApplicationBuilder applicationBuilder, string environment) - { - if (environment == null) - { - throw new ArgumentNullException(nameof(environment)); - } - - return applicationBuilder.UseSetting(WebApplicationDefaults.EnvironmentKey, environment); - } - - public static IWebApplicationBuilder UseWebRoot(this IWebApplicationBuilder applicationBuilder, string webRoot) - { - if (webRoot == null) - { - throw new ArgumentNullException(nameof(webRoot)); - } - - return applicationBuilder.UseSetting(WebApplicationDefaults.WebRootKey, webRoot); - } - - public static IWebApplicationBuilder UseUrls(this IWebApplicationBuilder applicationBuilder, params string[] urls) - { - if (urls == null) - { - throw new ArgumentNullException(nameof(urls)); - } - - return applicationBuilder.UseSetting(WebApplicationDefaults.ServerUrlsKey, string.Join(ServerUrlsSeparator, urls)); - } - - public static IWebApplicationBuilder UseStartup(this IWebApplicationBuilder applicationBuilder, string startupAssemblyName) - { - if (startupAssemblyName == null) - { - throw new ArgumentNullException(nameof(startupAssemblyName)); - } - - return applicationBuilder.UseSetting(WebApplicationDefaults.ApplicationKey, startupAssemblyName); - } - - public static IWebApplication Start(this IWebApplicationBuilder applicationBuilder, params string[] urls) - { - var application = applicationBuilder.UseUrls(urls).Build(); - application.Start(); - return application; - } - - /// - /// Runs a web application and block the calling thread until host shutdown. - /// - /// - public static void Run(this IWebApplication application) - { - using (var cts = new CancellationTokenSource()) - { - Console.CancelKeyPress += (sender, eventArgs) => - { - cts.Cancel(); - - // Don't terminate the process immediately, wait for the Main thread to exit gracefully. - eventArgs.Cancel = true; - }; - - application.Run(cts.Token, "Application started. Press Ctrl+C to shut down."); - } - } - - /// - /// Runs a web application and block the calling thread until token is triggered or shutdown is triggered - /// - /// - /// The token to trigger shutdown - public static void Run(this IWebApplication application, CancellationToken token) - { - application.Run(token, shutdownMessage: null); - } - - private static void Run(this IWebApplication application, CancellationToken token, string shutdownMessage) - { - using (application) - { - application.Start(); - - var hostingEnvironment = application.Services.GetService(); - var applicationLifetime = application.Services.GetService(); - - Console.WriteLine("Hosting environment: " + hostingEnvironment.EnvironmentName); - - var serverAddresses = application.ServerFeatures.Get()?.Addresses; - if (serverAddresses != null) - { - foreach (var address in serverAddresses) - { - Console.WriteLine("Now listening on: " + address); - } - } - - if (!string.IsNullOrEmpty(shutdownMessage)) - { - Console.WriteLine(shutdownMessage); - } - - token.Register(state => - { - ((IApplicationLifetime)state).StopApplication(); - }, - applicationLifetime); - - applicationLifetime.ApplicationStopping.WaitHandle.WaitOne(); - } - } - - private class ServerFactory : IServerFactory - { - private readonly IServer _server; - - public ServerFactory(IServer server) - { - _server = server; - } - - public IServer CreateServer(IConfiguration configuration) => _server; - } - } -} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs similarity index 61% rename from src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs rename to src/Microsoft.AspNet.Hosting/WebHostBuilder.cs index 4ec45e9c61..0f385a8ac6 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationBuilder.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs @@ -20,13 +20,16 @@ using Microsoft.Extensions.PlatformAbstractions; namespace Microsoft.AspNet.Hosting { - public class WebApplicationBuilder : IWebApplicationBuilder + /// + /// A builder for + /// + public class WebHostBuilder : IWebHostBuilder { private readonly IHostingEnvironment _hostingEnvironment; private readonly ILoggerFactory _loggerFactory; private IConfiguration _config; - private WebApplicationOptions _options; + private WebHostOptions _options; private Action _configureServices; @@ -39,12 +42,16 @@ namespace Microsoft.AspNet.Hosting private IDictionary _settings = new Dictionary(StringComparer.OrdinalIgnoreCase); - public WebApplicationBuilder() + public WebHostBuilder() { _hostingEnvironment = new HostingEnvironment(); _loggerFactory = new LoggerFactory(); } + /// + /// Gets the raw settings to be used by the web host. Values specified here will override + /// the configuration set by . + /// public IDictionary Settings { get @@ -53,19 +60,36 @@ namespace Microsoft.AspNet.Hosting } } - public IWebApplicationBuilder UseSetting(string key, string value) + /// + /// Add or replace a setting in . + /// + /// The key of the setting to add or replace. + /// The value of the setting to add or replace. + /// The . + public IWebHostBuilder UseSetting(string key, string value) { _settings[key] = value; return this; } - public IWebApplicationBuilder UseConfiguration(IConfiguration configuration) + /// + /// Specify the to be used by the web host. If no configuration is + /// provided to the builder, the default configuration will be used. + /// + /// The to be used. + /// The . + public IWebHostBuilder UseConfiguration(IConfiguration configuration) { _config = configuration; return this; } - public IWebApplicationBuilder UseServer(IServerFactory factory) + /// + /// Specify the to be used by the web host. + /// + /// The to be used. + /// The . + public IWebHostBuilder UseServer(IServerFactory factory) { if (factory == null) { @@ -76,7 +100,12 @@ namespace Microsoft.AspNet.Hosting return this; } - public IWebApplicationBuilder UseStartup(Type startupType) + /// + /// Specify the startup type to be used by the web host. + /// + /// The to be used. + /// The . + public IWebHostBuilder UseStartup(Type startupType) { if (startupType == null) { @@ -87,13 +116,23 @@ namespace Microsoft.AspNet.Hosting return this; } - public IWebApplicationBuilder ConfigureServices(Action configureServices) + /// + /// Specify the delegate that is used to configure the services of the web application. + /// + /// The delegate that configures the . + /// The . + public IWebHostBuilder ConfigureServices(Action configureServices) { _configureServices = configureServices; return this; } - public IWebApplicationBuilder Configure(Action configureApp) + /// + /// Specify the startup method to be used to configure the web application. + /// + /// The delegate that configures the . + /// The . + public IWebHostBuilder Configure(Action configureApp) { if (configureApp == null) { @@ -104,13 +143,21 @@ namespace Microsoft.AspNet.Hosting return this; } - public IWebApplicationBuilder ConfigureLogging(Action configureLogging) + /// + /// Configure the provided which will be available as a hosting service. + /// + /// The delegate that configures the . + /// The . + public IWebHostBuilder ConfigureLogging(Action configureLogging) { configureLogging(_loggerFactory); return this; } - public IWebApplication Build() + /// + /// Builds the required services and an which hosts a web application. + /// + public IWebHost Build() { var hostingServices = BuildHostingServices(); @@ -122,26 +169,26 @@ namespace Microsoft.AspNet.Hosting // Initialize the hosting environment _hostingEnvironment.Initialize(appEnvironment.ApplicationBasePath, _options, _config); - var application = new WebApplication(hostingServices, startupLoader, _options, _config); + var host = new WebHost(hostingServices, startupLoader, _options, _config); // Only one of these should be set, but they are used in priority - application.ServerFactory = _serverFactory; - application.ServerFactoryLocation = _options.ServerFactoryLocation; + host.ServerFactory = _serverFactory; + host.ServerFactoryLocation = _options.ServerFactoryLocation; // Only one of these should be set, but they are used in priority - application.Startup = _startup; - application.StartupType = _startupType; - application.StartupAssemblyName = _options.Application; + host.Startup = _startup; + host.StartupType = _startupType; + host.StartupAssemblyName = _options.Application; - application.Initialize(); + host.Initialize(); - return application; + return host; } private IServiceCollection BuildHostingServices() { // Apply the configuration settings - var configuration = _config ?? WebApplicationConfiguration.GetDefault(); + var configuration = _config ?? WebHostConfiguration.GetDefault(); var mergedConfiguration = new ConfigurationBuilder() .Add(new IncludedConfigurationProvider(configuration)) @@ -149,7 +196,7 @@ namespace Microsoft.AspNet.Hosting .Build(); _config = mergedConfiguration; - _options = new WebApplicationOptions(_config); + _options = new WebHostOptions(_config); var services = new ServiceCollection(); services.AddSingleton(_hostingEnvironment); diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilderExtensions.cs b/src/Microsoft.AspNet.Hosting/WebHostBuilderExtensions.cs new file mode 100644 index 0000000000..db10bdd6d1 --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebHostBuilderExtensions.cs @@ -0,0 +1,123 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.AspNet.Hosting.Server; +using Microsoft.Extensions.Configuration; + +namespace Microsoft.AspNet.Hosting +{ + public static class WebHostBuilderExtensions + { + private static readonly string ServerUrlsSeparator = ";"; + + public static IWebHostBuilder UseDefaultConfiguration(this IWebHostBuilder builder) + { + return builder.UseDefaultConfiguration(args: null); + } + + public static IWebHostBuilder UseDefaultConfiguration(this IWebHostBuilder builder, string[] args) + { + return builder.UseConfiguration(WebHostConfiguration.GetDefault(args)); + } + + public static IWebHostBuilder UseCaptureStartupErrors(this IWebHostBuilder hostBuilder, bool captureStartupError) + { + return hostBuilder.UseSetting(WebHostDefaults.CaptureStartupErrorsKey, captureStartupError ? "true" : "false"); + } + + public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder) where TStartup : class + { + return hostBuilder.UseStartup(typeof(TStartup)); + } + + public static IWebHostBuilder UseServer(this IWebHostBuilder hostBuilder, string assemblyName) + { + if (assemblyName == null) + { + throw new ArgumentNullException(nameof(assemblyName)); + } + + return hostBuilder.UseSetting(WebHostDefaults.ServerKey, assemblyName); + } + + public static IWebHostBuilder UseServer(this IWebHostBuilder hostBuilder, IServer server) + { + if (server == null) + { + throw new ArgumentNullException(nameof(server)); + } + + return hostBuilder.UseServer(new ServerFactory(server)); + } + + public static IWebHostBuilder UseApplicationBasePath(this IWebHostBuilder hostBuilder, string applicationBasePath) + { + if (applicationBasePath == null) + { + throw new ArgumentNullException(nameof(applicationBasePath)); + } + + return hostBuilder.UseSetting(WebHostDefaults.ApplicationBaseKey, applicationBasePath); + } + + public static IWebHostBuilder UseEnvironment(this IWebHostBuilder hostBuilder, string environment) + { + if (environment == null) + { + throw new ArgumentNullException(nameof(environment)); + } + + return hostBuilder.UseSetting(WebHostDefaults.EnvironmentKey, environment); + } + + public static IWebHostBuilder UseWebRoot(this IWebHostBuilder hostBuilder, string webRoot) + { + if (webRoot == null) + { + throw new ArgumentNullException(nameof(webRoot)); + } + + return hostBuilder.UseSetting(WebHostDefaults.WebRootKey, webRoot); + } + + public static IWebHostBuilder UseUrls(this IWebHostBuilder hostBuilder, params string[] urls) + { + if (urls == null) + { + throw new ArgumentNullException(nameof(urls)); + } + + return hostBuilder.UseSetting(WebHostDefaults.ServerUrlsKey, string.Join(ServerUrlsSeparator, urls)); + } + + public static IWebHostBuilder UseStartup(this IWebHostBuilder hostBuilder, string startupAssemblyName) + { + if (startupAssemblyName == null) + { + throw new ArgumentNullException(nameof(startupAssemblyName)); + } + + return hostBuilder.UseSetting(WebHostDefaults.ApplicationKey, startupAssemblyName); + } + + public static IWebHost Start(this IWebHostBuilder hostBuilder, params string[] urls) + { + var host = hostBuilder.UseUrls(urls).Build(); + host.Start(); + return host; + } + + private class ServerFactory : IServerFactory + { + private readonly IServer _server; + + public ServerFactory(IServer server) + { + _server = server; + } + + public IServer CreateServer(IConfiguration configuration) => _server; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs b/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs similarity index 78% rename from src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs rename to src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs index e08549b8c8..76d539117a 100644 --- a/src/Microsoft.AspNet.Hosting/WebApplicationConfiguration.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs @@ -6,7 +6,7 @@ using Microsoft.Extensions.Configuration; namespace Microsoft.AspNet.Hosting { - public class WebApplicationConfiguration + public class WebHostConfiguration { public static IConfiguration GetDefault() { @@ -17,16 +17,16 @@ namespace Microsoft.AspNet.Hosting { var defaultSettings = new Dictionary { - { WebApplicationDefaults.CaptureStartupErrorsKey, "true" } + { WebHostDefaults.CaptureStartupErrorsKey, "true" } }; // We are adding all environment variables first and then adding the ASPNET_ ones // with the prefix removed to unify with the command line and config file formats var configBuilder = new ConfigurationBuilder() .AddInMemoryCollection(defaultSettings) - .AddJsonFile(WebApplicationDefaults.HostingJsonFile, optional: true) + .AddJsonFile(WebHostDefaults.HostingJsonFile, optional: true) .AddEnvironmentVariables() - .AddEnvironmentVariables(prefix: WebApplicationDefaults.EnvironmentVariablesPrefix); + .AddEnvironmentVariables(prefix: WebHostDefaults.EnvironmentVariablesPrefix); if (args != null) { diff --git a/src/Microsoft.AspNet.Hosting/WebHostExtensions.cs b/src/Microsoft.AspNet.Hosting/WebHostExtensions.cs new file mode 100644 index 0000000000..0e2f6480fe --- /dev/null +++ b/src/Microsoft.AspNet.Hosting/WebHostExtensions.cs @@ -0,0 +1,78 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Threading; +using Microsoft.AspNet.Server.Features; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNet.Hosting +{ + public static class WebHostExtensions + { + /// + /// Runs a web application and block the calling thread until host shutdown. + /// + /// + public static void Run(this IWebHost host) + { + using (var cts = new CancellationTokenSource()) + { + Console.CancelKeyPress += (sender, eventArgs) => + { + cts.Cancel(); + + // Don't terminate the process immediately, wait for the Main thread to exit gracefully. + eventArgs.Cancel = true; + }; + + host.Run(cts.Token, "Application started. Press Ctrl+C to shut down."); + } + } + + /// + /// Runs a web application and block the calling thread until token is triggered or shutdown is triggered + /// + /// + /// The token to trigger shutdown + public static void Run(this IWebHost host, CancellationToken token) + { + host.Run(token, shutdownMessage: null); + } + + private static void Run(this IWebHost host, CancellationToken token, string shutdownMessage) + { + using (host) + { + host.Start(); + + var hostingEnvironment = host.Services.GetService(); + var applicationLifetime = host.Services.GetService(); + + Console.WriteLine("Hosting environment: " + hostingEnvironment.EnvironmentName); + + var serverAddresses = host.ServerFeatures.Get()?.Addresses; + if (serverAddresses != null) + { + foreach (var address in serverAddresses) + { + Console.WriteLine("Now listening on: " + address); + } + } + + if (!string.IsNullOrEmpty(shutdownMessage)) + { + Console.WriteLine(shutdownMessage); + } + + token.Register(state => + { + ((IApplicationLifetime)state).StopApplication(); + }, + applicationLifetime); + + applicationLifetime.ApplicationStopping.WaitHandle.WaitOne(); + } + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNet.TestHost/TestServer.cs index 57a1cefd7c..1e85bf96cb 100644 --- a/src/Microsoft.AspNet.TestHost/TestServer.cs +++ b/src/Microsoft.AspNet.TestHost/TestServer.cs @@ -16,29 +16,29 @@ namespace Microsoft.AspNet.TestHost { private const string DefaultEnvironmentName = "Development"; private const string ServerName = nameof(TestServer); - private IWebApplication _appInstance; + private IWebHost _hostInstance; private bool _disposed = false; private IHttpApplication _application; - public TestServer(IWebApplicationBuilder builder) + public TestServer(IWebHostBuilder builder) { - if (!builder.Settings.ContainsKey(WebApplicationDefaults.CaptureStartupErrorsKey)) + if (!builder.Settings.ContainsKey(WebHostDefaults.CaptureStartupErrorsKey)) { builder.UseCaptureStartupErrors(false); } - var application = builder.UseServer(this).Build(); - application.Start(); - _appInstance = application; + var host = builder.UseServer(this).Build(); + host.Start(); + _hostInstance = host; } public Uri BaseAddress { get; set; } = new Uri("http://localhost/"); - public IWebApplication Application + public IWebHost Host { get { - return _appInstance; + return _hostInstance; } } @@ -76,7 +76,7 @@ namespace Microsoft.AspNet.TestHost if (!_disposed) { _disposed = true; - _appInstance.Dispose(); + _hostInstance.Dispose(); } } diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs index dd60adc4b5..60a413acf5 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs @@ -17,7 +17,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize(".", new WebApplicationOptions() {WebRoot = "testroot"}, null); + env.Initialize(".", new WebHostOptions() {WebRoot = "testroot"}, null); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.IsAssignableFrom(env.WebRootFileProvider); @@ -28,7 +28,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize("testroot", new WebApplicationOptions(), null); + env.Initialize("testroot", new WebHostOptions(), null); Assert.Equal(Path.GetFullPath(Path.Combine("testroot","wwwroot")), env.WebRootPath); Assert.IsAssignableFrom(env.WebRootFileProvider); @@ -39,7 +39,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize(Path.Combine("testroot", "wwwroot"), new WebApplicationOptions(), null); + env.Initialize(Path.Combine("testroot", "wwwroot"), new WebHostOptions(), null); Assert.Null(env.WebRootPath); Assert.IsAssignableFrom(env.WebRootFileProvider); @@ -51,7 +51,7 @@ namespace Microsoft.AspNet.Hosting.Tests var config = new ConfigurationBuilder().Build(); var env = new HostingEnvironment(); - env.Initialize(".", new WebApplicationOptions(), config); + env.Initialize(".", new WebHostOptions(), config); Assert.Same(config, env.Configuration); } @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.Hosting.Tests var env = new HostingEnvironment(); env.EnvironmentName = "SomeName"; - env.Initialize(".", new WebApplicationOptions() { Environment = "NewName" }, null); + env.Initialize(".", new WebHostOptions() { Environment = "NewName" }, null); Assert.Equal("NewName", env.EnvironmentName); } @@ -72,7 +72,7 @@ namespace Microsoft.AspNet.Hosting.Tests { var env = new HostingEnvironment(); - env.Initialize(".", new WebApplicationOptions(), null); + env.Initialize(".", new WebHostOptions(), null); Assert.Throws(() => env.MapPath("file.txt")); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs similarity index 71% rename from test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs rename to test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs index d316a3b460..01c5346c66 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationBuilderTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs @@ -18,27 +18,27 @@ using Xunit; namespace Microsoft.AspNet.Hosting { - public class WebApplicationBuilderTests + public class WebHostBuilderTests { [Fact] public void Build_honors_UseStartup_with_string() { - var builder = CreateWebApplicationBuilder().UseServer(new TestServer()); + var builder = CreateWebHostBuilder().UseServer(new TestServer()); - var application = (WebApplication)builder.UseStartup("MyStartupAssembly").Build(); + var host = (WebHost)builder.UseStartup("MyStartupAssembly").Build(); - Assert.Equal("MyStartupAssembly", application.StartupAssemblyName); + Assert.Equal("MyStartupAssembly", host.StartupAssemblyName); } [Fact] public async Task StartupMissing_Fallback() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup("MissingStartupAssembly").Build(); - using (application) + var host = builder.UseServer(server).UseStartup("MissingStartupAssembly").Build(); + using (host) { - application.Start(); + host.Start(); await AssertResponseContains(server.RequestDelegate, "MissingStartupAssembly"); } } @@ -46,12 +46,12 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupStaticCtorThrows_Fallback() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup().Build(); - using (application) + var host = builder.UseServer(server).UseStartup().Build(); + using (host) { - application.Start(); + host.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from static constructor"); } } @@ -59,12 +59,12 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupCtorThrows_Fallback() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup().Build(); - using (application) + var host = builder.UseServer(server).UseStartup().Build(); + using (host) { - application.Start(); + host.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } } @@ -72,12 +72,12 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupCtorThrows_TypeLoadException() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup().Build(); - using (application) + var host = builder.UseServer(server).UseStartup().Build(); + using (host) { - application.Start(); + host.Start(); await AssertResponseContains(server.RequestDelegate, "Message from the LoaderException"); } } @@ -85,13 +85,13 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task IApplicationLifetimeRegisteredEvenWhenStartupCtorThrows_Fallback() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup().Build(); - using (application) + var host = builder.UseServer(server).UseStartup().Build(); + using (host) { - application.Start(); - var service = application.Services.GetServices(); + host.Start(); + var service = host.Services.GetServices(); Assert.NotNull(service); await AssertResponseContains(server.RequestDelegate, "Exception from constructor"); } @@ -100,12 +100,12 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupConfigureServicesThrows_Fallback() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup().Build(); - using (application) + var host = builder.UseServer(server).UseStartup().Build(); + using (host) { - application.Start(); + host.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from ConfigureServices"); } } @@ -113,12 +113,12 @@ namespace Microsoft.AspNet.Hosting [Fact] public async Task StartupConfigureThrows_Fallback() { - var builder = CreateWebApplicationBuilder(); + var builder = CreateWebHostBuilder(); var server = new TestServer(); - var application = builder.UseServer(server).UseStartup().Build(); - using (application) + var host = builder.UseServer(server).UseStartup().Build(); + using (host) { - application.Start(); + host.Start(); await AssertResponseContains(server.RequestDelegate, "Exception from Configure"); } } @@ -126,23 +126,23 @@ namespace Microsoft.AspNet.Hosting [Fact] public void CaptureStartupErrorsByDefault() { - var applicationBuilder = new WebApplicationBuilder() + var hostBuilder = new WebHostBuilder() .UseServer(new TestServer()) .UseStartup(); // This should not throw - applicationBuilder.Build(); + hostBuilder.Build(); } [Fact] public void UseCaptureStartupErrorsHonored() { - var applicationBuilder = new WebApplicationBuilder() + var hostBuilder = new WebHostBuilder() .UseCaptureStartupErrors(false) .UseServer(new TestServer()) .UseStartup(); - var exception = Assert.Throws(() => applicationBuilder.Build()); + var exception = Assert.Throws(() => hostBuilder.Build()); Assert.Equal("A public method named 'ConfigureProduction' or 'Configure' could not be found in the 'Microsoft.AspNet.Hosting.Fakes.StartupBoom' type.", exception.Message); } @@ -158,14 +158,14 @@ namespace Microsoft.AspNet.Hosting var config = builder.Build(); var expected = "MY_TEST_ENVIRONMENT"; - var application = new WebApplicationBuilder() + var host = new WebHostBuilder() .UseConfiguration(config) .UseEnvironment(expected) .UseServer(new TestServer()) .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build(); - Assert.Equal(expected, application.Services.GetService().EnvironmentName); + Assert.Equal(expected, host.Services.GetService().EnvironmentName); } [Fact] @@ -180,14 +180,14 @@ namespace Microsoft.AspNet.Hosting var config = builder.Build(); var expected = "MY_TEST_ENVIRONMENT"; - var application = new WebApplicationBuilder() + var host = new WebHostBuilder() .UseConfiguration(config) .UseEnvironment(expected) .UseServer(new TestServer()) .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build(); - application.Dispose(); + host.Dispose(); } [Fact] @@ -201,17 +201,17 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = new WebApplicationBuilder() + var host = new WebHostBuilder() .UseConfiguration(config) .UseApplicationBasePath("/foo/bar") .UseServer(new TestServer()) .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build(); - Assert.Equal("/foo/bar", application.Services.GetService().ApplicationBasePath); + Assert.Equal("/foo/bar", host.Services.GetService().ApplicationBasePath); } - private IWebApplicationBuilder CreateWebApplicationBuilder() + private IWebHostBuilder CreateWebHostBuilder() { var vals = new Dictionary { @@ -221,7 +221,7 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - return new WebApplicationBuilder().UseConfiguration(config); + return new WebHostBuilder().UseConfiguration(config); } private async Task AssertResponseContains(RequestDelegate app, string expectedText) diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs similarity index 78% rename from test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs rename to test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs index 8c27409f1c..b88eb51dc9 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationConfigurationsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs @@ -8,12 +8,12 @@ using Xunit; namespace Microsoft.AspNet.Hosting.Tests { - public class WebApplicationConfigurationTests + public class WebHostConfigurationTests { [Fact] public void DefaultCapturesStartupErrors() { - var config = new WebApplicationOptions(WebApplicationConfiguration.GetDefault()); + var config = new WebHostOptions(WebHostConfiguration.GetDefault()); Assert.True(config.CaptureStartupErrors); } @@ -31,7 +31,7 @@ namespace Microsoft.AspNet.Hosting.Tests { "captureStartupErrors", "true" } }; - var config = new WebApplicationOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); Assert.Equal("wwwroot", config.WebRoot); Assert.Equal("Microsoft.AspNet.Server.Kestrel", config.ServerFactoryLocation); @@ -45,7 +45,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void ReadsOldEnvKey() { var parameters = new Dictionary() { { "ENV", "Development" } }; - var config = new WebApplicationOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); Assert.Equal("Development", config.Environment); } @@ -56,7 +56,7 @@ namespace Microsoft.AspNet.Hosting.Tests public void AllowsNumberForDetailedErrors(string value, bool expected) { var parameters = new Dictionary() { { "detailedErrors", value } }; - var config = new WebApplicationOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); + var config = new WebHostOptions(new ConfigurationBuilder().AddInMemoryCollection(parameters).Build()); Assert.Equal(expected, config.DetailedErrors); } diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs b/test/Microsoft.AspNet.Hosting.Tests/WebHostTests.cs similarity index 79% rename from test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs rename to test/Microsoft.AspNet.Hosting.Tests/WebHostTests.cs index a759535009..1526192d94 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/WebApplicationTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/WebHostTests.cs @@ -25,7 +25,7 @@ using Xunit; namespace Microsoft.AspNet.Hosting { - public class WebApplicationTests : IServerFactory, IServer + public class WebHostTests : IServerFactory, IServer { private readonly IList _startInstances = new List(); private IFeatureCollection _featuresSupportedByThisHost = NewFeatureCollection(); @@ -64,7 +64,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void WebApplicationThrowsWithNoServer() + public void WebHostThrowsWithNoServer() { var ex = Assert.Throws(() => CreateBuilder().Build().Start()); Assert.True(ex.Message.Contains("UseServer()")); @@ -87,9 +87,9 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).Build(); - application.Start(); - Assert.NotNull(application.Services.GetService()); + var host = CreateBuilder(config).Build(); + host.Start(); + Assert.NotNull(host.Services.GetService()); } [Fact] @@ -103,9 +103,9 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).Build(); - application.Start(); - Assert.NotNull(application.Services.GetService()); + var host = CreateBuilder(config).Build(); + host.Start(); + Assert.NotNull(host.Services.GetService()); } [Fact] @@ -119,10 +119,10 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).Build(); - application.Start(); - Assert.NotNull(application.Services.GetService()); - Assert.Equal("http://localhost:5000", application.ServerFeatures.Get().Addresses.First()); + var host = CreateBuilder(config).Build(); + host.Start(); + Assert.NotNull(host.Services.GetService()); + Assert.Equal("http://localhost:5000", host.ServerFeatures.Get().Addresses.First()); } [Fact] @@ -136,45 +136,45 @@ namespace Microsoft.AspNet.Hosting var builder = new ConfigurationBuilder() .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).Build(); - application.Start(); - var hostingEnvironment = application.Services.GetService(); + var host = CreateBuilder(config).Build(); + host.Start(); + var hostingEnvironment = host.Services.GetService(); Assert.NotNull(hostingEnvironment.Configuration); Assert.Equal("Microsoft.AspNet.Hosting.Tests", hostingEnvironment.Configuration["Server"]); } [Fact] - public void WebApplicationCanBeStarted() + public void WebHostCanBeStarted() { - var app = CreateBuilder() + var host = CreateBuilder() .UseServer((IServerFactory)this) .UseStartup("Microsoft.AspNet.Hosting.Tests") .Start(); - Assert.NotNull(app); + Assert.NotNull(host); Assert.Equal(1, _startInstances.Count); Assert.Equal(0, _startInstances[0].DisposeCalls); - app.Dispose(); + host.Dispose(); Assert.Equal(1, _startInstances[0].DisposeCalls); } [Fact] - public void WebApplicationShutsDownWhenTokenTriggers() + public void WebHostShutsDownWhenTokenTriggers() { - var app = CreateBuilder() + var host = CreateBuilder() .UseServer((IServerFactory)this) .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build(); - var lifetime = app.Services.GetRequiredService(); + var lifetime = host.Services.GetRequiredService(); var cts = new CancellationTokenSource(); - Task.Run(() => app.Run(cts.Token)); + Task.Run(() => host.Run(cts.Token)); - // Wait on the app to be started + // Wait on the host to be started lifetime.ApplicationStarted.WaitHandle.WaitOne(); Assert.Equal(1, _startInstances.Count); @@ -182,16 +182,16 @@ namespace Microsoft.AspNet.Hosting cts.Cancel(); - // Wait on the app to shutdown + // Wait on the host to shutdown lifetime.ApplicationStopped.WaitHandle.WaitOne(); Assert.Equal(1, _startInstances[0].DisposeCalls); } [Fact] - public void WebApplicationDisposesServiceProvider() + public void WebHostDisposesServiceProvider() { - var application = CreateBuilder() + var host = CreateBuilder() .UseServer((IServerFactory)this) .ConfigureServices(s => { @@ -201,49 +201,49 @@ namespace Microsoft.AspNet.Hosting .UseStartup("Microsoft.AspNet.Hosting.Tests") .Build(); - application.Start(); + host.Start(); - var singleton = (FakeService)application.Services.GetService(); - var transient = (FakeService)application.Services.GetService(); + var singleton = (FakeService)host.Services.GetService(); + var transient = (FakeService)host.Services.GetService(); Assert.False(singleton.Disposed); Assert.False(transient.Disposed); - application.Dispose(); + host.Dispose(); Assert.True(singleton.Disposed); Assert.True(transient.Disposed); } [Fact] - public void WebApplicationNotifiesApplicationStarted() + public void WebHostNotifiesApplicationStarted() { - var application = CreateBuilder() + var host = CreateBuilder() .UseServer((IServerFactory)this) .Build(); - var applicationLifetime = application.Services.GetService(); + var applicationLifetime = host.Services.GetService(); Assert.False(applicationLifetime.ApplicationStarted.IsCancellationRequested); - using (application) + using (host) { - application.Start(); + host.Start(); Assert.True(applicationLifetime.ApplicationStarted.IsCancellationRequested); } } [Fact] - public void WebApplicationInjectsHostingEnvironment() + public void WebHostInjectsHostingEnvironment() { - var application = CreateBuilder() + var host = CreateBuilder() .UseServer((IServerFactory)this) .UseStartup("Microsoft.AspNet.Hosting.Tests") .UseEnvironment("WithHostingEnvironment") .Build(); - using (application) + using (host) { - application.Start(); - var env = application.Services.GetService(); + host.Start(); + var env = host.Services.GetService(); Assert.Equal("Changed", env.EnvironmentName); } } @@ -265,15 +265,15 @@ namespace Microsoft.AspNet.Hosting [Fact] public void CanCreateApplicationServicesWithAddedServices() { - var application = CreateBuilder().UseServer((IServerFactory)this).ConfigureServices(services => services.AddOptions()).Build(); - Assert.NotNull(application.Services.GetRequiredService>()); + var host = CreateBuilder().UseServer((IServerFactory)this).ConfigureServices(services => services.AddOptions()).Build(); + Assert.NotNull(host.Services.GetRequiredService>()); } [Fact] public void EnvDefaultsToProductionIfNoConfig() { - var application = CreateBuilder().UseServer((IServerFactory)this).Build(); - var env = application.Services.GetService(); + var host = CreateBuilder().UseServer((IServerFactory)this).Build(); + var env = host.Services.GetService(); Assert.Equal(EnvironmentName.Production, env.EnvironmentName); } @@ -282,7 +282,7 @@ namespace Microsoft.AspNet.Hosting { var vals = new Dictionary { - // Old key is actualy ASPNET_ENV but WebApplicationConfiguration expects environment + // Old key is actualy ASPNET_ENV but WebHostConfiguration expects environment // variable names stripped from ASPNET_ prefix so using just ENV here { "ENV", "Staging" } }; @@ -291,8 +291,8 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).UseServer((IServerFactory)this).Build(); - var env = application.Services.GetService(); + var host = CreateBuilder(config).UseServer((IServerFactory)this).Build(); + var env = host.Services.GetService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -308,8 +308,8 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).UseServer((IServerFactory)this).Build(); - var env = application.Services.GetService(); + var host = CreateBuilder(config).UseServer((IServerFactory)this).Build(); + var env = host.Services.GetService(); Assert.Equal("Staging", env.EnvironmentName); } @@ -325,8 +325,8 @@ namespace Microsoft.AspNet.Hosting .AddInMemoryCollection(vals); var config = builder.Build(); - var application = CreateBuilder(config).UseServer((IServerFactory)this).Build(); - var env = application.Services.GetService(); + var host = CreateBuilder(config).UseServer((IServerFactory)this).Build(); + var env = host.Services.GetService(); Assert.Equal(Path.GetFullPath("testroot"), env.WebRootPath); Assert.True(env.WebRootFileProvider.GetFileInfo("TextFile.txt").Exists); } @@ -334,11 +334,11 @@ namespace Microsoft.AspNet.Hosting [Fact] public void IsEnvironment_Extension_Is_Case_Insensitive() { - var application = CreateBuilder().UseServer((IServerFactory)this).Build(); - using (application) + var host = CreateBuilder().UseServer((IServerFactory)this).Build(); + using (host) { - application.Start(); - var env = application.Services.GetRequiredService(); + host.Start(); + var env = host.Services.GetRequiredService(); Assert.True(env.IsEnvironment(EnvironmentName.Production)); Assert.True(env.IsEnvironment("producTion")); } @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void WebApplication_CreatesDefaultRequestIdentifierFeature_IfNotPresent() + public void WebHost_CreatesDefaultRequestIdentifierFeature_IfNotPresent() { // Arrange HttpContext httpContext = null; @@ -375,10 +375,10 @@ namespace Microsoft.AspNet.Hosting httpContext = innerHttpContext; return Task.FromResult(0); }); - var application = CreateApplication(requestDelegate); + var host = CreateHost(requestDelegate); // Act - application.Start(); + host.Start(); // Assert Assert.NotNull(httpContext); @@ -388,7 +388,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void WebApplication_DoesNot_CreateDefaultRequestIdentifierFeature_IfPresent() + public void WebHost_DoesNot_CreateDefaultRequestIdentifierFeature_IfPresent() { // Arrange HttpContext httpContext = null; @@ -399,10 +399,10 @@ namespace Microsoft.AspNet.Hosting }); var requestIdentifierFeature = new StubHttpRequestIdentifierFeature(); _featuresSupportedByThisHost[typeof(IHttpRequestIdentifierFeature)] = requestIdentifierFeature; - var application = CreateApplication(requestDelegate); + var host = CreateHost(requestDelegate); // Act - application.Start(); + host.Start(); // Assert Assert.NotNull(httpContext); @@ -410,17 +410,17 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void WebApplication_InvokesConfigureMethodsOnlyOnce() + public void WebHost_InvokesConfigureMethodsOnlyOnce() { - var application = CreateBuilder() + var host = CreateBuilder() .UseServer((IServerFactory)this) .UseStartup() .Build(); - using (application) + using (host) { - application.Start(); - var services = application.Services; - var services2 = application.Services; + host.Start(); + var services = host.Services; + var services2 = host.Services; Assert.Equal(1, CountStartup.ConfigureCount); Assert.Equal(1, CountStartup.ConfigureServicesCount); } @@ -443,7 +443,7 @@ namespace Microsoft.AspNet.Hosting } [Fact] - public void WebApplication_ThrowsForBadConfigureServiceSignature() + public void WebHost_ThrowsForBadConfigureServiceSignature() { var builder = CreateBuilder() .UseServer((IServerFactory)this) @@ -459,7 +459,7 @@ namespace Microsoft.AspNet.Hosting public void Configure(IApplicationBuilder app) { } } - private IWebApplication CreateApplication(RequestDelegate requestDelegate) + private IWebHost CreateHost(RequestDelegate requestDelegate) { var builder = CreateBuilder() .UseServer((IServerFactory)this) @@ -474,12 +474,12 @@ namespace Microsoft.AspNet.Hosting private void RunMapPath(string virtualPath, string expectedSuffix) { - var application = CreateBuilder().UseServer((IServerFactory)this).Build(); + var host = CreateBuilder().UseServer((IServerFactory)this).Build(); - using (application) + using (host) { - application.Start(); - var env = application.Services.GetRequiredService(); + host.Start(); + var env = host.Services.GetRequiredService(); // MapPath requires webroot to be set, we don't care // about file provider so just set it here env.WebRootPath = "."; @@ -489,9 +489,9 @@ namespace Microsoft.AspNet.Hosting } } - private IWebApplicationBuilder CreateBuilder(IConfiguration config = null) + private IWebHostBuilder CreateBuilder(IConfiguration config = null) { - return new WebApplicationBuilder().UseConfiguration(config ?? new ConfigurationBuilder().Build()).UseStartup("Microsoft.AspNet.Hosting.Tests"); + return new WebHostBuilder().UseConfiguration(config ?? new ConfigurationBuilder().Build()).UseStartup("Microsoft.AspNet.Hosting.Tests"); } public void Start(IHttpApplication application) diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs index b439df01bd..06b570afb3 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs @@ -283,10 +283,10 @@ namespace Microsoft.AspNet.TestHost { // This logger will attempt to access information from HttpRequest once the HttpContext is created var logger = new VerifierLogger(); - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddSingleton>(logger); + services.AddSingleton>(logger); }) .Configure(app => { @@ -301,7 +301,7 @@ namespace Microsoft.AspNet.TestHost var result = await server.CreateClient().GetStringAsync("/"); } - private class VerifierLogger : ILogger + private class VerifierLogger : ILogger { public IDisposable BeginScopeImpl(object state) => new NoopDispoasble(); diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs index a47cf1f00c..77b2e6e9b2 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs @@ -14,7 +14,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono)] public void AddRequestHeader() { - var builder = new WebApplicationBuilder().Configure(app => { }); + var builder = new WebHostBuilder().Configure(app => { }); var server = new TestServer(builder); server.CreateRequest("/") .AddHeader("Host", "MyHost:90") @@ -27,7 +27,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public void AddContentHeaders() { - var builder = new WebApplicationBuilder().Configure(app => { }); + var builder = new WebHostBuilder().Configure(app => { }); var server = new TestServer(builder); server.CreateRequest("/") .AddHeader("Content-Type", "Test/Value") diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs index 42a1a7752f..4312836514 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs @@ -30,7 +30,7 @@ namespace Microsoft.AspNet.TestHost var expected = "GET Response"; RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(expected); - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); @@ -53,7 +53,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); @@ -76,7 +76,7 @@ namespace Microsoft.AspNet.TestHost Assert.Equal("/", ctx.Request.Path.Value); return ctx.Response.WriteAsync(expected); }; - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); @@ -94,7 +94,7 @@ namespace Microsoft.AspNet.TestHost // Arrange RequestDelegate appDelegate = ctx => ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " PUT Response"); - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); @@ -113,7 +113,7 @@ namespace Microsoft.AspNet.TestHost // Arrange RequestDelegate appDelegate = async ctx => await ctx.Response.WriteAsync(new StreamReader(ctx.Request.Body).ReadToEnd() + " POST Response"); - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); @@ -154,10 +154,10 @@ namespace Microsoft.AspNet.TestHost } } }; - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .ConfigureServices(services => { - services.AddSingleton>(logger); + services.AddSingleton>(logger); }) .Configure(app => { @@ -197,7 +197,7 @@ namespace Microsoft.AspNet.TestHost } - private class VerifierLogger : ILogger + private class VerifierLogger : ILogger { public IDisposable BeginScopeImpl(object state) => new NoopDispoasble(); @@ -227,7 +227,7 @@ namespace Microsoft.AspNet.TestHost websocket.Dispose(); } }; - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(appDelegate); }); @@ -261,7 +261,7 @@ namespace Microsoft.AspNet.TestHost } } }; - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(appDelegate); }); @@ -310,7 +310,7 @@ namespace Microsoft.AspNet.TestHost }; // Act - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost:12345"); @@ -342,7 +342,7 @@ namespace Microsoft.AspNet.TestHost }; // Act - var builder = new WebApplicationBuilder().Configure(app => app.Run(appDelegate)); + var builder = new WebHostBuilder().Configure(app => app.Run(appDelegate)); var server = new TestServer(builder); var client = server.CreateClient(); var cts = new CancellationTokenSource(); diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs index 2919f940ba..d544e1bf14 100644 --- a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs +++ b/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs @@ -27,14 +27,14 @@ namespace Microsoft.AspNet.TestHost { // Arrange // Act & Assert (Does not throw) - new TestServer(new WebApplicationBuilder().Configure(app => { })); + new TestServer(new WebHostBuilder().Configure(app => { })); } [Fact] public void DoesNotCaptureStartupErrorsByDefault() { - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .Configure(app => { throw new InvalidOperationException(); @@ -47,7 +47,7 @@ namespace Microsoft.AspNet.TestHost [Fact] public void CaptureStartupErrorsSettingPreserved() { - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .UseCaptureStartupErrors(true) .Configure(app => { @@ -62,7 +62,7 @@ namespace Microsoft.AspNet.TestHost public void ApplicationServicesAvailableFromTestServer() { var testService = new TestService(); - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .Configure(app => { }) .ConfigureServices(services => { @@ -70,14 +70,14 @@ namespace Microsoft.AspNet.TestHost }); var server = new TestServer(builder); - Assert.Equal(testService, server.Application.Services.GetRequiredService()); + Assert.Equal(testService, server.Host.Services.GetRequiredService()); } [ConditionalFact] [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task RequestServicesAutoCreated() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -114,7 +114,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CustomServiceProviderSetsApplicationServices() { - var builder = new WebApplicationBuilder().UseStartup(); + var builder = new WebHostBuilder().UseStartup(); var server = new TestServer(builder); string result = await server.CreateClient().GetStringAsync("/path"); Assert.Equal("ApplicationServicesEqual:True", result); @@ -157,7 +157,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task ExistingRequestServicesWillNotBeReplaced() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -179,7 +179,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanSetCustomServiceProvider() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -229,7 +229,7 @@ namespace Microsoft.AspNet.TestHost public async Task ExistingServiceProviderFeatureWillNotBeReplaced() { var appServices = new ServiceCollection().BuildServiceProvider(); - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -271,7 +271,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task WillReplaceServiceProviderFeatureWithNullRequestServices() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -293,7 +293,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAccessLogger() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -311,7 +311,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAccessHttpContext() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -343,7 +343,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanAddNewHostServices() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -366,7 +366,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CreateInvokesApp() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(context => { @@ -383,7 +383,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task DisposeStreamIgnored() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(async context => { @@ -402,7 +402,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task DisposedServerThrows() { - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { app.Run(async context => { @@ -422,7 +422,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CancelAborts() { - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .Configure(app => { app.Run(context => @@ -441,7 +441,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanCreateViaStartupType() { - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .UseStartup(); var server = new TestServer(builder); HttpResponseMessage result = await server.CreateClient().GetAsync("/"); @@ -453,7 +453,7 @@ namespace Microsoft.AspNet.TestHost [FrameworkSkipCondition(RuntimeFrameworks.Mono, SkipReason = "Hangs randomly (issue #507)")] public async Task CanCreateViaStartupTypeAndSpecifyEnv() { - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .UseStartup() .UseEnvironment("Foo"); var server = new TestServer(builder); @@ -469,7 +469,7 @@ namespace Microsoft.AspNet.TestHost { DiagnosticListener diagnosticListener = null; - var builder = new WebApplicationBuilder() + var builder = new WebHostBuilder() .Configure(app => { diagnosticListener = app.ApplicationServices.GetRequiredService(); @@ -498,7 +498,7 @@ namespace Microsoft.AspNet.TestHost public async Task ExceptionDiagnosticAvailable() { DiagnosticListener diagnosticListener = null; - var builder = new WebApplicationBuilder().Configure(app => + var builder = new WebHostBuilder().Configure(app => { diagnosticListener = app.ApplicationServices.GetRequiredService(); app.Run(context => From 1f21540fd53a839dcfe7004788abe1e9a1d820a4 Mon Sep 17 00:00:00 2001 From: Brennan Date: Fri, 15 Jan 2016 12:43:40 -0800 Subject: [PATCH 0981/1838] Remove IsLocal --- src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs | 2 -- .../IHttpConnectionFeature.cs | 1 - src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs | 6 ------ src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs | 2 -- src/Microsoft.AspNet.Owin/OwinConstants.cs | 1 - src/Microsoft.AspNet.Owin/OwinEnvironment.cs | 2 -- src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs | 6 ------ 7 files changed, 20 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs index 2d14071ebc..fdb908a6c6 100644 --- a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs @@ -18,8 +18,6 @@ namespace Microsoft.AspNet.Http public abstract int LocalPort { get; set; } - public abstract bool IsLocal { get; set; } - public abstract X509Certificate2 ClientCertificate { get; set; } public abstract Task GetClientCertificateAsync(CancellationToken cancellationToken = new CancellationToken()); diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs index ef76d69815..5eca86f433 100644 --- a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs @@ -11,6 +11,5 @@ namespace Microsoft.AspNet.Http.Features IPAddress LocalIpAddress { get; set; } int RemotePort { get; set; } int LocalPort { get; set; } - bool IsLocal { get; set; } } } \ No newline at end of file diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs index dd19f7d286..693755aeda 100644 --- a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs @@ -59,12 +59,6 @@ namespace Microsoft.AspNet.Http.Internal set { HttpConnectionFeature.LocalPort = value; } } - public override bool IsLocal - { - get { return HttpConnectionFeature.IsLocal; } - set { HttpConnectionFeature.IsLocal = value; } - } - public override X509Certificate2 ClientCertificate { get { return TlsConnectionFeature.ClientCertificate; } diff --git a/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs index 9f826d18c0..1988301e33 100644 --- a/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs @@ -11,8 +11,6 @@ namespace Microsoft.AspNet.Http.Features.Internal { } - public bool IsLocal { get; set; } - public IPAddress LocalIpAddress { get; set; } public int LocalPort { get; set; } diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNet.Owin/OwinConstants.cs index 039209c098..beae948df8 100644 --- a/src/Microsoft.AspNet.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNet.Owin/OwinConstants.cs @@ -73,7 +73,6 @@ namespace Microsoft.AspNet.Owin public const string RemotePort = "server.RemotePort"; public const string LocalIpAddress = "server.LocalIpAddress"; public const string LocalPort = "server.LocalPort"; - public const string IsLocal = "server.IsLocal"; public const string TraceOutput = "host.TraceOutput"; public const string Addresses = "host.Addresses"; public const string AppName = "host.AppName"; diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs index 5e4db89d1a..3a66fa7749 100644 --- a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNet.Owin/OwinEnvironment.cs @@ -84,8 +84,6 @@ namespace Microsoft.AspNet.Owin { OwinConstants.CommonKeys.RemoteIpAddress, new FeatureMap(feature => feature.RemoteIpAddress.ToString(), (feature, value) => feature.RemoteIpAddress = IPAddress.Parse(Convert.ToString(value))) }, - { OwinConstants.CommonKeys.IsLocal, new FeatureMap(feature => feature.IsLocal, (feature, value) => feature.IsLocal = Convert.ToBoolean(value)) }, - { OwinConstants.SendFiles.SendAsync, new FeatureMap(feature => new SendFileFunc(feature.SendFileAsync)) }, { OwinConstants.Security.User, new FeatureMap(feature => feature.User, diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs index 1a1b5b183d..a8c7560819 100644 --- a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs @@ -190,12 +190,6 @@ namespace Microsoft.AspNet.Owin set { Prop(OwinConstants.CommonKeys.LocalPort, value.ToString(CultureInfo.InvariantCulture)); } } - bool IHttpConnectionFeature.IsLocal - { - get { return Prop(OwinConstants.CommonKeys.IsLocal); } - set { Prop(OwinConstants.CommonKeys.LocalPort, value); } - } - private bool SupportsSendFile { get From 3f84e992f48f52d86404732915ebe86bfdd2a610 Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 14 Jan 2016 14:38:42 -0800 Subject: [PATCH 0982/1838] Make StreamCopyOperation public and update it to same as StaticFiles --- .../SendFileResponseExtensions.cs | 6 +- .../StreamCopyOperation.cs | 82 +++++++++++-------- .../project.json | 3 +- 3 files changed, 51 insertions(+), 40 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs index bb236b7dd0..747e91096e 100644 --- a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs @@ -5,6 +5,7 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; +using Microsoft.AspNet.Http.Extensions; using Microsoft.AspNet.Http.Features; namespace Microsoft.AspNet.Http @@ -96,10 +97,7 @@ namespace Microsoft.AspNet.Http { fileStream.Seek(offset, SeekOrigin.Begin); - // TODO: Use buffer pool - var buffer = new byte[bufferSize]; - - await StreamCopyOperation.CopyToAsync(fileStream, buffer, outputStream, length, cancel); + await StreamCopyOperation.CopyToAsync(fileStream, outputStream, length, cancel); } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs index f7e6734c9c..a59aed1f0a 100644 --- a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs +++ b/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs @@ -2,55 +2,67 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; +using System.Buffers; using System.Diagnostics; using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNet.Http.Extensions { // FYI: In most cases the source will be a FileStream and the destination will be to the network. - internal static class StreamCopyOperation + public static class StreamCopyOperation { - internal static async Task CopyToAsync(Stream source, byte[] buffer, Stream destination, long? length, CancellationToken cancel) + private const int DefaultBufferSize = 4096; + + public static async Task CopyToAsync(Stream source, Stream destination, long? length, CancellationToken cancel) { long? bytesRemaining = length; - Debug.Assert(source != null); - Debug.Assert(destination != null); - Debug.Assert(!bytesRemaining.HasValue || bytesRemaining.Value >= 0); - Debug.Assert(buffer != null); - while (true) + var buffer = ArrayPool.Shared.Rent(DefaultBufferSize); + try { - // The natural end of the range. - if (bytesRemaining.HasValue && bytesRemaining.Value <= 0) + Debug.Assert(source != null); + Debug.Assert(destination != null); + Debug.Assert(!bytesRemaining.HasValue || bytesRemaining.Value >= 0); + Debug.Assert(buffer != null); + + while (true) { - return; + // The natural end of the range. + if (bytesRemaining.HasValue && bytesRemaining.Value <= 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + int readLength = buffer.Length; + if (bytesRemaining.HasValue) + { + readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); + } + int count = await source.ReadAsync(buffer, 0, readLength, cancel); + + if (bytesRemaining.HasValue) + { + bytesRemaining -= count; + } + + // End of the source stream. + if (count == 0) + { + return; + } + + cancel.ThrowIfCancellationRequested(); + + await destination.WriteAsync(buffer, 0, count, cancel); } - - cancel.ThrowIfCancellationRequested(); - - int readLength = buffer.Length; - if (bytesRemaining.HasValue) - { - readLength = (int)Math.Min(bytesRemaining.Value, (long)readLength); - } - int count = await source.ReadAsync(buffer, 0, readLength, cancel); - - if (bytesRemaining.HasValue) - { - bytesRemaining -= count; - } - - // End of the source stream. - if (count == 0) - { - return; - } - - cancel.ThrowIfCancellationRequested(); - - await destination.WriteAsync(buffer, 0, count, cancel); + } + finally + { + ArrayPool.Shared.Return(buffer); } } } diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNet.Http.Extensions/project.json index 747d08ca80..8aa5deacf7 100644 --- a/src/Microsoft.AspNet.Http.Extensions/project.json +++ b/src/Microsoft.AspNet.Http.Extensions/project.json @@ -11,7 +11,8 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.Net.Http.Headers": "1.0.0-*" + "Microsoft.Net.Http.Headers": "1.0.0-*", + "System.Buffers": "4.0.0-*" }, "frameworks": { "net451": {}, From cb029209a386d596b93d531d9ba1baf69aef980d Mon Sep 17 00:00:00 2001 From: David Fowler Date: Wed, 20 Jan 2016 22:14:17 +0000 Subject: [PATCH 0983/1838] Remove top level environment variables from default config --- src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs b/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs index 76d539117a..dc331e9adb 100644 --- a/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs +++ b/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs @@ -20,12 +20,11 @@ namespace Microsoft.AspNet.Hosting { WebHostDefaults.CaptureStartupErrorsKey, "true" } }; - // We are adding all environment variables first and then adding the ASPNET_ ones - // with the prefix removed to unify with the command line and config file formats + // Setup the default locations for finding hosting configuration options + // hosting.json, ASPNET_ prefixed env variables and command line arguments var configBuilder = new ConfigurationBuilder() .AddInMemoryCollection(defaultSettings) .AddJsonFile(WebHostDefaults.HostingJsonFile, optional: true) - .AddEnvironmentVariables() .AddEnvironmentVariables(prefix: WebHostDefaults.EnvironmentVariablesPrefix); if (args != null) From 802dbea6db20ec978ba9e65c8a7e7637b2bf945f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Jan 2016 20:50:18 -0800 Subject: [PATCH 0984/1838] Reacting to CoreCLR package version change --- src/Microsoft.AspNet.Server.Testing/project.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNet.Server.Testing/project.json index e6af8b13d7..cfa8859965 100644 --- a/src/Microsoft.AspNet.Server.Testing/project.json +++ b/src/Microsoft.AspNet.Server.Testing/project.json @@ -30,7 +30,7 @@ "System.IO.FileSystem": "4.0.1-*", "System.Net.Http": "4.0.1-*", "System.Net.Primitives": "4.0.11-*", - "System.Runtime.Extensions": "4.0.11-*", + "System.Runtime.Extensions": "4.1.0-*", "System.Text.RegularExpressions": "4.0.11-*", "System.Threading": "4.0.11-*", "System.Threading.Thread": "4.0.0-*" From 38feebc0d658d2eaa3b945bdddd004f44c9f6f7d Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 20 Jan 2016 20:53:25 -0800 Subject: [PATCH 0985/1838] Reacting to CoreCLR package version change --- src/Microsoft.AspNet.Http.Features/project.json | 2 +- src/Microsoft.AspNet.WebUtilities/project.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNet.Http.Features/project.json index 0f9fb1a9f2..0ccf00e18b 100644 --- a/src/Microsoft.AspNet.Http.Features/project.json +++ b/src/Microsoft.AspNet.Http.Features/project.json @@ -20,7 +20,7 @@ "System.Linq": "4.0.1-*", "System.Net.Primitives": "4.0.11-*", "System.Net.WebSockets": "4.0.0-*", - "System.Runtime.Extensions": "4.0.11-*", + "System.Runtime.Extensions": "4.1.0-*", "System.Security.Claims": "4.0.1-*", "System.Security.Cryptography.X509Certificates": "4.0.0-*", "System.Security.Principal": "4.0.1-*" diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 82efa6d0d5..35a6eda9ab 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -22,7 +22,7 @@ "dotnet5.4": { "dependencies": { "System.Collections": "4.0.11-*", - "System.IO": "4.0.11-*", + "System.IO": "4.1.0-*", "System.IO.FileSystem": "4.0.1-*" } } From da478b02ed378c8b8ff67723f70162444df0885e Mon Sep 17 00:00:00 2001 From: ryanbrandenburg Date: Tue, 12 Jan 2016 16:57:57 -0800 Subject: [PATCH 0986/1838] * Move HttpResponseStreamWriter from Mvc --- .../HttpRequestStreamReader.cs | 437 +++++++++++++++++ .../HttpResponseStreamWriter.cs | 395 +++++++++++++++ .../Resources.Designer.cs | 80 +++ .../Resources.resx | 126 +++++ .../project.json | 1 + .../HttpRequestStreamReaderTest.cs | 225 +++++++++ .../HttpResponseStreamWriterTest.cs | 461 ++++++++++++++++++ 7 files changed, 1725 insertions(+) create mode 100644 src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs create mode 100644 src/Microsoft.AspNet.WebUtilities/Resources.resx create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs create mode 100644 test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs diff --git a/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs new file mode 100644 index 0000000000..fedeb9315b --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs @@ -0,0 +1,437 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Buffers; +using System.Diagnostics; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + public class HttpRequestStreamReader : TextReader + { + private const int DefaultBufferSize = 1024; + private const int MinBufferSize = 128; + private const int MaxSharedBuilderCapacity = 360; // also the max capacity used in StringBuilderCache + + private Stream _stream; + private readonly Encoding _encoding; + private readonly Decoder _decoder; + + private readonly ArrayPool _bytePool; + private readonly ArrayPool _charPool; + + private readonly int _byteBufferSize; + private byte[] _byteBuffer; + private char[] _charBuffer; + + private int _charBufferIndex; + private int _charsRead; + private int _bytesRead; + + private bool _isBlocked; + + public HttpRequestStreamReader(Stream stream, Encoding encoding) + : this(stream, encoding, DefaultBufferSize) + { + } + + public HttpRequestStreamReader(Stream stream, Encoding encoding, int bufferSize) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanRead) + { + throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + _stream = stream; + _encoding = encoding; + _decoder = encoding.GetDecoder(); + + if (bufferSize < MinBufferSize) + { + bufferSize = MinBufferSize; + } + + _byteBufferSize = bufferSize; + _byteBuffer = new byte[bufferSize]; + var maxCharsPerBuffer = encoding.GetMaxCharCount(bufferSize); + _charBuffer = new char[maxCharsPerBuffer]; + } + + public HttpRequestStreamReader( + Stream stream, + Encoding encoding, + int bufferSize, + ArrayPool bytePool, + ArrayPool charPool) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanRead) + { + throw new ArgumentException(Resources.HttpRequestStreamReader_StreamNotReadable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + if (bytePool == null) + { + throw new ArgumentNullException(nameof(bytePool)); + } + + if (charPool == null) + { + throw new ArgumentNullException(nameof(charPool)); + } + + if (bufferSize <= 0) + { + throw new ArgumentOutOfRangeException(nameof(bufferSize)); + } + + _stream = stream; + _encoding = encoding; + _byteBufferSize = bufferSize; + _bytePool = bytePool; + _charPool = charPool; + + _decoder = encoding.GetDecoder(); + + _byteBuffer = _bytePool.Rent(bufferSize); + + try + { + var requiredLength = encoding.GetMaxCharCount(bufferSize); + _charBuffer = _charPool.Rent(requiredLength); + } + catch + { + _bytePool.Return(_byteBuffer); + _byteBuffer = null; + + if (_charBuffer != null) + { + _charPool.Return(_charBuffer); + _charBuffer = null; + } + } + } + +#if NET451 + public override void Close() + { + Dispose(true); + } +#endif + + protected override void Dispose(bool disposing) + { + if (disposing && _stream != null) + { + _stream = null; + + if (_bytePool != null) + { + _bytePool.Return(_byteBuffer); + _byteBuffer = null; + } + + if (_charPool != null) + { + _charPool.Return(_charBuffer); + _charBuffer = null; + } + } + + base.Dispose(disposing); + } + + public override int Peek() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferIndex == _charsRead) + { + if (_isBlocked || ReadIntoBuffer() == 0) + { + return -1; + } + } + + return _charBuffer[_charBufferIndex]; + } + + public override int Read() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferIndex == _charsRead) + { + if (ReadIntoBuffer() == 0) + { + return -1; + } + } + + return _charBuffer[_charBufferIndex++]; + } + + public override int Read(char[] buffer, int index, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (count < 0 || index + count > buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + var charsRead = 0; + while (count > 0) + { + var charsRemaining = _charsRead - _charBufferIndex; + if (charsRemaining == 0) + { + charsRemaining = ReadIntoBuffer(); + } + + if (charsRemaining == 0) + { + break; // We're at EOF + } + + if (charsRemaining > count) + { + charsRemaining = count; + } + + Buffer.BlockCopy( + _charBuffer, + _charBufferIndex * 2, + buffer, + (index + charsRead) * 2, + charsRemaining * 2); + _charBufferIndex += charsRemaining; + + charsRead += charsRemaining; + count -= charsRemaining; + + // If we got back fewer chars than we asked for, then it's likely the underlying stream is blocked. + // Send the data back to the caller so they can process it. + if (_isBlocked) + { + break; + } + } + + return charsRead; + } + + public override async Task ReadAsync(char[] buffer, int index, int count) + { + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + if (index < 0) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + if (count < 0 || index + count > buffer.Length) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferIndex == _charsRead && await ReadIntoBufferAsync() == 0) + { + return 0; + } + + var charsRead = 0; + while (count > 0) + { + // n is the characters available in _charBuffer + var n = _charsRead - _charBufferIndex; + + // charBuffer is empty, let's read from the stream + if (n == 0) + { + _charsRead = 0; + _charBufferIndex = 0; + _bytesRead = 0; + + // We loop here so that we read in enough bytes to yield at least 1 char. + // We break out of the loop if the stream is blocked (EOF is reached). + do + { + Debug.Assert(n == 0); + _bytesRead = await _stream.ReadAsync( + _byteBuffer, + 0, + _byteBufferSize); + if (_bytesRead == 0) // EOF + { + _isBlocked = true; + break; + } + + // _isBlocked == whether we read fewer bytes than we asked for. + _isBlocked = (_bytesRead < _byteBufferSize); + + Debug.Assert(n == 0); + + _charBufferIndex = 0; + n = _decoder.GetChars( + _byteBuffer, + 0, + _bytesRead, + _charBuffer, + 0); + + Debug.Assert(n > 0); + + _charsRead += n; // Number of chars in StreamReader's buffer. + } + while (n == 0); + + if (n == 0) + { + break; // We're at EOF + } + } + + // Got more chars in charBuffer than the user requested + if (n > count) + { + n = count; + } + + Buffer.BlockCopy( + _charBuffer, + _charBufferIndex * 2, + buffer, + (index + charsRead) * 2, + n * 2); + + _charBufferIndex += n; + + charsRead += n; + count -= n; + + // This function shouldn't block for an indefinite amount of time, + // or reading from a network stream won't work right. If we got + // fewer bytes than we requested, then we want to break right here. + if (_isBlocked) + { + break; + } + } + + return charsRead; + } + + private int ReadIntoBuffer() + { + _charsRead = 0; + _charBufferIndex = 0; + _bytesRead = 0; + + do + { + _bytesRead = _stream.Read(_byteBuffer, 0, _byteBufferSize); + if (_bytesRead == 0) // We're at EOF + { + return _charsRead; + } + + _isBlocked = (_bytesRead < _byteBufferSize); + _charsRead += _decoder.GetChars( + _byteBuffer, + 0, + _bytesRead, + _charBuffer, + _charsRead); + } + while (_charsRead == 0); + + return _charsRead; + } + + private async Task ReadIntoBufferAsync() + { + _charsRead = 0; + _charBufferIndex = 0; + _bytesRead = 0; + + do + { + + _bytesRead = await _stream.ReadAsync( + _byteBuffer, + 0, + _byteBufferSize).ConfigureAwait(false); + if (_bytesRead == 0) + { + // We're at EOF + return _charsRead; + } + + // _isBlocked == whether we read fewer bytes than we asked for. + _isBlocked = (_bytesRead < _byteBufferSize); + + _charsRead += _decoder.GetChars( + _byteBuffer, + 0, + _bytesRead, + _charBuffer, + _charsRead); + } + while (_charsRead == 0); + + return _charsRead; + } + } +} \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs new file mode 100644 index 0000000000..e875364647 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs @@ -0,0 +1,395 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Buffers; +using System.IO; +using System.Text; +using System.Threading.Tasks; + +namespace Microsoft.AspNet.WebUtilities +{ + /// + /// Writes to the using the supplied . + /// It does not write the BOM and also does not close the stream. + /// + public class HttpResponseStreamWriter : TextWriter + { + private const int MinBufferSize = 128; + + /// + /// Default buffer size. + /// + public const int DefaultBufferSize = 1024; + + private Stream _stream; + private readonly Encoder _encoder; + private readonly ArrayPool _bytePool; + private readonly ArrayPool _charPool; + private readonly int _charBufferSize; + + private byte[] _byteBuffer; + private char[] _charBuffer; + + private int _charBufferCount; + + public HttpResponseStreamWriter(Stream stream, Encoding encoding) + : this(stream, encoding, DefaultBufferSize) + { + } + + public HttpResponseStreamWriter(Stream stream, Encoding encoding, int bufferSize) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanWrite) + { + throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + _stream = stream; + Encoding = encoding; + _charBufferSize = bufferSize; + + if (bufferSize < MinBufferSize) + { + bufferSize = MinBufferSize; + } + + _encoder = encoding.GetEncoder(); + _byteBuffer = new byte[encoding.GetMaxByteCount(bufferSize)]; + _charBuffer = new char[bufferSize]; + } + + public HttpResponseStreamWriter( + Stream stream, + Encoding encoding, + int bufferSize, + ArrayPool bytePool, + ArrayPool charPool) + { + if (stream == null) + { + throw new ArgumentNullException(nameof(stream)); + } + + if (!stream.CanWrite) + { + throw new ArgumentException(Resources.HttpResponseStreamWriter_StreamNotWritable, nameof(stream)); + } + + if (encoding == null) + { + throw new ArgumentNullException(nameof(encoding)); + } + + if (bytePool == null) + { + throw new ArgumentNullException(nameof(bytePool)); + } + + if (charPool == null) + { + throw new ArgumentNullException(nameof(charPool)); + } + + _stream = stream; + Encoding = encoding; + _charBufferSize = bufferSize; + + _encoder = encoding.GetEncoder(); + _bytePool = bytePool; + _charPool = charPool; + + _charBuffer = charPool.Rent(bufferSize); + + try + { + var requiredLength = encoding.GetMaxByteCount(bufferSize); + _byteBuffer = bytePool.Rent(requiredLength); + } + catch + { + charPool.Return(_charBuffer); + _charBuffer = null; + + if (_byteBuffer != null) + { + bytePool.Return(_byteBuffer); + _byteBuffer = null; + } + + throw; + } + } + + public override Encoding Encoding { get; } + + public override void Write(char value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferCount == _charBufferSize) + { + FlushInternal(flushEncoder: false); + } + + _charBuffer[_charBufferCount] = value; + _charBufferCount++; + } + + public override void Write(char[] values, int index, int count) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (values == null) + { + return; + } + + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + FlushInternal(flushEncoder: false); + } + + CopyToCharBuffer(values, ref index, ref count); + } + } + + public override void Write(string value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (value == null) + { + return; + } + + var count = value.Length; + var index = 0; + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + FlushInternal(flushEncoder: false); + } + + CopyToCharBuffer(value, ref index, ref count); + } + } + + public override async Task WriteAsync(char value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (_charBufferCount == _charBufferSize) + { + await FlushInternalAsync(flushEncoder: false); + } + + _charBuffer[_charBufferCount] = value; + _charBufferCount++; + } + + public override async Task WriteAsync(char[] values, int index, int count) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (values == null) + { + return; + } + + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + await FlushInternalAsync(flushEncoder: false); + } + + CopyToCharBuffer(values, ref index, ref count); + } + } + + public override async Task WriteAsync(string value) + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + if (value == null) + { + return; + } + + var count = value.Length; + var index = 0; + while (count > 0) + { + if (_charBufferCount == _charBufferSize) + { + await FlushInternalAsync(flushEncoder: false); + } + + CopyToCharBuffer(value, ref index, ref count); + } + } + + // We want to flush the stream when Flush/FlushAsync is explicitly + // called by the user (example: from a Razor view). + + public override void Flush() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + FlushInternal(flushEncoder: true); + } + + public override Task FlushAsync() + { + if (_stream == null) + { + throw new ObjectDisposedException("stream"); + } + + return FlushInternalAsync(flushEncoder: true); + } + + protected override void Dispose(bool disposing) + { + if (disposing && _stream != null) + { + try + { + FlushInternal(flushEncoder: true); + } + finally + { + _stream = null; + + if (_bytePool != null) + { + _bytePool.Return(_byteBuffer); + _byteBuffer = null; + } + + if (_charPool != null) + { + _charPool.Return(_charBuffer); + _charBuffer = null; + } + } + } + } + + // Note: our FlushInternal method does NOT flush the underlying stream. This would result in + // chunking. + private void FlushInternal(bool flushEncoder) + { + if (_charBufferCount == 0) + { + return; + } + + var count = _encoder.GetBytes( + _charBuffer, + 0, + _charBufferCount, + _byteBuffer, + 0, + flush: flushEncoder); + + if (count > 0) + { + _stream.Write(_byteBuffer, 0, count); + } + + _charBufferCount = 0; + } + + // Note: our FlushInternalAsync method does NOT flush the underlying stream. This would result in + // chunking. + private async Task FlushInternalAsync(bool flushEncoder) + { + if (_charBufferCount == 0) + { + return; + } + + var count = _encoder.GetBytes( + _charBuffer, + 0, + _charBufferCount, + _byteBuffer, + 0, + flush: flushEncoder); + + if (count > 0) + { + await _stream.WriteAsync(_byteBuffer, 0, count); + } + + _charBufferCount = 0; + } + + private void CopyToCharBuffer(string value, ref int index, ref int count) + { + var remaining = Math.Min(_charBufferSize - _charBufferCount, count); + + value.CopyTo( + sourceIndex: index, + destination: _charBuffer, + destinationIndex: _charBufferCount, + count: remaining); + + _charBufferCount += remaining; + index += remaining; + count -= remaining; + } + + private void CopyToCharBuffer(char[] values, ref int index, ref int count) + { + var remaining = Math.Min(_charBufferSize - _charBufferCount, count); + + Buffer.BlockCopy( + src: values, + srcOffset: index * sizeof(char), + dst: _charBuffer, + dstOffset: _charBufferCount * sizeof(char), + count: remaining * sizeof(char)); + + _charBufferCount += remaining; + index += remaining; + count -= remaining; + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs new file mode 100644 index 0000000000..5b186b2d3f --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs @@ -0,0 +1,80 @@ +//------------------------------------------------------------------------------ +// +// 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 Microsoft.AspNet.WebUtilities { + 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.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + 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("Microsoft.AspNet.WebUtilities.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 The stream must support reading.. + /// + internal static string HttpRequestStreamReader_StreamNotReadable { + get { + return ResourceManager.GetString("HttpRequestStreamReader_StreamNotReadable", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to The stream must support writing.. + /// + internal static string HttpResponseStreamWriter_StreamNotWritable { + get { + return ResourceManager.GetString("HttpResponseStreamWriter_StreamNotWritable", resourceCulture); + } + } + } +} diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.resx b/src/Microsoft.AspNet.WebUtilities/Resources.resx new file mode 100644 index 0000000000..9873865894 --- /dev/null +++ b/src/Microsoft.AspNet.WebUtilities/Resources.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 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 + + + The stream must support reading. + + + The stream must support writing. + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNet.WebUtilities/project.json index 35a6eda9ab..9ff39f4337 100644 --- a/src/Microsoft.AspNet.WebUtilities/project.json +++ b/src/Microsoft.AspNet.WebUtilities/project.json @@ -11,6 +11,7 @@ }, "dependencies": { "Microsoft.Extensions.Primitives": "1.0.0-*", + "System.Buffers": "4.0.0-*", "System.Text.Encodings.Web": "4.0.0-*" }, "frameworks": { diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs new file mode 100644 index 0000000000..a8b90c9bcd --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -0,0 +1,225 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities.Test +{ + public class HttpResponseStreamReaderTest + { + private static readonly char[] CharData = new char[] + { + char.MinValue, + char.MaxValue, + '\t', + ' ', + '$', + '@', + '#', + '\0', + '\v', + '\'', + '\u3190', + '\uC3A0', + 'A', + '5', + '\r', + '\uFE70', + '-', + ';', + '\r', + '\n', + 'T', + '3', + '\n', + 'K', + '\u00E6', + }; + + [Fact] + public static async Task ReadToEndAsync() + { + // Arrange + var reader = new HttpRequestStreamReader(GetLargeStream(), Encoding.UTF8); + + var result = await reader.ReadToEndAsync(); + + Assert.Equal(5000, result.Length); + } + + [Fact] + public static void TestRead() + { + // Arrange + var reader = CreateReader(); + + // Act & Assert + for (var i = 0; i < CharData.Length; i++) + { + var tmp = reader.Read(); + Assert.Equal((int)CharData[i], tmp); + } + } + + [Fact] + public static void TestPeek() + { + // Arrange + var reader = CreateReader(); + + // Act & Assert + for (var i = 0; i < CharData.Length; i++) + { + var peek = reader.Peek(); + Assert.Equal((int)CharData[i], peek); + + reader.Read(); + } + } + + [Fact] + public static void EmptyStream() + { + // Arrange + var reader = new HttpRequestStreamReader(new MemoryStream(), Encoding.UTF8); + var buffer = new char[10]; + + // Act + var read = reader.Read(buffer, 0, 1); + + // Assert + Assert.Equal(0, read); + } + + [Fact] + public static void Read_ReadAllCharactersAtOnce() + { + // Arrange + var reader = CreateReader(); + var chars = new char[CharData.Length]; + + // Act + var read = reader.Read(chars, 0, chars.Length); + + // Assert + Assert.Equal(chars.Length, read); + for (var i = 0; i < CharData.Length; i++) + { + Assert.Equal(CharData[i], chars[i]); + } + } + + [Fact] + public static async Task Read_ReadInTwoChunks() + { + // Arrange + var reader = CreateReader(); + var chars = new char[CharData.Length]; + + // Act + var read = await reader.ReadAsync(chars, 4, 3); + + // Assert + Assert.Equal(read, 3); + for (var i = 0; i < 3; i++) + { + Assert.Equal(CharData[i], chars[i + 4]); + } + } + + [Fact] + public static void ReadLine_ReadMultipleLines() + { + // Arrange + var reader = CreateReader(); + var valueString = new string(CharData); + + // Act & Assert + var data = reader.ReadLine(); + Assert.Equal(valueString.Substring(0, valueString.IndexOf('\r')), data); + + data = reader.ReadLine(); + Assert.Equal(valueString.Substring(valueString.IndexOf('\r') + 1, 3), data); + + data = reader.ReadLine(); + Assert.Equal(valueString.Substring(valueString.IndexOf('\n') + 1, 2), data); + + data = reader.ReadLine(); + Assert.Equal((valueString.Substring(valueString.LastIndexOf('\n') + 1)), data); + } + + [Fact] + public static void ReadLine_ReadWithNoNewlines() + { + // Arrange + var reader = CreateReader(); + var valueString = new string(CharData); + var temp = new char[10]; + + // Act + reader.Read(temp, 0, 1); + var data = reader.ReadLine(); + + // Assert + Assert.Equal(valueString.Substring(1, valueString.IndexOf('\r') - 1), data); + } + + [Fact] + public static async Task ReadLineAsync_MultipleContinuousLines() + { + // Arrange + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write("\n\n\r\r\n"); + writer.Flush(); + stream.Position = 0; + + var reader = new HttpRequestStreamReader(stream, Encoding.UTF8); + + // Act & Assert + for (var i = 0; i < 4; i++) + { + var data = await reader.ReadLineAsync(); + Assert.Equal(string.Empty, data); + } + + var eol = await reader.ReadLineAsync(); + Assert.Null(eol); + } + + private static HttpRequestStreamReader CreateReader() + { + var stream = new MemoryStream(); + var writer = new StreamWriter(stream); + writer.Write(CharData); + writer.Flush(); + stream.Position = 0; + + return new HttpRequestStreamReader(stream, Encoding.UTF8); + } + + private static MemoryStream GetSmallStream() + { + var testData = new byte[] { 72, 69, 76, 76, 79 }; + return new MemoryStream(testData); + } + + private static MemoryStream GetLargeStream() + { + var testData = new byte[] { 72, 69, 76, 76, 79 }; + // System.Collections.Generic. + + var data = new List(); + for (var i = 0; i < 1000; i++) + { + data.AddRange(testData); + } + + return new MemoryStream(data.ToArray()); + } + } +} diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs new file mode 100644 index 0000000000..a357853020 --- /dev/null +++ b/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -0,0 +1,461 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Buffers; +using System.IO; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.AspNet.WebUtilities.Test +{ + public class HttpResponseStreamWriterTest + { + [Fact] + public async Task DoesNotWriteBOM() + { + // Arrange + var memoryStream = new MemoryStream(); + var encodingWithBOM = new UTF8Encoding(encoderShouldEmitUTF8Identifier: true); + var writer = new HttpResponseStreamWriter(memoryStream, encodingWithBOM); + var expectedData = new byte[] { 97, 98, 99, 100 }; // without BOM + + // Act + using (writer) + { + await writer.WriteAsync("abcd"); + } + + // Assert + Assert.Equal(expectedData, memoryStream.ToArray()); + } + +#if NET451 + [Fact] + public async Task DoesNotFlush_UnderlyingStream_OnClosingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello"); + writer.Close(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + } +#endif + + [Fact] + public async Task DoesNotFlush_UnderlyingStream_OnDisposingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello"); + writer.Dispose(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + } + +#if NET451 + [Fact] + public async Task DoesNotClose_UnderlyingStream_OnDisposingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello"); + writer.Close(); + + // Assert + Assert.Equal(0, stream.CloseCallCount); + } +#endif + + [Fact] + public async Task DoesNotDispose_UnderlyingStream_OnDisposingWriter() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.WriteAsync("Hello world"); + writer.Dispose(); + + // Assert + Assert.Equal(0, stream.DisposeCallCount); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task FlushesBuffer_OnClose(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(new string('a', byteLength)); + + // Act +#if NET451 + writer.Close(); +#else + writer.Dispose(); +#endif + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task FlushesBuffer_OnDispose(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(new string('a', byteLength)); + + // Act + writer.Dispose(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Fact] + public void NoDataWritten_Flush_DoesNotFlushUnderlyingStream() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + writer.Flush(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(0, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public void FlushesBuffer_ButNotStream_OnFlush(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + writer.Write(new string('a', byteLength)); + + var expectedWriteCount = Math.Ceiling((double)byteLength / HttpResponseStreamWriter.DefaultBufferSize); + + // Act + writer.Flush(); + + // Assert + Assert.Equal(0, stream.FlushCallCount); + Assert.Equal(expectedWriteCount, stream.WriteCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Fact] + public async Task NoDataWritten_FlushAsync_DoesNotFlushUnderlyingStream() + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + await writer.FlushAsync(); + + // Assert + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(0, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task FlushesBuffer_ButNotStream_OnFlushAsync(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + await writer.WriteAsync(new string('a', byteLength)); + + var expectedWriteCount = Math.Ceiling((double)byteLength / HttpResponseStreamWriter.DefaultBufferSize); + + // Act + await writer.FlushAsync(); + + // Assert + Assert.Equal(0, stream.FlushAsyncCallCount); + Assert.Equal(expectedWriteCount, stream.WriteAsyncCallCount); + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public void WriteChar_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + for (var i = 0; i < byteLength; i++) + { + writer.Write('a'); + } + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public void WriteCharArray_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + writer.Write((new string('a', byteLength)).ToCharArray()); + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task WriteCharAsync_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + for (var i = 0; i < byteLength; i++) + { + await writer.WriteAsync('a'); + } + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData(1023)] + [InlineData(1024)] + [InlineData(1050)] + [InlineData(2048)] + public async Task WriteCharArrayAsync_WritesToStream(int byteLength) + { + // Arrange + var stream = new TestMemoryStream(); + var writer = new HttpResponseStreamWriter(stream, Encoding.UTF8); + + // Act + using (writer) + { + await writer.WriteAsync((new string('a', byteLength)).ToCharArray()); + } + + // Assert + Assert.Equal(byteLength, stream.Length); + } + + [Theory] + [InlineData("你好世界", "utf-16")] +#if !DNXCORE50 + // CoreCLR does not like shift_jis as an encoding. + [InlineData("こんにちは世界", "shift_jis")] +#endif + [InlineData("హలో ప్రపంచ", "iso-8859-1")] + [InlineData("வணக்கம் உலக", "utf-32")] + public async Task WritesData_InExpectedEncoding(string data, string encodingName) + { + // Arrange + var encoding = Encoding.GetEncoding(encodingName); + var expectedBytes = encoding.GetBytes(data); + var stream = new MemoryStream(); + var writer = new HttpResponseStreamWriter(stream, encoding); + + // Act + using (writer) + { + await writer.WriteAsync(data); + } + + // Assert + Assert.Equal(expectedBytes, stream.ToArray()); + } + + [Theory] + [InlineData('ん', 1023, "utf-8")] + [InlineData('ん', 1024, "utf-8")] + [InlineData('ん', 1050, "utf-8")] + [InlineData('你', 1023, "utf-16")] + [InlineData('你', 1024, "utf-16")] + [InlineData('你', 1050, "utf-16")] +#if !DNXCORE50 + // CoreCLR does not like shift_jis as an encoding. + [InlineData('こ', 1023, "shift_jis")] + [InlineData('こ', 1024, "shift_jis")] + [InlineData('こ', 1050, "shift_jis")] +#endif + [InlineData('హ', 1023, "iso-8859-1")] + [InlineData('హ', 1024, "iso-8859-1")] + [InlineData('హ', 1050, "iso-8859-1")] + [InlineData('வ', 1023, "utf-32")] + [InlineData('வ', 1024, "utf-32")] + [InlineData('வ', 1050, "utf-32")] + public async Task WritesData_OfDifferentLength_InExpectedEncoding( + char character, + int charCount, + string encodingName) + { + // Arrange + var encoding = Encoding.GetEncoding(encodingName); + string data = new string(character, charCount); + var expectedBytes = encoding.GetBytes(data); + var stream = new MemoryStream(); + var writer = new HttpResponseStreamWriter(stream, encoding); + + // Act + using (writer) + { + await writer.WriteAsync(data); + } + + // Assert + Assert.Equal(expectedBytes, stream.ToArray()); + } + + // None of the code in HttpResponseStreamWriter differs significantly when using pooled buffers. + // + // This test effectively verifies that things are correctly constructed and disposed. Pooled buffers + // throw on the finalizer thread if not disposed, so that's why it's complicated. + [Fact] + public void HttpResponseStreamWriter_UsingPooledBuffers() + { + // Arrange + var encoding = Encoding.UTF8; + var stream = new MemoryStream(); + + var expectedBytes = encoding.GetBytes("Hello, World!"); + + using (var writer = new HttpResponseStreamWriter( + stream, + encoding, + 1024, + ArrayPool.Shared, + ArrayPool.Shared)) + { + // Act + writer.Write("Hello, World!"); + } + + // Assert + Assert.Equal(expectedBytes, stream.ToArray()); + } + + private class TestMemoryStream : MemoryStream + { + public int FlushCallCount { get; private set; } + + public int FlushAsyncCallCount { get; private set; } + + public int CloseCallCount { get; private set; } + + public int DisposeCallCount { get; private set; } + + public int WriteCallCount { get; private set; } + + public int WriteAsyncCallCount { get; private set; } + + public override void Flush() + { + FlushCallCount++; + base.Flush(); + } + + public override Task FlushAsync(CancellationToken cancellationToken) + { + FlushAsyncCallCount++; + return base.FlushAsync(cancellationToken); + } + + public override void Write(byte[] buffer, int offset, int count) + { + WriteCallCount++; + base.Write(buffer, offset, count); + } + + public override Task WriteAsync(byte[] buffer, int offset, int count, CancellationToken cancellationToken) + { + WriteAsyncCallCount++; + return base.WriteAsync(buffer, offset, count, cancellationToken); + } + +#if NET451 + public override void Close() + { + CloseCallCount++; + base.Close(); + } +#endif + + protected override void Dispose(bool disposing) + { + DisposeCallCount++; + base.Dispose(disposing); + } + } + } +} From 70c69178f69b09d4c59fa9b41d9ee7b99b302541 Mon Sep 17 00:00:00 2001 From: Brennan Date: Thu, 21 Jan 2016 16:54:44 -0800 Subject: [PATCH 0987/1838] React to Fileprovider namespace changes --- .../IHostingEnvironment.cs | 2 +- src/Microsoft.AspNet.Hosting.Abstractions/project.json | 4 ++-- src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs | 2 +- .../Internal/HostingEnvironmentExtensions.cs | 2 +- src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs | 2 +- src/Microsoft.AspNet.Hosting/project.json | 2 +- .../HostingEnvironmentExtensionsTests.cs | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs index 6c9ddf464b..5878bd489c 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs @@ -1,8 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FileProviders; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; namespace Microsoft.AspNet.Hosting { diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNet.Hosting.Abstractions/project.json index f6a665e878..e23808c2f1 100644 --- a/src/Microsoft.AspNet.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNet.Hosting.Abstractions/project.json @@ -11,10 +11,10 @@ }, "dependencies": { "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.FileProviders.Abstractions": "1.0.0-*", "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*", - "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*" + "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", + "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0-*" }, "frameworks": { "net451": {}, diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs index 0428ce490b..ac87b19b94 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs @@ -1,8 +1,8 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.FileProviders; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; namespace Microsoft.AspNet.Hosting.Internal { diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs index 36f8c9bb41..d491a4fef7 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs @@ -3,9 +3,9 @@ using System; using System.IO; -using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Hosting.Internal; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; namespace Microsoft.AspNet.Hosting.Internal { diff --git a/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs b/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs index 73f0bebc93..5448e6a5ec 100644 --- a/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs +++ b/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs @@ -5,7 +5,7 @@ using System; using System.Collections; using System.Collections.Generic; using System.IO; -using Microsoft.AspNet.FileProviders; +using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Primitives; namespace Microsoft.AspNet.Hosting.Internal diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNet.Hosting/project.json index 302aa0ba37..7677512471 100644 --- a/src/Microsoft.AspNet.Hosting/project.json +++ b/src/Microsoft.AspNet.Hosting/project.json @@ -10,11 +10,11 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.FileProviders.Physical": "1.0.0-*", "Microsoft.AspNet.Hosting.Abstractions": "1.0.0-*", "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.AspNet.Http": "1.0.0-*", "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.Extensions.FileProviders.Physical": "1.0.0-*", "Microsoft.Extensions.Options": "1.0.0-*", "Microsoft.Extensions.Configuration": "1.0.0-*", "Microsoft.Extensions.Configuration.CommandLine": "1.0.0-*", diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs index 60a413acf5..709385fc66 100644 --- a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs +++ b/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs @@ -3,9 +3,9 @@ using System; using System.IO; -using Microsoft.AspNet.FileProviders; using Microsoft.AspNet.Hosting.Internal; using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.FileProviders; using Xunit; namespace Microsoft.AspNet.Hosting.Tests From b2c154b576df876657f33200b8e9b6f4fcdad2ce Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 22 Jan 2016 12:20:30 -0800 Subject: [PATCH 0988/1838] Rename AspNet 5 folders and files. See https://github.com/aspnet/Announcements/issues/144 for more information. --- .../Authentication/AuthenticationDescription.cs | 0 .../Authentication/AuthenticationManager.cs | 0 .../Authentication/AuthenticationProperties.cs | 0 .../ConnectionInfo.cs | 0 .../CookieOptions.cs | 0 .../Extensions/HeaderDictionaryExtensions.cs | 0 .../Extensions/HttpResponseWritingExtensions.cs | 0 .../Extensions/MapExtensions.cs | 0 .../Extensions/MapMiddleware.cs | 0 .../Extensions/MapOptions.cs | 0 .../Extensions/MapWhenExtensions.cs | 0 .../Extensions/MapWhenMiddleware.cs | 0 .../Extensions/MapWhenOptions.cs | 0 .../Extensions/RunExtensions.cs | 0 .../Extensions/UseExtensions.cs | 0 .../Extensions/UseMiddlewareExtensions.cs | 0 .../FragmentString.cs | 0 .../HostString.cs | 0 .../HttpContext.cs | 0 .../HttpRequest.cs | 0 .../HttpResponse.cs | 0 .../IApplicationBuilder.cs | 0 .../IFormCollection.cs | 0 .../IFormFile.cs | 0 .../IFormFileCollection.cs | 0 .../IHttpContextAccessor.cs | 0 .../IHttpContextFactory.cs | 0 .../IQueryCollection.cs | 0 .../IRequestCookieCollection.cs | 0 .../IResponseCookies.cs | 0 .../Internal/HeaderSegment.cs | 0 .../Internal/HeaderSegmentCollection.cs | 0 .../Internal/ParsingHelpers.cs | 0 .../Microsoft.AspNetCore.Http.Abstractions.xproj} | 0 .../PathString.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Properties/Resources.Designer.cs | 0 .../QueryString.cs | 0 .../RequestDelegate.cs | 0 .../Resources.resx | 0 .../StatusCodes.cs | 0 .../WebSocketManager.cs | 0 .../project.json | 0 .../HeaderDictionaryTypeExtensions.cs | 0 .../Microsoft.AspNetCore.Http.Extensions.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryBuilder.cs | 0 .../RequestHeaders.cs | 0 .../ResponseExtensions.cs | 0 .../ResponseHeaders.cs | 0 .../SendFileResponseExtensions.cs | 0 .../SessionExtensions.cs | 0 .../StreamCopyOperation.cs | 0 .../UriHelper.cs | 0 .../project.json | 0 .../Authentication/AuthenticateContext.cs | 0 .../Authentication/ChallengeBehavior.cs | 0 .../Authentication/ChallengeContext.cs | 0 .../Authentication/DescribeSchemesContext.cs | 0 .../Authentication/IAuthenticationHandler.cs | 0 .../Authentication/IHttpAuthenticationFeature.cs | 0 .../Authentication/SignInContext.cs | 0 .../Authentication/SignOutContext.cs | 0 .../FeatureCollection.cs | 0 .../FeatureReference.cs | 0 .../FeatureReferences.cs | 0 .../IFeatureCollection.cs | 0 .../IHeaderDictionary.cs | 0 .../IHttpBufferingFeature.cs | 0 .../IHttpConnectionFeature.cs | 0 .../IHttpRequestFeature.cs | 0 .../IHttpRequestIdentifierFeature.cs | 0 .../IHttpRequestLifetimeFeature.cs | 0 .../IHttpResponseFeature.cs | 0 .../IHttpSendFileFeature.cs | 0 .../IHttpUpgradeFeature.cs | 0 .../IHttpWebSocketFeature.cs | 0 .../ISession.cs | 0 .../ISessionFeature.cs | 0 .../ITlsConnectionFeature.cs | 0 .../ITlsTokenBindingFeature.cs | 0 .../Microsoft.AspNetCore.Http.Features.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../WebSocketAcceptContext.cs | 0 .../project.json | 0 .../ApplicationBuilder.cs | 0 .../Authentication/DefaultAuthenticationManager.cs | 0 .../BufferingHelper.cs | 0 .../Constants.cs | 0 .../DefaultConnectionInfo.cs | 0 .../DefaultHttpContext.cs | 0 .../DefaultHttpRequest.cs | 0 .../DefaultHttpResponse.cs | 0 .../DefaultWebSocketManager.cs | 0 .../Features/Authentication/HttpAuthenticationFeature.cs | 0 .../Features/DefaultSessionFeature.cs | 0 .../Features/FormFeature.cs | 0 .../Features/FormFile.cs | 0 .../Features/HttpConnectionFeature.cs | 0 .../Features/HttpRequestFeature.cs | 0 .../Features/HttpRequestIdentifierFeature.cs | 0 .../Features/HttpRequestLifetimeFeature.cs | 0 .../Features/HttpResponseFeature.cs | 0 .../Features/IFormFeature.cs | 0 .../Features/IItemsFeature.cs | 0 .../Features/IQueryFeature.cs | 0 .../Features/IRequestCookiesFeature.cs | 0 .../Features/IResponseCookiesFeature.cs | 0 .../Features/IServiceProvidersFeature.cs | 0 .../Features/ItemsFeature.cs | 0 .../Features/QueryFeature.cs | 0 .../Features/RequestCookiesFeature.cs | 0 .../Features/ResponseCookiesFeature.cs | 0 .../Features/ServiceProvidersFeature.cs | 0 .../Features/TlsConnectionFeature.cs | 0 .../FormCollection.cs | 0 .../FormFileCollection.cs | 0 .../HeaderDictionary.cs | 0 .../HttpContextAccessor.cs | 0 .../HttpContextFactory.cs | 0 .../ItemsDictionary.cs | 0 .../Microsoft.AspNetCore.Http.xproj} | 0 .../ParsingHelpers.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryCollection.cs | 0 .../ReferenceReadStream.cs | 0 .../RequestCookieCollection.cs | 0 .../ResponseCookies.cs | 0 .../project.json | 0 .../DictionaryStringArrayWrapper.cs | 0 .../DictionaryStringValuesWrapper.cs | 0 .../IOwinEnvironmentFeature.cs | 0 .../Microsoft.AspNetCore.Owin.xproj} | 0 .../OwinConstants.cs | 0 .../OwinEnvironment.cs | 0 .../OwinEnvironmentFeature.cs | 0 .../OwinExtensions.cs | 0 .../OwinFeatureCollection.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../Utilities.cs | 0 .../WebSockets/OwinWebSocketAcceptAdapter.cs | 0 .../WebSockets/OwinWebSocketAcceptContext.cs | 0 .../WebSockets/OwinWebSocketAdapter.cs | 0 .../WebSockets/WebSocketAcceptAdapter.cs | 0 .../WebSockets/WebSocketAdapter.cs | 0 .../project.json | 0 .../BufferedReadStream.cs | 0 .../FileBufferingReadStream.cs | 0 .../FormReader.cs | 0 .../HttpRequestStreamReader.cs | 0 .../HttpResponseStreamWriter.cs | 0 .../KeyValueAccumulator.cs | 0 .../Microsoft.AspNetCore.WebUtilities.xproj} | 0 .../MultipartReader.cs | 0 .../MultipartReaderStream.cs | 0 .../MultipartSection.cs | 0 .../Properties/AssemblyInfo.cs | 0 .../QueryHelpers.cs | 0 .../ReasonPhrases.cs | 0 .../Resources.Designer.cs | 0 .../Resources.resx | 0 .../StreamHelperExtensions.cs | 0 .../WebEncoders.cs | 0 .../project.json | 0 .../HttpResponseWritingExtensionsTests.cs | 0 .../MapPathMiddlewareTests.cs | 0 .../MapPredicateMiddlewareTests.cs | 0 .../Microsoft.AspNetCore.Http.Abstractions.Tests.xproj} | 0 .../PathStringTests.cs | 0 .../QueryStringTests.cs | 0 .../UseMiddlewareTest.cs | 0 .../project.json | 0 .../HeaderDictionaryTypeExtensionsTest.cs | 0 .../Microsoft.AspNetCore.Http.Extensions.Tests.xproj} | 0 .../QueryBuilderTests.cs | 0 .../ResponseExtensionTests.cs | 0 .../SendFileResponseExtensionsTests.cs | 0 .../UriHelperTests.cs | 0 .../project.json | 0 .../FeatureCollectionTests.cs | 0 .../IThing.cs | 0 .../Microsoft.AspNetCore.Http.Features.Tests.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../Thing.cs | 0 .../project.json | 0 .../ApplicationBuilderTests.cs | 0 .../Authentication/DefaultAuthenticationManagerTests.cs | 0 .../BufferingHelperTests.cs | 0 .../DefaultHttpContextTests.cs | 0 .../DefaultHttpRequestTests.cs | 0 .../DefaultHttpResponseTests.cs | 0 .../FormFeatureTests.cs | 0 .../HeaderDictionaryTests.cs | 0 .../HttpContextFactoryTests.cs | 0 .../HttpRequestIdentifierFeatureTests.cs | 0 .../Microsoft.AspNetCore.Http.Tests.xproj} | 0 .../QueryFeatureTests.cs | 0 .../ResponseCookiesTest.cs | 0 .../project.json | 0 .../Microsoft.AspNetCore.Owin.Tests.xproj} | 0 .../OwinEnvironmentTests.cs | 0 .../OwinExtensionTests.cs | 0 .../OwinFeatureCollectionTests.cs | 0 .../project.json | 0 .../HttpRequestStreamReaderTest.cs | 0 .../HttpResponseStreamWriterTest.cs | 0 .../Microsoft.AspNetCore.WebUtilities.Tests.xproj} | 0 .../MultipartReaderTests.cs | 0 .../QueryHelpersTests.cs | 0 .../WebEncodersTests.cs | 0 .../project.json | 0 211 files changed, 0 insertions(+), 0 deletions(-) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Authentication/AuthenticationDescription.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Authentication/AuthenticationManager.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Authentication/AuthenticationProperties.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/ConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/CookieOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/HeaderDictionaryExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/HttpResponseWritingExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapWhenExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapWhenMiddleware.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/MapWhenOptions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/RunExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/UseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Extensions/UseMiddlewareExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/FragmentString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HostString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HttpContext.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/HttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IFormCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IFormFile.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IFormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IHttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IHttpContextFactory.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IQueryCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IRequestCookieCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/IResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Internal/HeaderSegment.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Internal/HeaderSegmentCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Internal/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj => Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/PathString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Properties/Resources.Designer.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/QueryString.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/RequestDelegate.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/Resources.resx (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/StatusCodes.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/WebSocketManager.cs (100%) rename src/{Microsoft.AspNet.Http.Abstractions => Microsoft.AspNetCore.Http.Abstractions}/project.json (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/HeaderDictionaryTypeExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj => Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj} (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/QueryBuilder.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/RequestHeaders.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/ResponseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/ResponseHeaders.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/SendFileResponseExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/SessionExtensions.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/StreamCopyOperation.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/UriHelper.cs (100%) rename src/{Microsoft.AspNet.Http.Extensions => Microsoft.AspNetCore.Http.Extensions}/project.json (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/AuthenticateContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/ChallengeBehavior.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/ChallengeContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/DescribeSchemesContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/IAuthenticationHandler.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/IHttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/SignInContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Authentication/SignOutContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/FeatureCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/FeatureReference.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/FeatureReferences.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IFeatureCollection.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpBufferingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpSendFileFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpUpgradeFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/IHttpWebSocketFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ISession.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ISessionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ITlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/ITlsTokenBindingFeature.cs (100%) rename src/{Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj => Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj} (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/WebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.Http.Features => Microsoft.AspNetCore.Http.Features}/project.json (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ApplicationBuilder.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Authentication/DefaultAuthenticationManager.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/BufferingHelper.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Constants.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultConnectionInfo.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultHttpContext.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultHttpRequest.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultHttpResponse.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/DefaultWebSocketManager.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/Authentication/HttpAuthenticationFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/DefaultSessionFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/FormFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/FormFile.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpRequestFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpRequestIdentifierFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpRequestLifetimeFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/HttpResponseFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IFormFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IItemsFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IQueryFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IRequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/IServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/ItemsFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/QueryFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/RequestCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/ResponseCookiesFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/ServiceProvidersFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Features/TlsConnectionFeature.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/FormCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/FormFileCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/HeaderDictionary.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/HttpContextAccessor.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/HttpContextFactory.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ItemsDictionary.cs (100%) rename src/{Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj => Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj} (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ParsingHelpers.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/QueryCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ReferenceReadStream.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/RequestCookieCollection.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/ResponseCookies.cs (100%) rename src/{Microsoft.AspNet.Http => Microsoft.AspNetCore.Http}/project.json (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/DictionaryStringArrayWrapper.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/DictionaryStringValuesWrapper.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/IOwinEnvironmentFeature.cs (100%) rename src/{Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj => Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj} (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinConstants.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinEnvironment.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinEnvironmentFeature.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinExtensions.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/OwinFeatureCollection.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/Utilities.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/OwinWebSocketAcceptAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/OwinWebSocketAcceptContext.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/OwinWebSocketAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/WebSocketAcceptAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/WebSockets/WebSocketAdapter.cs (100%) rename src/{Microsoft.AspNet.Owin => Microsoft.AspNetCore.Owin}/project.json (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/BufferedReadStream.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/FileBufferingReadStream.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/FormReader.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/HttpRequestStreamReader.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/HttpResponseStreamWriter.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/KeyValueAccumulator.cs (100%) rename src/{Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj => Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj} (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/MultipartReader.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/MultipartReaderStream.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/MultipartSection.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/QueryHelpers.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/ReasonPhrases.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/Resources.Designer.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/Resources.resx (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/StreamHelperExtensions.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/WebEncoders.cs (100%) rename src/{Microsoft.AspNet.WebUtilities => Microsoft.AspNetCore.WebUtilities}/project.json (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/HttpResponseWritingExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/MapPathMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/MapPredicateMiddlewareTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj => Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/PathStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/QueryStringTests.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/UseMiddlewareTest.cs (100%) rename test/{Microsoft.AspNet.Http.Abstractions.Tests => Microsoft.AspNetCore.Http.Abstractions.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/HeaderDictionaryTypeExtensionsTest.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj => Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/QueryBuilderTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/ResponseExtensionTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/SendFileResponseExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/UriHelperTests.cs (100%) rename test/{Microsoft.AspNet.Http.Extensions.Tests => Microsoft.AspNetCore.Http.Extensions.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/FeatureCollectionTests.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/IThing.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj => Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/Properties/AssemblyInfo.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/Thing.cs (100%) rename test/{Microsoft.AspNet.Http.Features.Tests => Microsoft.AspNetCore.Http.Features.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/ApplicationBuilderTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/Authentication/DefaultAuthenticationManagerTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/BufferingHelperTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/DefaultHttpContextTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/DefaultHttpRequestTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/DefaultHttpResponseTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/FormFeatureTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/HeaderDictionaryTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/HttpContextFactoryTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/HttpRequestIdentifierFeatureTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj => Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/QueryFeatureTests.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/ResponseCookiesTest.cs (100%) rename test/{Microsoft.AspNet.Http.Tests => Microsoft.AspNetCore.Http.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj => Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/OwinEnvironmentTests.cs (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/OwinExtensionTests.cs (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/OwinFeatureCollectionTests.cs (100%) rename test/{Microsoft.AspNet.Owin.Tests => Microsoft.AspNetCore.Owin.Tests}/project.json (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/HttpRequestStreamReaderTest.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/HttpResponseStreamWriterTest.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj => Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj} (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/MultipartReaderTests.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/QueryHelpersTests.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/WebEncodersTests.cs (100%) rename test/{Microsoft.AspNet.WebUtilities.Tests => Microsoft.AspNetCore.WebUtilities.Tests}/project.json (100%) diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationDescription.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationManager.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Authentication/AuthenticationProperties.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/ConnectionInfo.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/CookieOptions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapMiddleware.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapOptions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenMiddleware.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/MapWhenOptions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/RunExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/UseExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/FragmentString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HostString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpContext.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpRequest.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/HttpResponse.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IApplicationBuilder.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IFormCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IFormFile.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IFormFileCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IHttpContextAccessor.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IHttpContextFactory.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IQueryCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IRequestCookieCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/IResponseCookies.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegment.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Internal/HeaderSegmentCollection.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Internal/ParsingHelpers.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj b/src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Microsoft.AspNet.Http.Abstractions.xproj rename to src/Microsoft.AspNetCore.Http.Abstractions/Microsoft.AspNetCore.Http.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/PathString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Properties/Resources.Designer.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/QueryString.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/RequestDelegate.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/Resources.resx b/src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/Resources.resx rename to src/Microsoft.AspNetCore.Http.Abstractions/Resources.resx diff --git a/src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/StatusCodes.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/WebSocketManager.cs rename to src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Abstractions/project.json rename to src/Microsoft.AspNetCore.Http.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/HeaderDictionaryTypeExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj b/src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Microsoft.AspNet.Http.Extensions.xproj rename to src/Microsoft.AspNetCore.Http.Extensions/Microsoft.AspNetCore.Http.Extensions.xproj diff --git a/src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http.Extensions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/QueryBuilder.cs rename to src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/RequestHeaders.cs rename to src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/ResponseExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/ResponseHeaders.cs rename to src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/SendFileResponseExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/SessionExtensions.cs rename to src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/StreamCopyOperation.cs rename to src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/UriHelper.cs rename to src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs diff --git a/src/Microsoft.AspNet.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Extensions/project.json rename to src/Microsoft.AspNetCore.Http.Extensions/project.json diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/AuthenticateContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/ChallengeBehavior.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/ChallengeContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/DescribeSchemesContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/IAuthenticationHandler.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/IHttpAuthenticationFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/SignInContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Authentication/SignOutContext.cs rename to src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/FeatureCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReference.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/FeatureReference.cs rename to src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs diff --git a/src/Microsoft.AspNet.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/FeatureReferences.cs rename to src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs diff --git a/src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IFeatureCollection.cs rename to src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHeaderDictionary.cs rename to src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpBufferingFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpRequestFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpRequestIdentifierFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpResponseFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpSendFileFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpUpgradeFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/IHttpWebSocketFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ISession.cs rename to src/Microsoft.AspNetCore.Http.Features/ISession.cs diff --git a/src/Microsoft.AspNet.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ISessionFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ITlsConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/ITlsTokenBindingFeature.cs rename to src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs diff --git a/src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj b/src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Microsoft.AspNet.Http.Features.xproj rename to src/Microsoft.AspNetCore.Http.Features/Microsoft.AspNetCore.Http.Features.xproj diff --git a/src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http.Features/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http.Features/WebSocketAcceptContext.cs rename to src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Http.Features/project.json b/src/Microsoft.AspNetCore.Http.Features/project.json similarity index 100% rename from src/Microsoft.AspNet.Http.Features/project.json rename to src/Microsoft.AspNetCore.Http.Features/project.json diff --git a/src/Microsoft.AspNet.Http/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ApplicationBuilder.cs rename to src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs diff --git a/src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Authentication/DefaultAuthenticationManager.cs rename to src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs diff --git a/src/Microsoft.AspNet.Http/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs similarity index 100% rename from src/Microsoft.AspNet.Http/BufferingHelper.cs rename to src/Microsoft.AspNetCore.Http/BufferingHelper.cs diff --git a/src/Microsoft.AspNet.Http/Constants.cs b/src/Microsoft.AspNetCore.Http/Constants.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Constants.cs rename to src/Microsoft.AspNetCore.Http/Constants.cs diff --git a/src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultConnectionInfo.cs rename to src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs diff --git a/src/Microsoft.AspNet.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultHttpContext.cs rename to src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs diff --git a/src/Microsoft.AspNet.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultHttpRequest.cs rename to src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs diff --git a/src/Microsoft.AspNet.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultHttpResponse.cs rename to src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs diff --git a/src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs similarity index 100% rename from src/Microsoft.AspNet.Http/DefaultWebSocketManager.cs rename to src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs diff --git a/src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/Authentication/HttpAuthenticationFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/DefaultSessionFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/FormFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/FormFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/FormFile.cs b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/FormFile.cs rename to src/Microsoft.AspNetCore.Http/Features/FormFile.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpRequestFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpRequestIdentifierFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpRequestLifetimeFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/HttpResponseFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IFormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IFormFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IItemsFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IQueryFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IRequestCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IResponseCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/IServiceProvidersFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/ItemsFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/QueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/QueryFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/RequestCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/ResponseCookiesFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/ServiceProvidersFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs diff --git a/src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Features/TlsConnectionFeature.cs rename to src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs diff --git a/src/Microsoft.AspNet.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/FormCollection.cs rename to src/Microsoft.AspNetCore.Http/FormCollection.cs diff --git a/src/Microsoft.AspNet.Http/FormFileCollection.cs b/src/Microsoft.AspNetCore.Http/FormFileCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/FormFileCollection.cs rename to src/Microsoft.AspNetCore.Http/FormFileCollection.cs diff --git a/src/Microsoft.AspNet.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HeaderDictionary.cs rename to src/Microsoft.AspNetCore.Http/HeaderDictionary.cs diff --git a/src/Microsoft.AspNet.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpContextAccessor.cs rename to src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs diff --git a/src/Microsoft.AspNet.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Http/HttpContextFactory.cs rename to src/Microsoft.AspNetCore.Http/HttpContextFactory.cs diff --git a/src/Microsoft.AspNet.Http/ItemsDictionary.cs b/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ItemsDictionary.cs rename to src/Microsoft.AspNetCore.Http/ItemsDictionary.cs diff --git a/src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj b/src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj similarity index 100% rename from src/Microsoft.AspNet.Http/Microsoft.AspNet.Http.xproj rename to src/Microsoft.AspNetCore.Http/Microsoft.AspNetCore.Http.xproj diff --git a/src/Microsoft.AspNet.Http/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ParsingHelpers.cs rename to src/Microsoft.AspNetCore.Http/ParsingHelpers.cs diff --git a/src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Http/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Http/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Http/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/QueryCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/QueryCollection.cs rename to src/Microsoft.AspNetCore.Http/QueryCollection.cs diff --git a/src/Microsoft.AspNet.Http/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ReferenceReadStream.cs rename to src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs diff --git a/src/Microsoft.AspNet.Http/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Http/RequestCookieCollection.cs rename to src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs diff --git a/src/Microsoft.AspNet.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs similarity index 100% rename from src/Microsoft.AspNet.Http/ResponseCookies.cs rename to src/Microsoft.AspNetCore.Http/ResponseCookies.cs diff --git a/src/Microsoft.AspNet.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json similarity index 100% rename from src/Microsoft.AspNet.Http/project.json rename to src/Microsoft.AspNetCore.Http/project.json diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/DictionaryStringArrayWrapper.cs rename to src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs diff --git a/src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/DictionaryStringValuesWrapper.cs rename to src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs diff --git a/src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/IOwinEnvironmentFeature.cs rename to src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj b/src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj similarity index 100% rename from src/Microsoft.AspNet.Owin/Microsoft.AspNet.Owin.xproj rename to src/Microsoft.AspNetCore.Owin/Microsoft.AspNetCore.Owin.xproj diff --git a/src/Microsoft.AspNet.Owin/OwinConstants.cs b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinConstants.cs rename to src/Microsoft.AspNetCore.Owin/OwinConstants.cs diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinEnvironment.cs rename to src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs diff --git a/src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinEnvironmentFeature.cs rename to src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs diff --git a/src/Microsoft.AspNet.Owin/OwinExtensions.cs b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinExtensions.cs rename to src/Microsoft.AspNetCore.Owin/OwinExtensions.cs diff --git a/src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/OwinFeatureCollection.cs rename to src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs diff --git a/src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Owin/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Owin/Utilities.cs b/src/Microsoft.AspNetCore.Owin/Utilities.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/Utilities.cs rename to src/Microsoft.AspNetCore.Owin/Utilities.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAcceptContext.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/OwinWebSocketAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/WebSocketAcceptAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs similarity index 100% rename from src/Microsoft.AspNet.Owin/WebSockets/WebSocketAdapter.cs rename to src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs diff --git a/src/Microsoft.AspNet.Owin/project.json b/src/Microsoft.AspNetCore.Owin/project.json similarity index 100% rename from src/Microsoft.AspNet.Owin/project.json rename to src/Microsoft.AspNetCore.Owin/project.json diff --git a/src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/BufferedReadStream.cs rename to src/Microsoft.AspNetCore.WebUtilities/BufferedReadStream.cs diff --git a/src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs b/src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/FileBufferingReadStream.cs rename to src/Microsoft.AspNetCore.WebUtilities/FileBufferingReadStream.cs diff --git a/src/Microsoft.AspNet.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/FormReader.cs rename to src/Microsoft.AspNetCore.WebUtilities/FormReader.cs diff --git a/src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/HttpRequestStreamReader.cs rename to src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs diff --git a/src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/HttpResponseStreamWriter.cs rename to src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs diff --git a/src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/KeyValueAccumulator.cs rename to src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj b/src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Microsoft.AspNet.WebUtilities.xproj rename to src/Microsoft.AspNetCore.WebUtilities/Microsoft.AspNetCore.WebUtilities.xproj diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/MultipartReader.cs rename to src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/MultipartReaderStream.cs rename to src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs diff --git a/src/Microsoft.AspNet.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/MultipartSection.cs rename to src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.WebUtilities/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/QueryHelpers.cs rename to src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs diff --git a/src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/ReasonPhrases.cs rename to src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Resources.Designer.cs rename to src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs diff --git a/src/Microsoft.AspNet.WebUtilities/Resources.resx b/src/Microsoft.AspNetCore.WebUtilities/Resources.resx similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/Resources.resx rename to src/Microsoft.AspNetCore.WebUtilities/Resources.resx diff --git a/src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/StreamHelperExtensions.cs rename to src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs diff --git a/src/Microsoft.AspNet.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/WebEncoders.cs rename to src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs diff --git a/src/Microsoft.AspNet.WebUtilities/project.json b/src/Microsoft.AspNetCore.WebUtilities/project.json similarity index 100% rename from src/Microsoft.AspNet.WebUtilities/project.json rename to src/Microsoft.AspNetCore.WebUtilities/project.json diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/MapPathMiddlewareTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/Microsoft.AspNet.Http.Abstractions.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/Microsoft.AspNetCore.Http.Abstractions.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/PathStringTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/QueryStringTests.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/UseMiddlewareTest.cs rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs diff --git a/test/Microsoft.AspNet.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Abstractions.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj b/test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/Microsoft.AspNet.Http.Extensions.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/Microsoft.AspNetCore.Http.Extensions.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/QueryBuilderTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/ResponseExtensionTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/UriHelperTests.cs rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs diff --git a/test/Microsoft.AspNet.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Extensions.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/FeatureCollectionTests.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/IThing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/IThing.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj b/test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/Microsoft.AspNet.Http.Features.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Features.Tests/Microsoft.AspNetCore.Http.Features.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/Thing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/Thing.cs rename to test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs diff --git a/test/Microsoft.AspNet.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Features.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Features.Tests/project.json diff --git a/test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/ApplicationBuilderTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/BufferingHelperTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/DefaultHttpContextTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/DefaultHttpRequestTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/DefaultHttpResponseTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/FormFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/HeaderDictionaryTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/HttpContextFactoryTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/HttpRequestIdentifierFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj b/test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/Microsoft.AspNet.Http.Tests.xproj rename to test/Microsoft.AspNetCore.Http.Tests/Microsoft.AspNetCore.Http.Tests.xproj diff --git a/test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/QueryFeatureTests.cs rename to test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs diff --git a/test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/ResponseCookiesTest.cs rename to test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs diff --git a/test/Microsoft.AspNet.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Http.Tests/project.json rename to test/Microsoft.AspNetCore.Http.Tests/project.json diff --git a/test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj b/test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/Microsoft.AspNet.Owin.Tests.xproj rename to test/Microsoft.AspNetCore.Owin.Tests/Microsoft.AspNetCore.Owin.Tests.xproj diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/OwinEnvironmentTests.cs rename to test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/OwinExtensionTests.cs rename to test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs diff --git a/test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/OwinFeatureCollectionTests.cs rename to test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs diff --git a/test/Microsoft.AspNet.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Owin.Tests/project.json rename to test/Microsoft.AspNetCore.Owin.Tests/project.json diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/HttpRequestStreamReaderTest.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/HttpResponseStreamWriterTest.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj b/test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/Microsoft.AspNet.WebUtilities.Tests.xproj rename to test/Microsoft.AspNetCore.WebUtilities.Tests/Microsoft.AspNetCore.WebUtilities.Tests.xproj diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/MultipartReaderTests.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/QueryHelpersTests.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/WebEncodersTests.cs rename to test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs diff --git a/test/Microsoft.AspNet.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.WebUtilities.Tests/project.json rename to test/Microsoft.AspNetCore.WebUtilities.Tests/project.json From 02363da94eee7311e457e136dc45edf9c5ac3494 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 22 Jan 2016 12:20:40 -0800 Subject: [PATCH 0989/1838] Rename AspNet 5 file contents. See https://github.com/aspnet/Announcements/issues/144 for more information. --- HttpAbstractions.sln | 24 +++++++++---------- NuGetPackageVerifier.json | 12 +++++----- samples/SampleApp/PooledHttpContext.cs | 8 +++---- samples/SampleApp/PooledHttpContextFactory.cs | 6 ++--- samples/SampleApp/project.json | 4 ++-- .../AuthenticationDescription.cs | 2 +- .../Authentication/AuthenticationManager.cs | 4 ++-- .../AuthenticationProperties.cs | 2 +- .../ConnectionInfo.cs | 2 +- .../CookieOptions.cs | 2 +- .../Extensions/HeaderDictionaryExtensions.cs | 4 ++-- .../HttpResponseWritingExtensions.cs | 2 +- .../Extensions/MapExtensions.cs | 6 ++--- .../Extensions/MapMiddleware.cs | 4 ++-- .../Extensions/MapOptions.cs | 4 ++-- .../Extensions/MapWhenExtensions.cs | 6 ++--- .../Extensions/MapWhenMiddleware.cs | 4 ++-- .../Extensions/MapWhenOptions.cs | 4 ++-- .../Extensions/RunExtensions.cs | 4 ++-- .../Extensions/UseExtensions.cs | 4 ++-- .../Extensions/UseMiddlewareExtensions.cs | 6 ++--- .../FragmentString.cs | 2 +- .../HostString.cs | 2 +- .../HttpContext.cs | 6 ++--- .../HttpRequest.cs | 2 +- .../HttpResponse.cs | 2 +- .../IApplicationBuilder.cs | 6 ++--- .../IFormCollection.cs | 20 ++++++++-------- .../IFormFile.cs | 2 +- .../IFormFileCollection.cs | 2 +- .../IHttpContextAccessor.cs | 2 +- .../IHttpContextFactory.cs | 6 ++--- .../IQueryCollection.cs | 20 ++++++++-------- .../IRequestCookieCollection.cs | 20 ++++++++-------- .../IResponseCookies.cs | 2 +- .../Internal/HeaderSegment.cs | 4 ++-- .../Internal/HeaderSegmentCollection.cs | 2 +- .../Internal/ParsingHelpers.cs | 2 +- .../PathString.cs | 4 ++-- .../Properties/AssemblyInfo.cs | 2 +- .../Properties/Resources.Designer.cs | 4 ++-- .../QueryString.cs | 2 +- .../RequestDelegate.cs | 2 +- .../StatusCodes.cs | 2 +- .../WebSocketManager.cs | 2 +- .../project.json | 2 +- .../HeaderDictionaryTypeExtensions.cs | 4 ++-- .../QueryBuilder.cs | 2 +- .../RequestHeaders.cs | 2 +- .../ResponseExtensions.cs | 6 ++--- .../ResponseHeaders.cs | 4 ++-- .../SendFileResponseExtensions.cs | 6 ++--- .../SessionExtensions.cs | 4 ++-- .../StreamCopyOperation.cs | 2 +- .../UriHelper.cs | 2 +- .../project.json | 2 +- .../Authentication/AuthenticateContext.cs | 2 +- .../Authentication/ChallengeBehavior.cs | 2 +- .../Authentication/ChallengeContext.cs | 2 +- .../Authentication/DescribeSchemesContext.cs | 2 +- .../Authentication/IAuthenticationHandler.cs | 2 +- .../IHttpAuthenticationFeature.cs | 2 +- .../Authentication/SignInContext.cs | 2 +- .../Authentication/SignOutContext.cs | 2 +- .../FeatureCollection.cs | 2 +- .../FeatureReference.cs | 2 +- .../FeatureReferences.cs | 2 +- .../IFeatureCollection.cs | 2 +- .../IHeaderDictionary.cs | 2 +- .../IHttpBufferingFeature.cs | 2 +- .../IHttpConnectionFeature.cs | 2 +- .../IHttpRequestFeature.cs | 2 +- .../IHttpRequestIdentifierFeature.cs | 2 +- .../IHttpRequestLifetimeFeature.cs | 2 +- .../IHttpResponseFeature.cs | 2 +- .../IHttpSendFileFeature.cs | 2 +- .../IHttpUpgradeFeature.cs | 2 +- .../IHttpWebSocketFeature.cs | 2 +- .../ISession.cs | 2 +- .../ISessionFeature.cs | 2 +- .../ITlsConnectionFeature.cs | 2 +- .../ITlsTokenBindingFeature.cs | 2 +- .../WebSocketAcceptContext.cs | 4 ++-- .../ApplicationBuilder.cs | 8 +++---- .../DefaultAuthenticationManager.cs | 8 +++---- .../BufferingHelper.cs | 4 ++-- src/Microsoft.AspNetCore.Http/Constants.cs | 2 +- .../DefaultConnectionInfo.cs | 6 ++--- .../DefaultHttpContext.cs | 14 +++++------ .../DefaultHttpRequest.cs | 6 ++--- .../DefaultHttpResponse.cs | 6 ++--- .../DefaultWebSocketManager.cs | 4 ++-- .../HttpAuthenticationFeature.cs | 2 +- .../Features/DefaultSessionFeature.cs | 4 ++-- .../Features/FormFeature.cs | 6 ++--- .../Features/FormFile.cs | 4 ++-- .../Features/HttpConnectionFeature.cs | 2 +- .../Features/HttpRequestFeature.cs | 4 ++-- .../Features/HttpRequestIdentifierFeature.cs | 4 ++-- .../Features/HttpRequestLifetimeFeature.cs | 4 ++-- .../Features/HttpResponseFeature.cs | 4 ++-- .../Features/IFormFeature.cs | 2 +- .../Features/IItemsFeature.cs | 2 +- .../Features/IQueryFeature.cs | 2 +- .../Features/IRequestCookiesFeature.cs | 2 +- .../Features/IResponseCookiesFeature.cs | 2 +- .../Features/IServiceProvidersFeature.cs | 2 +- .../Features/ItemsFeature.cs | 4 ++-- .../Features/QueryFeature.cs | 6 ++--- .../Features/RequestCookiesFeature.cs | 4 ++-- .../Features/ResponseCookiesFeature.cs | 4 ++-- .../Features/ServiceProvidersFeature.cs | 2 +- .../Features/TlsConnectionFeature.cs | 2 +- .../FormCollection.cs | 16 ++++++------- .../FormFileCollection.cs | 2 +- .../HeaderDictionary.cs | 20 ++++++++-------- .../HttpContextAccessor.cs | 2 +- .../HttpContextFactory.cs | 6 ++--- .../ItemsDictionary.cs | 2 +- .../ParsingHelpers.cs | 2 +- .../QueryCollection.cs | 12 +++++----- .../ReferenceReadStream.cs | 2 +- .../RequestCookieCollection.cs | 4 ++-- .../ResponseCookies.cs | 2 +- src/Microsoft.AspNetCore.Http/project.json | 4 ++-- .../DictionaryStringArrayWrapper.cs | 4 ++-- .../DictionaryStringValuesWrapper.cs | 4 ++-- .../IOwinEnvironmentFeature.cs | 2 +- .../OwinConstants.cs | 2 +- .../OwinEnvironment.cs | 12 +++++----- .../OwinEnvironmentFeature.cs | 2 +- .../OwinExtensions.cs | 12 +++++----- .../OwinFeatureCollection.cs | 8 +++---- src/Microsoft.AspNetCore.Owin/Utilities.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptAdapter.cs | 4 ++-- .../WebSockets/OwinWebSocketAcceptContext.cs | 4 ++-- .../WebSockets/OwinWebSocketAdapter.cs | 2 +- .../WebSockets/WebSocketAcceptAdapter.cs | 4 ++-- .../WebSockets/WebSocketAdapter.cs | 2 +- src/Microsoft.AspNetCore.Owin/project.json | 2 +- .../BufferedReadStream.cs | 2 +- .../FileBufferingReadStream.cs | 2 +- .../FormReader.cs | 2 +- .../HttpRequestStreamReader.cs | 4 ++-- .../HttpResponseStreamWriter.cs | 4 ++-- .../KeyValueAccumulator.cs | 2 +- .../MultipartReader.cs | 2 +- .../MultipartReaderStream.cs | 2 +- .../MultipartSection.cs | 2 +- .../QueryHelpers.cs | 2 +- .../ReasonPhrases.cs | 2 +- .../Resources.Designer.cs | 6 ++--- .../StreamHelperExtensions.cs | 2 +- .../WebEncoders.cs | 2 +- .../HttpResponseWritingExtensionsTests.cs | 4 ++-- .../MapPathMiddlewareTests.cs | 8 +++---- .../MapPredicateMiddlewareTests.cs | 8 +++---- .../PathStringTests.cs | 4 ++-- .../QueryStringTests.cs | 6 ++--- .../UseMiddlewareTest.cs | 10 ++++---- .../project.json | 4 ++-- .../HeaderDictionaryTypeExtensionsTest.cs | 4 ++-- .../QueryBuilderTests.cs | 2 +- .../ResponseExtensionTests.cs | 6 ++--- .../SendFileResponseExtensionsTests.cs | 6 ++--- .../UriHelperTests.cs | 6 ++--- .../project.json | 4 ++-- .../FeatureCollectionTests.cs | 2 +- .../IThing.cs | 2 +- .../Properties/AssemblyInfo.cs | 4 ++-- .../Thing.cs | 2 +- .../project.json | 2 +- .../ApplicationBuilderTests.cs | 4 ++-- .../DefaultAuthenticationManagerTests.cs | 12 +++++----- .../BufferingHelperTests.cs | 2 +- .../DefaultHttpContextTests.cs | 8 +++---- .../DefaultHttpRequestTests.cs | 4 ++-- .../DefaultHttpResponseTests.cs | 4 ++-- .../FormFeatureTests.cs | 6 ++--- .../HeaderDictionaryTests.cs | 2 +- .../HttpContextFactoryTests.cs | 6 ++--- .../HttpRequestIdentifierFeatureTests.cs | 6 ++--- .../QueryFeatureTests.cs | 2 +- .../ResponseCookiesTest.cs | 6 ++--- .../project.json | 2 +- .../OwinEnvironmentTests.cs | 6 ++--- .../OwinExtensionTests.cs | 6 ++--- .../OwinFeatureCollectionTests.cs | 4 ++-- .../project.json | 4 ++-- .../HttpRequestStreamReaderTest.cs | 4 ++-- .../HttpResponseStreamWriterTest.cs | 4 ++-- .../MultipartReaderTests.cs | 2 +- .../QueryHelpersTests.cs | 2 +- .../WebEncodersTests.cs | 2 +- .../project.json | 2 +- 195 files changed, 407 insertions(+), 407 deletions(-) diff --git a/HttpAbstractions.sln b/HttpAbstractions.sln index e510c8c96e..49ac64ba4f 100644 --- a/HttpAbstractions.sln +++ b/HttpAbstractions.sln @@ -6,29 +6,29 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A5A15F1C-885 EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{F31FF137-390C-49BF-A3BD-7C6ED3597C21}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http", "src\Microsoft.AspNet.Http\Microsoft.AspNet.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http", "src\Microsoft.AspNetCore.Http\Microsoft.AspNetCore.Http.xproj", "{BCF0F967-8753-4438-BD07-AADCA9CE509A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions", "src\Microsoft.AspNet.Http.Abstractions\Microsoft.AspNet.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Abstractions", "src\Microsoft.AspNetCore.Http.Abstractions\Microsoft.AspNetCore.Http.Abstractions.xproj", "{22071333-15BA-4D16-A1D5-4D5B1A83FBDD}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features", "src\Microsoft.AspNet.Http.Features\Microsoft.AspNet.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Features", "src\Microsoft.AspNetCore.Http.Features\Microsoft.AspNetCore.Http.Features.xproj", "{D9128247-8F97-48B8-A863-F1F21A029FCE}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Tests", "test\Microsoft.AspNet.Http.Tests\Microsoft.AspNet.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Tests", "test\Microsoft.AspNetCore.Http.Tests\Microsoft.AspNetCore.Http.Tests.xproj", "{AA99AF26-F7B1-4A6B-A922-5C25539F6391}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Features.Tests", "test\Microsoft.AspNet.Http.Features.Tests\Microsoft.AspNet.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Features.Tests", "test\Microsoft.AspNetCore.Http.Features.Tests\Microsoft.AspNetCore.Http.Features.Tests.xproj", "{C5D2BAE1-E182-48A0-AA74-1AF14B782BF7}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Abstractions.Tests", "test\Microsoft.AspNet.Http.Abstractions.Tests\Microsoft.AspNet.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Abstractions.Tests", "test\Microsoft.AspNetCore.Http.Abstractions.Tests\Microsoft.AspNetCore.Http.Abstractions.Tests.xproj", "{F16692B8-9F38-4DCA-A582-E43172B989C6}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin", "src\Microsoft.AspNet.Owin\Microsoft.AspNet.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Owin", "src\Microsoft.AspNetCore.Owin\Microsoft.AspNetCore.Owin.xproj", "{59BED991-F207-48ED-B24C-0A1D9C986C01}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Owin.Tests", "test\Microsoft.AspNet.Owin.Tests\Microsoft.AspNet.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Owin.Tests", "test\Microsoft.AspNetCore.Owin.Tests\Microsoft.AspNetCore.Owin.Tests.xproj", "{16219571-3268-4D12-8689-12B7163DBA13}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions", "src\Microsoft.AspNet.Http.Extensions\Microsoft.AspNet.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Extensions", "src\Microsoft.AspNetCore.Http.Extensions\Microsoft.AspNetCore.Http.Extensions.xproj", "{CCC4363E-81E2-4058-94DD-00494E9E992A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Http.Extensions.Tests", "test\Microsoft.AspNet.Http.Extensions.Tests\Microsoft.AspNet.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Http.Extensions.Tests", "test\Microsoft.AspNetCore.Http.Extensions.Tests\Microsoft.AspNetCore.Http.Extensions.Tests.xproj", "{AE25EF21-7F91-4B86-B73E-AF746821D339}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities", "src\Microsoft.AspNet.WebUtilities\Microsoft.AspNet.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebUtilities", "src\Microsoft.AspNetCore.WebUtilities\Microsoft.AspNetCore.WebUtilities.xproj", "{A2FB7838-0031-4FAD-BA3E-83C30B3AF406}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.WebUtilities.Tests", "test\Microsoft.AspNet.WebUtilities.Tests\Microsoft.AspNet.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.WebUtilities.Tests", "test\Microsoft.AspNetCore.WebUtilities.Tests\Microsoft.AspNetCore.WebUtilities.Tests.xproj", "{93C10E50-BCBB-4D8E-9492-D46E1396225B}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.xproj", "{60AA2FDB-8121-4826-8D00-9A143FEFAF66}" EndProject diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index adea61d7de..647f42bb4f 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -9,12 +9,12 @@ "StrictSemanticVersionValidationRule" ], "packages": { - "Microsoft.AspNet.Http": { }, - "Microsoft.AspNet.Http.Abstractions": { }, - "Microsoft.AspNet.Http.Extensions": { }, - "Microsoft.AspNet.Http.Features": { }, - "Microsoft.AspNet.Owin": { }, - "Microsoft.AspNet.WebUtilities": { }, + "Microsoft.AspNetCore.Http": { }, + "Microsoft.AspNetCore.Http.Abstractions": { }, + "Microsoft.AspNetCore.Http.Extensions": { }, + "Microsoft.AspNetCore.Http.Features": { }, + "Microsoft.AspNetCore.Owin": { }, + "Microsoft.AspNetCore.WebUtilities": { }, "Microsoft.Net.Http.Headers": { } } }, diff --git a/samples/SampleApp/PooledHttpContext.cs b/samples/SampleApp/PooledHttpContext.cs index 7736085eac..57b5f0e52b 100644 --- a/samples/SampleApp/PooledHttpContext.cs +++ b/samples/SampleApp/PooledHttpContext.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; namespace SampleApp { diff --git a/samples/SampleApp/PooledHttpContextFactory.cs b/samples/SampleApp/PooledHttpContextFactory.cs index 62955d90f8..6128e4ff49 100644 --- a/samples/SampleApp/PooledHttpContextFactory.cs +++ b/samples/SampleApp/PooledHttpContextFactory.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; namespace SampleApp { diff --git a/samples/SampleApp/project.json b/samples/SampleApp/project.json index b3b5f51ed7..94e788f9ad 100644 --- a/samples/SampleApp/project.json +++ b/samples/SampleApp/project.json @@ -1,8 +1,8 @@ -{ +{ "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*" + "Microsoft.AspNetCore.Http": "1.0.0-*" }, "commands": { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs index d1f39811ea..fb0a073f0b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationDescription.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNetCore.Http.Authentication { /// /// Contains information describing an authentication provider. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs index 687e1c7474..b787a1ed28 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationManager.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNetCore.Http.Authentication { public abstract class AuthenticationManager { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs index b4d327914f..6e883efb7e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Authentication/AuthenticationProperties.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Globalization; -namespace Microsoft.AspNet.Http.Authentication +namespace Microsoft.AspNetCore.Http.Authentication { /// /// Dictionary used to store state values about the authentication session. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs index fdb908a6c6..08c4108609 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/ConnectionInfo.cs @@ -6,7 +6,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public abstract class ConnectionInfo { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs index 5cf29be6a2..50604ae8a7 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/CookieOptions.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Options used to create a new cookie. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs index 6a8d909dba..79da20b342 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HeaderDictionaryExtensions.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class HeaderDictionaryExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs index fd0553b3c0..0b24a7d4f4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/HttpResponseWritingExtensions.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Convenience methods for writing to the response. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs index c06c37563a..448e2c6f6d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapExtensions.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder.Extensions; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for the . diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs index 1c66aea8e0..9d286d39d4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapMiddleware.cs @@ -3,9 +3,9 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Respresents a middleware that maps a request path to a sub-request pipeline. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs index dc16d15482..60adc74379 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapOptions.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Options for the . diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs index 7bd658460e..946379df26 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenExtensions.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Builder.Extensions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Builder.Extensions; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { using Predicate = Func; diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs index 26ba9f0d81..b012626ba9 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenMiddleware.cs @@ -3,9 +3,9 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Respresents a middleware that runs a sub-request pipeline when a given predicate is matched. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs index 9b430b2d4d..d18eb7f257 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/MapWhenOptions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { /// /// Options for the . diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs index 42c99925ad..328c490c9e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/RunExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for adding terminal middleware. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs index 163dcfd19f..d8791b8675 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseExtensions.cs @@ -3,9 +3,9 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for adding middleware. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs index 628b0365e6..75f61ce5d4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Extensions/UseMiddlewareExtensions.cs @@ -6,11 +6,11 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Abstractions; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Abstractions; using Microsoft.Extensions.Internal; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Extension methods for adding typed middlware. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs index 87b22df243..3131191a1e 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/FragmentString.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides correct handling for FragmentString value when needed to generate a URI string diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs index 75b56092fc..f767255b1f 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HostString.cs @@ -4,7 +4,7 @@ using System; using System.Globalization; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the host portion of a URI can be used to construct URI's properly formatted and encoded for use in diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs index f639a4dd9d..4aeac2be9c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpContext.cs @@ -5,10 +5,10 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Authentication; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Encapsulates all HTTP-specific information about an individual HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs index a13a78e600..7dd22d19f2 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpRequest.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the incoming side of an individual HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs index 1e3344459c..0276fb626c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/HttpResponse.cs @@ -5,7 +5,7 @@ using System; using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the outgoing side of an individual HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs index be0faecbc8..ece1f75d8b 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IApplicationBuilder.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { /// /// Defines a class that provides the mechanisms to configure an application's request pipeline. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs index 55d4a578bc..668afa61a8 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the parsed form values sent with the HttpRequest. @@ -12,32 +12,32 @@ namespace Microsoft.AspNet.Http public interface IFormCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// /// Gets an containing the keys of the - /// . + /// . /// /// /// An containing the keys of the object - /// that implements . + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// /// @@ -58,7 +58,7 @@ namespace Microsoft.AspNet.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// /// @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs index eca4d6a20b..871ca0efe4 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFile.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents a file sent with the HttpRequest. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs index 229b7bbb8e..e66c96e05d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IFormFileCollection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the collection of files sent with the HttpRequest. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs index 8f4046da2b..dc8ec34a7c 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextAccessor.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public interface IHttpContextAccessor { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs index cdeb2ce223..7d049626c3 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IHttpContextFactory.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public interface IHttpContextFactory { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs index 4bed287e38..48d8448b58 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IQueryCollection.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the HttpRequest query string collection @@ -12,32 +12,32 @@ namespace Microsoft.AspNet.Http public interface IQueryCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// /// Gets an containing the keys of the - /// . + /// . /// /// /// An containing the keys of the object - /// that implements . + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// /// @@ -58,7 +58,7 @@ namespace Microsoft.AspNet.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// /// @@ -79,7 +79,7 @@ namespace Microsoft.AspNet.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return StringValues.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs index 5cc028b182..7fffe314fe 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IRequestCookieCollection.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents the HttpRequest cookie collection @@ -11,32 +11,32 @@ namespace Microsoft.AspNet.Http public interface IRequestCookieCollection : IEnumerable> { /// - /// Gets the number of elements contained in the . + /// Gets the number of elements contained in the . /// /// - /// The number of elements contained in the . + /// The number of elements contained in the . /// int Count { get; } /// /// Gets an containing the keys of the - /// . + /// . /// /// /// An containing the keys of the object - /// that implements . + /// that implements . /// ICollection Keys { get; } /// - /// Determines whether the contains an element + /// Determines whether the contains an element /// with the specified key. /// /// - /// The key to locate in the . + /// The key to locate in the . /// /// - /// true if the contains an element with + /// true if the contains an element with /// the key; otherwise, false. /// /// @@ -57,7 +57,7 @@ namespace Microsoft.AspNet.Http /// This parameter is passed uninitialized. /// /// - /// true if the object that implements contains + /// true if the object that implements contains /// an element with the specified key; otherwise, false. /// /// @@ -78,7 +78,7 @@ namespace Microsoft.AspNet.Http /// key is null. /// /// - /// has a different indexer contract than + /// has a different indexer contract than /// , as it will return String.Empty for missing entries /// rather than throwing an Exception. /// diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs b/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs index fb2528dc36..dd8696f358 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/IResponseCookies.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs index acd3a9ade1..a1234ff61a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegment.cs @@ -1,11 +1,11 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs index 693bce0caf..4ef781990a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/HeaderSegmentCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegmentCollection : IEnumerable, IEquatable { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs index 78b7fcd769..7cac98cf3d 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Internal/ParsingHelpers.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal static class ParsingHelpers { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs index 123fba4f48..9565c361ab 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/PathString.cs @@ -3,9 +3,9 @@ using System; using System.Text.Encodings.Web; -using Microsoft.AspNet.Http.Abstractions; +using Microsoft.AspNetCore.Http.Abstractions; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides correct escaping for Path and PathBase values when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs index 818ea5b97b..6f39c4b2d6 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/AssemblyInfo.cs @@ -6,5 +6,5 @@ using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Http.Abstractions.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: NeutralResourcesLanguage("en-us")] \ No newline at end of file diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs index 99f5b6bea3..438644852a 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/Properties/Resources.Designer.cs @@ -1,5 +1,5 @@ // -namespace Microsoft.AspNet.Http.Abstractions +namespace Microsoft.AspNetCore.Http.Abstractions { using System.Globalization; using System.Reflection; @@ -8,7 +8,7 @@ namespace Microsoft.AspNet.Http.Abstractions internal static class Resources { private static readonly ResourceManager _resourceManager - = new ResourceManager("Microsoft.AspNet.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); + = new ResourceManager("Microsoft.AspNetCore.Http.Abstractions.Resources", typeof(Resources).GetTypeInfo().Assembly); /// /// '{0}' is not available. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs index 336266e5aa..9b2fe702d0 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/QueryString.cs @@ -7,7 +7,7 @@ using System.Text; using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides correct handling for QueryString value when needed to reconstruct a request or redirect URI string diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs b/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs index b34b6ed86d..aecf353b29 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/RequestDelegate.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// A function that can process an HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs index ca0d903d87..9c0f4999ce 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/StatusCodes.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class StatusCodes { diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs b/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs index e569e549b9..79afefa5c0 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs +++ b/src/Microsoft.AspNetCore.Http.Abstractions/WebSocketManager.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Manages the establishment of WebSocket connections for a specific HTTP request. diff --git a/src/Microsoft.AspNetCore.Http.Abstractions/project.json b/src/Microsoft.AspNetCore.Http.Abstractions/project.json index cf571cfed3..95ff47a821 100644 --- a/src/Microsoft.AspNetCore.Http.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Http.Abstractions/project.json @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "Microsoft.Extensions.ActivatorUtilities.Sources": { "type": "build", "version": "1.0.0-*" diff --git a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs index cd8d26ca25..2f9c570d67 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/HeaderDictionaryTypeExtensions.cs @@ -5,11 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; -using Microsoft.AspNet.Http.Headers; +using Microsoft.AspNetCore.Http.Headers; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class HeaderDictionaryTypeExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs b/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs index ec4ae68fec..e9feb391b1 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/QueryBuilder.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using System.Text; using System.Text.Encodings.Web; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { // The IEnumerable interface is required for the collection initialization syntax: new QueryBuilder() { { "key", "value" } }; public class QueryBuilder : IEnumerable> diff --git a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs index 59265fbf08..2830e6147d 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/RequestHeaders.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Headers +namespace Microsoft.AspNetCore.Http.Headers { public class RequestHeaders { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs index ea00f14d5c..6c5d92a7af 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/ResponseExtensions.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class ResponseExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs index 931b2d931d..acdd662d2f 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/ResponseHeaders.cs @@ -3,10 +3,10 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Extensions; +using Microsoft.AspNetCore.Http.Extensions; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Headers +namespace Microsoft.AspNetCore.Http.Headers { public class ResponseHeaders { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs index 747e91096e..6058eb9a18 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SendFileResponseExtensions.cs @@ -5,10 +5,10 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Extensions; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Provides extensions for HttpResponse exposing the SendFile extension. diff --git a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs index b2908aed80..859e6c3715 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/SessionExtensions.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Text; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public static class SessionExtensions { diff --git a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs index a59aed1f0a..c42661a167 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/StreamCopyOperation.cs @@ -8,7 +8,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { // FYI: In most cases the source will be a FileStream and the destination will be to the network. public static class StreamCopyOperation diff --git a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs index f121ffa1d6..e7a7eb20a5 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs +++ b/src/Microsoft.AspNetCore.Http.Extensions/UriHelper.cs @@ -4,7 +4,7 @@ using System; using System.Text; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { /// /// A helper class for constructing encoded Uris for use in headers and other Uris. diff --git a/src/Microsoft.AspNetCore.Http.Extensions/project.json b/src/Microsoft.AspNetCore.Http.Extensions/project.json index 8aa5deacf7..f38f4a0f48 100644 --- a/src/Microsoft.AspNetCore.Http.Extensions/project.json +++ b/src/Microsoft.AspNetCore.Http.Extensions/project.json @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*", "System.Buffers": "4.0.0-*" }, diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs index 187c372fad..21aaf5b428 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/AuthenticateContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class AuthenticateContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs index 1be42f700b..549d51132a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeBehavior.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public enum ChallengeBehavior { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs index 5989ab4245..c0fe470806 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/ChallengeContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class ChallengeContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs index 251d9dfb8c..b25c2c979a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/DescribeSchemesContext.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class DescribeSchemesContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs index 155cd87380..3b72364182 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/IAuthenticationHandler.cs @@ -3,7 +3,7 @@ using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public interface IAuthenticationHandler { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs index 0c76210a26..080ce40574 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/IHttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public interface IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs index 08591ffa82..f04dade51b 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignInContext.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class SignInContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs index ea89cf9f31..c752f057df 100644 --- a/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/Authentication/SignOutContext.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Authentication +namespace Microsoft.AspNetCore.Http.Features.Authentication { public class SignOutContext { diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs index 79e6916752..e79ecfee22 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class FeatureCollection : IFeatureCollection { diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs index 538297a3a0..5016602123 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReference.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public struct FeatureReference { diff --git a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs index 30d7c3638f..f69094c252 100644 --- a/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs +++ b/src/Microsoft.AspNetCore.Http.Features/FeatureReferences.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public struct FeatureReferences { diff --git a/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs b/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs index 454cafa3dc..f7b23ed16f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IFeatureCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { /// /// Represents a collection of HTTP features. diff --git a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs index 303ff36bcb..674e2bda94 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHeaderDictionary.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { /// /// Represents HttpRequest and HttpResponse headers diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs index 947e77782b..fae7f3d0ff 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpBufferingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpBufferingFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs index 5eca86f433..ac30742af8 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs index 988f2b6194..4b52060177 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestFeature.cs @@ -3,7 +3,7 @@ using System.IO; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpRequestFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs index 163988d832..9b0b5201d7 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestIdentifierFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { /// /// Feature to identify a request. diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs index e007c4a818..3a93c3d1e5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpRequestLifetimeFeature.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs index 67cfa28333..8ea43d61fd 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpResponseFeature.cs @@ -5,7 +5,7 @@ using System; using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpResponseFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs index 328d901903..0776034e43 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpSendFileFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpSendFileFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs index 77d4ffa501..e98065bc4d 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpUpgradeFeature.cs @@ -4,7 +4,7 @@ using System.IO; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpUpgradeFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs index 674161abc1..49b28bc38f 100644 --- a/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/IHttpWebSocketFeature.cs @@ -4,7 +4,7 @@ using System.Net.WebSockets; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IHttpWebSocketFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ISession.cs b/src/Microsoft.AspNetCore.Http.Features/ISession.cs index 058853ffc9..fc729b5bff 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISession.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISession.cs @@ -4,7 +4,7 @@ using System.Collections.Generic; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface ISession { diff --git a/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs index 4406b8809f..2365299415 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ISessionFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface ISessionFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs index f5d786f8b4..c34a3339d5 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ITlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface ITlsConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs b/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs index 7b8535eb72..d63333dd0a 100644 --- a/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs +++ b/src/Microsoft.AspNetCore.Http.Features/ITlsTokenBindingFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { /// /// Provides information regarding TLS token binding parameters. diff --git a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs index 1bc7c2e470..b2627f5575 100644 --- a/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.Http.Features/WebSocketAcceptContext.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class WebSocketAcceptContext { diff --git a/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs b/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs index e6164af576..a0315ee539 100644 --- a/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs +++ b/src/Microsoft.AspNetCore.Http/ApplicationBuilder.cs @@ -5,11 +5,11 @@ using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Builder.Internal +namespace Microsoft.AspNetCore.Builder.Internal { public class ApplicationBuilder : IApplicationBuilder { diff --git a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs index 0c8db87453..5933db0497 100644 --- a/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs +++ b/src/Microsoft.AspNetCore.Http/Authentication/DefaultAuthenticationManager.cs @@ -6,11 +6,11 @@ using System.Collections.Generic; using System.Linq; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -namespace Microsoft.AspNet.Http.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Authentication.Internal { public class DefaultAuthenticationManager : AuthenticationManager { diff --git a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs index 03c3db188f..80f95ecbf1 100644 --- a/src/Microsoft.AspNetCore.Http/BufferingHelper.cs +++ b/src/Microsoft.AspNetCore.Http/BufferingHelper.cs @@ -3,9 +3,9 @@ using System; using System.IO; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.WebUtilities; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public static class BufferingHelper { diff --git a/src/Microsoft.AspNetCore.Http/Constants.cs b/src/Microsoft.AspNetCore.Http/Constants.cs index 9ae305ddf4..0d52a692d3 100644 --- a/src/Microsoft.AspNetCore.Http/Constants.cs +++ b/src/Microsoft.AspNetCore.Http/Constants.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal static class Constants { diff --git a/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs b/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs index 693755aeda..35c8c584a7 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultConnectionInfo.cs @@ -5,10 +5,10 @@ using System.Net; using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultConnectionInfo : ConnectionInfo { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs index 9cc4211c9f..5d0424cf7c 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpContext.cs @@ -5,14 +5,14 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.Http.Authentication; -using Microsoft.AspNet.Http.Authentication.Internal; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Authentication; +using Microsoft.AspNetCore.Http.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features.Internal; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpContext : HttpContext { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs index 5d3a2875f5..f133c993a0 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpRequest.cs @@ -5,11 +5,11 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpRequest : HttpRequest { diff --git a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs index a9cb49cbdf..0676913d62 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultHttpResponse.cs @@ -4,11 +4,11 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpResponse : HttpResponse { diff --git a/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs b/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs index 8beff4db9a..fe5f859dc4 100644 --- a/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs +++ b/src/Microsoft.AspNetCore.Http/DefaultWebSocketManager.cs @@ -5,10 +5,10 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultWebSocketManager : WebSocketManager { diff --git a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs index 92713e1c87..f3fd228853 100644 --- a/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/Authentication/HttpAuthenticationFeature.cs @@ -3,7 +3,7 @@ using System.Security.Claims; -namespace Microsoft.AspNet.Http.Features.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Features.Authentication.Internal { public class HttpAuthenticationFeature : IHttpAuthenticationFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs index 041794c7b5..374e4dcd68 100644 --- a/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/DefaultSessionFeature.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { /// /// This type exists only for the purpose of unit testing where the user can directly set the diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs index 198924ba06..004e2892ce 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFeature.cs @@ -6,11 +6,11 @@ using System.IO; using System.Text; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.WebUtilities; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFeature : IFormFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs index f9e4bfc539..72335cdb62 100644 --- a/src/Microsoft.AspNetCore.Http/Features/FormFile.cs +++ b/src/Microsoft.AspNetCore.Http/Features/FormFile.cs @@ -4,9 +4,9 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFile : IFormFile { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs index 1988301e33..05fc485c03 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpConnectionFeature.cs @@ -3,7 +3,7 @@ using System.Net; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpConnectionFeature : IHttpConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs index de48b71b8a..b85484b879 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpRequestFeature : IHttpRequestFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs index ba7cac52d9..289ecbdc85 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestIdentifierFeature.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpRequestIdentifierFeature : IHttpRequestIdentifierFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs index 8a8e00f260..17e6ec31d2 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpRequestLifetimeFeature.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Threading; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpRequestLifetimeFeature : IHttpRequestLifetimeFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs index adb411ee3a..c40074b92b 100644 --- a/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/HttpResponseFeature.cs @@ -4,9 +4,9 @@ using System; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class HttpResponseFeature : IHttpResponseFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs index 095c14a9e4..4ed8ba238c 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IFormFeature.cs @@ -4,7 +4,7 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IFormFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs index a30c3ac6fb..68f411b5c5 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IItemsFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IItemsFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs index 269e31babd..3f89bd2b4c 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IQueryFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IQueryFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs index b015b2d848..58cf459a04 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IRequestCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IRequestCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs index 2d47300b79..9277637217 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IResponseCookiesFeature.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IResponseCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs index 30b9b63b96..9816f2fe33 100644 --- a/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/IServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public interface IServiceProvidersFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs index c80abe6d65..e434666762 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ItemsFeature.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class ItemsFeature : IItemsFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs index 73450ad58f..015fba5669 100644 --- a/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/QueryFeature.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.WebUtilities; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class QueryFeature : IQueryFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs index 4fb087e9ab..0102ab7f68 100644 --- a/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/RequestCookiesFeature.cs @@ -3,11 +3,11 @@ using System; using System.Collections.Generic; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class RequestCookiesFeature : IRequestCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs index 0c87dc2833..136ecd2a8e 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ResponseCookiesFeature.cs @@ -1,9 +1,9 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class ResponseCookiesFeature : IResponseCookiesFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs index 194c3b3f36..3cd172a0d0 100644 --- a/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/ServiceProvidersFeature.cs @@ -3,7 +3,7 @@ using System; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class ServiceProvidersFeature : IServiceProvidersFeature { diff --git a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs index 9c7d75f483..081cf97b75 100644 --- a/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs +++ b/src/Microsoft.AspNetCore.Http/Features/TlsConnectionFeature.cs @@ -5,7 +5,7 @@ using System.Security.Cryptography.X509Certificates; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class TlsConnectionFeature : ITlsConnectionFeature { diff --git a/src/Microsoft.AspNetCore.Http/FormCollection.cs b/src/Microsoft.AspNetCore.Http/FormCollection.cs index b8e13fb315..33c36d558d 100644 --- a/src/Microsoft.AspNetCore.Http/FormCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// Contains the parsed form values. @@ -77,9 +77,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -101,10 +101,10 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -119,7 +119,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) @@ -131,9 +131,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. + /// Returns an struct enumerator that iterates through a collection without boxing and is also used via the interface. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/FormFileCollection.cs b/src/Microsoft.AspNetCore.Http/FormFileCollection.cs index b7b3ee8ebd..806e756a8e 100644 --- a/src/Microsoft.AspNetCore.Http/FormFileCollection.cs +++ b/src/Microsoft.AspNetCore.Http/FormFileCollection.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class FormFileCollection : List, IFormFileCollection { diff --git a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs index 181c938ca1..a885ccad8c 100644 --- a/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/HeaderDictionary.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// Represents a wrapper for RequestHeaders and ResponseHeaders. @@ -98,9 +98,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -110,9 +110,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets a value that indicates whether the is in read-only mode. + /// Gets a value that indicates whether the is in read-only mode. /// - /// true if the is in read-only mode; otherwise, false. + /// true if the is in read-only mode; otherwise, false. public bool IsReadOnly { get @@ -207,10 +207,10 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -221,9 +221,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Copies the elements to a one-dimensional Array instance at the specified index. + /// Copies the elements to a one-dimensional Array instance at the specified index. /// - /// The one-dimensional Array that is the destination of the specified objects copied from the . + /// The one-dimensional Array that is the destination of the specified objects copied from the . /// The zero-based index in at which copying begins. public void CopyTo(KeyValuePair[] array, int arrayIndex) { @@ -279,7 +279,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) diff --git a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs index 04784d714a..e009bf1cb1 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextAccessor.cs @@ -9,7 +9,7 @@ using System.Runtime.Remoting; using System.Threading; #endif -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextAccessor : IHttpContextAccessor { diff --git a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs index 0f6546cd36..2f6717641f 100644 --- a/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs +++ b/src/Microsoft.AspNetCore.Http/HttpContextFactory.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextFactory : IHttpContextFactory { diff --git a/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs b/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs index 87a27b8b12..4821912240 100644 --- a/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs +++ b/src/Microsoft.AspNetCore.Http/ItemsDictionary.cs @@ -4,7 +4,7 @@ using System.Collections; using System.Collections.Generic; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class ItemsDictionary : IDictionary { diff --git a/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs b/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs index e2da6489a3..7a018ebd1a 100644 --- a/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs +++ b/src/Microsoft.AspNetCore.Http/ParsingHelpers.cs @@ -9,7 +9,7 @@ using System.Linq; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { internal struct HeaderSegment : IEquatable { diff --git a/src/Microsoft.AspNetCore.Http/QueryCollection.cs b/src/Microsoft.AspNetCore.Http/QueryCollection.cs index 6ea9c379ac..fb0a260ceb 100644 --- a/src/Microsoft.AspNetCore.Http/QueryCollection.cs +++ b/src/Microsoft.AspNetCore.Http/QueryCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// The HttpRequest query string collection @@ -71,9 +71,9 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Gets the number of elements contained in the ;. + /// Gets the number of elements contained in the ;. /// - /// The number of elements contained in the . + /// The number of elements contained in the . public int Count { get @@ -99,10 +99,10 @@ namespace Microsoft.AspNet.Http.Internal } /// - /// Determines whether the contains a specific key. + /// Determines whether the contains a specific key. /// /// The key. - /// true if the contains a specific key; otherwise, false. + /// true if the contains a specific key; otherwise, false. public bool ContainsKey(string key) { if (Store == null) @@ -117,7 +117,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// The header name. /// The value. - /// true if the contains the key; otherwise, false. + /// true if the contains the key; otherwise, false. public bool TryGetValue(string key, out StringValues value) { if (Store == null) diff --git a/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs b/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs index 2d6cfdac4e..be51a2f487 100644 --- a/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs +++ b/src/Microsoft.AspNetCore.Http/ReferenceReadStream.cs @@ -6,7 +6,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// A Stream that wraps another stream starting at a certain offset and reading for the given length. diff --git a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs index 9751eee486..b8e4f2d7b1 100644 --- a/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs +++ b/src/Microsoft.AspNetCore.Http/RequestCookieCollection.cs @@ -6,7 +6,7 @@ using System.Collections; using System.Collections.Generic; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class RequestCookieCollection : IRequestCookieCollection { @@ -135,7 +135,7 @@ namespace Microsoft.AspNet.Http.Internal /// /// Returns an struct enumerator that iterates through a collection without boxing. /// - /// An object that can be used to iterate through the collection. + /// An object that can be used to iterate through the collection. public Enumerator GetEnumerator() { if (Store == null || Store.Count == 0) diff --git a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs index 185540eb50..b8236d918e 100644 --- a/src/Microsoft.AspNetCore.Http/ResponseCookies.cs +++ b/src/Microsoft.AspNetCore.Http/ResponseCookies.cs @@ -7,7 +7,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Microsoft.Net.Http.Headers; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { /// /// A wrapper for the response Set-Cookie header diff --git a/src/Microsoft.AspNetCore.Http/project.json b/src/Microsoft.AspNetCore.Http/project.json index 530c34e71e..728e38ebcc 100644 --- a/src/Microsoft.AspNetCore.Http/project.json +++ b/src/Microsoft.AspNetCore.Http/project.json @@ -11,8 +11,8 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "Microsoft.Net.Http.Headers": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs index 5fe22814d4..c4bb38f386 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringArrayWrapper.cs @@ -4,10 +4,10 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal class DictionaryStringArrayWrapper : IDictionary { diff --git a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs index aec1a0d921..2517f556c6 100644 --- a/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs +++ b/src/Microsoft.AspNetCore.Owin/DictionaryStringValuesWrapper.cs @@ -4,10 +4,10 @@ using System.Collections; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal class DictionaryStringValuesWrapper : IHeaderDictionary { diff --git a/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs index f5eabc9992..8a476b9f38 100644 --- a/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNetCore.Owin/IOwinEnvironmentFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public interface IOwinEnvironmentFeature { diff --git a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs index beae948df8..028866bae2 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinConstants.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinConstants.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal static class OwinConstants { diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs index 3a66fa7749..11f3e2fab9 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironment.cs @@ -14,13 +14,13 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using SendFileFunc = Func; using WebSocketAcceptAlt = diff --git a/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs b/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs index 9fae247f6b..14eb312608 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinEnvironmentFeature.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinEnvironmentFeature : IOwinEnvironmentFeature { diff --git a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs index 5ae81a6260..7d6d160113 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinExtensions.cs @@ -4,13 +4,13 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.Owin; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.Owin; -namespace Microsoft.AspNet.Builder +namespace Microsoft.AspNetCore.Builder { using AppFunc = Func, Task>; using CreateMiddleware = Func< diff --git a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs index a8c7560819..e2b7a8f83d 100644 --- a/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs +++ b/src/Microsoft.AspNetCore.Owin/OwinFeatureCollection.cs @@ -14,11 +14,11 @@ using System.Security.Cryptography.X509Certificates; using System.Security.Principal; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using SendFileFunc = Func; diff --git a/src/Microsoft.AspNetCore.Owin/Utilities.cs b/src/Microsoft.AspNetCore.Owin/Utilities.cs index 00789a86c2..b65cae78a9 100644 --- a/src/Microsoft.AspNetCore.Owin/Utilities.cs +++ b/src/Microsoft.AspNetCore.Owin/Utilities.cs @@ -5,10 +5,10 @@ using System; using System.Collections.Generic; using System.Security.Claims; using System.Security.Principal; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { internal static class Utilities { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs index 87b3cf6ffa..3cee220f46 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptAdapter.cs @@ -5,9 +5,9 @@ using System; using System.Collections.Generic; using System.Net.WebSockets; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using AppFunc = Func, Task>; using WebSocketAccept = diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs index 9bdaa91588..a891c9611f 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAcceptContext.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinWebSocketAcceptContext : WebSocketAcceptContext { diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs index 4a7a056463..17bd2ede40 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/OwinWebSocketAdapter.cs @@ -7,7 +7,7 @@ using System.Threading; using System.Threading.Tasks; using System.Net.WebSockets; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { // http://owin.org/extensions/owin-WebSocket-Extension-v0.4.0.htm using WebSocketCloseAsync = diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs index 2da6ea7774..41b1960cb2 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAcceptAdapter.cs @@ -6,9 +6,9 @@ using System.Collections.Generic; using System.Net.WebSockets; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using AppFunc = Func, Task>; using WebSocketAccept = diff --git a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs index 1ddc83a499..be5020c47e 100644 --- a/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs +++ b/src/Microsoft.AspNetCore.Owin/WebSockets/WebSocketAdapter.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using WebSocketCloseAsync = Func /// A Stream that wraps another stream and enables rewinding by buffering the content as it is read. diff --git a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs index fe86ee56aa..a78e56c7d3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/FormReader.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { /// /// Used to read an 'application/x-www-form-urlencoded' form. diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs index fedeb9315b..15e98d7eaa 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpRequestStreamReader.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -8,7 +8,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class HttpRequestStreamReader : TextReader { diff --git a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs index e875364647..30f6423fef 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/HttpResponseStreamWriter.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -7,7 +7,7 @@ using System.IO; using System.Text; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { /// /// Writes to the using the supplied . diff --git a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs index 9e8f0555ca..25032bfcd0 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/KeyValueAccumulator.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public struct KeyValueAccumulator { diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs index 2af2a444f1..32dbdbcb9d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReader.cs @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { // https://www.ietf.org/rfc/rfc2046.txt public class MultipartReader diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs index d87fae944f..22836ee320 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartReaderStream.cs @@ -8,7 +8,7 @@ using System.Text; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { internal class MultipartReaderStream : Stream { diff --git a/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs b/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs index 196cf424ca..96138c630a 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/MultipartSection.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.IO; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class MultipartSection { diff --git a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs index 6b0fd267ac..c3a56ba71d 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/QueryHelpers.cs @@ -7,7 +7,7 @@ using System.Text; using System.Text.Encodings.Web; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public static class QueryHelpers { diff --git a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs index 93270c5fb2..07d5b4212f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/ReasonPhrases.cs @@ -3,7 +3,7 @@ using System.Collections.Generic; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public static class ReasonPhrases { diff --git a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs index 5b186b2d3f..d8071d1a4f 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/Resources.Designer.cs @@ -1,4 +1,4 @@ -//------------------------------------------------------------------------------ +//------------------------------------------------------------------------------ // // This code was generated by a tool. // Runtime Version:4.0.30319.42000 @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace Microsoft.AspNet.WebUtilities { +namespace Microsoft.AspNetCore.WebUtilities { using System; using System.Reflection; @@ -38,7 +38,7 @@ namespace Microsoft.AspNet.WebUtilities { internal static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.AspNet.WebUtilities.Resources", typeof(Resources).GetTypeInfo().Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("Microsoft.AspNetCore.WebUtilities.Resources", typeof(Resources).GetTypeInfo().Assembly); resourceMan = temp; } return resourceMan; diff --git a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs index a865976274..ac5d4c43a3 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/StreamHelperExtensions.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public static class StreamHelperExtensions { diff --git a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs index 4142039f8f..dc462135d1 100644 --- a/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs +++ b/src/Microsoft.AspNetCore.WebUtilities/WebEncoders.cs @@ -4,7 +4,7 @@ using System; using System.Diagnostics; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { /// /// Contains utility APIs to assist with common encoding and decoding operations. diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs index 330b2867ea..42ca2a227f 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/HttpResponseWritingExtensionsTests.cs @@ -3,10 +3,10 @@ using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public class HttpResponseWritingExtensionsTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs index 03d885f7bc..a7966947be 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPathMiddlewareTests.cs @@ -3,12 +3,12 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { public class MapPathMiddlewareTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs index 4ddf45220d..b970ee8d34 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/MapPredicateMiddlewareTests.cs @@ -4,12 +4,12 @@ using System; using System.Collections.Generic; using System.Threading.Tasks; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Builder.Extensions +namespace Microsoft.AspNetCore.Builder.Extensions { using Predicate = Func; diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs index 3eb5673d60..e1be9d988d 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/PathStringTests.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Testing; +using Microsoft.AspNetCore.Testing; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public class PathStringTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs index 3084aec482..6caa872e00 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/QueryStringTests.cs @@ -1,14 +1,14 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Testing; +using Microsoft.AspNetCore.Testing; using Xunit; -namespace Microsoft.AspNet.Http.Abstractions +namespace Microsoft.AspNetCore.Http.Abstractions { public class QueryStringTests { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs index ee407d35f8..f1b6e327b6 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/UseMiddlewareTest.cs @@ -3,13 +3,13 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http.Abstractions; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http.Abstractions; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http +namespace Microsoft.AspNetCore.Http { public class UseMiddlewareTest { diff --git a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json index 59a67065bd..3814325f09 100644 --- a/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Abstractions.Tests/project.json @@ -4,8 +4,8 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Testing": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Testing": "1.0.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs index fb2ef452f1..4161625ea6 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/HeaderDictionaryTypeExtensionsTest.cs @@ -4,11 +4,11 @@ using System; using System.Collections.Generic; using System.Linq; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Net.Http.Headers; using Xunit; -namespace Microsoft.AspNet.Http.Headers +namespace Microsoft.AspNetCore.Http.Headers { public class HeaderDictionaryTypeExtensionsTest { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs index 4ff9cb103f..7d15dd87bf 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/QueryBuilderTests.cs @@ -5,7 +5,7 @@ using System; using System.Collections.Generic; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { public class QueryBuilderTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs index efa5f370ee..d63f2b8429 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/ResponseExtensionTests.cs @@ -5,12 +5,12 @@ using System; using System.Collections.Generic; using System.IO; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { public class ResponseExtensionTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs index 53c8051774..c1e145c34d 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/SendFileResponseExtensionsTests.cs @@ -4,11 +4,11 @@ using System; using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Extensions.Tests +namespace Microsoft.AspNetCore.Http.Extensions.Tests { public class SendFileResponseExtensionsTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs index 0846dd7172..7bd7159b3c 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/UriHelperTests.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Extensions +namespace Microsoft.AspNetCore.Http.Extensions { public class UriHelperTests { diff --git a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json index 0cd3b99df0..6d81867330 100644 --- a/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Extensions.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Http.Extensions": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Http.Extensions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs index 2cc0ed6448..36ad77f678 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/FeatureCollectionTests.cs @@ -3,7 +3,7 @@ using Xunit; -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class FeatureCollectionTests { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs index 7210b9821a..f5b0a1e122 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/IThing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public interface IThing { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs index 86561ba516..60667e0f6e 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Properties/AssemblyInfo.cs @@ -8,11 +8,11 @@ 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("Microsoft.AspNet.Http.Features.Tests")] +[assembly: AssemblyTitle("Microsoft.AspNetCore.Http.Features.Tests")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("Microsoft.AspNet.Http.Features.Tests")] +[assembly: AssemblyProduct("Microsoft.AspNetCore.Http.Features.Tests")] [assembly: AssemblyCopyright("Copyright © 2014")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs b/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs index 7f39f86a71..27a2c0e285 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/Thing.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Http.Features +namespace Microsoft.AspNetCore.Http.Features { public class Thing : IThing { diff --git a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json index 64e3c2dc66..f3e96787e7 100644 --- a/test/Microsoft.AspNetCore.Http.Features.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Features.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.Http.Features": "1.0.0-*", + "Microsoft.AspNetCore.Http.Features": "1.0.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs b/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs index 52d0fadfe2..280e51bf41 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ApplicationBuilderTests.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Builder.Internal +namespace Microsoft.AspNetCore.Builder.Internal { public class ApplicationBuilderTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs index 2b3f666740..3d547ea05a 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/Authentication/DefaultAuthenticationManagerTests.cs @@ -1,16 +1,16 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Authentication; -using Microsoft.AspNet.Http.Features.Authentication.Internal; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.Http.Features.Authentication.Internal; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Authentication.Internal +namespace Microsoft.AspNetCore.Http.Authentication.Internal { public class DefaultAuthenticationManagerTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs b/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs index 0728d65d80..9ad48986f5 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/BufferingHelperTests.cs @@ -4,7 +4,7 @@ using System.IO; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class BufferingHelperTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs index 74bda1a613..5716ed3347 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpContextTests.cs @@ -8,12 +8,12 @@ using System.Net.WebSockets; using System.Reflection; using System.Security.Claims; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Authentication.Internal; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Authentication.Internal; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpContextTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs index 6defe395f4..e1e86c79aa 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpRequestTests.cs @@ -4,11 +4,11 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpRequestTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs index 6fcbcedce1..4764c44a63 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/DefaultHttpResponseTests.cs @@ -4,11 +4,11 @@ using System; using System.Collections.Generic; using System.Globalization; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class DefaultHttpResponseTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs index 7d7cafc542..0ea7fe9681 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/FormFeatureTests.cs @@ -5,11 +5,11 @@ using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Internal; -using Microsoft.AspNet.WebUtilities; +using Microsoft.AspNetCore.Http.Internal; +using Microsoft.AspNetCore.WebUtilities; using Xunit; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class FormFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs index d69dd0a129..3d82b07a38 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HeaderDictionaryTests.cs @@ -6,7 +6,7 @@ using System.Collections.Generic; using Microsoft.Extensions.Primitives; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HeaderDictionaryTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs index b0d800de38..f44a567b24 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpContextFactoryTests.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Xunit; -namespace Microsoft.AspNet.Http.Internal +namespace Microsoft.AspNetCore.Http.Internal { public class HttpContextFactoryTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs index c117a48d66..95c3f39f06 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/HttpRequestIdentifierFeatureTests.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features.Internal; using Xunit; -namespace Microsoft.AspNet.Http.Tests +namespace Microsoft.AspNetCore.Http.Tests { public class HttpRequestIdentifierFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs b/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs index 9c5a84a9f5..c56b4962c9 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/QueryFeatureTests.cs @@ -3,7 +3,7 @@ using Xunit; -namespace Microsoft.AspNet.Http.Features.Internal +namespace Microsoft.AspNetCore.Http.Features.Internal { public class QueryFeatureTests { diff --git a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs index e22d4f338a..a4aac09e4a 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs +++ b/test/Microsoft.AspNetCore.Http.Tests/ResponseCookiesTest.cs @@ -1,11 +1,11 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using Xunit; using Microsoft.Net.Http.Headers; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http.Internal; -namespace Microsoft.AspNet.Http.Tests +namespace Microsoft.AspNetCore.Http.Tests { public class ResponseCookiesTest { diff --git a/test/Microsoft.AspNetCore.Http.Tests/project.json b/test/Microsoft.AspNetCore.Http.Tests/project.json index e67bbdfc3a..de0767bedd 100644 --- a/test/Microsoft.AspNetCore.Http.Tests/project.json +++ b/test/Microsoft.AspNetCore.Http.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", "xunit": "2.1.0" }, "frameworks": { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs index 6cd3e7a844..5c076b61fc 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinEnvironmentTests.cs @@ -6,11 +6,11 @@ using System.IO; using System.Linq; using System.Security.Claims; using System.Threading; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Xunit; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinEnvironmentTests { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs index 8d719f66c0..d894565968 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinExtensionTests.cs @@ -1,15 +1,15 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; using Xunit; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { using AppFunc = Func, Task>; using CreateMiddleware = Func< diff --git a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs index b945af4734..4203337366 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs +++ b/test/Microsoft.AspNetCore.Owin.Tests/OwinFeatureCollectionTests.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; using Xunit; -namespace Microsoft.AspNet.Owin +namespace Microsoft.AspNetCore.Owin { public class OwinHttpEnvironmentTests { diff --git a/test/Microsoft.AspNetCore.Owin.Tests/project.json b/test/Microsoft.AspNetCore.Owin.Tests/project.json index 4132c72275..9a11ccaec8 100644 --- a/test/Microsoft.AspNetCore.Owin.Tests/project.json +++ b/test/Microsoft.AspNetCore.Owin.Tests/project.json @@ -1,7 +1,7 @@ { "dependencies": { - "Microsoft.AspNet.Http": "1.0.0-*", - "Microsoft.AspNet.Owin": "1.0.0-*", + "Microsoft.AspNetCore.Http": "1.0.0-*", + "Microsoft.AspNetCore.Owin": "1.0.0-*", "Microsoft.Extensions.DependencyInjection": "1.0.0-*", "xunit": "2.1.0" }, diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs index a8b90c9bcd..d163f2b526 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpRequestStreamReaderTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; @@ -7,7 +7,7 @@ using System.Text; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNet.WebUtilities.Test +namespace Microsoft.AspNetCore.WebUtilities.Test { public class HttpResponseStreamReaderTest { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs index a357853020..4f7a6d378f 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/HttpResponseStreamWriterTest.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -9,7 +9,7 @@ using System.Threading; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNet.WebUtilities.Test +namespace Microsoft.AspNetCore.WebUtilities.Test { public class HttpResponseStreamWriterTest { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs index 397d279b5e..295241f2c3 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/MultipartReaderTests.cs @@ -6,7 +6,7 @@ using System.Text; using System.Threading.Tasks; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class MultipartReaderTests { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs index 35a68f1a0b..fde7ece69b 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/QueryHelpersTests.cs @@ -5,7 +5,7 @@ using System.Collections.Generic; using System.Linq; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class QueryHelperTests { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs index efc17118fc..8804644e12 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/WebEncodersTests.cs @@ -5,7 +5,7 @@ using System; using System.Linq; using Xunit; -namespace Microsoft.AspNet.WebUtilities +namespace Microsoft.AspNetCore.WebUtilities { public class WebEncodersTests { diff --git a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json index 7fe1a5eec4..72e7a43c73 100644 --- a/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json +++ b/test/Microsoft.AspNetCore.WebUtilities.Tests/project.json @@ -1,6 +1,6 @@ { "dependencies": { - "Microsoft.AspNet.WebUtilities": "1.0.0-*", + "Microsoft.AspNetCore.WebUtilities": "1.0.0-*", "xunit": "2.1.0" }, "compilationOptions": { From c24e0297b2f26425cbffc20fe85f30a5b3ad2951 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 22 Jan 2016 12:21:33 -0800 Subject: [PATCH 0990/1838] Rename AspNet 5 folders and files. See https://github.com/aspnet/Announcements/issues/144 for more information. --- .../EnvironmentName.cs | 0 .../HostingEnvironmentExtensions.cs | 0 .../IApplicationLifetime.cs | 0 .../IHostingEnvironment.cs | 0 .../IStartupFilter.cs | 0 .../IWebHost.cs | 0 .../IWebHostBuilder.cs | 0 ...oft.AspNetCore.Hosting.Abstractions.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../WebHostDefaults.cs | 0 .../project.json | 0 .../IHttpApplication.cs | 0 .../IServer.cs | 0 .../IServerAddressesFeature.cs | 0 .../IServerFactory.cs | 0 ...NetCore.Hosting.Server.Abstractions.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 0 ....AspNetCore.Hosting.WindowsServices.xproj} | 36 +++++++-------- .../Properties/AssemblyInfo.cs | 0 .../WebHostService.cs | 0 .../WebHostWindowsServiceExtensions.cs | 0 .../project.json | 44 +++++++++---------- .../Builder/ApplicationBuilderFactory.cs | 0 .../Builder/IApplicationBuilderFactory.cs | 0 .../Internal/ApplicationLifetime.cs | 0 .../AutoRequestServicesStartupFilter.cs | 0 .../Internal/HostingApplication.cs | 0 .../Internal/HostingEnvironment.cs | 0 .../Internal/HostingEnvironmentExtensions.cs | 0 .../Internal/HostingLoggerExtensions.cs | 0 .../Internal/LoggerEventIds.cs | 0 .../Internal/NullFileProvider.cs | 0 .../RequestServicesContainerFeature.cs | 0 .../RequestServicesContainerMiddleware.cs | 0 .../Internal/WebHost.cs | 0 .../Internal/WebHostOptions.cs | 0 .../Microsoft.AspNetCore.Hosting.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../Server/IServerLoader.cs | 0 .../Server/ServerLoader.cs | 0 .../Startup/ConfigureDelegate.cs | 0 .../Startup/ConfigureServicesDelegate.cs | 0 .../Startup/IStartupLoader.cs | 0 .../Startup/StartupExceptionPage.cs | 0 .../Startup/StartupLoader.cs | 0 .../Startup/StartupMethods.cs | 0 .../WebHostBuilder.cs | 0 .../WebHostBuilderExtensions.cs | 0 .../WebHostConfiguration.cs | 0 .../WebHostExtensions.cs | 0 .../compiler/resources/GenericError.html | 0 .../resources/GenericError_Exception.html | 0 .../resources/GenericError_Footer.html | 0 .../resources/GenericError_Message.html | 0 .../project.json | 0 .../Common/DeploymentParameters.cs | 0 .../Common/DeploymentResult.cs | 0 .../Common/DotnetArchitecture.cs | 0 .../Common/DotnetFlavor.cs | 0 .../Common/RetryHelper.cs | 0 .../Common/ServerType.cs | 0 .../Common/TestUriHelper.cs | 0 .../Deployers/ApplicationDeployer.cs | 0 .../Deployers/ApplicationDeployerFactory.cs | 0 .../Deployers/IApplicationDeployer.cs | 0 .../Deployers/IISDeployer.cs | 0 .../Deployers/IISExpressDeployer.cs | 0 .../Deployers/SelfHostDeployer.cs | 0 ...Microsoft.AspNetCore.Server.Testing.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../project.json | 0 .../xunit/SkipIfCurrentRuntimeIsCoreClr.cs | 0 .../SkipIfIISVariationsNotEnabledAttribute.cs | 0 .../xunit/SkipOn32BitOSAttribute.cs | 0 .../ClientHandler.cs | 0 .../Microsoft.AspNetCore.TestHost.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../RequestBuilder.cs | 0 .../RequestFeature.cs | 0 .../ResponseFeature.cs | 0 .../ResponseStream.cs | 0 .../TestServer.cs | 0 .../TestWebSocket.cs | 0 .../WebSocketClient.cs | 0 .../project.json | 0 .../Fakes/FakeOptions.cs | 0 .../Fakes/FakeService.cs | 0 .../Fakes/IFactoryService.cs | 0 .../Fakes/IFakeEveryService.cs | 0 .../Fakes/IFakeScopedService.cs | 0 .../Fakes/IFakeService.cs | 0 .../Fakes/IFakeServiceInstance.cs | 0 .../Fakes/IFakeSingletonService.cs | 0 .../Fakes/IFakeStartupCallback.cs | 0 .../Fakes/INonexistentService.cs | 0 .../Fakes/RuntimeEnvironment.cs | 0 .../Fakes/Startup.cs | 0 .../Fakes/StartupBase.cs | 0 .../Fakes/StartupBoom.cs | 0 .../Fakes/StartupConfigureServicesThrows.cs | 0 .../Fakes/StartupConfigureThrows.cs | 0 .../Fakes/StartupCtorThrows.cs | 0 .../Fakes/StartupNoServices.cs | 0 .../Fakes/StartupPrivateConfigure.cs | 0 .../Fakes/StartupStaticCtorThrows.cs | 0 .../Fakes/StartupThrowTypeLoadException.cs | 0 .../Fakes/StartupTwoConfigureServices.cs | 0 .../Fakes/StartupTwoConfigures.cs | 0 .../Fakes/StartupWithConfigureServices.cs | 0 ...StartupWithConfigureServicesNotResolved.cs | 0 .../Fakes/StartupWithHostingEnvironment.cs | 0 .../Fakes/StartupWithNullConfigureServices.cs | 0 .../Fakes/StartupWithServices.cs | 0 .../HostingEnvironmentExtensionsTests.cs | 0 .../Microsoft.AspNetCore.Hosting.Tests.xproj} | 0 .../StartupManagerTests.cs | 0 .../WebHostBuilderTests.cs | 0 .../WebHostConfigurationsTests.cs | 0 .../WebHostTests.cs | 0 .../project.json | 0 .../testroot/TextFile.txt | 0 .../testroot/wwwroot/README | 0 .../ClientHandlerTests.cs | 0 ...Microsoft.AspNetCore.TestHost.Tests.xproj} | 0 .../Properties/AssemblyInfo.cs | 0 .../RequestBuilderTests.cs | 0 .../ResponseFeatureTests.cs | 0 .../TestClientTests.cs | 0 .../TestServerTests.cs | 0 .../project.json | 0 131 files changed, 40 insertions(+), 40 deletions(-) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/EnvironmentName.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/HostingEnvironmentExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/IApplicationLifetime.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/IHostingEnvironment.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/IStartupFilter.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/IWebHost.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/IWebHostBuilder.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj => Microsoft.AspNetCore.Hosting.Abstractions/Microsoft.AspNetCore.Hosting.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/WebHostDefaults.cs (100%) rename src/{Microsoft.AspNet.Hosting.Abstractions => Microsoft.AspNetCore.Hosting.Abstractions}/project.json (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNetCore.Hosting.Server.Abstractions}/IHttpApplication.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNetCore.Hosting.Server.Abstractions}/IServer.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNetCore.Hosting.Server.Abstractions}/IServerAddressesFeature.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNetCore.Hosting.Server.Abstractions}/IServerFactory.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj => Microsoft.AspNetCore.Hosting.Server.Abstractions/Microsoft.AspNetCore.Hosting.Server.Abstractions.xproj} (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNetCore.Hosting.Server.Abstractions}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting.Server.Abstractions => Microsoft.AspNetCore.Hosting.Server.Abstractions}/project.json (100%) rename src/{Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj => Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj} (97%) rename src/{Microsoft.AspNet.Hosting.WindowsServices => Microsoft.AspNetCore.Hosting.WindowsServices}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting.WindowsServices => Microsoft.AspNetCore.Hosting.WindowsServices}/WebHostService.cs (100%) rename src/{Microsoft.AspNet.Hosting.WindowsServices => Microsoft.AspNetCore.Hosting.WindowsServices}/WebHostWindowsServiceExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting.WindowsServices => Microsoft.AspNetCore.Hosting.WindowsServices}/project.json (96%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Builder/ApplicationBuilderFactory.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Builder/IApplicationBuilderFactory.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/ApplicationLifetime.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/AutoRequestServicesStartupFilter.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/HostingApplication.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/HostingEnvironment.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/HostingEnvironmentExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/HostingLoggerExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/LoggerEventIds.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/NullFileProvider.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/RequestServicesContainerFeature.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/RequestServicesContainerMiddleware.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/WebHost.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Internal/WebHostOptions.cs (100%) rename src/{Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj => Microsoft.AspNetCore.Hosting/Microsoft.AspNetCore.Hosting.xproj} (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Server/IServerLoader.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Server/ServerLoader.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Startup/ConfigureDelegate.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Startup/ConfigureServicesDelegate.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Startup/IStartupLoader.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Startup/StartupExceptionPage.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Startup/StartupLoader.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/Startup/StartupMethods.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/WebHostBuilder.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/WebHostBuilderExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/WebHostConfiguration.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/WebHostExtensions.cs (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/compiler/resources/GenericError.html (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/compiler/resources/GenericError_Exception.html (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/compiler/resources/GenericError_Footer.html (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/compiler/resources/GenericError_Message.html (100%) rename src/{Microsoft.AspNet.Hosting => Microsoft.AspNetCore.Hosting}/project.json (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/DeploymentParameters.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/DeploymentResult.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/DotnetArchitecture.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/DotnetFlavor.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/RetryHelper.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/ServerType.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Common/TestUriHelper.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Deployers/ApplicationDeployer.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Deployers/ApplicationDeployerFactory.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Deployers/IApplicationDeployer.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Deployers/IISDeployer.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Deployers/IISExpressDeployer.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Deployers/SelfHostDeployer.cs (100%) rename src/{Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj => Microsoft.AspNetCore.Server.Testing/Microsoft.AspNetCore.Server.Testing.xproj} (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/project.json (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/xunit/SkipIfCurrentRuntimeIsCoreClr.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/xunit/SkipIfIISVariationsNotEnabledAttribute.cs (100%) rename src/{Microsoft.AspNet.Server.Testing => Microsoft.AspNetCore.Server.Testing}/xunit/SkipOn32BitOSAttribute.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/ClientHandler.cs (100%) rename src/{Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj => Microsoft.AspNetCore.TestHost/Microsoft.AspNetCore.TestHost.xproj} (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/Properties/AssemblyInfo.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/RequestBuilder.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/RequestFeature.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/ResponseFeature.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/ResponseStream.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/TestServer.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/TestWebSocket.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/WebSocketClient.cs (100%) rename src/{Microsoft.AspNet.TestHost => Microsoft.AspNetCore.TestHost}/project.json (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/FakeOptions.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/FakeService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFactoryService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFakeEveryService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFakeScopedService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFakeService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFakeServiceInstance.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFakeSingletonService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/IFakeStartupCallback.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/INonexistentService.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/RuntimeEnvironment.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/Startup.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupBase.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupBoom.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupConfigureServicesThrows.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupConfigureThrows.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupCtorThrows.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupNoServices.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupPrivateConfigure.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupStaticCtorThrows.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupThrowTypeLoadException.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupTwoConfigureServices.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupTwoConfigures.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupWithConfigureServices.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupWithConfigureServicesNotResolved.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupWithHostingEnvironment.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupWithNullConfigureServices.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/Fakes/StartupWithServices.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/HostingEnvironmentExtensionsTests.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj => Microsoft.AspNetCore.Hosting.Tests/Microsoft.AspNetCore.Hosting.Tests.xproj} (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/StartupManagerTests.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/WebHostBuilderTests.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/WebHostConfigurationsTests.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/WebHostTests.cs (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/project.json (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/testroot/TextFile.txt (100%) rename test/{Microsoft.AspNet.Hosting.Tests => Microsoft.AspNetCore.Hosting.Tests}/testroot/wwwroot/README (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/ClientHandlerTests.cs (100%) rename test/{Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj => Microsoft.AspNetCore.TestHost.Tests/Microsoft.AspNetCore.TestHost.Tests.xproj} (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/Properties/AssemblyInfo.cs (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/RequestBuilderTests.cs (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/ResponseFeatureTests.cs (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/TestClientTests.cs (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/TestServerTests.cs (100%) rename test/{Microsoft.AspNet.TestHost.Tests => Microsoft.AspNetCore.TestHost.Tests}/project.json (100%) diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/EnvironmentName.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/EnvironmentName.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/EnvironmentName.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/HostingEnvironmentExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/HostingEnvironmentExtensions.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/HostingEnvironmentExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IApplicationLifetime.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IApplicationLifetime.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/IApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IHostingEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IHostingEnvironment.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/IHostingEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IStartupFilter.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IStartupFilter.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IStartupFilter.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/IStartupFilter.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebHost.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHost.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IWebHost.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHost.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/IWebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/IWebHostBuilder.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj b/src/Microsoft.AspNetCore.Hosting.Abstractions/Microsoft.AspNetCore.Hosting.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/Microsoft.AspNet.Hosting.Abstractions.xproj rename to src/Microsoft.AspNetCore.Hosting.Abstractions/Microsoft.AspNetCore.Hosting.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/WebHostDefaults.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/WebHostDefaults.cs rename to src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs diff --git a/src/Microsoft.AspNet.Hosting.Abstractions/project.json b/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Hosting.Abstractions/project.json rename to src/Microsoft.AspNetCore.Hosting.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IHttpApplication.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IHttpApplication.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/IHttpApplication.cs rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IHttpApplication.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServer.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/IServer.cs rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServer.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerAddressesFeature.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerAddressesFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerAddressesFeature.cs rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerAddressesFeature.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/IServerFactory.cs rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerFactory.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/Microsoft.AspNetCore.Hosting.Server.Abstractions.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/Microsoft.AspNet.Hosting.Server.Abstractions.xproj rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/Microsoft.AspNetCore.Hosting.Server.Abstractions.xproj diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/project.json similarity index 100% rename from src/Microsoft.AspNet.Hosting.Server.Abstractions/project.json rename to src/Microsoft.AspNetCore.Hosting.Server.Abstractions/project.json diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj b/src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj similarity index 97% rename from src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj rename to src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj index 39ccb16031..8131586c81 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/Microsoft.AspNet.Hosting.WindowsServices.xproj +++ b/src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj @@ -1,19 +1,19 @@ - - - - 14.0 - $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) - - - - 03148731-ea95-40a2-bae8-a12315ea1748 - Microsoft.AspNet.Hosting.WindowsServices - ..\..\artifacts\obj\$(MSBuildProjectName) - ..\..\artifacts\bin\$(MSBuildProjectName)\ - - - 2.0 - - - + + + + 14.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion) + + + + 03148731-ea95-40a2-bae8-a12315ea1748 + Microsoft.AspNet.Hosting.WindowsServices + ..\..\artifacts\obj\$(MSBuildProjectName) + ..\..\artifacts\bin\$(MSBuildProjectName)\ + + + 2.0 + + + \ No newline at end of file diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Hosting.WindowsServices/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.WindowsServices/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Hosting.WindowsServices/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebHostService.cs b/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostService.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.WindowsServices/WebHostService.cs rename to src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostService.cs diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs b/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs rename to src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting.WindowsServices/project.json b/src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json similarity index 96% rename from src/Microsoft.AspNet.Hosting.WindowsServices/project.json rename to src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json index 3da4890272..91b2eb21c2 100644 --- a/src/Microsoft.AspNet.Hosting.WindowsServices/project.json +++ b/src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json @@ -1,22 +1,22 @@ -{ - "version": "1.0.0-*", - "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications running within a Windows service.", - "repository": { - "type": "git", - "url": "git://github.com/aspnet/hosting" - }, - "compilationOptions": { - "warningsAsErrors": true, - "keyFile": "../../tools/Key.snk" - }, - "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*" - }, - "frameworks": { - "net451": { - "frameworkAssemblies": { - "System.ServiceProcess": "" - } - } - } -} +{ + "version": "1.0.0-*", + "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications running within a Windows service.", + "repository": { + "type": "git", + "url": "git://github.com/aspnet/hosting" + }, + "compilationOptions": { + "warningsAsErrors": true, + "keyFile": "../../tools/Key.snk" + }, + "dependencies": { + "Microsoft.AspNet.Hosting": "1.0.0-*" + }, + "frameworks": { + "net451": { + "frameworkAssemblies": { + "System.ServiceProcess": "" + } + } + } +} diff --git a/src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNetCore.Hosting/Builder/ApplicationBuilderFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Builder/ApplicationBuilderFactory.cs rename to src/Microsoft.AspNetCore.Hosting/Builder/ApplicationBuilderFactory.cs diff --git a/src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs b/src/Microsoft.AspNetCore.Hosting/Builder/IApplicationBuilderFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Builder/IApplicationBuilderFactory.cs rename to src/Microsoft.AspNetCore.Hosting/Builder/IApplicationBuilderFactory.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/ApplicationLifetime.cs b/src/Microsoft.AspNetCore.Hosting/Internal/ApplicationLifetime.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/ApplicationLifetime.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/ApplicationLifetime.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs b/src/Microsoft.AspNetCore.Hosting/Internal/AutoRequestServicesStartupFilter.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/AutoRequestServicesStartupFilter.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/AutoRequestServicesStartupFilter.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingApplication.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/HostingApplication.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/HostingApplication.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironment.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/HostingEnvironment.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironment.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironmentExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/HostingEnvironmentExtensions.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironmentExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/HostingLoggerExtensions.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs b/src/Microsoft.AspNetCore.Hosting/Internal/LoggerEventIds.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/LoggerEventIds.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/LoggerEventIds.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs b/src/Microsoft.AspNetCore.Hosting/Internal/NullFileProvider.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/NullFileProvider.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/NullFileProvider.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs b/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerFeature.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerFeature.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerFeature.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerMiddleware.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/RequestServicesContainerMiddleware.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerMiddleware.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebHost.cs b/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/WebHost.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs diff --git a/src/Microsoft.AspNet.Hosting/Internal/WebHostOptions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/WebHostOptions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Internal/WebHostOptions.cs rename to src/Microsoft.AspNetCore.Hosting/Internal/WebHostOptions.cs diff --git a/src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj b/src/Microsoft.AspNetCore.Hosting/Microsoft.AspNetCore.Hosting.xproj similarity index 100% rename from src/Microsoft.AspNet.Hosting/Microsoft.AspNet.Hosting.xproj rename to src/Microsoft.AspNetCore.Hosting/Microsoft.AspNetCore.Hosting.xproj diff --git a/src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Hosting/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Hosting/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs b/src/Microsoft.AspNetCore.Hosting/Server/IServerLoader.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Server/IServerLoader.cs rename to src/Microsoft.AspNetCore.Hosting/Server/IServerLoader.cs diff --git a/src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNetCore.Hosting/Server/ServerLoader.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Server/ServerLoader.cs rename to src/Microsoft.AspNetCore.Hosting/Server/ServerLoader.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Startup/ConfigureDelegate.cs rename to src/Microsoft.AspNetCore.Hosting/Startup/ConfigureDelegate.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureServicesDelegate.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Startup/ConfigureServicesDelegate.cs rename to src/Microsoft.AspNetCore.Hosting/Startup/ConfigureServicesDelegate.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNetCore.Hosting/Startup/IStartupLoader.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Startup/IStartupLoader.cs rename to src/Microsoft.AspNetCore.Hosting/Startup/IStartupLoader.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNetCore.Hosting/Startup/StartupExceptionPage.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Startup/StartupExceptionPage.cs rename to src/Microsoft.AspNetCore.Hosting/Startup/StartupExceptionPage.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNetCore.Hosting/Startup/StartupLoader.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Startup/StartupLoader.cs rename to src/Microsoft.AspNetCore.Hosting/Startup/StartupLoader.cs diff --git a/src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNetCore.Hosting/Startup/StartupMethods.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/Startup/StartupMethods.cs rename to src/Microsoft.AspNetCore.Hosting/Startup/StartupMethods.cs diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/WebHostBuilder.cs rename to src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs diff --git a/src/Microsoft.AspNet.Hosting/WebHostBuilderExtensions.cs b/src/Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/WebHostBuilderExtensions.cs rename to src/Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs b/src/Microsoft.AspNetCore.Hosting/WebHostConfiguration.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/WebHostConfiguration.cs rename to src/Microsoft.AspNetCore.Hosting/WebHostConfiguration.cs diff --git a/src/Microsoft.AspNet.Hosting/WebHostExtensions.cs b/src/Microsoft.AspNetCore.Hosting/WebHostExtensions.cs similarity index 100% rename from src/Microsoft.AspNet.Hosting/WebHostExtensions.cs rename to src/Microsoft.AspNetCore.Hosting/WebHostExtensions.cs diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html b/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError.html similarity index 100% rename from src/Microsoft.AspNet.Hosting/compiler/resources/GenericError.html rename to src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError.html diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Exception.html b/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Exception.html similarity index 100% rename from src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Exception.html rename to src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Exception.html diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Footer.html b/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Footer.html similarity index 100% rename from src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Footer.html rename to src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Footer.html diff --git a/src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Message.html b/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Message.html similarity index 100% rename from src/Microsoft.AspNet.Hosting/compiler/resources/GenericError_Message.html rename to src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Message.html diff --git a/src/Microsoft.AspNet.Hosting/project.json b/src/Microsoft.AspNetCore.Hosting/project.json similarity index 100% rename from src/Microsoft.AspNet.Hosting/project.json rename to src/Microsoft.AspNetCore.Hosting/project.json diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/DeploymentParameters.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/DeploymentParameters.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/DeploymentParameters.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/DeploymentResult.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/DeploymentResult.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/DeploymentResult.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/DotnetArchitecture.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/DotnetArchitecture.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/DotnetArchitecture.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/DotnetFlavor.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/DotnetFlavor.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/DotnetFlavor.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/RetryHelper.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/RetryHelper.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/RetryHelper.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/ServerType.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/ServerType.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/ServerType.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Common/TestUriHelper.cs b/src/Microsoft.AspNetCore.Server.Testing/Common/TestUriHelper.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Common/TestUriHelper.cs rename to src/Microsoft.AspNetCore.Server.Testing/Common/TestUriHelper.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs b/src/Microsoft.AspNetCore.Server.Testing/Deployers/ApplicationDeployer.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployer.cs rename to src/Microsoft.AspNetCore.Server.Testing/Deployers/ApplicationDeployer.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs b/src/Microsoft.AspNetCore.Server.Testing/Deployers/ApplicationDeployerFactory.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Deployers/ApplicationDeployerFactory.cs rename to src/Microsoft.AspNetCore.Server.Testing/Deployers/ApplicationDeployerFactory.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs b/src/Microsoft.AspNetCore.Server.Testing/Deployers/IApplicationDeployer.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Deployers/IApplicationDeployer.cs rename to src/Microsoft.AspNetCore.Server.Testing/Deployers/IApplicationDeployer.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs b/src/Microsoft.AspNetCore.Server.Testing/Deployers/IISDeployer.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Deployers/IISDeployer.cs rename to src/Microsoft.AspNetCore.Server.Testing/Deployers/IISDeployer.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs b/src/Microsoft.AspNetCore.Server.Testing/Deployers/IISExpressDeployer.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Deployers/IISExpressDeployer.cs rename to src/Microsoft.AspNetCore.Server.Testing/Deployers/IISExpressDeployer.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs b/src/Microsoft.AspNetCore.Server.Testing/Deployers/SelfHostDeployer.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Deployers/SelfHostDeployer.cs rename to src/Microsoft.AspNetCore.Server.Testing/Deployers/SelfHostDeployer.cs diff --git a/src/Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj b/src/Microsoft.AspNetCore.Server.Testing/Microsoft.AspNetCore.Server.Testing.xproj similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Microsoft.AspNet.Server.Testing.xproj rename to src/Microsoft.AspNetCore.Server.Testing/Microsoft.AspNetCore.Server.Testing.xproj diff --git a/src/Microsoft.AspNet.Server.Testing/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Server.Testing/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.Server.Testing/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.Server.Testing/project.json b/src/Microsoft.AspNetCore.Server.Testing/project.json similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/project.json rename to src/Microsoft.AspNetCore.Server.Testing/project.json diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs b/src/Microsoft.AspNetCore.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs rename to src/Microsoft.AspNetCore.Server.Testing/xunit/SkipIfCurrentRuntimeIsCoreClr.cs diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs b/src/Microsoft.AspNetCore.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs rename to src/Microsoft.AspNetCore.Server.Testing/xunit/SkipIfIISVariationsNotEnabledAttribute.cs diff --git a/src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs b/src/Microsoft.AspNetCore.Server.Testing/xunit/SkipOn32BitOSAttribute.cs similarity index 100% rename from src/Microsoft.AspNet.Server.Testing/xunit/SkipOn32BitOSAttribute.cs rename to src/Microsoft.AspNetCore.Server.Testing/xunit/SkipOn32BitOSAttribute.cs diff --git a/src/Microsoft.AspNet.TestHost/ClientHandler.cs b/src/Microsoft.AspNetCore.TestHost/ClientHandler.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/ClientHandler.cs rename to src/Microsoft.AspNetCore.TestHost/ClientHandler.cs diff --git a/src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj b/src/Microsoft.AspNetCore.TestHost/Microsoft.AspNetCore.TestHost.xproj similarity index 100% rename from src/Microsoft.AspNet.TestHost/Microsoft.AspNet.TestHost.xproj rename to src/Microsoft.AspNetCore.TestHost/Microsoft.AspNetCore.TestHost.xproj diff --git a/src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.TestHost/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/Properties/AssemblyInfo.cs rename to src/Microsoft.AspNetCore.TestHost/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNet.TestHost/RequestBuilder.cs b/src/Microsoft.AspNetCore.TestHost/RequestBuilder.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/RequestBuilder.cs rename to src/Microsoft.AspNetCore.TestHost/RequestBuilder.cs diff --git a/src/Microsoft.AspNet.TestHost/RequestFeature.cs b/src/Microsoft.AspNetCore.TestHost/RequestFeature.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/RequestFeature.cs rename to src/Microsoft.AspNetCore.TestHost/RequestFeature.cs diff --git a/src/Microsoft.AspNet.TestHost/ResponseFeature.cs b/src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/ResponseFeature.cs rename to src/Microsoft.AspNetCore.TestHost/ResponseFeature.cs diff --git a/src/Microsoft.AspNet.TestHost/ResponseStream.cs b/src/Microsoft.AspNetCore.TestHost/ResponseStream.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/ResponseStream.cs rename to src/Microsoft.AspNetCore.TestHost/ResponseStream.cs diff --git a/src/Microsoft.AspNet.TestHost/TestServer.cs b/src/Microsoft.AspNetCore.TestHost/TestServer.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/TestServer.cs rename to src/Microsoft.AspNetCore.TestHost/TestServer.cs diff --git a/src/Microsoft.AspNet.TestHost/TestWebSocket.cs b/src/Microsoft.AspNetCore.TestHost/TestWebSocket.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/TestWebSocket.cs rename to src/Microsoft.AspNetCore.TestHost/TestWebSocket.cs diff --git a/src/Microsoft.AspNet.TestHost/WebSocketClient.cs b/src/Microsoft.AspNetCore.TestHost/WebSocketClient.cs similarity index 100% rename from src/Microsoft.AspNet.TestHost/WebSocketClient.cs rename to src/Microsoft.AspNetCore.TestHost/WebSocketClient.cs diff --git a/src/Microsoft.AspNet.TestHost/project.json b/src/Microsoft.AspNetCore.TestHost/project.json similarity index 100% rename from src/Microsoft.AspNet.TestHost/project.json rename to src/Microsoft.AspNetCore.TestHost/project.json diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/FakeOptions.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeOptions.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/FakeOptions.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/FakeService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/FakeService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/FakeService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFactoryService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFactoryService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFactoryService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeEveryService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeEveryService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeEveryService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeScopedService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeScopedService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeScopedService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeServiceInstance.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeServiceInstance.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeServiceInstance.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeSingletonService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeSingletonService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeSingletonService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeStartupCallback.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/IFakeStartupCallback.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/IFakeStartupCallback.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/INonexistentService.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/INonexistentService.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/INonexistentService.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/RuntimeEnvironment.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/RuntimeEnvironment.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/RuntimeEnvironment.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/Startup.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/Startup.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/Startup.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupBase.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBase.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupBase.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupBoom.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupBoom.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupBoom.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupConfigureServicesThrows.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupConfigureThrows.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupConfigureThrows.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupConfigureThrows.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupCtorThrows.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupCtorThrows.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupCtorThrows.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupCtorThrows.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupNoServices.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupNoServices.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupNoServices.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupPrivateConfigure.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupPrivateConfigure.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupPrivateConfigure.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupPrivateConfigure.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupStaticCtorThrows.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupThrowTypeLoadException.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupTwoConfigureServices.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigures.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupTwoConfigures.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupTwoConfigures.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupTwoConfigures.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithConfigureServices.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServices.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithConfigureServices.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithConfigureServicesNotResolved.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithHostingEnvironment.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithNullConfigureServices.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs b/test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithServices.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Fakes/StartupWithServices.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/Fakes/StartupWithServices.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/HostingEnvironmentExtensionsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/HostingEnvironmentExtensionsTests.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/HostingEnvironmentExtensionsTests.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj b/test/Microsoft.AspNetCore.Hosting.Tests/Microsoft.AspNetCore.Hosting.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/Microsoft.AspNet.Hosting.Tests.xproj rename to test/Microsoft.AspNetCore.Hosting.Tests/Microsoft.AspNetCore.Hosting.Tests.xproj diff --git a/test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/StartupManagerTests.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/StartupManagerTests.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/StartupManagerTests.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/WebHostBuilderTests.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/WebHostBuilderTests.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostConfigurationsTests.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/WebHostConfigurationsTests.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/WebHostConfigurationsTests.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/WebHostTests.cs b/test/Microsoft.AspNetCore.Hosting.Tests/WebHostTests.cs similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/WebHostTests.cs rename to test/Microsoft.AspNetCore.Hosting.Tests/WebHostTests.cs diff --git a/test/Microsoft.AspNet.Hosting.Tests/project.json b/test/Microsoft.AspNetCore.Hosting.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/project.json rename to test/Microsoft.AspNetCore.Hosting.Tests/project.json diff --git a/test/Microsoft.AspNet.Hosting.Tests/testroot/TextFile.txt b/test/Microsoft.AspNetCore.Hosting.Tests/testroot/TextFile.txt similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/testroot/TextFile.txt rename to test/Microsoft.AspNetCore.Hosting.Tests/testroot/TextFile.txt diff --git a/test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README b/test/Microsoft.AspNetCore.Hosting.Tests/testroot/wwwroot/README similarity index 100% rename from test/Microsoft.AspNet.Hosting.Tests/testroot/wwwroot/README rename to test/Microsoft.AspNetCore.Hosting.Tests/testroot/wwwroot/README diff --git a/test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/ClientHandlerTests.cs similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/ClientHandlerTests.cs rename to test/Microsoft.AspNetCore.TestHost.Tests/ClientHandlerTests.cs diff --git a/test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj b/test/Microsoft.AspNetCore.TestHost.Tests/Microsoft.AspNetCore.TestHost.Tests.xproj similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/Microsoft.AspNet.TestHost.Tests.xproj rename to test/Microsoft.AspNetCore.TestHost.Tests/Microsoft.AspNetCore.TestHost.Tests.xproj diff --git a/test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs b/test/Microsoft.AspNetCore.TestHost.Tests/Properties/AssemblyInfo.cs similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/Properties/AssemblyInfo.cs rename to test/Microsoft.AspNetCore.TestHost.Tests/Properties/AssemblyInfo.cs diff --git a/test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/RequestBuilderTests.cs similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/RequestBuilderTests.cs rename to test/Microsoft.AspNetCore.TestHost.Tests/RequestBuilderTests.cs diff --git a/test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/ResponseFeatureTests.cs rename to test/Microsoft.AspNetCore.TestHost.Tests/ResponseFeatureTests.cs diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/TestClientTests.cs similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/TestClientTests.cs rename to test/Microsoft.AspNetCore.TestHost.Tests/TestClientTests.cs diff --git a/test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs b/test/Microsoft.AspNetCore.TestHost.Tests/TestServerTests.cs similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/TestServerTests.cs rename to test/Microsoft.AspNetCore.TestHost.Tests/TestServerTests.cs diff --git a/test/Microsoft.AspNet.TestHost.Tests/project.json b/test/Microsoft.AspNetCore.TestHost.Tests/project.json similarity index 100% rename from test/Microsoft.AspNet.TestHost.Tests/project.json rename to test/Microsoft.AspNetCore.TestHost.Tests/project.json From e62ceb852827d386b492abc9cc6801b1a8c70263 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Fri, 22 Jan 2016 12:21:40 -0800 Subject: [PATCH 0991/1838] Rename AspNet 5 file contents. See https://github.com/aspnet/Announcements/issues/144 for more information. --- Hosting.sln | 18 ++++----- NuGetPackageVerifier.json | 10 ++--- .../SampleStartups/StartupBlockingOnStart.cs | 8 ++-- .../StartupConfigureAddresses.cs | 6 +-- .../StartupExternallyControlled.cs | 8 ++-- samples/SampleStartups/StartupFullControl.cs | 8 ++-- samples/SampleStartups/StartupHelloWorld.cs | 6 +-- samples/SampleStartups/project.json | 4 +- .../EnvironmentName.cs | 2 +- .../HostingEnvironmentExtensions.cs | 2 +- .../IApplicationLifetime.cs | 2 +- .../IHostingEnvironment.cs | 2 +- .../IStartupFilter.cs | 4 +- .../IWebHost.cs | 6 +-- .../IWebHostBuilder.cs | 8 ++-- .../WebHostDefaults.cs | 4 +- .../project.json | 4 +- .../IHttpApplication.cs | 6 +-- .../IServer.cs | 6 +-- .../IServerAddressesFeature.cs | 4 +- .../IServerFactory.cs | 2 +- .../project.json | 2 +- ...t.AspNetCore.Hosting.WindowsServices.xproj | 4 +- .../WebHostService.cs | 4 +- .../WebHostWindowsServiceExtensions.cs | 4 +- .../project.json | 4 +- .../Builder/ApplicationBuilderFactory.cs | 8 ++-- .../Builder/IApplicationBuilderFactory.cs | 6 +-- .../Internal/ApplicationLifetime.cs | 2 +- .../AutoRequestServicesStartupFilter.cs | 6 +-- .../Internal/HostingApplication.cs | 22 +++++----- .../Internal/HostingEnvironment.cs | 4 +- .../Internal/HostingEnvironmentExtensions.cs | 4 +- .../Internal/HostingLoggerExtensions.cs | 6 +-- .../Internal/LoggerEventIds.cs | 4 +- .../Internal/NullFileProvider.cs | 4 +- .../RequestServicesContainerFeature.cs | 4 +- .../RequestServicesContainerMiddleware.cs | 10 ++--- .../Internal/WebHost.cs | 14 +++---- .../Internal/WebHostOptions.cs | 4 +- .../Properties/AssemblyInfo.cs | 2 +- .../Server/IServerLoader.cs | 2 +- .../Server/ServerLoader.cs | 2 +- .../Startup/ConfigureDelegate.cs | 4 +- .../Startup/ConfigureServicesDelegate.cs | 2 +- .../Startup/IStartupLoader.cs | 2 +- .../Startup/StartupExceptionPage.cs | 2 +- .../Startup/StartupLoader.cs | 2 +- .../Startup/StartupMethods.cs | 4 +- .../WebHostBuilder.cs | 18 ++++----- .../WebHostBuilderExtensions.cs | 4 +- .../WebHostConfiguration.cs | 4 +- .../WebHostExtensions.cs | 6 +-- .../resources/GenericError_Footer.html | 4 +- src/Microsoft.AspNetCore.Hosting/project.json | 8 ++-- .../Common/DeploymentParameters.cs | 2 +- .../Common/DeploymentResult.cs | 2 +- .../Common/DotnetArchitecture.cs | 2 +- .../Common/DotnetFlavor.cs | 2 +- .../Common/RetryHelper.cs | 2 +- .../Common/ServerType.cs | 2 +- .../Common/TestUriHelper.cs | 4 +- .../Deployers/ApplicationDeployer.cs | 4 +- .../Deployers/ApplicationDeployerFactory.cs | 2 +- .../Deployers/IApplicationDeployer.cs | 2 +- .../Deployers/IISDeployer.cs | 4 +- .../Deployers/IISExpressDeployer.cs | 4 +- .../Deployers/SelfHostDeployer.cs | 6 +-- .../project.json | 2 +- .../xunit/SkipIfCurrentRuntimeIsCoreClr.cs | 4 +- .../SkipIfIISVariationsNotEnabledAttribute.cs | 4 +- .../xunit/SkipOn32BitOSAttribute.cs | 4 +- .../ClientHandler.cs | 10 ++--- .../Properties/AssemblyInfo.cs | 6 +-- .../RequestBuilder.cs | 2 +- .../RequestFeature.cs | 8 ++-- .../ResponseFeature.cs | 8 ++-- .../ResponseStream.cs | 2 +- .../TestServer.cs | 14 +++---- .../TestWebSocket.cs | 4 +- .../WebSocketClient.cs | 10 ++--- .../project.json | 2 +- .../Fakes/FakeOptions.cs | 2 +- .../Fakes/FakeService.cs | 2 +- .../Fakes/IFactoryService.cs | 2 +- .../Fakes/IFakeEveryService.cs | 2 +- .../Fakes/IFakeScopedService.cs | 2 +- .../Fakes/IFakeService.cs | 2 +- .../Fakes/IFakeServiceInstance.cs | 2 +- .../Fakes/IFakeSingletonService.cs | 2 +- .../Fakes/IFakeStartupCallback.cs | 2 +- .../Fakes/INonexistentService.cs | 2 +- .../Fakes/RuntimeEnvironment.cs | 4 +- .../Fakes/Startup.cs | 4 +- .../Fakes/StartupBase.cs | 2 +- .../Fakes/StartupBoom.cs | 2 +- .../Fakes/StartupConfigureServicesThrows.cs | 4 +- .../Fakes/StartupConfigureThrows.cs | 4 +- .../Fakes/StartupCtorThrows.cs | 4 +- .../Fakes/StartupNoServices.cs | 4 +- .../Fakes/StartupPrivateConfigure.cs | 6 +-- .../Fakes/StartupStaticCtorThrows.cs | 4 +- .../Fakes/StartupThrowTypeLoadException.cs | 4 +- .../Fakes/StartupTwoConfigureServices.cs | 4 +- .../Fakes/StartupTwoConfigures.cs | 4 +- .../Fakes/StartupWithConfigureServices.cs | 4 +- ...StartupWithConfigureServicesNotResolved.cs | 4 +- .../Fakes/StartupWithHostingEnvironment.cs | 6 +-- .../Fakes/StartupWithNullConfigureServices.cs | 4 +- .../Fakes/StartupWithServices.cs | 4 +- .../HostingEnvironmentExtensionsTests.cs | 6 +-- .../StartupManagerTests.cs | 32 +++++++-------- .../WebHostBuilderTests.cs | 22 +++++----- .../WebHostConfigurationsTests.cs | 8 ++-- .../WebHostTests.cs | 40 +++++++++---------- .../project.json | 6 +-- .../ClientHandlerTests.cs | 20 +++++----- .../Properties/AssemblyInfo.cs | 4 +- .../RequestBuilderTests.cs | 6 +-- .../ResponseFeatureTests.cs | 2 +- .../TestClientTests.cs | 12 +++--- .../TestServerTests.cs | 20 +++++----- .../project.json | 4 +- 123 files changed, 347 insertions(+), 347 deletions(-) diff --git a/Hosting.sln b/Hosting.sln index ea81db18f9..a4330f5c38 100644 --- a/Hosting.sln +++ b/Hosting.sln @@ -1,4 +1,4 @@ - + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 14 VisualStudioVersion = 14.0.24720.0 @@ -7,30 +7,30 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{E0497F39-AFF EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{FEB39027-9158-4DE2-997F-7ADAEF8188D0}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost.Tests", "test\Microsoft.AspNet.TestHost.Tests\Microsoft.AspNet.TestHost.Tests.xproj", "{0ACB2719-9484-49B5-B8E3-117091192511}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.TestHost.Tests", "test\Microsoft.AspNetCore.TestHost.Tests\Microsoft.AspNetCore.TestHost.Tests.xproj", "{0ACB2719-9484-49B5-B8E3-117091192511}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.TestHost", "src\Microsoft.AspNet.TestHost\Microsoft.AspNet.TestHost.xproj", "{1A415A3F-1081-45DB-809B-EE19CEA02DC0}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.TestHost", "src\Microsoft.AspNetCore.TestHost\Microsoft.AspNetCore.TestHost.xproj", "{1A415A3F-1081-45DB-809B-EE19CEA02DC0}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting", "src\Microsoft.AspNet.Hosting\Microsoft.AspNet.Hosting.xproj", "{3944F036-7E75-47E8-AA52-C4B89A64EC3A}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Hosting", "src\Microsoft.AspNetCore.Hosting\Microsoft.AspNetCore.Hosting.xproj", "{3944F036-7E75-47E8-AA52-C4B89A64EC3A}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Tests", "test\Microsoft.AspNet.Hosting.Tests\Microsoft.AspNet.Hosting.Tests.xproj", "{D4F18D58-52B1-435D-A012-10F2CDF158C4}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Hosting.Tests", "test\Microsoft.AspNetCore.Hosting.Tests\Microsoft.AspNetCore.Hosting.Tests.xproj", "{D4F18D58-52B1-435D-A012-10F2CDF158C4}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A66E3673-3976-4152-B902-2D0EC1428EA2}" ProjectSection(SolutionItems) = preProject global.json = global.json EndProjectSection EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Abstractions", "src\Microsoft.AspNet.Hosting.Abstractions\Microsoft.AspNet.Hosting.Abstractions.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Hosting.Abstractions", "src\Microsoft.AspNetCore.Hosting.Abstractions\Microsoft.AspNetCore.Hosting.Abstractions.xproj", "{BB780FBB-7842-4759-8DE7-96FA2E5571C1}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.Server.Abstractions", "src\Microsoft.AspNet.Hosting.Server.Abstractions\Microsoft.AspNet.Hosting.Server.Abstractions.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Hosting.Server.Abstractions", "src\Microsoft.AspNetCore.Hosting.Server.Abstractions\Microsoft.AspNetCore.Hosting.Server.Abstractions.xproj", "{FDBBA081-5248-4FC0-9E08-B46BEF3FA438}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Server.Testing", "src\Microsoft.AspNet.Server.Testing\Microsoft.AspNet.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Server.Testing", "src\Microsoft.AspNetCore.Server.Testing\Microsoft.AspNetCore.Server.Testing.xproj", "{3DA89347-6731-4366-80C4-548F24E8607B}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{9C7520A0-F2EB-411C-8BB2-80B39C937217}" EndProject Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "SampleStartups", "samples\SampleStartups\SampleStartups.xproj", "{485B6745-7648-400A-A969-F68FCF194E46}" EndProject -Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNet.Hosting.WindowsServices", "src\Microsoft.AspNet.Hosting.WindowsServices\Microsoft.AspNet.Hosting.WindowsServices.xproj", "{03148731-EA95-40A2-BAE8-A12315EA1748}" +Project("{8BB2217D-0F2D-49D1-97BC-3654ED321F3B}") = "Microsoft.AspNetCore.Hosting.WindowsServices", "src\Microsoft.AspNetCore.Hosting.WindowsServices\Microsoft.AspNetCore.Hosting.WindowsServices.xproj", "{03148731-EA95-40A2-BAE8-A12315EA1748}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution diff --git a/NuGetPackageVerifier.json b/NuGetPackageVerifier.json index c599e23fea..a41c932dae 100644 --- a/NuGetPackageVerifier.json +++ b/NuGetPackageVerifier.json @@ -9,11 +9,11 @@ "StrictSemanticVersionValidationRule" ], "packages": { - "Microsoft.AspNet.Hosting": { }, - "Microsoft.AspNet.Hosting.Abstractions": { }, - "Microsoft.AspNet.Hosting.Server.Abstractions": { }, - "Microsoft.AspNet.Server.Testing": { }, - "Microsoft.AspNet.TestHost": { } + "Microsoft.AspNetCore.Hosting": { }, + "Microsoft.AspNetCore.Hosting.Abstractions": { }, + "Microsoft.AspNetCore.Hosting.Server.Abstractions": { }, + "Microsoft.AspNetCore.Server.Testing": { }, + "Microsoft.AspNetCore.TestHost": { } } }, "Default": { // Rules to run for packages not listed in any other set. diff --git a/samples/SampleStartups/StartupBlockingOnStart.cs b/samples/SampleStartups/StartupBlockingOnStart.cs index 40d914f379..2f7b3bc6ee 100644 --- a/samples/SampleStartups/StartupBlockingOnStart.cs +++ b/samples/SampleStartups/StartupBlockingOnStart.cs @@ -1,7 +1,7 @@ -using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Http; +using System; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; // Note that this sample will not run. It is only here to illustrate usage patterns. diff --git a/samples/SampleStartups/StartupConfigureAddresses.cs b/samples/SampleStartups/StartupConfigureAddresses.cs index 31a9a38a43..418e611691 100644 --- a/samples/SampleStartups/StartupConfigureAddresses.cs +++ b/samples/SampleStartups/StartupConfigureAddresses.cs @@ -1,6 +1,6 @@ -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; // Note that this sample will not run. It is only here to illustrate usage patterns. diff --git a/samples/SampleStartups/StartupExternallyControlled.cs b/samples/SampleStartups/StartupExternallyControlled.cs index b024ede322..e0301d865c 100644 --- a/samples/SampleStartups/StartupExternallyControlled.cs +++ b/samples/SampleStartups/StartupExternallyControlled.cs @@ -1,8 +1,8 @@ -using System; +using System; using System.Collections.Generic; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; // Note that this sample will not run. It is only here to illustrate usage patterns. diff --git a/samples/SampleStartups/StartupFullControl.cs b/samples/SampleStartups/StartupFullControl.cs index 6445a77bc4..838aa74ce7 100644 --- a/samples/SampleStartups/StartupFullControl.cs +++ b/samples/SampleStartups/StartupFullControl.cs @@ -1,7 +1,7 @@ -using System; +using System; using System.IO; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -14,7 +14,7 @@ namespace SampleStartups public static void Main(string[] args) { var host = new WebHostBuilder() - .UseServer("Microsoft.AspNet.Server.Kestrel") // Set the server manually + .UseServer("Microsoft.AspNetCore.Server.Kestrel") // Set the server manually .UseApplicationBasePath(Directory.GetCurrentDirectory()) // Override the application base with the current directory .UseUrls("http://*:1000", "https://*:902") .UseEnvironment("Development") diff --git a/samples/SampleStartups/StartupHelloWorld.cs b/samples/SampleStartups/StartupHelloWorld.cs index 7a76ca4563..0c9d56632b 100644 --- a/samples/SampleStartups/StartupHelloWorld.cs +++ b/samples/SampleStartups/StartupHelloWorld.cs @@ -1,6 +1,6 @@ -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.DependencyInjection; // Note that this sample will not run. It is only here to illustrate usage patterns. diff --git a/samples/SampleStartups/project.json b/samples/SampleStartups/project.json index 4fb88a1477..f26e655e65 100644 --- a/samples/SampleStartups/project.json +++ b/samples/SampleStartups/project.json @@ -1,7 +1,7 @@ -{ +{ "version": "1.0.0-*", "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*" + "Microsoft.AspNetCore.Hosting": "1.0.0-*" }, "frameworks": { "dnx451": { }, diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/EnvironmentName.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/EnvironmentName.cs index 6ab7b945c1..d5522d1124 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/EnvironmentName.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/EnvironmentName.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// Commonly used environment names. diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/HostingEnvironmentExtensions.cs index 05cf2c9ceb..742001c2c9 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/HostingEnvironmentExtensions.cs @@ -4,7 +4,7 @@ using System; using System.IO; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// Extension methods for . diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/IApplicationLifetime.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IApplicationLifetime.cs index 3dd7bcf8aa..c3e4336521 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/IApplicationLifetime.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/IApplicationLifetime.cs @@ -3,7 +3,7 @@ using System.Threading; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// Allows consumers to perform cleanup during a graceful shutdown. diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/IHostingEnvironment.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IHostingEnvironment.cs index 5878bd489c..ba1ef3db98 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/IHostingEnvironment.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/IHostingEnvironment.cs @@ -4,7 +4,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.FileProviders; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// Provides information about the web hosting environment an application is running in. diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/IStartupFilter.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IStartupFilter.cs index f89fba525c..2f0a3cf39d 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/IStartupFilter.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/IStartupFilter.cs @@ -2,9 +2,9 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Builder; +using Microsoft.AspNetCore.Builder; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { public interface IStartupFilter { diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHost.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHost.cs index 45522b6b4c..dbf80ea53a 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHost.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHost.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// Represents a configured web host diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs index 60017adb17..35f9950567 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/IWebHostBuilder.cs @@ -1,14 +1,14 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Collections.Generic; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting.Server; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// A builder for diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs b/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs index c87cff6476..9a4cfca8ce 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/WebHostDefaults.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { public static class WebHostDefaults { diff --git a/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json b/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json index e23808c2f1..b777403585 100644 --- a/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Hosting.Abstractions/project.json @@ -10,8 +10,8 @@ "url": "git://github.com/aspnet/hosting" }, "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", - "Microsoft.AspNet.Hosting.Server.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.Hosting.Server.Abstractions": "1.0.0-*", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*", "Microsoft.Extensions.DependencyInjection.Abstractions": "1.0.0-*", "Microsoft.Extensions.FileProviders.Abstractions": "1.0.0-*" diff --git a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IHttpApplication.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IHttpApplication.cs index 07cbe53f82..e35d4b6d56 100644 --- a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IHttpApplication.cs +++ b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IHttpApplication.cs @@ -1,11 +1,11 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading.Tasks; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Hosting.Server +namespace Microsoft.AspNetCore.Hosting.Server { /// /// Represents an HttpApplication. diff --git a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServer.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServer.cs index cc1a88d519..529ca34427 100644 --- a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServer.cs +++ b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServer.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Hosting.Server +namespace Microsoft.AspNetCore.Hosting.Server { /// /// Represents a server. diff --git a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerAddressesFeature.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerAddressesFeature.cs index 1afbfe7c92..5a464cb75c 100644 --- a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerAddressesFeature.cs +++ b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerAddressesFeature.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; -namespace Microsoft.AspNet.Server.Features +namespace Microsoft.AspNetCore.Server.Features { public interface IServerAddressesFeature { diff --git a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerFactory.cs b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerFactory.cs index 163d39f1c0..1f28b5bacf 100644 --- a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerFactory.cs +++ b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/IServerFactory.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNet.Hosting.Server +namespace Microsoft.AspNetCore.Hosting.Server { /// /// Represents a factory for creating servers. diff --git a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/project.json b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/project.json index 8e443d8c77..b329bc3cd5 100644 --- a/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/project.json +++ b/src/Microsoft.AspNetCore.Hosting.Server.Abstractions/project.json @@ -10,7 +10,7 @@ "url": "git://github.com/aspnet/hosting" }, "dependencies": { - "Microsoft.AspNet.Http.Abstractions": "1.0.0-*", + "Microsoft.AspNetCore.Http.Abstractions": "1.0.0-*", "Microsoft.Extensions.Configuration.Abstractions": "1.0.0-*" }, "frameworks": { diff --git a/src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj b/src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj index 8131586c81..ef34852e4d 100644 --- a/src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj +++ b/src/Microsoft.AspNetCore.Hosting.WindowsServices/Microsoft.AspNetCore.Hosting.WindowsServices.xproj @@ -1,4 +1,4 @@ - + 14.0 @@ -7,7 +7,7 @@ 03148731-ea95-40a2-bae8-a12315ea1748 - Microsoft.AspNet.Hosting.WindowsServices + Microsoft.AspNetCore.Hosting.WindowsServices ..\..\artifacts\obj\$(MSBuildProjectName) ..\..\artifacts\bin\$(MSBuildProjectName)\ diff --git a/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostService.cs b/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostService.cs index 590f54cc63..5e15137ebf 100644 --- a/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostService.cs +++ b/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostService.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.ServiceProcess; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.WindowsServices +namespace Microsoft.AspNetCore.Hosting.WindowsServices { /// /// Provides an implementation of a Windows service that hosts ASP.NET. diff --git a/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs b/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs index 4034c5976f..a54cc59961 100644 --- a/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting.WindowsServices/WebHostWindowsServiceExtensions.cs @@ -1,9 +1,9 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.ServiceProcess; -namespace Microsoft.AspNet.Hosting.WindowsServices +namespace Microsoft.AspNetCore.Hosting.WindowsServices { /// /// Extensions to diff --git a/src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json b/src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json index 91b2eb21c2..0c21602221 100644 --- a/src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json +++ b/src/Microsoft.AspNetCore.Hosting.WindowsServices/project.json @@ -1,4 +1,4 @@ -{ +{ "version": "1.0.0-*", "description": "ASP.NET 5 core hosting infrastructure and startup logic for web applications running within a Windows service.", "repository": { @@ -10,7 +10,7 @@ "keyFile": "../../tools/Key.snk" }, "dependencies": { - "Microsoft.AspNet.Hosting": "1.0.0-*" + "Microsoft.AspNetCore.Hosting": "1.0.0-*" }, "frameworks": { "net451": { diff --git a/src/Microsoft.AspNetCore.Hosting/Builder/ApplicationBuilderFactory.cs b/src/Microsoft.AspNetCore.Hosting/Builder/ApplicationBuilderFactory.cs index eaf8d178d4..e188c0b7fd 100644 --- a/src/Microsoft.AspNetCore.Hosting/Builder/ApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNetCore.Hosting/Builder/ApplicationBuilderFactory.cs @@ -2,11 +2,11 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Builder.Internal; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Builder.Internal; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Hosting.Builder +namespace Microsoft.AspNetCore.Hosting.Builder { public class ApplicationBuilderFactory : IApplicationBuilderFactory { diff --git a/src/Microsoft.AspNetCore.Hosting/Builder/IApplicationBuilderFactory.cs b/src/Microsoft.AspNetCore.Hosting/Builder/IApplicationBuilderFactory.cs index 00e64a0a2c..d44398fb69 100644 --- a/src/Microsoft.AspNetCore.Hosting/Builder/IApplicationBuilderFactory.cs +++ b/src/Microsoft.AspNetCore.Hosting/Builder/IApplicationBuilderFactory.cs @@ -1,10 +1,10 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http.Features; -namespace Microsoft.AspNet.Hosting.Builder +namespace Microsoft.AspNetCore.Hosting.Builder { public interface IApplicationBuilderFactory { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/ApplicationLifetime.cs b/src/Microsoft.AspNetCore.Hosting/Internal/ApplicationLifetime.cs index 8955cf8d1e..5f3e7cc960 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/ApplicationLifetime.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/ApplicationLifetime.cs @@ -4,7 +4,7 @@ using System; using System.Threading; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { /// /// Allows consumers to perform cleanup during a graceful shutdown. diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/AutoRequestServicesStartupFilter.cs b/src/Microsoft.AspNetCore.Hosting/Internal/AutoRequestServicesStartupFilter.cs index 2ae344670e..daca6b2674 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/AutoRequestServicesStartupFilter.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/AutoRequestServicesStartupFilter.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Startup; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting.Startup; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class AutoRequestServicesStartupFilter : IStartupFilter { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/HostingApplication.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingApplication.cs index 7b77757e7f..c70c319b4c 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/HostingApplication.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/HostingApplication.cs @@ -1,15 +1,15 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Diagnostics; using System.Threading.Tasks; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; using Microsoft.Extensions.Logging; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class HostingApplication : IHttpApplication { @@ -33,14 +33,14 @@ namespace Microsoft.AspNet.Hosting.Internal public Context CreateContext(IFeatureCollection contextFeatures) { var httpContext = _httpContextFactory.Create(contextFeatures); - var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.BeginRequest"); + var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNetCore.Hosting.BeginRequest"); var startTimestamp = (diagnoticsEnabled || _logger.IsEnabled(LogLevel.Information)) ? Stopwatch.GetTimestamp() : 0; var scope = _logger.RequestScope(httpContext); _logger.RequestStarting(httpContext); if (diagnoticsEnabled) { - _diagnosticSource.Write("Microsoft.AspNet.Hosting.BeginRequest", new { httpContext = httpContext, timestamp = startTimestamp }); + _diagnosticSource.Write("Microsoft.AspNetCore.Hosting.BeginRequest", new { httpContext = httpContext, timestamp = startTimestamp }); } return new Context @@ -57,26 +57,26 @@ namespace Microsoft.AspNet.Hosting.Internal if (exception == null) { - var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.EndRequest"); + var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNetCore.Hosting.EndRequest"); var currentTimestamp = (diagnoticsEnabled || context.StartTimestamp != 0) ? Stopwatch.GetTimestamp() : 0; _logger.RequestFinished(httpContext, context.StartTimestamp, currentTimestamp); if (diagnoticsEnabled) { - _diagnosticSource.Write("Microsoft.AspNet.Hosting.EndRequest", new { httpContext = httpContext, timestamp = currentTimestamp }); + _diagnosticSource.Write("Microsoft.AspNetCore.Hosting.EndRequest", new { httpContext = httpContext, timestamp = currentTimestamp }); } } else { - var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNet.Hosting.UnhandledException"); + var diagnoticsEnabled = _diagnosticSource.IsEnabled("Microsoft.AspNetCore.Hosting.UnhandledException"); var currentTimestamp = (diagnoticsEnabled || context.StartTimestamp != 0) ? Stopwatch.GetTimestamp() : 0; _logger.RequestFinished(httpContext, context.StartTimestamp, currentTimestamp); if (diagnoticsEnabled) { - _diagnosticSource.Write("Microsoft.AspNet.Hosting.UnhandledException", new { httpContext = httpContext, timestamp = currentTimestamp, exception = exception }); + _diagnosticSource.Write("Microsoft.AspNetCore.Hosting.UnhandledException", new { httpContext = httpContext, timestamp = currentTimestamp, exception = exception }); } } diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironment.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironment.cs index ac87b19b94..e69682ea89 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironment.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironment.cs @@ -4,11 +4,11 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.FileProviders; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class HostingEnvironment : IHostingEnvironment { - public string EnvironmentName { get; set; } = Microsoft.AspNet.Hosting.EnvironmentName.Production; + public string EnvironmentName { get; set; } = Microsoft.AspNetCore.Hosting.EnvironmentName.Production; public string WebRootPath { get; set; } diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironmentExtensions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironmentExtensions.cs index d491a4fef7..189d64f0d8 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironmentExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/HostingEnvironmentExtensions.cs @@ -3,11 +3,11 @@ using System; using System.IO; -using Microsoft.AspNet.Hosting.Internal; +using Microsoft.AspNetCore.Hosting.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.FileProviders; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public static class HostingEnvironmentExtensions { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs index 0fdf122848..50d5b01079 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/HostingLoggerExtensions.cs @@ -1,13 +1,13 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Diagnostics; using System.Collections.Generic; -using Microsoft.AspNet.Http; +using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Logging; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { internal static class HostingLoggerExtensions { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/LoggerEventIds.cs b/src/Microsoft.AspNetCore.Hosting/Internal/LoggerEventIds.cs index 0b23c81e2a..f2978b0d20 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/LoggerEventIds.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/LoggerEventIds.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { internal static class LoggerEventIds { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/NullFileProvider.cs b/src/Microsoft.AspNetCore.Hosting/Internal/NullFileProvider.cs index 5448e6a5ec..6e27bba6f8 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/NullFileProvider.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/NullFileProvider.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; @@ -8,7 +8,7 @@ using System.IO; using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.Primitives; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { internal class NullFileProvider : IFileProvider { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerFeature.cs b/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerFeature.cs index 455be554b4..7b21dd3ce6 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerFeature.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerFeature.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class RequestServicesFeature : IServiceProvidersFeature, IDisposable { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerMiddleware.cs b/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerMiddleware.cs index 8cf659227e..fffbd88a56 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerMiddleware.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/RequestServicesContainerMiddleware.cs @@ -3,13 +3,13 @@ using System; using System.Threading.Tasks; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Http.Features.Internal; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Http.Features.Internal; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class RequestServicesContainerMiddleware { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs b/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs index d68d6604b7..0af6943995 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/WebHost.cs @@ -6,18 +6,18 @@ using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Features; -using Microsoft.AspNet.Server.Features; +using Microsoft.AspNetCore.Hosting.Builder; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Hosting.Startup; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Server.Features; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.PlatformAbstractions; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class WebHost : IWebHost { diff --git a/src/Microsoft.AspNetCore.Hosting/Internal/WebHostOptions.cs b/src/Microsoft.AspNetCore.Hosting/Internal/WebHostOptions.cs index a5e6ffeec3..53a8f5eb64 100644 --- a/src/Microsoft.AspNetCore.Hosting/Internal/WebHostOptions.cs +++ b/src/Microsoft.AspNetCore.Hosting/Internal/WebHostOptions.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNet.Hosting.Internal +namespace Microsoft.AspNetCore.Hosting.Internal { public class WebHostOptions { diff --git a/src/Microsoft.AspNetCore.Hosting/Properties/AssemblyInfo.cs b/src/Microsoft.AspNetCore.Hosting/Properties/AssemblyInfo.cs index 4f51e0868a..303723511f 100644 --- a/src/Microsoft.AspNetCore.Hosting/Properties/AssemblyInfo.cs +++ b/src/Microsoft.AspNetCore.Hosting/Properties/AssemblyInfo.cs @@ -6,5 +6,5 @@ using System.Resources; using System.Runtime.CompilerServices; [assembly: AssemblyMetadata("Serviceable", "True")] -[assembly: InternalsVisibleTo("Microsoft.AspNet.Hosting.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Hosting.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] [assembly: NeutralResourcesLanguage("en-us")] diff --git a/src/Microsoft.AspNetCore.Hosting/Server/IServerLoader.cs b/src/Microsoft.AspNetCore.Hosting/Server/IServerLoader.cs index 3902135cab..a6afea0aea 100644 --- a/src/Microsoft.AspNetCore.Hosting/Server/IServerLoader.cs +++ b/src/Microsoft.AspNetCore.Hosting/Server/IServerLoader.cs @@ -1,7 +1,7 @@ // Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -namespace Microsoft.AspNet.Hosting.Server +namespace Microsoft.AspNetCore.Hosting.Server { public interface IServerLoader { diff --git a/src/Microsoft.AspNetCore.Hosting/Server/ServerLoader.cs b/src/Microsoft.AspNetCore.Hosting/Server/ServerLoader.cs index 4f3b5fe4f0..3868cc1373 100644 --- a/src/Microsoft.AspNetCore.Hosting/Server/ServerLoader.cs +++ b/src/Microsoft.AspNetCore.Hosting/Server/ServerLoader.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Server +namespace Microsoft.AspNetCore.Hosting.Server { public class ServerLoader : IServerLoader { diff --git a/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureDelegate.cs b/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureDelegate.cs index da39fa6d3c..156707c277 100644 --- a/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureDelegate.cs +++ b/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureDelegate.cs @@ -3,10 +3,10 @@ using System; using System.Reflection; -using Microsoft.AspNet.Builder; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNetCore.Hosting.Startup { // TODO: replace all Action eventually with this public delegate void ConfigureDelegate(IApplicationBuilder builder); diff --git a/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureServicesDelegate.cs b/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureServicesDelegate.cs index f5eaea5aed..ffa606b6da 100644 --- a/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureServicesDelegate.cs +++ b/src/Microsoft.AspNetCore.Hosting/Startup/ConfigureServicesDelegate.cs @@ -6,7 +6,7 @@ using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNetCore.Hosting.Startup { public class ConfigureServicesBuilder { diff --git a/src/Microsoft.AspNetCore.Hosting/Startup/IStartupLoader.cs b/src/Microsoft.AspNetCore.Hosting/Startup/IStartupLoader.cs index ee1db50c8e..9c7ee34eed 100644 --- a/src/Microsoft.AspNetCore.Hosting/Startup/IStartupLoader.cs +++ b/src/Microsoft.AspNetCore.Hosting/Startup/IStartupLoader.cs @@ -4,7 +4,7 @@ using System; using System.Collections.Generic; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNetCore.Hosting.Startup { public interface IStartupLoader { diff --git a/src/Microsoft.AspNetCore.Hosting/Startup/StartupExceptionPage.cs b/src/Microsoft.AspNetCore.Hosting/Startup/StartupExceptionPage.cs index bed39a6241..8750199eba 100644 --- a/src/Microsoft.AspNetCore.Hosting/Startup/StartupExceptionPage.cs +++ b/src/Microsoft.AspNetCore.Hosting/Startup/StartupExceptionPage.cs @@ -15,7 +15,7 @@ using System.Text.Encodings.Web; using Microsoft.Extensions.Internal; using Microsoft.Extensions.PlatformAbstractions; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNetCore.Hosting.Startup { internal static class StartupExceptionPage { diff --git a/src/Microsoft.AspNetCore.Hosting/Startup/StartupLoader.cs b/src/Microsoft.AspNetCore.Hosting/Startup/StartupLoader.cs index c77cbced34..2b7a641a10 100644 --- a/src/Microsoft.AspNetCore.Hosting/Startup/StartupLoader.cs +++ b/src/Microsoft.AspNetCore.Hosting/Startup/StartupLoader.cs @@ -8,7 +8,7 @@ using System.Linq; using System.Reflection; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNetCore.Hosting.Startup { public class StartupLoader : IStartupLoader { diff --git a/src/Microsoft.AspNetCore.Hosting/Startup/StartupMethods.cs b/src/Microsoft.AspNetCore.Hosting/Startup/StartupMethods.cs index b62dae27f7..d019a6aa24 100644 --- a/src/Microsoft.AspNetCore.Hosting/Startup/StartupMethods.cs +++ b/src/Microsoft.AspNetCore.Hosting/Startup/StartupMethods.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Builder; +using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting.Startup +namespace Microsoft.AspNetCore.Hosting.Startup { public class StartupMethods { diff --git a/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs index 0f385a8ac6..46ebe789fd 100644 --- a/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs +++ b/src/Microsoft.AspNetCore.Hosting/WebHostBuilder.cs @@ -5,20 +5,20 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.Runtime.Versioning; -using Microsoft.AspNet.Builder; -using Microsoft.AspNet.Hosting.Builder; -using Microsoft.AspNet.Hosting.Internal; -using Microsoft.AspNet.Hosting.Server; -using Microsoft.AspNet.Hosting.Startup; -using Microsoft.AspNet.Http; -using Microsoft.AspNet.Http.Internal; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting.Builder; +using Microsoft.AspNetCore.Hosting.Internal; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Hosting.Startup; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; using Microsoft.Extensions.Logging; using Microsoft.Extensions.PlatformAbstractions; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { /// /// A builder for @@ -210,7 +210,7 @@ namespace Microsoft.AspNet.Hosting services.AddLogging(); services.AddOptions(); - var diagnosticSource = new DiagnosticListener("Microsoft.AspNet"); + var diagnosticSource = new DiagnosticListener("Microsoft.AspNetCore"); services.AddSingleton(diagnosticSource); services.AddSingleton(diagnosticSource); diff --git a/src/Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs b/src/Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs index db10bdd6d1..93a00ccd68 100644 --- a/src/Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs @@ -2,10 +2,10 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using Microsoft.AspNet.Hosting.Server; +using Microsoft.AspNetCore.Hosting.Server; using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { public static class WebHostBuilderExtensions { diff --git a/src/Microsoft.AspNetCore.Hosting/WebHostConfiguration.cs b/src/Microsoft.AspNetCore.Hosting/WebHostConfiguration.cs index dc331e9adb..3a6cd02a4e 100644 --- a/src/Microsoft.AspNetCore.Hosting/WebHostConfiguration.cs +++ b/src/Microsoft.AspNetCore.Hosting/WebHostConfiguration.cs @@ -1,10 +1,10 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.Collections.Generic; using Microsoft.Extensions.Configuration; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { public class WebHostConfiguration { diff --git a/src/Microsoft.AspNetCore.Hosting/WebHostExtensions.cs b/src/Microsoft.AspNetCore.Hosting/WebHostExtensions.cs index 0e2f6480fe..2efdfb273f 100644 --- a/src/Microsoft.AspNetCore.Hosting/WebHostExtensions.cs +++ b/src/Microsoft.AspNetCore.Hosting/WebHostExtensions.cs @@ -1,12 +1,12 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// Copyright (c) .NET Foundation. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; using System.Threading; -using Microsoft.AspNet.Server.Features; +using Microsoft.AspNetCore.Server.Features; using Microsoft.Extensions.DependencyInjection; -namespace Microsoft.AspNet.Hosting +namespace Microsoft.AspNetCore.Hosting { public static class WebHostExtensions { diff --git a/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Footer.html b/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Footer.html index 54042e8bf9..4a30ed8e1f 100644 --- a/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Footer.html +++ b/src/Microsoft.AspNetCore.Hosting/compiler/resources/GenericError_Footer.html @@ -1,3 +1,3 @@ -